From 88fb5e505d50cb40c46ef32b8833191ed104bea9 Mon Sep 17 00:00:00 2001 From: policheh Date: Fri, 2 Feb 2007 14:41:24 +0000 Subject: [PATCH] Class to produce PHOS digits from raw data stream. --- PHOS/AliPHOSRawDigiProducer.cxx | 74 +++++++++++++++++++++++++++++++++ PHOS/AliPHOSRawDigiProducer.h | 20 +++++++++ PHOS/PHOSbaseLinkDef.h | 1 + PHOS/libPHOSbase.pkg | 3 +- 4 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 PHOS/AliPHOSRawDigiProducer.cxx create mode 100644 PHOS/AliPHOSRawDigiProducer.h diff --git a/PHOS/AliPHOSRawDigiProducer.cxx b/PHOS/AliPHOSRawDigiProducer.cxx new file mode 100644 index 00000000000..a3e60e7f325 --- /dev/null +++ b/PHOS/AliPHOSRawDigiProducer.cxx @@ -0,0 +1,74 @@ +#include "TClonesArray.h" + +#include "AliPHOSRawDigiProducer.h" +#include "AliPHOSRawDecoder.h" +#include "AliPHOSGeometry.h" +#include "AliPHOSDigit.h" + +ClassImp(AliPHOSRawDigiProducer) + +void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawDecoder* decoder) +{ + digits->Clear(); + + AliPHOSGeometry* geo = AliPHOSGeometry::GetInstance(); + if(!geo) geo = AliPHOSGeometry::GetInstance("IHEP"); + + Int_t iDigit = 0 ; + Double_t time = 0. ; + Int_t iOldDigit; + Bool_t seen,lowGainFlag; + Int_t relId[4], absId =0; + + while (decoder->NextDigit()) { + + lowGainFlag = decoder->IsLowGain(); + time = decoder->GetTime(); + + relId[0] = decoder->GetModule(); + relId[1] = 0; + relId[2] = decoder->GetRow(); + relId[3] = decoder->GetColumn(); + geo->RelToAbsNumbering(relId, absId); + + // Add low gain digit only + //if the high gain digit does not exist in the digits array + + seen = kFALSE; + + if(lowGainFlag) { + for (iOldDigit=iDigit-1; iOldDigit>=0; iOldDigit--) { + if ((dynamic_cast(digits->At(iOldDigit)))->GetId() == absId) { + seen = kTRUE; + break; + } + } + if (!seen) { + new((*digits)[iDigit]) AliPHOSDigit(-1,absId,(Float_t)decoder->GetEnergy(),time); + iDigit++; + } + } + + // Add high gain digit only if it is not saturated; + // replace low gain digit by a high gain one + else { + if (decoder->GetEnergy() >= 1023) continue; + for (iOldDigit=iDigit-1; iOldDigit>=0; iOldDigit--) { + if ((dynamic_cast(digits->At(iOldDigit)))->GetId() == absId) { + digits->RemoveAt(iOldDigit); + new((*digits)[iOldDigit]) AliPHOSDigit(-1,absId,(Float_t)decoder->GetEnergy(),time); + seen = kTRUE; + break; + } + } + if (!seen) { + new((*digits)[iDigit]) AliPHOSDigit(-1,absId,(Float_t)decoder->GetEnergy(),time); + iDigit++; + } + } + + } + + digits->Compress(); + digits->Sort(); +} diff --git a/PHOS/AliPHOSRawDigiProducer.h b/PHOS/AliPHOSRawDigiProducer.h new file mode 100644 index 00000000000..eda2a0fef88 --- /dev/null +++ b/PHOS/AliPHOSRawDigiProducer.h @@ -0,0 +1,20 @@ +#ifndef ALIPHOSRAWDIGIPRODUCER_H +#define ALIPHOSRAWDIGIPRODUCER_H + +class AliPHOSRawDecoder; + +class AliPHOSRawDigiProducer { + +public: + + AliPHOSRawDigiProducer() {} + AliPHOSRawDigiProducer(const AliPHOSRawDigiProducer& ); + AliPHOSRawDigiProducer& operator = (const AliPHOSRawDigiProducer& ); + virtual ~AliPHOSRawDigiProducer() {} + + virtual void MakeDigits(TClonesArray *digits, AliPHOSRawDecoder* decoder); + + ClassDef(AliPHOSRawDigiProducer,1) +}; + +#endif diff --git a/PHOS/PHOSbaseLinkDef.h b/PHOS/PHOSbaseLinkDef.h index 8ce8d693ca7..808b82454fe 100644 --- a/PHOS/PHOSbaseLinkDef.h +++ b/PHOS/PHOSbaseLinkDef.h @@ -28,5 +28,6 @@ #pragma link C++ class AliPHOSEmcCalibData+; #pragma link C++ class AliPHOSPulseGenerator+; #pragma link C++ class AliPHOSRawDecoder+; +#pragma link C++ class AliPHOSRawDigiProducer+; #endif diff --git a/PHOS/libPHOSbase.pkg b/PHOS/libPHOSbase.pkg index 3bd306cb453..4eda387ccc9 100644 --- a/PHOS/libPHOSbase.pkg +++ b/PHOS/libPHOSbase.pkg @@ -14,7 +14,8 @@ SRCS = AliPHOS.cxx \ AliPHOSCpvCalibData.cxx \ AliPHOSEmcCalibData.cxx \ AliPHOSPulseGenerator.cxx \ - AliPHOSRawDecoder.cxx + AliPHOSRawDecoder.cxx \ + AliPHOSRawDigiProducer.cxx HDRS:= $(SRCS:.cxx=.h) -- 2.39.3