GENIEGenerator
Loading...
Searching...
No Matches
GAstroFlux.h
Go to the documentation of this file.
1//____________________________________________________________________________
2/*!
3
4\class genie::flux::GAstroFlux
5
6\brief A base class for the concrete astrophysical neutrino flux drivers.
7
8 <<<< NOTE: CODE UNDER DEVELOPMENT >>>>
9
10 COORDINATE SYSTEMS / NEUTRINO GENERATION & PROPAGATION :
11
12 Neutrinos are generated on a sphere with radius R_{earth}.
13 Especially,
14 - For diffuse fluxes:
15 Neutrinos can be generated anywhere on that surface.
16 - For point sources:
17 Neutrinos are generated at fixed right ascension and declination.
18 Then time is randomized, to account for Earth's rotation, and the
19 Equatorial Coordinates are converted to GEF. So, neutrinos from each
20 point source are generated on circles parallel to the Earth's Equator.
21
22 Initially, neutrino coordinates are generated in the Geocentric Earth-
23 Fixed (GEF) Coordinate System (later to be converted to the appropriate
24 detector coordinate system - See further below).
25
26 * Definition:
27 Geocentric Earth-Fixed (GEF) Coordinate System
28 +z: Points to North Pole.
29 xy: Equatorial plane.
30 +x: Points to the Prime Meridian.
31 +y: As needed to make a right-handed coordinate system.
32
33 Neutrinos are then propagated towards the detector.
34 The Earth opaqueness to ultra high energy neutrinos is taken into
35 account. The Earth density profile is modelled using the PREM
36 (Preliminary Earth Model, The Encyclopedia of Solid Earth Geophysics,
37 David E. James, ed., Van Nostrand Reinhold, New York, 1989, p.331).
38
39 The detector position is determined in the Spherical/Geographic System
40 by its geographic latitude (angle relative to Equator), its geographic
41 longitude (angle relative to Prime Meridian) and its depth from the
42 surface.
43
44 The generated flux neutrinos, propagated through the Earth towards the
45 detector) are then positioned on the surface of a sphere with radius Rd
46 which should fully enclose the neutrino detector. The centre of that
47 sphere is taken to be the origin of the detector coordinate system.
48 The transverse coords are appropriately randomized so that neutrinos
49 from any given direction bath the entire sphere enclosing the detector.
50
51 The final flux neutrino coordinates are given in the detector coordinate
52 system. The default detector coordinate system is the Topocentric Horizontal
53 (THZ) Coordinate System. Alternative user-defined topocentric systems can
54 be defined by specifying the appropriate rotation from THZ.
55
56 * Definition:
57 Topocentric Horizontal (THZ) Coordinate System
58 (default detector coordinate system)
59 +z: Points towards the local zenith.
60 +x: On same plane as local meridian, pointing south.
61 +y: As needed to make a right-handed coordinate system.
62 origin: detector centre
63
64 WEIGHTING SCHEMES:
65
66 For a detector with geometrical cross section ~ 1km^2, the solid
67 angle acceptance changes by ~10 orders of magnitude across the
68 surface of the Earth.
69
70 The driver supports both weighted and un-weighted flux generation
71 schemes. However, because of the enormous changes in solid angle
72 acceptance and energy, only the weighted scheme is practical.
73
74 PHYSICS:
75
76 The relative neutrino population needs to be set by the user using
77 the SetRelNuPopulations() method.
78 If run without arguments, the following relative populations are set:
79 nue:numu:nutau:nuebar:numubar:nutaubar = 1:2:0:1:2:0
80
81 The energy spectrum is follows a power law. The user needs to
82 specify the power-law index by calling SetEnergyPowLawIdx().
83
84\author Costas Andreopoulos <c.andreopoulos \at cern.ch>
85 University of Liverpool
86
87\created March 27, 2010
88
89\cpright Copyright (c) 2003-2025, The GENIE Collaboration
90 For the full text of the license visit http://copyright.genie-mc.org
91*/
92//____________________________________________________________________________
93
94#ifndef _GASTRO_FLUX_H_
95#define _GASTRO_FLUX_H_
96
97#include <string>
98#include <map>
99
100#include <TLorentzVector.h>
101#include <TVector3.h>
102#include <TRotation.h>
103
106
107class TH1D;
108class TH2D;
109
110using std::string;
111using std::map;
112
113namespace genie {
114namespace flux {
115
116const double kAstroDefMaxEv = 1E+20 * units::GeV; ///<
117const double kAstroDefMinEv = 1E-3 * units::GeV; ///<
118const int kAstroNlog10EvBins = 1000; ///<
119const int kAstroNCosThetaBins = 500; ///<
120const int kAstroNPhiBins = 500; ///<
121
122//
123//
124//
125
126class GAstroFlux: public GFluxI {
127
128public :
129 virtual ~GAstroFlux();
130
131 //
132 // methods implementing the GENIE GFluxI interface
133 //
134 virtual const PDGCodeList & FluxParticles (void) { return *fPdgCList; }
135 virtual double MaxEnergy (void);
136 virtual bool GenerateNext (void);
137 virtual int PdgCode (void) { return fgPdgC; }
138 virtual double Weight (void) { return fgWeight; }
139 virtual const TLorentzVector & Momentum (void) { return fgP4; }
140 virtual const TLorentzVector & Position (void) { return fgX4; }
141 virtual bool End (void) { return false; }
142 virtual long int Index (void) { return -1; }
143 virtual void Clear (Option_t * opt);
144 virtual void GenerateWeighted (bool gen_weighted);
145
146 //
147 // configuration methods specific to all astrophysical neutrino flux drivers
148 //
149 void ForceMinEnergy (double emin);
150 void ForceMaxEnergy (double emax);
151 void SetDetectorPosition (double latitude, double longitude, double depth, double size);
152 void SetRelNuPopulations (double nnue=1, double nnumu=2, double nnutau=0, double nnuebar=1, double nnumubar=2, double nnutaubar=0);
153 void SetEnergyPowLawIdx (double n);
154 void SetUserCoordSystem (TRotation & rotation); ///< rotation Topocentric Horizontal -> User-defined Topocentric Coord System
155
156protected:
157
158 class NuGenerator;
159 class NuPropagator;
160
161 // abstract class, ctor hidden
162 GAstroFlux();
163
164 // protected methods
165 void Initialize (void);
166 void CleanUp (void);
167 void ResetSelection (void);
168
169 //
170 // protected data members
171 //
172
173 PDGCodeList * fPdgCList; ///< declared list of neutrino pdg-codes that can be thrown by current instance
174 int fgPdgC; ///< (current) generated nu pdg-code
175 TLorentzVector fgP4; ///< (current) generated nu 4-momentum
176 TLorentzVector fgX4; ///< (current) generated nu 4-position
177 double fgWeight; ///< (current) generated nu weight
178 // configuration properties set by the user
179 double fMaxEvCut; ///< (config) user-defined maximum energy cut
180 double fMinEvCut; ///< (config) user-defined minimum energy cut
181 bool fGenWeighted; ///< (config) generate a weighted or unweighted flux?
182 double fDetGeoLatitude; ///< (config) detector: geographic latitude
183 double fDetGeoLongitude; ///< (config) detector: geographic longitude
184 double fDetGeoDepth; ///< (config) detector: depth from surface
185 double fDetSize; ///< (config) detector: size (detector should be enclosed in sphere of this radius)
186 map<int,double> fRelNuPopulations; ///< (config) relative neutrino populations
187 TRotation fRotGEF2THz; ///< (config) coord. system rotation: GEF translated to detector centre -> THZ
188 TRotation fRotTHz2User; ///< (config) coord. system rotation: THZ -> Topocentric user-defined
189 // internal flags and utility objects
190 TVector3 fDetCenter; ///<
191 TH1D * fEnergySpectrum; ///<
195
196 //
197 // utility classes
198 //
200 public:
203 bool SelectNuPdg (bool weighted, const map<int,double> & nupdgpdf, int & nupdg, double & wght);
204 bool SelectEnergy(bool weighted, TH1D & log10epdf, double log10emin, double log10emax, double & log10e, double & wght);
205 bool SelectOrigin(bool weighted, TH2D & opdf, double & phi, double & costheta, double & wght);
206 };
208 public:
209 NuPropagator(double stepsz) : fStepSize(stepsz/units::km) { }
211 bool Go(double phi_start, double costheta_start, const TVector3 & detector_centre, double detector_sz, int nu_pdg, double Ev);
212 int NuPdgAtDetVolBoundary (void) { return fNuPdg; }
213 TVector3 & X3AtDetVolBoundary (void) { return fX3; }
214 TVector3 & P3AtDetVolBoundary (void) { return fP3; }
215 private:
216 double fStepSize;
218 TVector3 fX3;
219 TVector3 fP3;
220 };
221
222};
223
224
225//
226// Concrete astrophysical flux drivers
227//
228
229//............................................................................
230// GENIE diffuse astrophysical neutrino flux driver
231//
233public :
236
237 //
238 //
239};
240
241//............................................................................
242// GENIE concrete flux driver for astrophysical point neutrino sources
243//
245public :
248
249 //
250 bool GenerateNext (void);
251
252 //
253 void AddPointSource(string name, double ra, double dec, double rel_intensity);
254
255private:
256
257 bool SelectSource(void);
258
259 map<int, string> fPntSrcName; ///< point source name
260 map<int, double> fPntSrcRA; ///< right ascension
261 map<int, double> fPntSrcDec; ///< declination
262 map<int, double> fPntSrcRelI; ///< relative intensity
263 double fPntSrcTotI; ///< sum of all relative intensities
264
265 unsigned int fSelSourceId;
266};
267//............................................................................
268
269} // flux namespace
270} // genie namespace
271
272#endif // _GASTRO_FLUX_H_
A list of PDG codes.
Definition PDGCodeList.h:32
bool SelectNuPdg(bool weighted, const map< int, double > &nupdgpdf, int &nupdg, double &wght)
bool SelectEnergy(bool weighted, TH1D &log10epdf, double log10emin, double log10emax, double &log10e, double &wght)
bool SelectOrigin(bool weighted, TH2D &opdf, double &phi, double &costheta, double &wght)
bool Go(double phi_start, double costheta_start, const TVector3 &detector_centre, double detector_sz, int nu_pdg, double Ev)
virtual const TLorentzVector & Position(void)
returns the flux neutrino 4-position (note: expect SI rather than physical units)
Definition GAstroFlux.h:140
double fMaxEvCut
(config) user-defined maximum energy cut
Definition GAstroFlux.h:179
TLorentzVector fgP4
(current) generated nu 4-momentum
Definition GAstroFlux.h:175
double fgWeight
(current) generated nu weight
Definition GAstroFlux.h:177
void ForceMaxEnergy(double emax)
void SetUserCoordSystem(TRotation &rotation)
rotation Topocentric Horizontal -> User-defined Topocentric Coord System
void SetEnergyPowLawIdx(double n)
map< int, double > fRelNuPopulations
(config) relative neutrino populations
Definition GAstroFlux.h:186
PDGCodeList * fPdgCList
declared list of neutrino pdg-codes that can be thrown by current instance
Definition GAstroFlux.h:173
virtual double MaxEnergy(void)
declare the max flux neutrino energy that can be generated (for init. purposes)
int fgPdgC
(current) generated nu pdg-code
Definition GAstroFlux.h:174
NuPropagator * fNuPropg
Definition GAstroFlux.h:194
virtual const PDGCodeList & FluxParticles(void)
declare list of flux neutrinos that can be generated (for init. purposes)
Definition GAstroFlux.h:134
TRotation fRotGEF2THz
(config) coord. system rotation: GEF translated to detector centre -> THZ
Definition GAstroFlux.h:187
virtual int PdgCode(void)
returns the flux neutrino pdg code
Definition GAstroFlux.h:137
double fDetGeoLatitude
(config) detector: geographic latitude
Definition GAstroFlux.h:182
virtual void Clear(Option_t *opt)
reset state variables based on opt
TRotation fRotTHz2User
(config) coord. system rotation: THZ -> Topocentric user-defined
Definition GAstroFlux.h:188
TLorentzVector fgX4
(current) generated nu 4-position
Definition GAstroFlux.h:176
double fDetGeoDepth
(config) detector: depth from surface
Definition GAstroFlux.h:184
double fMinEvCut
(config) user-defined minimum energy cut
Definition GAstroFlux.h:180
void ForceMinEnergy(double emin)
virtual long int Index(void)
returns corresponding index for current flux neutrino (e.g. for a flux ntuple returns the current ent...
Definition GAstroFlux.h:142
bool fGenWeighted
(config) generate a weighted or unweighted flux?
Definition GAstroFlux.h:181
double fDetGeoLongitude
(config) detector: geographic longitude
Definition GAstroFlux.h:183
virtual void GenerateWeighted(bool gen_weighted)
set whether to generate weighted or unweighted neutrinos
virtual bool GenerateNext(void)
generate the next flux neutrino (return false in err)
void SetRelNuPopulations(double nnue=1, double nnumu=2, double nnutau=0, double nnuebar=1, double nnumubar=2, double nnutaubar=0)
virtual double Weight(void)
returns the flux neutrino weight (if any)
Definition GAstroFlux.h:138
double fDetSize
(config) detector: size (detector should be enclosed in sphere of this radius)
Definition GAstroFlux.h:185
virtual const TLorentzVector & Momentum(void)
returns the flux neutrino 4-momentum
Definition GAstroFlux.h:139
void SetDetectorPosition(double latitude, double longitude, double depth, double size)
virtual bool End(void)
true if no more flux nu's can be thrown (eg reaching end of beam sim ntuples)
Definition GAstroFlux.h:141
bool GenerateNext(void)
generate the next flux neutrino (return false in err)
map< int, double > fPntSrcRA
right ascension
Definition GAstroFlux.h:260
double fPntSrcTotI
sum of all relative intensities
Definition GAstroFlux.h:263
map< int, double > fPntSrcRelI
relative intensity
Definition GAstroFlux.h:262
void AddPointSource(string name, double ra, double dec, double rel_intensity)
map< int, string > fPntSrcName
point source name
Definition GAstroFlux.h:259
map< int, double > fPntSrcDec
declination
Definition GAstroFlux.h:261
GENIE flux drivers.
const int kAstroNPhiBins
Definition GAstroFlux.h:120
const double kAstroDefMinEv
Definition GAstroFlux.h:117
const int kAstroNlog10EvBins
Definition GAstroFlux.h:118
const double kAstroDefMaxEv
Definition GAstroFlux.h:116
const int kAstroNCosThetaBins
Definition GAstroFlux.h:119
Physical System of Units.
static constexpr double GeV
Definition Units.h:28
THE MAIN GENIE PROJECT NAMESPACE
Definition AlgCmp.h:25