]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
ATO-17, ATO-19 Adding crosstalk correction , Adding ion tail simulation (Mesut)
authormivanov <marian.ivanov@cern.ch>
Sat, 28 Jun 2014 12:40:40 +0000 (14:40 +0200)
committermivanov <marian.ivanov@cern.ch>
Sat, 28 Jun 2014 12:40:40 +0000 (14:40 +0200)
Rec/AliTPCtracker.cxx Rec/AliTPCtracker.h - Adding crosstalk correction
Sim/AliTPCDigitizer.cxx                   - Adding ion tail simulation

Rec/AliTPCtracker.h Rec/AliTPCtracker.cxx Sim/AliTPCDigitizer.cxx

TPC/Rec/AliTPCtracker.cxx
TPC/Rec/AliTPCtracker.h
TPC/Sim/AliTPCDigitizer.cxx

index 51f42194d69ac1f4b56bd2f0b112afaa014bb1af..34f362d62697aebfa402db81fb4f685be0047a5c 100644 (file)
 #include <TFile.h>
 #include <TObjArray.h>
 #include <TTree.h>
+#include <TMatrixD.h>
 #include <TGraphErrors.h>
 #include <TTimeStamp.h>
 #include "AliLog.h"
@@ -210,6 +211,8 @@ AliTPCtracker::AliTPCtracker()
                 fkParam(0),
                 fDebugStreamer(0),
                 fUseHLTClusters(4),
+         fCrossTalkSignalArray(0),
+         fCrossTalkSignal(0),
                 fSeedsPool(0),
                 fFreeSeedsID(500),
                 fNFreeSeeds(0),
@@ -223,6 +226,21 @@ AliTPCtracker::AliTPCtracker()
     fYMax[irow]=0;
     fPadLength[irow]=0;
   }
+  
+  // crosstalk array and matrix initialization
+  Int_t nROCs   = 72;
+  Int_t nTimeBinsAll  = 1100;
+  Int_t nWireSegments = 11;
+  fCrossTalkSignalArray = new TObjArray(nROCs);  // for 36 sectors 
+  fCrossTalkSignalArray->SetOwner(kTRUE); 
+  for (Int_t isector=0; isector<nROCs; isector++){
+    fCrossTalkSignal = new TMatrixD(nWireSegments,nTimeBinsAll);
+    for (Int_t imatrix = 0; imatrix<11; imatrix++)
+      for (Int_t jmatrix = 0; jmatrix<nTimeBinsAll; jmatrix++){
+      (*fCrossTalkSignal)[imatrix][jmatrix]=0.;
+      }
+      fCrossTalkSignalArray->AddAt(fCrossTalkSignal,isector);
+  }
 
 }
 //_____________________________________________________________________
@@ -436,9 +454,11 @@ AliTracker(),
                 fSeeds(0),
                 fIteration(0),
                 fkParam(0),
-                 fDebugStreamer(0),
-                 fUseHLTClusters(4),
-                 fSeedsPool(0),
+         fDebugStreamer(0),
+         fUseHLTClusters(4),
+         fCrossTalkSignalArray(0),
+         fCrossTalkSignal(0),
+         fSeedsPool(0),
                 fFreeSeedsID(500),
                 fNFreeSeeds(0),
                 fLastSeedID(-1)
@@ -498,9 +518,11 @@ AliTPCtracker::AliTPCtracker(const AliTPCtracker &t):
                 fSeeds(0),
                 fIteration(0),
                 fkParam(0),
-                 fDebugStreamer(0),
-                 fUseHLTClusters(4),
-                 fSeedsPool(0),
+         fDebugStreamer(0),
+         fUseHLTClusters(4),
+         fCrossTalkSignalArray(0),
+         fCrossTalkSignal(0),
+         fSeedsPool(0),
                 fFreeSeedsID(500),
                 fNFreeSeeds(0),
                 fLastSeedID(-1)
@@ -534,6 +556,8 @@ AliTPCtracker::~AliTPCtracker() {
     fSeeds->Clear(); 
     delete fSeeds;
   }
+  if (fCrossTalkSignalArray) delete fCrossTalkSignalArray;
+  if (fCrossTalkSignal) delete fCrossTalkSignal;
   if (fDebugStreamer) delete fDebugStreamer;
   if (fSeedsPool) delete fSeedsPool;
 }
@@ -1346,8 +1370,17 @@ Int_t  AliTPCtracker::LoadClusters()
     //  
     Int_t sec,row;
     fkParam->AdjustSectorRow(clrow->GetID(),sec,row);
+    
+    // wire segmentID and nPadsPerSegment to be used for Xtalk calculation
+    Int_t wireSegmentID     = fkParam->GetWireSegment(sec,row);
+    Float_t nPadsPerSegment = (Float_t)(fkParam->GetNPadsPerSegment(wireSegmentID));
+    TMatrixD &crossTalkSignal =  *((TMatrixD*)fCrossTalkSignalArray->At(sec));
     for (Int_t icl=0; icl<clrow->GetArray()->GetEntriesFast(); icl++){
-      Transform((AliTPCclusterMI*)(clrow->GetArray()->At(icl)));
+      AliTPCclusterMI *clXtalk= static_cast<AliTPCclusterMI*>(clrow->GetArray()->At(icl));
+      Int_t timeBinXtalk = clXtalk->GetTimeBin();
+      Double_t qTotXtalk = clXtalk->GetQ();    
+      crossTalkSignal[wireSegmentID][timeBinXtalk]+= qTotXtalk/nPadsPerSegment; 
+      Transform((AliTPCclusterMI*)(clXtalk));
     }
     //
     AliTPCtrackerRow * tpcrow=0;
index 5a9d265e48f0caec0bb9dc8120d1f55470111ca9..108e70868ea7fec88e9df3e07d7432d97651e180 100644 (file)
@@ -14,6 +14,7 @@
 //-------------------------------------------------------
 
 #include <TArrayI.h>
+#include <TMatrixD.h>
 #include "AliTracker.h"
 #include "AliTPCreco.h"
 #include "AliTPCclusterMI.h"
@@ -219,6 +220,11 @@ private:
    TTreeSRedirector *fDebugStreamer;     //!debug streamer
    Int_t  fUseHLTClusters;              // use HLT clusters instead of offline clusters
    //
+  
+   TObjArray * fCrossTalkSignalArray;  // for 36 sectors 
+   TMatrixD * fCrossTalkSignal;               // matrix holds total charge in a given anode wire segment for a given timebin
+
+   
    TClonesArray* fSeedsPool;            //! pool of seeds
    TArrayI fFreeSeedsID;                //! array of ID's of freed seeds
    Int_t fNFreeSeeds;                   //! number of seeds freed in the pool
index f60c57dc8c174891239e166480f32386ba836d5e..cef91d81d7f0f601af1be9f7194e34448216aaed 100644 (file)
@@ -771,6 +771,7 @@ void AliTPCDigitizer::DigitizeWithTailAndCrossTalk(Option_t* option)
   TObject *rocFactorOROC  = ionTailArr->FindObject("factorOROC");
   Float_t factorIROC      = (atof(rocFactorIROC->GetTitle()));
   Float_t factorOROC      = (atof(rocFactorOROC->GetTitle()));
+  Int_t nIonTailBins =0;
   TObjArray timeResFunc(nROCs); 
   for (Int_t isec = 0;isec<nROCs;isec++){        //loop overs sectors
     // Array of TGraphErrors for a given sector
@@ -786,6 +787,7 @@ void AliTPCDigitizer::DigitizeWithTailAndCrossTalk(Option_t* option)
     TObjArray *timeResArr = new TObjArray(20);  timeResArr -> SetOwner(kTRUE); 
     for (Int_t ires = 0;ires<20;ires++) timeResArr->AddAt(graphRes[ires],ires);
     timeResFunc.AddAt(timeResArr,isec); // Fill all trfs into a single TObjArray 
+    nIonTailBins = graphRes[3]->GetN();
     delete timeResArr;
   }
 
@@ -795,7 +797,6 @@ void AliTPCDigitizer::DigitizeWithTailAndCrossTalk(Option_t* option)
   
   TObjArray   crossTalkSignalArray(nROCs);  // for 36 sectors 
   TVectorD  * qTotSectorOld  = new TVectorD(nROCs);
-  TVectorD  * qTotSectorNew  = new TVectorD(nROCs);  
   Float_t qTotTPC = 0.;
   Float_t qTotPerSector = 0.;
   Int_t nTimeBinsAll = 1100;
@@ -966,11 +967,10 @@ void AliTPCDigitizer::DigitizeWithTailAndCrossTalk(Option_t* option)
       // Crosstalk correction 
       qXtalk = (*(TMatrixD*)crossTalkSignalArray.At(sector))[wireSegmentID][timeBin];
       qTotPerSector = qTotSectorOld -> GetMatrixArray()[sector];    
-      q -= qXtalk;
+      //q -= qXtalk;
       
-      // Ion tail correction:
-      //   elem=padNumber*nTimeBins+timeBin;
-      //    lowerElem=elem-nIonTailBins;    
+      // Ion tail correction: being elem=padNumber*nTimeBins+timeBin;
+      Int_t lowerElem=elem-nIonTailBins;    
       //    if (lowerElem<0) lowerElem=0;
       //    if (lowerElem in previospad) lowerElem = padNumber*nTimeBins;
       // 
@@ -1022,7 +1022,7 @@ void AliTPCDigitizer::DigitizeWithTailAndCrossTalk(Option_t* option)
       ptr1++;
     }
      
-   if (AliTPCReconstructor::StreamLevel()==1 && q > zerosup ) { 
+   if (AliTPCReconstructor::StreamLevel()==1 && qOrig > zerosup ) { 
       cout << " sector = " << sector  << " row = " << padRow << " localPad = " << localPad << " SegmentID = " << wireSegmentID << " nPadsPerSegment = " <<  nPadsPerSegment << endl;
       cout << " qXtalk =   " <<  qXtalk ;
       cout << " qOrig = " <<  qOrig ;