22 #include "Framework/Conventions/GBuild.h" 39 using namespace
genie;
40 using namespace genie::flux;
50 GJPARCNuFlux::~GJPARCNuFlux()
71 <<
"Got flux entry: " << this->
Index()
72 <<
" - Cycle: "<<
fICycle <<
"/ infinite";
75 <<
"Got flux entry: "<< this->
Index()
83 <<
"Curr flux neutrino fractional weight = " <<
f;
86 <<
"** Fractional weight = " << f <<
" > 1 !!";
88 double r = (f < 1.) ? rnd->
RndFlux().Rndm() : 0;
95 <<
"** Rejecting current flux neutrino based on the flux weight only";
111 <<
"The flux driver has not been properly configured";
122 <<
"The input jnubeam flux ntuple contains no entries for detector id " 134 <<
"No more entries in input flux neutrino ntuple";
164 LOG(
"Flux",
pERROR) <<
"Negative flux weight! Will set weight to 0.0";
174 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 176 <<
"Current flux neutrino not at specified detector location";
234 " --> unable to infer neutrino pdg! Aborting job!";
246 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 248 <<
"Current flux neutrino " 249 <<
"not at the list of neutrinos to be considered at this job.";
263 <<
"Flux neutrino energy exceeds declared maximum neutrino energy";
274 fgP4.SetPxPyPzE (pxnu, pynu, pznu, Enu);
288 fgX4.SetXYZT (xnu, ynu, znu, 0.);
290 fgX4.SetXYZT (0.,0.,0.,0.);
294 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 296 <<
"Generated neutrino: " 297 <<
"\n pdg-code: " <<
fgPdgC 312 std::string::size_type start_pos = filename.rfind(
"/");
313 if (start_pos == std::string::npos) start_pos = 0;
else ++start_pos;
328 <<
"The flux driver has not been properly configured";
349 <<
"The flux driver has not been properly configured";
359 double pot = (cnt/cnt1c) * this->
POT_1cycle();
385 <<
"Loading jnubeam flux tree from ROOT file: " <<
filename;
387 <<
"Detector location: " << detector_location;
395 string fileroot =
"";
396 int firstfile = -1, lastfile = -1;
399 if (filenamev.size() != 3) {
401 <<
"Flux filename should be specfied as either:\n" 402 <<
"\t For a single input file: /dir/root_filename.#.root\n" 403 <<
"\t For multiple input files: /dir/root_filename@#@#";
406 fileroot = filenamev[0];
407 firstfile = atoi(filenamev[1].c_str());
408 lastfile = atoi(filenamev[2].c_str());
410 <<
"Chaining beam simulation output files with stem: " << fileroot
411 <<
" and run numbers in the range: [" << firstfile <<
", " << firstfile <<
"]";
415 bool is_accessible = ! (gSystem->AccessPathName( filename.c_str() ));
416 if (!is_accessible) {
418 <<
"The input jnubeam flux file doesn't exist! Initialization failed!";
423 bool please_exit =
false;
424 for (
int i = firstfile; i < lastfile+1; i++) {
425 bool is_accessible = ! (gSystem->AccessPathName( Form(
"%s.%i.root",fileroot.c_str(),i) ));
426 if (!is_accessible) {
428 <<
"The input jnubeam flux file " << Form(
"%s.%i.root",fileroot.c_str(),i)
429 <<
"doesn't exist! Initialization failed!";
442 <<
" ** Unknown input detector location: " <<
fDetLoc;
450 string ntuple_name = (
fIsNDLoc) ?
"h3002" :
"h2000";
455 <<
"Could not find tree h3002 in file " << Form(
"%s.%i.root",fileroot.c_str(),firstfile)
456 <<
" Trying tree h3001";
458 ntuple_name =
"h3001";
459 fNuFluxChain =
new TChain(ntuple_name.c_str());
460 result = fNuFluxChain->Add( Form(
"%s.%i.root",fileroot.c_str(),firstfile), 0);
464 <<
"** Couldn't get flux tree: " << ntuple_name;
468 for (
int i = firstfile+1; i < lastfile+1; i++) {
469 result =
fNuFluxChain->Add( Form(
"%s.%i.root",fileroot.c_str(),i), 0 );
472 <<
"** Couldn't get flux tree " << ntuple_name <<
" in file " << Form(
"%s.%i.root",fileroot.c_str(),i);
481 string ntuple_name = (
fIsNDLoc) ?
"h3002" :
"h2000";
484 ntuple_name =
"h3001";
488 <<
"Getting flux tree: " << ntuple_name;
491 <<
"** Couldn't get flux tree: " << ntuple_name;
503 <<
"Loaded flux tree contains " <<
fNEntries <<
" entries";
506 <<
"Getting tree branches & setting leaf addresses";
510 bool missing_critical =
false;
517 LOG(
"Flux",
pFATAL) <<
"Cannot find flux branch: norm";
518 missing_critical =
true;
523 LOG(
"Flux",
pFATAL) <<
"Cannot find flux branch: Enu";
524 missing_critical =
true;
529 LOG(
"Flux",
pFATAL) <<
"Cannot find flux branch: ppid";
530 missing_critical =
true;
535 LOG(
"Flux",
pFATAL) <<
"Cannot find flux branch: mode";
536 missing_critical =
true;
541 LOG(
"Flux",
pFATAL) <<
"Cannot find flux branch: rnu";
542 missing_critical =
true;
547 LOG(
"Flux",
pFATAL) <<
"Cannot find flux branch: xnu";
548 missing_critical =
true;
553 LOG(
"Flux",
pFATAL) <<
"Cannot find flux branch: ynu";
554 missing_critical =
true;
559 LOG(
"Flux",
pFATAL) <<
"Cannot find flux branch: nnu";
560 missing_critical =
true;
565 LOG(
"Flux",
pFATAL) <<
"Cannot find flux branch: idfd";
566 missing_critical =
true;
569 if(missing_critical){
571 <<
"Unable to find critical information in the flux ntuple! Initialization failed!";
660 for (
int i = firstfile+1; i < lastfile+1; i++) {
661 result =
fNuFluxSumChain->Add( Form(
"%s.%i.root",fileroot.c_str(),i), 0 );
687 for(
int ientry = 0; ientry <
fNEntries; ientry++) {
694 LOG(
"Flux",
pERROR) <<
"Negative flux weight! Will set weight to 0.0";
709 <<
"The input jnubeam flux ntuple contains no entries for detector id " 717 LOG(
"Flux",
pFATAL) <<
"Non-positive maximum flux weight!";
740 <<
"Declared list of neutrino species: " << *
fPdgCList;
745 fMaxEv = TMath::Max(0.,Ev);
748 <<
"Declared maximum flux neutrino energy: " <<
fMaxEv;
800 long int offset = (
long int) floor(ran_frac *
fNEntries);
801 LOG(
"Flux",
pERROR) <<
"Setting flux driver to start looping over entries " 802 <<
"with offset of "<< offset;
828 LOG(
"Flux",
pNOTICE) <<
"Initializing GJPARCNuFlux driver";
880 LOG(
"Flux",
pNOTICE) <<
"Setting default GJPARCNuFlux driver options";
903 fgP4.SetPxPyPzE (0.,0.,0.,0.);
904 fgX4.SetXYZT (0.,0.,0.,0.);
930 if(name ==
"sk" )
return -1;
933 for (
int i=1; i<51; i++) {
935 if(name == temp.Data())
return i;
967 for(
int i = 0; i<3; i++){
977 for(
int ip = 0; ip<
fNgmax; ip++){
1002 for(
int i = 0; i < 2; i++){
1010 for(
int i = 0; i < 3; i++)
hcur[i] = info.
hcur[i];
1031 for(
int i=0; i<3; i++){
1037 gpos0[i] = -999999.;
1041 for(
int ip = 0; ip<
fNgmax; ip++){
1065 for(
int i = 0; i < 2; i++){
1067 btilt[i] = -999999.;
1070 alpha[i] = -999999.;
1073 for(
int i = 0; i < 3; i++)
hcur[i] = -999999.;
1081 stream <<
"\n idfd = " << info.
idfd 1082 <<
"\n norm = " << info.
norm 1085 <<
"\n Enu = " << info.
Enu 1086 <<
"\n geant code = " << info.
ppid 1088 <<
"\n decay mode = " << info.
mode 1089 <<
"\n nvtx0 = " << info.
nvtx0 1090 <<
"\n |momentum| @ decay = " << info.
ppi 1091 <<
"\n position_vector @ decay = (" 1092 << info.
xpi[0] <<
", " 1093 << info.
xpi[1] <<
", " 1094 << info.
xpi[2] <<
")" 1095 <<
"\n direction_vector @ decay = (" 1096 << info.
npi[0] <<
", " 1097 << info.
npi[1] <<
", " 1098 << info.
npi[2] <<
")" 1099 <<
"\n |momentum| @ prod. = " << info.
ppi0 1100 <<
"\n position_vector @ prod. = (" 1101 << info.
xpi0[0] <<
", " 1102 << info.
xpi0[1] <<
", " 1103 << info.
xpi0[2] <<
")" 1104 <<
"\n direction_vector @ prod. = (" 1105 << info.
npi0[0] <<
", " 1106 << info.
npi0[1] <<
", " 1107 << info.
npi0[2] <<
")" 1108 <<
"\n cospibm = " << info.
cospibm 1109 <<
"\n cospi0bm = " << info.
cospi0bm 1110 <<
"\n Plus additional info if flux version is later than 07a" static constexpr double cm
TTree * fNuFluxTree
input flux ntuple
end
while True: pbar.update(maxval-len(onlies[E][S])) #print iS, "/", len(onlies[E][S]) found = False for...
double POT_curravg(void)
current average POT
int fgPdgC
running generated nu pdg-code
string P4AsShortString(const TLorentzVector *p)
double fSumWeightTot1c
total sum of weights for neutrinos to be thrown / cycle
bool LoadBeamSimData(string filename, string det_loc)
load a jnubeam root flux ntuple
THE MAIN GENIE PROJECT NAMESPACE
bool End(void)
true if no more flux nu's can be thrown (eg reaching end of beam sim ntuples)
bool fLoadedNeutrino
set to true when GenerateNext_weighted has been called successfully
void SetUpstreamZ(double z0)
set flux neutrino initial z position (upstream of the detector)
int DLocName2Id(string name)
static RandomGen * Instance()
Access instance.
string fDetLoc
input detector location ('sk','nd1','nd2',...)
TChain * fNuFluxSumChain
input summary ntuple for flux file. This tree is only present for later flux versions > 10a ...
double POT_1cycle(void)
flux POT per cycle
bool GenerateNext_weighted(void)
bool fNuFluxUsingTree
are we using a TTree or a TChain to view the input flux file?
double fFilePOT
file POT normalization, typically 1E+21
TChain * fNuFluxChain
input flux ntuple
double Weight(void)
returns the flux neutrino weight (if any)
bool ExistsInPDGCodeList(int pdg_code) const
void GenerateWeighted(bool gen_weighted=true)
set whether to generate weighted or unweighted neutrinos
long int fOffset
start looping at entry fOffset
long int fNNeutrinos
number of flux neutrinos thrown so far
void SetFluxParticles(const PDGCodeList &particles)
specify list of flux neutrino species
A singleton holding random number generator classes. All random number generation in GENIE should tak...
GJPARCNuFluxPassThroughInfo()
TTree * fNuFluxSumTree
input summary ntuple for flux file. This tree is only present for later flux versions > 10a ...
A GENIE flux driver encapsulating the JPARC neutrino flux. It reads-in the official JPARC neutrino fl...
void SetMaxEnergy(double Ev)
specify maximum flx neutrino energy
int GeantToPdg(int geant_code)
long int fNNeutrinosTot1c
total number of flux neutrinos to be thrown / cycle
TLorentzVector fgP4
running generated nu 4-momentum
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
int fDetLocId
input detector location id (fDetLoc -> jnubeam idfd)
ClassImp(GJPARCNuFluxPassThroughInfo) GJPARCNuFlux
void SetFilePOT(double pot)
flux file norm is in /N POT/det [ND] or /N POT/cm^2 [FD]. Specify N (typically 1E+21) ...
int fNCycles
how many times to cycle through the flux ntuple
static const double kASmallNum
int fNDetLocIdFound
per cycle keep track of the number of fDetLocId are found - if this is zero will exit job ...
long int fIEntry
current flux ntuple entry
bool fIsNDLoc
input location is a 'near' detector location?
GJPARCNuFluxPassThroughInfo * fPassThroughInfo
bool fGenerateWeighted
generate weighted/deweighted flux neutrinos (default is false)
TFile * fNuFluxFile
input flux file
double fMaxWeight
max flux neutrino weight in input file for the specified detector location
void Clear(Option_t *opt)
reset state variables based on opt
vector< string > Split(string input, string delim)
friend ostream & operator<<(ostream &stream, const GJPARCNuFluxPassThroughInfo &info)
int strcmp(const String &s1, const String &s2)
long int Index(void)
returns corresponding index for current flux neutrino (e.g. for a flux ntuple returns the current ent...
bool fIsFDLoc
input location is a 'far' detector location?
double fZ0
configurable starting z position for each flux neutrino (in detector coord system) ...
PDGCodeList * fPdgCList
list of neutrino pdg-codes
bool GenerateNext(void)
generate the next flux neutrino (return false in err)
long int fNEntries
number of flux ntuple entries
void SetNumOfCycles(int n)
set how many times to cycle through the ntuple (default: 1 / n=0 means 'infinite') ...
TLorentzVector fgX4
running generated nu 4-position
bool fUseRandomOffset
whether set random starting point when looping over flux ntuples
void RandomOffset(void)
choose a random offset as starting entry in flux ntuple
TRandom3 & RndFlux(void) const
rnd number generator used by flux drivers
string X4AsString(const TLorentzVector *x)
double fNorm
current flux ntuple normalisation
static constexpr double m
Most commonly used PDG codes. A set of utility functions to handle PDG codes is provided in PDGUtils...
#define FLUXDRIVERREG4(_nsa, _nsb, _name, _fqname)
void Copy(const PDGCodeList &list)
copy / print
double fSumWeight
sum of weights for neutrinos thrown so far
long int fEntriesThisCycle
keep track of number of entries used so far for this cycle
QTextStream & endl(QTextStream &s)
void push_back(int pdg_code)
double fMaxEv
maximum energy