00001
00002
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