1 /**************************************************************************
2 * Copyright(c) 2007, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 // This class decodes the stream of ALTRO samples to extract
19 // the PHOS "digits" of current event.
22 // AliRawReader* rf = new AliRawReaderDate("2006run2211.raw");
23 // AliPHOSRawDecoder dc(rf);
24 // while (rf->NextEvent()) {
25 // dc.SetOldRCUFormat(kTRUE);
26 // dc.SubtractPedestals(kTRUE);
27 // while ( dc.NextDigit() ) {
28 // Int_t module = dc.GetModule();
29 // Int_t column = dc.GetColumn();
30 // Int_t row = dc.GetRow();
31 // Double_t amplitude = dc.GetEnergy();
32 // Double_t time = dc.GetTime();
33 // Bool_t IsLowGain = dc.IsLowGain();
38 // Author: Boris Polichtchouk
40 // --- ROOT system ---
43 // --- AliRoot header files ---
44 #include "AliPHOSRawDecoder.h"
45 #include "AliPHOSPulseGenerator.h"
47 ClassImp(AliPHOSRawDecoder)
49 //-----------------------------------------------------------------------------
50 AliPHOSRawDecoder::AliPHOSRawDecoder():
51 fRawReader(0),fCaloStream(0),fPedSubtract(kFALSE),fEnergy(-111),fTime(-111),fModule(-1),fColumn(-1),fRow(-1),fLowGainFlag(kFALSE),fSamples(0),fPulseGenerator(0)
53 //Default constructor.
56 //-----------------------------------------------------------------------------
57 AliPHOSRawDecoder::AliPHOSRawDecoder(AliRawReader* rawReader, AliAltroMapping **mapping):
58 fRawReader(0),fCaloStream(0),fPedSubtract(kFALSE),fEnergy(-111),fTime(-111),fModule(-1),fColumn(-1),fRow(-1),fLowGainFlag(kFALSE),fSamples(0),fPulseGenerator(0)
60 //Construct a decoder object.
61 //Is is user responsibility to provide next raw event
62 //using AliRawReader::NextEvent().
64 fRawReader = rawReader;
65 fCaloStream = new AliCaloRawStream(rawReader,"PHOS",mapping);
66 fCaloStream->SetOldRCUFormat(kFALSE);
67 fSamples = new TArrayI(100);
68 fPulseGenerator = new AliPHOSPulseGenerator();
71 //-----------------------------------------------------------------------------
72 AliPHOSRawDecoder::~AliPHOSRawDecoder()
76 if(fCaloStream) delete fCaloStream;
77 if(fSamples) delete fSamples;
78 if(fPulseGenerator) delete fPulseGenerator;
81 //-----------------------------------------------------------------------------
82 AliPHOSRawDecoder::AliPHOSRawDecoder(const AliPHOSRawDecoder &phosDecoder ):
83 fRawReader(phosDecoder.fRawReader),fCaloStream(phosDecoder.fCaloStream),
84 fPedSubtract(phosDecoder.fPedSubtract),
85 fEnergy(phosDecoder.fEnergy),fTime(phosDecoder.fTime),
86 fModule(phosDecoder.fModule),fColumn(phosDecoder.fColumn),
87 fRow(phosDecoder.fRow),fLowGainFlag(phosDecoder.fLowGainFlag),
88 fSamples(phosDecoder.fSamples),
89 fPulseGenerator(phosDecoder.fPulseGenerator)
94 //-----------------------------------------------------------------------------
95 AliPHOSRawDecoder& AliPHOSRawDecoder::operator = (const AliPHOSRawDecoder &phosDecode)
97 //Assignment operator.
99 if(this != &phosDecode) {
100 fRawReader = phosDecode.fRawReader;
102 if(fCaloStream) delete fCaloStream;
103 fCaloStream = phosDecode.fCaloStream;
105 fEnergy = phosDecode.fEnergy;
106 fTime = phosDecode.fTime;
107 fModule = phosDecode.fModule;
108 fColumn = phosDecode.fColumn;
109 fRow = phosDecode.fRow;
110 fLowGainFlag = phosDecode.fLowGainFlag;
112 if(fSamples) delete fSamples;
113 fSamples = phosDecode.fSamples;
115 if(fPulseGenerator) delete fPulseGenerator;
116 fPulseGenerator = phosDecode.fPulseGenerator;
122 //-----------------------------------------------------------------------------
124 Bool_t AliPHOSRawDecoder::NextDigit()
126 //Extract an energy deposited in the crystal,
127 //crystal' position (module,column,row),
128 //time and gain (high or low).
130 AliCaloRawStream* in = fCaloStream;
133 Int_t mxSmps = fSamples->GetSize();
138 Float_t baseLine = 1.0;
139 const Float_t nPreSamples = 10;
142 while ( in->Next() ) {
145 tLength = in->GetTimeLength();
147 fSamples->Set(tLength);
151 // Fit the full sample
152 if(in->IsNewHWAddress() && iBin>0) {
156 // Temporarily we take the energy as a maximum amplitude
157 // and the pedestal from the 0th point (30 Aug 2006).
158 // Time is not evaluated for the moment (12.01.2007).
159 // Take is as a first time bin multiplied by the sample tick time
163 fEnergy -= (Double_t)(pedMean/nPed); // pedestal subtraction
168 fEnergy *= fPulseGenerator->GetRawFormatHighLowGainFactor(); // *16
170 if (fEnergy < baseLine) fEnergy = 0;
176 fLowGainFlag = in->IsLowGain();
177 fTime = fPulseGenerator->GetRawFormatTimeTrigger() * in->GetTime();
178 fModule = in->GetModule()+1;
179 fRow = in->GetRow() +1;
180 fColumn = in->GetColumn()+1;
182 // Fill array with samples
184 if(tLength-iBin < nPreSamples) {
185 pedMean += in->GetSignal();
188 fSamples->AddAt(in->GetSignal(),tLength-iBin);
189 if((Double_t)in->GetSignal() > fEnergy) fEnergy = (Double_t)in->GetSignal();