]>
Commit | Line | Data |
---|---|---|
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 | ||
53 | ClassImp(IceCalibrate) // Class implementation to enable ROOT I/O | |
54 | ||
55 | IceCalibrate::IceCalibrate(const char* name,const char* title) : TTask(name,title) | |
56 | { | |
57 | // Default constructor. | |
58 | fCalfile=0; | |
59 | fOmdb=0; | |
60 | } | |
61 | /////////////////////////////////////////////////////////////////////////// | |
62 | IceCalibrate::~IceCalibrate() | |
63 | { | |
64 | // Default destructor. | |
65 | if (fCalfile) | |
66 | { | |
67 | delete fCalfile; | |
68 | fCalfile=0; | |
69 | } | |
70 | } | |
71 | /////////////////////////////////////////////////////////////////////////// | |
72 | void 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 | /////////////////////////////////////////////////////////////////////////// | |
79 | void 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 | /////////////////////////////////////////////////////////////////////////// | |
90 | void 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 | /////////////////////////////////////////////////////////////////////////// |