File indexing completed on 2025-04-20 09:15:56
0001
0002 #include "edm4eic/ReconstructedParticleCollection.h"
0003 #include "edm4hep/MCParticleCollection.h"
0004 #include "edm4hep/utils/vector_utils.h"
0005 #include "edm4hep/utils/kinematics.h"
0006 #include "edm4eic/ClusterCollection.h"
0007 #include "edm4eic/MCRecoParticleAssociationCollection.h"
0008 #include "podio/Frame.h"
0009 #include "podio/ROOTFrameReader.h"
0010
0011
0012 #include "TTree.h"
0013 #include "TFile.h"
0014 #include "TString.h"
0015 #include "TVector3.h"
0016 #include "TLorentzVector.h"
0017
0018
0019 #include "InclusiveSkim.h"
0020 #include "ElectronID.cc"
0021
0022 void InclusiveSkim() {
0023
0024 double Ee = 10.;
0025 double Eh = 100.;
0026
0027 vector<std::string> inFiles = {"pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_1.0001.eicrecon.tree.edm4eic.root"};
0028
0029 auto reader = podio::ROOTFrameReader();
0030 reader.openFiles(inFiles);
0031
0032 ElectronID* eFinder = new ElectronID(Ee, Eh);
0033
0034 TString outFileName = Form("inclusive_skim_%.0fx%.0fGeV.root", Ee, Eh);
0035 CreateOutputTree(outFileName);
0036
0037
0038 for(size_t ev = 0; ev < reader.getEntries("events"); ev++) {
0039
0040 if(ev%1000==0) cout << "Event " << ev << "/" << reader.getEntries("events") << endl;
0041
0042 ResetVariables();
0043
0044 const auto event = podio::Frame(reader.readNextEntry("events"));
0045 eFinder->SetEvent(&event);
0046
0047 edm4hep::MCParticleCollection e_mc = eFinder->GetMCElectron();
0048
0049
0050 if(e_mc.size() == 0) continue;
0051
0052
0053 auto e_candidates = eFinder->FindScatteredElectron();
0054 edm4eic::ReconstructedParticle e_rec;
0055
0056
0057 if(e_candidates.size() > 0) {
0058 positive_eID = 1;
0059 e_rec = eFinder->SelectHighestPT(e_candidates);
0060 }
0061
0062
0063 mc_p = edm4hep::utils::magnitude(e_mc[0].getMomentum());
0064 mc_eta = edm4hep::utils::eta(e_mc[0].getMomentum());
0065 mc_phi = edm4hep::utils::angleAzimuthal(e_mc[0].getMomentum());
0066
0067
0068 TLorentzVector kprime;
0069 kprime.SetXYZM(e_mc[0].getMomentum().x, e_mc[0].getMomentum().y, e_mc[0].getMomentum().z, Me);
0070 CalculateElectronKinematics(Ee, Eh, kprime, mc_xB, mc_Q2, mc_W, mc_y, mc_nu);
0071
0072
0073
0074 if(positive_eID) {
0075 track_p = edm4hep::utils::magnitude(e_rec.getMomentum());
0076 track_eta = edm4hep::utils::eta(e_rec.getMomentum());
0077 track_phi = edm4hep::utils::angleAzimuthal(e_rec.getMomentum());
0078
0079 kprime.SetXYZM(e_rec.getMomentum().x, e_rec.getMomentum().y, e_rec.getMomentum().z, Me);
0080 CalculateElectronKinematics(Ee, Eh, kprime, e_track_xB, e_track_Q2, e_track_W, e_track_y, e_track_nu);
0081
0082
0083 TVector3 e3v = kprime.Vect();
0084 double track_clust_E = eFinder->GetCalorimeterEnergy(e_rec);
0085 e3v.SetMag(track_clust_E);
0086 kprime.SetVectM(e3v, Me);
0087 CalculateElectronKinematics(Ee, Eh, kprime, e_clust_xB, e_clust_Q2, e_clust_W, e_clust_y, e_clust_nu);
0088 }
0089
0090
0091 outTree->Fill();
0092
0093 }
0094
0095 outFile->cd();
0096 outTree->Write(outTree->GetName(), 2);
0097
0098 }
0099
0100
0101 void CreateOutputTree(TString outFileName) {
0102
0103 outFile = new TFile(outFileName, "RECREATE");
0104 outTree = new TTree("T", "Reconstructed and generated information from EICRecon");
0105
0106 outTree->Branch("positive_eID", &positive_eID);
0107
0108 outTree->Branch("mc_p", &mc_p);
0109 outTree->Branch("mc_eta", &mc_eta);
0110 outTree->Branch("mc_phi", &mc_phi);
0111
0112 outTree->Branch("track_p", &track_p);
0113 outTree->Branch("track_eta", &track_eta);
0114 outTree->Branch("track_phi", &track_phi);
0115
0116 outTree->Branch("mc_xB", &mc_xB);
0117 outTree->Branch("mc_Q2", &mc_Q2);
0118 outTree->Branch("mc_W", &mc_W);
0119 outTree->Branch("mc_y", &mc_y);
0120 outTree->Branch("mc_nu", &mc_nu);
0121
0122 outTree->Branch("e_track_xB", &e_track_xB);
0123 outTree->Branch("e_track_Q2", &e_track_Q2);
0124 outTree->Branch("e_track_W", &e_track_W);
0125 outTree->Branch("e_track_y", &e_track_y);
0126 outTree->Branch("e_track_nu", &e_track_nu);
0127
0128 outTree->Branch("e_clust_xB", &e_clust_xB);
0129 outTree->Branch("e_clust_Q2", &e_clust_Q2);
0130 outTree->Branch("e_clust_W", &e_clust_W);
0131 outTree->Branch("e_clust_y", &e_clust_y);
0132 outTree->Branch("e_clust_nu", &e_clust_nu);
0133
0134 }
0135
0136 void ResetVariables() {
0137
0138 positive_eID = 0;
0139
0140 mc_p = -999;
0141 mc_eta = -999;
0142 mc_phi = -999;
0143
0144 track_p = -999;
0145 track_eta = -999;
0146 track_phi = -999;
0147
0148 mc_xB = -999;
0149 mc_Q2 = -999;
0150 mc_W = -999;
0151 mc_y = -999;
0152 mc_nu = -999;
0153
0154 e_track_xB = -999;
0155 e_track_Q2 = -999;
0156 e_track_W = -999;
0157 e_track_y = -999;
0158 e_track_nu = -999;
0159
0160 e_clust_xB = -999;
0161 e_clust_Q2 = -999;
0162 e_clust_W = -999;
0163 e_clust_y = -999;
0164 e_clust_nu = -999;
0165
0166
0167 }
0168
0169 void CalculateElectronKinematics(double fEe, double fEh, TLorentzVector kf, float& xB, float& Q2, float& W, float& y, float& nu) {
0170
0171 TLorentzVector ki; ki.SetXYZM(0., 0., -fEe, Me);
0172 TLorentzVector P = GetHadronBeam(fEh);
0173 TLorentzVector q = ki - kf;
0174 Q2 = -(q.Dot(q));
0175 nu = (q.Dot(P))/Mp;
0176 xB = Q2/(2.*Mp*nu);
0177 y = (q.Dot(P))/(ki.Dot(P));
0178 W = sqrt(Mp*Mp + (2.*Mp*nu) - Q2);
0179 }
0180
0181
0182 TLorentzVector GetHadronBeam(double fEh) {
0183
0184 TLorentzVector hadron_beam;
0185 hadron_beam.SetX(fEh*sin(crossing_angle));
0186 hadron_beam.SetY(0.);
0187 hadron_beam.SetZ(fEh*cos(crossing_angle));
0188 hadron_beam.SetE(std::hypot(fEh, Mp));
0189 return hadron_beam;
0190
0191 }