]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - PHOS/AliPHOSRawDecoder.cxx
First step towards reading of the new RCU firmware trailer. Thanks to Luciano we...
[u/mrichter/AliRoot.git] / PHOS / AliPHOSRawDecoder.cxx
... / ...
CommitLineData
1/**************************************************************************
2 * Copyright(c) 2007, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16/* $Id$ */
17
18// This class decodes the stream of ALTRO samples to extract
19// the PHOS "digits" of current event.
20//
21// Typical use case:
22// AliRawReader* rf = new AliRawReaderDate("2006run2211.raw");
23// AliPHOSRawDecoder dc(rf);
24// while (rf->NextEvent()) {
25// dc.SubtractPedestals(kTRUE);
26// while ( dc.NextDigit() ) {
27// Int_t module = dc.GetModule();
28// Int_t column = dc.GetColumn();
29// Int_t row = dc.GetRow();
30// Double_t amplitude = dc.GetEnergy();
31// Double_t time = dc.GetTime();
32// Bool_t IsLowGain = dc.IsLowGain();
33// ..........
34// }
35// }
36
37// Author: Boris Polichtchouk
38
39// --- ROOT system ---
40#include "TArrayI.h"
41
42// --- AliRoot header files ---
43#include "AliPHOSRawDecoder.h"
44#include "AliRawReader.h"
45
46ClassImp(AliPHOSRawDecoder)
47
48//-----------------------------------------------------------------------------
49AliPHOSRawDecoder::AliPHOSRawDecoder():
50 fRawReader(0),fCaloStream(0),fPedSubtract(kFALSE),fEnergy(-111),fTime(-111),fQuality(0.),
51 fModule(-1),fColumn(-1),fRow(-1),fNewModule(-1),fNewColumn(-1),fNewRow(-1),fNewAmp(0),fNewTime(0),
52 fLowGainFlag(kFALSE),fNewLowGainFlag(kFALSE),fOverflow(kFALSE),fSamples(0),fTimes(0)
53{
54 //Default constructor.
55}
56
57//-----------------------------------------------------------------------------
58AliPHOSRawDecoder::AliPHOSRawDecoder(AliRawReader* rawReader, AliAltroMapping **mapping):
59 fRawReader(0),fCaloStream(0),fPedSubtract(kFALSE),fEnergy(-111),fTime(-111),fQuality(0.),
60 fModule(-1),fColumn(-1),fRow(-1),fNewModule(-1),fNewColumn(-1),fNewRow(-1),fNewAmp(0),fNewTime(0),
61 fLowGainFlag(kFALSE),fNewLowGainFlag(kFALSE),fOverflow(kFALSE),fSamples(0),fTimes(0)
62{
63 //Construct a decoder object.
64 //Is is user responsibility to provide next raw event
65 //using AliRawReader::NextEvent().
66
67 fRawReader = rawReader;
68 fCaloStream = new AliCaloRawStream(rawReader,"PHOS",mapping);
69 fSamples = new TArrayI(100);
70 fTimes = new TArrayI(100);
71}
72
73//-----------------------------------------------------------------------------
74AliPHOSRawDecoder::~AliPHOSRawDecoder()
75{
76 //Destructor.
77
78 if(fCaloStream){ delete fCaloStream; fCaloStream=0;}
79 if(fSamples){ delete fSamples; fSamples=0 ;}
80 if(fTimes){ delete fTimes; fTimes=0 ;}
81}
82
83//-----------------------------------------------------------------------------
84AliPHOSRawDecoder::AliPHOSRawDecoder(const AliPHOSRawDecoder &phosDecoder ):
85 fRawReader(phosDecoder.fRawReader),fCaloStream(phosDecoder.fCaloStream),
86 fPedSubtract(phosDecoder.fPedSubtract),
87 fEnergy(phosDecoder.fEnergy),fTime(phosDecoder.fTime),fQuality(phosDecoder.fQuality),
88 fModule(phosDecoder.fModule),fColumn(phosDecoder.fColumn),
89 fRow(phosDecoder.fRow),fNewModule(phosDecoder.fNewModule),fNewColumn(phosDecoder.fNewColumn),
90 fNewRow(phosDecoder.fNewRow),fNewAmp(phosDecoder.fNewAmp),fNewTime(phosDecoder.fNewTime),
91 fLowGainFlag(phosDecoder.fLowGainFlag),fNewLowGainFlag(phosDecoder.fNewLowGainFlag),
92 fOverflow(phosDecoder.fOverflow),fSamples(phosDecoder.fSamples),
93 fTimes(phosDecoder.fTimes)
94{
95 //Copy constructor.
96}
97
98//-----------------------------------------------------------------------------
99AliPHOSRawDecoder& AliPHOSRawDecoder::operator = (const AliPHOSRawDecoder &phosDecode)
100{
101 //Assignment operator.
102
103 if(this != &phosDecode) {
104 fRawReader = phosDecode.fRawReader;
105
106 if(fCaloStream) delete fCaloStream;
107 fCaloStream = phosDecode.fCaloStream;
108
109 fEnergy = phosDecode.fEnergy;
110 fTime = phosDecode.fTime;
111 fQuality = phosDecode.fQuality ;
112 fModule = phosDecode.fModule;
113 fColumn = phosDecode.fColumn;
114 fRow = phosDecode.fRow;
115 fNewModule = phosDecode.fNewModule;
116 fNewColumn = phosDecode.fNewColumn;
117 fNewRow = phosDecode.fNewRow;
118 fNewAmp = phosDecode.fNewAmp ;
119 fNewTime= phosDecode.fNewTime ;
120 fLowGainFlag = phosDecode.fLowGainFlag;
121 fNewLowGainFlag = phosDecode.fNewLowGainFlag;
122 fOverflow = phosDecode.fOverflow ;
123
124 if(fSamples) delete fSamples;
125 fSamples = phosDecode.fSamples;
126
127 if(fTimes) delete fTimes;
128 fTimes = phosDecode.fTimes;
129 }
130
131 return *this;
132}
133
134//-----------------------------------------------------------------------------
135
136Bool_t AliPHOSRawDecoder::NextDigit()
137{
138 //Extract an energy deposited in the crystal,
139 //crystal' position (module,column,row),
140 //time and gain (high or low).
141
142 AliCaloRawStream* in = fCaloStream;
143
144 Int_t iBin = 0;
145 Int_t mxSmps = fSamples->GetSize();
146 Int_t tLength = 0;
147 fEnergy = -111;
148 Float_t pedMean = 0;
149 Int_t nPed = 0;
150 Float_t baseLine = 1.0;
151 const Int_t kPreSamples = 10;
152
153 fSamples->Reset();
154 while ( in->Next() ) {
155
156 if(!tLength) {
157 tLength = in->GetTimeLength();
158 if(tLength>mxSmps) {
159 fSamples->Set(tLength);
160 }
161 }
162
163 // Fit the full sample
164 if(in->IsNewHWAddress() && iBin>0) {
165
166 iBin=0;
167 //First remember new sample
168 fNewLowGainFlag = in->IsLowGain();
169 fNewModule = in->GetModule()+1;
170 fNewRow = in->GetRow() +1;
171 fNewColumn = in->GetColumn()+1;
172 fNewAmp = in->GetSignal() ;
173 fNewTime=in->GetTime() ;
174
175 // Temporarily we take the energy as a maximum amplitude
176 // and the pedestal from the 0th point (30 Aug 2006).
177 // Time is not evaluated for the moment (12.01.2007).
178 // Take is as a first time bin multiplied by the sample tick time
179
180 if(fPedSubtract)
181 if (nPed > 0)
182 fEnergy -= (Double_t)(pedMean/nPed); // pedestal subtraction
183 else
184 return kFALSE;
185 if (fEnergy < baseLine) fEnergy = 0;
186
187 pedMean = 0;
188 return kTRUE;
189 }
190
191 fLowGainFlag = in->IsLowGain();
192// fTime = in->GetTime();
193 fModule = in->GetModule()+1;
194 fRow = in->GetRow() +1;
195 fColumn = in->GetColumn()+1;
196
197 if(fLowGainFlag==fNewLowGainFlag && fModule==fNewModule &&
198 fRow==fNewRow && fColumn==fNewColumn ){
199 if(fNewAmp>fEnergy) fEnergy = (Double_t)fNewAmp ;
200 fNewModule=-1 ;
201 }
202
203 //Calculate pedestal if necessary
204 if(fPedSubtract && in->GetTime() < kPreSamples) {
205 pedMean += in->GetSignal();
206 nPed++;
207 }
208 if((Double_t)in->GetSignal() > fEnergy) fEnergy = (Double_t)in->GetSignal();
209 iBin++ ;
210
211 } // in.Next()
212
213 return kFALSE;
214}