18int main(
int argc,
char** argv){
21 std::cout <<
"Three arguments required: path to FLUKA file AND output file name AND number of pp collisions used to generate FLUKA file." << std::endl;
25 std::string inFileName = std::string(argv[1]);
26 std::string outFileName = std::string(argv[2]);
27 double pp_collision_number = std::stod(argv[3]);
30 std::map<int, int> FLUKAtoPDG { {27, 14},
38 TRandom3 * ran =
new TRandom3();
45 double z = (48386-48000);
47 double plane_corner[] = {-70., 5., z};
48 double plane_dir1[] = {140., 0, 0};
49 double plane_dir2[] = {0, 65., 0};
52 std::ifstream in_file(inFileName);
73 int FlukaRun, evtNumber, FlukaID, generationN;
74 float Ekin, weight, x, y, x_cos, y_cos, age;
76 TFile * fOut =
new TFile(outFileName.c_str(),
"RECREATE");
77 TTree * tOut =
new TTree(
"flux",
"a simple flux n-tuple");
78 TTree * metaOut =
new TTree(
"meta",
"metadata for flux n-tuple");
80 genie::flux::GSimpleNtpEntry * gsimple_entry =
new genie::flux::GSimpleNtpEntry;
81 tOut->Branch(
"entry", &gsimple_entry);
82 genie::flux::GSimpleNtpMeta* meta_entry =
new genie::flux::GSimpleNtpMeta;
83 metaOut->Branch(
"meta", &meta_entry);
85 genie::flux::GSimpleNtpAux* aux_entry =
new genie::flux::GSimpleNtpAux;
86 tOut->Branch(
"aux", &aux_entry);
89 UInt_t metakey = TString::Hash(outFileName.c_str(),strlen(outFileName.c_str()));
90 metakey &= 0x7FFFFFFF;
93 std::set<int> pdglist;
94 double min_weight = 1e10;
95 double max_weight = -1e10;
96 double max_energy = 0;
100 if (in_file.is_open()){
102 while (!in_file.eof()){
103 getline(in_file, in_line);
106 if (in_line.find(
"#") == in_line.npos){
119 gsimple_entry->Reset();
123 if (verbose) std::cout <<
"Got entry " <<
counter++ << std::endl;
126 std::cout << FlukaRun <<
"\n"
129 << generationN <<
"\n"
138 <<
"--------------------------------------------------" << std::endl;
141 gsimple_entry->metakey = metakey;
142 gsimple_entry->pdg = FLUKAtoPDG[FlukaID];
143 gsimple_entry->wgt = weight;
144 gsimple_entry->vtxx = x*ShipUnit::cm/ShipUnit::m;
145 gsimple_entry->vtxy = y*ShipUnit::cm/ShipUnit::m;
146 gsimple_entry->vtxz = z*ShipUnit::cm/ShipUnit::m;
147 gsimple_entry->dist = 0.;
150 double z_cos = sqrt(1 - pow(x_cos, 2) - pow(y_cos, 2));
152 gsimple_entry->px = Ekin*x_cos;
153 gsimple_entry->py = Ekin*y_cos;
154 gsimple_entry->pz = Ekin*z_cos;
155 gsimple_entry->E = Ekin;
158 aux_entry->auxint.push_back(FlukaRun);
159 aux_entry->auxint.push_back(evtNumber);
160 aux_entry->auxint.push_back(FlukaID);
161 aux_entry->auxint.push_back(generationN);
163 aux_entry->auxdbl.push_back(age);
164 aux_entry->auxdbl.push_back(weight);
167 pdglist.insert(gsimple_entry->pdg);
168 min_weight = TMath::Min(min_weight, gsimple_entry->wgt);
169 max_weight = TMath::Max(max_weight, gsimple_entry->wgt);
170 max_energy = TMath::Max(max_energy, gsimple_entry->E);
180 meta_entry->pdglist.clear();
181 for (std::set<int>::const_iterator pdg_iterator = pdglist.begin();
182 pdg_iterator != pdglist.end();
183 ++pdg_iterator) meta_entry->pdglist.push_back(*pdg_iterator);
184 meta_entry->maxEnergy = max_energy;
185 meta_entry->maxWgt = max_weight;
186 meta_entry->minWgt = min_weight;
188 meta_entry->protons = pp_collision_number;
189 for (
int i = 0; i < 3; i++) meta_entry->windowBase[i] = plane_corner[i]*ShipUnit::cm/ShipUnit::m;
190 for (
int i = 0; i < 3; i++) meta_entry->windowDir1[i] = plane_dir1[i]*ShipUnit::cm/ShipUnit::m;
191 for (
int i = 0; i < 3; i++) meta_entry->windowDir2[i] = plane_dir2[i]*ShipUnit::cm/ShipUnit::m;
193 meta_entry->infiles.push_back(inFileName);
194 meta_entry->seed = ran->GetSeed();
195 meta_entry->metakey = metakey;
197 meta_entry->auxintname.push_back(
"FlukaRun");
198 meta_entry->auxintname.push_back(
"evtNumber");
199 meta_entry->auxintname.push_back(
"FlukaID");
200 meta_entry->auxintname.push_back(
"generationN");
202 meta_entry->auxdblname.push_back(
"age");
203 meta_entry->auxdblname.push_back(
"FLUKA_weight");