177 {
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;
182
183
184 auto getVetoSize = [this]() -> int {
186 };
187 auto getVetoPoint = [
this](
int i) ->
vetoPoint* {
188 return fUseSTL ? &(*vetoPoints_vec)[
i]
190 };
194 };
195 auto getMCTrackSize = [this]() -> int {
197 };
198
199 bool found_muon = false;
202 muList.clear();
203 moList.clear();
205 if (
fn % 100000 == 0) {
206 LOGF(info,
"Reading event %i",
fn);
207 }
208
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);
212 tof = 0;
213 found_muon = true;
214 break;
215 }
216 if (id == -1) {
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)) {
222 found = true;
223 Int_t muIndex =
v->GetTrackID();
225 muList.insert({muIndex,
i});
226 } else if (abspid == 13) {
228 moList[getMCTrack(muIndex)->GetMotherId()].push_back(i);
229 } else {
230 muList.insert({muIndex,
i});
231 }
232 }
233 }
234 }
235
236
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});
244 }
245 }
246 }
247 if (!found) {
248 LOGF(
debug,
"No muon found %i",
fn - 1);
249 }
250 if (found) {
251 found_muon = true;
252 break;
253 }
254 }
255 }
257 LOGF(info,
"End of tree reached %i",
fNevents);
259 return kTRUE;
260 }
263 LOGF(
debug,
"Seed: %d", theSeed);
264 gRandom->SetSeed(theSeed);
265 }
267 if (id == -1) {
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);
279 }
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) {
288 wanttracking = true;
290 auto*
v = getVetoPoint(element.second);
291 TVector3 lpv =
v->LastPoint();
292 TVector3 lmv =
v->LastMom();
293 if (abspid == 22) {
294 e = lmv.Mag();
295 } else {
296 e = TMath::Sqrt(lmv.Mag2() +
297 (track->GetMass()) * (track->GetMass()));
298 }
305 tof =
v->GetTime() / 1E9;
306 }
307 break;
308 }
309 }
310 cpg->AddTrack(track->GetPdgCode(),
px,
py,
pz,
vx,
vy,
vz,
311 track->GetMotherId(), wanttracking, e, tof,
312 track->GetWeight(), (TMCProcess)track->GetProcID());
313 }
314 } else {
318 double phi_random = gRandom->Uniform(0., 2 * TMath::Pi());
320 px =
pt * TMath::Cos(phi_random);
321 py =
pt * TMath::Sin(phi_random);
322 }
325 cpg->AddTrack(
static_cast<int>(
id),
px,
py,
pz,
vx * 100.,
vy * 100.,
326 vz * 100., -1.,
true, e, tof,
w);
327 }
328 return kTRUE;
329}
std::pair< Double_t, Double_t > CalculateBeamOffset(Double_t smearBeam, Double_t paintBeam)
Bool_t checkDiMuon(Int_t muIndex)
def mass(str|None particle)