Changes for HLT - speedup interface for HLT tracker
authormarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 18 Jul 2008 14:17:18 +0000 (14:17 +0000)
committermarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 18 Jul 2008 14:17:18 +0000 (14:17 +0000)
(Jacek)

TPC/AliTPCclustererMI.cxx
TPC/AliTPCclustererMI.h
TPC/AliTPCtrackerMI.cxx
TPC/AliTPCtrackerMI.h
TPC/AliTPCtrackerSector.cxx

index 345dd0f..d2545ff 100644 (file)
@@ -25,6 +25,7 @@
 //  2. The Output data
 //      2.a TTree with clusters - if  SetOutput(TTree * tree) invoked
 //      2.b TObjArray           - Faster option for HLT
+//      2.c TClonesArray        - Faster option for HLT (smaller memory consumption), activate with fBClonesArray flag
 //
 //  3. Reconstruction setup
 //     see AliTPCRecoParam for list of parameters 
@@ -43,6 +44,7 @@
 #include <TGraph.h>
 #include <TH1F.h>
 #include <TObjArray.h>
+#include <TClonesArray.h>
 #include <TRandom.h>
 #include <TTree.h>
 #include <TTreeStream.h>
@@ -95,13 +97,16 @@ AliTPCclustererMI::AliTPCclustererMI(const AliTPCParam* par, const AliTPCRecoPar
   fInput(0),
   fOutput(0),
   fOutputArray(0),
+  fOutputClonesArray(0),
   fRowCl(0),
   fRowDig(0),
   fParam(0),
   fNcluster(0),
+  fNclusters(0),
   fDebugStreamer(0),
   fRecoParam(0),
-  fBDumpSignal(kFALSE)
+  fBDumpSignal(kFALSE),
+  fBClonesArray(kFALSE)
 {
   //
   // COSNTRUCTOR
@@ -148,13 +153,16 @@ AliTPCclustererMI::AliTPCclustererMI(const AliTPCclustererMI &param)
   fInput(0),
   fOutput(0),
   fOutputArray(0),
+  fOutputClonesArray(0),
   fRowCl(0),
   fRowDig(0),
   fParam(0),
   fNcluster(0),
+  fNclusters(0),
   fDebugStreamer(0),
   fRecoParam(0),
-  fBDumpSignal(kFALSE)
+  fBDumpSignal(kFALSE),
+  fBClonesArray(kFALSE)
 {
   //
   // dummy
@@ -180,6 +188,10 @@ AliTPCclustererMI::~AliTPCclustererMI(){
     //fOutputArray->Delete();
     delete fOutputArray;
   }
+  if (fOutputClonesArray){
+    fOutputClonesArray->Delete();
+    delete fOutputClonesArray;
+  }
 }
 
 void AliTPCclustererMI::SetInput(TTree * tree)
@@ -219,7 +231,7 @@ void AliTPCclustererMI::FillRow(){
   //          TObjArray
   //
   if (fOutput) fOutput->Fill();
-  if (!fOutput){
+  if (!fOutput && !fBClonesArray){
     //
     if (!fOutputArray) fOutputArray = new TObjArray(fParam->GetNRowsTotal());
     if (fRowCl && fRowCl->GetArray()->GetEntriesFast()>0) fOutputArray->AddAt(fRowCl->Clone(), fRowCl->GetID());
@@ -393,8 +405,6 @@ AliTPCclusterMI &c)
   //unfolding 2
   meani-=i0;
   meanj-=j0;
-  if (gDebug>4)
-    printf("%f\t%f\n", vmatrix2[2][2], vmatrix[2][2]);
 }
 
 
@@ -522,8 +532,6 @@ void AliTPCclustererMI::UnfoldCluster(Float_t * matrix2[7], Float_t recmatrix[5]
          }
       }
   }
-  if (gDebug>4) 
-    printf("%f\n", recmatrix[2][2]);
   
 }
 
@@ -601,8 +609,17 @@ void AliTPCclustererMI::AddCluster(AliTPCclusterMI &c, Float_t * matrix, Int_t p
   if (fLoop==2) c.SetType(100);
   if (!AcceptCluster(&c)) return;
 
-  TClonesArray * arr = fRowCl->GetArray();
-  AliTPCclusterMI * cl = new ((*arr)[fNcluster]) AliTPCclusterMI(c);
+  // select output 
+  TClonesArray * arr = 0;
+  AliTPCclusterMI * cl = 0;
+
+  if(fBClonesArray==kFALSE) {
+     arr = fRowCl->GetArray();
+     cl = new ((*arr)[fNcluster]) AliTPCclusterMI(c);
+  } else {
+     cl = new ((*fOutputClonesArray)[fNclusters+fNcluster]) AliTPCclusterMI(c);
+  }
+
   // if (fRecoParam->DumpSignal() &&matrix ) {
 //     Int_t nbins=0;
 //     Float_t *graph =0;
@@ -703,6 +720,7 @@ void AliTPCclustererMI::Digits2Clusters()
     FillRow();
     fRowCl->GetArray()->Clear();    
     nclusters+=fNcluster;    
+
     delete[] fBins;
     delete[] fSigBins;
   }  
@@ -734,8 +752,11 @@ void AliTPCclustererMI::Digits2Clusters(AliRawReader* rawReader)
     fEventType = fEventHeader->Get("Type");  
   }
 
+  // creaate one TClonesArray for all clusters
+  if(fBClonesArray) fOutputClonesArray = new TClonesArray("AliTPCclusterMI",1000);
 
-  Int_t nclusters  = 0;
+  // reset counter
+  fNclusters  = 0;
   
   fMaxTime = fRecoParam->GetLastBin() + 6; // add 3 virtual time bins before and 3 after
   const Int_t kNIS = fParam->GetNInnerSector();
@@ -767,14 +788,6 @@ void AliTPCclustererMI::Digits2Clusters(AliRawReader* rawReader)
   //
   for(fSector = 0; fSector < kNS; fSector++) {
 
-    AliTPCCalROC * gainROC    = gainTPC->GetCalROC(fSector);  // pad gains per given sector
-    AliTPCCalROC * pedestalROC = pedestalTPC->GetCalROC(fSector);  // pedestal per given sector
-    AliTPCCalROC * noiseROC   = noiseTPC->GetCalROC(fSector);  // noise per given sector
-    //check the presence of the calibration
-    if (!noiseROC ||!pedestalROC ) {
-      AliError(Form("Missing calibration per sector\t%d\n",fSector));
-      continue;
-    }
     Int_t nRows = 0;
     Int_t nDDLs = 0, indexDDL = 0;
     if (fSector < kNIS) {
@@ -790,6 +803,23 @@ void AliTPCclustererMI::Digits2Clusters(AliRawReader* rawReader)
       indexDDL = (fSector-kNIS) * 4 + kNIS * 2;
     }
 
+    // load the raw data for corresponding DDLs
+    rawReader->Reset();
+    rawReader->Select("TPC",indexDDL,indexDDL+nDDLs-1);
+
+    // select only good sector 
+    input.Next();
+    if(input.GetSector() != fSector) continue;
+
+    AliTPCCalROC * gainROC    = gainTPC->GetCalROC(fSector);  // pad gains per given sector
+    AliTPCCalROC * pedestalROC = pedestalTPC->GetCalROC(fSector);  // pedestal per given sector
+    AliTPCCalROC * noiseROC   = noiseTPC->GetCalROC(fSector);  // noise per given sector
+    //check the presence of the calibration
+    if (!noiseROC ||!pedestalROC ) {
+      AliError(Form("Missing calibration per sector\t%d\n",fSector));
+      continue;
+    }
+    
     for (Int_t iRow = 0; iRow < nRows; iRow++) {
       Int_t maxPad;
       if (fSector < kNIS)
@@ -802,14 +832,13 @@ void AliTPCclustererMI::Digits2Clusters(AliRawReader* rawReader)
       allNSigBins[iRow] = 0;
     }
     
-    // Loas the raw data for corresponding DDLs
-    rawReader->Reset();
-    rawReader->Select("TPC",indexDDL,indexDDL+nDDLs-1);
     Int_t digCounter=0;
     // Begin loop over altro data
     Bool_t calcPedestal = fRecoParam->GetCalcPedestal();
     Float_t gain =1;
     Int_t lastPad=-1;
+
+    input.Reset();
     while (input.Next()) {
       if (input.GetSector() != fSector)
        AliFatal(Form("Sector index mismatch ! Expected (%d), but got (%d) !",fSector,input.GetSector()));
@@ -976,12 +1005,14 @@ void AliTPCclustererMI::Digits2Clusters(AliRawReader* rawReader)
       fNSigBins = allNSigBins[fRow];
 
       FindClusters(noiseROC);
+
       FillRow();
-      fRowCl->GetArray()->Clear();    
-      nclusters += fNcluster;    
+      if(fBClonesArray == kFALSE) fRowCl->GetArray()->Clear();    
+      fNclusters += fNcluster;    
+
     } // End of loop to find clusters
   } // End of loop over sectors
-  
+
   for (Int_t iRow = 0; iRow < nRowsMax; iRow++) {
     delete [] allBins[iRow];
     delete [] allSigBins[iRow];
@@ -991,11 +1022,15 @@ void AliTPCclustererMI::Digits2Clusters(AliRawReader* rawReader)
   delete [] allNSigBins;
   
   if (rawReader->GetEventId() && fOutput ){
-    Info("Digits2Clusters", "File  %s Event\t%d\tNumber of found clusters : %d\n", fOutput->GetName(),*(rawReader->GetEventId()), nclusters);
+    Info("Digits2Clusters", "File  %s Event\t%d\tNumber of found clusters : %d\n", fOutput->GetName(),*(rawReader->GetEventId()), fNclusters);
   }
   
   if(rawReader->GetEventId()) {
-    Info("Digits2Clusters", "Event\t%d\tNumber of found clusters : %d\n",*(rawReader->GetEventId()), nclusters);
+    Info("Digits2Clusters", "Event\t%d\tNumber of found clusters : %d\n",*(rawReader->GetEventId()), fNclusters);
+  }
+
+  if(fBClonesArray) {
+    //Info("Digits2Clusters", "Number of found clusters : %d\n",fOutputClonesArray->GetEntriesFast());
   }
 }
 
index 8992755..588085b 100644 (file)
@@ -18,6 +18,7 @@
 #define kMAXCLUSTER 2500
 
 class TFile;
+class TClonesArray;
 class AliTPCParam;
 class AliTPCRecoParam;
 class AliTPCclusterMI;
@@ -41,6 +42,10 @@ public:
   virtual void SetOutput(TTree * tree); // set output tree with 
   virtual void FillRow();               // fill the output container - Tree or TObjArray
   TObjArray * GetOutputArray(){return fOutputArray;}
+  TClonesArray * GetOutputClonesArray(){return fOutputClonesArray;}
+
+  void StoreInClonesArray(Bool_t bOutput = kTRUE) {fBClonesArray = bOutput;} // store output clusters in TClonesArray
+
 private:
   Bool_t IsMaximum(Float_t k, Int_t max, const Float_t *bins) const; 
   void MakeCluster2(Int_t k,Int_t max,Float_t *bins,UInt_t m,
@@ -78,13 +83,17 @@ private:
   TTree * fInput;   //!input  tree with digits - object not owner
   TTree * fOutput;   //!output tree with digits - object not owner
   TObjArray *fOutputArray;     //! output TObjArray with pointers arrays of cluster
+  TClonesArray *fOutputClonesArray; //! output TClonesArray with clusters
   AliTPCClustersRow * fRowCl;  //! current cluster row
   AliSimDigits * fRowDig;      //! current digits row
   const AliTPCParam * fParam;        //! tpc parameters
   Int_t fNcluster;             // number of clusters - for given row
+  Int_t fNclusters;            // tot number of clusters
   TTreeSRedirector *fDebugStreamer;     //!debug streamer
   const AliTPCRecoParam  * fRecoParam;        //! reconstruction parameters
   Bool_t  fBDumpSignal; // dump signal flag
+  Bool_t  fBClonesArray; // output clusters stored in TClonesArray 
+
   ClassDef(AliTPCclustererMI,2)  // Time Projection Chamber digits
 };
 
index 34beaa6..d1b86c1 100644 (file)
@@ -1147,7 +1147,7 @@ Int_t  AliTPCtrackerMI::LoadClusters(TClonesArray *arr)
   // TClonesArray
   //
   AliTPCclusterMI *clust=0;
-  Int_t count[72][96] = { {0} , {0}}; 
+  Int_t count[72][96] = { {0} , {0} }; 
 
   // loop over clusters
   for (Int_t icl=0; icl<arr->GetEntriesFast(); icl++) {
@@ -1169,6 +1169,15 @@ Int_t  AliTPCtrackerMI::LoadClusters(TClonesArray *arr)
 
     Int_t sec = clust->GetDetector();
     Int_t row = clust->GetRow();
+
+    // filter overlapping pad rows needed by HLT
+    if(sec<fkNIS*2) { //IROCs
+     if(row == 30) continue;
+    }
+    else { // OROCs
+      if(row == 27 || row == 76) continue;
+    }
+
     Int_t left=0;
     if (sec<fkNIS*2){
       left = sec/fkNIS;
@@ -1180,8 +1189,10 @@ Int_t  AliTPCtrackerMI::LoadClusters(TClonesArray *arr)
     }
   }
 
-  LoadOuterSectors();
-  LoadInnerSectors();
+  // Load functions must be called behind LoadCluster(TClonesArray*)
+  // needed by HLT
+  //LoadOuterSectors();
+  //LoadInnerSectors();
 
   return 0;
 }
index 7e7aa35..72ce442 100644 (file)
@@ -47,6 +47,8 @@ public:
   virtual Int_t LoadClusters (TClonesArray * arr); // another input
   Int_t  LoadClusters();
   void   UnloadClusters();
+  Int_t LoadInnerSectors();
+  Int_t LoadOuterSectors();
   virtual void FillClusterArray(TObjArray* array) const;
   void   Transform(AliTPCclusterMI * cluster);
   //
@@ -150,8 +152,8 @@ private:
 
   
    AliTPCseed * ReSeed(AliTPCseed *t);
-   Int_t LoadInnerSectors();
-   Int_t LoadOuterSectors();
+   //Int_t LoadInnerSectors();
+   //Int_t LoadOuterSectors();
    void UnsignClusters();
    void SignClusters(TObjArray * arr, Float_t fnumber=3., Float_t fdensity=2.);  
 
index 49db7df..551a9d5 100644 (file)
@@ -284,20 +284,26 @@ void AliTPCtrackerSector::InsertCluster(AliTPCclusterMI *cl, Int_t size, const A
   //
   if (left ==0){
     tpcrow = fRow+row;
-    if(!tpcrow->GetClusters1()) tpcrow->SetClusters1(new AliTPCclusterMI[size]); 
+    if(!tpcrow->GetClusters1()) {
+       tpcrow->SetClusters1(new AliTPCclusterMI[size]); 
+       tpcrow->SetN1(0);
+    }
     if(size < kMaxClusterPerRow) {
       tpcrow->SetCluster1(tpcrow->GetN1(), *cl);
-      //printf("inner: size %d, tpcrow->GetN1() %d  sec %d row %d tpcrow %p \n", size, tpcrow->GetN1(), sec, row, tpcrow);
+      //printf("inner: size %d, tpcrow->GetN1() %d  sec %d row %d tpcrow %p cl %p\n", size, tpcrow->GetN1(), sec, row, tpcrow, cl);
 
       tpcrow->IncrementN1();
     }
   }
   if (left ==1){
     tpcrow = fRow+row;
-    if(!tpcrow->GetClusters2()) tpcrow->SetClusters2(new AliTPCclusterMI[size]); 
+    if(!tpcrow->GetClusters2()) { 
+      tpcrow->SetClusters2(new AliTPCclusterMI[size]); 
+      tpcrow->SetN2(0);
+    }
     if(size < kMaxClusterPerRow)  { 
       tpcrow->SetCluster2(tpcrow->GetN2(), *cl);
-      //printf("outer: size %d, tpcrow->GetN2() %d  sec %d row %d tpcrow %p \n", size, tpcrow->GetN2(), sec, row, tpcrow);
+      //printf("outer: size %d, tpcrow->GetN2() %d  sec %d row %d tpcrow %p cl %p\n", size, tpcrow->GetN2(), sec, row, tpcrow, cl);
 
       tpcrow->IncrementN2();
     }