1 #include "AliAnalysisTask.h"
2 #include "AliAnalysisManager.h"
3 #include "AliAnalysisDataContainer.h"
4 #include "AliITSRecPoint.h"
5 #include "AliESDEvent.h"
8 #include "AliTrackPointArray.h"
9 #include "AliITSgeomTGeo.h"
10 #include "AliITSTPArrayFit.h"
11 #include "AliESDfriend.h"
12 #include "AliCDBManager.h"
13 #include "AliCDBEntry.h"
14 #include "AliITSCalibrationSDD.h"
15 #include "AliITSresponseSDD.h"
16 #include "AliGeomManager.h"
17 #include "AliMultiplicity.h"
24 #include <TGeoGlobalMagField.h>
25 #include "AliESDInputHandlerRP.h"
26 #include "AliITSSumTP.h"
29 /**************************************************************************
30 * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
32 * Author: The ALICE Off-line Project. *
33 * Contributors are mentioned in the code where appropriate. *
35 * Permission to use, copy, modify and distribute this software and its *
36 * documentation strictly for non-commercial purposes is hereby granted *
37 * without fee, provided that the above copyright notice appears in all *
38 * copies and that both the copyright notice and this permission notice *
39 * appear in the supporting documentation. The authors make no claims *
40 * about the suitability of this software for any purpose. It is *
41 * provided "as is" without express or implied warranty. *
42 **************************************************************************/
44 //*************************************************************************
45 // Implementation of class AliAnalysiTaskITSAlignQA
46 // AliAnalysisTaskSE to extract from ESD + ESDfriends
47 // the track-to-point residuals and dE/dx vs, time for SDD modules
49 // Author: F. Prino, prino@to.infn.it
50 //*************************************************************************
53 #include "AliAnalysisTaskITSAlignQA.h"
55 ClassImp(AliAnalysisTaskITSAlignQA)
56 //______________________________________________________________________________
57 AliAnalysisTaskITSAlignQA::AliAnalysisTaskITSAlignQA() : AliAnalysisTaskSE("SDD Calibration"),
61 fDoSPDResiduals(kTRUE),
62 fDoSDDResiduals(kTRUE),
63 fDoSSDResiduals(kTRUE),
64 fDoSDDdEdxCalib(kTRUE),
65 fDoSDDVDriftCalib(kTRUE),
66 fDoSDDDriftTime(kTRUE),
67 fDoFillTPTree(kFALSE),
68 fUseITSsaTracks(kFALSE),
69 fLoadGeometry(kFALSE),
71 fUseVertexForZOnly(kFALSE),
72 fUseTPCMomentum(kFALSE),
73 fMinVtxContributors(5),
74 fRemovePileupWithSPD(kTRUE),
87 fOCDBLocation("local://$ALICE_ROOT/OCDB")
90 fFitter = new AliITSTPArrayFit(5);
91 Double_t xbins[9]={0.3,0.5,0.75,1.,1.5,2.,3.,5.,10.};
92 SetPtBinLimits(8,xbins);
93 DefineOutput(1, TList::Class());
97 //___________________________________________________________________________
98 AliAnalysisTaskITSAlignQA::~AliAnalysisTaskITSAlignQA(){
100 if (fOutput && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
108 //___________________________________________________________________________
109 void AliAnalysisTaskITSAlignQA::UserCreateOutputObjects() {
112 if(fLoadGeometry) LoadGeometryFromOCDB();
114 fOutput = new TList();
116 fOutput->SetName("OutputHistos");
118 fHistNEvents = new TH1F("hNEvents", "Number of processed events",kNEvStatBins,-0.5,kNEvStatBins-0.5);
119 fHistNEvents->Sumw2();
120 fHistNEvents->SetMinimum(0);
121 fHistNEvents->GetXaxis()->SetBinLabel(kEvAll+1,"All Events");
122 fHistNEvents->GetXaxis()->SetBinLabel(kEvCnt+1,"After Centrality cut");
123 fHistNEvents->GetXaxis()->SetBinLabel(kEvVtx+1,"After Vertex cut");
124 fHistNEvents->GetXaxis()->SetBinLabel(kEvPlp+1,"After Pileup cut");
125 fHistNEvents->GetXaxis()->SetBinLabel(kNTracks+1,"Tracks Accepted");
126 fOutput->Add(fHistNEvents);
128 fHistPtAccept = new TH1F("hPtAccept","Pt distrib of accepted tracks",50,0.,5.);
129 fHistPtAccept->Sumw2();
130 fHistPtAccept->SetMinimum(0);
131 fOutput->Add(fHistPtAccept);
133 if(fDoSPDResiduals) CreateSPDHistos();
134 if(fDoSDDResiduals || fDoSDDdEdxCalib || fDoSDDVDriftCalib || fDoSDDDriftTime) CreateSDDHistos();
135 if(fDoSSDResiduals) CreateSSDHistos();
138 TFile* troutf = OpenFile(2);
140 AliFatal("Failed to open output file for AliITSSumTP tree");
143 fITSSumTP = new AliITSSumTP();
144 fTPTree = new TTree("ITSSumTP","ITS TP Summary");
145 fTPTree->Branch("AliITSSumTP","AliITSSumTP",&fITSSumTP);
152 //___________________________________________________________________________
153 void AliAnalysisTaskITSAlignQA::CreateSPDHistos(){
157 for(Int_t iMod=0; iMod<kNSPDmods; iMod++){
158 fHistSPDResidX[iMod] = new TH2F(Form("hSPDResidX%d",iMod),
159 Form("hSPDResidX%d",iMod),
160 fNPtBins,fPtBinLimits,
162 fHistSPDResidX[iMod]->Sumw2();
163 fOutput->Add(fHistSPDResidX[iMod]);
165 fHistSPDResidZ[iMod] = new TH2F(Form("hSPDResidZ%d",iMod),
166 Form("hSPDResidZ%d",iMod),
167 fNPtBins,fPtBinLimits,
169 fHistSPDResidZ[iMod]->Sumw2();
170 fOutput->Add(fHistSPDResidZ[iMod]);
175 //___________________________________________________________________________
176 void AliAnalysisTaskITSAlignQA::CreateSDDHistos(){
179 for(Int_t iMod=0; iMod<kNSDDmods; iMod++){
180 if (fDoSDDResiduals) {
181 fHistSDDResidX[iMod] = new TH2F(Form("hSDDResidX%d",iMod+kNSPDmods),
182 Form("hSDDResidX%d",iMod+kNSPDmods),
183 fNPtBins,fPtBinLimits,
185 fHistSDDResidX[iMod]->Sumw2();
186 fOutput->Add(fHistSDDResidX[iMod]);
188 fHistSDDResidZ[iMod] = new TH2F(Form("hSDDResidZ%d",iMod+kNSPDmods),
189 Form("hSDDResidZ%d",iMod+kNSPDmods),
190 fNPtBins,fPtBinLimits,
192 fHistSDDResidZ[iMod]->Sumw2();
193 fOutput->Add(fHistSDDResidZ[iMod]);
195 fHistSDDResidXvsX[iMod] = new TH2F(Form("hSDDResidXvsX%d",iMod+kNSPDmods),
196 Form("hSDDResidXvsX%d",iMod+kNSPDmods),
197 40,-3.5,3.5,300,-0.15,0.15);
198 fHistSDDResidXvsX[iMod]->Sumw2();
199 fOutput->Add(fHistSDDResidXvsX[iMod]);
201 fHistSDDResidXvsZ[iMod] = new TH2F(Form("hSDDResidXvsZ%d",iMod+kNSPDmods),
202 Form("hSDDResidXvsZ%d",iMod+kNSPDmods),
203 10,-3.8,3.8,300,-0.15,0.15);
204 fHistSDDResidXvsZ[iMod]->Sumw2();
205 fOutput->Add(fHistSDDResidXvsZ[iMod]);
207 fHistSDDResidZvsX[iMod] = new TH2F(Form("hSDDResidZvsX%d",iMod+kNSPDmods),
208 Form("hSDDResidZvsX%d",iMod+kNSPDmods),
209 40,-3.5,3.5,200,-0.1,0.1);
210 fHistSDDResidZvsX[iMod]->Sumw2();
211 fOutput->Add(fHistSDDResidZvsX[iMod]);
213 fHistSDDResidZvsZ[iMod] = new TH2F(Form("hSDDResidZvsZ%d",iMod+kNSPDmods),
214 Form("hSDDResidZvsZ%d",iMod+kNSPDmods),
215 10,-3.8,3.8,200,-0.1,0.1);
216 fHistSDDResidZvsZ[iMod]->Sumw2();
217 fOutput->Add(fHistSDDResidZvsZ[iMod]);
221 if (fDoSDDVDriftCalib) {
222 for (int ix=0;ix<2;ix++) { // profile histos per side
224 char* hnm = Form("hpSDDResXvsXD%d_%d",iMod+kNSPDmods,ix);
225 int nbX = 50, nbZ = 20, nbXOffs = 2, nbZOffs = 2;
226 double xRange = 3.5085e4, zRange = 7.5264e4, xOffs = nbXOffs*xRange/nbX, zOffs = nbZOffs*zRange/nbZ;
227 fHProfSDDResidXvsXD[iMod][ix] = new TProfile(hnm, hnm, nbX+2*nbXOffs, -xOffs, xRange + xOffs);
228 fHProfSDDResidXvsXD[iMod][ix]->Sumw2();
229 fOutput->Add(fHProfSDDResidXvsXD[iMod][ix]);
231 hnm = Form("hpSDDDrTimevsXD%d_%d",iMod+kNSPDmods,ix);
232 fHProfSDDDrTimevsXD[iMod][ix] = new TProfile(hnm, hnm, nbX+2*nbXOffs, -xOffs, xRange + xOffs);
233 fHProfSDDDrTimevsXD[iMod][ix]->Sumw2();
234 fOutput->Add(fHProfSDDDrTimevsXD[iMod][ix]);
236 hnm = Form("hpSDDResXvsZ%d_%d",iMod+kNSPDmods,ix);
237 fHProfSDDResidXvsZ[iMod][ix] = new TProfile(hnm, hnm, nbZ+2*nbZOffs, -(0.5*zRange+zOffs),(0.5*zRange+zOffs));
238 fHProfSDDResidXvsZ[iMod][ix]->Sumw2();
239 fOutput->Add(fHProfSDDResidXvsZ[iMod][ix]);
241 hnm = Form("hpSDDDrTimevsZ%d_%d",iMod+kNSPDmods,ix);
242 fHProfSDDDrTimevsZ[iMod][ix] = new TProfile(hnm, hnm, nbZ+2*nbZOffs, -(0.5*zRange+zOffs),(0.5*zRange+zOffs));
243 fHProfSDDDrTimevsZ[iMod][ix]->Sumw2();
244 fOutput->Add(fHProfSDDDrTimevsZ[iMod][ix]);
250 fHistSDDdEdxvsDrTime[iMod] = new TH2F(Form("hSDDdEdxvsDrTime%d",iMod+kNSPDmods),
251 Form("hSDDdEdxvsDrTime%d",iMod+kNSPDmods),
252 16,0.,6400.,100,0.,300.);
253 fHistSDDdEdxvsDrTime[iMod]->Sumw2();
254 fOutput->Add(fHistSDDdEdxvsDrTime[iMod]);
257 if (fDoSDDDriftTime) {
258 fHistSDDDrTimeAll[iMod]=new TH1F(Form("hSDDDrTimeAll%d",iMod+kNSPDmods),
259 Form("hSDDDrTimeAll%d",iMod+kNSPDmods),
261 fHistSDDDrTimeAll[iMod]->Sumw2();
262 fHistSDDDrTimeAll[iMod]->SetMinimum(0.);
263 fOutput->Add(fHistSDDDrTimeAll[iMod]);
265 fHistSDDDrTimeExtra[iMod]=new TH1F(Form("hSDDDrTimeExtra%d",iMod+kNSPDmods),
266 Form("hSDDDrTimeExtra%d",iMod+kNSPDmods),
268 fHistSDDDrTimeExtra[iMod]->Sumw2();
269 fHistSDDDrTimeExtra[iMod]->SetMinimum(0.);
270 fOutput->Add(fHistSDDDrTimeExtra[iMod]);
272 fHistSDDDrTimeAttac[iMod]=new TH1F(Form("hSDDDrTimeAttac%d",iMod+kNSPDmods),
273 Form("hSDDDrTimeAttac%d",iMod+kNSPDmods),
275 fHistSDDDrTimeAttac[iMod]->Sumw2();
276 fHistSDDDrTimeAttac[iMod]->SetMinimum(0.);
277 fOutput->Add(fHistSDDDrTimeAttac[iMod]);
284 //___________________________________________________________________________
285 void AliAnalysisTaskITSAlignQA::CreateSSDHistos(){
287 for(Int_t iMod=0; iMod<kNSSDmods; iMod++){
288 fHistSSDResidX[iMod] = new TH2F(Form("hSSDResidX%d",iMod+kNSPDmods+kNSDDmods),
289 Form("hSSDResidX%d",iMod+kNSPDmods+kNSDDmods),
290 fNPtBins,fPtBinLimits,
292 fHistSSDResidX[iMod]->Sumw2();
293 fOutput->Add(fHistSSDResidX[iMod]);
295 fHistSSDResidZ[iMod] = new TH2F(Form("hSSDResidZ%d",iMod+kNSPDmods+kNSDDmods),
296 Form("hSSDResidZ%d",iMod+kNSPDmods+kNSDDmods),
297 fNPtBins,fPtBinLimits,
299 fHistSSDResidZ[iMod]->Sumw2();
300 fOutput->Add(fHistSSDResidZ[iMod]);
304 //______________________________________________________________________________
305 void AliAnalysisTaskITSAlignQA::UserExec(Option_t *)
308 static AliTrackPointArray* arrayITS = 0;
309 AliTrackPointArray* arrayITSNoVtx = 0;
311 AliESDEvent *esd = (AliESDEvent*) (InputEvent());
312 if (fITSSumTP) fITSSumTP->Reset();
315 printf("AliAnalysisTaskITSAlignQA::Exec(): bad ESD\n");
320 printf("AliAnalysisTaskITSAlignQA::Exec(): bad ESDfriend\n");
324 static Bool_t firstCheck = kTRUE;
327 if (TMath::Abs(esd->GetCurrentL3())<300) { // no field
329 AliInfo("No magnetic field: eliminating pt cut");
331 const AliESDRun *esdrn = esd->GetESDRun();
333 Int_t activeDetectors = esdrn->GetDetectorsInReco();
334 if ( !(activeDetectors & AliDAQ::kTPC) ) {
335 AliInfo("No TPC, suppress TPC points request");
336 SetUseITSstandaloneTracks(kTRUE);
337 SetUseTPCMomentum(kFALSE);
342 fHistNEvents->Fill(kEvAll);
344 if (!AcceptCentrality(esd)) return;
345 fHistNEvents->Fill(kEvCnt);
347 const AliESDVertex* vtx=0,*vtxSPD=0;
348 vtx = esd->GetPrimaryVertex();
349 vtxSPD = esd->GetPrimaryVertexSPD();
351 if (fUseVertex) { // check the vertex if it is requested as an extra point
352 if (!AcceptVertex(vtx,vtxSPD)) return;
355 fHistNEvents->Fill(kEvVtx);
356 if (fRemovePileupWithSPD){
357 // skip events tagged by SPD as pileup
358 if(esd->IsPileupFromSPD()) return;
360 fHistNEvents->Fill(kEvPlp);
363 fFitter->SetBz(esd->GetMagneticField());
365 const AliTrackPointArray *array = 0;
366 Int_t ntracks = esd->GetNumberOfTracks();
368 for (Int_t itrack=0; itrack < ntracks; itrack++) {
370 if (arrayITS) {delete arrayITS; arrayITS = 0;} // reset points from previous tracks
373 AliESDtrack * track = esd->GetTrack(itrack);
375 if(!AcceptTrack(track, vtx)) continue;
376 array = track->GetTrackPointArray();
378 arrayITS = PrepareTrack(array, vtx);
380 arrayITSNoVtx = PrepareTrack(array, 0);
381 arrayITSNoVtx->SetUniqueID(itrack);
382 fITSSumTP->AddTrack(arrayITSNoVtx);
385 fHistNEvents->Fill(kNTracks);
387 Int_t npts = arrayITS->GetNPoints();
388 Int_t npts1 = fUseVertexForZOnly ? npts-1 : npts;
391 FitAndFillSPD(1,arrayITS,npts1,track);
392 FitAndFillSPD(2,arrayITS,npts1,track);
394 if(fDoSDDResiduals || fDoSDDdEdxCalib || fDoSDDVDriftCalib || fDoSDDDriftTime) {
395 FitAndFillSDDrphi(arrayITS,npts,track);
396 if (fDoSDDResiduals) {
397 FitAndFillSDDz(3,arrayITS,npts1,track);
398 FitAndFillSDDz(4,arrayITS,npts1,track);
402 FitAndFillSSD(5,arrayITS,npts1,track);
403 FitAndFillSSD(6,arrayITS,npts1,track);
407 if (fITSSumTP) { // store vertex and mometum info
408 double xyz[3]={0,0,0};
409 fITSSumTP->SetVertex(vtx);
410 TObjArray& tps = fITSSumTP->GetTracks();
411 int ntp = tps.GetEntriesFast();
412 fITSSumTP->BookNTracks(ntp);
413 for (int it=ntp;it--;) {
414 AliTrackPointArray* tp = (AliTrackPointArray*)tps[it];
416 AliESDtrack* esdTr = esd->GetTrack(tp->GetUniqueID());
417 double crv = esdTr->GetC(esd->GetMagneticField());
418 double crve = TMath::Sqrt(esdTr->GetSigma1Pt2()) * esd->GetMagneticField()*kB2C;
419 fITSSumTP->SetCrvGlo(it,crv);
420 fITSSumTP->SetCrvGloErr(it,crve);
421 const AliExternalTrackParam* inTPC = esdTr->GetTPCInnerParam(); // TPC track at vtx
423 crv = inTPC->GetC(esd->GetMagneticField());
424 crve = TMath::Sqrt(inTPC->GetSigma1Pt2()) * TMath::Abs(esd->GetMagneticField()*kB2C);
425 fITSSumTP->SetCrvTPC(it,crv);
426 fITSSumTP->SetCrvTPCErr(it,crve);
428 inTPC = esdTr->GetInnerParam(); // TPC track at the inner wall
431 fITSSumTP->SetTPCInnerXYZ(it,xyz);
434 fITSSumTP->SetUniqueID(fCurrentRunNumber);
435 if (ntp) fTPTree->Fill();
444 //___________________________________________________________________________
445 Bool_t AliAnalysisTaskITSAlignQA::AcceptTrack(const AliESDtrack * track, const AliESDVertex* vtx)
447 // track selection cuts
450 if(track->GetNcls(1)>0) accept=kFALSE;
452 if(track->GetNcls(1)<fMinTPCpts) accept=kFALSE;
454 if(track->GetNcls(0) < fMinITSpts) accept=kFALSE;
455 Int_t trstatus=track->GetStatus();
456 if(!(trstatus&AliESDtrack::kITSrefit)) accept=kFALSE;
458 if (fUseTPCMomentum && track->IsOn(AliESDtrack::kTPCrefit)) pt = track->GetTPCInnerParam()->Pt();
459 else pt = track->Pt();
461 if(pt<fMinPt) accept=kFALSE;
463 // if vertex constraint is used, apply soft DCA cut
465 Double_t dz[2],cov[3];
466 AliExternalTrackParam trc = *track;
467 if (!trc.PropagateToDCA(vtx, fFitter->GetBz(), 3.0, dz, cov)) accept=kFALSE;
469 if (dz[0]*dz[0]/(1e-4+cov[0])>fCutDCAXY) accept=kFALSE;
470 if (dz[1]*dz[1]/(4e-4+cov[2])>fCutDCAZ) accept=kFALSE;
474 if(accept) fHistPtAccept->Fill(pt);
478 //___________________________________________________________________________
479 Bool_t AliAnalysisTaskITSAlignQA::AcceptVertex(const AliESDVertex * vtx, const AliESDVertex * vtxSPD) {
480 // vertex selection cuts
481 if (!vtx || vtx->GetStatus()<1) return kFALSE;
482 if (!vtxSPD || vtxSPD->GetStatus()<1) return kFALSE;
483 if (vtx->GetNContributors()<fMinVtxContributors) return kFALSE;
484 if (TMath::Abs(vtx->GetZ()-vtxSPD->GetZ())>0.3) return kFALSE;
488 //___________________________________________________________________________
489 void AliAnalysisTaskITSAlignQA::FitAndFillSPD(Int_t iLayer, const AliTrackPointArray *array, Int_t npts,AliESDtrack * track){
490 // fit track and fills histos for SPD
491 fFitter->AttachPoints(array,0, npts-1);
492 Int_t iPtSPD[4],modIdSPD[4];
494 Double_t resGlo[3],resLoc[3];
495 for(Int_t ipt=0; ipt<npts; ipt++) {
498 array->GetPoint(point,ipt);
499 Int_t volId = point.GetVolumeID();
500 if (volId == kVtxSensVID) continue; // this is a vertex constraint
501 Int_t layerId = AliGeomManager::VolUIDToLayer(volId,modId);
503 modId+=AliITSgeomTGeo::GetModuleIndex(layerId,1,1);
504 iPtSPD[nPtSPD] = ipt;
505 modIdSPD[nPtSPD] = modId;
507 fFitter->SetCovIScale(ipt,1e-4);
511 double pt = (fUseTPCMomentum && track->IsOn(AliESDtrack::kTPCrefit)) ? track->GetTPCInnerParam()->Pt() : track->Pt();
512 fFitter->Fit(track->Charge(),pt,0.);
513 Double_t chi2=fFitter->GetChi2NDF();
514 if ( chi2<0 || chi2>1e4 ) return; // fit failed, abandon this track
515 for (Int_t ip=0; ip<nPtSPD;ip++) {
516 fFitter->GetResiduals(resGlo,iPtSPD[ip]);
517 TGeoHMatrix *mcurr = AliITSgeomTGeo::GetMatrix(modIdSPD[ip]);
518 mcurr->MasterToLocalVect(resGlo,resLoc);
519 Int_t index=modIdSPD[ip];
520 fHistSPDResidX[index]->Fill(pt,resLoc[0]);
521 fHistSPDResidZ[index]->Fill(pt,resLoc[2]);
525 //___________________________________________________________________________
526 void AliAnalysisTaskITSAlignQA::FitAndFillSDDrphi(const AliTrackPointArray *array, Int_t npts, AliESDtrack * track){
527 // fit track and fills histos for SDD along rphi (drift coord.)
529 track->GetITSdEdxSamples(dedx);
531 fFitter->AttachPoints(array,0, npts-1);
532 Int_t iPtSDD[4],modIdSDD[4],modSide[4];
533 Double_t xLocSDD[4],zLocSDD[4],drTime[4];
536 Double_t resGlo[3],resLoc[3];
538 Double_t posGlo[3],posLoc[3];
540 for(Int_t ipt=0; ipt<npts; ipt++) {
543 array->GetPoint(point,ipt);
544 Int_t volId = point.GetVolumeID();
545 if (volId == kVtxSensVID) continue; // this is a vertex constraint
546 Int_t layerId = AliGeomManager::VolUIDToLayer(volId,modId);
547 if(layerId==3 || layerId==4){
548 drTime[nPtSDD] = point.GetDriftTime();
549 modId+=AliITSgeomTGeo::GetModuleIndex(layerId,1,1);
550 Int_t index=modId-kNSPDmods;
551 if (fDoSDDDriftTime) {
552 fHistSDDDrTimeAll[index]->Fill(drTime[nPtSDD]);
553 if(point.IsExtra()) fHistSDDDrTimeExtra[index]->Fill(drTime[nPtSDD]);
554 else fHistSDDDrTimeAttac[index]->Fill(drTime[nPtSDD]);
556 if (fDoSDDdEdxCalib) {
557 Float_t dedxLay=dedx[layerId-3];
558 if(dedxLay>1.) fHistSDDdEdxvsDrTime[index]->Fill(drTime[nPtSDD],dedxLay);
560 iPtSDD[nPtSDD] = ipt;
561 modIdSDD[nPtSDD] = modId;
562 modSide[nPtSDD] = point.GetClusterType()&BIT(16) ? 0:1;
563 point.GetXYZ(posGloF);
564 for(Int_t icoor=0;icoor<3;icoor++) posGlo[icoor]=posGloF[icoor];
565 AliITSgeomTGeo::GlobalToLocal(modId,posGlo,posLoc);
566 xLocSDD[nPtSDD]=posLoc[0];
567 zLocSDD[nPtSDD]=posLoc[2];
569 fFitter->SetCovIScale(ipt,1e-4); // scaling for inverted errors of SDD
574 if(nPtSDD>0 && nPtSSDSPD>=2){
575 double pt = (fUseTPCMomentum && track->IsOn(AliESDtrack::kTPCrefit)) ? track->GetTPCInnerParam()->Pt() : track->Pt();
576 fFitter->Fit(track->Charge(),pt,0.);
577 Double_t chi2=fFitter->GetChi2NDF();
578 if ( chi2<0 || chi2>1e4 ) return; // fit failed, abandon this track
579 for (Int_t ip=0; ip<nPtSDD;ip++) {
580 fFitter->GetResiduals(resGlo,iPtSDD[ip]);
581 TGeoHMatrix *mcurr = AliITSgeomTGeo::GetMatrix(modIdSDD[ip]);
582 mcurr->MasterToLocalVect(resGlo,resLoc);
583 Int_t index=modIdSDD[ip]-kNSPDmods;
584 if (fDoSDDResiduals) {
585 fHistSDDResidX[index]->Fill(pt,resLoc[0]);
586 fHistSDDResidXvsX[index]->Fill(xLocSDD[ip],resLoc[0]);
587 fHistSDDResidXvsZ[index]->Fill(zLocSDD[ip],resLoc[0]);
590 if (fDoSDDVDriftCalib) {
591 double cf = modSide[ip] ? 1.e4:-1.e4;
592 double xMeas = cf*xLocSDD[ip]; // measured coordinate in microns
593 double xRes = cf*resLoc[0]; // X residual in microns
594 double xDriftTrue = 3.5085e4 - (xMeas + xRes); // "true" drift distance
596 fHProfSDDResidXvsXD[index][modSide[ip]]->Fill(xDriftTrue, xRes);
597 fHProfSDDResidXvsZ[index][modSide[ip]]->Fill(zLocSDD[ip]*1e4, xRes);
598 fHProfSDDDrTimevsXD[index][modSide[ip]]->Fill(xDriftTrue, drTime[ip]);
599 fHProfSDDDrTimevsZ[index][modSide[ip]]->Fill(zLocSDD[ip]*1e4, drTime[ip]);
604 //___________________________________________________________________________
605 void AliAnalysisTaskITSAlignQA::FitAndFillSDDz(Int_t iLayer, const AliTrackPointArray *array, Int_t npts, AliESDtrack * track){
606 // fit track and fills histos for SDD along z
608 fFitter->AttachPoints(array,0, npts-1);
609 Int_t iPtSDD[4],modIdSDD[4];
610 Double_t xLocSDD[4],zLocSDD[4];
612 Double_t resGlo[3],resLoc[3];
614 Double_t posGlo[3],posLoc[3];
615 for(Int_t ipt=0; ipt<npts; ipt++) {
618 array->GetPoint(point,ipt);
619 Int_t volId = point.GetVolumeID();
620 if (volId == kVtxSensVID) continue; // this is a vertex constraint
621 Int_t layerId = AliGeomManager::VolUIDToLayer(volId,modId);
623 modId+=AliITSgeomTGeo::GetModuleIndex(layerId,1,1);
624 iPtSDD[nPtSDD] = ipt;
625 modIdSDD[nPtSDD] = modId;
626 point.GetXYZ(posGloF);
627 for(Int_t icoor=0;icoor<3;icoor++) posGlo[icoor]=posGloF[icoor];
628 AliITSgeomTGeo::GlobalToLocal(modId,posGlo,posLoc);
629 xLocSDD[nPtSDD]=posLoc[0];
630 zLocSDD[nPtSDD]=posLoc[2];
632 fFitter->SetCovIScale(ipt,1e-4); // scaling for inverted errors of SDD
636 double pt = (fUseTPCMomentum && track->IsOn(AliESDtrack::kTPCrefit)) ? track->GetTPCInnerParam()->Pt() : track->Pt();
637 fFitter->Fit(track->Charge(),pt,0.);
638 Double_t chi2=fFitter->GetChi2NDF();
639 if ( chi2<0 || chi2>1e4 ) return; // fit failed, abandon this track
640 for (Int_t ip=0; ip<nPtSDD;ip++) {
641 fFitter->GetResiduals(resGlo,iPtSDD[ip]);
642 TGeoHMatrix *mcurr = AliITSgeomTGeo::GetMatrix(modIdSDD[ip]);
643 mcurr->MasterToLocalVect(resGlo,resLoc);
644 Int_t index=modIdSDD[ip]-kNSPDmods;
645 fHistSDDResidZ[index]->Fill(pt,resLoc[2]);
646 fHistSDDResidZvsX[index]->Fill(xLocSDD[ip],resLoc[2]);
647 fHistSDDResidZvsZ[index]->Fill(zLocSDD[ip],resLoc[2]);
651 //___________________________________________________________________________
652 void AliAnalysisTaskITSAlignQA::FitAndFillSSD(Int_t iLayer, const AliTrackPointArray *array, Int_t npts,AliESDtrack * track){
653 // fit track and fills histos for SSD
654 fFitter->AttachPoints(array,0, npts-1);
655 Int_t iPtSSD[4],modIdSSD[4];
657 Double_t resGlo[3],resLoc[3];
658 for(Int_t ipt=0; ipt<npts; ipt++) {
661 array->GetPoint(point,ipt);
662 Int_t volId = point.GetVolumeID();
663 if (volId == kVtxSensVID) continue; // this is a vertex constraint
664 Int_t layerId = AliGeomManager::VolUIDToLayer(volId,modId);
666 modId+=AliITSgeomTGeo::GetModuleIndex(layerId,1,1);
667 iPtSSD[nPtSSD] = ipt;
668 modIdSSD[nPtSSD] = modId;
670 fFitter->SetCovIScale(ipt,1e-4);
674 double pt = (fUseTPCMomentum && track->IsOn(AliESDtrack::kTPCrefit)) ? track->GetTPCInnerParam()->Pt() : track->Pt();
675 fFitter->Fit(track->Charge(),pt,0.);
676 Double_t chi2=fFitter->GetChi2NDF();
677 if ( chi2<0 || chi2>1e4 ) return; // fit failed, abandon this track
678 for (Int_t ip=0; ip<nPtSSD;ip++) {
679 fFitter->GetResiduals(resGlo,iPtSSD[ip]);
680 TGeoHMatrix *mcurr = AliITSgeomTGeo::GetMatrix(modIdSSD[ip]);
681 mcurr->MasterToLocalVect(resGlo,resLoc);
682 Int_t index=modIdSSD[ip]-kNSPDmods-kNSDDmods;
683 fHistSSDResidX[index]->Fill(pt,resLoc[0]);
684 fHistSSDResidZ[index]->Fill(pt,resLoc[2]);
688 //______________________________________________________________________________
689 void AliAnalysisTaskITSAlignQA::Terminate(Option_t */*option*/)
691 // Terminate analysis
692 fOutput = dynamic_cast<TList*> (GetOutputData(1));
694 printf("ERROR: fOutput not available\n");
698 fHistNEvents = dynamic_cast<TH1F*>(fOutput->FindObject("hNEvents"));
700 AliInfo(Form("Number of analyzed events = %d, %d tracks accepted",
701 (Int_t)fHistNEvents->GetBinContent(kEvAcc+1),(Int_t)fHistNEvents->GetBinContent(kNTracks+1)));
703 printf("Warning: pointer to fHistNEvents is NULL\n");
706 if (fDoFillTPTree) CreateUserInfo();
712 //___________________________________________________________________________
713 void AliAnalysisTaskITSAlignQA::LoadGeometryFromOCDB(){
714 //method to get the gGeomanager
715 // it is called at the CreatedOutputObject stage
716 // to comply with the CAF environment
717 AliInfo("Loading geometry");
719 AliCDBManager *man = AliCDBManager::Instance();
720 man->SetDefaultStorage(fOCDBLocation.Data());
722 AliCDBEntry* obj = man->Get(AliCDBPath("GRP", "Geometry", "Data"));
724 AliGeomManager::SetGeometry((TGeoManager*)obj->GetObject());
725 AliGeomManager::GetNalignable("ITS");
726 AliGeomManager::ApplyAlignObjsFromCDB("ITS");
728 else AliFatal("Geometry object not found in OCDB");
732 //______________________________________________________________________________________
733 AliTrackPointArray* AliAnalysisTaskITSAlignQA::PrepareTrack(const AliTrackPointArray* inp, const AliESDVertex* vtx)
735 // Extract from the global TrackPointArray the ITS part and optionally add vertex as the last measured point
737 int npts = inp->GetNPoints();
738 int modID=0,nptITS = 0;
740 const UShort_t *vids = inp->GetVolumeID();
741 for(int ipt=0; ipt<npts; ipt++) { // count ITS points
742 if (vids[ipt]<=0) continue;
743 int layerId = AliGeomManager::VolUIDToLayer(vids[ipt],modID);
744 if(layerId<1 || layerId>6) continue;
745 itsRefs[nptITS++] = ipt;
748 AliTrackPointArray *trackCopy = new AliTrackPointArray(nptITS + (vtx ? 1:0)); // reserve extra space if vertex provided
750 for(int ipt=0; ipt<nptITS; ipt++) {
751 inp->GetPoint(point,itsRefs[ipt]);
752 trackCopy->AddPoint(ipt,&point);
756 PrepareVertexConstraint(vtx,point);
757 trackCopy->AddPoint(nptITS,&point); // add vertex constraint as a last point
762 //_______________________________________________________________________________________
763 void AliAnalysisTaskITSAlignQA::PrepareVertexConstraint(const AliESDVertex* vtx, AliTrackPoint &point)
765 // convert vertex to measured point with dummy VID
770 point.SetVolumeID(kVtxSensVID);
772 vtx->GetCovMatrix(cmat);
773 cmatF[0] = cmat[0]; // xx
774 cmatF[1] = cmat[1]; // xy
775 cmatF[2] = cmat[3]; // xz
776 cmatF[3] = cmat[2]; // yy
777 cmatF[4] = cmat[4]; // yz
778 cmatF[5] = cmat[5]; // zz
779 point.SetXYZ(vtx->GetX(),vtx->GetY(),vtx->GetZ(), cmatF);
783 //_______________________________________________________________________________________
784 Bool_t AliAnalysisTaskITSAlignQA::AcceptCentrality(const AliESDEvent *esd) const
786 // check if events is in the required multiplicity range
788 const AliMultiplicity *alimult = esd->GetMultiplicity();
789 Int_t nclsSPDouter=0;
790 if(alimult) nclsSPDouter = alimult->GetNumberOfITSClusters(1);
791 if(nclsSPDouter<fMinMult || nclsSPDouter>fMaxMult) return kFALSE;
796 //_______________________________________________________________________________________
797 void AliAnalysisTaskITSAlignQA::CreateUserInfo()
799 // if needed, set user info of the output tree
801 AliError("TrackPoints summary tree does not exist");
804 TList* uInfo = fTPTree->GetUserInfo();
805 TMap *cdbMapCopy = (TMap*)uInfo->FindObject("cdbMap");
806 TList *cdbListCopy = (TList*)uInfo->FindObject("cdbList");
807 TList *bzList = (TList*)uInfo->FindObject("BzkGauss");
808 if (cdbMapCopy && cdbListCopy && bzList) return; //already done
810 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
811 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
813 cdbMapCopy = new TMap(cdbMap->GetEntries());
814 cdbMapCopy->SetOwner(1);
815 cdbMapCopy->SetName("cdbMap");
816 TIter iter(cdbMap->GetTable());
819 while((pair = dynamic_cast<TPair*> (iter.Next()))){
820 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
821 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
822 if (keyStr && valStr) {
823 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
824 AliInfo(Form("Add %s : %s to cdbMap of ITSTPUserInfo",keyStr->GetName(),valStr->GetName()));
828 cdbListCopy = new TList();
829 cdbListCopy->SetOwner(1);
830 cdbListCopy->SetName("cdbList");
832 TIter iter2(cdbList);
834 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
835 cdbListCopy->Add(new TObjString(id->ToString().Data()));
836 AliInfo(Form("Add %s to cdbList of ITSTPUserInfo",id->ToString().Data()));
839 uInfo->Add(cdbMapCopy);
840 uInfo->Add(cdbListCopy);
842 AliMagF *fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
843 Double_t bz = fld ? fld->SolenoidField() : 0;
844 TString bzString; bzString+=bz;
845 TObjString *bzObjString = new TObjString(bzString);
846 bzList = new TList();
848 bzList->SetName("BzkGauss");
849 bzList->Add(bzObjString);
854 //_______________________________________________________________________________________
855 void AliAnalysisTaskITSAlignQA::CopyUserInfo()
857 // if available, copy the UserInfo from the ESDtree to the output tree
858 static Bool_t done = kFALSE;
861 AliError("TrackPoints summary tree does not exist");
864 AliESDInputHandler *handler = (AliESDInputHandler*)AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
866 if (!handler || !(esdTree=handler->GetTree())) return;
867 if (esdTree->InheritsFrom(TChain::Class())) esdTree = esdTree->GetTree();
868 TList* uInfoSrc = esdTree->GetUserInfo();
869 const TMap *cdbMapSrc = (TMap*)uInfoSrc->FindObject("cdbMap");
870 const TList *cdbListSrc = (TList*)uInfoSrc->FindObject("cdbList");
871 if (!cdbMapSrc || !cdbListSrc) return;
873 AliInfo("Create ITSTPUserInfo from esdTree");
874 TList* uInfoDst = fTPTree->GetUserInfo();
876 TMap *cdbMapCopy = new TMap(cdbMapSrc->GetEntries());
877 cdbMapCopy->SetOwner(1);
878 cdbMapCopy->SetName("cdbMap");
879 TIter iter(cdbMapSrc->GetTable());
881 while((pair = dynamic_cast<TPair*> (iter.Next()))){
882 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
883 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
884 if (keyStr && valStr) {
885 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
886 AliInfo(Form("Add %s : %s to cdbMap of ITSTPUserInfo",keyStr->GetName(),valStr->GetName()));
890 TList *cdbListCopy = new TList();
891 cdbListCopy->SetOwner(1);
892 cdbListCopy->SetName("cdbList");
894 TIter iter2(cdbListSrc);
896 while((id = dynamic_cast<TObjString*> (iter2.Next()))){
897 cdbListCopy->Add(new TObjString(*id));
898 AliInfo(Form("Add %s to cdbList of ITSTPUserInfo",id->GetName()));
901 uInfoDst->Add(cdbMapCopy);
902 uInfoDst->Add(cdbListCopy);
904 AliMagF *fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
905 Double_t bz = fld ? fld->SolenoidField() : 0;
906 TString bzString; bzString+=bz;
907 TObjString *bzObjString = new TObjString(bzString);
908 TList *bzList = new TList();
910 bzList->SetName("BzkGauss");
911 bzList->Add(bzObjString);
912 uInfoDst->Add(bzList);