Support for automatic pedestal estimation per pad (Marian and Matevz).
authormtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 19 May 2006 13:52:18 +0000 (13:52 +0000)
committermtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 19 May 2006 13:52:18 +0000 (13:52 +0000)
EVE/Alieve/TPCData.cxx
EVE/Alieve/TPCData.h
EVE/Alieve/TPCSectorData.cxx
EVE/Alieve/TPCSectorData.h
EVE/test-macros/tpc_sector_raw_test.C

index 77ad4b7..c17b8b8 100644 (file)
@@ -28,7 +28,7 @@ ClassImp(TPCData)
 
 TPCData::TPCData() :
   fSectors(36), fSectorBlockSize(65536),
-  fLoadThreshold(0), fLoadPedestal(0)
+  fLoadThreshold(0), fLoadPedestal(0), fAutoPedestal(kFALSE)
 {
   TPCSectorData::InitStatics();
 }
@@ -101,7 +101,7 @@ void TPCData::LoadDigits(TTree* tree, Bool_t spawnSectors)
 
       if(pad != curPad) {
        if(inFill)
-         secData->EndPad();
+         secData->EndPad(fAutoPedestal, fLoadThreshold);
        secData->BeginPad(row, pad, kFALSE);
        curPad = pad;
        inFill = kTRUE;
@@ -111,7 +111,7 @@ void TPCData::LoadDigits(TTree* tree, Bool_t spawnSectors)
 
     } while (digit.Next());
     if(inFill) {
-      secData->EndPad();
+      secData->EndPad(fAutoPedestal, fLoadThreshold);
       inFill = kFALSE;
     }
   }
@@ -124,14 +124,15 @@ void TPCData::LoadRaw(AliTPCRawStream& input, Bool_t spawnSectors)
   // via CreateSector() are loaded.
   // If spawnSectors is true sectors are created if data for them is encountered.
 
-  Int_t  sector = -1, row = -1, pad = -1, rowOffset = 0;
-  Bool_t inFill = kFALSE;
+  Int_t   sector = -1, row = -1, pad = -1, rowOffset = 0;
+  Short_t time, signal;
+  Bool_t  inFill = kFALSE;
   TPCSectorData* secData = 0;
 
   while (input.Next()) {
     if (input.IsNewSector()) {
       if(inFill) {
-       secData->EndPad();
+       secData->EndPad(fAutoPedestal, fLoadThreshold);
        inFill = kFALSE;
       }
       sector = input.GetSector();
@@ -148,7 +149,7 @@ void TPCData::LoadRaw(AliTPCRawStream& input, Bool_t spawnSectors)
 
     if (input.IsNewPad()) {
       if(inFill) {
-       secData->EndPad();
+       secData->EndPad(fAutoPedestal, fLoadThreshold);
        inFill = kFALSE;
       }
       row = input.GetRow() + rowOffset;
@@ -158,12 +159,18 @@ void TPCData::LoadRaw(AliTPCRawStream& input, Bool_t spawnSectors)
       inFill = kTRUE;
     }
 
-    if(input.GetSignal() > fLoadThreshold)
-      secData->RegisterData(input.GetTime(), input.GetSignal() - fLoadPedestal);
+    time   = input.GetTime();
+    signal = input.GetSignal();
+    if(fAutoPedestal) {
+      secData->RegisterData(time, signal);
+    } else {
+      if(signal > fLoadThreshold)
+       secData->RegisterData(time, signal - fLoadPedestal);
+    }
   }
 
   if(inFill) {
-    secData->EndPad();
+    secData->EndPad(fAutoPedestal, fLoadThreshold);
     inFill = kFALSE;
   }
 }
@@ -177,14 +184,15 @@ void TPCData::LoadRaw(AliTPCRawStreamOld& input, Bool_t spawnSectors, Bool_t war
 
   static const Exc_t eH("TPCData::LoadRaw ");
 
-  Int_t  sector = -1, row = -1, pad = -1, rowOffset = 0;
-  Bool_t inFill = kFALSE;
+  Int_t   sector = -1, row = -1, pad = -1, rowOffset = 0;
+  Short_t time, signal;
+  Bool_t  inFill = kFALSE;
   TPCSectorData* secData = 0;
 
   while (input.Next()) {
     if (input.IsNewSector()) {
       if(inFill) {
-       secData->EndPad();
+       secData->EndPad(fAutoPedestal, fLoadThreshold);
        inFill = kFALSE;
       }
       sector = input.GetSector();
@@ -201,7 +209,7 @@ void TPCData::LoadRaw(AliTPCRawStreamOld& input, Bool_t spawnSectors, Bool_t war
 
     if (input.IsNewPad()) {
       if(inFill) {
-       secData->EndPad();
+       secData->EndPad(fAutoPedestal, fLoadThreshold);
        inFill = kFALSE;
       }
       row = input.GetRow() + rowOffset;
@@ -219,12 +227,18 @@ void TPCData::LoadRaw(AliTPCRawStreamOld& input, Bool_t spawnSectors, Bool_t war
       inFill = kTRUE;
     }
 
-    if(input.GetSignal() > fLoadThreshold)
-      secData->RegisterData(input.GetTime(), input.GetSignal() - fLoadPedestal);
+    time   = input.GetTime();
+    signal = input.GetSignal();
+    if(fAutoPedestal) {
+      secData->RegisterData(time, signal);
+    } else {
+      if(signal > fLoadThreshold)
+       secData->RegisterData(time, signal - fLoadPedestal);
+    }
   }
 
   if(inFill) {
-    secData->EndPad();
+    secData->EndPad(fAutoPedestal, fLoadThreshold);
     inFill = kFALSE;
   }
 }
index dafaf62..26b7372 100644 (file)
@@ -24,6 +24,7 @@ protected:
   Int_t                        fSectorBlockSize;
   Short_t                      fLoadThreshold;
   Short_t                      fLoadPedestal;
+  Bool_t                       fAutoPedestal;
 
 public:
   TPCData();
@@ -43,6 +44,9 @@ public:
   Short_t GetLoadPedestal()     const { return fLoadPedestal; }
   void    SetLoadPedestal(Short_t lp) { fLoadPedestal = lp; }
 
+  Bool_t GetAutoPedestal()     const { return fAutoPedestal; }
+  void   SetAutoPedestal(Bool_t ap)  { fAutoPedestal = ap; }
+
   void LoadDigits(TTree* tree, Bool_t spawnSectors=kTRUE);
   void LoadRaw(AliTPCRawStream&    input, Bool_t spawnSectors=kTRUE);
   void LoadRaw(AliTPCRawStreamOld& input, Bool_t spawnSectors=kTRUE, Bool_t warn=kFALSE);
index 454d5d8..4bff842 100644 (file)
@@ -193,7 +193,7 @@ void TPCSectorData::BeginPad(Int_t row, Int_t pad, Bool_t reverseTime)
   }
 }
 
-void TPCSectorData::EndPad()
+void TPCSectorData::EndPad(Bool_t autoPedestal, Short_t threshold)
 {
   Short_t *beg, *end;
   if(fCurrentStep > 0) {
@@ -203,6 +203,34 @@ void TPCSectorData::EndPad()
     beg = fPadBuffer + fCurrentPos + 2;
     end = fPadBuffer + 2048;
   }
+
+  if(autoPedestal) {
+    Short_t array[1024];
+    Short_t* val;
+    val = beg + 1;    
+    while(val <= end) {
+      array[(val-beg)/2] = *val;
+      val += 2;
+    }    
+    Short_t pedestal = TMath::Nint(TMath::Median((end-beg)/2, array));
+    val = beg + 1;
+    while(val <= end) {
+      *val -= pedestal;
+      val += 2;
+    }
+    Short_t* wpos = beg;
+    Short_t* rpos = beg;
+    while(rpos < end) {
+      if(rpos[1] > threshold) {
+       wpos[0] = rpos[0];
+       wpos[1] = rpos[1];
+       wpos += 2;
+      }
+      rpos += 2;
+    }
+    end = wpos;
+  }
+
   Short_t* wpos = beg;
   Short_t* rpos = beg;
 
index f162bbd..d43b1de 100644 (file)
@@ -153,7 +153,7 @@ public:
 
   void BeginPad(Int_t row, Int_t pad, Bool_t reverseTime=kFALSE);
   void RegisterData(Short_t time, Short_t signal);
-  void EndPad();
+  void EndPad(Bool_t autoPedestal=kFALSE, Short_t threshold=0);
 
   const PadData& GetPadData(Int_t padAddr);
   const PadData& GetPadData(Int_t row, Int_t pad);
index bd6e434..147fabe 100644 (file)
@@ -22,9 +22,10 @@ void tpc_sector_raw_test(const char *file = "",Int_t ievent = 0)
 
   x = new Alieve::TPCData;
   //x->SetSectorBlockSize(8192);
-  x->SetLoadThreshold(65);
-  x->CreateAllSectors();
-  x->LoadRaw(input, kFALSE);
+  x->SetAutoPedestal(kTRUE);
+  x->SetLoadThreshold(3);
+  //x->CreateAllSectors();
+  x->LoadRaw(input, kTRUE);
 
   gStyle->SetPalette(1, 0);