20 #include "TLorentzVector.h" 24 #include "Conventions/Units.h" 25 #include "EVGCore/EventRecord.h" 26 #include "GHEP/GHepUtils.h" 27 #include "PDG/PDGCodes.h" 28 #include "PDG/PDGLibrary.h" 30 #include "Interaction/InitialState.h" 31 #include "Interaction/Interaction.h" 32 #include "Interaction/Kinematics.h" 33 #include "Interaction/KPhaseSpace.h" 34 #include "Interaction/ProcessInfo.h" 35 #include "Interaction/XclsTag.h" 36 #include "GHEP/GHepParticle.h" 37 #include "PDG/PDGCodeList.h" 38 #include "Conventions/Constants.h" 41 #include "EVGDrivers/GFluxI.h" 42 #include "FluxDrivers/GFluxBlender.h" 43 #include "FluxDrivers/GNuMIFlux.h" 44 #include "FluxDrivers/GSimpleNtpFlux.h" 61 #include "dk2nu/tree/dk2nu.h" 62 #include "dk2nu/tree/NuChoice.h" 63 #include "dk2nu/tree/dkmeta.h" 64 #include "dk2nu/genie/GDk2NuFlux.h" 76 TLorentzVector vtxOffset(0,0,0,spillTime);
81 TLorentzVector &vtxOffset,
84 TLorentzVector *
vertex = record->Vertex();
88 const genie::Interaction *inter = record->Summary();
91 const genie::InitialState &initState = inter->InitState();
92 const genie::ProcessInfo &procInfo = inter->ProcInfo();
99 TIter partitr(record);
100 genie::GHepParticle *
part = 0;
105 std::string primary(
"primary");
107 while( (part = dynamic_cast<genie::GHepParticle *>(partitr.Next())) ){
115 double vtx[4] = {part->
Vx(), part->Vy(), part->Vz(), part->Vt()};
126 tpart.SetRescatter(part->RescatterCode());
130 if (part->Status() == 0 || part->Status() == 1){
131 vtx[0] = 100.*(part->Vx()*1.e-15 + vertex->X() + vtxOffset.X());
132 vtx[1] = 100.*(part->Vy()*1.e-15 + vertex->Y() + vtxOffset.Y());
133 vtx[2] = 100.*(part->Vz()*1.e-15 + vertex->Z() + vtxOffset.Z());
134 vtx[3] = part->Vt() + vtxOffset.T();
136 TLorentzVector pos(vtx[0], vtx[1], vtx[2], vtx[3]);
137 TLorentzVector mom(part->Px(), part->Py(), part->Pz(), part->E());
138 tpart.AddTrajectoryPoint(pos,mom);
139 if (part->PolzIsSet()) {
141 part->GetPolarization(polz);
142 tpart.SetPolarization(polz);
151 if (procInfo.IsWeakNC()) CCNC =
simb::kNC;
156 if (procInfo.IsQuasiElastic() ) mode =
simb::kQE;
157 else if (procInfo.IsDeepInelastic() ) mode =
simb::kDIS;
158 else if (procInfo.IsResonant() ) mode =
simb::kRes;
159 else if (procInfo.IsCoherent() ) mode =
simb::kCoh;
168 else if (procInfo.IsMEC() ) mode =
simb::kMEC;
170 else if (procInfo.IsEM() ) mode =
simb::kEM;
183 genie::GHepParticle * hitnucl = record->HitNucleon();
184 TLorentzVector pdummy(0, 0, 0, 0);
186 const TLorentzVector v4_null;
187 genie::GHepParticle* probe = record->Probe();
188 genie::GHepParticle* finallepton = record->FinalStatePrimaryLepton();
189 const TLorentzVector & k1 = ( probe ? *(probe->P4()) : v4_null );
190 const TLorentzVector & k2 = ( finallepton ? *(finallepton->P4()) : v4_null );
195 double M = genie::constants::kNucleonMass;
196 TLorentzVector q = k1-k2;
197 double Q2 = -1 * q.M2();
198 double v = (hitnucl) ? q.Energy() : -1;
199 double x = (hitnucl) ? 0.5*Q2/(M*v) : -1;
200 double y = (hitnucl) ? v/k1.Energy() : -1;
201 double W2 = (hitnucl) ? M*M + 2*M*v - Q2 : -1;
202 double W = (hitnucl) ? std::sqrt(W2) : -1;
209 TLorentzVector q = k1-k2;
211 double Q2 = -1 * q.M2();
212 double v = q.Energy();
213 double y = v/k1.Energy();
217 if ( hitnucl || procInfo.IsCoherent() ) {
218 const double M = genie::constants::kNucleonMass;
224 W2 = M*M + 2*M*v - Q2;
232 initState.Tgt().Pdg(),
233 initState.Tgt().HitNucPdg(),
234 initState.Tgt().HitQrkPdg(),
247 genie::Interaction *inter = record->Summary();
248 const genie::ProcessInfo &procInfo = inter->ProcInfo();
249 truth.
fGint = (int)procInfo.InteractionTypeId();
250 truth.
fGscatter = (int)procInfo.ScatteringTypeId();
253 truth.
fweight = record->Weight();
255 truth.
fXsec = record->XSec();
260 TLorentzVector *erVtx = record->Vertex();
261 vtx.SetXYZT(erVtx->X(), erVtx->Y(), erVtx->Z(), erVtx->T() );
266 const genie::XclsTag &exclTag = inter->ExclTag();
267 truth.
fIsCharm = exclTag.IsCharmEvent();
268 truth.
fResNum = (int)exclTag.Resonance();
279 for (
int idx = 0; idx < record->GetEntries(); idx++)
282 const genie::GHepParticle * particle = record->Particle(idx);
283 if (particle->Status() != genie::kIStHadronInTheNucleus)
286 int pdg = particle->Pdg();
287 if (pdg == genie::kPdgPi0)
289 else if (pdg == genie::kPdgPiP)
291 else if (pdg == genie::kPdgPiM)
293 else if (pdg == genie::kPdgNeutron)
295 else if (pdg == genie::kPdgProton)
300 const genie::Kinematics &kine = inter->Kine();
303 truth.
fgQ2 = kine.Q2(
true);
304 truth.
fgq2 = kine.q2(
true);
305 truth.
fgW = kine.W(
true);
306 if ( kine.KVSet(genie::kKVSelt) ) {
309 truth.
fgT = kine.t(
true);
311 truth.
fgX = kine.x(
true);
312 truth.
fgY = kine.y(
true);
324 const genie::InitialState &initState = inter->InitState();
326 truth.
fProbeP4 = *initState.GetProbeP4();
329 const genie::Target &tgt = initState.Tgt();
332 truth.
ftgtZ = tgt.Z();
333 truth.
ftgtA = tgt.A();
343 bool useFirstTrajPosition)
345 genie::EventRecord* newEvent =
new genie::EventRecord;
347 newEvent->SetWeight(gtruth.
fweight);
349 newEvent->SetXSec(gtruth.
fXsec);
351 genie::KinePhaseSpace_t space = (genie::KinePhaseSpace_t)gtruth.
fGPhaseSpace;
353 newEvent->SetDiffXSec(gtruth.
fDiffXsec,space);
355 TLorentzVector vtx = gtruth.
fVertex;
356 newEvent->SetVertex(vtx);
361 for (
int i = 0; i < mctruth.
NParticles(); i++) {
365 genie::GHepStatus_t gmst = (genie::GHepStatus_t)mcpart.
StatusCode();
366 int gmmo = mcpart.
Mother();
406 double gmpx = mcpart.
Px(0);
407 double gmpy = mcpart.
Py(0);
408 double gmpz = mcpart.
Pz(0);
409 double gme = mcpart.
E(0);
411 double gmvx = mcpart.
Gvx();
412 double gmvy = mcpart.
Gvy();
413 double gmvz = mcpart.
Gvz();
414 double gmvt = mcpart.
Gvt();
415 bool GvtxFunky =
false;
416 if ( gmvx == 0 && gmvy == 0 &&
417 gmvz == 0 && gmvt == 0 ) GvtxFunky =
true;
426 std::string andOut =
"";
427 if (nmsg == 0 ) andOut =
"... last of such messages";
429 <<
"RetrieveGHEP(simb::MCTruth,simb::Gtruth) ... Gv[xyzt] all " 430 << gmvx <<
" for index " << i
431 <<
"; probably not filled ..." 432 << andOut << std::endl;
436 const TLorentzVector mcpartTrjPos =
437 ( useFirstTrajPosition ) ? mcpart.
Position() :
452 gmvx = 1.e15*((mcpartTrjPos.X()*1.e-2) - vtx.X());
453 gmvy = 1.e15*((mcpartTrjPos.Y()*1.e-2) - vtx.Y());
454 gmvz = 1.e15*((mcpartTrjPos.Z()*1.e-2) - vtx.Z());
455 gmvt = mcpartTrjPos.T() - vtx.T();
457 gmvx = mcpartTrjPos.X();
458 gmvy = mcpartTrjPos.Y();
459 gmvz = mcpartTrjPos.Z();
460 gmvt = mcpartTrjPos.T();
467 genie::GHepParticle gpart(gmid, gmst, gmmo, -1, gmfd, gmld,
468 gmpx, gmpy, gmpz, gme, gmvx, gmvy, gmvz, gmvt);
469 gpart.SetRescatterCode(gmri);
471 if (polz.x() !=0 || polz.y() !=0 || polz.z() !=0) {
472 gpart.SetPolarization(polz);
474 newEvent->AddParticle(gpart);
477 genie::ProcessInfo proc_info;
478 genie::ScatteringType_t gscty = (genie::ScatteringType_t)gtruth.
fGscatter;
479 genie::InteractionType_t ginty = (genie::InteractionType_t)gtruth.
fGint;
481 proc_info.Set(gscty,ginty);
486 genie::Resonance_t gres = (genie::Resonance_t)gtruth.
fResNum;
487 gxt.SetResonance(gres);
499 genie::Kinematics gkin;
502 const double flagVal = -99999;
503 if ( gtruth.
fgX != flagVal) gkin.Setx(gtruth.
fgX,
true);
504 if ( gtruth.
fgY != flagVal) gkin.Sety(gtruth.
fgY,
true);
505 if ( gtruth.
fgT != flagVal) gkin.Sett(gtruth.
fgT,
true);
506 if ( gtruth.
fgW != flagVal) gkin.SetW(gtruth.
fgW,
true);
507 if ( gtruth.
fgQ2 != flagVal) gkin.SetQ2(gtruth.
fgQ2,
true);
508 if ( gtruth.
fgq2 != flagVal) gkin.Setq2(gtruth.
fgq2,
true);
513 gkin.SetFSLeptonP4(lep.
Px(), lep.
Py(), lep.
Pz(), lep.
E());
522 int tgtZ = gtruth.
ftgtZ;
523 int tgtA = gtruth.
ftgtA;
530 if ( tgtZ == 0 || tgtA == 0 ) { tgtZ = tgtA = 1; }
531 if ( probe_pdgc == 0 || probe_pdgc == -1 ) { probe_pdgc = 22; }
535 int target_pdgc = genie::pdg::IonPdgCode(tgtA,tgtZ);
544 int targetNucleon = nu.
HitNuc();
552 genie::InitialState ginitstate(target_pdgc,probe_pdgc);
555 genie::Target* tgtptr = ginitstate.TgtPtr();
556 tgtptr->SetHitNucPdg(targetNucleon);
557 tgtptr->SetHitQrkPdg(struckQuark);
560 if (newEvent->HitNucleonPosition() >= 0) {
561 genie::GHepParticle * hitnucleon = newEvent->HitNucleon();
562 std::unique_ptr<TLorentzVector> p4hitnucleon(hitnucleon->GetP4());
563 tgtptr->SetHitNucP4(*p4hitnucleon);
565 if ( targetNucleon != 0 ) {
567 <<
"evgb::RetrieveGHEP() no hit nucleon position " 568 <<
" but targetNucleon is " << targetNucleon
569 <<
" at " << __FILE__ <<
":" << __LINE__
570 << std::endl << std::flush;
572 TLorentzVector dummy(0.,0.,0.,0.);
573 tgtptr->SetHitNucP4(dummy);
576 if (newEvent->TargetNucleusPosition() >= 0) {
577 genie::GHepParticle *
target = newEvent->TargetNucleus();
578 std::unique_ptr<TLorentzVector> p4target(target->GetP4());
579 ginitstate.SetTgtP4(*p4target);
583 TParticlePDG* ptmp = genie::PDGLibrary::Instance()->Find(gtruth.
ftgtPDG);
584 if ( ptmp ) Erest = ptmp->Mass();
587 <<
"evgb::RetrieveGHEP() no target nucleus position " 588 <<
" but gtruth.ftgtPDG is " << gtruth.
ftgtPDG 589 <<
" at " << __FILE__ <<
":" << __LINE__
590 << std::endl << std::flush;
592 TLorentzVector dummy(0.,0.,0.,Erest);
593 ginitstate.SetTgtP4(dummy);
596 genie::GHepParticle * probe = newEvent->Probe();
598 std::unique_ptr<TLorentzVector> p4probe(probe->GetP4());
599 ginitstate.SetProbeP4(*p4probe);
603 <<
"evgb::RetrieveGHEP() no probe " 604 <<
" at " << __FILE__ <<
":" << __LINE__
605 << std::endl << std::flush;
606 TLorentzVector dummy(0.,0.,0.,0.);
607 ginitstate.SetProbeP4(dummy);
610 genie::Interaction * p_gint =
new genie::Interaction(ginitstate,proc_info);
612 p_gint->SetProcInfo(proc_info);
613 p_gint->SetKine(gkin);
614 p_gint->SetExclTag(gxt);
615 newEvent->AttachSummary(p_gint);
638 genie::flux::GFluxBlender* gblender =
639 dynamic_cast<genie::flux::GFluxBlender *
>(fdriver);
642 fdriver = gblender->GetFluxGenerator();
645 genie::flux::GNuMIFlux* gnumi =
646 dynamic_cast<genie::flux::GNuMIFlux *
>(fdriver);
651 genie::flux::GSimpleNtpFlux* gsimple =
652 dynamic_cast<genie::flux::GSimpleNtpFlux *
>(fdriver);
657 genie::flux::GDk2NuFlux* gdk2nu =
658 dynamic_cast<genie::flux::GDk2NuFlux *
>(fdriver);
663 static bool first =
true;
666 std::string dname =
typeid(*fdriver).name();
669 <<
" " << __FILE__ <<
":" << __LINE__ <<
"\n" 670 <<
" no FillMCFlux() for this flux driver: " 672 <<
" (typeid.name, use \"c++filt -t\" to demangle)" 687 const genie::flux::GNuMIFluxPassThroughInfo& numiflux =
688 gnumi->PassThroughInfo();
689 const genie::flux::GNuMIFluxPassThroughInfo* nflux = &numiflux;
690 double dk2gen = gnumi->GetDecayDist();
703 if (nflux->pcodes != 1 && nflux->units != 0) {
705 <<
"either wrong particle codes or units " 706 <<
"from flux object - beware!!";
712 flux.
frun = nflux->run;
713 flux.
fevtno = nflux->evtno;
714 flux.
fndxdz = nflux->ndxdz;
715 flux.
fndydz = nflux->ndydz;
716 flux.
fnpz = nflux->npz;
726 flux.
fnorig = nflux->norig;
728 flux.
fntype = nflux->ntype;
729 flux.
fvx = nflux->vx;
730 flux.
fvy = nflux->vy;
731 flux.
fvz = nflux->vz;
732 flux.
fpdpx = nflux->pdpx;
733 flux.
fpdpy = nflux->pdpy;
734 flux.
fpdpz = nflux->pdpz;
737 flux.
fpppz = nflux->pppz;
740 flux.
fptype = nflux->ptype;
741 flux.
fppvx = nflux->ppvx;
742 flux.
fppvy = nflux->ppvy;
743 flux.
fppvz = nflux->ppvz;
748 flux.
fnecm = nflux->necm;
753 flux.
ftvx = nflux->tvx;
754 flux.
ftvy = nflux->tvy;
755 flux.
ftvz = nflux->tvz;
756 flux.
ftpx = nflux->tpx;
757 flux.
ftpy = nflux->tpy;
758 flux.
ftpz = nflux->tpz;
760 flux.
ftgen = nflux->tgen;
762 flux.
ftgppx = nflux->tgppx;
763 flux.
ftgppy = nflux->tgppy;
764 flux.
ftgppz = nflux->tgppz;
768 flux.
fbeamx = nflux->beamx;
769 flux.
fbeamy = nflux->beamy;
770 flux.
fbeamz = nflux->beamz;
784 const genie::flux::GSimpleNtpEntry* nflux_entry =
785 gsimple->GetCurrentEntry();
786 const genie::flux::GSimpleNtpNuMI* nflux_numi =
787 gsimple->GetCurrentNuMI();
788 const genie::flux::GSimpleNtpAux* nflux_aux =
789 gsimple->GetCurrentAux();
790 const genie::flux::GSimpleNtpMeta* nflux_meta =
791 gsimple->GetCurrentMeta();
795 const genie::flux::GSimpleNtpNuMI* nflux_numi,
796 const genie::flux::GSimpleNtpAux* nflux_aux,
797 const genie::flux::GSimpleNtpMeta* nflux_meta,
807 flux.
fntype = nflux_entry->pdg;
808 flux.
fnimpwt = nflux_entry->wgt;
809 flux.
fdk2gen = nflux_entry->dist;
813 flux.
frun = nflux_numi->run;
814 flux.
fevtno = nflux_numi->evtno;
815 flux.
ftpx = nflux_numi->tpx;
816 flux.
ftpy = nflux_numi->tpy;
817 flux.
ftpz = nflux_numi->tpz;
818 flux.
ftptype = nflux_numi->tptype;
819 flux.
fvx = nflux_numi->vx;
820 flux.
fvy = nflux_numi->vy;
821 flux.
fvz = nflux_numi->vz;
823 flux.
fndecay = nflux_numi->ndecay;
826 flux.
fpdpx = nflux_numi->pdpx;
827 flux.
fpdpy = nflux_numi->pdpy;
828 flux.
fpdpz = nflux_numi->pdpz;
830 double apppz = nflux_numi->pppz;
831 if ( TMath::Abs(nflux_numi->pppz) < 1.0e-30 ) apppz = 1.0e-30;
832 flux.
fppdxdz = nflux_numi->pppx / apppz;
833 flux.
fppdydz = nflux_numi->pppy / apppz;
834 flux.
fpppz = nflux_numi->pppz;
836 flux.
fptype = nflux_numi->ptype;
843 if ( nflux_aux && nflux_meta ) {
846 const std::vector<std::string>& auxdblname = nflux_meta->auxdblname;
847 const std::vector<std::string>& auxintname = nflux_meta->auxintname;
848 const std::vector<int>& auxint = nflux_aux->auxint;
849 const std::vector<double>& auxdbl = nflux_aux->auxdbl;
851 for (
size_t id=0;
id<auxdblname.size(); ++id) {
852 if (
"muparpx" == auxdblname[
id]) flux.
fmuparpx = auxdbl[id];
853 if (
"muparpy" == auxdblname[
id]) flux.
fmuparpy = auxdbl[id];
854 if (
"muparpz" == auxdblname[
id]) flux.
fmuparpz = auxdbl[id];
855 if (
"mupare" == auxdblname[
id]) flux.
fmupare = auxdbl[id];
856 if (
"necm" == auxdblname[
id]) flux.
fnecm = auxdbl[id];
857 if (
"nimpwt" == auxdblname[
id]) flux.
fnimpwt = auxdbl[id];
858 if (
"fgXYWgt" == auxdblname[
id]) {
862 for (
size_t ii=0; ii<auxintname.size(); ++ii) {
863 if (
"tgen" == auxintname[ii]) flux.
ftgen = auxint[ii];
864 if (
"tgptype" == auxintname[ii]) flux.
ftgptype = auxint[ii];
871 static bool first =
true;
875 << __FILE__ <<
":" << __LINE__
876 <<
" one time dump of GSimple objects\n";
879 <<
"evgb::FillMCFlux() GSimpleNtpMeta:\n" 880 << *nflux_meta <<
"\n";
883 <<
"evgb::FillMCFlux() no GSimpleNtpMeta:\n";
890 <<
"GSimpleNtpFlux:\n";
891 if ( nflux_entry)
mf::LogDebug(
"GENIE2ART") << *nflux_entry <<
"\n";
892 else mf::LogDebug(
"GENIE2ART") <<
"no GSimpleNtpEntry\n";
893 if ( nflux_numi )
mf::LogDebug(
"GENIE2ART") << *nflux_numi <<
"\n";
894 else mf::LogDebug(
"GENIE2ART") <<
"no GSimpleNtpNuMI\n";
895 if ( nflux_aux )
mf::LogDebug(
"GENIE2ART") << *nflux_aux <<
"\n";
956 const bsim::Dk2Nu& dk2nu = gdk2nu->GetDk2Nu();
957 const bsim::NuChoice& nuchoice = gdk2nu->GetNuChoice();
960 flux.
fdk2gen = gdk2nu->GetDecayDist();
963 const bsim::NuChoice* nuchoice,
970 flux.
frun = dk2nu->job;
971 flux.
fevtno = dk2nu->potnum;
976 flux.
fnorig = dk2nu->decay.norig;
977 flux.
fndecay = dk2nu->decay.ndecay;
978 flux.
fntype = dk2nu->decay.ntype;
980 flux.
fptype = dk2nu->decay.ptype;
982 flux.
fvx = dk2nu->decay.vx;
983 flux.
fvy = dk2nu->decay.vy;
984 flux.
fvz = dk2nu->decay.vz;
985 flux.
fpdpx = dk2nu->decay.pdpx;
986 flux.
fpdpy = dk2nu->decay.pdpy;
987 flux.
fpdpz = dk2nu->decay.pdpz;
989 flux.
fppdxdz = dk2nu->decay.ppdxdz;
990 flux.
fppdydz = dk2nu->decay.ppdydz;
991 flux.
fpppz = dk2nu->decay.pppz;
994 flux.
fmuparpx = dk2nu->decay.muparpx;
995 flux.
fmuparpy = dk2nu->decay.muparpy;
996 flux.
fmuparpz = dk2nu->decay.muparpz;
997 flux.
fmupare = dk2nu->decay.mupare;
999 flux.
fnecm = dk2nu->decay.necm;
1000 flux.
fnimpwt = dk2nu->decay.nimpwt;
1005 flux.
fppvx = dk2nu->ppvx;
1006 flux.
fppvy = dk2nu->ppvy;
1007 flux.
fppvz = dk2nu->ppvz;
1010 flux.
ftvx = dk2nu->tgtexit.tvx;
1011 flux.
ftvy = dk2nu->tgtexit.tvy;
1012 flux.
ftvz = dk2nu->tgtexit.tvz;
1013 flux.
ftpx = dk2nu->tgtexit.tpx;
1014 flux.
ftpy = dk2nu->tgtexit.tpy;
1015 flux.
ftpz = dk2nu->tgtexit.tpz;
1016 flux.
ftptype = dk2nu->tgtexit.tptype;
1017 flux.
ftgen = dk2nu->tgtexit.tgen;
1024 flux.
fntype = nuchoice->pdgNu;
1025 flux.
fnimpwt = nuchoice->impWgt;
double E(const int i=0) const
int fGint
interaction code
Unified ntuple flux format (replaces 2)
unsigned int NumberTrajectoryPoints() const
const TVector3 & Polarization() const
const TLorentzVector & Position(const int i=0) const
const simb::MCNeutrino & GetNeutrino() const
double Py(const int i=0) const
const TLorentzVector & EndPosition() const
Full flux simulation ntuple.
void SetOrigin(simb::Origin_t origin)
neutrino electron elastic scatter
cout<< "-> Edep in the target
MaybeLogger_< ELseverityLevel::ELsev_info, false > LogInfo
genie::EventRecord * RetrieveGHEP(const simb::MCTruth &truth, const simb::GTruth >ruth, bool useFirstTrajPosition=true)
return genie::EventRecord pointer; callee takes possession
void FillMCFlux(genie::GFluxI *fdriver, simb::MCFlux &mcflux)
int fGPhaseSpace
phase space system of DiffXSec
simb::flux_code_ fFluxType
double Px(const int i=0) const
int fNumNeutron
number of neutrons after reaction, before FSI
double fXsec
cross section of interaction
Functions for transforming GENIE objects into ART objects (and back)
int fNumPiPlus
number of pi pluses after reaction, before FSI
offset to account for adding in Nuance codes to this enum
int fNumPiMinus
number of pi minuses after reaction, before FSI
void SetNeutrino(int CCNC, int mode, int interactionType, int target, int nucleon, int quark, double w, double x, double y, double qsqr)
MaybeLogger_< ELseverityLevel::ELsev_error, false > LogError
double fdk2gen
distance from decay to ray origin
void Add(simb::MCParticle &part)
object containing MC flux information
int fResNum
resonance number
int fNumProton
number of protons after reaction, before FSI
double fprobability
interaction probability
const simb::MCParticle & Lepton() const
int fGscatter
neutrino scattering code
int fNumPi0
number of pi0 after reaction, before FSI
bool fIsCharm
did the interaction produce a charmed hadron?
double fweight
event interaction weight (genie internal)
const simb::MCParticle & GetParticle(int i) const
double Vx(const int i=0) const
void FillMCTruth(const genie::EventRecord *grec, double spillTime, simb::MCTruth &mctruth)
n.b.: this group is similar but not quite, entirely unlike GENIE ScatteringType convention ...
int ftgtPDG
PDG of Target Nucleus, nucleon only if free.
double fgQ2
< these are for the internal (on shell) genie kinematics
MaybeLogger_< ELseverityLevel::ELsev_success, false > LogDebug
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
TLorentzVector fFShadSystP4
double Pz(const int i=0) const
void FillGTruth(const genie::EventRecord *grec, simb::GTruth >ruth)
Event generator information.
Event generator information.
double fDiffXsec
differential cross section of interaction
A simplified flux ntuple for quick running.
static constexpr double kUndefinedValue