1 #include "AliAnalysisTask.h"
2 #include "AliAnalysisManager.h"
3 #include "AliAnalysisDataContainer.h"
4 #include "AliITSRecPoint.h"
5 #include "AliESDEvent.h"
6 #include "AliTrackPointArray.h"
7 #include "AliITSgeomTGeo.h"
8 #include "AliITSTPArrayFit.h"
9 #include "AliESDfriend.h"
10 #include "AliCDBManager.h"
11 #include "AliCDBEntry.h"
12 #include "AliITSCalibrationSDD.h"
13 #include "AliITSresponseSDD.h"
14 #include "AliGeomManager.h"
20 #include <TGeoGlobalMagField.h>
21 #include "AliESDInputHandlerRP.h"
23 /**************************************************************************
24 * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
26 * Author: The ALICE Off-line Project. *
27 * Contributors are mentioned in the code where appropriate. *
29 * Permission to use, copy, modify and distribute this software and its *
30 * documentation strictly for non-commercial purposes is hereby granted *
31 * without fee, provided that the above copyright notice appears in all *
32 * copies and that both the copyright notice and this permission notice *
33 * appear in the supporting documentation. The authors make no claims *
34 * about the suitability of this software for any purpose. It is *
35 * provided "as is" without express or implied warranty. *
36 **************************************************************************/
38 //*************************************************************************
39 // Implementation of class AliAnalysiTaskITSAlignQA
40 // AliAnalysisTaskSE to extract from ESD + ESDfriends
41 // the track-to-point residuals and dE/dx vs, time for SDD modules
43 // Author: F. Prino, prino@to.infn.it
44 //*************************************************************************
47 #include "AliAnalysisTaskITSAlignQA.h"
49 ClassImp(AliAnalysisTaskITSAlignQA)
50 //______________________________________________________________________________
51 AliAnalysisTaskITSAlignQA::AliAnalysisTaskITSAlignQA() : AliAnalysisTaskSE("SDD Calibration"),
55 fDoSPDResiduals(kTRUE),
56 fDoSDDResiduals(kTRUE),
57 fDoSSDResiduals(kTRUE),
58 fDoSDDdEdxCalib(kTRUE),
59 fUseITSsaTracks(kFALSE),
66 fOCDBLocation("local://$ALICE_ROOT/OCDB")
69 fFitter = new AliITSTPArrayFit(5);
70 Double_t xbins[9]={0.3,0.5,0.75,1.,1.5,2.,3.,5.,10.};
71 SetPtBinLimits(8,xbins);
72 DefineOutput(1, TList::Class());
76 //___________________________________________________________________________
77 AliAnalysisTaskITSAlignQA::~AliAnalysisTaskITSAlignQA(){
87 for(Int_t i=0;i<kNSDDmods;i++){
88 if(fHistSDDResidXvsX[i]){ delete fHistSDDResidXvsX[i]; fHistSDDResidXvsX[i]=0;}
89 if(fHistSDDResidXvsZ[i]){ delete fHistSDDResidXvsX[i]; fHistSDDResidXvsX[i]=0;}
90 if(fHistSDDResidZvsX[i]){ delete fHistSDDResidXvsX[i]; fHistSDDResidXvsX[i]=0;}
91 if(fHistSDDResidZvsZ[i]){ delete fHistSDDResidXvsX[i]; fHistSDDResidXvsX[i]=0;}
92 if(fHistSDDdEdxvsDrTime[i]){ delete fHistSDDdEdxvsDrTime[i]; fHistSDDdEdxvsDrTime[i]=0;}
93 if(fHistSDDDrTimeAll[i]){ delete fHistSDDDrTimeAll[i]; fHistSDDDrTimeAll[i]=0;}
94 if(fHistSDDDrTimeExtra[i]){ delete fHistSDDDrTimeExtra[i]; fHistSDDDrTimeExtra[i]=0;}
95 if(fHistSDDDrTimeAttac[i]){ delete fHistSDDDrTimeAttac[i]; fHistSDDDrTimeAttac[i]=0;}
102 //___________________________________________________________________________
103 void AliAnalysisTaskITSAlignQA::UserCreateOutputObjects() {
105 LoadGeometryFromOCDB();
107 fOutput = new TList();
109 fOutput->SetName("OutputHistos");
111 fHistNEvents = new TH1F("hNEvents", "Number of processed events",3,-1.5,1.5);
112 fHistNEvents->Sumw2();
113 fHistNEvents->SetMinimum(0);
114 fOutput->Add(fHistNEvents);
116 fHistPtAccept = new TH1F("hPtAccept","Pt distrib of accepted tracks",50,0.,5.);
117 fHistPtAccept->Sumw2();
118 fHistPtAccept->SetMinimum(0);
119 fOutput->Add(fHistPtAccept);
121 if(fDoSPDResiduals) CreateSPDHistos();
122 if(fDoSDDResiduals || fDoSDDdEdxCalib) CreateSDDHistos();
123 if(fDoSSDResiduals) CreateSSDHistos();
127 //___________________________________________________________________________
128 void AliAnalysisTaskITSAlignQA::CreateSPDHistos(){
132 for(Int_t iMod=0; iMod<kNSPDmods; iMod++){
133 fHistSPDResidX[iMod] = new TH2F(Form("hSPDResidX%d",iMod),
134 Form("hSPDResidX%d",iMod),
135 fNPtBins,fPtBinLimits,
137 fHistSPDResidX[iMod]->Sumw2();
138 fOutput->Add(fHistSPDResidX[iMod]);
140 fHistSPDResidZ[iMod] = new TH2F(Form("hSPDResidZ%d",iMod),
141 Form("hSPDResidZ%d",iMod),
142 fNPtBins,fPtBinLimits,
144 fHistSPDResidZ[iMod]->Sumw2();
145 fOutput->Add(fHistSPDResidZ[iMod]);
150 //___________________________________________________________________________
151 void AliAnalysisTaskITSAlignQA::CreateSDDHistos(){
154 for(Int_t iMod=0; iMod<kNSDDmods; iMod++){
156 fHistSDDResidX[iMod] = new TH2F(Form("hSDDResidX%d",iMod),
157 Form("hSDDResidX%d",iMod),
158 fNPtBins,fPtBinLimits,
160 fHistSDDResidX[iMod]->Sumw2();
161 fOutput->Add(fHistSDDResidX[iMod]);
163 fHistSDDResidZ[iMod] = new TH2F(Form("hSDDResidZ%d",iMod),
164 Form("hSDDResidZ%d",iMod),
165 fNPtBins,fPtBinLimits,
167 fHistSDDResidZ[iMod]->Sumw2();
168 fOutput->Add(fHistSDDResidZ[iMod]);
170 fHistSDDResidXvsX[iMod] = new TH2F(Form("hSDDResidXvsX%d",iMod+kNSPDmods),
171 Form("hSDDResidXvsX%d",iMod+kNSPDmods),
172 40,-3.5,3.5,300,-0.15,0.15);
173 fHistSDDResidXvsX[iMod]->Sumw2();
174 fOutput->Add(fHistSDDResidXvsX[iMod]);
176 fHistSDDResidXvsZ[iMod] = new TH2F(Form("hSDDResidXvsZ%d",iMod+kNSPDmods),
177 Form("hSDDResidXvsZ%d",iMod+kNSPDmods),
178 10,-3.8,3.8,300,-0.15,0.15);
179 fHistSDDResidXvsZ[iMod]->Sumw2();
180 fOutput->Add(fHistSDDResidXvsZ[iMod]);
182 fHistSDDResidZvsX[iMod] = new TH2F(Form("hSDDResidZvsX%d",iMod+kNSPDmods),
183 Form("hSDDResidZvsX%d",iMod+kNSPDmods),
184 40,-3.5,3.5,200,-0.1,0.1);
185 fHistSDDResidZvsX[iMod]->Sumw2();
186 fOutput->Add(fHistSDDResidZvsX[iMod]);
188 fHistSDDResidZvsZ[iMod] = new TH2F(Form("hSDDResidZvsZ%d",iMod+kNSPDmods),
189 Form("hSDDResidZvsZ%d",iMod+kNSPDmods),
190 10,-3.8,3.8,200,-0.1,0.1);
191 fHistSDDResidZvsZ[iMod]->Sumw2();
192 fOutput->Add(fHistSDDResidZvsZ[iMod]);
196 fHistSDDdEdxvsDrTime[iMod] = new TH2F(Form("hSDDdEdxvsDrTime%d",iMod+kNSPDmods),
197 Form("hSDDdEdxvsDrTime%d",iMod+kNSPDmods),
198 16,0.,6400.,100,0.,300.);
199 fHistSDDdEdxvsDrTime[iMod]->Sumw2();
200 fOutput->Add(fHistSDDdEdxvsDrTime[iMod]);
203 fHistSDDDrTimeAll[iMod]=new TH1F(Form("hSDDDrTimeAll%d",iMod+kNSPDmods),
204 Form("hSDDDrTimeAll%d",iMod+kNSPDmods),
206 fHistSDDDrTimeAll[iMod]->Sumw2();
207 fHistSDDDrTimeAll[iMod]->SetMinimum(0.);
208 fOutput->Add(fHistSDDDrTimeAll[iMod]);
210 fHistSDDDrTimeExtra[iMod]=new TH1F(Form("hSDDDrTimeExtra%d",iMod+kNSPDmods),
211 Form("hSDDDrTimeExtra%d",iMod+kNSPDmods),
213 fHistSDDDrTimeExtra[iMod]->Sumw2();
214 fHistSDDDrTimeExtra[iMod]->SetMinimum(0.);
215 fOutput->Add(fHistSDDDrTimeExtra[iMod]);
217 fHistSDDDrTimeAttac[iMod]=new TH1F(Form("hSDDDrTimeAttac%d",iMod+kNSPDmods),
218 Form("hSDDDrTimeAttac%d",iMod+kNSPDmods),
220 fHistSDDDrTimeAttac[iMod]->Sumw2();
221 fHistSDDDrTimeAttac[iMod]->SetMinimum(0.);
222 fOutput->Add(fHistSDDDrTimeAttac[iMod]);
228 //___________________________________________________________________________
229 void AliAnalysisTaskITSAlignQA::CreateSSDHistos(){
231 for(Int_t iMod=0; iMod<kNSSDmods; iMod++){
232 fHistSSDResidX[iMod] = new TH2F(Form("hSSDResidX%d",iMod+kNSPDmods+kNSDDmods),
233 Form("hSSDResidX%d",iMod+kNSPDmods+kNSDDmods),
234 fNPtBins,fPtBinLimits,
236 fHistSSDResidX[iMod]->Sumw2();
237 fOutput->Add(fHistSSDResidX[iMod]);
239 fHistSSDResidZ[iMod] = new TH2F(Form("hSSDResidZ%d",iMod+kNSPDmods+kNSDDmods),
240 Form("hSSDResidZ%d",iMod+kNSPDmods+kNSDDmods),
241 fNPtBins,fPtBinLimits,
243 fHistSSDResidZ[iMod]->Sumw2();
244 fOutput->Add(fHistSSDResidZ[iMod]);
248 //______________________________________________________________________________
249 void AliAnalysisTaskITSAlignQA::UserExec(Option_t *)
252 AliESDEvent *esd = (AliESDEvent*) (InputEvent());
255 printf("AliAnalysisTaskITSAlignQA::Exec(): bad ESD\n");
261 printf("AliAnalysisTaskITSAlignQA::Exec(): bad ESDfriend\n");
265 fHistNEvents->Fill(0);
266 fFitter->SetBz(esd->GetMagneticField());
268 const AliTrackPointArray *array = 0;
269 Int_t ntracks = esd->GetNumberOfTracks();
271 for (Int_t itrack=0; itrack < ntracks; itrack++) {
272 AliESDtrack * track = esd->GetTrack(itrack);
274 if(!AcceptTrack(track)) continue;
275 array = track->GetTrackPointArray();
278 Int_t npts=array->GetNPoints();
280 FitAndFillSPD(1,array,npts,track);
281 FitAndFillSPD(2,array,npts,track);
283 if(fDoSDDResiduals || fDoSDDdEdxCalib) FitAndFillSDD(array,npts,track);
285 FitAndFillSSD(5,array,npts,track);
286 FitAndFillSSD(6,array,npts,track);
293 //___________________________________________________________________________
294 Bool_t AliAnalysisTaskITSAlignQA::AcceptTrack(AliESDtrack * track){
295 // track selection cuts
298 if(track->GetNcls(1)>0) accept=kFALSE;
300 if(track->GetNcls(1)<fMinTPCpts) accept=kFALSE;
302 if(track->GetNcls(0) < fMinITSpts) accept=kFALSE;
303 Int_t trstatus=track->GetStatus();
304 if(!(trstatus&AliESDtrack::kITSrefit)) accept=kFALSE;
305 Float_t pt=track->Pt();
306 if(pt<fMinPt) accept=kFALSE;
307 if(accept) fHistPtAccept->Fill(pt);
310 //___________________________________________________________________________
311 void AliAnalysisTaskITSAlignQA::FitAndFillSPD(Int_t iLayer, const AliTrackPointArray *array, Int_t npts,AliESDtrack * track){
312 // fit track and fills histos for SPD
313 fFitter->AttachPoints(array,0, npts-1);
314 Int_t iPtSPD[4],modIdSPD[4];
316 Double_t resGlo[3],resLoc[3];
317 for(Int_t ipt=0; ipt<npts; ipt++) {
320 array->GetPoint(point,ipt);
321 Int_t volId = point.GetVolumeID();
322 Int_t layerId = AliGeomManager::VolUIDToLayer(volId,modId);
324 modId+=AliITSgeomTGeo::GetModuleIndex(layerId,1,1);
325 iPtSPD[nPtSPD] = ipt;
326 modIdSPD[nPtSPD] = modId;
328 fFitter->SetCovIScale(ipt,1e-4);
332 fFitter->Fit(track->Charge(),track->Pt(),0.);
333 Double_t chi2=fFitter->GetChi2NDF();
334 if ( chi2<0 || chi2>1e4 ) return; // fit failed, abandon this track
335 for (Int_t ip=0; ip<nPtSPD;ip++) {
336 fFitter->GetResiduals(resGlo,iPtSPD[ip]);
337 TGeoHMatrix *mcurr = AliITSgeomTGeo::GetMatrix(modIdSPD[ip]);
338 mcurr->MasterToLocalVect(resGlo,resLoc);
339 Int_t index=modIdSPD[ip];
340 fHistSPDResidX[index]->Fill(track->Pt(),resLoc[0]);
341 fHistSPDResidZ[index]->Fill(track->Pt(),resLoc[2]);
345 //___________________________________________________________________________
346 void AliAnalysisTaskITSAlignQA::FitAndFillSDD(const AliTrackPointArray *array, Int_t npts, AliESDtrack * track){
347 // fit track and fills histos for SDD
349 track->GetITSdEdxSamples(dedx);
351 fFitter->AttachPoints(array,0, npts-1);
352 Int_t iPtSDD[4],modIdSDD[4];
353 Double_t xLocSDD[4],zLocSDD[4];
356 Double_t resGlo[3],resLoc[3];
358 Double_t posGlo[3],posLoc[3];
359 for(Int_t ipt=0; ipt<npts; ipt++) {
362 array->GetPoint(point,ipt);
363 Int_t volId = point.GetVolumeID();
364 Int_t layerId = AliGeomManager::VolUIDToLayer(volId,modId);
365 if(layerId==3 || layerId==4){
366 Float_t drTime=point.GetDriftTime();
367 modId+=AliITSgeomTGeo::GetModuleIndex(layerId,1,1);
368 Int_t index=modId-kNSPDmods;
369 fHistSDDDrTimeAll[index]->Fill(drTime);
370 if(point.IsExtra()) fHistSDDDrTimeExtra[index]->Fill(drTime);
371 else fHistSDDDrTimeAttac[index]->Fill(drTime);
372 Float_t dedxLay=dedx[layerId-3];
373 if(dedxLay>1.) fHistSDDdEdxvsDrTime[index]->Fill(drTime,dedxLay);
374 iPtSDD[nPtSDD] = ipt;
375 modIdSDD[nPtSDD] = modId;
376 point.GetXYZ(posGloF);
377 for(Int_t icoor=0;icoor<3;icoor++) posGlo[icoor]=posGloF[icoor];
378 AliITSgeomTGeo::GlobalToLocal(modId,posGlo,posLoc);
379 xLocSDD[nPtSDD]=posLoc[0];
380 zLocSDD[nPtSDD]=posLoc[2];
382 fFitter->SetCovIScale(ipt,1e-4); // scaling for inverted errors of SDD
387 if(nPtSDD>0 && nPtSSDSPD>=2){
388 fFitter->Fit(track->Charge(),track->Pt(),0.);
389 Double_t chi2=fFitter->GetChi2NDF();
390 if ( chi2<0 || chi2>1e4 ) return; // fit failed, abandon this track
391 for (Int_t ip=0; ip<nPtSDD;ip++) {
392 fFitter->GetResiduals(resGlo,iPtSDD[ip]);
393 TGeoHMatrix *mcurr = AliITSgeomTGeo::GetMatrix(modIdSDD[ip]);
394 mcurr->MasterToLocalVect(resGlo,resLoc);
395 Int_t index=modIdSDD[ip]-kNSPDmods;
396 fHistSDDResidX[index]->Fill(track->Pt(),resLoc[0]);
397 fHistSDDResidZ[index]->Fill(track->Pt(),resLoc[2]);
398 fHistSDDResidXvsX[index]->Fill(xLocSDD[ip],resLoc[0]);
399 fHistSDDResidXvsZ[index]->Fill(zLocSDD[ip],resLoc[0]);
400 fHistSDDResidZvsX[index]->Fill(xLocSDD[ip],resLoc[2]);
401 fHistSDDResidZvsZ[index]->Fill(zLocSDD[ip],resLoc[2]);
405 //___________________________________________________________________________
406 void AliAnalysisTaskITSAlignQA::FitAndFillSSD(Int_t iLayer, const AliTrackPointArray *array, Int_t npts,AliESDtrack * track){
407 // fit track and fills histos for SSD
408 fFitter->AttachPoints(array,0, npts-1);
409 Int_t iPtSSD[4],modIdSSD[4];
411 Double_t resGlo[3],resLoc[3];
412 for(Int_t ipt=0; ipt<npts; ipt++) {
415 array->GetPoint(point,ipt);
416 Int_t volId = point.GetVolumeID();
417 Int_t layerId = AliGeomManager::VolUIDToLayer(volId,modId);
419 modId+=AliITSgeomTGeo::GetModuleIndex(layerId,1,1);
420 iPtSSD[nPtSSD] = ipt;
421 modIdSSD[nPtSSD] = modId;
423 fFitter->SetCovIScale(ipt,1e-4);
427 fFitter->Fit(track->Charge(),track->Pt(),0.);
428 Double_t chi2=fFitter->GetChi2NDF();
429 if ( chi2<0 || chi2>1e4 ) return; // fit failed, abandon this track
430 for (Int_t ip=0; ip<nPtSSD;ip++) {
431 fFitter->GetResiduals(resGlo,iPtSSD[ip]);
432 TGeoHMatrix *mcurr = AliITSgeomTGeo::GetMatrix(modIdSSD[ip]);
433 mcurr->MasterToLocalVect(resGlo,resLoc);
434 Int_t index=modIdSSD[ip]-kNSPDmods-kNSDDmods;
435 fHistSSDResidX[index]->Fill(track->Pt(),resLoc[0]);
436 fHistSSDResidZ[index]->Fill(track->Pt(),resLoc[2]);
440 //______________________________________________________________________________
441 void AliAnalysisTaskITSAlignQA::Terminate(Option_t */*option*/)
443 // Terminate analysis
444 fOutput = dynamic_cast<TList*> (GetOutputData(1));
446 printf("ERROR: fOutput not available\n");
450 fHistNEvents = dynamic_cast<TH1F*>(fOutput->FindObject("hNEvents"));
451 printf("Number of analyzed events = %d\n",(Int_t)fHistNEvents->GetBinContent(2));
456 //___________________________________________________________________________
457 void AliAnalysisTaskITSAlignQA::LoadGeometryFromOCDB(){
458 //method to get the gGeomanager
459 // it is called at the CreatedOutputObject stage
460 // to comply with the CAF environment
461 AliInfo("Loading geometry");
463 AliCDBManager *man = AliCDBManager::Instance();
464 man->SetDefaultStorage(fOCDBLocation.Data());
466 AliCDBEntry* obj = man->Get(AliCDBPath("GRP", "Geometry", "Data"));
467 AliGeomManager::SetGeometry((TGeoManager*)obj->GetObject());
468 AliGeomManager::GetNalignable("ITS");
469 AliGeomManager::ApplyAlignObjsFromCDB("ITS");