|
119 | 119 | // GENIE |
120 | 120 | #include "Framework/EventGen/EventRecord.h" |
121 | 121 | #include "Framework/Ntuple/NtpMCEventRecord.h" |
| 122 | +#include "Framework/Conventions/Units.h" |
| 123 | +#include "Framework/GHEP/GHepParticle.h" |
| 124 | + |
122 | 125 | #include "nugen/EventGeneratorBase/GENIE/GENIE2ART.h" |
123 | 126 |
|
124 | 127 | #include "canvas/Persistency/Provenance/ProcessConfiguration.h" |
@@ -246,6 +249,27 @@ class CAFMaker : public art::EDProducer { |
246 | 249 | bool fSaveGENIEEventRecord; |
247 | 250 | unsigned int fGenieEventCounter; |
248 | 251 |
|
| 252 | + //TBits * fGenieEvtRec_brEvtFlags = 0; ////< Generator-specific event flags |
| 253 | + //TObjString * fGenieEvtRec_brEvtCode = 0; ////< Generator-specific string with 'event code' |
| 254 | + int fGenieEvtRec_brEvtNum = 0; ////< Event number |
| 255 | + double fGenieEvtRec_brEvtXSec = 0.0; ////< Cross section for selected event (1e-38 cm2) |
| 256 | + double fGenieEvtRec_brEvtDXSec = 0.0; ////< Cross section for selected event kinematics (1e-38 cm2 / {K^n}) |
| 257 | + unsigned int fGenieEvtRec_brEvtKPS = 0; ////< Kinematic phase space variables. See $GENIE/src/Framework/Conventions/KinePhaseSpace.h -> KinePhaseSpace_t |
| 258 | + double fGenieEvtRec_brEvtWght = 0.0; ////< Weight for that event |
| 259 | + double fGenieEvtRec_brEvtProb = 0.0; ////< Probability for that event (given cross section, path lengths, etc) |
| 260 | + double fGenieEvtRec_brEvtVtx[4] = {0.0}; ////< Event vertex position in detector coord syst (SI) |
| 261 | + int fGenieEvtRec_brStdHepN = 0; ////< Number of particles in particle array |
| 262 | + int fGenieEvtRec_brStdHepPdg [250] = {0}; ////< Pdg codes (& generator specific codes for pseudoparticles) |
| 263 | + int fGenieEvtRec_brStdHepStatus[250] = {0}; ////< Generator-specific status code |
| 264 | + int fGenieEvtRec_brStdHepRescat[250] = {0}; ////< Hadron transport model-specific rescattering code |
| 265 | + double fGenieEvtRec_brStdHepX4 [250][4] = {{0.0}}; ////< 4-x (x, y, z, t) of particle in hit nucleus frame (fm) |
| 266 | + double fGenieEvtRec_brStdHepP4 [250][4] = {{0.0}}; ////< 4-p (px,py,pz,E) of particle in LAB frame (GeV) |
| 267 | + double fGenieEvtRec_brStdHepPolz [250][3] = {{0.0}}; ////< Polarization vector |
| 268 | + int fGenieEvtRec_brStdHepFd [250] = {0}; ////< First daughter |
| 269 | + int fGenieEvtRec_brStdHepLd [250] = {0}; ////< Last daughter |
| 270 | + int fGenieEvtRec_brStdHepFm [250] = {0}; ////< First mother |
| 271 | + int fGenieEvtRec_brStdHepLm [250] = {0}; ////< Last mother |
| 272 | + |
249 | 273 | flat::Flat<caf::StandardRecord>* fFlatRecord = 0; |
250 | 274 | flat::Flat<caf::StandardRecord>* fFlatRecordb = 0; |
251 | 275 | flat::Flat<caf::StandardRecord>* fFlatRecordp = 0; |
@@ -1050,7 +1074,32 @@ void CAFMaker::InitializeOutfiles() |
1050 | 1074 |
|
1051 | 1075 | if (fSaveGENIEEventRecord){ |
1052 | 1076 | fFlatGenieTree = new TTree( "GenieEvtRecTree", "GenieEvtRecTree" ); |
1053 | | - fFlatGenieTree->Branch("GenieEvtRec", &fFlatGenieEvtRec); |
| 1077 | + //fFlatGenieTree->Branch("GenieEvtRec", &fFlatGenieEvtRec); |
| 1078 | + |
| 1079 | + // Flatten the event record. |
| 1080 | + // Follows the convention of the GENIE numi_rootracker (see $GENIE/src/Apps/gNtpConv.cxx). |
| 1081 | + //fFlatGenieTree->Branch("GenieEvtRec.EvtFlags", "TBits", fGenieEvtRec_brEvtFlags, 32000, 1); |
| 1082 | + //fFlatGenieTree->Branch("GenieEvtRec.EvtCode", "TObjString", fGenieEvtRec_brEvtCode, 32000, 1); |
| 1083 | + |
| 1084 | + fFlatGenieTree->Branch("GenieEvtRec.EvtNum", &fGenieEvtRec_brEvtNum, "GenieEvtRec.EvtNum/I" ); |
| 1085 | + fFlatGenieTree->Branch("GenieEvtRec.EvtXSec", &fGenieEvtRec_brEvtXSec, "GenieEvtRec.EvtXSec/D" ); |
| 1086 | + fFlatGenieTree->Branch("GenieEvtRec.EvtDXSec", &fGenieEvtRec_brEvtDXSec, "GenieEvtRec.EvtDXSec/D" ); |
| 1087 | + fFlatGenieTree->Branch("GenieEvtRec.EvtKPS", &fGenieEvtRec_brEvtKPS, "GenieEvtRec.EvtKPS/i" ); |
| 1088 | + fFlatGenieTree->Branch("GenieEvtRec.EvtWght", &fGenieEvtRec_brEvtWght, "GenieEvtRec.EvtWght/D" ); |
| 1089 | + fFlatGenieTree->Branch("GenieEvtRec.EvtProb", &fGenieEvtRec_brEvtProb, "GenieEvtRec.EvtProb/D" ); |
| 1090 | + fFlatGenieTree->Branch("GenieEvtRec.EvtVtx", fGenieEvtRec_brEvtVtx, "GenieEvtRec.EvtVtx[4]/D" ); |
| 1091 | + fFlatGenieTree->Branch("GenieEvtRec.StdHepN", &fGenieEvtRec_brStdHepN, "GenieEvtRec.StdHepN/I" ); |
| 1092 | + fFlatGenieTree->Branch("GenieEvtRec.StdHepPdg", fGenieEvtRec_brStdHepPdg, "GenieEvtRec.StdHepPdg[GenieEvtRec.StdHepN]/I" ); |
| 1093 | + fFlatGenieTree->Branch("GenieEvtRec.StdHepStatus", fGenieEvtRec_brStdHepStatus, "GenieEvtRec.StdHepStatus[GenieEvtRec.StdHepN]/I" ); |
| 1094 | + fFlatGenieTree->Branch("GenieEvtRec.StdHepRescat", fGenieEvtRec_brStdHepRescat, "GenieEvtRec.StdHepRescat[GenieEvtRec.StdHepN]/I" ); |
| 1095 | + fFlatGenieTree->Branch("GenieEvtRec.StdHepX4", fGenieEvtRec_brStdHepX4, "GenieEvtRec.StdHepX4[GenieEvtRec.StdHepN][4]/D" ); |
| 1096 | + fFlatGenieTree->Branch("GenieEvtRec.StdHepP4", fGenieEvtRec_brStdHepP4, "GenieEvtRec.StdHepP4[GenieEvtRec.StdHepN][4]/D" ); |
| 1097 | + fFlatGenieTree->Branch("GenieEvtRec.StdHepPolz", fGenieEvtRec_brStdHepPolz, "GenieEvtRec.StdHepPolz[GenieEvtRec.StdHepN][3]/D" ); |
| 1098 | + fFlatGenieTree->Branch("GenieEvtRec.StdHepFd", fGenieEvtRec_brStdHepFd, "GenieEvtRec.StdHepFd[GenieEvtRec.StdHepN]/I" ); |
| 1099 | + fFlatGenieTree->Branch("GenieEvtRec.StdHepLd", fGenieEvtRec_brStdHepLd, "GenieEvtRec.StdHepLd[GenieEvtRec.StdHepN]/I" ); |
| 1100 | + fFlatGenieTree->Branch("GenieEvtRec.StdHepFm", fGenieEvtRec_brStdHepFm, "GenieEvtRec.StdHepFm[GenieEvtRec.StdHepN]/I" ); |
| 1101 | + fFlatGenieTree->Branch("GenieEvtRec.StdHepLm", fGenieEvtRec_brStdHepLm, "GenieEvtRec.StdHepLm[GenieEvtRec.StdHepN]/I" ); |
| 1102 | + |
1054 | 1103 | fFlatGenieTree->Branch("GENIEEntry", &fGenieEventCounter, "GENIE/i"); |
1055 | 1104 | fFlatGenieTree->Branch("SourceFileHash", &fSourceFileHash, "SourceFileHash/i"); |
1056 | 1105 | } |
@@ -1394,7 +1443,46 @@ void CAFMaker::produce(art::Event& evt) noexcept { |
1394 | 1443 | fGenieTree->Fill(); |
1395 | 1444 | } |
1396 | 1445 | if(fFlatGenieTree){ |
1397 | | - fFlatGenieEvtRec->Fill(fGenieEventCounter, genie_rec); |
| 1446 | + //fFlatGenieEvtRec->Fill(fGenieEventCounter, genie_rec); |
| 1447 | + fGenieEvtRec_brEvtNum = fGenieEventCounter; |
| 1448 | + fGenieEvtRec_brEvtXSec = genie_rec->XSec() * (1e+38/genie::units::cm2); |
| 1449 | + fGenieEvtRec_brEvtDXSec = genie_rec->DiffXSec() * (1e+38/genie::units::cm2); |
| 1450 | + fGenieEvtRec_brEvtKPS = genie_rec->DiffXSecVars(); |
| 1451 | + fGenieEvtRec_brEvtWght = genie_rec->Weight(); |
| 1452 | + fGenieEvtRec_brEvtProb = genie_rec->Probability(); |
| 1453 | + fGenieEvtRec_brEvtVtx[0] = genie_rec->Vertex()->X(); |
| 1454 | + fGenieEvtRec_brEvtVtx[1] = genie_rec->Vertex()->Y(); |
| 1455 | + fGenieEvtRec_brEvtVtx[2] = genie_rec->Vertex()->Z(); |
| 1456 | + fGenieEvtRec_brEvtVtx[3] = genie_rec->Vertex()->T(); |
| 1457 | + |
| 1458 | + int iparticle=0; |
| 1459 | + genie::GHepParticle * p = 0; |
| 1460 | + while( genie_rec->Particle(iparticle) != 0 ) { |
| 1461 | + p = genie_rec->Particle(iparticle); |
| 1462 | + fGenieEvtRec_brStdHepPdg[iparticle] = p->Pdg(); |
| 1463 | + fGenieEvtRec_brStdHepStatus[iparticle] = (int) p->Status(); |
| 1464 | + fGenieEvtRec_brStdHepRescat[iparticle] = p->RescatterCode(); |
| 1465 | + fGenieEvtRec_brStdHepX4 [iparticle][0] = p->X4()->X(); |
| 1466 | + fGenieEvtRec_brStdHepX4 [iparticle][1] = p->X4()->Y(); |
| 1467 | + fGenieEvtRec_brStdHepX4 [iparticle][2] = p->X4()->Z(); |
| 1468 | + fGenieEvtRec_brStdHepX4 [iparticle][3] = p->X4()->T(); |
| 1469 | + fGenieEvtRec_brStdHepP4 [iparticle][0] = p->P4()->Px(); |
| 1470 | + fGenieEvtRec_brStdHepP4 [iparticle][1] = p->P4()->Py(); |
| 1471 | + fGenieEvtRec_brStdHepP4 [iparticle][2] = p->P4()->Pz(); |
| 1472 | + fGenieEvtRec_brStdHepP4 [iparticle][3] = p->P4()->E(); |
| 1473 | + if(p->PolzIsSet()) { |
| 1474 | + fGenieEvtRec_brStdHepPolz [iparticle][0] = TMath::Sin(p->PolzPolarAngle()) * TMath::Cos(p->PolzAzimuthAngle()); |
| 1475 | + fGenieEvtRec_brStdHepPolz [iparticle][1] = TMath::Sin(p->PolzPolarAngle()) * TMath::Sin(p->PolzAzimuthAngle()); |
| 1476 | + fGenieEvtRec_brStdHepPolz [iparticle][2] = TMath::Cos(p->PolzPolarAngle()); |
| 1477 | + } |
| 1478 | + fGenieEvtRec_brStdHepFd [iparticle] = p->FirstDaughter(); |
| 1479 | + fGenieEvtRec_brStdHepLd [iparticle] = p->LastDaughter(); |
| 1480 | + fGenieEvtRec_brStdHepFm [iparticle] = p->FirstMother(); |
| 1481 | + fGenieEvtRec_brStdHepLm [iparticle] = p->LastMother(); |
| 1482 | + iparticle++; |
| 1483 | + } |
| 1484 | + fGenieEvtRec_brStdHepN = iparticle; |
| 1485 | + |
1398 | 1486 | fFlatGenieTree->Fill(); |
1399 | 1487 | } |
1400 | 1488 | } |
|
0 commit comments