00001 #ifndef NEUTRINOFLUX_H
00002 #define NEUTRINOFLUX_H
00003
00054
00055 #ifdef ICETRAY
00056 #include "dataclasses/Utility.h"
00057 #include "icetray/I3DefaultName.h"
00058 #include <icetray/I3Logging.h>
00059 #include <dataclasses/physics/I3Particle.h>
00060 #else //ICETRAY
00061 namespace I3Particle{
00062 enum ParticleType {
00063 unknown = 0,
00064 NuE = 66,
00065 NuEBar = 67,
00066 NuMu = 68,
00067 NuMuBar = 69,
00068 TauPlus = 131,
00069 TauMinus = 132,
00070 NuTau = 133,
00071 NuTauBar = 134,
00072 };
00073 }
00074 #endif //ICETRAY
00075
00076 #include <iostream>
00077 #include <fstream>
00078 #include <math.h>
00079
00080 using namespace std;
00081
00082 class NeutrinoFlux
00083 {
00084 public:
00085
00089 virtual ~NeutrinoFlux() {};
00090
00091
00098 virtual double getFlux(I3Particle::ParticleType neutType, double eNeut, double costheta)const=0;
00099
00108 virtual double getFluxIntegral(I3Particle::ParticleType neutType, double eNeut)const=0;
00109
00113 virtual string getModelName()const=0;
00114
00115
00116 #ifdef ICETRAY
00117
00122 double getFlux(const I3Particle& particle) const;
00123
00124 SET_LOGGER("NeutrinoFlux");
00125
00126 #endif
00127
00128 };
00129
00130
00131 class ConventionalNeutrinoFlux : public NeutrinoFlux
00132 {
00133 public:
00134
00140 ConventionalNeutrinoFlux(string model);
00141
00142 virtual double getFlux(I3Particle::ParticleType neutType, double eNeut, double costheta)const;
00143 virtual double getFluxIntegral(I3Particle::ParticleType neutType, double eNeut)const;
00144 virtual string getModelName()const {return model_;};
00145
00146 private:
00147
00149 string model_;
00150
00152 static const int POLYT = 31;
00154 static const int nbinCT_ = 10;
00156 static const double CMIN=-1.;
00158 static const double CMAX=1.;
00159
00160
00161 double par_conv_nu_[POLYT];
00162 double par_conv_anu_[POLYT];
00163
00164 };
00165
00166 class PromptNeutrinoFlux : public NeutrinoFlux
00167 {
00168 public:
00174 PromptNeutrinoFlux(string model);
00175
00176 double getFlux(I3Particle::ParticleType neutType, double eNeut, double costheta) const;
00177 double getFluxIntegral(I3Particle::ParticleType neutType, double eNeut) const;
00178 string getModelName() const {return model_;};
00179
00180 private:
00181
00183 string model_;
00184
00186 static const int nbinCT_prompt_ = 10;
00188 static const double CMIN_PROMPT=-1.;
00190 static const double CMAX_PROMPT=1.;
00192
00193 static const int POLYT_PROMPT=15;
00194 double e_joint_nu_;
00195 double e_joint_anu_;
00196
00197 double par_prompt_nu_[POLYT_PROMPT];
00198
00199 double pare_prompt_nu_[POLYT_PROMPT];
00200
00201 double par_prompt_anu_[POLYT_PROMPT];
00202
00203 double pare_prompt_anu_[POLYT_PROMPT];
00204
00205 };
00206
00207
00208 class AtmosphericNeutrinoFlux: public NeutrinoFlux
00209 {
00210 public:
00211
00217 AtmosphericNeutrinoFlux(string conv_model,string prompt_model);
00218
00219 double getFlux(I3Particle::ParticleType neutType, double eNeut, double costheta) const;
00220 double getFluxIntegral(I3Particle::ParticleType neutType, double eNeut) const;
00221 string getModelName() const;
00222
00223 private:
00225 ConventionalNeutrinoFlux conv_flux_;
00227 PromptNeutrinoFlux prompt_flux_;
00228
00229 };
00230
00231 class AstroPointNeutrinoFlux: public NeutrinoFlux
00232 {
00233 public:
00238 AstroPointNeutrinoFlux(string model);
00239
00240 double getFlux(I3Particle::ParticleType neutType, double eNeut, double costheta) const;
00241 double getFlux(I3Particle::ParticleType neutType, double eNeut) const;
00242 double getFluxIntegral(I3Particle::ParticleType neutType, double eNeut) const;
00243 double getDecli() const {return decli_;} ;
00244 string getModelName() const {return model_;} ;
00245
00246 private:
00247
00249 string model_;
00250
00251 int piece_;
00252 double decli_;
00253 double Emin_[100];
00254 double Emax_[100];
00255 int nparam_[100];
00256 double param_[100][100];
00258
00259 static const double Em_=1.;
00260 static const double Ema_=1.0e+12;
00261
00262 };
00263
00264 class AstroNeutrinoFlux: public NeutrinoFlux
00265 {
00266 public:
00271 AstroNeutrinoFlux(string model);
00272
00273 double getFlux(I3Particle::ParticleType neutType, double eNeut, double costheta) const;
00274 double getFlux(I3Particle::ParticleType neutType, double eNeut) const;
00275 double getFluxIntegral(I3Particle::ParticleType neutType, double eNeut) const;
00276 string getModelName() const {return model_;} ;
00277
00278 private:
00279
00281 string model_;
00282
00283 int piece_;
00284 double Emin_[100];
00285 double Emax_[100];
00286 int nparam_[100];
00287 double param_[100][100];
00288
00290
00291 static const double Em_=1.;
00292 static const double Ema_=1.0e+12;
00293
00294 };
00295
00296
00297 #ifdef ICETRAY
00298 I3_POINTER_TYPEDEFS(NeutrinoFlux);
00299 I3_DEFAULT_NAME(NeutrinoFlux);
00300 #endif //ICETRAY
00301
00302 #endif // NEUTRINOFLUX_H
00303