1 /**************************************************************************
2 * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line 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. 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 **************************************************************************/
20 Based on AliPHOSQADataMaker
21 Produces the data needed to calculate the quality assurance.
22 All data must be mergeable objects.
23 P. Christiansen, Lund, January 2008
29 We have chosen to have the histograms as non-persistent meber to
30 allow better debugging. In the copy constructor we then have to
31 assign the pointers to the existing histograms in the copied
32 list. This have been implemented but not tested.
34 For the QA of the RAW data we use the class, AliTPCdataQA, from the
35 existing TPC Calibration framework (which is more advanced than the
36 standard QA framework) and extract the histograms at the end. This
37 has been tested with zero-suppressed data. The Analyse method of the
38 AliTPCdataQA class is called in the method, EndOfDetectorCycle, and
39 there also: 1d histogram(s) are projected and added to the QA list.
44 Sumw2 for RAW histogram(s)?
45 RecPoints and ESD could have many more histograms
48 #include "AliTPCQADataMakerRec.h"
50 // --- ROOT system ---
51 #include <TClonesArray.h>
55 // --- Standard library ---
57 // --- AliRoot header files ---
58 #include "AliQAChecker.h"
59 #include "AliESDEvent.h"
60 #include "AliESDtrack.h"
62 #include "AliTPCCalPad.h"
63 #include "AliTPCCalROC.h"
64 #include "AliTPCClustersRow.h"
65 #include "AliTPCclusterMI.h"
67 ClassImp(AliTPCQADataMakerRec)
69 //____________________________________________________________________________
70 AliTPCQADataMakerRec::AliTPCQADataMakerRec() :
71 AliQADataMakerRec(AliQAv1::GetDetName(AliQAv1::kTPC),
72 "TPC Rec Quality Assurance Data Maker"),
76 fTPCdataQA = new AliTPCdataQA*[AliRecoParam::kNSpecies] ;
77 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++)
78 fTPCdataQA[specie] = NULL ;
80 for(Int_t i = 0; i < 6; i++)
84 //____________________________________________________________________________
85 AliTPCQADataMakerRec::AliTPCQADataMakerRec(const AliTPCQADataMakerRec& qadm) :
90 // Does not copy the calibration object, instead InitRaws have to be
92 SetName((const char*)qadm.GetName()) ;
93 SetTitle((const char*)qadm.GetTitle());
95 fTPCdataQA = new AliTPCdataQA*[AliRecoParam::kNSpecies] ;
96 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++)
97 fTPCdataQA[specie] = NULL ;
99 for(Int_t i = 0; i < 6; i++)
103 // Associate class histogram objects to the copies in the list
104 // Could also be done with the indexes
109 //__________________________________________________________________
110 AliTPCQADataMakerRec& AliTPCQADataMakerRec::operator = (const AliTPCQADataMakerRec& qadm )
113 this->~AliTPCQADataMakerRec();
114 new(this) AliTPCQADataMakerRec(qadm);
118 //__________________________________________________________________
119 AliTPCQADataMakerRec::~AliTPCQADataMakerRec()
122 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++)
123 if ( fTPCdataQA[specie] != NULL )
124 delete fTPCdataQA[specie] ;
127 for(Int_t i = 0; i < 6; i++)
131 //____________________________________________________________________________
132 void AliTPCQADataMakerRec::EndOfDetectorCycle(AliQAv1::TASKINDEX_t task, TObjArray ** list)
134 //Detector specific actions at end of cycle
136 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
137 if ( !AliQAv1::Instance()->IsEventSpecieSet(specie) )
139 if(fTPCdataQA[specie] != NULL) { // do the final step of the QA for Raw data
141 fTPCdataQA[specie]->Analyse(); // 31/1-08 Analyse is now protected against
142 // RAW data files with no TPC data
144 SetEventSpecie(specie) ;
145 TH1F * histRawsOccupancy = (TH1F*)GetRawsData(kOccupancy) ;
146 TH1F * histRawsOccupancyVsSector = (TH1F*)GetRawsData(kOccupancyVsSector) ;
147 TH1F * histRawsNClustersPerEventVsSector = (TH1F*)GetRawsData(kNClustersPerEventVsSector) ;
148 TH1F * histRawsQVsSector = (TH1F*)GetRawsData(kQVsSector) ;
149 TH1F * histRawsQmaxVsSector = (TH1F*)GetRawsData(kQmaxVsSector) ;
150 if ( !histRawsOccupancy ||
151 !histRawsOccupancyVsSector ||
152 !histRawsNClustersPerEventVsSector ||
153 !histRawsQVsSector ||
154 !histRawsQmaxVsSector) {
155 AliError("Something very wrong here, corrupted memory ?????. Please check\n") ;
159 //Add2RawsList(fTPCdataQA, 0);
160 // get the histograms and add them to the output
161 // 31/8-08 Histogram is only added if the Calibration class
163 const Int_t eventCounter = fTPCdataQA[specie]->GetEventCounter();
164 if(eventCounter>0) { // some TPC data has been processed
166 // Reset histograms and refill them
167 histRawsOccupancy->Reset();
168 histRawsOccupancyVsSector->Reset();
169 histRawsNClustersPerEventVsSector->Reset();
170 histRawsQVsSector->Reset();
171 histRawsQmaxVsSector->Reset();
173 TH1F* hNorm72 = new TH1F("hNorm72", "histogram to normalize 72 sectors",
176 TH1F* hNorm108 = new TH1F("hNorm108", "histogram to normalize 108 sectors (medium and long pads are split up)",
180 for (Int_t iSec = 0; iSec < 72; iSec++) {
182 AliTPCCalROC* occupancyROC =
183 fTPCdataQA[specie]->GetNoThreshold()->GetCalROC(iSec);
184 AliTPCCalROC* nclusterROC =
185 fTPCdataQA[specie]->GetNLocalMaxima()->GetCalROC(iSec);
187 fTPCdataQA[specie]->GetMeanCharge()->GetCalROC(iSec);
188 AliTPCCalROC* qmaxROC =
189 fTPCdataQA[specie]->GetMaxCharge()->GetCalROC(iSec);
191 const Int_t nRows = occupancyROC->GetNrows();
192 for (Int_t iRow = 0; iRow < nRows; iRow++) {
194 Int_t helpSector = iSec;
196 helpSector += 36; // OROC (long pads)
198 const Int_t nPads = occupancyROC->GetNPads(iRow);
199 for (Int_t iPad = 0; iPad < nPads; iPad++) {
201 histRawsOccupancy->Fill(occupancyROC->GetValue(iRow, iPad));
203 histRawsOccupancyVsSector
204 ->Fill(iSec, occupancyROC->GetValue(iRow, iPad));
206 const Int_t nClusters = TMath::Nint(nclusterROC->GetValue(iRow, iPad));
210 histRawsNClustersPerEventVsSector->Fill(iSec, nClusters);
211 hNorm108->Fill(helpSector, nClusters);
212 histRawsQVsSector->Fill(helpSector,
213 nClusters*qROC->GetValue(iRow, iPad));
214 histRawsQmaxVsSector->Fill(helpSector,
215 nClusters*qmaxROC->GetValue(iRow, iPad));
219 } // end loop over sectors
221 // Normalize histograms
222 histRawsOccupancyVsSector->Divide(hNorm72);
223 histRawsNClustersPerEventVsSector->Scale(1.0/Float_t(eventCounter));
224 histRawsQVsSector->Divide(hNorm108);
225 histRawsQmaxVsSector->Divide(hNorm108);
231 AliQAChecker::Instance()->Run(AliQAv1::kTPC, task, list) ;
234 //____________________________________________________________________________
235 void AliTPCQADataMakerRec::InitESDs()
237 //create ESDs histograms in ESDs subdir
238 const Bool_t expert = kTRUE ;
239 const Bool_t image = kTRUE ;
241 TH1F * histESDclusters =
242 new TH1F("hESDclusters", "N TPC clusters per track; N clusters; Counts",
244 histESDclusters->Sumw2();
245 Add2ESDsList(histESDclusters, KClusters, !expert, image);
247 TH1F * histESDratio =
248 new TH1F("hESDratio", "Ratio: TPC clusters / findable; Ratio: cluster/findable; Counts",
250 histESDratio->Sumw2();
251 Add2ESDsList(histESDratio, kRatio, !expert, image);
254 new TH1F("hESDpt", "P_{T} distribution; p_{T} [GeV/c]; Counts",
257 Add2ESDsList(histESDpt, kPt, !expert, image);
260 //____________________________________________________________________________
261 void AliTPCQADataMakerRec::InitRaws()
267 // Modified: 7/7 - 2008
268 // Laurent Aphecetche pointed out that the mapping was read from file
269 // for each event, so now we read in the map here and set if for
271 const Bool_t expert = kTRUE ;
272 const Bool_t saveCorr = kTRUE ;
273 const Bool_t image = kTRUE ;
275 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
276 fTPCdataQA[specie] = new AliTPCdataQA(AliRecoParam::Convert(specie));
277 LoadMaps(); // Load Altro maps
278 fTPCdataQA[specie]->SetAltroMapping(fMapping); // set Altro mapping
279 fTPCdataQA[specie]->SetRangeTime(100, 920); // set time bin interval
280 // Add2RawsList(fTPCdataQA, kTPCdataQ, !expert, image, !saveCorrA); // This is used by the AMORE monitoring <------- THIS WILL FAIL (YS)
283 TH1F * histRawsOccupancy =
284 new TH1F("hRawsOccupancy", "Occupancy (all pads); Occupancy; Counts",
286 histRawsOccupancy->Sumw2();
287 Add2RawsList(histRawsOccupancy, kOccupancy, !expert, image, !saveCorr);
289 TH1F * histRawsOccupancyVsSector =
290 new TH1F("hRawsOccupancyVsSector", "Occupancy vs sector; Sector; Occupancy",
292 histRawsOccupancyVsSector->Sumw2();
293 Add2RawsList(histRawsOccupancyVsSector, kOccupancyVsSector, !expert, image, !saveCorr);
295 TH1F * histRawsNClustersPerEventVsSector =
296 new TH1F("hRawsNClustersPerEventVsSector", "Nclusters per event vs sector; Sector; Nclusters per event",
298 histRawsNClustersPerEventVsSector->Sumw2();
299 Add2RawsList(histRawsNClustersPerEventVsSector, kNClustersPerEventVsSector, !expert, image, !saveCorr);
301 TH1F * histRawsQVsSector =
302 new TH1F("hRawsQVsSector", "<Q> vs sector (OROC med: 36-71, long: 72-107); Sector; <Q>",
304 histRawsQVsSector->Sumw2();
305 Add2RawsList(histRawsQVsSector, kQVsSector, !expert, image, !saveCorr);
307 TH1F * histRawsQmaxVsSector =
308 new TH1F("hRawsQmaxVsSector", "<Qmax> vs sector (OROC med: 36-71, long: 72-107); Sector; <Qmax>",
310 histRawsQmaxVsSector->Sumw2();
311 Add2RawsList(histRawsQmaxVsSector, kQmaxVsSector, !expert, image, !saveCorr);
314 //____________________________________________________________________________
315 void AliTPCQADataMakerRec::InitRecPoints()
317 const Bool_t expert = kTRUE ;
318 const Bool_t image = kTRUE ;
320 TH1F * histRecPointsQmaxShort =
321 new TH1F("hRecPointsQmaxShort", "Qmax distrbution (short pads); Qmax; Counts",
323 histRecPointsQmaxShort->Sumw2();
324 Add2RecPointsList(histRecPointsQmaxShort, kQmaxShort, !expert, image);
326 TH1F * histRecPointsQmaxMedium =
327 new TH1F("hRecPointsQmaxMedium", "Qmax distrbution (medium pads); Qmax; Counts",
329 histRecPointsQmaxMedium->Sumw2();
330 Add2RecPointsList(histRecPointsQmaxMedium, kQmaxMedium, !expert, image);
332 TH1F * histRecPointsQmaxLong =
333 new TH1F("hRecPointsQmaxLong", "Qmax distrbution (long pads); Qmax; Counts",
335 histRecPointsQmaxLong->Sumw2();
336 Add2RecPointsList(histRecPointsQmaxLong, kQmaxLong, !expert, image);
338 TH1F * histRecPointsQShort =
339 new TH1F("hRecPointsQShort", "Q distrbution (short pads); Q; Counts",
341 histRecPointsQShort->Sumw2();
342 Add2RecPointsList(histRecPointsQShort, kQShort, !expert, image);
344 TH1F * histRecPointsQMedium =
345 new TH1F("hRecPointsQMedium", "Q distrbution (medium pads); Q; Counts",
347 histRecPointsQMedium->Sumw2();
348 Add2RecPointsList(histRecPointsQMedium, kQMedium, !expert, image);
350 TH1F * histRecPointsQLong =
351 new TH1F("hRecPointsQLong", "Q distrbution (long pads); Q; Counts",
353 histRecPointsQLong->Sumw2();
354 Add2RecPointsList(histRecPointsQLong, kQLong, !expert, image);
356 TH1F * histRecPointsRow =
357 new TH1F("hRecPointsRow", "Clusters per row; Row; Counts",
359 histRecPointsRow->Sumw2();
360 Add2RecPointsList(histRecPointsRow, kRow, !expert, image);
363 //____________________________________________________________________________
364 void AliTPCQADataMakerRec::MakeESDs(AliESDEvent * esd)
366 // make QA data from ESDs
368 const Int_t nESDTracks = esd->GetNumberOfTracks();
369 Int_t nTPCtracks = 0;
370 for(Int_t i = 0; i < nESDTracks; i++) {
372 AliESDtrack * track = esd->GetTrack(i);
374 if ((track->GetStatus() & AliESDtrack::kTPCrefit)==0)
379 Int_t nTPCclusters = track->GetTPCNcls();
380 Int_t nTPCclustersFindable = track->GetTPCNclsF();
381 if ( nTPCclustersFindable<=0) continue;
382 GetESDsData(KClusters)->Fill(nTPCclusters);
383 GetESDsData(kRatio)->Fill(Float_t(nTPCclusters)/Float_t(nTPCclustersFindable));
384 GetESDsData(kPt)->Fill(track->Pt());
388 //____________________________________________________________________________
389 void AliTPCQADataMakerRec::MakeRaws(AliRawReader* rawReader)
392 // To make QA for the RAW data we use the TPC Calibration framework
393 // to handle the data and then in the end extract the data
396 fTPCdataQA[AliRecoParam::AConvert(fEventSpecie)]->ProcessEvent(rawReader);
399 //____________________________________________________________________________
400 void AliTPCQADataMakerRec::MakeRecPoints(TTree* recTree)
402 AliTPCClustersRow *clrow = new AliTPCClustersRow();
403 clrow->SetClass("AliTPCclusterMI");
405 clrow->GetArray()->ExpandCreateFast(10000);
407 TBranch* branch = recTree->GetBranch("Segment");
408 branch->SetAddress(&clrow);
410 const Int_t nEntries = Int_t(recTree->GetEntries());
411 for (Int_t i = 0; i < nEntries; i++) {
415 const Int_t nClusters = clrow->GetArray()->GetEntriesFast();
416 for (Int_t icl=0; icl < nClusters; icl++){
418 AliTPCclusterMI* cluster =
419 (AliTPCclusterMI*)clrow->GetArray()->At(icl);
421 Float_t Qmax = cluster->GetMax();
422 Float_t Q = cluster->GetQ();
423 Int_t row = cluster->GetRow();
425 if(cluster->GetDetector()<36) { // IROC (short pads)
427 GetRecPointsData(kQmaxShort)->Fill(Qmax);
428 GetRecPointsData(kQShort)->Fill(Q);
429 } else { // OROC (medium and long pads)
431 if(cluster->GetRow()<64) { // medium pads
433 GetRecPointsData(kQmaxMedium)->Fill(Qmax);
434 GetRecPointsData(kQMedium)->Fill(Q);
435 } else { // long pads
437 GetRecPointsData(kQmaxLong)->Fill(Qmax);
438 GetRecPointsData(kQLong)->Fill(Q);
442 GetRecPointsData(kRow)->Fill(row);
443 } // end loop over clusters
444 } // end loop over tree
449 //____________________________________________________________________________
450 void AliTPCQADataMakerRec::LoadMaps()
452 TString path = gSystem->Getenv("ALICE_ROOT");
453 path += "/TPC/mapping/Patch";
455 for(Int_t i = 0; i < 6; i++) {
456 TString path2 = path;
459 fMapping[i] = new AliTPCAltroMapping(path2.Data());