Added hit distributions from all events from MC and data in preparation for sharing...
[u/mrichter/AliRoot.git] / PHOS / AliPHOSRawFitterv0.cxx
CommitLineData
379c5c09 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 extracts the signal parameters (energy, time, quality)
19// from ALTRO samples. Energy is in ADC counts, time is in time bin units.
20// A coarse algorithm takes the energy as the maximum
21// sample, time is the first sample index, and the quality is the number
22// of bunches in the signal.
23//
24// AliPHOSRawFitterv0 *fitterv0=new AliPHOSRawFitterv0();
379c5c09 25// fitterv0->SetChannelGeo(module,cellX,cellZ,caloFlag);
26// fitterv0->SetCalibData(fgCalibData) ;
1dfadc32 27// fitterv0->Eval(sig,sigStart,sigLength);
379c5c09 28// Double_t amplitude = fitterv0.GetEnergy();
29// Double_t time = fitterv0.GetTime();
30// Bool_t isLowGain = fitterv0.GetCaloFlag()==0;
31
32// Author: Yuri Kharlov
33
34// --- ROOT system ---
35#include "TArrayI.h"
36#include "TMath.h"
37#include "TObject.h"
38
39// --- AliRoot header files ---
40#include "AliPHOSRawFitterv0.h"
41#include "AliPHOSCalibData.h"
42#include "AliLog.h"
43
44ClassImp(AliPHOSRawFitterv0)
45
46//-----------------------------------------------------------------------------
47AliPHOSRawFitterv0::AliPHOSRawFitterv0():
48 TObject(),
379c5c09 49 fModule(0),
50 fCellX(0),
51 fCellZ(0),
52 fCaloFlag(0),
379c5c09 53 fNBunches(0),
54 fPedSubtract(kFALSE),
55 fEnergy(-111),
56 fTime(-111),
57 fQuality(0.),
58 fPedestalRMS(0.),
59 fAmpOffset(0),
60 fAmpThreshold(0),
61 fOverflow(kFALSE),
62 fCalibData(0)
63{
64 //Default constructor
65}
66
67//-----------------------------------------------------------------------------
68AliPHOSRawFitterv0::~AliPHOSRawFitterv0()
69{
70 //Destructor
379c5c09 71}
72
73//-----------------------------------------------------------------------------
74AliPHOSRawFitterv0::AliPHOSRawFitterv0(const AliPHOSRawFitterv0 &phosFitter ):
75 TObject(),
379c5c09 76 fModule (phosFitter.fModule),
77 fCellX (phosFitter.fCellX),
78 fCellZ (phosFitter.fCellZ),
79 fCaloFlag (phosFitter.fCaloFlag),
379c5c09 80 fNBunches (phosFitter.fNBunches),
81 fPedSubtract (phosFitter.fPedSubtract),
82 fEnergy (phosFitter.fEnergy),
83 fTime (phosFitter.fTime),
84 fQuality (phosFitter.fQuality),
85 fPedestalRMS (phosFitter.fPedestalRMS),
86 fAmpOffset (phosFitter.fAmpOffset),
87 fAmpThreshold(phosFitter.fAmpThreshold),
88 fOverflow (phosFitter.fOverflow),
89 fCalibData (phosFitter.fCalibData)
90{
91 //Copy constructor
92}
93
94//-----------------------------------------------------------------------------
95AliPHOSRawFitterv0& AliPHOSRawFitterv0::operator = (const AliPHOSRawFitterv0 &phosFitter)
96{
97 //Assignment operator.
98
99 if(this != &phosFitter) {
379c5c09 100 fModule = phosFitter.fModule;
101 fCellX = phosFitter.fCellX;
102 fCellZ = phosFitter.fCellZ;
103 fCaloFlag = phosFitter.fCaloFlag;
379c5c09 104 fNBunches = phosFitter.fNBunches;
105 fPedSubtract = phosFitter.fPedSubtract;
106 fEnergy = phosFitter.fEnergy;
107 fTime = phosFitter.fTime;
108 fQuality = phosFitter.fQuality;
109 fPedestalRMS = phosFitter.fPedestalRMS;
110 fAmpOffset = phosFitter.fAmpOffset;
111 fAmpThreshold = phosFitter.fAmpThreshold;
112 fOverflow = phosFitter.fOverflow;
113 fCalibData = phosFitter.fCalibData;
114 }
115
116 return *this;
117}
118
119//-----------------------------------------------------------------------------
120
379c5c09 121void AliPHOSRawFitterv0::SetChannelGeo(const Int_t module, const Int_t cellX,
122 const Int_t cellZ, const Int_t caloFlag)
123{
124 // Set geometry address of the channel
125 // (for a case if fitting parameters are different for different channels)
126
127 fModule = module;
128 fCellX = cellX;
129 fCellZ = cellZ;
130 fCaloFlag = caloFlag;
131}
132//-----------------------------------------------------------------------------
133
35b0707e 134Bool_t AliPHOSRawFitterv0::Eval(const UShort_t *signal, Int_t /*sigStart*/, Int_t sigLength)
379c5c09 135{
136 // Calculate signal parameters (energy, time, quality) from array of samples
137 // Energy is a maximum sample minus pedestal 9
138 // Time is the first time bin
139 // Signal overflows is there are at least 3 samples of the same amplitude above 900
140
141 fEnergy = 0;
142 if (fNBunches > 1) {
143 fQuality = 1000;
144 return kTRUE;
145 }
146
147 const Float_t kBaseLine = 1.0;
148 const Int_t kPreSamples = 10;
149
150 Float_t pedMean = 0;
151 Float_t pedRMS = 0;
152 Int_t nPed = 0;
153 UShort_t maxSample = 0;
154 Int_t nMax = 0;
155
92236b27 156 for (Int_t i=0; i<sigLength; i++) {
379c5c09 157 if (i<kPreSamples) {
158 nPed++;
92236b27 159 pedMean += signal[i];
160 pedRMS += signal[i]*signal[i] ;
379c5c09 161 }
92236b27 162 if(signal[i] > maxSample) maxSample = signal[i];
163 if(signal[i] == maxSample) nMax++;
a85e6165 164
165 if(fPedSubtract) {
92236b27 166 if( (signal[i]-(Float_t)(pedMean/nPed)) >kBaseLine ) fTime = (Double_t)i;
a85e6165 167 }
168 else //ZS
92236b27 169 if( (signal[i]-(Float_t)fAmpOffset ) >kBaseLine ) fTime = (Double_t)i;
379c5c09 170 }
35b0707e 171// fTime += sigStart;
a85e6165 172
379c5c09 173 fEnergy = (Double_t)maxSample;
174 if (maxSample > 900 && nMax > 2) fOverflow = kTRUE;
175
176 if (fPedSubtract) {
177 if (nPed > 0) {
178 fPedestalRMS=(pedRMS - pedMean*pedMean/nPed)/nPed ;
179 if(fPedestalRMS > 0.)
180 fPedestalRMS = TMath::Sqrt(fPedestalRMS) ;
181 fEnergy -= (Double_t)(pedMean/nPed); // pedestal subtraction
182 }
183 else
184 return kFALSE;
185 }
186 else {
187 //take pedestals from DB
188 Double_t pedestal = (Double_t) fAmpOffset ;
189 if (fCalibData) {
190 Float_t truePed = fCalibData->GetADCpedestalEmc(fModule, fCellZ, fCellX) ;
191 Int_t altroSettings = fCalibData->GetAltroOffsetEmc(fModule, fCellZ, fCellX) ;
192 pedestal += truePed - altroSettings ;
193 }
194 else{
195 AliWarning(Form("Can not read data from OCDB")) ;
196 }
197 fEnergy-=pedestal ;
198 }
199 if (fEnergy < kBaseLine) fEnergy = 0;
200
201 return kTRUE;
202
203}