fHitLists(0),
fTmpTreeTR(0),
fTmpFileTR(0),
- fTrackReferences(0),
- fTmpTrackReferences(0)
+ fTrackReferences(),
+ fTmpTrackReferences()
{
//default constructor
fHitLists(new TList()),
fTmpTreeTR(0),
fTmpFileTR(0),
- fTrackReferences(new TClonesArray("AliTrackReference", 100)),
- fTmpTrackReferences(new TClonesArray("AliTrackReference", 100))
+ fTrackReferences("AliTrackReference", 100),
+ fTmpTrackReferences("AliTrackReference", 100)
{
//constructor
// Set transport parameters
fHitLists(0),
fTmpTreeTR(0),
fTmpFileTR(0),
- fTrackReferences(0),
- fTmpTrackReferences(0)
+ fTrackReferences(),
+ fTmpTrackReferences()
{
//
// Copy constructor for AliMC
delete fMCQA;
delete fHitLists;
// Delete track references
- if (fTrackReferences) {
- fTrackReferences->Delete();
- delete fTrackReferences;
- fTrackReferences = 0;
- }
-
-if (fTmpTrackReferences) {
- fTmpTrackReferences->Delete();
- delete fTmpTrackReferences;
- fTmpTrackReferences = 0;
- }
-
}
//_______________________________________________________________________
//
// Called at every step during transport
//
-
Int_t id = DetFromMate(gMC->CurrentMedium());
if (id < 0) return;
AddEnergyDeposit(gMC->CurrentVolID(copy),gMC->Edep());
//
// write tracke reference for track which is dissapearing - MI
- if (gMC->IsTrackDisappeared()) {
- if (gMC->Etot()>0.05) AddTrackReference(GetCurrentTrackNumber(),
+
+ if (gMC->IsTrackDisappeared() && !(gMC->IsTrackAlive())) {
+ if (gMC->Etot() > 0.05) AddTrackReference(GetCurrentTrackNumber(),
AliTrackReference::kDisappeared);
+
+
}
-
+
//Call the appropriate stepping routine;
AliModule *det = dynamic_cast<AliModule*>(gAlice->Modules()->At(id));
if(det && det->StepManagerIsEnabled()) {
// Reset all Detectors & kinematics & make/reset trees
//
- runloader->GetHeader()->Reset(gAlice->GetRunNumber(),gAlice->GetEvNumber(),
+ runloader->GetHeader()->Reset(AliCDBManager::Instance()->GetRun(),gAlice->GetEvNumber(),
gAlice->GetEventNrInRun());
// fRunLoader->WriteKinematics("OVERWRITE"); is there any reason to rewrite here since MakeTree does so
// This primary is finished, purify stack
#if ROOT_VERSION_CODE > 262152
if (!(gMC->SecondariesAreOrdered())) {
- runloader->Stack()->ReorderKine();
- RemapHits();
+ if (runloader->Stack()->ReorderKine()) RemapHits();
}
#endif
- runloader->Stack()->PurifyKine();
- RemapHits();
+ if (runloader->Stack()->PurifyKine()) RemapHits();
TIter next(gAlice->Modules());
AliModule *detector;
// This for detectors which have a special mapping mechanism
// for hits, such as TPC and TRD
//
+
TObjArray* modules = gAlice->Modules();
TIter nextmod(modules);
- AliDetector *detector;
- while((detector = dynamic_cast<AliDetector*>(nextmod()))) {
- detector->RemapTrackHitIDs(stack->TrackLabelMap());
+ AliModule *module;
+ while((module = (AliModule*) nextmod())) {
+ AliDetector* det = dynamic_cast<AliDetector*> (module);
+ if (det) det->RemapTrackHitIDs(stack->TrackLabelMap());
}
//
RemapTrackReferencesIDs(stack->TrackLabelMap());
if (!gAlice->Lego()) stack->FinishEvent();
// Synchronize the TreeTR with TreeK
- ReorderAndExpandTreeTR();
+ if (fTmpTreeTR) ReorderAndExpandTreeTR();
// Write out the event Header information
TTree* treeE = runloader->TreeE();
}
//_______________________________________________________________________
-TObjArray* AliMC::Particles() const {
+const TObjArray* AliMC::Particles() const {
//
// Returns pointer to Particles array
//
{
//
// add a trackrefernce to the list
- if (!fTrackReferences) {
- AliError("Container trackrefernce not active");
- return NULL;
- }
Int_t primary = GetPrimary(label);
Particle(primary)->SetBit(kKeepBit);
- Int_t nref = fTmpTrackReferences->GetEntriesFast();
- TClonesArray &lref = *fTmpTrackReferences;
- return new(lref[nref]) AliTrackReference(label, id);
+ Int_t nref = fTmpTrackReferences.GetEntriesFast();
+ return new(fTmpTrackReferences[nref]) AliTrackReference(label, id);
}
//
// Reset all references
//
- if (fTmpTrackReferences) fTmpTrackReferences->Clear();
+ fTmpTrackReferences.Clear();
}
void AliMC::RemapTrackReferencesIDs(Int_t *map)
// Remapping track reference
// Called at finish primary
//
- if (!fTmpTrackReferences) return;
- Int_t nEntries = fTmpTrackReferences->GetEntries();
+
+ Int_t nEntries = fTmpTrackReferences.GetEntries();
for (Int_t i=0; i < nEntries; i++){
- AliTrackReference * ref = dynamic_cast<AliTrackReference*>(fTmpTrackReferences->UncheckedAt(i));
+ AliTrackReference * ref = dynamic_cast<AliTrackReference*>(fTmpTrackReferences.UncheckedAt(i));
if (ref) {
Int_t newID = map[ref->GetTrack()];
if (newID>=0) ref->SetTrack(newID);
else {
ref->SetBit(kNotDeleted,kFALSE);
- fTmpTrackReferences->RemoveAt(i);
+ fTmpTrackReferences.RemoveAt(i);
}
} // if ref
}
- fTmpTrackReferences->Compress();
+ fTmpTrackReferences.Compress();
}
void AliMC::FixParticleDecaytime()
// Make the temporary track reference tree
fTmpFileTR = new TFile("TrackRefsTmp.root", "recreate");
fTmpTreeTR = new TTree("TreeTR", "Track References");
- if (!fTmpTrackReferences) fTmpTrackReferences = new TClonesArray("AliTrackReference", 100);
- fTmpTreeTR->Branch("TrackReferences", "TClonesArray", &fTmpTrackReferences, 4000);
+ TClonesArray* pRef = &fTmpTrackReferences;
+ fTmpTreeTR->Branch("TrackReferences", "TClonesArray", &pRef, 4000);
}
void AliMC::ReorderAndExpandTreeTR()
TTree * treeTR = rl->TreeTR();
if (treeTR){
// make branch for central track references
- if (!fTrackReferences) fTrackReferences = new TClonesArray("AliTrackReference",0);
TBranch *branch;
- branch = treeTR->Branch("TrackReferences",&fTrackReferences);
- branch->SetAddress(&fTrackReferences);
+ TClonesArray* pRef = &fTrackReferences;
+ branch = treeTR->Branch("TrackReferences", &pRef);
+ branch->SetAddress(&pRef);
}
AliStack* stack = rl->Stack();
Int_t it = 0;
for (Int_t ip = np - 1; ip > -1; ip--) {
TParticle *part = stack->Particle(ip);
-// printf("Particle %5d %5d %5d %5d %5d \n", ip, part->GetPdgCode(), part->GetFirstMother(), part->GetFirstDaughter(), part->GetLastDaughter());
+ //printf("Particle %5d %5d %5d %5d %5d \n", ip, part->GetPdgCode(), part->GetFirstMother(), part->GetFirstDaughter(), part->GetLastDaughter());
// Skip primaries that have not been transported
Int_t dau1 = part->GetFirstDaughter();
Int_t dau2 = -1;
- // if ((dau1 > -1 && dau1 < np) || part->GetStatusCode() > 1) continue;
if (!part->TestBit(kTransportBit)) continue;
//
fTmpTreeTR->GetEntry(it++);
- Int_t nh = fTmpTrackReferences->GetEntries();
+ Int_t nh = fTmpTrackReferences.GetEntries();
// Determine range of secondaries produced by this primary
if (dau1 > -1) {
Int_t inext = ip - 1;
if (inext >= 0) {
part = stack->Particle(inext);
dau2 = part->GetFirstDaughter();
- if (dau2 == -1 || dau2 < np) {
+ if (!(part->TestBit(kTransportBit)) || dau2 == -1 || dau2 < np) {
+// if (dau2 == -1 || dau2 < np) {
dau2 = -1;
} else {
dau2--;
} // find upper bound
} // dau2 < 0
// printf("Check (1) %5d %5d %5d %5d %5d \n", ip, np, it, dau1, dau2);
-
//
// Loop over reference hits and find secondary label
for (Int_t id = dau1; (id <= dau2) && (dau1 > -1); id++) {
for (Int_t ih = 0; ih < nh; ih++) {
- AliTrackReference* tr = (AliTrackReference*) fTmpTrackReferences->At(ih);
+ AliTrackReference* tr = (AliTrackReference*) fTmpTrackReferences.At(ih);
Int_t label = tr->Label();
// Skip primaries
if (label == ip) continue;
AliWarning(Form("Track Reference Label out of range !: %5d %5d %5d \n", label, dau1, dau2));
if (label == id) {
// secondary found
- Int_t nref = fTrackReferences->GetEntriesFast();
- TClonesArray &lref = *fTrackReferences;
- new(lref[nref]) AliTrackReference(*tr);
+ Int_t nref = fTrackReferences.GetEntriesFast();
+ new(fTrackReferences[nref]) AliTrackReference(*tr);
}
} // hits
treeTR->Fill();
- fTrackReferences->Clear();
+ fTrackReferences.Clear();
ifills++;
} // daughters
} // tracks
{
// Skip particles that have not been transported
fTmpTreeTR->GetEntry(it--);
- Int_t nh = fTmpTrackReferences->GetEntries();
+ Int_t nh = fTmpTrackReferences.GetEntries();
//
// Loop over reference hits and find primary labels
for (Int_t ih = 0; ih < nh; ih++) {
- AliTrackReference* tr = (AliTrackReference*) fTmpTrackReferences->At(ih);
+ AliTrackReference* tr = (AliTrackReference*) fTmpTrackReferences.At(ih);
Int_t label = tr->Label();
if (label == ip) {
- Int_t nref = fTrackReferences->GetEntriesFast();
- TClonesArray &lref = *fTrackReferences;
- new(lref[nref]) AliTrackReference(*tr);
+ Int_t nref = fTrackReferences.GetEntriesFast();
+ new(fTrackReferences[nref]) AliTrackReference(*tr);
}
}
}
treeTR->Fill();
- fTrackReferences->Clear();
+ fTrackReferences.Clear();
ifills++;
} // tracks
// Check
delete fTmpTreeTR;
fTmpFileTR->Close();
delete fTmpFileTR;
- delete fTmpTrackReferences;
- fTmpTrackReferences = 0;
+ fTmpTrackReferences.Clear();
gSystem->Exec("rm -rf TrackRefsTmp.root");
}