Consistent treatment of online gain tables (ANNIKA)
authorcblume <cblume@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 23 Apr 2012 12:05:08 +0000 (12:05 +0000)
committercblume <cblume@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 23 Apr 2012 12:05:08 +0000 (12:05 +0000)
TRD/AliTRDclusterizer.cxx
TRD/AliTRDclusterizer.h
TRD/AliTRDdigitizer.cxx

index 6e3581f..f37f80d 100644 (file)
@@ -89,7 +89,7 @@ AliTRDclusterizer::AliTRDclusterizer(const AliTRDReconstructor *const rec)
   ,fCalNoiseROC(NULL)
   ,fCalNoiseDetValue(0)
   ,fCalPadStatusROC(NULL)
-  ,fCalOnGainROC(NULL)
+  ,fCalOnlGainROC(NULL)
   ,fClusterROC(0)
   ,firstClusterROC(0)
   ,fNoOfClusters(0)
@@ -151,7 +151,7 @@ AliTRDclusterizer::AliTRDclusterizer(const Text_t *name
   ,fCalNoiseROC(NULL)
   ,fCalNoiseDetValue(0)
   ,fCalPadStatusROC(NULL)
-  ,fCalOnGainROC(NULL)
+  ,fCalOnlGainROC(NULL)
   ,fClusterROC(0)
   ,firstClusterROC(0)
   ,fNoOfClusters(0)
@@ -206,7 +206,7 @@ AliTRDclusterizer::AliTRDclusterizer(const AliTRDclusterizer &c)
   ,fCalNoiseROC(NULL)
   ,fCalNoiseDetValue(0)
   ,fCalPadStatusROC(NULL)
-  ,fCalOnGainROC(NULL)
+  ,fCalOnlGainROC(NULL)
   ,fClusterROC(0)
   ,firstClusterROC(0)
   ,fNoOfClusters(0)
@@ -897,9 +897,9 @@ Bool_t AliTRDclusterizer::MakeClusters(Int_t det)
   // Calibration object with the pad status
   fCalPadStatusROC       = calibration->GetPadStatusROC(fDet);
   // Calibration object of the online gain
-  fCalOnGainROC          = 0x0;  
+  fCalOnlGainROC          = 0x0;  
   if (calibration->HasOnlineFilterGain()) {
-    fCalOnGainROC        = calibration->GetOnlineGainTableROC(fDet);
+    fCalOnlGainROC        = calibration->GetOnlineGainTableROC(fDet);
   }
 
   firstClusterROC = -1;
@@ -964,8 +964,8 @@ Bool_t AliTRDclusterizer::IsMaximum(const MaxStruct &Max, UChar_t &padStatus, Fl
   //
 
   Float_t gain = fCalGainFactorDetValue * fCalGainFactorROC->GetValue(Max.col,Max.row);
-  Float_t ongain = fCalOnGainROC ? fCalOnGainROC->GetGainCorrectionFactor(Max.row,Max.col) : 1;
-  Signals[1] = (fDigits->GetData(Max.row, Max.col, Max.time) - fBaseline) * ongain / gain + 0.5f;
+  Float_t onlcf = fCalOnlGainROC ? fCalOnlGainROC->GetGainCorrectionFactor(Max.row,Max.col) : 1;
+  Signals[1] = (fDigits->GetData(Max.row, Max.col, Max.time) - fBaseline) /(onlcf * gain) + 0.5f;
   if(Signals[1] <= fMaxThresh) return kFALSE;
 
   if(Max.col < 1 || Max.col + 1 >= fColMax) return kFALSE;
@@ -982,13 +982,13 @@ Bool_t AliTRDclusterizer::IsMaximum(const MaxStruct &Max, UChar_t &padStatus, Fl
   Short_t signal(0);
   if((signal = fDigits->GetData(Max.row, Max.col-1, Max.time))){
     gain = fCalGainFactorDetValue * fCalGainFactorROC->GetValue(Max.col-1,Max.row);
-    ongain = fCalOnGainROC ? fCalOnGainROC->GetGainCorrectionFactor(Max.row,Max.col-1) : 1;
-    Signals[0] = (signal - fBaseline) * ongain / gain + 0.5f;
+    onlcf = fCalOnlGainROC ? fCalOnlGainROC->GetGainCorrectionFactor(Max.row,Max.col-1) : 1;
+    Signals[0] = (signal - fBaseline) /( onlcf * gain) + 0.5f;
   } else Signals[0] = 0.;
   if((signal = fDigits->GetData(Max.row, Max.col+1, Max.time))){
     gain = fCalGainFactorDetValue * fCalGainFactorROC->GetValue(Max.col+1,Max.row);
-    ongain = fCalOnGainROC ? fCalOnGainROC->GetGainCorrectionFactor(Max.row,Max.col+1) : 1;
-    Signals[2] = (signal - fBaseline) * ongain / gain + 0.5f;
+    onlcf = fCalOnlGainROC ? fCalOnlGainROC->GetGainCorrectionFactor(Max.row,Max.col+1) : 1;
+    Signals[2] = (signal - fBaseline) /( onlcf *  gain) + 0.5f;
   } else Signals[2] = 0.;
 
   if(!(status[0] | status[1] | status[2])) {//all pads are good
@@ -1035,14 +1035,17 @@ Bool_t AliTRDclusterizer::FivePadCluster(MaxStruct &ThisMax, MaxStruct &Neighbou
   
   if (ThisMax.col >= fColMax - 3) return kFALSE;
   Float_t gain;
+  Float_t onlcf;
   if (ThisMax.col < fColMax - 5){
     gain = fCalGainFactorDetValue * fCalGainFactorROC->GetValue(ThisMax.col+4,ThisMax.row);
-    if (fDigits->GetData(ThisMax.row, ThisMax.col+4, ThisMax.time) - fBaseline >= fSigThresh * gain)
+    onlcf = fCalOnlGainROC ? fCalOnlGainROC->GetGainCorrectionFactor(ThisMax.row,ThisMax.col+4) : 1;
+    if (fDigits->GetData(ThisMax.row, ThisMax.col+4, ThisMax.time) - fBaseline >= fSigThresh * gain * onlcf)
       return kFALSE;
   }
   if (ThisMax.col > 1) {
     gain = fCalGainFactorDetValue * fCalGainFactorROC->GetValue(ThisMax.col-2,ThisMax.row);
-    if (fDigits->GetData(ThisMax.row, ThisMax.col-2, ThisMax.time) - fBaseline >= fSigThresh * gain)
+    onlcf = fCalOnlGainROC ? fCalOnlGainROC->GetGainCorrectionFactor(ThisMax.row,ThisMax.col-2) : 1;
+    if (fDigits->GetData(ThisMax.row, ThisMax.col-2, ThisMax.time) - fBaseline >= fSigThresh * gain * onlcf)
       return kFALSE;
   }
   
@@ -1125,7 +1128,7 @@ void AliTRDclusterizer::CalcAdditionalInfo(const MaxStruct &Max, Short_t *const
 // ADC signals at position 0, 1, 5 and 6
 
   Float_t tmp(0.), kMaxShortVal(32767.); // protect against data overflow due to wrong gain calibration
-  Float_t gain(1.); Short_t signal(0);
+  Float_t gain(1.); Float_t onlcf(1.); Short_t signal(0);
   // Store the amplitudes of the pads in the cluster for later analysis
   // and check whether one of these pads is masked in the database
   signals[3]=Max.signals[1];
@@ -1134,7 +1137,8 @@ void AliTRDclusterizer::CalcAdditionalInfo(const MaxStruct &Max, Short_t *const
   while((jpad = Max.col-ipad)){
     if(!(signal = fDigits->GetData(Max.row, jpad, Max.time))) break; // empty digit !
     gain = fCalGainFactorDetValue * fCalGainFactorROC->GetValue(jpad, Max.row);
-    tmp = (signal - fBaseline) / gain + 0.5f;
+    onlcf = fCalOnlGainROC ? fCalOnlGainROC->GetGainCorrectionFactor(Max.row,jpad) : 1;
+    tmp = (signal - fBaseline) / (onlcf * gain) + 0.5f;
     signal = (Short_t)TMath::Min(tmp, kMaxShortVal);
     if(signal<fSigThresh) break; // signal under threshold
     nPadCount++;
@@ -1146,7 +1150,8 @@ void AliTRDclusterizer::CalcAdditionalInfo(const MaxStruct &Max, Short_t *const
   while((jpad = Max.col+ipad)<fColMax){
     if(!(signal = fDigits->GetData(Max.row, jpad, Max.time))) break; // empty digit !
     gain = fCalGainFactorDetValue * fCalGainFactorROC->GetValue(jpad, Max.row);
-    tmp = (signal - fBaseline) / gain + 0.5f;
+    onlcf = fCalOnlGainROC ? fCalOnlGainROC->GetGainCorrectionFactor(Max.row,jpad) : 1;
+    tmp = (signal - fBaseline) / (onlcf * gain) + 0.5f;
     signal = (Short_t)TMath::Min(tmp, kMaxShortVal);
     if(signal<fSigThresh) break; // signal under threshold
     nPadCount++;
index 88ff359..fe590dd 100644 (file)
@@ -175,7 +175,7 @@ protected:
   AliTRDCalROC        *fCalNoiseROC;              // Calibration object with pad wise values for the noise
   Float_t              fCalNoiseDetValue;         // Calibration value for chamber wise noise
   AliTRDCalSingleChamberStatus *fCalPadStatusROC; // Calibration object with the pad status
-  AliTRDCalOnlineGainTableROC *fCalOnGainROC;     // Calibration table of online gain factors
+  AliTRDCalOnlineGainTableROC *fCalOnlGainROC;     // Calibration table of online gain factors
   Int_t                fClusterROC;               // The index to the first cluster of a given ROC
   Int_t                firstClusterROC;           // The number of cluster in a given ROC
   Int_t                fNoOfClusters;             // Number of Clusters already processed and still owned by the clusterizer
index e29be55..cb19295 100644 (file)
@@ -1235,12 +1235,11 @@ Bool_t AliTRDdigitizer::Signal2ADC(Int_t det, AliTRDarraySignal *signals)
   }
 
   // The gain factor calibration objects
-  const AliTRDCalDet          *calGainFactorDet      = calibration->GetGainFactorDet();  
-  AliTRDCalROC                *calGainFactorROC      = 0x0;
-  Float_t                      calGainFactorDetValue = 0.0;
-  AliTRDCalOnlineGainTableROC *onlineGainFactorROC   = 0x0;
+  const AliTRDCalDet *calGainFactorDet      = calibration->GetGainFactorDet();  
+  AliTRDCalROC       *calGainFactorROC      = 0x0;
+  Float_t             calGainFactorDetValue = 0.0;
 
-  AliTRDarrayADC     *digits = 0x0;
+  AliTRDarrayADC     *digits                = 0x0;
 
   if (!signals) {
     AliError(Form("Signals array for detector %d does not exist\n",det));
@@ -1271,11 +1270,6 @@ Bool_t AliTRDdigitizer::Signal2ADC(Int_t det, AliTRDarraySignal *signals)
   calGainFactorROC      = calibration->GetGainFactorROC(det);
   calGainFactorDetValue = calGainFactorDet->GetValue(det);
 
-  // Get the online gain factors
-  if (calibration->HasOnlineFilterGain()) {
-    onlineGainFactorROC = calibration->GetOnlineGainTableROC(det);
-  }
-
   // Create the digits for this chamber
   for (row  = 0; row  <  nRowMax; row++ ) {
     for (col  = 0; col  <  nColMax; col++ ) {
@@ -1294,11 +1288,6 @@ Bool_t AliTRDdigitizer::Signal2ADC(Int_t det, AliTRDarraySignal *signals)
         AliError(Form("Not a valid gain %f, %d %d %d",padgain,det,col,row));
       }
 
-      // The online gain correction
-      Float_t onlinegain = onlineGainFactorROC 
-                         ? onlineGainFactorROC->GetGainCorrectionFactor(row,col) 
-                         : 1.0;
-
       for (time = 0; time < nTimeTotal; time++) {
 
        // Get the signal amplitude
@@ -1307,7 +1296,6 @@ Bool_t AliTRDdigitizer::Signal2ADC(Int_t det, AliTRDarraySignal *signals)
         signalAmp *= coupling;
        // Gain factors
        signalAmp *= padgain;
-        signalAmp /= onlinegain;
 
         // Add the noise, starting from minus ADC baseline in electrons
         signalAmp  = TMath::Max((Double_t) gRandom->Gaus(signalAmp,simParam->GetNoise())