]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PHOS/AliPHOSRawDecoder.cxx
Changing fabs into TMath::Abs
[u/mrichter/AliRoot.git] / PHOS / AliPHOSRawDecoder.cxx
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
46 ClassImp(AliPHOSRawDecoder)
47
48 //-----------------------------------------------------------------------------
49 AliPHOSRawDecoder::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 //-----------------------------------------------------------------------------
58 AliPHOSRawDecoder::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 //-----------------------------------------------------------------------------
74 AliPHOSRawDecoder::~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 //-----------------------------------------------------------------------------
84 AliPHOSRawDecoder::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 //-----------------------------------------------------------------------------
99 AliPHOSRawDecoder& 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
136 Bool_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 }