Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

GalElSpectrum.cxx

Go to the documentation of this file.
00001 // $Header: /nfs/slac/g/glast/ground/cvs/FluxSvc/src/GalElSpectrum.cxx,v 1.6 2002/06/24 22:37:16 srobinsn Exp $
00002 // Original author: P. L. Nolan, pln@egret1.Stanford.EDU
00003 //
00004 #ifdef __GNUG__
00005 #pragma implementation
00006 #endif
00007 
00008 #include "GalElSpectrum.h"
00009 #include "GPS.h"
00010 
00011 #include <cmath>
00012 #include "CLHEP/Random/Random.h"
00013 
00014 #include "SpectrumFactory.h"
00015 
00016 static SpectrumFactory<GalElSpectrum> factory;
00017 const ISpectrumFactory& GalElSpectrumFactory = factory;
00018 
00019 
00020 const float GalElSpectrum::m_rearth = 6371.f;
00021 const float GalElSpectrum::m_altitude = 600.f;
00022 
00023 GalElSpectrum::GalElSpectrum(const std::string& paramstring):m_pspec(paramstring) {
00024     std::vector<float> params;
00025     
00026     parseParamList(paramstring,params);
00027     
00028     float lat = params.size()>0? params[0] : 0;
00029     float lon = params.size()>1? params[1] : 0;
00030     init(lat, lon); 
00031 }
00032 
00033 
00034 GalElSpectrum::~GalElSpectrum() {};
00035 
00036 double GalElSpectrum::calculate_rate(double old_rate) {
00037     return flux(GPS::instance()->lat(), GPS::instance()->lon());
00038 }
00039 
00040 double GalElSpectrum::flux(double) const {
00041     return -m_normfact * (m_norm / m_expo) * pow(m_cutoff, m_expo);
00042 }
00043 
00044 double GalElSpectrum::solidAngle() const {
00045     return 4. * M_PI;
00046 }
00047 
00048 float GalElSpectrum::flux(float cut) const {
00049     return -m_normfact * (m_norm / m_expo) * pow(cut, m_expo);
00050 }
00051 
00052 float GalElSpectrum::flux(float lat, float lon) const {
00053     float Ecut = findCutoff(lat,lon);
00054     return flux(Ecut);
00055 }
00056 
00057 float GalElSpectrum::flux(std::pair<double,double> coords) const {
00058     return flux(coords.first, coords.second);
00059 }
00060 
00061 float GalElSpectrum::operator() (float x) const{
00062     return m_cutoff * pow(1.-x, 1./m_expo);
00063 }
00064 
00065 void GalElSpectrum::setPosition(float lat, float lon) {
00066     m_pspec.setPosition(lat, lon);
00067     m_lat = lat;
00068     m_lon = lon;
00069     m_cutoff = findCutoff(lat,lon);
00070     m_flux = flux(m_cutoff);
00071 }
00072 
00073 void GalElSpectrum::setPosition(std::pair<double,double> coords) {
00074     GalElSpectrum::setPosition(coords.first, coords.second);
00075 }
00076 
00077 int GalElSpectrum::askGPS() {
00078     setPosition(GPS::instance()->lat(), GPS::instance()->lon());
00079     return 0;
00080 }
00081 
00082 float GalElSpectrum::findCutoff(float rflux) const {
00083     return pow(-m_expo*rflux/m_norm, 1./m_expo);
00084 }
00085 
00086 float GalElSpectrum::findCutoff(float lat, float lon) const {
00087     float ProtonCut = m_pspec.findCutoff(lat,lon);
00088     return sqrt(ProtonCut*(ProtonCut+2.*0.938));
00089 }
00090 
00091 float GalElSpectrum::findCutoff(std::pair<double,double> coords) const {
00092     return findCutoff(coords.first, coords.second);
00093 }
00094 
00095 std::pair<float,float> GalElSpectrum::dir(float energy) const {
00096     float earthazi = 2.*M_PI* HepRandom::getTheGenerator()->flat();
00097     float coszenith = m_coscutoff + (1.-m_coscutoff)*
00098         HepRandom::getTheGenerator()->flat();
00099     return std::make_pair<float,float>(coszenith, earthazi);
00100 }
00101 
00102 std::string GalElSpectrum::title() const {
00103     return "GalElSpectrum";
00104 }
00105 
00106 const char * GalElSpectrum::particleName() const {
00107     return m_particle_name.c_str();
00108 }
00109 
00110 void GalElSpectrum::setParticleName(std::string name) {
00111     m_particle_name = name;
00112 }
00113 
00114 void GalElSpectrum::init(float lat, float lon) {
00115     m_normfact = .5*(1.+sqrt(m_altitude*(m_altitude+2.*m_rearth)) /
00116         (m_rearth+m_altitude));
00117     m_expo = static_cast<float>(-3.086 + 1.);
00118     m_norm = 227.f;
00119     setPosition(lat, lon);
00120     m_coscutoff = -sqrt(m_altitude*m_altitude+2.*m_altitude*m_rearth)
00121         / (m_altitude+m_rearth);
00122     m_particle_name = "e-";
00123     m_observer.setAdapter( new ActionAdapter<GalElSpectrum>(this,
00124                                            &GalElSpectrum::askGPS) );
00125     GPS::instance()->notification().attach( &m_observer );
00126 }
00127 
00128 
00129 

Generated on Wed Oct 16 14:01:30 2002 by doxygen1.2.13.1 written by Dimitri van Heesch, © 1997-2001