1 /*******************************************************************************
2 * Copyright(c) 2003, IceCube Experiment at the South Pole. All rights reserved.
4 * Author: The IceCube RALICE-based Offline Project.
5 * Contributors are mentioned in the code where appropriate.
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 *******************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////
20 // TTask derived class to perform the various calibrations.
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
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
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.
46 // Information about the actual parameter settings can be found in the event
47 // structure itself via the device named "IceCalibrate".
49 //--- Author: Nick van Eijndhoven 18-sep-2005 Utrecht University
50 //- Modified: NvE $Date$ Utrecht University
51 ///////////////////////////////////////////////////////////////////////////
53 #include "IceCalibrate.h"
54 #include "Riostream.h"
56 ClassImp(IceCalibrate) // Class implementation to enable ROOT I/O
58 IceCalibrate::IceCalibrate(const char* name,const char* title) : TTask(name,title)
60 // Default constructor.
64 ///////////////////////////////////////////////////////////////////////////
65 IceCalibrate::~IceCalibrate()
67 // Default destructor.
74 ///////////////////////////////////////////////////////////////////////////
75 void IceCalibrate::SetOMdbase(AliObjMatrix* omdb)
77 // Set the pointer to the OM database.
78 // Note : this will overrule a previously attached database.
81 ///////////////////////////////////////////////////////////////////////////
82 void IceCalibrate::SetCalibFile(TString name)
84 // Set the calibration ROOT file as created with IceCal2Root.
85 // Note : this will overrule a previously attached database.
91 fCalfile=new TFile(name.Data());
94 ///////////////////////////////////////////////////////////////////////////
95 void IceCalibrate::Exec(Option_t* opt)
97 // Implementation of the various calibration procedures.
100 AliJob* parent=(AliJob*)(gROOT->GetListOfTasks()->FindObject(name.Data()));
104 IceEvent* evt=(IceEvent*)parent->GetObject("IceEvent");
109 AliSignal* daq=(AliSignal*)evt->GetDevice("Daq");
110 mudaq=int(daq->GetSignal("Muon"));
111 twrdaq=int(daq->GetSignal("TWR"));
113 if (!fOmdb && fCalfile)
117 fOmdb=(AliObjMatrix*)fCalfile->Get("MuDaq-OMDBASE");
118 // Next statement for compatibility with old calibration file format
119 if (!fOmdb) fOmdb=(AliObjMatrix*)fCalfile->Get("Cal-OMDBASE");
121 if (twrdaq) fOmdb=(AliObjMatrix*)fCalfile->Get("TWRDaq-OMDBASE");
124 // Storage of the used parameters in the IceCalibrate device
126 params.SetNameTitle("IceCalibrate","IceCalibrate processor parameters");
127 params.SetSlotName("Omdb",1);
129 if (fOmdb) params.SetSignal(1,1);
131 evt->AddDevice(params);
133 // All OMs with a signal
134 TObjArray* mods=evt->GetDevices("IceGOM");
136 Int_t nmods=mods->GetEntries();
139 IceGOM* ome=0; // The event OM pointer
140 IceGOM* omd=0; // The database OM pointer
142 Float_t adc=0,le=0,tot=0; // Uncalibrated values
143 Float_t cadc=0,cle=0,ctot=0; // Calibrated values
148 for (Int_t imod=0; imod<nmods; imod++)
150 ome=(IceGOM*)mods->At(imod);
153 id=ome->GetUniqueID();
156 if (fOmdb) omd=(IceGOM*)fOmdb->GetObject(id,1);
158 // Set global OM constants
161 ome->SetPosition((Ali3Vector&)omd->GetPosition());
162 for (Int_t ind=1; ind<=omd->GetNnames(); ind++)
164 slotname=omd->GetSlotName(ind);
165 ome->AddNamedSlot(slotname);
167 for (Int_t isd=1; isd<=omd->GetNvalues(); isd++)
169 ome->SetSignal(omd->GetSignal(isd),omd->GetSlotName(isd));
173 // Make signals of bad modules available
174 ome->SetAlive("ADC");
176 ome->SetAlive("TOT");
178 // (De)calibrate all hit signals for this OM
179 for (Int_t ithit=1; ithit<=ome->GetNhits(); ithit++)
181 AliSignal* sx=ome->GetHit(ithit);
184 // ADC (de)calibration
185 adc=sx->GetSignal("ADC",-7); // Get uncalibrated signal
190 fcal=omd->GetCalFunction("ADC");
191 fdecal=omd->GetDecalFunction("ADC");
193 if (fcal) // Store calibrated signal
195 cadc=fcal->Eval(adc);
196 sx->SetSignal(cadc,"ADC");
198 else // Store uncalibrated signal
200 sx->SetSignal(adc,"ADC");
203 // LE (TDC) (de)calibration
204 le=sx->GetSignal("LE",-7); // Get uncalibrated signal
209 fcal=omd->GetCalFunction("LE");
210 fdecal=omd->GetDecalFunction("LE");
213 // MuDaq only : Store the hit-specific ADC dependent (de)calibration function in the hit itself
216 sx->SetCalFunction(fcal,"LE");
217 sx->SetDecalFunction(fdecal,"LE");
218 fcal=sx->GetCalFunction("LE");
219 fdecal=sx->GetDecalFunction("LE");
222 if (fcal) fcal->SetParameter(3,adc);
223 if (fdecal) fdecal->SetParameter(3,adc);
227 if (fcal) fcal->SetParameter(3,1.e20);
228 if (fdecal) fdecal->SetParameter(3,1.e20);
232 if (fcal) // Store calibrated signal
235 sx->SetSignal(cle,"LE");
236 if (mudaq) // MuDaq only
238 sx->SetCalFunction(0,"LE");
239 sx->SetDecalFunction(fdecal,"LE");
242 else // Store uncalibrated signal
244 sx->SetSignal(le,"LE");
245 if (mudaq) // MuDaq only
247 sx->SetCalFunction(fcal,"LE");
248 sx->SetDecalFunction(0,"LE");
252 // TOT (de)calibration
253 tot=sx->GetSignal("TOT",-7); // Get uncalibrated signal
258 fcal=omd->GetCalFunction("TOT");
259 fdecal=omd->GetDecalFunction("TOT");
261 if (fcal) // Store calibrated signal
263 ctot=fcal->Eval(tot);
264 sx->SetSignal(ctot,"TOT");
266 else // Store uncalibrated signal
268 sx->SetSignal(tot,"TOT");
270 } // End of loop over hits of the OM
272 // Set bad OM flags according to dbase info
275 if (omd->GetDeadValue("ADC")) ome->SetDead("ADC");
276 if (omd->GetDeadValue("LE")) ome->SetDead("LE");
277 if (omd->GetDeadValue("TOT")) ome->SetDead("TOT");
280 // Store ADC (de)calibration function in this OM according to dbase info
285 fcal=omd->GetCalFunction("ADC");
286 fdecal=omd->GetDecalFunction("ADC");
288 if (fcal) // Calibrated ADC signals were stored
290 ome->SetCalFunction(0,"ADC");
291 ome->SetDecalFunction(fdecal,"ADC");
293 else // Uncalibrated ADC signals were stored
295 ome->SetCalFunction(fcal,"ADC");
296 ome->SetDecalFunction(0,"ADC");
299 // Store LE (de)calibration function in this OM according to dbase info
300 // Note for MuDaq only : This is the ADC independent function.
301 // The ADC dependent calibration function is in the hits themselves
306 fcal=omd->GetCalFunction("LE");
307 fdecal=omd->GetDecalFunction("LE");
309 if (fcal) // Calibrated LE signals were stored
311 ome->SetCalFunction(0,"LE");
312 ome->SetDecalFunction(fdecal,"LE");
314 else // Uncalibrated LE signals were stored
316 ome->SetCalFunction(fcal,"LE");
317 ome->SetDecalFunction(0,"LE");
320 // Store TOT (de)calibration function in this OM according to dbase info
325 fcal=omd->GetCalFunction("TOT");
326 fdecal=omd->GetDecalFunction("TOT");
328 if (fcal) // Calibrated TOT signals were stored
330 ome->SetCalFunction(0,"TOT");
331 ome->SetDecalFunction(fdecal,"TOT");
333 else // Uncalibrated TOT signals were stored
335 ome->SetCalFunction(fcal,"TOT");
336 ome->SetDecalFunction(0,"TOT");
338 } // End of loop over OM's of the event
340 ///////////////////////////////////////////////////////////////////////////