54 using namespace genie;
67 int main(
int argc,
char ** argv)
77 int countfate [nfates];
78 double sigma [nfates];
79 double sigma_err [nfates];
80 string fatestr [nfates] =
" ";
93 for (
int k=0; k<nfates; k++) {
105 double kin_energy = 0.;
117 tree = dynamic_cast <TTree *> ( file.Get(
"gtree") );
118 ginuke = dynamic_cast <TTree *> ( file.Get(
"ginuke") );
130 tree->SetBranchAddress(
"gmcrec", &mcrec);
133 nev = (int) tree->GetEntries();
135 <<
"Processing " << nev <<
" events";
141 for(
int ievent = 0; ievent < nev; ievent++) {
144 tree->GetEntry(ievent);
152 probe_pdg =
event.Particle(0)->Pdg();
153 target_pdg =
event.Particle(1)->Pdg();
159 if(ievent<displayno) {
167 case 0: countfate[0]++;
break;
168 case 1: countfate[1]++;
break;
169 case 2: countfate[2]++;
break;
170 case 3: countfate[3]++;
break;
171 case 4: countfate[4]++;
break;
172 case 5: countfate[5]++;
break;
173 case 6: countfate[6]++;
break;
174 case 13: countfate[8]++;
break;
176 if (7<=fate && fate<=12) countfate[7]++;
179 <<
"Undefined fate from FindhAFate() : " << fate;
193 <<
"Found ginuke type file";
195 nev = (int) ginuke->GetEntries();
197 <<
"Processing " << nev <<
" events";
209 ginuke->SetBranchAddress(
"ke", &kin_energy);
210 ginuke->SetBranchAddress(
"probe",&probe_pdg );
211 ginuke->SetBranchAddress(
"tgt", &target_pdg);
212 ginuke->SetBranchAddress(
"nh", &numh );
213 ginuke->SetBranchAddress(
"npip", &numpip );
214 ginuke->SetBranchAddress(
"npi0", &numpi0 );
215 ginuke->SetBranchAddress(
"npim", &numpim );
216 ginuke->SetBranchAddress(
"pdgh", &pdg_had );
217 ginuke->SetBranchAddress(
"Eh", &E_had );
218 ginuke->SetBranchAddress(
"e", &energy );
221 for(
int ievent = 0; ievent < nev; ievent++) {
224 ginuke->GetEntry(ievent);
227 if (energy==E_had[0] && numh==1)
229 else if (energy!=E_had[0] && numh==1)
231 else if (
pdg::IsPion(probe_pdg) && numpip+numpi0+numpim==0)
233 else if ( (
pdg::IsNucleon(probe_pdg) && numpip+numpi0+numpim==0 && numh>2 )
234 || (probe_pdg==
kPdgGamma && energy!=E_had[0] && numpip+numpi0+numpim==0))
236 else if ( numpip+numpi0+numpim> (
pdg::IsPion(probe_pdg) ? 1 : 0) )
240 if ( (
pdg::IsPion(probe_pdg) && ( probe_pdg==pdg_had[0] || probe_pdg==pdg_had[1] ))
249 for (
int iter = 0; iter < numh; iter++)
251 if (probe_pdg==211 && pdg_had[iter]==-211) { index=8; undef=
false; }
252 else if (probe_pdg==-211 && pdg_had[iter]==211) { index=8; undef=
false; }
255 if (undef) { index=0; }
258 if (ievent<displayno) {
267 <<
"Could not read input file!";
276 const double dnev = (double) nev;
278 const double R0 = 1.4;
282 double nuclear_radius = NR * R0 * TMath::Power(A, 1./3.);
283 double area = TMath::Pi() * TMath::Power(nuclear_radius,2);
286 string probe_name = pdglib->
Find(probe_pdg)->GetName();
287 string target_name = pdglib->
Find(target_pdg)->GetName();
290 <<
" Probe = " << probe_name
291 <<
", KE = " << kin_energy <<
" GeV";
293 <<
" Target = " << target_name
294 <<
" (Z,A) = (" << Z <<
", " << A
295 <<
"), nuclear radius = " << nuclear_radius
296 <<
" fm, area = " << area <<
" fm**2 " <<
'\n';
299 int nullint = countfate[1];
301 double sigtoterr = 0;
302 double sigtotScat = 0;
303 double sigtotAbs = 0;
305 for(
int k=0; k<nfates; k++) {
307 cnttot += countfate[k];
308 double ratio = countfate[k]/dnev;
309 sigma[k] = fm2tomb * area * ratio;
310 sigma_err[k] = fm2tomb * area * TMath::Sqrt(ratio*(1-ratio)/dnev);
311 if(sigma_err[k]==0) {
312 sigma_err[k] = fm2tomb * area * TMath::Sqrt(countfate[k])/dnev;
316 <<
" --> " << setw(26) << fatestr[k]
317 <<
": " << setw(7) << countfate[k] <<
" events -> "
318 << setw(7) << sigma[k] <<
" +- " << sigma_err[k] <<
" (mb)" <<
'\n';
321 sigtotAbs += sigma[k];
325 sigtotScat += sigma[k];
330 sigtot = fm2tomb * area * cnttot/dnev;
331 sigtoterr = fm2tomb * area * TMath::Sqrt(cnttot)/dnev;
333 double sigtot_noelas = fm2tomb * area * (cnttot-countfate[3])/dnev;
334 double sigtoterr_noelas = fm2tomb * area * TMath::Sqrt(cnttot-countfate[3])/dnev;
336 double ratio_as = (sigtotScat==0) ? 0 : sigtotAbs/(
double)sigtotScat;
339 <<
"\n\n --------------------------------------------------- "
340 <<
"\n ==> " << setw(28) <<
" Total: " << setw(7) << cnttot
341 <<
" events -> " << setw(7) << sigtot <<
" +- " << sigtoterr <<
" (mb)"
342 <<
"\n (-> " << setw(28) <<
" Hadrons escaped nucleus: "
343 << setw(7) << nullint <<
" events)"
344 <<
"\n ==> " << setw(28) <<
" Ratio (abs/scat) = "
345 << setw(7) << ratio_as
346 <<
"\n ==> " << setw(28) <<
" avg. num of int. = "
347 << setw(7) << cnttot/dnev
348 <<
"\n ==> " << setw(28) <<
" no interaction = "
349 << setw(7) << (dnev-cnttot)/dnev
350 <<
"\n ------------------------------------------------------- \n";
355 bool file_exists=
false;
357 file_exists=test_file.is_open();
363 xsec_file <<
"#KE" <<
"\t" <<
"Undef" <<
"\t"
364 <<
"sig" <<
"\t" <<
"CEx" <<
"\t"
365 <<
"sig" <<
"\t" <<
"Elas" <<
"\t"
366 <<
"sig" <<
"\t" <<
"Inelas"<<
"\t"
367 <<
"sig" <<
"\t" <<
"Abs" <<
"\t"
368 <<
"sig" <<
"\t" <<
"KO" <<
"\t"
369 <<
"sig" <<
"\t" <<
"PiPro" <<
"\t"
370 <<
"sig" <<
"\t" <<
"DCEx" <<
"\t"
371 <<
"sig" <<
"\t" <<
"Reac" <<
"\t"
372 <<
"sig" <<
"\t" <<
"Tot" <<
"\t" <<
"sig" << endl;
374 xsec_file << kin_energy;
375 for(
int k=0; k<nfates; k++) {
377 xsec_file <<
"\t" << sigma[k] <<
"\t" << sigma_err[k];
379 xsec_file <<
"\t" << sigtot_noelas <<
"\t" << sigtoterr_noelas;
380 xsec_file <<
"\t" << sigtot <<
"\t" << sigtoterr << endl;
394 double p_pdg = evrec->
Probe()->
Pdg();
399 int num[] = {0,0,0,0,0,0,0,0,0};
405 double numKE[] = {0,0,0,0,0,0,0,0,0};
409 bool hasBlob =
false;
413 TObjArrayIter piter(evrec);
422 switch((
int) p->
Pdg())
426 case ((
int)
kPdgPiP) : index = 2;
break;
427 case ((
int)
kPdgPiM) : index = 3;
break;
428 case ((
int)
kPdgPi0) : index = 4;
break;
429 case ((
int)
kPdgKP) : index = 5;
break;
430 case ((
int)
kPdgKM) : index = 6;
break;
431 case ((
int)
kPdgK0) : index = 7;
break;
432 case ((
int)
kPdgGamma) : index = 8;
break;
433 case (2000000002) : index = 9; hasBlob=
true;
break;
434 default: index = 9;
break;
439 if(numFsPart==0) fs=p;
442 if(p->
KinE() > numKE[index]) numKE[index] = p->
KinE();
449 double dE = TMath::Abs( probe-> E() - fs-> E() );
450 double dPz = TMath::Abs( probe->
Pz() - fs->
Pz() );
451 double dPy = TMath::Abs( probe->
Py() - fs->
Py() );
452 double dPx = TMath::Abs( probe->
Px() - fs->
Px() );
457 num_t = num[0]+num[1]+num[2]+num[3]+num[4]+num[5]+num[6]+num[7];
458 num_nu = num[0]+num[1];
459 num_pi = num[2]+num[3]+num[4];
460 num_k = num[5]+num[6]+num[7];
474 if (num[0]==1 && num[1]==1)
return kIHAFtAbs;
475 else if(num[0]==2 && num[1]==0)
return kIHAFtAbs;
476 else if(num[0]==2 && num[1]==1)
return kIHAFtAbs;
477 else if(num[0]==1 && num[1]==2)
return kIHAFtAbs;
478 else if(num[0]==2 && num[1]==2)
return kIHAFtAbs;
479 else if(num[0]==3 && num[1]==2)
return kIHAFtAbs;
492 if (num[2]==1) { fs_pdg=
kPdgPiP; fs_ind=2; }
493 else if(num[3]==1) { fs_pdg=
kPdgPiM; fs_ind=3; }
494 else if(num[4]==1) { fs_pdg=
kPdgPi0; fs_ind=4; }
495 else if(num[5]==1) { fs_pdg=
kPdgKP; fs_ind=5; }
496 else if(num[6]==1) { fs_pdg=
kPdgKM; fs_ind=6; }
497 else { fs_pdg=
kPdgK0; fs_ind=7; }
505 ((fs_ind==2 || fs_ind==3) && p_pdg==
kPdgPi0))
509 else if(((p_pdg==
kPdgKP || p_pdg==
kPdgKM) && fs_ind==7) ||
510 ((fs_ind==5 || fs_ind==6) && p_pdg==
kPdgK0))
514 else if((p_pdg==
kPdgPiP && fs_ind==3) ||
519 else if((p_pdg==
kPdgKP && fs_ind==6) ||
520 (p_pdg==
kPdgKM &&fs_ind==5))
528 if(num[0]>=1) { fs_ind=0; }
538 if(numKE[1]>numKE[0]) { fs_ind=1; }
540 if(numtype[fs_ind]==p_pdg)
568 if (num[0]==2 && num[1]==1)
return kIHAFtKo;
569 else if(num[0]==1 && num[1]==2)
return kIHAFtKo;
570 else if(num[0]==2 && num[1]==2)
return kIHAFtKo;
571 else if(num[0]==3 && num[1]==2)
return kIHAFtKo;
579 if (num[5]==1) fs_ind=5;
580 else if (num[6]==1) fs_ind=6;
583 if(numKE[fs_ind]>=(.8*p_KE))
return kIHAFtElas;
588 if (num[0]==2 && num[1]==1)
return kIHAFtKo;
589 else if(num[0]==1 && num[1]==2)
return kIHAFtKo;
590 else if(num[0]==2 && num[1]==2)
return kIHAFtKo;
591 else if(num[0]==3 && num[1]==2)
return kIHAFtKo;
597 LOG(
"Intranuke",
pWARN) <<
"---> *** Undefined fate! ***" <<
"\n" << (*evrec);
603 LOG(
"gtestINukeHadroXSec",
pNOTICE) <<
"Parsing command line arguments";
608 if( parser.OptionExists(
'f') ) {
609 LOG(
"gtestINukeHadroXSec",
pINFO) <<
"Reading input filename";
613 <<
"Unspecified input filename - Exiting";
618 if( parser.OptionExists(
'o') ) {
619 LOG(
"gtestINukeHadroXSec",
pINFO) <<
"Reading output filename";
632 <<
" gtestINukeHadroXSec -f event_file [-w]"
string gOptOutputFilename
virtual GHepParticle * Particle(int position) const
MINOS-style ntuple record. Each such ntuple record holds a generated EventRecord object. Ntuples of this type are intended for feeding GENIE events into other applications (for example the GEANT4 based MC generation framework of an experiment) if no direct interface exists.
int IonPdgCodeToA(int pdgc)
static constexpr double fs
double Pz(void) const
Get Pz.
GHepStatus_t Status(void) const
int main(int argc, char **argv)
double Px(void) const
Get Px.
virtual GHepParticle * Probe(void) const
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
static constexpr double A
bool gOptWriteOutput
write out hadron cross sections
static constexpr double mb
static constexpr double fm2
Generated Event Record. It is a GHepRecord object that can accept / be visited by EventRecordVisitorI...
double KinE(bool mass_from_pdg=false) const
Get kinetic energy.
static PDGLibrary * Instance(void)
Singleton class to load & serve a TDatabasePDG.
static string AsString(INukeFateHN_t fate)
int IonPdgCodeToZ(int pdgc)
TParticlePDG * Find(int pdgc, bool must_exist=true)
Command line argument parser.
void GetCommandLineArgs(int argc, char **argv)
void Clear(Option_t *opt="")
INukeFateHA_t FindhAFate(const GHepRecord *evrec)
GENIE's GHEP MC event record.
Most commonly used PDG codes. A set of utility functions to handle PDG codes is provided in PDGUtils...
STDHEP-like event record entry that can fit a particle or a nucleus.
enum genie::EINukeFateHA_t INukeFateHA_t
enum genie::EGHepStatus GHepStatus_t
double Py(void) const
Get Py.