]>
Commit | Line | Data |
---|---|---|
1 | /************************************************************************** | |
2 | * Copyright(c) 1998-1999, 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 | /////////////////////////////////////////////////////////////////////// | |
17 | // // | |
18 | // Produces the data needed to calculate the TOF quality assurance. // | |
19 | // QA objects are 1 & 2 Dimensional histograms. // | |
20 | // author: S.Arcelli // | |
21 | // // | |
22 | /////////////////////////////////////////////////////////////////////// | |
23 | ||
24 | /* | |
25 | Modified by fbellini on 18/01/2011 | |
26 | - reduced histo binning to reduce size | |
27 | - added decoding errors plot | |
28 | - added channel maps and options for DQM shifters | |
29 | - new list of recPoints and ESDs plots | |
30 | - removed hTrmChannels035 and hTrmChannels3671 | |
31 | ||
32 | Modified by bvonhall on 03/11/2010 | |
33 | - modified declaration of hTrmChannels035 and hTrmChannels3671 in EndOfDetectorCycle() | |
34 | to prevent memory corruption | |
35 | ||
36 | Modified by adecaro on 18/10/2010 | |
37 | - fTOFRawStream object set as private member | |
38 | ||
39 | Modified by fbellini on 13/09/2010 | |
40 | - Set TLines as private members | |
41 | - Set image flag for expert histos | |
42 | ||
43 | Modified by fbellini on 14/06/2010 | |
44 | - Updated plots | |
45 | - use LoadRawDataBuffersV2() | |
46 | ||
47 | Modified by fbellini on 10/05/2010 | |
48 | - Fixed EndOfDetectorCycle() memory corruption bug | |
49 | ||
50 | Modified by fbellini on 22/04/2010 | |
51 | - Added filter for physics events | |
52 | ||
53 | Modified by fbellini on 16/04/2010 | |
54 | - Added EnableDqmShifterOpt() | |
55 | - Modified EndOfDetectorCycle() with options for DQM | |
56 | - Updated ESDs QA | |
57 | ||
58 | Modified by fbellini on 30/03/2010 | |
59 | - Changed raws time histos range to 610ns | |
60 | - Added FilterLTMData() and FilterSpare() methods | |
61 | - Added check on enabled channels for raw data | |
62 | - Updated RecPoints QA | |
63 | ||
64 | Modified by fbellini on 02/03/2010 | |
65 | - Fixed raw data decoding methods (use AliTOFRawStream::LoadRawDataBuffer()) | |
66 | - Added filter for noisy channels and read map from OCDB | |
67 | - Added GetCalibData() method | |
68 | - Added CheckVolumeID() and CheckEquipID() methods | |
69 | - Updated Raw QA | |
70 | */ | |
71 | ||
72 | #include <TClonesArray.h> | |
73 | #include <TH1F.h> | |
74 | #include <TH2F.h> | |
75 | #include <TLine.h> | |
76 | #include <TPaveText.h> | |
77 | ||
78 | #include "AliCDBManager.h" | |
79 | #include "AliCDBEntry.h" | |
80 | #include "AliESDEvent.h" | |
81 | #include "AliESDtrack.h" | |
82 | #include "AliQAChecker.h" | |
83 | #include "AliRawReader.h" | |
84 | #include "AliTOFRawStream.h" | |
85 | #include "AliTOFcluster.h" | |
86 | #include "AliTOFQADataMakerRec.h" | |
87 | #include "AliTOFrawData.h" | |
88 | #include "AliTOFGeometry.h" | |
89 | #include "AliTOFChannelOnlineStatusArray.h" | |
90 | #include "AliTOFDecoderSummaryData.h" | |
91 | #include "AliTOFDecoderV2.h" | |
92 | ||
93 | ClassImp(AliTOFQADataMakerRec) | |
94 | ||
95 | //____________________________________________________________________________ | |
96 | AliTOFQADataMakerRec::AliTOFQADataMakerRec() : | |
97 | AliQADataMakerRec(AliQAv1::GetDetName(AliQAv1::kTOF), "TOF Quality Assurance Data Maker"), | |
98 | fCalibData(0x0), | |
99 | fEnableNoiseFiltering(kFALSE), | |
100 | fEnableDqmShifterOpt(kFALSE), | |
101 | // fProcessedRawEventN(0), | |
102 | fIsSOC(kFALSE), | |
103 | fLineExpTimeMin(new TLine(200., 0., 200., 0.)), | |
104 | fLineExpTimeMax(new TLine(250., 0., 250., 0.)), | |
105 | fLineExpTotMin(new TLine(5., 0., 5., 0.)), | |
106 | fLineExpTotMax(new TLine(20., 0., 20., 0.)), | |
107 | fTOFRawStream(AliTOFRawStream()), | |
108 | fDecoderSummary(new AliTOFDecoderSummaryData()) | |
109 | { | |
110 | // | |
111 | // ctor | |
112 | // | |
113 | for (Int_t sm=0;sm<17;sm++){ | |
114 | fLineSMid[sm] = new TLine( sm+1, 0., sm+1, 91.); | |
115 | } | |
116 | //initialize all TRM counters to -1 i.e. invalid value | |
117 | // for (Int_t trm=0;trm<720;trm++){ | |
118 | // fTRMNoisyArray[trm]=-1; | |
119 | // fTRMHwOkArray[trm]=-1; | |
120 | // fTRMEnabledArray[trm]=-1; | |
121 | // } | |
122 | ||
123 | } | |
124 | ||
125 | //____________________________________________________________________________ | |
126 | AliTOFQADataMakerRec::AliTOFQADataMakerRec(const AliTOFQADataMakerRec& qadm) : | |
127 | AliQADataMakerRec(), | |
128 | fCalibData(qadm.fCalibData), | |
129 | fEnableNoiseFiltering(qadm.fEnableNoiseFiltering), | |
130 | fEnableDqmShifterOpt(qadm.fEnableDqmShifterOpt), | |
131 | // fProcessedRawEventN(qadm.fProcessedRawEventN), | |
132 | fIsSOC(qadm.fIsSOC), | |
133 | fLineExpTimeMin(qadm.fLineExpTimeMin), | |
134 | fLineExpTimeMax(qadm.fLineExpTimeMax), | |
135 | fLineExpTotMin(qadm.fLineExpTotMin), | |
136 | fLineExpTotMax(qadm.fLineExpTotMax), | |
137 | fTOFRawStream(qadm.fTOFRawStream), | |
138 | fDecoderSummary(qadm.fDecoderSummary) | |
139 | { | |
140 | // | |
141 | //copy ctor | |
142 | // | |
143 | SetName((const char*)qadm.GetName()) ; | |
144 | SetTitle((const char*)qadm.GetTitle()); | |
145 | ||
146 | for (Int_t sm=0;sm<17;sm++){ | |
147 | fLineSMid[sm]=qadm.fLineSMid[sm]; | |
148 | } | |
149 | ||
150 | // for (Int_t trm=0;trm<10;trm++){ | |
151 | // fTRMNoisyArray[trm]=qadm.fTRMNoisyArray[trm]; | |
152 | // fTRMHwOkArray[trm]=qadm.fTRMHwOkArray[trm]; | |
153 | // fTRMEnabledArray[trm]=qadm.fTRMEnabledArray[trm]; | |
154 | // } | |
155 | ||
156 | } | |
157 | ||
158 | //__________________________________________________________________ | |
159 | AliTOFQADataMakerRec& AliTOFQADataMakerRec::operator = (const AliTOFQADataMakerRec& qadm ) | |
160 | { | |
161 | // | |
162 | // assignment operator. | |
163 | // | |
164 | this->~AliTOFQADataMakerRec(); | |
165 | new(this) AliTOFQADataMakerRec(qadm); | |
166 | return *this; | |
167 | } | |
168 | ||
169 | //---------------------------------------------------------------------------- | |
170 | AliTOFQADataMakerRec::~AliTOFQADataMakerRec() | |
171 | { | |
172 | ||
173 | fTOFRawStream.Clear(); | |
174 | delete fLineExpTimeMin; | |
175 | delete fLineExpTimeMax; | |
176 | delete fLineExpTotMin; | |
177 | delete fLineExpTotMax; | |
178 | for (Int_t sm=0;sm<10;sm++){ | |
179 | delete fLineSMid[sm]; | |
180 | } | |
181 | if (fDecoderSummary) | |
182 | delete fDecoderSummary; | |
183 | } | |
184 | //---------------------------------------------------------------------------- | |
185 | AliTOFChannelOnlineStatusArray* AliTOFQADataMakerRec::GetCalibData() const | |
186 | { | |
187 | // | |
188 | // Retrive TOF calib objects from OCDB | |
189 | // | |
190 | AliCDBManager *man = AliCDBManager::Instance(); | |
191 | AliCDBEntry *cdbe=0; | |
192 | ||
193 | cdbe = man->Get("TOF/Calib/Status",fRun); | |
194 | if(!cdbe){ | |
195 | AliWarning("Load of calibration data from default storage failed!"); | |
196 | AliWarning("Calibration data will be loaded from local storage ($ALICE_ROOT)"); | |
197 | man->SetDefaultStorage("local://$ALICE_ROOT/OCDB"); | |
198 | cdbe = man->Get("TOF/Calib/Status",fRun); | |
199 | } | |
200 | // Retrieval of data in directory TOF/Calib/Data: | |
201 | ||
202 | AliTOFChannelOnlineStatusArray * array = 0; | |
203 | if (cdbe) array = (AliTOFChannelOnlineStatusArray *)cdbe->GetObject(); | |
204 | if (!array) AliFatal("No calibration data from calibration database !"); | |
205 | ||
206 | return array; | |
207 | } | |
208 | ||
209 | //____________________________________________________________________________ | |
210 | void AliTOFQADataMakerRec::InitRaws() | |
211 | { | |
212 | // | |
213 | // create Raws histograms in Raws subdir | |
214 | // | |
215 | const Bool_t expert = kTRUE ; | |
216 | const Bool_t saveCorr = kTRUE ; | |
217 | const Bool_t image = kTRUE ; | |
218 | ||
219 | TH1I * h0 = new TH1I("hTOFRaws", "TOF raw hit multiplicity; TOF raw hits number; Events ",200, 0, 200) ; | |
220 | ||
221 | TH1I * h1 = new TH1I("hTOFRawsIA", "TOF raw hit multiplicity - I/A side; TOF raw hits number ;Events ",200, 0, 200) ; | |
222 | TH1I * h2 = new TH1I("hTOFRawsOA", "TOF raw hit multiplicity - O/A side; TOF raw hits number ;Events ",200, 0, 200) ; | |
223 | TH1I * h3 = new TH1I("hTOFRawsIC", "TOF raw hit multiplicity - I/C side; TOF raw hits number ;Events ",200, 0, 200) ; | |
224 | TH1I * h4 = new TH1I("hTOFRawsOC", "TOF raw hit multiplicity - O/C side; TOF raw hits number ;Events ",200, 0, 200) ; | |
225 | ||
226 | TH1F * h5 = new TH1F("hTOFRawsTime", "TOF Raws - Hit time (ns);Measured Hit time [ns];Hits", 250,0. ,610.) ; | |
227 | TH1F * h6 = new TH1F("hTOFRawsTimeIA", "TOF Raws - Hit time (ns) - I/A side;Measured Hit time [ns];Hits", 250,0. ,610.) ; | |
228 | TH1F * h7 = new TH1F("hTOFRawsTimeOA", "TOF Raws - Hit time (ns) - O/A side;Measured Hit time [ns];Hits", 250,0. ,610.) ; | |
229 | TH1F * h8 = new TH1F("hTOFRawsTimeIC", "TOF Raws - Hit time (ns) - I/C side;Measured Hit time [ns];Hits", 250,0. ,610.) ; | |
230 | TH1F * h9 = new TH1F("hTOFRawsTimeOC", "TOF Raws - Hit time (ns) - O/C side;Measured Hit time [ns];Hits", 250,0. ,610.) ; | |
231 | ||
232 | TH1F * h10 = new TH1F("hTOFRawsToT", "TOF Raws - Hit ToT (ns);Measured Hit ToT (ns);Hits", 100, 0., 48.8) ; | |
233 | ||
234 | TH1F * h11 = new TH1F("hTOFRawsToTIA", "TOF Raws - Hit ToT (ns) - I/A side;Measured Hit ToT (ns);Hits", 100, 0., 48.8) ; | |
235 | TH1F * h12 = new TH1F("hTOFRawsToTOA", "TOF Raws - Hit ToT (ns) - O/A side;Measured Hit ToT (ns);Hits", 100, 0., 48.8) ; | |
236 | TH1F * h13 = new TH1F("hTOFRawsToTIC", "TOF Raws - Hit ToT (ns) - I/C side;Measured Hit ToT (ns);Hits", 100, 0., 48.8) ; | |
237 | TH1F * h14 = new TH1F("hTOFRawsToTOC", "TOF Raws - Hit ToT (ns) - O/C side;Measured Hit ToT (ns);Hits", 100, 0., 48.8) ; | |
238 | ||
239 | TH1F * h15 = new TH1F("hTOFRawsLTMHits", "LTMs OR signals; Crate; Counts", 72, 0., 72.); | |
240 | TH2F * h16 = new TH2F("hTOFrefMap", "TOF enabled channel reference map;sector;strip", 72, 0., 18., 91, 0., 91.); | |
241 | TH2F * h17 = new TH2F("hTOFRawHitMap","TOF raw hit map;sector;strip", 72, 0., 18., 91, 0., 91.); | |
242 | TH2I * h18 = new TH2I("hTOFDecodingErrors","Decoding error monitoring; DDL; Error ", 72, 0, 72, 13,1,14); | |
243 | ||
244 | h18->GetYaxis()->SetBinLabel(1,"DRM "); | |
245 | h18->GetYaxis()->SetBinLabel(2,"LTM "); | |
246 | h18->GetYaxis()->SetBinLabel(3,"TRM 3 "); | |
247 | h18->GetYaxis()->SetBinLabel(4,"TRM 4"); | |
248 | h18->GetYaxis()->SetBinLabel(5,"TRM 5"); | |
249 | h18->GetYaxis()->SetBinLabel(6,"TRM 6"); | |
250 | h18->GetYaxis()->SetBinLabel(7,"TRM 7"); | |
251 | h18->GetYaxis()->SetBinLabel(8,"TRM 8"); | |
252 | h18->GetYaxis()->SetBinLabel(9,"TRM 9"); | |
253 | h18->GetYaxis()->SetBinLabel(10,"TRM 10"); | |
254 | h18->GetYaxis()->SetBinLabel(11,"TRM 11"); | |
255 | h18->GetYaxis()->SetBinLabel(12,"TRM 12"); | |
256 | h18->GetYaxis()->SetBinLabel(13,"recovered"); | |
257 | ||
258 | TH1F * h19 = new TH1F("hTOFOrphansTime", "TOF Raws - Orphans time (ns);Measured Hit time [ns];Hits", 250, 0. ,610.) ; | |
259 | TH2F * h20 = new TH2F("hTOFRawTimeVsTRM035", "TOF raws - Hit time vs TRM - crates 0 to 35; TRM index = DDL*10+TRM(0-9);TOF raw time [ns]", 361, 0., 361., 250, 0., 610.0) ; | |
260 | TH2F * h21 = new TH2F("hTOFRawTimeVsTRM3671", "TOF raws - Hit time vs TRM - crates 36 to 72; TRM index = DDL**10+TRM(0-9);TOF raw time [ns]", 361, 360., 721., 250, 0., 610.0) ; | |
261 | TH2F * h22 = new TH2F("hTOFTimeVsStrip","TOF Raws - Hit time vs. strip (theta); Strip index;Raws TOF time (ns) ", 91,0.,91, 250, 0., 610.) ; | |
262 | h0->Sumw2() ; | |
263 | h1->Sumw2() ; | |
264 | h2->Sumw2() ; | |
265 | h3->Sumw2() ; | |
266 | h4->Sumw2() ; | |
267 | // h5->Sumw2() ; | |
268 | h6->Sumw2() ; | |
269 | h7->Sumw2() ; | |
270 | h8->Sumw2() ; | |
271 | h9->Sumw2() ; | |
272 | // h10->Sumw2() ; | |
273 | h11->Sumw2() ; | |
274 | h12->Sumw2() ; | |
275 | h13->Sumw2() ; | |
276 | h14->Sumw2() ; | |
277 | h15->Sumw2() ; | |
278 | h16->Sumw2() ; | |
279 | h17->Sumw2() ; | |
280 | h18->Sumw2() ; | |
281 | h19->Sumw2() ; | |
282 | h20->Sumw2() ; | |
283 | h21->Sumw2() ; | |
284 | h22->Sumw2() ; | |
285 | ||
286 | //add lines for DQM shifter | |
287 | //fLineExpTimeMin = new TLine(200., 0., 200., 0.); | |
288 | fLineExpTimeMin->SetLineColor(kGreen); | |
289 | fLineExpTimeMin->SetLineWidth(2); | |
290 | ||
291 | //fLineExpTimeMax = new TLine(250., 0., 250., 0.); | |
292 | fLineExpTimeMax->SetLineColor(kGreen); | |
293 | fLineExpTimeMax->SetLineWidth(2); | |
294 | ||
295 | //fLineExpTotMin = new TLine( 5., 0., 5., 0.); | |
296 | fLineExpTotMin->SetLineColor(kGreen); | |
297 | fLineExpTotMin->SetLineWidth(2); | |
298 | ||
299 | //fLineExpTotMax = new TLine(20., 0., 20., 0.); | |
300 | fLineExpTotMax->SetLineColor(kGreen); | |
301 | fLineExpTotMax->SetLineWidth(2); | |
302 | ||
303 | for (Int_t sm=0;sm<17;sm++){ | |
304 | //fLineSMid[sm] = new TLine( 1+sm, 0., 1+sm, 91.); | |
305 | fLineSMid[sm]->SetLineColor(kMagenta); | |
306 | fLineSMid[sm]->SetLineWidth(2); | |
307 | } | |
308 | ||
309 | h5->GetListOfFunctions()->Add(fLineExpTimeMin); | |
310 | h5->GetListOfFunctions()->Add(fLineExpTimeMax); | |
311 | h10->GetListOfFunctions()->Add(fLineExpTotMin); | |
312 | h10->GetListOfFunctions()->Add(fLineExpTotMax); | |
313 | ||
314 | for (Int_t sm=0;sm<17;sm++){ | |
315 | h16->GetListOfFunctions()->Add(fLineSMid[sm]); | |
316 | h17->GetListOfFunctions()->Add(fLineSMid[sm]); | |
317 | } | |
318 | ||
319 | ||
320 | TPaveText *phosHoleBox=new TPaveText(13,38,16,53,"b"); | |
321 | phosHoleBox->SetFillStyle(0); | |
322 | phosHoleBox->SetFillColor(kWhite); | |
323 | phosHoleBox->SetLineColor(kMagenta); | |
324 | phosHoleBox->SetLineWidth(2); | |
325 | phosHoleBox->AddText("PHOS"); | |
326 | h16->GetListOfFunctions()->Add(phosHoleBox); | |
327 | h17->GetListOfFunctions()->Add(phosHoleBox); | |
328 | ||
329 | // h0->SetDrawOption("logy"); | |
330 | // h5->SetDrawOption("logy"); | |
331 | // h10->SetDrawOption("logy"); | |
332 | ||
333 | Add2RawsList(h0, 0, !expert, image, !saveCorr) ; | |
334 | Add2RawsList(h1, 1, expert, !image, !saveCorr) ; | |
335 | Add2RawsList(h2, 2, expert, !image, !saveCorr) ; | |
336 | Add2RawsList(h3, 3, expert, !image, !saveCorr) ; | |
337 | Add2RawsList(h4, 4, expert, !image, !saveCorr) ; | |
338 | Add2RawsList(h5, 5, !expert, image, !saveCorr) ; | |
339 | Add2RawsList(h6, 6, expert, !image, !saveCorr) ; | |
340 | Add2RawsList(h7, 7, expert, !image, !saveCorr) ; | |
341 | Add2RawsList(h8, 8, expert, !image, !saveCorr) ; | |
342 | Add2RawsList(h9, 9, expert, !image, !saveCorr) ; | |
343 | Add2RawsList(h10, 10, !expert, image, !saveCorr) ; | |
344 | Add2RawsList(h11, 11, expert, !image, !saveCorr) ; | |
345 | Add2RawsList(h12, 12, expert, !image, !saveCorr) ; | |
346 | Add2RawsList(h13, 13, expert, !image, !saveCorr) ; | |
347 | Add2RawsList(h14, 14, expert, !image, !saveCorr) ; | |
348 | Add2RawsList(h15, 15, !expert, image, !saveCorr) ; | |
349 | Add2RawsList(h16, 16, !expert, image, !saveCorr) ; | |
350 | Add2RawsList(h17, 17, !expert, image, !saveCorr) ; | |
351 | Add2RawsList(h18, 18, expert, !image, !saveCorr) ; | |
352 | Add2RawsList(h19, 19, expert, !image, !saveCorr) ; | |
353 | Add2RawsList(h20, 20, expert, !image, !saveCorr) ; | |
354 | Add2RawsList(h21, 21, expert, !image, !saveCorr) ; | |
355 | Add2RawsList(h22, 22, expert, !image, !saveCorr) ; | |
356 | // | |
357 | ClonePerTrigClass(AliQAv1::kRAWS); // this should be the last line | |
358 | } | |
359 | ||
360 | //____________________________________________________________________________ | |
361 | void AliTOFQADataMakerRec::InitRecPoints() | |
362 | { | |
363 | // | |
364 | // create RecPoints histograms in RecPoints subdir | |
365 | // | |
366 | ||
367 | const Bool_t expert = kTRUE ; | |
368 | const Bool_t image = kTRUE ; | |
369 | ||
370 | TH1I * h0 = new TH1I("hTOFRecPoints", "TOF RecPoints multiplicity ; TOF RecPoints number;Events",200, 0, 200) ; | |
371 | ||
372 | TH1F * h1 = new TH1F("hTOFRecPointsTimeIA", "RecPoints Time Spectrum in TOF (ns)- I/A side; Calibrated TOF time [ns];Events", 250, 0., 610.) ; | |
373 | TH1F * h2 = new TH1F("hTOFRecPointsTimeOA", "RecPoints Time Spectrum in TOF (ns)- O/A side; Calibrated TOF time [ns];Events", 250, 0., 610.) ; | |
374 | TH1F * h3 = new TH1F("hTOFRecPointsTimeIC", "RecPoints Time Spectrum in TOF (ns)- I/C side; Calibrated TOF time [ns];Events", 250, 0., 610.) ; | |
375 | TH1F * h4 = new TH1F("hTOFRecPointsTimeOC", "RecPoints Time Spectrum in TOF (ns)- O/C side; Calibrated TOF time [ns];Events", 250, 0., 610.) ; | |
376 | ||
377 | TH1F * h5 = new TH1F("hTOFRecPointsRawTimeIA", "RecPoints raw Time Spectrum in TOF (ns)-I/A side; Measured TOF time [ns];Hits", 250, 0., 610.) ; | |
378 | TH1F * h6 = new TH1F("hTOFRecPointsRawTimeOA", "RecPoints raw Time Spectrum in TOF (ns)-O/A side; Measured TOF time [ns];Hits", 250, 0., 610.) ; | |
379 | TH1F * h7 = new TH1F("hTOFRecPointsRawTimeIC", "RecPoints raw Time Spectrum in TOF (ns)-I/C side; Measured TOF time [ns];Hits", 250, 0., 610.) ; | |
380 | TH1F * h8 = new TH1F("hTOFRecPointsRawTimeOC", "RecPoints raw Time Spectrum in TOF (ns)-O/C side; Measured TOF time [ns];Hits", 250, 0., 610.) ; | |
381 | ||
382 | TH1F * h9 = new TH1F("hTOFRecPointsToTIA", "RecPoints ToT Spectrum in TOF (ns)-I/A side; Measured TOT [ns];Hits", 100, 0., 48.8 ) ; | |
383 | TH1F * h10 = new TH1F("hTOFRecPointsToTOA", "RecPoints ToT Spectrum in TOF (ns)-O/A side; Measured TOT [ns];Hits", 100, 0., 48.8 ) ; | |
384 | TH1F * h11 = new TH1F("hTOFRecPointsToTIC", "RecPoints ToT Spectrum in TOF (ns)-I/C side; Measured TOT [ns];Hits", 100, 0., 48.8 ) ; | |
385 | TH1F * h12 = new TH1F("hTOFRecPointsToTOC", "RecPoints ToT Spectrum in TOF (ns)-O/C side; Measured TOT [ns];Hits", 100, 0., 48.8 ) ; | |
386 | ||
387 | TH2F * h13 = new TH2F("hTOFRecPointsClusMap","RecPoints map; sector ;strip", 72, 0., 18., 91, 0., 91.) ; | |
388 | TH2F * h14 = new TH2F("hTOFRecPointsTimeVsStrip","RecPoints TOF time vs. strip (theta); Strip index; RecPoints TOF time (ns) ",91, 0., 91., 250, 0., 610.) ; | |
389 | TH2F * h15 = new TH2F("hTOFRecPointsTimeVsTRM035","TOF RecPoints time vs TRM - crates 0 to 35; TRM index = DDL*10+TRM(0-9);TOF time [ns]", 361, 0., 361., 250, 0., 610.0) ; | |
390 | TH2F * h16 = new TH2F("hTOFRecPointsTimeVsTRM3671","TOF RecPoints time vs TRM - crates 36 to 72; TRM index = DDL**10+TRM(0-9);TOF time [ns]", 361, 360., 721., 250, 0., 610.0) ; | |
391 | ||
392 | h0->Sumw2() ; | |
393 | h1->Sumw2() ; | |
394 | h2->Sumw2() ; | |
395 | h3->Sumw2() ; | |
396 | h4->Sumw2() ; | |
397 | h5->Sumw2() ; | |
398 | h6->Sumw2() ; | |
399 | h7->Sumw2() ; | |
400 | h8->Sumw2() ; | |
401 | h9->Sumw2() ; | |
402 | h10->Sumw2() ; | |
403 | h11->Sumw2() ; | |
404 | h12->Sumw2() ; | |
405 | h13->Sumw2() ; | |
406 | h14->Sumw2() ; | |
407 | h15->Sumw2() ; | |
408 | h16->Sumw2() ; | |
409 | ||
410 | Add2RecPointsList(h0, 0, !expert, image) ; | |
411 | Add2RecPointsList(h1, 1, !expert, image) ; | |
412 | Add2RecPointsList(h2, 2, !expert, image) ; | |
413 | Add2RecPointsList(h3, 3, !expert, image) ; | |
414 | Add2RecPointsList(h4, 4, !expert, image) ; | |
415 | Add2RecPointsList(h5, 5, expert, !image) ; | |
416 | Add2RecPointsList(h6, 6, expert, !image) ; | |
417 | Add2RecPointsList(h7, 7, expert, !image) ; | |
418 | Add2RecPointsList(h8, 8, expert, !image) ; | |
419 | Add2RecPointsList(h9, 9, !expert, !image) ; | |
420 | Add2RecPointsList(h10, 10, !expert, !image) ; | |
421 | Add2RecPointsList(h11, 11, !expert, !image) ; | |
422 | Add2RecPointsList(h12, 12, !expert, !image) ; | |
423 | Add2RecPointsList(h13, 13, expert, !image) ; | |
424 | Add2RecPointsList(h14, 14, expert, image) ; | |
425 | Add2RecPointsList(h15, 15, expert, !image) ; | |
426 | Add2RecPointsList(h16, 16, expert, !image) ; | |
427 | // | |
428 | ClonePerTrigClass(AliQAv1::kRECPOINTS); // this should be the last line | |
429 | } | |
430 | ||
431 | //____________________________________________________________________________ | |
432 | void AliTOFQADataMakerRec::InitESDs() | |
433 | { | |
434 | // | |
435 | //create ESDs histograms in ESDs subdir | |
436 | // | |
437 | ||
438 | const Bool_t expert = kTRUE ; | |
439 | const Bool_t image = kTRUE ; | |
440 | ||
441 | TH1I * h0 = new TH1I("hTOFESDs", "Number of matched TOF tracks per event;Number of TOF matched ESD tracks;Counts", 200, 0, 200) ; | |
442 | TH1F * h1 = new TH1F("hTOFESDsTime", "Matched ESDs tracks: TOF Time spectrum; Calibrated TOF time [ns];Counts", 250, 0., 610. ) ; | |
443 | TH1F * h2 = new TH1F("hTOFESDsRawTime", "Matched ESDs tracks: TOF raw Time spectrum;Measured TOF time [ns];Counts", 250, 0., 610.) ; | |
444 | TH1F * h3 = new TH1F("hTOFESDsToT", "Matched ESDs tracks: TOF ToT spectrum; ESDs ToT [ns];Counts",100, 0., 48.8) ; | |
445 | TH1F * h4 = new TH1F("hTOFESDskTOFOUT", "p_{T} distribution of tracks with kTOFout; p_{T} (GeV/c);Counts", 50, 0.20, 5.00) ; | |
446 | TH1F * h5 = new TH1F("hTOFESDskTIME", "p_{T} distribution of tracks with kTOFout && kTIME; p_{T} (GeV/c);Counts", 50, 0.20, 5.00) ; | |
447 | TH1F * h6 = new TH1F("hTOFESDsMatched", "p_{T} distribution of tracks with kTOFout && TOFtime>0; p_{T} (GeV/c);Counts", 50, 0.20, 5.00) ; | |
448 | TH1F * h7 = new TH1F("hTOFESDsMatchingProb", "TPC-TOF track-matching probability;TOF matching probability (%) ;Counts",101, -1.0, 100) ; | |
449 | TH1F * h8 = new TH1F("hTOFESDsDiffTime", "ESDs t_{TOF}-t_{exp,pi} spectrum in TOF (ps); t_{TOF}-t_{exp,pi} [ps];Counts", 200, -2440., 2440.) ; | |
450 | TH1F * h9 = new TH1F("hTOFHitsLength", "Matched ESDs tracks: Length Spectrum; Track length [cm];Counts", 800, 0., 800) ; | |
451 | ||
452 | h0->Sumw2() ; | |
453 | h1->Sumw2() ; | |
454 | h2->Sumw2() ; | |
455 | h3->Sumw2() ; | |
456 | h4->Sumw2() ; | |
457 | h5->Sumw2() ; | |
458 | h6->Sumw2() ; | |
459 | h7->Sumw2() ; | |
460 | h8->Sumw2() ; | |
461 | h9->Sumw2() ; | |
462 | ||
463 | Add2ESDsList(h0, 0, !expert, image) ; | |
464 | Add2ESDsList(h1, 1, !expert, image) ; | |
465 | Add2ESDsList(h2, 2, expert, !image) ; | |
466 | Add2ESDsList(h3, 3, !expert, !image) ; | |
467 | Add2ESDsList(h4, 4, expert, image) ; | |
468 | Add2ESDsList(h5, 5, expert, image) ; | |
469 | Add2ESDsList(h6, 6, expert, image) ; | |
470 | Add2ESDsList(h7, 7, expert, image) ; | |
471 | Add2ESDsList(h8, 8, expert, !image) ; | |
472 | Add2ESDsList(h9, 9, !expert, !image) ; | |
473 | // | |
474 | ClonePerTrigClass(AliQAv1::kESDS); // this should be the last line | |
475 | } | |
476 | ||
477 | ||
478 | //____________________________________________________________________________ | |
479 | void AliTOFQADataMakerRec::MakeRaws(AliRawReader* rawReader) | |
480 | { | |
481 | // | |
482 | // makes data from Raws | |
483 | // | |
484 | if (rawReader->GetType()==7) { | |
485 | ||
486 | Double_t tdc2ns=AliTOFGeometry::TdcBinWidth()*1E-3;//in ns | |
487 | Double_t tot2ns=AliTOFGeometry::ToTBinWidth()*1E-3; | |
488 | Int_t ntof[5]; /* 0=tot, 1=IA, 2=OA, 3=IC, 4=OC*/ | |
489 | for (Int_t j=0;j<5;j++){ ntof[j]=0;} | |
490 | Int_t equipmentID[5]; //(ddl, trm, chain,tdc,channel) | |
491 | Int_t volumeID[5]; //(sector,plate,strip,padX,padZ) | |
492 | Int_t volumeID2[5]; //(sector,plate,strip,padZ,padX) to use AliTOFGeometry::GetIndex() | |
493 | Int_t chIndex=-1; | |
494 | ||
495 | TClonesArray * clonesRawData; | |
496 | fTOFRawStream.SetRawReader(rawReader); | |
497 | ||
498 | //uncomment if needed to apply DeltaBC correction | |
499 | //fTOFRawStream.ApplyBCCorrections(kTRUE); | |
500 | ||
501 | fDecoderSummary->Reset(); | |
502 | for (Int_t iDDL = 0; iDDL < AliTOFGeometry::NDDL()*AliTOFGeometry::NSectors(); iDDL++){ | |
503 | rawReader->Reset(); | |
504 | fTOFRawStream.LoadRawDataBuffersV2(iDDL); | |
505 | ||
506 | //* get decoding error counters | |
507 | fDecoderSummary = ( (AliTOFDecoderV2*) fTOFRawStream.GetDecoderV2() )->GetDecoderSummaryData(); | |
508 | if ( (fDecoderSummary) && (fDecoderSummary ->GetErrorDetected()) ) { | |
509 | Int_t errorSlotID=(Int_t) fDecoderSummary->GetErrorSlotID(); | |
510 | FillRawsData(18,iDDL,errorSlotID); | |
511 | if (fDecoderSummary -> GetRecoverError() ) | |
512 | FillRawsData(18,iDDL,13); | |
513 | } | |
514 | ||
515 | clonesRawData = (TClonesArray*)fTOFRawStream.GetRawData(); | |
516 | for (Int_t iRawData = 0; iRawData<clonesRawData->GetEntriesFast(); iRawData++) { | |
517 | AliTOFrawData *tofRawDatum = (AliTOFrawData*)clonesRawData->UncheckedAt(iRawData); | |
518 | ||
519 | if (tofRawDatum->GetTOF()){ | |
520 | equipmentID[0]=iDDL; | |
521 | equipmentID[1]=tofRawDatum->GetTRM(); | |
522 | equipmentID[2]=tofRawDatum->GetTRMchain(); | |
523 | equipmentID[3]=tofRawDatum->GetTDC(); | |
524 | equipmentID[4]=tofRawDatum->GetTDCchannel(); | |
525 | ||
526 | if (CheckEquipID(equipmentID)){ | |
527 | fTOFRawStream.EquipmentId2VolumeId(iDDL, | |
528 | tofRawDatum->GetTRM(), | |
529 | tofRawDatum->GetTRMchain(), | |
530 | tofRawDatum->GetTDC(), | |
531 | tofRawDatum->GetTDCchannel(), | |
532 | volumeID); | |
533 | //LTM data | |
534 | if (FilterLTMData(equipmentID)) { //counts LTM hits | |
535 | if (equipmentID[2]==1) { //crate left, A-side or C-side | |
536 | FillRawsData(15,equipmentID[0]); | |
537 | } else { | |
538 | if (equipmentID[0]<36) { FillRawsData(15,equipmentID[0]-1); } | |
539 | else { FillRawsData(15,equipmentID[0]+1); } | |
540 | } | |
541 | continue; | |
542 | } | |
543 | ||
544 | //TRM data | |
545 | if (CheckVolumeID(volumeID)){ | |
546 | volumeID2[0]=volumeID[0]; | |
547 | volumeID2[1]=volumeID[1]; | |
548 | volumeID2[2]=volumeID[2]; | |
549 | volumeID2[3]=volumeID[4]; | |
550 | volumeID2[4]=volumeID[3]; | |
551 | chIndex=AliTOFGeometry::GetIndex(volumeID2); | |
552 | ||
553 | if (tofRawDatum->GetTOT()){ | |
554 | if (!(fCalibData->GetNoiseStatus(chIndex)==AliTOFChannelOnlineStatusArray::kTOFNoiseBad) | |
555 | && (fCalibData->GetHWStatus(chIndex) == AliTOFChannelOnlineStatusArray::kTOFHWOk)) {//noise and enabled filter | |
556 | ntof[0]++; //counter for tof hits | |
557 | ||
558 | //fill global spectra for DQM plots | |
559 | FillRawsData(5, tofRawDatum->GetTOF()*tdc2ns) ;//in ns | |
560 | FillRawsData(10, tofRawDatum->GetTOT()*tot2ns) ;//in ns | |
561 | ||
562 | //fill side-related spectra for experts plots | |
563 | Int_t ddlACside=iDDL/36; // 0 or 1 | |
564 | Int_t ddlPerSm=iDDL%4; | |
565 | ||
566 | if (volumeID2[0]>4 && volumeID2[0]<14){ //O side | |
567 | if (ddlPerSm<2){ //A side | |
568 | ntof[1]++; | |
569 | FillRawsData(6, tofRawDatum->GetTOF()*tdc2ns) ; | |
570 | FillRawsData(11, tofRawDatum->GetTOT()*tot2ns) ; | |
571 | } else { //C side | |
572 | ntof[3]++; | |
573 | FillRawsData(8, tofRawDatum->GetTOF()*tdc2ns) ; | |
574 | FillRawsData(13, tofRawDatum->GetTOT()*tot2ns) ; | |
575 | } | |
576 | } else { | |
577 | if (volumeID2[0]<5 || volumeID2[0]>13){ //I side | |
578 | if (ddlPerSm<2){ //A side | |
579 | ntof[2]++; | |
580 | FillRawsData(7, tofRawDatum->GetTOF()*tdc2ns) ; | |
581 | FillRawsData(12, tofRawDatum->GetTOT()*tot2ns) ; | |
582 | } else {//C side | |
583 | ntof[4]++; | |
584 | FillRawsData(9, tofRawDatum->GetTOF()*tdc2ns) ; | |
585 | FillRawsData(14, tofRawDatum->GetTOT()*tot2ns) ; | |
586 | } | |
587 | } | |
588 | } | |
589 | ||
590 | //compute TRM offset | |
591 | Int_t trm= iDDL*10+(equipmentID[1]-3); | |
592 | FillRawsData(20+ddlACside,trm,tofRawDatum->GetTOF()*tdc2ns); | |
593 | FillRawsData(22,GetStripIndex(volumeID),tofRawDatum->GetTOF()*tdc2ns) ; | |
594 | Short_t fea = volumeID2[4]/12; | |
595 | Float_t hitmapx = volumeID2[0] + ((Double_t)(3 - fea) + 0.5) *0.25; | |
596 | FillRawsData(17,hitmapx,GetStripIndex(volumeID2)); | |
597 | }//noise filter | |
598 | }//end hit selection | |
599 | else { //orphans | |
600 | if (!(fCalibData->GetNoiseStatus(chIndex) == AliTOFChannelOnlineStatusArray::kTOFNoiseBad) | |
601 | && (fCalibData->GetHWStatus(chIndex) == AliTOFChannelOnlineStatusArray::kTOFHWOk)) | |
602 | FillRawsData(19, tofRawDatum->GetTOF()*tdc2ns) ;//in ns | |
603 | }//end orphans | |
604 | }//end volumeID check | |
605 | }//end equipID check | |
606 | }//end tof check | |
607 | }//loop on raw data | |
608 | clonesRawData->Clear(); | |
609 | } // DDL Loop | |
610 | ||
611 | for (Int_t j=0;j<5;j++) FillRawsData(j,ntof[j]); | |
612 | // fProcessedRawEventN++; // RS Now the framework conters are use | |
613 | fTOFRawStream.Clear(); | |
614 | } else { | |
615 | AliDebug(1,Form("Event of type %d found. Skipping non-physics event for QA.\n", rawReader->GetType())); | |
616 | } | |
617 | ||
618 | //fill reference map for DQM shifter only once in a detector cycle | |
619 | if (fIsSOC) { | |
620 | Int_t geoId[5]={-1,-1,-1,-1,-1};// pgeoId=(sm, mod, strip, padZ, padX) | |
621 | Int_t detId[5]={-1,-1,-1,-1,-1};//detID=(ddl,trm,tdc, chain,channel) | |
622 | Int_t trmIndex=-1; | |
623 | for (Int_t ch = 0; ch < fCalibData->GetSize(); ch++) { | |
624 | AliTOFGeometry::GetVolumeIndices(ch,geoId); | |
625 | AliTOFRawStream::Geant2EquipmentId(geoId,detId); | |
626 | if ((detId[1]<0)||(detId[0]<0)) continue; | |
627 | trmIndex=(detId[1]-3)+detId[0]*10; | |
628 | ||
629 | //set TRM counters | |
630 | // if (fCalibData->GetNoiseStatus(ch)==AliTOFChannelOnlineStatusArray::kTOFNoiseBad) | |
631 | // fTRMNoisyArray[trmIndex]+=1; | |
632 | // if (fCalibData->GetHWStatus(ch) == AliTOFChannelOnlineStatusArray::kTOFHWOk) | |
633 | // fTRMHwOkArray[trmIndex]+=1; | |
634 | ||
635 | if ( (!(fCalibData->GetNoiseStatus(ch)==AliTOFChannelOnlineStatusArray::kTOFNoiseBad)) | |
636 | && (fCalibData->GetHWStatus(ch) == AliTOFChannelOnlineStatusArray::kTOFHWOk) ){ | |
637 | //fTRMEnabledArray[trmIndex]+=1; | |
638 | //fill reference map with info from OCDB | |
639 | Short_t fea = geoId[4]/12; | |
640 | Float_t hitmapx = geoId[0] + ((Double_t)(3 - fea) + 0.5)*0.25; | |
641 | FillRawsData(16,hitmapx, GetStripIndex(geoId)); | |
642 | } | |
643 | } | |
644 | //printf("Counters for noisy, enabled and good channels in TOF TRMs read from OCDB.\n"); | |
645 | fIsSOC=kFALSE; | |
646 | } | |
647 | ||
648 | //enable options for DQM shifter | |
649 | EnableDqmShifterOpt(kTRUE); | |
650 | // | |
651 | IncEvCountCycleRaws(); | |
652 | IncEvCountTotalRaws(); | |
653 | // | |
654 | } | |
655 | ||
656 | //____________________________________________________________________________ | |
657 | void AliTOFQADataMakerRec::MakeRecPoints(TTree * clustersTree) | |
658 | { | |
659 | // | |
660 | // Make data from Clusters | |
661 | // | |
662 | ||
663 | Double_t tdc2ns=AliTOFGeometry::TdcBinWidth()*1E-3; | |
664 | Double_t tot2ns=AliTOFGeometry::ToTBinWidth()*1E-3; | |
665 | ||
666 | Int_t volumeID2[5];//(sm, plate,strip, padZ,padX) | |
667 | //Int_t volumeID[5];//(sm, plate,strip, padX,padZ) | |
668 | ||
669 | TBranch *branch=clustersTree->GetBranch("TOF"); | |
670 | if (!branch) { | |
671 | AliError("can't get the branch with the TOF clusters !"); | |
672 | return; | |
673 | } | |
674 | ||
675 | static TClonesArray dummy("AliTOFcluster",10000); | |
676 | dummy.Clear(); | |
677 | TClonesArray *clusters=&dummy; | |
678 | branch->SetAddress(&clusters); | |
679 | ||
680 | // Import the tree | |
681 | clustersTree->GetEvent(0); | |
682 | ||
683 | FillRecPointsData(0,(Int_t)clusters->GetEntriesFast()) ; | |
684 | ||
685 | TIter next(clusters) ; | |
686 | AliTOFcluster * c ; | |
687 | while ( (c = dynamic_cast<AliTOFcluster *>(next())) ) { | |
688 | ||
689 | // volumeID2[0] = c->GetDetInd(0); | |
690 | // volumeID2[1] = c->GetDetInd(1); | |
691 | // volumeID2[2] = c->GetDetInd(2); | |
692 | // volumeID2[3] = c->GetDetInd(4); //padX | |
693 | // volumeID2[4] = c->GetDetInd(3); //padZ | |
694 | ||
695 | for (Int_t i=0;i<5;i++){ | |
696 | volumeID2[i]=c->GetDetInd(i); //X and Z indeces inverted in RecPoints | |
697 | } | |
698 | //Int_t chIndex=AliTOFGeometry::GetIndex(volumeID2); | |
699 | Int_t iDDL=AliTOFRawStream::Geant2DDL(volumeID2); | |
700 | Int_t iTRM=AliTOFRawStream::Geant2TRM(volumeID2); | |
701 | Short_t fea = volumeID2[4]/12; | |
702 | Float_t hitmapx = volumeID2[0] + ((Double_t)(3 - fea) + 0.5) *0.25; | |
703 | Int_t ddlACside=iDDL/36; // 0 or 1 | |
704 | Int_t ddlPerSm=iDDL%4; | |
705 | ||
706 | if ((c->GetTDCRAW()) && (c->GetTDC()) && (c->GetToT())){ | |
707 | if (volumeID2[0]>4 && volumeID2[0]<14){ //I side | |
708 | if (ddlPerSm<2){ //A side | |
709 | FillRecPointsData(1, c->GetTDC()*tdc2ns) ;//in ns | |
710 | FillRecPointsData(5, c->GetTDCRAW()*tdc2ns) ;//in ns | |
711 | FillRecPointsData(9, c->GetToT()*tot2ns) ;//in ns | |
712 | } else {//C side | |
713 | FillRecPointsData(3, c->GetTDC()*tdc2ns) ;//in ns | |
714 | FillRecPointsData(7, c->GetTDCRAW()*tdc2ns) ;//in ns | |
715 | FillRecPointsData(11, c->GetToT()*tot2ns) ;//in ns | |
716 | } | |
717 | } else { | |
718 | if (volumeID2[0]<5 || volumeID2[0]>13){ //O side | |
719 | if (ddlPerSm<2){ //A side | |
720 | FillRecPointsData(2, c->GetTDC()*tdc2ns) ;//in ns | |
721 | FillRecPointsData(6, c->GetTDCRAW()*tdc2ns) ;//in ns | |
722 | FillRecPointsData(10, c->GetToT()*tot2ns) ;//in ns | |
723 | } else { //C side | |
724 | FillRecPointsData(4, c->GetTDC()*tdc2ns) ;//in ns | |
725 | FillRecPointsData(8, c->GetTDCRAW()*tdc2ns) ;//in ns | |
726 | FillRecPointsData(12, c->GetToT()*tot2ns) ;//in ns | |
727 | } | |
728 | } | |
729 | } | |
730 | FillRecPointsData(13,hitmapx,GetStripIndex(volumeID2)); | |
731 | FillRecPointsData(14,GetStripIndex(volumeID2), c->GetTDC()*tdc2ns) ; | |
732 | Int_t trm= iDDL*10+(iTRM-3); | |
733 | if (ddlACside==0) { //A side | |
734 | FillRecPointsData(15,trm,c->GetTDC()*tdc2ns); | |
735 | } else {//C side | |
736 | FillRecPointsData(16,trm,c->GetTDC()*tdc2ns); | |
737 | } | |
738 | }//hit selection | |
739 | }//end while | |
740 | EnableDqmShifterOpt(kFALSE); | |
741 | // | |
742 | IncEvCountCycleRecPoints(); | |
743 | IncEvCountTotalRecPoints(); | |
744 | // | |
745 | } | |
746 | ||
747 | //____________________________________________________________________________ | |
748 | void AliTOFQADataMakerRec::MakeESDs(AliESDEvent * esd) | |
749 | { | |
750 | // | |
751 | // make QA data from ESDs | |
752 | // | |
753 | const Double_t speedOfLight = TMath::C()*1E2*1E-12; // cm/ps | |
754 | const Double_t pionMass = 0.13957018; //GeV/c^2 | |
755 | ||
756 | Int_t ntrk = esd->GetNumberOfTracks() ; | |
757 | Int_t ntpc=0; | |
758 | Int_t ntofout=0; | |
759 | ||
760 | while (ntrk--) { | |
761 | AliESDtrack *track=esd->GetTrack(ntrk); | |
762 | Double_t tofTime=track->GetTOFsignal();//in ps | |
763 | Double_t tofTimeRaw=track->GetTOFsignalRaw();//in ps | |
764 | Double_t tofToT=track->GetTOFsignalToT(); //in ps | |
765 | ||
766 | UInt_t status=track->GetStatus(); | |
767 | if (track->IsOn(AliESDtrack::kTPCrefit)) { | |
768 | ntpc++; | |
769 | Double_t y=track->Eta(); | |
770 | if (TMath::Abs(y)<0.9) { //select TOF acceptance | |
771 | if ((status&AliESDtrack::kTOFout)!=0) { //define matching | |
772 | ntofout++; | |
773 | FillESDsData(1,tofTime*1E-3); | |
774 | FillESDsData(2,tofTimeRaw*1E-3); | |
775 | FillESDsData(3,tofToT*1E-3); | |
776 | FillESDsData(4,track->Pt()); | |
777 | ||
778 | Double_t length =track->GetIntegratedLength(); | |
779 | Double_t mom2=(track->Pt()*track->Pt())+(track->Pz()*track->Pz()); | |
780 | Double_t piTexp = TMath::Sqrt(1+(pionMass*pionMass/mom2))*length/speedOfLight; //in ps | |
781 | FillESDsData(8,tofTime-piTexp); | |
782 | FillESDsData(9,length); | |
783 | ||
784 | if ((status&AliESDtrack::kTIME)!=0) | |
785 | FillESDsData(5,track->Pt()); | |
786 | ||
787 | if (tofTime>0) | |
788 | FillESDsData(6,track->Pt()); | |
789 | } //end check on matched tracks | |
790 | } | |
791 | }//end check on TPCrefit | |
792 | } | |
793 | ||
794 | FillESDsData(0,ntofout) ; | |
795 | if(ntpc>0){ | |
796 | Float_t ratio = (Float_t)ntofout/(Float_t)ntpc*100.; //matching probability | |
797 | FillESDsData(7,ratio) ; | |
798 | } | |
799 | ||
800 | if(ntofout>0) { | |
801 | Float_t ratio = (Float_t)ntofout/(Float_t)ntpc*100; //matched over propagated to TOF outer radius | |
802 | FillESDsData(8,ratio) ; | |
803 | } | |
804 | EnableDqmShifterOpt(kFALSE); | |
805 | // | |
806 | IncEvCountCycleESDs(); | |
807 | IncEvCountTotalESDs(); | |
808 | // | |
809 | } | |
810 | ||
811 | //____________________________________________________________________________ | |
812 | void AliTOFQADataMakerRec::StartOfDetectorCycle() | |
813 | { | |
814 | // | |
815 | //Detector specific actions at start of cycle | |
816 | // ResetAllTRMcounters(); | |
817 | fCalibData = GetCalibData(); | |
818 | fIsSOC=kTRUE; | |
819 | return; | |
820 | } | |
821 | ||
822 | //____________________________________________________________________________ | |
823 | void AliTOFQADataMakerRec::EndOfDetectorCycle(AliQAv1::TASKINDEX_t task, TObjArray ** list) | |
824 | { | |
825 | //Detector specific actions at end of cycle | |
826 | // do the QA checking | |
827 | ResetEventTrigClasses(); | |
828 | // | |
829 | for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) { | |
830 | if ( !AliQAv1::Instance()->IsEventSpecieSet(specie) ) continue ; | |
831 | // | |
832 | SetEventSpecie(AliRecoParam::ConvertIndex(specie)); // RS: the specie is not set, why? | |
833 | // | |
834 | for (int itc=-1;itc<GetNTrigClasses();itc++) { // RS: loop over eventual clones per trigger class | |
835 | // | |
836 | if (fEnableDqmShifterOpt) { | |
837 | // | |
838 | // RS: fetch the histograms for given trigger class | |
839 | TObjArray& arrRW = *GetRawsDataOfTrigClass(itc); | |
840 | ||
841 | // Help make the raw qa histogram easier to interpret for the DQM shifter | |
842 | if (!arrRW[ 0] || !arrRW[ 5] || !arrRW[10] || !arrRW[15] || !arrRW[16] || !arrRW[17]) continue; | |
843 | //printf("No histogram for DQM found - Possible memory corruption ???. Please check\n") ; | |
844 | printf("=========>Processed %i physics raw of specie %s with TrigGlass %d\n", | |
845 | GetEvCountCycleRaws(itc),AliRecoParam::GetEventSpecieName(specie), itc); | |
846 | ||
847 | //Double_t monitorPeriodLength=fProcessedRawEventN*600*1E-9;//in s | |
848 | ||
849 | if (fCalibData){ | |
850 | //set minima and maxima to allow log scale | |
851 | Double_t yTimeMax = ((TH1*)arrRW[5])->GetMaximum()*1.05; | |
852 | Double_t yTotMax = ((TH1*)arrRW[10])->GetMaximum()*1.05; | |
853 | fLineExpTimeMin->SetY2(yTimeMax); | |
854 | fLineExpTimeMax->SetY2(yTimeMax); | |
855 | fLineExpTotMin->SetY2(yTotMax); | |
856 | fLineExpTotMax->SetY2(yTotMax); | |
857 | // | |
858 | for (Int_t j=0;j<18;j++){ | |
859 | if ((j==0)||(j==5)||(j==10)||(j==15)||(j==16)||(j==17)) { | |
860 | TH1* htmp = (TH1*)arrRW[j]; | |
861 | htmp->GetXaxis()->SetLabelOffset(0.005); | |
862 | htmp->GetXaxis()->SetLabelSize(0.05); | |
863 | htmp->GetXaxis()->SetTitleOffset(0.8); | |
864 | htmp->GetXaxis()->SetTitleSize(0.05); | |
865 | htmp->GetYaxis()->SetLabelOffset(0.005); | |
866 | htmp->GetYaxis()->SetLabelSize(0.06); | |
867 | htmp->GetYaxis()->SetTitleOffset(0.8); | |
868 | htmp->GetYaxis()->SetTitleSize(0.06); | |
869 | } | |
870 | } | |
871 | //make up for all histos | |
872 | for(Int_t j=0;j<5;j++) { | |
873 | TH1* htmp = (TH1*)arrRW[j]; | |
874 | if (!htmp) continue; | |
875 | htmp->SetMarkerColor(kBlue); | |
876 | htmp->SetMarkerStyle(8); | |
877 | htmp->SetMarkerSize(0.7); | |
878 | } | |
879 | for(Int_t j=5;j<15;j++) { | |
880 | TH1* htmp = (TH1*)arrRW[j]; | |
881 | if (!htmp) continue; | |
882 | htmp->SetLineColor(kBlue); | |
883 | htmp->SetLineWidth(1); | |
884 | htmp->SetMarkerColor(kBlue); | |
885 | //htmp->SetFillColor(kWhite); | |
886 | //htmp->SetDrawOption("bar"); | |
887 | } | |
888 | // | |
889 | TH1* htmp = (TH1*)arrRW[15]; | |
890 | htmp->SetLineColor(kBlue); | |
891 | htmp->SetLineWidth(1); | |
892 | htmp->SetMarkerStyle(8); | |
893 | htmp->SetMarkerSize(0.7); | |
894 | htmp->SetMarkerColor(kBlue);//Option("bar"); | |
895 | // | |
896 | if ( (htmp=(TH1*)arrRW[16]) ) htmp->SetOption("colz"); | |
897 | if ( (htmp=(TH1*)arrRW[17]) ) htmp->SetOption("colz"); | |
898 | if ( (htmp=(TH1*)arrRW[18]) ) htmp->SetOption("colz"); | |
899 | } | |
900 | }//END ENABLE DQM SHIFTER OPT | |
901 | } // RS: loop over trigger classes | |
902 | } //end for | |
903 | // | |
904 | AliQAChecker::Instance()->Run(AliQAv1::kTOF, task, list) ; | |
905 | // | |
906 | } | |
907 | //____________________________________________________________________________ | |
908 | void AliTOFQADataMakerRec::GetMapIndeces(const Int_t* const in , Int_t* out) | |
909 | { | |
910 | // | |
911 | //return appropriate indeces for the theta-phi map | |
912 | // | |
913 | ||
914 | Int_t npadX = AliTOFGeometry::NpadX(); | |
915 | Int_t npadZ = AliTOFGeometry::NpadZ(); | |
916 | Int_t nStripA = AliTOFGeometry::NStripA(); | |
917 | Int_t nStripB = AliTOFGeometry::NStripB(); | |
918 | Int_t nStripC = AliTOFGeometry::NStripC(); | |
919 | ||
920 | Int_t isector = in[0]; | |
921 | Int_t iplate = in[1]; | |
922 | Int_t istrip = in[2]; | |
923 | Int_t ipadX = in[3]; | |
924 | Int_t ipadZ = in[4]; | |
925 | ||
926 | Int_t stripOffset = 0; | |
927 | switch (iplate) { | |
928 | case 0: | |
929 | stripOffset = 0; | |
930 | break; | |
931 | case 1: | |
932 | stripOffset = nStripC; | |
933 | break; | |
934 | case 2: | |
935 | stripOffset = nStripC+nStripB; | |
936 | break; | |
937 | case 3: | |
938 | stripOffset = nStripC+nStripB+nStripA; | |
939 | break; | |
940 | case 4: | |
941 | stripOffset = nStripC+nStripB+nStripA+nStripB; | |
942 | break; | |
943 | default: | |
944 | AliDebug(1,Form("Wrong plate number in TOF (%d) !",iplate)); | |
945 | break; | |
946 | }; | |
947 | Int_t zindex=npadZ*(istrip+stripOffset)+(ipadZ+1); | |
948 | Int_t phiindex=npadX*isector+ipadX+1; | |
949 | out[0]=zindex; | |
950 | out[1]=phiindex; | |
951 | ||
952 | } | |
953 | ||
954 | //--------------------------------------------------------------- | |
955 | Int_t AliTOFQADataMakerRec::GetStripIndex(const Int_t * const in) | |
956 | { | |
957 | /* return tof strip index between 0 and 91 */ | |
958 | ||
959 | Int_t nStripA = AliTOFGeometry::NStripA(); | |
960 | Int_t nStripB = AliTOFGeometry::NStripB(); | |
961 | Int_t nStripC = AliTOFGeometry::NStripC(); | |
962 | ||
963 | // Int_t isector = in[0]; | |
964 | Int_t iplate = in[1]; | |
965 | Int_t istrip = in[2]; | |
966 | //Int_t ipadX = in[3]; | |
967 | //Int_t ipadZ = in[4]; | |
968 | ||
969 | Int_t stripOffset = 0; | |
970 | switch (iplate) { | |
971 | case 0: | |
972 | stripOffset = 0; | |
973 | break; | |
974 | case 1: | |
975 | stripOffset = nStripC; | |
976 | break; | |
977 | case 2: | |
978 | stripOffset = nStripC+nStripB; | |
979 | break; | |
980 | case 3: | |
981 | stripOffset = nStripC+nStripB+nStripA; | |
982 | break; | |
983 | case 4: | |
984 | stripOffset = nStripC+nStripB+nStripA+nStripB; | |
985 | break; | |
986 | default: | |
987 | AliDebug(1,Form("Wrong plate number in TOF (%d) !",iplate)); | |
988 | stripOffset=-1; | |
989 | break; | |
990 | }; | |
991 | ||
992 | if (stripOffset<0 || stripOffset>92) return -1; | |
993 | else | |
994 | return (stripOffset+istrip); | |
995 | ||
996 | } | |
997 | //--------------------------------------------------------------- | |
998 | Bool_t AliTOFQADataMakerRec::CheckVolumeID(const Int_t * const volumeID) | |
999 | { | |
1000 | // | |
1001 | //Checks volume ID validity | |
1002 | // | |
1003 | ||
1004 | for (Int_t j=0;j<5;j++){ | |
1005 | if (volumeID[j]<0) { | |
1006 | AliDebug(1,Form("Invalid detector volume index for volumeID[%i]",j)); | |
1007 | return kFALSE; | |
1008 | } | |
1009 | } | |
1010 | return kTRUE; | |
1011 | ||
1012 | } | |
1013 | ||
1014 | //--------------------------------------------------------------- | |
1015 | Bool_t AliTOFQADataMakerRec::CheckEquipID(const Int_t * const equipmentID) | |
1016 | { | |
1017 | // | |
1018 | //Checks equipment ID validity | |
1019 | ||
1020 | for (Int_t j=0;j<5;j++){ | |
1021 | if (equipmentID[j]<0) { | |
1022 | AliDebug(1,Form("Invalid equipment volume index for equipmentID[%i]",j)); | |
1023 | return kFALSE; | |
1024 | } | |
1025 | } | |
1026 | return kTRUE; | |
1027 | } | |
1028 | //--------------------------------------------------------------- | |
1029 | Bool_t AliTOFQADataMakerRec::FilterLTMData(const Int_t * const equipmentID) const | |
1030 | { | |
1031 | /*It returns kTRUE if data come from LTM. | |
1032 | It thus filters trigger-related signals */ | |
1033 | ||
1034 | Int_t ddl, trm, tdc; | |
1035 | //if (!CheckEquipID(equipmentID)) return kFALSE; | |
1036 | ddl = equipmentID[0]; | |
1037 | trm = equipmentID[1]; | |
1038 | tdc = equipmentID[3]; | |
1039 | ||
1040 | if ((ddl%2==1) && (trm==3) && (tdc>11 && tdc<15)) | |
1041 | return kTRUE; | |
1042 | else | |
1043 | return kFALSE; | |
1044 | ||
1045 | } | |
1046 | //--------------------------------------------------------------- | |
1047 | Bool_t AliTOFQADataMakerRec::FilterSpare(const Int_t * const equipmentID) const | |
1048 | { | |
1049 | /*It returns kTRUE if data come from spare | |
1050 | equipment ID. | |
1051 | So far only check on TRM 3 crate left is implemented */ | |
1052 | ||
1053 | Int_t ddl, trm, tdc; | |
1054 | //if (!CheckEquipID(equipmentID)) return kFALSE; | |
1055 | ddl = equipmentID[0]; | |
1056 | trm = equipmentID[1]; | |
1057 | tdc = equipmentID[3]; | |
1058 | ||
1059 | if ((ddl%2==1) && (trm==3) && (tdc>2 && tdc<12)) | |
1060 | return kTRUE; | |
1061 | else | |
1062 | return kFALSE; | |
1063 | ||
1064 | } | |
1065 | //---------------------------------------------------------------- | |
1066 | /*void AliTOFQADataMakerRec::ResetAllTRMcounters() | |
1067 | { | |
1068 | //resets all TRM counters to 0 | |
1069 | for (Int_t trm=0;trm<720;trm++){ | |
1070 | fTRMNoisyArray[trm]=-1; | |
1071 | fTRMHwOkArray[trm]=-1; | |
1072 | fTRMEnabledArray[trm]=-1; | |
1073 | } | |
1074 | return; | |
1075 | ||
1076 | } | |
1077 | */ |