31 TMCManagerStack::TMCManagerStack()
32 : TVirtualMCStack(), fCurrentTrackId(-1), fUserStack(nullptr), fTotalNPrimaries(nullptr), fTotalNTracks(nullptr),
33 fParticles(nullptr), fParticlesStatus(nullptr), fBranchArrayContainer(nullptr)
42 void TMCManagerStack::PushTrack(Int_t toBeDone, Int_t parent, Int_t pdg, Double_t px, Double_t py, Double_t pz,
43 Double_t e, Double_t vx, Double_t vy, Double_t vz, Double_t tof, Double_t polx,
44 Double_t poly, Double_t polz, TMCProcess mech, Int_t &ntr, Double_t weight, Int_t is)
47 fUserStack->PushTrack(toBeDone, parent, pdg, px, py, pz, e, vx, vy, vz, tof, polx, poly, polz, mech, ntr, weight,
56 TParticle *TMCManagerStack::PopNextTrack(Int_t &itrack)
59 if (fPrimariesStack.empty() && fSecondariesStack.empty()) {
64 std::stack<Int_t> *mcStack = &fPrimariesStack;
66 if (fPrimariesStack.empty()) {
67 mcStack = &fSecondariesStack;
69 itrack = mcStack->top();
71 return fParticles->operator[](itrack);
79 TParticle *TMCManagerStack::PopPrimaryForTracking(Int_t i)
82 return PopPrimaryForTracking(i, itrack);
91 TParticle *TMCManagerStack::PopPrimaryForTracking(Int_t i, Int_t &itrack)
95 Warning(
"PopPrimaryForTracking",
"Lookup index %i is ignored.", i);
96 if (fPrimariesStack.empty()) {
100 itrack = fPrimariesStack.top();
101 fPrimariesStack.pop();
102 return fParticles->operator[](itrack);
110 Int_t TMCManagerStack::GetNtrack()
const
112 return *fTotalNTracks;
120 Int_t TMCManagerStack::GetStackedNtrack()
const
122 return fPrimariesStack.size() + fSecondariesStack.size();
130 Int_t TMCManagerStack::GetNprimary()
const
132 return *fTotalNPrimaries;
140 Int_t TMCManagerStack::GetStackedNprimary()
const
142 return fPrimariesStack.size();
150 TParticle *TMCManagerStack::GetCurrentTrack()
const
152 if (fCurrentTrackId < 0) {
153 Fatal(
"GetCurrentTrack",
"There is no current track set");
157 return fParticles->operator[](fCurrentTrackId);
165 Int_t TMCManagerStack::GetCurrentTrackNumber()
const
167 return fCurrentTrackId;
175 Int_t TMCManagerStack::GetCurrentParentTrackNumber()
const
177 return fParticlesStatus->operator[](fCurrentTrackId)->fParentId;
186 void TMCManagerStack::SetCurrentTrack(Int_t trackId)
188 if (!HasTrackId(trackId)) {
189 Fatal(
"SetCurrentTrack",
"Invalid track ID %i", trackId);
191 fCurrentTrackId = trackId;
192 fUserStack->SetCurrentTrack(trackId);
200 const TMCParticleStatus *TMCManagerStack::GetParticleStatus(Int_t trackId)
const
202 if (!HasTrackId(trackId)) {
203 Fatal(
"GetParticleStatus",
"Invalid track ID %i", trackId);
205 return fParticlesStatus->operator[](trackId).
get();
213 const TGeoBranchArray *TMCManagerStack::GetGeoState(Int_t trackId)
const
215 if (!HasTrackId(trackId)) {
216 Fatal(
"GetParticleStatus",
"Invalid track ID %i", trackId);
218 return fBranchArrayContainer->GetGeoState(fParticlesStatus->operator[](trackId)->fGeoStateIndex);
226 const TGeoBranchArray *TMCManagerStack::GetCurrentGeoState()
const
228 return fBranchArrayContainer->GetGeoState(fParticlesStatus->operator[](fCurrentTrackId)->fGeoStateIndex);
236 Bool_t TMCManagerStack::HasTrackId(Int_t trackId)
const
238 if (trackId >= 0 && trackId < static_cast<Int_t>(fParticles->size()) && fParticles->operator[](trackId)) {
249 void TMCManagerStack::SetUserStack(TVirtualMCStack *stack)
259 void TMCManagerStack::ConnectTrackContainers(std::vector<TParticle *> *particles,
260 std::vector<std::unique_ptr<TMCParticleStatus>> *tracksStatus,
261 TGeoMCBranchArrayContainer *branchArrayContainer, Int_t *totalNPrimaries,
264 fParticles = particles;
265 fParticlesStatus = tracksStatus;
266 fBranchArrayContainer = branchArrayContainer;
267 fTotalNPrimaries = totalNPrimaries;
268 fTotalNTracks = totalNTracks;
276 void TMCManagerStack::PushPrimaryTrackId(Int_t trackId)
278 fPrimariesStack.push(trackId);
286 void TMCManagerStack::PushSecondaryTrackId(Int_t trackId)
288 fSecondariesStack.push(trackId);
296 void TMCManagerStack::ResetInternals()
299 fCurrentTrackId = -1;
300 while (!fPrimariesStack.empty()) {
301 fPrimariesStack.pop();
303 while (!fSecondariesStack.empty()) {
304 fSecondariesStack.pop();