- gtuTMU: limit number of tracklets per layer as in hardware
authorjklein <jklein@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 28 Sep 2013 15:25:31 +0000 (15:25 +0000)
committerjklein <jklein@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 28 Sep 2013 15:25:31 +0000 (15:25 +0000)
- fix memory leaks

TRD/AliTRDgtuParam.cxx
TRD/AliTRDgtuParam.h
TRD/AliTRDgtuTMU.cxx

index cdd8997..17cdf1d 100644 (file)
@@ -43,6 +43,7 @@ AliTRDgtuParam *AliTRDgtuParam::fgInstance = 0;
 Bool_t AliTRDgtuParam::fgUseGTUconst = kTRUE;
 Bool_t AliTRDgtuParam::fgUseGTUmerge = kTRUE;
 Bool_t AliTRDgtuParam::fgLimitNoTracklets = kTRUE;
+Int_t  AliTRDgtuParam::fgMaxNoTracklets = 62;
 
 // ----- matching windows -----
       Int_t     AliTRDgtuParam::fgDeltaY     = 19;
index 8a55ddd..228cd95 100644 (file)
@@ -82,6 +82,9 @@ class AliTRDgtuParam : public TObject {
   static void SetLimitNoTracklets(Bool_t b) { fgLimitNoTracklets = b; }
   static Bool_t GetLimitNoTracklets() { return fgLimitNoTracklets; }
 
+  static void SetMaxNoTracklets(Int_t max) { fgMaxNoTracklets = max; }
+  static Int_t GetMaxNoTracklets() { return fgMaxNoTracklets; }
+
   // z-channel map
   Int_t GenerateZChannelMap(); // could have different modes (for beam-beam, cosmics, ...)
   Bool_t DisplayZChannelMap(Int_t zchannel = -1, Int_t subch = 0) const;
@@ -124,6 +127,7 @@ class AliTRDgtuParam : public TObject {
                                               // instead of geometry derived quantities
   static       Bool_t fgUseGTUmerge;    // use merge algorithm exactly as in hardware
   static       Bool_t fgLimitNoTracklets; // limit the number of tracklets per layer
+  static       Int_t  fgMaxNoTracklets;   // max number of tracklets per layer if limited
   static const Bool_t fgZChannelMap[5][16][6][16]; // z-channel tables as in GTU
   static const Float_t fgkRadius[6];    // layer radius as used in the GTU code
   static const Float_t fgkThickness;    // drift length as used in the GTU code
index 4c7b193..8e8a590 100644 (file)
@@ -90,10 +90,10 @@ AliTRDgtuTMU::~AliTRDgtuTMU()
   delete [] fTracks;
   for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++) {
     delete [] fZChannelTracklets[layer];
-    //    delete [] fTrackletsPostInput[layer];
+    delete fTrackletsPostInput[layer];
   }
   delete [] fZChannelTracklets;
-  //  delete [] fTrackletsPostInput;
+  delete [] fTrackletsPostInput;
 
   for (Int_t iLink = 0; iLink < fGtuParam->GetNLinks(); iLink++) {
     delete fTracklets[iLink];
@@ -185,7 +185,6 @@ Bool_t AliTRDgtuTMU::RunTMU(TList *ListOfTracks, AliESDEvent *esd)
   // ----- Z-channel units -----
   AliDebug(1,"--------- Running Z-channel units ----------");
   for (Int_t layer = 0;  layer <  fGtuParam->GetNLayers(); layer++) {
-    fZChannelTracklets[layer] = new TList[fGtuParam->GetNZChannels()];
     if (!RunZChannelUnit(layer)) {
       AliError(Form("Z-Channel unit in layer %i failed", layer));
       return kFALSE;
@@ -234,7 +233,11 @@ Bool_t AliTRDgtuTMU::RunInputUnit(Int_t layer)
   Int_t iTrkl0 = 0; // A-side tracklet
   Int_t iTrkl1 = 0; // B-side tracklet
 
-  while ((iTrkl0 < fTracklets[2*layer + 0]->GetEntriesFast()) || (iTrkl1 < fTracklets[2*layer + 1]->GetEntriesFast())) {
+  Int_t nTracklets = 0;
+  while ((!fGtuParam->GetLimitNoTracklets() ||
+         (nTracklets < fGtuParam->GetMaxNoTracklets())) &&
+        ((iTrkl0 < fTracklets[2*layer + 0]->GetEntriesFast()) ||
+         (iTrkl1 < fTracklets[2*layer + 1]->GetEntriesFast()))) {
     if (iTrkl1 >= fTracklets[2*layer + 1]->GetEntriesFast()) {
       fTrackletsPostInput[layer]->AddLast(fTracklets[2*layer + 0]->At(iTrkl0));
       iTrkl0++;
@@ -257,6 +260,7 @@ Bool_t AliTRDgtuTMU::RunInputUnit(Int_t layer)
        }
       }
     }
+    ++nTracklets;
   }
 
   TIter next(fTrackletsPostInput[layer]);
@@ -544,6 +548,8 @@ 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?
@@ -1145,6 +1151,9 @@ Bool_t AliTRDgtuTMU::Uniquifier(const TList *inlist, TList *outlist)
     AliTRDtrackGTU *trkStage1 = 0x0;
 
     do {
+      if (trkStage0 != trkStage1)
+       delete trkStage0;
+
        trkStage0 = (AliTRDtrackGTU*) next();
 
        Bool_t tracksEqual = kFALSE;
@@ -1158,8 +1167,10 @@ Bool_t AliTRDgtuTMU::Uniquifier(const TList *inlist, TList *outlist)
        }
 
        if (tracksEqual) {
-           if (trkStage0->GetNTracklets() >= trkStage1->GetNTracklets())
-               trkStage1 = trkStage0;
+         if (trkStage0->GetNTracklets() >= trkStage1->GetNTracklets()) {
+           delete trkStage1;
+           trkStage1 = trkStage0;
+         }
        }
        else {
            if (trkStage1 != 0x0)