]> git.uio.no Git - u/mrichter/AliRoot.git/blame - RALICE/icepack/IceCalibrate.cxx
Scaling parameter as in AliMUONConstants.cxx
[u/mrichter/AliRoot.git] / RALICE / icepack / IceCalibrate.cxx
CommitLineData
a4b77ddf 1/*******************************************************************************
2 * Copyright(c) 2003, IceCube Experiment at the South Pole. All rights reserved.
3 *
4 * Author: The IceCube RALICE-based Offline 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.
12 * The authors make no claims about the suitability of this software for
13 * any purpose. It is provided "as is" without express or implied warranty.
14 *******************************************************************************/
15
16// $Id$
17
18///////////////////////////////////////////////////////////////////////////
19// Class IceCalibrate
20// TTask derived class to perform the various calibrations.
21//
22// This task takes the current event in memory and uses the attached
23// OM database to access the various calibration functions.
24// A specific OM database may be attached by means of the SetOMdbase()
25// or SetCalibFile() memberfunctions.
26// Further details about the OM database can be found in the docs
27// of IceCal2Root.
28//
29// In the calibration procedure, all event data in memory is scanned and
30// replaced by calibrated data if a calibration function is present.
31// When data is succesfully calibrated, the corresponding de-calibration
32// function is stored in the event data at the appropriate place to allow
33// access to uncalibrated data as well (see AliSignal::GetSignal for
34// further details).
35// When the input event in memory already contained calibrated data
36// (i.e. de-calibration functions are present in the event data), the event
37// data is first de-calibrated (using the corresponding de-calibration functions
38// contained in the event data) before the new calibration is performed.
39// In case no corresponding calibration function is present, the calibration
40// of those specific data will not be performed.
41// This implies that running this task on calibrated data without having
42// attached an OM database, will result in fully de-calibrated data.
43// In case an OM slot was flagged as bad in the OM database, this flag
44// will be copied into the event data for the corresponding OM.
45//
46//--- Author: Nick van Eijndhoven 18-sep-2005 Utrecht University
47//- Modified: NvE $Date$ Utrecht University
48///////////////////////////////////////////////////////////////////////////
49
50#include "IceCalibrate.h"
51#include "Riostream.h"
52
53ClassImp(IceCalibrate) // Class implementation to enable ROOT I/O
54
55IceCalibrate::IceCalibrate(const char* name,const char* title) : TTask(name,title)
56{
57// Default constructor.
58 fCalfile=0;
59 fOmdb=0;
60}
61///////////////////////////////////////////////////////////////////////////
62IceCalibrate::~IceCalibrate()
63{
64// Default destructor.
65 if (fCalfile)
66 {
67 delete fCalfile;
68 fCalfile=0;
69 }
70}
71///////////////////////////////////////////////////////////////////////////
72void IceCalibrate::SetOMdbase(AliObjMatrix* omdb)
73{
74// Set the pointer to the OM database.
75// Note : this will overrule a previously attached database.
76 fOmdb=omdb;
77}
78///////////////////////////////////////////////////////////////////////////
79void IceCalibrate::SetCalibFile(TString name)
80{
81// Set the calibration ROOT file as created with IceCal2Root.
82// Note : this will overrule a previously attached database.
83 fCalfile=new TFile(name.Data());
84 if (fCalfile)
85 {
27e6d856 86 fOmdb=(AliObjMatrix*)fCalfile->Get("Cal-OMDBASE");
a4b77ddf 87 }
88}
89///////////////////////////////////////////////////////////////////////////
90void IceCalibrate::Exec(Option_t* opt)
91{
92// Implementation of the various calibration procedures.
93
94 TString name=opt;
95 AliJob* parent=(AliJob*)(gROOT->GetListOfTasks()->FindObject(name.Data()));
96
97 if (!parent) return;
98
99 IceEvent* evt=(IceEvent*)parent->GetObject("IceEvent");
100 if (!evt) return;
101
69884331 102 // All OMs with a signal
103 TObjArray* mods=evt->GetDevices("IceGOM");
104
105 Int_t nmods=mods->GetEntries();
106 if (!nmods) return;
107
a4b77ddf 108 IceGOM* ome=0; // The event OM pointer
109 IceGOM* omd=0; // The database OM pointer
110 Int_t id=0;
111 Float_t sig=0;
112 Float_t sigc=0;
113 TF1* fcal=0;
114 TF1* fdecal=0;
115
69884331 116 for (Int_t imod=0; imod<nmods; imod++)
a4b77ddf 117 {
69884331 118 ome=(IceGOM*)mods->At(imod);
a4b77ddf 119 if (!ome) continue;
120
121 id=ome->GetUniqueID();
122
123 omd=0;
124 if (fOmdb) omd=(IceGOM*)fOmdb->GetObject(id,1);
125
126 // Set global OM constants
127 if (omd)
128 {
e51b7d1a 129 ome->SetPosition((Ali3Vector&)omd->GetPosition());
a4b77ddf 130 for (Int_t isd=4; isd<17; isd++)
131 {
132 ome->SetSignal(omd->GetSignal(isd),isd);
133 }
134 }
135 else
136 {
137 for (Int_t ise=8; ise<17; ise++)
138 {
139 ome->SetSignal(0,ise);
140 }
141 ome->SetSignal(1,8);
142 ome->SetSignal(1,12);
143 ome->SetSignal(1,15);
144 }
145
146 // Make signals of bad modules available
147 ome->SetAlive("ADC");
148 ome->SetAlive("LE");
149 ome->SetAlive("TOT");
150
151 // (De)calibrate all hit signals for this OM
152 for (Int_t ithit=1; ithit<=ome->GetNhits(); ithit++)
153 {
154 AliSignal* sx=ome->GetHit(ithit);
155 if (!sx) continue;
156
157 // ADC (de)calibration
158 sig=sx->GetSignal("ADC",-7); // Get uncalibrated signal
159 fcal=0;
160 fdecal=0;
161 if (omd)
162 {
163 fcal=omd->GetCalFunction("ADC");
164 fdecal=omd->GetDecalFunction("ADC");
165 }
166 if (fcal) // Store calibrated signal
167 {
168 sigc=fcal->Eval(sig);
169 sx->SetSignal(sigc,"ADC");
170 ome->SetCalFunction(0,"ADC");
171 ome->SetDecalFunction(fdecal,"ADC");
172 }
173 else // Store uncalibrated signal
174 {
175 sx->SetSignal(sig,"ADC");
176 ome->SetCalFunction(fcal,"ADC");
177 ome->SetDecalFunction(0,"ADC");
178 }
179
180 // LE (TDC) (de)calibration
181 sig=sx->GetSignal("LE",-7); // Get uncalibrated signal
182 fcal=0;
183 fdecal=0;
184 if (omd)
185 {
186 fcal=omd->GetCalFunction("LE");
187 fdecal=omd->GetDecalFunction("LE");
188 }
189 // Store the ADC independent (de)calibration function in the OM
190 if (fcal)
191 {
192 ome->SetCalFunction(0,"LE");
193 ome->SetDecalFunction(fdecal,"LE");
194 }
195 else
196 {
197 ome->SetCalFunction(fcal,"LE");
198 ome->SetDecalFunction(0,"LE");
199 }
200 // Store the hit-specific ADC dependent (de)calibration function in the hit itself
201 sx->SetCalFunction(fcal,"LE");
202 sx->SetDecalFunction(fdecal,"LE");
203 fcal=sx->GetCalFunction("LE");
204 fdecal=sx->GetDecalFunction("LE");
205 sigc=sx->GetSignal("ADC",-7);
206 if (sigc>0)
207 {
208 if (fcal) fcal->SetParameter(3,sigc);
209 if (fdecal) fdecal->SetParameter(3,sigc);
210 }
211 else
212 {
213 if (fcal) fcal->SetParameter(3,1.e20);
214 if (fdecal) fdecal->SetParameter(3,1.e20);
215 }
216 if (fcal) // Store calibrated signal
217 {
218 sigc=fcal->Eval(sig);
219 sx->SetSignal(sigc,"LE");
220 sx->SetCalFunction(0,"LE");
221 sx->SetDecalFunction(fdecal,"LE");
222 }
223 else // Store uncalibrated signal
224 {
225 sx->SetSignal(sig,"LE");
226 sx->SetCalFunction(fcal,"LE");
227 sx->SetDecalFunction(0,"LE");
228 }
229
230 // TOT (de)calibration
231 sig=sx->GetSignal("TOT",-7); // Get uncalibrated signal
232 fcal=0;
233 fdecal=0;
234 if (omd)
235 {
236 fcal=omd->GetCalFunction("TOT");
237 fdecal=omd->GetDecalFunction("TOT");
238 }
239 if (fcal) // Store calibrated signal
240 {
241 sigc=fcal->Eval(sig);
242 sx->SetSignal(sigc,"TOT");
243 ome->SetCalFunction(0,"TOT");
244 ome->SetDecalFunction(fdecal,"TOT");
245 }
246 else // Store uncalibrated signal
247 {
248 sx->SetSignal(sig,"TOT");
249 ome->SetCalFunction(fcal,"TOT");
250 ome->SetDecalFunction(0,"TOT");
251 }
252 }
253
254 if (omd)
255 {
256 if (omd->GetDeadValue("ADC")) ome->SetDead("ADC");
257 if (omd->GetDeadValue("LE")) ome->SetDead("LE");
258 if (omd->GetDeadValue("TOT")) ome->SetDead("TOT");
259 }
260 }
261}
262///////////////////////////////////////////////////////////////////////////