Class to produce PHOS digits from raw data stream.
authorpolicheh <policheh@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 2 Feb 2007 14:41:24 +0000 (14:41 +0000)
committerpolicheh <policheh@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 2 Feb 2007 14:41:24 +0000 (14:41 +0000)
PHOS/AliPHOSRawDigiProducer.cxx [new file with mode: 0644]
PHOS/AliPHOSRawDigiProducer.h [new file with mode: 0644]
PHOS/PHOSbaseLinkDef.h
PHOS/libPHOSbase.pkg

diff --git a/PHOS/AliPHOSRawDigiProducer.cxx b/PHOS/AliPHOSRawDigiProducer.cxx
new file mode 100644 (file)
index 0000000..a3e60e7
--- /dev/null
@@ -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<AliPHOSDigit*>(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<AliPHOSDigit*>(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 (file)
index 0000000..eda2a0f
--- /dev/null
@@ -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
index 8ce8d69..808b824 100644 (file)
@@ -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
index 3bd306c..4eda387 100644 (file)
@@ -14,7 +14,8 @@ SRCS          =  AliPHOS.cxx \
                  AliPHOSCpvCalibData.cxx \
                  AliPHOSEmcCalibData.cxx \
                 AliPHOSPulseGenerator.cxx \
-                AliPHOSRawDecoder.cxx
+                AliPHOSRawDecoder.cxx \
+                AliPHOSRawDigiProducer.cxx
 
 HDRS:= $(SRCS:.cxx=.h)