From 6dbd105b2ceb2a90dd19b3ccd0e1b2f33eaf3c1f Mon Sep 17 00:00:00 2001 From: Jochen Klein Date: Tue, 3 Dec 2013 08:43:21 +0100 Subject: [PATCH] fixes for GTU simulation - writing tracks to TClonesArray instead of ownership by list - clean up storage of tracks - add error messages to AliTRDtrackGTU --- TRD/AliTRDgtuSim.cxx | 46 +++++++++++++++++++----------------------- TRD/AliTRDgtuTMU.cxx | 38 ++++++++++++++++++++++++---------- TRD/AliTRDgtuTMU.h | 4 +++- TRD/AliTRDtrackGTU.cxx | 18 +++++++++++++---- 4 files changed, 65 insertions(+), 41 deletions(-) diff --git a/TRD/AliTRDgtuSim.cxx b/TRD/AliTRDgtuSim.cxx index 1d941f46c45..107cc857da0 100644 --- a/TRD/AliTRDgtuSim.cxx +++ b/TRD/AliTRDgtuSim.cxx @@ -55,7 +55,7 @@ AliTRDgtuSim::AliTRDgtuSim(AliRunLoader *rl) : TObject(), fRunLoader(rl), fFeeParam(AliTRDfeeParam::Instance()), - fTMU(0x0), + fTMU(new AliTRDgtuTMU()), fTrackletArray(0x0) { @@ -68,6 +68,7 @@ AliTRDgtuSim::~AliTRDgtuSim() if (fTrackletArray) fTrackletArray->Clear(); delete fTrackletArray; + delete fTMU; } Bool_t AliTRDgtuSim::RunGTUFromTrackletFile(TString filename, Int_t event, Int_t noev) @@ -90,7 +91,8 @@ Bool_t AliTRDgtuSim::RunGTUFromTrackletFile(TString filename, Int_t event, Int_t Int_t iEvent = -1; Int_t evcnt = -1; - fTMU = 0x0; + fTMU->Reset(); + Bool_t pendingTracklets = kFALSE;; TClonesArray trklArray("AliTRDtrackletWord", 100); TClonesArray trklArrayGTU("AliTRDtrackletGTU", 100); @@ -119,7 +121,7 @@ Bool_t AliTRDgtuSim::RunGTUFromTrackletFile(TString filename, Int_t event, Int_t if ((iEvent != iEventPrev) || (iStack != iStackPrev) || (iSec != iSecPrev)) { - if(fTMU) { + if(pendingTracklets) { TList *listOfTracks = new TList(); fTMU->SetStack(iStackPrev); fTMU->SetSector(iSecPrev); @@ -128,12 +130,10 @@ Bool_t AliTRDgtuSim::RunGTUFromTrackletFile(TString filename, Int_t event, Int_t WriteTracksToDataFile(listOfTracks, iEventPrev); if (listOfTracks->GetEntries() > 0) AliDebug(2,Form(" %4.1f GeV/c", ((AliTRDtrackGTU*) listOfTracks->At(0))->GetPt() )); - delete fTMU; - fTMU = new AliTRDgtuTMU(); + fTMU->Reset(); delete listOfTracks; - listOfTracks = 0x0; } else { - fTMU = new AliTRDgtuTMU(); + pendingTracklets = kTRUE; } iStackPrev = iStack; iSecPrev = iSec; @@ -158,15 +158,14 @@ Bool_t AliTRDgtuSim::RunGTUFromTrackletFile(TString filename, Int_t event, Int_t delete tokens; } - if (fTMU && evcnt < noev) { + if (pendingTracklets && evcnt < noev) { TList *listOfTracks = new TList(); fTMU->SetStack(iStackPrev); fTMU->SetSector(iSecPrev); fTMU->RunTMU(listOfTracks); WriteTracksToDataFile(listOfTracks, iEventPrev); - delete fTMU; delete listOfTracks; - fTMU = 0x0; + fTMU->Reset(); } AliInfo(Form("Analyzed %i events", evcnt)); @@ -202,31 +201,28 @@ Bool_t AliTRDgtuSim::RunGTU(AliLoader *loader, AliESDEvent *esd, Int_t label, In Int_t iStack = -1; Int_t iLink = -1; - if (fTMU) { - delete fTMU; - fTMU = 0x0; - } - + fTMU->Reset(); + Bool_t pendingTracklets = kFALSE; TList *listOfTracks = new TList(); TIter next(fTrackletArray); - while (AliTRDtrackletGTU *trkl = (AliTRDtrackletGTU*) next()) { iSec = trkl->GetDetector() / 30; iStack = (trkl->GetDetector() % 30) / 6; iLink = trkl->GetHCId() % 12; if (iStack != iStackPrev || iSec != iSecPrev) { - if(fTMU) { + if(pendingTracklets) { fTMU->SetStack(iStackPrev); fTMU->SetSector(iSecPrev); fTMU->RunTMU(listOfTracks, 0x0, outLabel); - WriteTracksToLoader(listOfTracks); + if (loader) + WriteTracksToLoader(listOfTracks); WriteTracksToESD(listOfTracks, esd); + listOfTracks->Clear(); fTMU->Reset(); - listOfTracks->Delete(); } else { - fTMU = new AliTRDgtuTMU(); + pendingTracklets = kTRUE; } iStackPrev = iStack; iSecPrev = iSec; @@ -239,15 +235,15 @@ Bool_t AliTRDgtuSim::RunGTU(AliLoader *loader, AliESDEvent *esd, Int_t label, In } } - if (fTMU) { + if (pendingTracklets) { fTMU->SetStack(iStackPrev); fTMU->SetSector(iSecPrev); fTMU->RunTMU(listOfTracks, 0x0, outLabel); - WriteTracksToLoader(listOfTracks); + if (loader) + WriteTracksToLoader(listOfTracks); WriteTracksToESD(listOfTracks, esd); - delete fTMU; - fTMU = 0x0; - listOfTracks->Delete(); + listOfTracks->Clear(); + fTMU->Reset(); } delete listOfTracks; diff --git a/TRD/AliTRDgtuTMU.cxx b/TRD/AliTRDgtuTMU.cxx index 7755e9a2897..abb69af89dc 100644 --- a/TRD/AliTRDgtuTMU.cxx +++ b/TRD/AliTRDgtuTMU.cxx @@ -46,6 +46,7 @@ AliTRDgtuTMU::AliTRDgtuTMU(Int_t stack, Int_t sector) : fTracklets(0x0), fTrackletsPostInput(0x0), fZChannelTracklets(0x0), + fTrackArray(new TClonesArray("AliTRDtrackGTU", 50)), fTracks(0x0), fGtuParam(0x0), fStack(-1), @@ -88,6 +89,8 @@ AliTRDgtuTMU::~AliTRDgtuTMU() delete [] fTracks[zch]; } delete [] fTracks; + delete fTrackArray; + for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++) { delete [] fZChannelTracklets[layer]; delete fTrackletsPostInput[layer]; @@ -137,6 +140,8 @@ Bool_t AliTRDgtuTMU::Reset() } } + fTrackArray->Delete(); + // delete all added tracklets for (Int_t iLink = 0; iLink < fGtuParam->GetNLinks(); iLink++) { fTracklets[iLink]->Clear(); @@ -527,7 +532,7 @@ Bool_t AliTRDgtuTMU::RunTrackFinder(Int_t zch, TList* /* ListOfTracks */) if (nHits >= 4) { // ----- track registration ----- - AliTRDtrackGTU *track = new AliTRDtrackGTU(); + AliTRDtrackGTU *track = new ((*fTrackArray)[fTrackArray->GetEntriesFast()]) AliTRDtrackGTU(); track->SetSector(fSector); track->SetStack(fStack); for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++ ) { @@ -551,8 +556,6 @@ Bool_t AliTRDgtuTMU::RunTrackFinder(Int_t zch, TList* /* ListOfTracks */) track->SetRefLayerIdx(refLayerIdx); fTracks[zch][refLayerIdx].Add(track); } - else - delete track; } if ( (nUnc != 0) && (nUnc + nHits >= 4) ) // could this position of the reference layer give some track //??? special check in case of hit? @@ -901,7 +904,25 @@ Bool_t AliTRDgtuTMU::RunTrackMerging(TList* ListOfTracks) TIter next(tracksZUniqueStage0); while (AliTRDtrackGTU *trk = (AliTRDtrackGTU*) next()) { - tracksZSplitted[(trk->GetZChannel() + 3 * (trk->GetZSubChannel() - 1)) % 2]->Add(trk); + if ((trk->GetZChannel() < 0) || + (trk->GetZChannel() > 2) || + (trk->GetZSubChannel() < 0) || + (trk->GetZSubChannel() > 6)) { + AliError(Form("track with invalid z-channel information at %p: zch = %i, subchannel = %i", + trk, trk->GetZChannel(), trk->GetZSubChannel())); + trk->Dump(); + } + Int_t idx = (trk->GetZChannel() + 3 * (trk->GetZSubChannel() - 1)) % 2; + if ((idx < 0) || (idx > 1)) { + AliError(Form("invalid index %i null", idx)); + trk->Dump(); + continue; + } + if (!tracksZSplitted[idx]) { + AliError(Form("array pointer %i null", idx)); + continue; + } + tracksZSplitted[idx]->Add(trk); } for (Int_t i = 0; i < 2; i++) { @@ -1154,10 +1175,7 @@ Bool_t AliTRDgtuTMU::Uniquifier(const TList *inlist, TList *outlist) AliTRDtrackGTU *trkStage1 = 0x0; do { - if (trkStage0 != trkStage1) - delete trkStage0; - - trkStage0 = (AliTRDtrackGTU*) next(); + trkStage0 = (AliTRDtrackGTU*) next(); Bool_t tracksEqual = kFALSE; if (trkStage0 != 0 && trkStage1 != 0) { @@ -1170,10 +1188,8 @@ Bool_t AliTRDgtuTMU::Uniquifier(const TList *inlist, TList *outlist) } if (tracksEqual) { - if (trkStage0->GetNTracklets() >= trkStage1->GetNTracklets()) { - delete trkStage1; + if (trkStage0->GetNTracklets() >= trkStage1->GetNTracklets()) trkStage1 = trkStage0; - } } else { if (trkStage1 != 0x0) diff --git a/TRD/AliTRDgtuTMU.h b/TRD/AliTRDgtuTMU.h index ac87bb8e180..9875eb67ec5 100644 --- a/TRD/AliTRDgtuTMU.h +++ b/TRD/AliTRDgtuTMU.h @@ -12,12 +12,13 @@ //-------------------------------------------------------------------- #include "TObject.h" -#include "TList.h" #include "AliTRDtrackletGTU.h" #include "AliTRDgtuParam.h" class TTree; +class TList; +class TClonesArray; class TBranch; class AliTRDtrackGTU; class AliESDEvent; @@ -51,6 +52,7 @@ protected: TObjArray **fTrackletsPostInput; // holding all tracklets of a layer // after sorting/calculation in input units TList **fZChannelTracklets; // holding all tracklets for layer and z-channel + TClonesArray *fTrackArray; // array of tracks TList **fTracks; // lists of tracks AliTRDgtuParam *fGtuParam; // pointer to the instance of the GtuParam class diff --git a/TRD/AliTRDtrackGTU.cxx b/TRD/AliTRDtrackGTU.cxx index 3384c5364a7..985b0c5a470 100644 --- a/TRD/AliTRDtrackGTU.cxx +++ b/TRD/AliTRDtrackGTU.cxx @@ -200,10 +200,20 @@ Int_t AliTRDtrackGTU::GetZSubChannel() // returns the z-subchannel if (fZSubChannel < 0) { - for (Int_t layer = 0; layer < AliTRDgtuParam::GetNLayers(); layer++) - { - if (IsTrackletInLayer(layer)) - fZSubChannel = ((AliTRDtrackletGTU*) (*fTracklets)[layer])->GetSubChannel(GetZChannel()); + for (Int_t layer = 0; layer < AliTRDgtuParam::GetNLayers(); layer++) { + if (IsTrackletInLayer(layer)) { + AliTRDtrackletGTU *trkl = (AliTRDtrackletGTU*) (*fTracklets)[layer]; + if (trkl) { + if ((fZSubChannel > -1) && + (fZSubChannel != trkl->GetSubChannel(GetZChannel()))) + AliError(Form("found inconsistent z-subchannels: track = %i/%i, trkl = %i", + GetZChannel(), fZSubChannel, trkl->GetSubChannel(GetZChannel()))); + fZSubChannel = trkl->GetSubChannel(GetZChannel()); + } + else { + AliError("no tracklet where one should be according to layer mask"); + } + } } } return fZSubChannel; -- 2.43.0