]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
fixes for GTU simulation
authorJochen Klein <jochen.klein@cern.ch>
Tue, 3 Dec 2013 07:43:21 +0000 (08:43 +0100)
committerJochen Klein <jochen.klein@cern.ch>
Sun, 8 Dec 2013 13:49:08 +0000 (14:49 +0100)
- writing tracks to TClonesArray instead of ownership by list
- clean up storage of tracks
- add error messages to AliTRDtrackGTU

TRD/AliTRDgtuSim.cxx
TRD/AliTRDgtuTMU.cxx
TRD/AliTRDgtuTMU.h
TRD/AliTRDtrackGTU.cxx

index 1d941f46c451cb499fabf038deee9e04eacc8605..107cc857da0dd6985643e0ad63181f853f954ba8 100644 (file)
@@ -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;
index 7755e9a28975c466d782d4d89632632dbdc2a0bd..abb69af89dc314ed6f5c04012fe9382eae14631d 100644 (file)
@@ -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)
index ac87bb8e180513b15bbe3964a348c93b5b0f0748..9875eb67ec53eca5a7de49cfd204640f3511a4c5 100644 (file)
 //--------------------------------------------------------------------
 
 #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
 
index 3384c5364a7962fb418abae70cd1bebbf9e1860a..985b0c5a470070452af9f5e0d3e63c2c74ca4b88 100644 (file)
@@ -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;