Fix bug in the definition of number of clusters/tracklet
authorabercuci <abercuci@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 27 Oct 2009 14:18:35 +0000 (14:18 +0000)
committerabercuci <abercuci@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 27 Oct 2009 14:18:35 +0000 (14:18 +0000)
The number of clustres/tracklet was artificially limited to 32
The bug was preventing tracklets in local high densities of clusters to
be constructed

TRD/AliTRDseedV1.cxx
TRD/AliTRDseedV1.h

index d4e7a45..3dcbe02 100644 (file)
@@ -1009,8 +1009,8 @@ Bool_t    AliTRDseedV1::AttachClusters(AliTRDtrackingChamber *const chamber, Bool_t
       TTreeSRedirector &cstreamer = *fkReconstructor->GetDebugStream(AliTRDrecoParam::kTracker);
       TVectorD vdy(ncl[ir], yres[ir]);
       UChar_t stat(0);
-      if(IsKink()) SETBIT(stat, 0);
-      if(IsStandAlone()) SETBIT(stat, 1);
+      if(IsKink()) SETBIT(stat, 1);
+      if(IsStandAlone()) SETBIT(stat, 2);
       cstreamer << "AttachClusters"
           << "stat="   << stat
           << "det="    << fDet
@@ -1076,23 +1076,27 @@ Bool_t  AliTRDseedV1::AttachClusters(AliTRDtrackingChamber *const chamber, Bool_t
       if(!blst[jr][ic])continue;
       c = clst[jr][ic];
       Int_t it = c->GetPadTime();
+      Int_t idx = it+kNtb*ir;
+      if(fClusters[idx]){
+        AliDebug(2, Form("Cluster position already allocated tb[%2d] r[%d]. Skip !", it, jr));
+        SetErrorMsg(kAttachMultipleCl);
+        continue;
+      }
+
       // TODO proper indexing of clusters !!
-      fIndexes[it+kNtb*ir]  = chamber->GetTB(it)->GetGlobalIndex(idxs[jr][ic]);
-      fClusters[it+kNtb*ir] = c;
-  
-      //printf("\tid[%2d] it[%d] idx[%d]\n", ic, it, fIndexes[it]);
-  
+      fIndexes[idx]  = chamber->GetTB(it)->GetGlobalIndex(idxs[jr][ic]);
+      fClusters[idx] = c;
       n++;
     }
   }  
+  SetN(n);
 
   // number of minimum numbers of clusters expected for the tracklet
-  if (n < kClmin){
-    AliDebug(2, Form("NOT ENOUGH CLUSTERS TO FIT THE TRACKLET %d [%d].", n, kClmin));
+  if (GetN() < kClmin){
+    AliDebug(2, Form("NOT ENOUGH CLUSTERS ATTACHED TO THE TRACKLET %d [%d] FROM FOUND [%d].", GetN(), kClmin, n));
     SetErrorMsg(kAttachClAttach);
     return kFALSE;
   }
-  SetN(n);
 
   // Load calibration parameters for this tracklet  
   Calibrate();
index df575c8..68edd56 100644 (file)
@@ -70,6 +70,7 @@ public:
   enum ETRDtrackletError {
     kAttachClFound = 1  // not enough clusters found
    ,kAttachRow          // found row < 0
+   ,kAttachMultipleCl   // multiple clusters attached to time bin
    ,kAttachClAttach     // not enough clusters attached
   };
 
@@ -207,7 +208,7 @@ private:
   Float_t          fDiffT;                  //! transversal diffusion coefficient
   Char_t           fClusterIdx;             //! clusters iterator
   UChar_t          fErrorMsg;               // processing error
-  UShort_t         fN;                      // number of clusters attached/used/shared
+  UInt_t           fN;                      // number of clusters attached/used/shared
   Short_t          fDet;                    // TRD detector
   AliTRDcluster   *fClusters[kNclusters];   // Clusters
   Float_t          fPad[3];                 // local pad definition : length/width/tilt 
@@ -364,25 +365,28 @@ inline void AliTRDseedV1::SetCovRef(const Double_t *cov)
 //____________________________________________________________
 inline void AliTRDseedV1::SetN(Int_t n)
 {
-  if(n<0 || n>= (1<<5)) return; 
-  fN &= ~0x1f;
-  fN |= n;
+  if(n<0 || n>kNclusters) return; 
+  UInt_t mask(0x3f); 
+  fN &= ~mask; 
+  fN |= (n&mask);
 }
 
 //____________________________________________________________
 inline void AliTRDseedV1::SetNUsed(Int_t n)
 {
-  if(n<0 || n>= (1<<5)) return; 
-  fN &= ~(0x1f<<5);
-  n <<= 5; fN |= n;
+  if(n<0 || n>kNclusters) return; 
+  UInt_t mask(0x3f<<6); 
+  fN &= ~mask;
+  n <<= 6; fN |= (n&mask);
 }
 
 //____________________________________________________________
 inline void AliTRDseedV1::SetNShared(Int_t n)
 {
-  if(n<0 || n>= (1<<5)) return; 
-  fN &= ~(0x1f<<10);
-  n <<= 10; fN |= n;
+  if(n<0 || n>kNclusters) return; 
+  UInt_t mask(0x3f<<12); 
+  fN &= ~mask;
+  n <<= 12; fN |= (n&mask);
 }