From d6433e5d71afaf2247f9ea41d28a8712d324b6f6 Mon Sep 17 00:00:00 2001 From: mtadel Date: Fri, 19 May 2006 13:52:18 +0000 Subject: [PATCH] Support for automatic pedestal estimation per pad (Marian and Matevz). --- EVE/Alieve/TPCData.cxx | 48 +++++++++++++++++---------- EVE/Alieve/TPCData.h | 4 +++ EVE/Alieve/TPCSectorData.cxx | 30 ++++++++++++++++- EVE/Alieve/TPCSectorData.h | 2 +- EVE/test-macros/tpc_sector_raw_test.C | 7 ++-- 5 files changed, 69 insertions(+), 22 deletions(-) diff --git a/EVE/Alieve/TPCData.cxx b/EVE/Alieve/TPCData.cxx index 77ad4b79e57..c17b8b899c9 100644 --- a/EVE/Alieve/TPCData.cxx +++ b/EVE/Alieve/TPCData.cxx @@ -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; } } diff --git a/EVE/Alieve/TPCData.h b/EVE/Alieve/TPCData.h index dafaf624547..26b7372715e 100644 --- a/EVE/Alieve/TPCData.h +++ b/EVE/Alieve/TPCData.h @@ -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); diff --git a/EVE/Alieve/TPCSectorData.cxx b/EVE/Alieve/TPCSectorData.cxx index 454d5d886a3..4bff842117a 100644 --- a/EVE/Alieve/TPCSectorData.cxx +++ b/EVE/Alieve/TPCSectorData.cxx @@ -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; diff --git a/EVE/Alieve/TPCSectorData.h b/EVE/Alieve/TPCSectorData.h index f162bbd8a72..d43b1de61df 100644 --- a/EVE/Alieve/TPCSectorData.h +++ b/EVE/Alieve/TPCSectorData.h @@ -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); diff --git a/EVE/test-macros/tpc_sector_raw_test.C b/EVE/test-macros/tpc_sector_raw_test.C index bd6e434559d..147fabea5b8 100644 --- a/EVE/test-macros/tpc_sector_raw_test.C +++ b/EVE/test-macros/tpc_sector_raw_test.C @@ -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); -- 2.39.3