9#include <unordered_map>
12#include "FairPrimaryGenerator.h"
16#include "TDatabasePDG.h"
18#include "TMCProcess.h"
24#include "TVirtualMC.h"
34 : MCTrack_vec(nullptr), vetoPoints_vec(nullptr), fUseSTL(false) {
40 return Init(fileName, 0);
44 return Init(fileNames, 0);
48 const int startEvent) {
49 LOG(info) <<
"Opening input file to find keys " << fileNames.at(0);
50 TFile testFile(fileNames.at(0).c_str());
51 auto testKeys = testFile.GetListOfKeys();
52 if (testKeys ==
nullptr) {
53 LOG(fatal) <<
"Error opening the Signal file: " << fileNames.at(0);
61 if (testKeys->FindObject(
"pythia8-Geant4")) {
62 fTree =
new TChain(
"pythia8-Geant4");
63 for (
auto& f : fileNames) {
64 LOG(info) <<
"Opening input file " << f;
65 fTree->Add(f.c_str());
68 LOG(info) <<
"Reading " <<
fNevents <<
" entries";
70 fTree->SetBranchAddress(
"id", &
id);
71 fTree->SetBranchAddress(
"parentid",
73 fTree->SetBranchAddress(
"pythiaid",
76 fTree->SetBranchAddress(
"w", &
w);
78 if (
fTree->GetListOfLeaves()->GetSize() < 17) {
79 fTree->SetBranchAddress(
81 fTree->SetBranchAddress(
"y", &
vy);
82 fTree->SetBranchAddress(
"z", &
vz);
83 fTree->SetBranchAddress(
"px", &
px);
84 fTree->SetBranchAddress(
"py", &
py);
85 fTree->SetBranchAddress(
"pz", &
pz);
87 fTree->SetBranchAddress(
89 fTree->SetBranchAddress(
"oy", &
vy);
90 fTree->SetBranchAddress(
"oz", &
vz);
91 fTree->SetBranchAddress(
"opx", &
px);
92 fTree->SetBranchAddress(
"opy", &
py);
93 fTree->SetBranchAddress(
"opz", &
pz);
97 fTree =
new TChain(
"cbmsim");
98 for (
auto& f : fileNames) {
99 LOG(info) <<
"Opening input file " << f;
100 fTree->Add(f.c_str());
103 LOG(info) <<
"Reading " <<
fNevents <<
" entries";
106 TBranch* mcBranch =
fTree->GetBranch(
"MCTrack");
108 LOG(fatal) <<
"MCTrack branch not found in input file";
111 if (
fTree->GetBranch(
"PlaneHAPoint")) {
119 if (mcStatus < 0 || vetoStatus < 0) {
120 LOG(fatal) <<
"Failed to set branch addresses for STL vector format";
122 LOG(info) <<
"Using STL vector format (PlaneHAPoint)";
123 }
else if (
fTree->GetBranch(
"vetoPoint")) {
126 MCTrack =
new TClonesArray(
"ShipMCTrack");
128 auto mcStatus =
fTree->SetBranchAddress(
"MCTrack", &
MCTrack);
130 if (mcStatus < 0 || vetoStatus < 0) {
131 LOG(fatal) <<
"Failed to set branch addresses for TClonesArray format";
133 LOG(info) <<
"Using TClonesArray format (vetoPoint)";
136 <<
"Neither PlaneHAPoint nor vetoPoint branch found in input file";
144 std::vector<std::string> fileNames = {fileName};
145 return Init(fileNames, startEvent);
158 TString pName = mu->GetProcName();
159 if (strncmp(
"Hadronic inelastic", pName.Data(), 18) == 0 ||
160 strncmp(
"Positron annihilation", pName.Data(), 21) == 0 ||
161 strncmp(
"Lepton pair production", pName.Data(), 22) == 0) {
164 Int_t motherId = mu->GetMotherId();
169 ? &(*MCTrack_vec)[motherId]
171 Int_t Pcode = TMath::Abs(mother->
GetPdgCode());
172 return (Pcode == 221 || Pcode == 223 || Pcode == 333 || Pcode == 113 ||
178 auto* pdgBase = TDatabasePDG::Instance();
179 Double_t mass = 0., e = 0., tof = 0.;
180 std::unordered_map<int, int> muList;
181 std::unordered_map<int, std::vector<int>> moList;
184 auto getVetoSize = [
this]() ->
int {
187 auto getVetoPoint = [
this](
int i) ->
vetoPoint* {
188 return fUseSTL ? &(*vetoPoints_vec)[i]
192 return fUseSTL ? &(*MCTrack_vec)[i]
195 auto getMCTrackSize = [
this]() ->
int {
199 bool found_muon =
false;
205 if (
fn % 100000 == 0) {
206 LOGF(info,
"Reading event %i",
fn);
209 if (TMath::Abs(
static_cast<int>(
id)) == 13) {
210 mass = pdgBase->GetParticle(
id)->Mass();
211 e = TMath::Sqrt(
px *
px +
py *
py +
pz *
pz + mass * mass);
217 Bool_t found =
false;
218 for (
int i = 0; i < getVetoSize(); i++) {
219 auto* v = getVetoPoint(i);
220 Int_t abspid = TMath::Abs(v->PdgCode());
221 if (abspid == 13 || (!
followMuons && abspid != 12 && abspid != 14)) {
223 Int_t muIndex = v->GetTrackID();
225 muList.insert({muIndex, i});
226 }
else if (abspid == 13) {
228 moList[getMCTrack(muIndex)->GetMotherId()].push_back(i);
230 muList.insert({muIndex, i});
237 for (
auto it = moList.begin(); it != moList.end(); it++) {
238 if (gRandom->Uniform(0., 1.) > 0.99) {
239 std::vector<int> list = it->second;
240 for (
unsigned i = 0; i < list.size(); i++) {
241 auto* v = getVetoPoint(list.at(i));
242 Int_t muIndex = v->GetTrackID();
243 muList.insert({muIndex, i});
248 LOGF(
debug,
"No muon found %i",
fn - 1);
257 LOGF(info,
"End of tree reached %i",
fNevents);
263 LOGF(
debug,
"Seed: %d", theSeed);
264 gRandom->SetSeed(theSeed);
268 for (
int i = 0; i < getMCTrackSize(); i++) {
269 auto* track = getMCTrack(i);
270 Int_t abspid = TMath::Abs(track->GetPdgCode());
275 double phi_random = gRandom->Uniform(0., 2 * TMath::Pi());
276 Double_t pt = track->GetPt();
277 px = pt * TMath::Cos(phi_random);
278 py = pt * TMath::Sin(phi_random);
280 vx = track->GetStartX() + dx;
281 vy = track->GetStartY() + dy;
282 vz = track->GetStartZ();
283 tof = track->GetStartT() / 1E9;
284 e = track->GetEnergy();
285 Bool_t wanttracking =
false;
286 for (std::pair<int, int> element : muList) {
287 if (element.first == i) {
290 auto* v = getVetoPoint(element.second);
291 TVector3 lpv = v->LastPoint();
292 TVector3 lmv = v->LastMom();
296 e = TMath::Sqrt(lmv.Mag2() +
297 (track->GetMass()) * (track->GetMass()));
305 tof = v->GetTime() / 1E9;
310 cpg->AddTrack(track->GetPdgCode(),
px,
py,
pz,
vx,
vy,
vz,
311 track->GetMotherId(), wanttracking, e, tof,
312 track->GetWeight(), (TMCProcess)track->GetProcID());
318 double phi_random = gRandom->Uniform(0., 2 * TMath::Pi());
319 Double_t pt = TMath::Sqrt(
px *
px +
py *
py);
320 px = pt * TMath::Cos(phi_random);
321 py = pt * TMath::Sin(phi_random);
325 cpg->AddTrack(
static_cast<int>(
id),
px,
py,
pz,
vx * 100.,
vy * 100.,
326 vz * 100., -1.,
true, e, tof,
w);
std::pair< Double_t, Double_t > CalculateBeamOffset(Double_t smearBeam, Double_t paintBeam)
TClonesArray * vetoPoints
~MuonBackGenerator() override
Bool_t checkDiMuon(Int_t muIndex)
std::vector< vetoPoint > * vetoPoints_vec
Bool_t ReadEvent(FairPrimaryGenerator *) override
TFile * fInputFile
flag to indicate if using STL vectors
std::vector< ShipMCTrack > * MCTrack_vec
Bool_t Init(const char *, int) override