NCFS-Pack
A generic (astro)particle physics analysis framework
 
Loading...
Searching...
No Matches
IceXtalk.cxx
Go to the documentation of this file.
1
17
19
85
86#include "IceXtalk.h"
87#include "Riostream.h"
88
89ClassImp(IceXtalk); // Class implementation to enable ROOT I/O
90
92IceXtalk::IceXtalk(const char* name,const char* title) : TTask(name,title)
93{
99
100 fCalfile=0;
101 fOmdb=0;
102 fPmin=0.5;
103 fPe=1;
104}
105
107{
113
114 if (fCalfile)
115 {
116 delete fCalfile;
117 fCalfile=0;
118 }
119}
120
122{
129
130 fOmdb=omdb;
131}
132
133void IceXtalk::SetCalibFile(TString name)
134{
144
145 // Expand the path name of the provided input file
146 name=gSystem->ExpandPathName(name.Data());
147
148 if (fCalfile)
149 {
150 delete fCalfile;
151 fCalfile=0;
152 }
153 fCalfile=new TFile(name.Data());
154 fOmdb=0;
155}
156
157void IceXtalk::SetMinProb(Float_t pmin)
158{
164
165 fPmin=pmin;
166}
167
168void IceXtalk::SetXtalkPE(Float_t pe)
169{
175
176 fPe=pe;
177}
178
179void IceXtalk::Exec(Option_t* opt)
180{
186
187 TString name=opt;
188 NcJob* parent=(NcJob*)(gROOT->GetListOfTasks()->FindObject(name.Data()));
189
190 if (!parent) return;
191
192 IceEvent* evt=(IceEvent*)parent->GetObject("IceEvent");
193 if (!evt) return;
194
195 // Only process accepted events
196 NcDevice* seldev=(NcDevice*)evt->GetDevice("NcEventSelector");
197 if (seldev)
198 {
199 if (seldev->GetSignal("Select") < 0.1) return;
200 }
201
202 NcSignal* daq=(NcSignal*)evt->GetDevice("Daq");
203 Int_t mudaq=0;
204 if (daq) mudaq=int(daq->GetSignal("Muon"));
205
206 // This cross talk correction processor is only for MuDaq data
207 if (!mudaq) return;
208
209 if (!fOmdb && fCalfile)
210 {
211 fOmdb=(NcObjMatrix*)fCalfile->Get("MuDaq-OMDBASE");
212 // Next statement for compatibility with old calibration file format
213 if (!fOmdb) fOmdb=(NcObjMatrix*)fCalfile->Get("Cal-OMDBASE");
214 }
215
216 if (!fOmdb) return;
217
218 // Storage of the used parameters in the IceXtalk device
219 NcDevice params;
220 params.SetNameTitle("IceXtalk","IceXtalk processor parameters");
221 params.SetSlotName("Pmin",1);
222 params.SetSlotName("Pe",2);
223
224 params.SetSignal(fPmin,1);
225 params.SetSignal(fPe,2);
226
227 evt->AddDevice(params);
228
229 // All Amanda OMs with a signal
230 TObjArray* mods=evt->GetDevices("IceAOM");
231 if (!mods) return;
232 Int_t nmods=mods->GetEntries();
233 if (!nmods) return;
234
235 TObjArray xhits; // Array with pointers to Xtalk hits to be corrected
236
237 IceAOM* omt=0; // Transmitter OM
238 IceAOM* omr=0; // Receiver OM
239 TF1* fxtalk=0; // The Xtalk probability function
240 Int_t idtrans=0;
241 Int_t idrec=0;
242 Float_t adct=0,let=0;
243 Float_t p=0;
244 Float_t adcr=0,ler=0;
245 Int_t ibad=0;
246 Float_t cpar=0,bpar=0,dlemin=0,dlemax=0,test=0;
247 Float_t dle=0;
248 Float_t sigcor=0;
249 for (Int_t imod=0; imod<nmods; imod++)
250 {
251 omt=(IceAOM*)mods->At(imod);
252 if (!omt) continue;
253 idtrans=omt->GetUniqueID();
254
255 // Also take bad transmitter modules into account
256 ibad=omt->GetDeadValue("ADC");
257 if (ibad) omt->SetAlive("ADC");
258
259 // Check for corresponding receiver modules
260 for (Int_t jmod=0; jmod<nmods; jmod++)
261 {
262 // No Xtalk from a module to itself
263 if (jmod==imod) continue;
264
265 omr=(IceAOM*)mods->At(jmod);
266 if (!omr) continue;
267 idrec=omr->GetUniqueID();
268
269 fxtalk=(TF1*)fOmdb->GetObject(idtrans,idrec+1);
270 if (!fxtalk) continue;
271
272 // Determine Xtalk probability for each transmitter hit
273 for (Int_t ithit=1; ithit<=omt->GetNhits(); ithit++)
274 {
275 NcSignal* st=omt->GetHit(ithit);
276 if (!st) continue;
277
278 // Eliminate possible previous Xtalk correction
279 sigcor=st->GetOffset("ADC");
280 st->AddSignal(sigcor,"ADC");
281 st->ResetOffset("ADC");
282 adct=st->GetSignal("ADC",-4); // Get uncalibrated amplitude
283 dlemin=fxtalk->GetParameter("dLE-min");
284 dlemax=fxtalk->GetParameter("dLE-max");
285 // Protection against overflow in Xtalk prob. function
286 cpar=fxtalk->GetParameter("C");
287 bpar=fxtalk->GetParameter("B");
288 test=(adct-cpar)/bpar;
289 if (test>100)
290 {
291 p=1;
292 }
293 else if (test<-100)
294 {
295 p=0;
296 }
297 else
298 {
299 p=fxtalk->Eval(adct);
300 }
301 if (p<fPmin) continue;
302
303 // Xtalk flagging for each receiver hit
304 for (Int_t irhit=1; irhit<=omr->GetNhits(); irhit++)
305 {
306 NcSignal* sr=omr->GetHit(irhit);
307 if (!sr) continue;
308
309 // Check calibrated LE time differences
310 if (!ibad)
311 {
312 let=st->GetSignal("LE",4);
313 ler=sr->GetSignal("LE",4);
314 dle=ler-let;
315 if (dle<dlemin || dle>dlemax) continue;
316 }
317 // Register this receiver hit to be corrected
318 xhits.Add(sr);
319 }
320 } // end of transmitter hit loop
321 } // end of receiver OM loop
322
323 // Restore the original transmitter dead flag value
324 if (ibad) omt->SetDead("ADC");
325 } // end of transmitter OM loop
326
327 // Perform the Xtalk signal correction to the registered receiver hits
328 // The correction value is stored in the signal data as an offset value
329 for (Int_t ix=0; ix<xhits.GetEntries(); ix++)
330 {
331 NcSignal* sx=(NcSignal*)xhits.At(ix);
332 if (!sx) continue;
333
334 // Eliminate possible previous Xtalk correction
335 sigcor=sx->GetOffset("ADC");
336 adcr=sx->GetSignal("ADC")+sigcor;
337 sigcor=fPe;
338 // If stored ADC data is un-calibrated, convert fPe to raw ADC value
339 NcSignal* parent=(NcSignal*)sx->GetDevice();
340 if (parent)
341 {
342 if (parent->GetCalFunction("ADC"));
343 {
344 idrec=parent->GetUniqueID();
345 omr=(IceAOM*)fOmdb->GetObject(idrec,1);
346 TF1* fdecal=0;
347 if (omr) fdecal=omr->GetDecalFunction("ADC");
348 if (fdecal) sigcor=fdecal->Eval(fPe);
349 }
350 }
351 adcr=adcr-sigcor;
352 sx->SetSignal(adcr,"ADC");
353 sx->SetOffset(sigcor,"ADC");
354 }
355}
356
ClassImp(IceXtalk)
Signal (Hit) handling of a generic Amanda Optical Module (AOM).
Definition IceAOM.h:12
Handling of IceCube event data.
Definition IceEvent.h:20
TTask derived class to perform cross talk hit correction.
Definition IceXtalk.h:20
Float_t fPmin
Definition IceXtalk.h:33
Float_t fPe
Definition IceXtalk.h:34
NcObjMatrix * fOmdb
Definition IceXtalk.h:32
virtual ~IceXtalk()
Definition IceXtalk.cxx:106
IceXtalk(const char *name="", const char *title="")
Definition IceXtalk.cxx:92
void SetCalibFile(TString name)
Definition IceXtalk.cxx:133
void SetXtalkPE(Float_t pe)
Definition IceXtalk.cxx:168
virtual void Exec(Option_t *opt)
Definition IceXtalk.cxx:179
TFile * fCalfile
Definition IceXtalk.h:31
void SetOMdbase(NcObjMatrix *omdb)
Definition IceXtalk.cxx:121
void SetMinProb(Float_t pmin)
Definition IceXtalk.cxx:157
void SetAlive(Int_t j=1)
Definition NcAttrib.cxx:946
Int_t GetDeadValue(Int_t j=1) const
void SetOffset(Double_t off, Int_t j=1)
Definition NcAttrib.cxx:322
Float_t GetOffset(Int_t j=1) const
Definition NcAttrib.cxx:624
void SetSlotName(TString s, Int_t j=1)
TF1 * GetCalFunction(Int_t j=1) const
void SetDead(Int_t j=1)
Definition NcAttrib.cxx:886
TF1 * GetDecalFunction(Int_t j=1) const
void ResetOffset(Int_t j=1)
Definition NcAttrib.cxx:729
Signal (Hit) handling of a generic device.
Definition NcDevice.h:14
Int_t GetNhits() const
Definition NcDevice.cxx:437
NcSignal * GetHit(Int_t j) const
Definition NcDevice.cxx:489
void AddDevice(NcDevice &d)
Definition NcEvent.cxx:1210
NcDevice * GetDevice(Int_t i) const
Definition NcEvent.cxx:1380
TObjArray * GetDevices(TString classname, TObjArray *devices=0)
Definition NcEvent.cxx:1656
Base class for top level job in a task based procedure.
Definition NcJob.h:18
TObject * GetObject(const char *classname) const
Definition NcJob.cxx:456
Handling of a matrix structure of objects.
Definition NcObjMatrix.h:13
Generic handling of (extrapolated) detector signals.
Definition NcSignal.h:23
virtual void SetSignal(Double_t sig, Int_t j=1)
Definition NcSignal.cxx:516
NcDevice * GetDevice() const
virtual Float_t GetSignal(Int_t j=1, Int_t mode=0) const
Definition NcSignal.cxx:651
virtual void AddSignal(Double_t sig, Int_t j=1)
Definition NcSignal.cxx:583