1 /**************************************************************************
2 * Copyright(c) 1998-2009, 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 **************************************************************************/
16 //*************************************************************************
17 // Class AliAnalysisTaskVertexESD
18 // AliAnalysisTask to extract from ESD the information for the analysis
19 // of the primary vertex reconstruction efficiency and resolution
20 // (for MC events) and distributions (for real data). Three vertices:
25 // Author: A.Dainese, andrea.dainese@pd.infn.it
26 //*************************************************************************
32 #include <TClonesArray.h>
33 #include <TObjArray.h>
37 #include <TGraphAsymmErrors.h>
40 #include "AliAnalysisTask.h"
41 #include "AliAnalysisManager.h"
43 #include "AliMultiplicity.h"
44 #include "AliVertexerTracks.h"
45 #include "AliESDtrack.h"
46 #include "AliExternalTrackParam.h"
47 #include "AliESDVertex.h"
48 #include "AliVEvent.h"
49 #include "AliESDInputHandler.h"
50 #include "AliTrackReference.h"
51 //#include "AliTriggerAnalysis.h"
53 #include "AliMCEventHandler.h"
54 #include "AliMCEvent.h"
58 #include "AliGenEventHeader.h"
59 #include "AliAnalysisTaskVertexESD.h"
62 ClassImp(AliAnalysisTaskVertexESD)
64 //________________________________________________________________________
65 AliAnalysisTaskVertexESD::AliAnalysisTaskVertexESD(const char *name) :
66 AliAnalysisTaskSE(name),
67 fCheckEventType(kTRUE),
70 fRecoVtxITSTPC(kTRUE),
71 fRecoVtxITSTPCHalfEvent(kFALSE),
72 fOnlyITSTPCTracks(kFALSE),
73 fOnlyITSSATracks(kFALSE),
75 fFillTreeBeamSpot(kFALSE),
90 fhTriggeredTrklets(0),
104 fhSPDVertexDiffZPileContr2(0),
105 fhSPDVertexDiffZPileContr3(0),
106 fhSPDVertexDiffZPileContr4(0),
107 fhSPDVertexDiffZPileContr5(0),
108 fhSPDContributorsPile(0),
109 fhSPDDispContributors(0),
110 fTriggerType(AliVEvent::kMB)
114 // Define input and output slots here
115 // Output slot #0 writes into a TList container
116 DefineOutput(1, TList::Class()); //My private output
118 //________________________________________________________________________
119 AliAnalysisTaskVertexESD::~AliAnalysisTaskVertexESD()
123 // histograms are in the output list and deleted when the output
124 // list is deleted by the TSelector dtor
133 //________________________________________________________________________
134 void AliAnalysisTaskVertexESD::UserCreateOutputObjects()
139 // Several histograms are more conveniently managed in a TList
143 fNtupleVertexESD = new TNtuple("fNtupleVertexESD","vertices","run:tstamp:bunchcross:triggered:dndygen:xtrue:ytrue:ztrue:xSPD:xerrSPD:ySPD:yerrSPD:zSPD:zerrSPD:ntrksSPD:SPD3D:dphiSPD:xTPC:xerrTPC:yTPC:yerrTPC:zTPC:zerrTPC:ntrksTPC:constrTPC:xTRK:xerrTRK:yTRK:yerrTRK:zTRK:zerrTRK:ntrksTRK:constrTRK:ntrklets:nESDtracks:nITSrefit5or6:nTPCin:nTPCinEta09:SPD0cls:xSPDp:xerrSPDp:ySPDp:yerrSPDp:zSPDp:zerrSPDp:ntrksSPDp:xTPCnc:xerrTPCnc:yTPCnc:yerrTPCnc:zTPCnc:zerrTPCnc:ntrksTPCnc:xTPCc:xerrTPCc:yTPCc:yerrTPCc:zTPCc:zerrTPCc:ntrksTPCc:xTRKnc:xerrTRKnc:yTRKnc:yerrTRKnc:zTRKnc:zerrTRKnc:ntrksTRKnc:xTRKc:xerrTRKc:yTRKc:yerrTRKc:zTRKc:zerrTRKc:ntrksTRKc:deltaxTRKnc:deltayTRKnc:deltazTRKnc:deltaxerrTRKnc:deltayerrTRKnc:deltazerrTRKnc:ntrksEvenTRKnc:ntrksOddTRKnc");
145 fOutput->Add(fNtupleVertexESD);
147 fhSPDVertexX = new TH1F("fhSPDVertexX","SPDVertex x; x vertex [cm]; events",200,-1,1);
148 fOutput->Add(fhSPDVertexX);
149 fhSPDVertexY = new TH1F("fhSPDVertexY","SPDVertex y; y vertex [cm]; events",200,-1,1);
150 fOutput->Add(fhSPDVertexY);
151 fhSPDVertexZ = new TH1F("fhSPDVertexZ","SPDVertex z; z vertex [cm]; events",200,-20,20);
152 fOutput->Add(fhSPDVertexZ);
153 fhTRKVertexX = new TH1F("fhTRKVertexX","TRKVertex x; x vertex [cm]; events",200,-1,1);
154 fOutput->Add(fhTRKVertexX);
155 fhTRKVertexY = new TH1F("fhTRKVertexY","TRKVertex y; y vertex [cm]; events",200,-1,1);
156 fOutput->Add(fhTRKVertexY);
157 fhTRKVertexZ = new TH1F("fhTRKVertexZ","TRKVertex z; z vertex [cm]; events",200,-20,20);
158 fOutput->Add(fhTRKVertexZ);
159 fhTPCVertexX = new TH1F("fhTPCVertexX","TPCVertex x; x vertex [cm]; events",200,-3,3);
160 fOutput->Add(fhTPCVertexX);
161 fhTPCVertexY = new TH1F("fhTPCVertexY","TPCVertex y; y vertex [cm]; events",200,-3,3);
162 fOutput->Add(fhTPCVertexY);
163 fhTPCVertexZ = new TH1F("fhTPCVertexZ","TPCVertex z; z vertex [cm]; events",200,-20,20);
164 fOutput->Add(fhTPCVertexZ);
167 fhSPDVertexXPile = new TH1F("fhSPDVertexXPile","SPDVertexPile x; x vertex [cm]; events",200,-20,20);
168 fOutput->Add(fhSPDVertexXPile);
169 fhSPDVertexYPile = new TH1F("fhSPDVertexYPile","SPDVertexPile y; y vertex [cm]; events",200,-20,20);
170 fOutput->Add(fhSPDVertexYPile);
171 fhSPDVertexZPile = new TH1F("fhSPDVertexZPile","SPDVertexPile z; z vertex [cm]; events",200,-40,40);
172 fOutput->Add(fhSPDVertexZPile);
174 fhSPDVertexDiffZPileContr2 = new TH1F("fhSPDVertexDiffZPileContr2","SPDVertexDiff z; zmain - zdiff [cm]; events",2000,-100,100);
175 fOutput->Add(fhSPDVertexDiffZPileContr2);
176 fhSPDVertexDiffZPileContr3 = new TH1F("fhSPDVertexDiffZPileContr3","SPDVertexDiff z; zmain - zdiff [cm]; events",2000,-100,100);
177 fOutput->Add(fhSPDVertexDiffZPileContr3);
178 fhSPDVertexDiffZPileContr4 = new TH1F("fhSPDVertexDiffZPileContr4","SPDVertexDiff z; zmain - zdiff [cm]; events",2000,-100,100);
179 fOutput->Add(fhSPDVertexDiffZPileContr4);
180 fhSPDVertexDiffZPileContr5 = new TH1F("fhSPDVertexDiffZPileContr5","SPDVertexDiff z; zmain - zdiff [cm]; events",2000,-100,100);
181 fOutput->Add(fhSPDVertexDiffZPileContr5);
183 fhTrackRefs = new TH2F("fhTrackRefs","Track references; x; y",1000,-4,4,1000,-4,4);
184 fOutput->Add(fhTrackRefs);
186 fTreeBeamSpot = new TTree("fTreeBeamSpot", "BeamSpotTree");
187 UShort_t triggered, ntrkletsS, ntrksTRKnc;
189 Float_t cetTimeLHC,xTRKnc, yTRKnc, zTRKnc;
190 fTreeBeamSpot->Branch("run", &run, "run/i");
191 fTreeBeamSpot->Branch("cetTimeLHC", &cetTimeLHC, "cetTimeLHC/F");
192 fTreeBeamSpot->Branch("bx", &bx, "bx/i");
193 fTreeBeamSpot->Branch("triggered", &triggered, "triggered/s");
194 fTreeBeamSpot->Branch("ntrkletsS", &ntrkletsS, "ntrkletsS/s");
195 fTreeBeamSpot->Branch("xTRKnc", &xTRKnc, "xTRKnc/F");
196 fTreeBeamSpot->Branch("yTRKnc", &yTRKnc, "yTRKnc/F");
197 fTreeBeamSpot->Branch("zTRKnc", &zTRKnc, "zTRKnc/F");
198 fTreeBeamSpot->Branch("ntrksTRKnc", &ntrksTRKnc, "ntrksTRKnc/s");
199 fOutput->Add(fTreeBeamSpot);
201 Int_t nbinTrklets=29;
202 Float_t lowTrklets[30]={-0.5,0.5,1.5,2.5,3.5,4.5,5.5,7.5,10.5,25.5,50.5,75.5,100.5,150.5,200.5,300.5,400.5,500.5,600.5,800.5,1000.5,1500.5,2000.5,2500.5,3000.5,4000.5,5000.5,6000.5,8000.5,10000.5};
203 fhTriggeredTrklets = new TH1F("fhTriggeredTrklets","trklets dist for triggered ev.; ntrklets; entries",nbinTrklets,lowTrklets);
204 fOutput->Add(fhTriggeredTrklets);
205 fhSPD3DTrklets = new TH1F("fhSPD3DTrklets","trklets dist for SPD3D ev.; ntrklets; entries",nbinTrklets,lowTrklets);
206 fOutput->Add(fhSPD3DTrklets);
207 fhSPDZTrklets = new TH1F("fhSPDZTrklets","trklets dist for SPDZ ev.; ntrklets; entries",nbinTrklets,lowTrklets);
208 fOutput->Add(fhSPDZTrklets);
209 fhTRKTrklets = new TH1F("fhTRKTrklets","trklets dist for TRK ev.; ntrklets; entries",nbinTrklets,lowTrklets);
210 fOutput->Add(fhTRKTrklets);
211 fhTRKcTrklets = new TH1F("fhTRKcTrklets","trklets dist for TRKc ev.; ntrklets; entries",nbinTrklets,lowTrklets);
212 fOutput->Add(fhTRKcTrklets);
213 fhTRKncTrklets = new TH1F("fhTRKncTrklets","trklets dist for TRKnc ev.; ntrklets; entries",nbinTrklets,lowTrklets);
214 fOutput->Add(fhTRKncTrklets);
215 fhTPCTrklets = new TH1F("fhTPCTrklets","trklets dist for TPC ev.; ntrklets; entries",nbinTrklets,lowTrklets);
216 fOutput->Add(fhTPCTrklets);
217 fhTPCcTrklets = new TH1F("fhTPCcTrklets","trklets dist for TPCc ev.; ntrklets; entries",nbinTrklets,lowTrklets);
218 fOutput->Add(fhTPCcTrklets);
219 fhTPCncTrklets = new TH1F("fhTPCncTrklets","trklets dist for TPCnc ev.; ntrklets; entries",nbinTrklets,lowTrklets);
220 fOutput->Add(fhTPCncTrklets);
222 Int_t nbinZreco = 16;
223 Double_t lowZreco[17]={-15.0,-10.0,-7.0,-5,-4,-3,-2,-1,0,1,2,3,4,5,7,10,15};
224 fhSPD3DZreco = new TH1F("fhSPD3DZreco","Zreco dist for SPD3D ev.; Zreco [cm]; entries",nbinZreco,lowZreco);
225 fOutput->Add(fhSPD3DZreco);
226 fhSPDZZreco = new TH1F("fhSPDZZreco","Zreco dist for SPDZ ev.; Zreco [cm]; entries",nbinZreco,lowZreco);
227 fOutput->Add(fhSPDZZreco);
229 fhSPDContributorsPile = new TH1F("fhSPDContributorsPile","ncontributors pile up vertex; ncontributors; entries",200,-0.5,199.5);
230 fOutput->Add(fhSPDContributorsPile);
232 fhSPDDispContributors = new TH2F("fhSPDDispContributors","ncontributors main-pile; ncontributors main; ncontributors pile",200,-0.5,199.5,200,-0.5,199.5);
233 fOutput->Add(fhSPDDispContributors);
235 PostData(1, fOutput);
240 //________________________________________________________________________
241 void AliAnalysisTaskVertexESD::UserExec(Option_t *)
244 // Called for each event
247 Printf("ERROR: fESD not available");
250 AliESDEvent* esdE = (AliESDEvent*) InputEvent();
252 // Select PHYSICS events (type=7, for data) and MC events (type=0)
253 // fCheckEventType is kFALSE if fReadMC is kTRUE, hence check is skipped
254 if(fCheckEventType) {
255 if(esdE->GetEventType()!=7 && esdE->GetEventType()!=0) return;
260 mcVertex[0]=9999.; mcVertex[1]=9999.; mcVertex[2]=9999.;
261 Float_t dNchdy=-999.;
262 // *********** MC info ***************
264 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
266 Printf("ERROR: Could not retrieve MC event handler");
270 AliMCEvent* mcEvent = eventHandler->MCEvent();
272 Printf("ERROR: Could not retrieve MC event");
276 AliStack* stack = mcEvent->Stack();
278 AliDebug(AliLog::kError, "Stack not available");
282 AliHeader* header = mcEvent->Header();
284 AliDebug(AliLog::kError, "Header not available");
287 AliGenEventHeader* genHeader = header->GenEventHeader();
288 genHeader->PrimaryVertex(mcVertex);
290 Int_t ngenpart = (Int_t)stack->GetNtrack();
291 //printf("# generated particles = %d\n",ngenpart);
293 for(Int_t ip=0; ip<ngenpart; ip++) {
294 TParticle* part = (TParticle*)stack->Particle(ip);
295 // keep only electorns, muons, pions, kaons and protons
296 Int_t apdg = TMath::Abs(part->GetPdgCode());
297 if(apdg!=11 && apdg!=13 && apdg!=211 && apdg!=321 && apdg!=2212) continue;
298 // reject secondaries
299 if(TMath::Sqrt((part->Vx()-mcVertex[0])*(part->Vx()-mcVertex[0])+(part->Vy()-mcVertex[1])*(part->Vy()-mcVertex[1]))>0.0010) continue;
300 // reject incoming protons
301 Double_t energy = part->Energy();
302 if(energy>900.) continue;
303 Double_t pz = part->Pz();
304 Double_t y = 0.5*TMath::Log((energy+pz+1.e-13)/(energy-pz+1.e-13));
305 if(TMath::Abs(y)<1.0) dNchdy += 0.5; // count 1/2 of particles in |y|<1
307 TClonesArray *trefs=0;
308 Int_t ntrefs = mcEvent->GetParticleAndTR(ip,part,trefs);
309 if(ntrefs<0) continue;
310 for(Int_t iref=0; iref<ntrefs; iref++) {
311 AliTrackReference *tref = (AliTrackReference*)trefs->At(iref);
312 if(tref->R()>10.) continue;
313 fhTrackRefs->Fill(tref->X(),tref->Y());
316 //printf("# primary particles = %7.1f\n",dNchdy);
318 // *********** MC info ***************
322 //ULong64_t triggerMask;
323 //ULong64_t spdFO = (1 << 14);
324 //ULong64_t v0left = (1 << 10);
325 //ULong64_t v0right = (1 << 11);
327 //triggerMask=esdE->GetTriggerMask();
328 // MB1: SPDFO || V0L || V0R
329 //Bool_t eventTriggered = (triggerMask & spdFO || ((triggerMask & v0left) || (triggerMask & v0right)));
331 //triggerMask & spdFO && ((triggerMask&v0left) || (triggerMask&v0right))
332 //Bool_t eventTriggered = (triggerMask & spdFO);
334 //static AliTriggerAnalysis* triggerAnalysis = new AliTriggerAnalysis();
335 Bool_t eventTriggered = 0;//triggerAnalysis->IsTriggerFired(esdE, AliTriggerAnalysis::kSPDGFO /*| AliTriggerAnalysis::kOfflineFlag*/);
337 // use response of AliPhysicsSelection
338 eventTriggered = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerType);
341 Int_t nInFile = esdE->GetEventNumberInFile();
343 const AliMultiplicity *alimult = esdE->GetMultiplicity();
344 Int_t ntrklets=0,spd0cls=0;
346 ntrklets = alimult->GetNumberOfTracklets();
348 for(Int_t l=0;l<alimult->GetNumberOfTracklets();l++){
349 if(alimult->GetDeltaPhi(l)<-9998.) ntrklets--;
351 spd0cls = alimult->GetNumberOfSingleClusters()+ntrklets;
355 UShort_t triggered, ntrkletsS, ntrksTRKnc;
357 Float_t cetTimeLHC,xTRKnc, yTRKnc, zTRKnc;
358 fTreeBeamSpot->SetBranchAddress("run", &run);
359 fTreeBeamSpot->SetBranchAddress("cetTimeLHC", &cetTimeLHC);
360 fTreeBeamSpot->SetBranchAddress("bx", &bx);
361 fTreeBeamSpot->SetBranchAddress("triggered", &triggered);
362 fTreeBeamSpot->SetBranchAddress("ntrkletsS", &ntrkletsS);
363 fTreeBeamSpot->SetBranchAddress("xTRKnc", &xTRKnc);
364 fTreeBeamSpot->SetBranchAddress("yTRKnc", &yTRKnc);
365 fTreeBeamSpot->SetBranchAddress("zTRKnc", &zTRKnc);
366 fTreeBeamSpot->SetBranchAddress("ntrksTRKnc", &ntrksTRKnc);
369 Double_t tstamp = esdE->GetTimeStamp();
370 Float_t cetTime =(tstamp-1262304000.)+7200.;
372 Float_t cetTime1h =(tstamp-1262304000.)+3600.;
374 cetTimeLHC = (Float_t)cetTime1h;
376 Int_t ntracks = esdE->GetNumberOfTracks();
377 Int_t nITS5or6=0,nTPCin=0,nTPCinEta09=0;
378 //printf("Tracks # = %d\n",esdE->GetNumberOfTracks());
379 for(Int_t itr=0; itr<ntracks; itr++) {
380 AliESDtrack *t = esdE->GetTrack(itr);
381 if(t->GetNcls(0)>=5) nITS5or6++;
382 Double_t z0; t->GetZAt(0,esdE->GetMagneticField(),z0);
383 if(t->GetNcls(1)>0 && TMath::Abs(t->GetD(0,0,esdE->GetMagneticField()))<2.8 && TMath::Abs(z0)<20) {
385 if(TMath::Abs(t->GetTgl())<1.5) nTPCinEta09++;
390 const AliESDVertex *spdv=esdE->GetPrimaryVertexSPD();
391 const AliESDVertex *spdvp=esdE->GetPileupVertexSPD(0);
392 const AliESDVertex *tpcv=esdE->GetPrimaryVertexTPC();
393 const AliESDVertex *trkv=esdE->GetPrimaryVertexTracks();
398 if(spdv->GetNContributors()>0) {
399 TString title=spdv->GetTitle();
400 if(title.Contains("3D")) {
401 fhSPDVertexX->Fill(spdv->GetXv());
402 fhSPDVertexY->Fill(spdv->GetYv());
404 fhSPDVertexZ->Fill(spdv->GetZv());
409 if(trkv->GetNContributors()>0) {
410 fhTRKVertexX->Fill(trkv->GetXv());
411 fhTRKVertexY->Fill(trkv->GetYv());
412 fhTRKVertexZ->Fill(trkv->GetZv());
417 if(tpcv->GetNContributors()>0) {
418 fhTPCVertexX->Fill(tpcv->GetXv());
419 fhTPCVertexY->Fill(tpcv->GetYv());
420 fhTPCVertexZ->Fill(tpcv->GetZv());
426 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
427 // filling Vertex reco efficiency plots
429 if(eventTriggered ? 1. : 0.){
430 fhTriggeredTrklets->Fill(ntrklets);
433 if(spdv->GetNContributors()>0.5){
434 TString spdtitle = spdv->GetTitle();
435 if(spdtitle.Contains("vertexer: 3D") ? 1. : 0.){
436 fhSPD3DTrklets->Fill(ntrklets);
437 fhSPD3DZreco->Fill(spdv->GetZv());
440 fhSPDZTrklets->Fill(ntrklets);
441 fhSPDZZreco->Fill(spdv->GetZv());
447 if(trkv->GetNContributors()>0.5)fhTRKTrklets->Fill(ntrklets);
450 AliESDVertex *trkvc = ReconstructPrimaryVertexITSTPC(kTRUE);
451 if(trkvc->GetNContributors()>0.5)fhTRKcTrklets->Fill(ntrklets);
452 delete trkvc; trkvc=0;
453 AliESDVertex *trkvnc = ReconstructPrimaryVertexITSTPC(kFALSE);
454 if(trkvnc->GetNContributors()>0.5)fhTRKncTrklets->Fill(ntrklets);
455 delete trkvnc; trkvnc=0;
459 if(tpcv->GetNContributors()>0.5)fhTPCTrklets->Fill(ntrklets);
462 AliESDVertex *tpcvc = ReconstructPrimaryVertexTPC(kTRUE);
463 if(tpcvc->GetNContributors()>0.5)fhTPCcTrklets->Fill(ntrklets);
464 delete tpcvc; tpcvc=0;
465 AliESDVertex *tpcvnc = ReconstructPrimaryVertexTPC(kFALSE);
466 if(tpcvnc->GetNContributors()>0.5)fhTPCncTrklets->Fill(ntrklets);
467 delete tpcvnc; tpcvnc=0;
470 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
475 Float_t expile=-999.;
476 Float_t eypile=-999.;
477 Float_t ezpile=-999.;
480 if(esdE->GetNumberOfPileupVerticesSPD()>0 && spdvp && spdv){
482 if(spdvp->GetNContributors()>0) {
484 fhSPDVertexXPile->Fill(spdvp->GetXv());
485 fhSPDVertexYPile->Fill(spdvp->GetYv());
486 fhSPDContributorsPile->Fill(spdvp->GetNContributors());
487 fhSPDDispContributors->Fill(spdv->GetNContributors(),spdvp->GetNContributors());
488 fhSPDVertexZPile->Fill(spdvp->GetZv());
489 if(spdvp->GetNContributors()>=2) {fhSPDVertexDiffZPileContr2->Fill(spdv->GetZv()-spdvp->GetZv());}
490 if(spdvp->GetNContributors()>=3) {fhSPDVertexDiffZPileContr3->Fill(spdv->GetZv()-spdvp->GetZv());}
491 if(spdvp->GetNContributors()>=4) {fhSPDVertexDiffZPileContr4->Fill(spdv->GetZv()-spdvp->GetZv());}
492 if(spdvp->GetNContributors()>=5) {fhSPDVertexDiffZPileContr5->Fill(spdv->GetZv()-spdvp->GetZv());}
496 xpile=spdvp->GetXv();
497 expile=spdvp->GetXRes();
498 ypile=spdvp->GetYv();
499 eypile=spdvp->GetYRes();
500 zpile=spdvp->GetZv();
501 ezpile=spdvp->GetZRes();
502 ntrkspile=spdvp->GetNContributors();
507 Float_t xnt[82]; for(Int_t iii=0;iii<isize;iii++) xnt[iii]=0.;
510 Float_t secnt[9]; for(Int_t iii=0;iii<isizeSecNt;iii++) secnt[iii]=0.;
515 xnt[index++]=(Float_t)esdE->GetRunNumber();
516 secnt[indexSecNt++]=(Float_t)esdE->GetRunNumber();
517 run = (Int_t)esdE->GetRunNumber();
519 xnt[index++]=cetTime; //(Float_t)esdE->GetTimeStamp();
520 //secnt[indexSecNt++]=cetTime;
521 secnt[indexSecNt++]=cetTime1h;
523 xnt[index++]=(Float_t)esdE->GetBunchCrossNumber();
524 secnt[indexSecNt++]=(Float_t)esdE->GetBunchCrossNumber();
525 bx = (Int_t)esdE->GetBunchCrossNumber();
527 xnt[index++]=(eventTriggered ? 1. : 0.);
528 secnt[indexSecNt++]=(eventTriggered ? 1. : 0.);
529 triggered = (UShort_t)(eventTriggered ? 1 : 0);
531 xnt[index++]=(Float_t)dNchdy;
533 xnt[index++]=mcVertex[0];
534 xnt[index++]=mcVertex[1];
535 xnt[index++]=mcVertex[2];
537 xnt[index++]=spdv->GetXv();
538 xnt[index++]=spdv->GetXRes();
539 xnt[index++]=spdv->GetYv();
540 xnt[index++]=spdv->GetYRes();
541 xnt[index++]=spdv->GetZv();
542 xnt[index++]=spdv->GetZRes();
543 xnt[index++]=spdv->GetNContributors();
544 TString spdtitle = spdv->GetTitle();
545 xnt[index++]=(spdtitle.Contains("vertexer: 3D") ? 1. : 0.);
546 xnt[index++]=spdv->GetDispersion();
548 xnt[index++]=tpcv->GetXv();
549 xnt[index++]=tpcv->GetXRes();
550 xnt[index++]=tpcv->GetYv();
551 xnt[index++]=tpcv->GetYRes();
552 xnt[index++]=tpcv->GetZv();
553 xnt[index++]=tpcv->GetZRes();
554 xnt[index++]=tpcv->GetNContributors();
555 TString tpctitle = tpcv->GetTitle();
556 xnt[index++]=(tpctitle.Contains("WithConstraint") ? 1. : 0.);
558 xnt[index++]=trkv->GetXv();
559 xnt[index++]=trkv->GetXRes();
560 xnt[index++]=trkv->GetYv();
561 xnt[index++]=trkv->GetYRes();
562 xnt[index++]=trkv->GetZv();
563 xnt[index++]=trkv->GetZRes();
564 xnt[index++]=trkv->GetNContributors();// tpccontrorig;
565 TString trktitle = trkv->GetTitle();
566 xnt[index++]=(trktitle.Contains("WithConstraint") ? 1. : 0.);
568 xnt[index++]=float(ntrklets);
569 secnt[indexSecNt++]=float(ntrklets);
570 ntrkletsS = (UShort_t)ntrklets;
572 xnt[index++]=float(ntracks);
573 xnt[index++]=float(nITS5or6);
575 xnt[index++]=float(nTPCin);
576 xnt[index++]=float(nTPCinEta09);
578 xnt[index++]=spd0cls;
586 xnt[index++]=(Float_t)ntrkspile;
590 // add recalculated vertices TRK and TPC
593 AliESDVertex *tpcvnc = ReconstructPrimaryVertexTPC(kFALSE);
594 xnt[index++]=tpcvnc->GetXv();
595 xnt[index++]=tpcvnc->GetXRes();
596 xnt[index++]=tpcvnc->GetYv();
597 xnt[index++]=tpcvnc->GetYRes();
598 xnt[index++]=tpcvnc->GetZv();
599 xnt[index++]=tpcvnc->GetZRes();
600 xnt[index++]=tpcvnc->GetNContributors();
601 delete tpcvnc; tpcvnc=0;
603 AliESDVertex *tpcvc = ReconstructPrimaryVertexTPC(kTRUE);
604 xnt[index++]=tpcvc->GetXv();
605 xnt[index++]=tpcvc->GetXRes();
606 xnt[index++]=tpcvc->GetYv();
607 xnt[index++]=tpcvc->GetYRes();
608 xnt[index++]=tpcvc->GetZv();
609 xnt[index++]=tpcvc->GetZRes();
610 xnt[index++]=tpcvc->GetNContributors();
611 delete tpcvc; tpcvc=0;
615 AliESDVertex *trkvnc = ReconstructPrimaryVertexITSTPC(kFALSE);
616 xnt[index++]=trkvnc->GetXv();
617 xnt[index++]=trkvnc->GetXRes();
618 xnt[index++]=trkvnc->GetYv();
619 xnt[index++]=trkvnc->GetYRes();
620 xnt[index++]=trkvnc->GetZv();
621 xnt[index++]=trkvnc->GetZRes();
622 xnt[index++]=trkvnc->GetNContributors();
624 secnt[indexSecNt++]=trkvnc->GetXv();
625 secnt[indexSecNt++]=trkvnc->GetYv();
626 secnt[indexSecNt++]=trkvnc->GetZv();
627 secnt[indexSecNt++]=trkvnc->GetNContributors();
629 xTRKnc = (Float_t)trkvnc->GetXv();
630 yTRKnc = (Float_t)trkvnc->GetYv();
631 zTRKnc = (Float_t)trkvnc->GetZv();
632 ntrksTRKnc = (trkvnc->GetNContributors()<0 ? 0 : (UShort_t)trkvnc->GetNContributors());
634 delete trkvnc; trkvnc=0;
637 AliESDVertex *trkvc = ReconstructPrimaryVertexITSTPC(kTRUE);
638 xnt[index++]=trkvc->GetXv();
639 xnt[index++]=trkvc->GetXRes();
640 xnt[index++]=trkvc->GetYv();
641 xnt[index++]=trkvc->GetYRes();
642 xnt[index++]=trkvc->GetZv();
643 xnt[index++]=trkvc->GetZRes();
644 xnt[index++]=trkvc->GetNContributors();
645 delete trkvc; trkvc=0;
648 if(fRecoVtxITSTPCHalfEvent) {
649 AliESDVertex *trkvncodd = ReconstructPrimaryVertexITSTPC(kFALSE,1);
650 AliESDVertex *trkvnceven = ReconstructPrimaryVertexITSTPC(kFALSE,2);
651 if(trkvncodd->GetNContributors()>0 &&
652 trkvnceven->GetNContributors()>0) {
653 xnt[index++]=trkvncodd->GetXv()-trkvnceven->GetXv();
654 xnt[index++]=trkvncodd->GetYv()-trkvnceven->GetYv();
655 xnt[index++]=trkvncodd->GetZv()-trkvnceven->GetZv();
656 xnt[index++]=TMath::Sqrt(trkvncodd->GetXRes()*trkvncodd->GetXRes()+trkvnceven->GetXRes()*trkvnceven->GetXRes());
657 xnt[index++]=TMath::Sqrt(trkvncodd->GetYRes()*trkvncodd->GetYRes()+trkvnceven->GetYRes()*trkvnceven->GetYRes());
658 xnt[index++]=TMath::Sqrt(trkvncodd->GetZRes()*trkvncodd->GetZRes()+trkvnceven->GetZRes()*trkvnceven->GetZRes());
659 xnt[index++]=trkvnceven->GetNContributors();
660 xnt[index++]=trkvncodd->GetNContributors();
671 delete trkvncodd; trkvncodd=0;
672 delete trkvnceven; trkvnceven=0;
676 if(index>isize) printf("AliAnalysisTaskVertexESD: ERROR, index!=isize\n");
677 if(fFillNtuple) fNtupleVertexESD->Fill(xnt);
679 if(indexSecNt>isizeSecNt) printf("AliAnalysisTaskVertexESD: ERROR, indexSecNt!=isizeSecNt\n");
681 // if(indexTree>isizeTree) printf("AliAnalysisTaskVertexESD: ERROR, indexTree!=isizeTree\n");
682 // only every second event (to reduce output size)
683 if(fFillTreeBeamSpot && (nInFile%2 == 0)) fTreeBeamSpot->Fill();
686 // Post the data already here
687 PostData(1, fOutput);
692 //________________________________________________________________________
693 void AliAnalysisTaskVertexESD::Terminate(Option_t *)
695 // Draw result to the screen
696 // Called once at the end of the query
697 fOutput = dynamic_cast<TList*> (GetOutputData(1));
699 Printf("ERROR: fOutput not available");
703 //////////////////////////////////////////////////////
705 TH1F *fhTriggeredTrklets=(TH1F*)fOutput->FindObject("fhTriggeredTrklets");
706 TH1F *fhSPDZTrklets=(TH1F*)fOutput->FindObject("fhSPDZTrklets");
707 TH1F *fhSPD3DTrklets=(TH1F*)fOutput->FindObject("fhSPD3DTrklets");
708 TH1F *fhTRKTrklets=(TH1F*)fOutput->FindObject("fhTRKTrklets");
709 TH1F *fhTRKcTrklets=(TH1F*)fOutput->FindObject("fhTRKcTrklets");
710 TH1F *fhTRKncTrklets=(TH1F*)fOutput->FindObject("fhTRKncTrklets");
711 TH1F *fhSPDZZreco=(TH1F*)fOutput->FindObject("fhSPDZZreco");
712 TH1F *fhSPD3DZreco=(TH1F*)fOutput->FindObject("fhSPD3DZreco");
714 TGraphAsymmErrors *fhSPDZEffTrklets=new TGraphAsymmErrors(fhSPDZTrklets,fhTriggeredTrklets,"w");
715 fhSPDZEffTrklets->SetName("fhSPDZEffTrklets");
716 fhSPDZEffTrklets->SetDrawOption("AP");
717 TGraphAsymmErrors *fhSPD3DEffTrklets=new TGraphAsymmErrors(fhSPD3DTrklets,fhTriggeredTrklets,"w");
718 fhSPD3DEffTrklets->SetName("fhSPD3DEffTrklets");
719 TH1F * fhSPDOverallTrklets=(TH1F*)fhSPDZTrklets->Clone("fhSPDOverallTrklets");
720 fhSPDOverallTrklets->Add(fhSPD3DTrklets);
721 TGraphAsymmErrors *fhSPDOverallEffTrklets=new TGraphAsymmErrors(fhSPDOverallTrklets,fhTriggeredTrklets,"w");
722 fhSPDOverallEffTrklets->SetName("fhSPDOverallEffTrklets");
723 TGraphAsymmErrors *fhTRKEffTrklets=new TGraphAsymmErrors(fhTRKTrklets,fhTriggeredTrklets,"w");
724 fhTRKEffTrklets->SetName("fhTRKEffTrklets");
725 TGraphAsymmErrors *fhTRKcEffTrklets=new TGraphAsymmErrors(fhTRKcTrklets,fhTriggeredTrklets,"w");
726 fhTRKcEffTrklets->SetName("fhTRKcEffTrklets");
727 TGraphAsymmErrors *fhTRKncEffTrklets=new TGraphAsymmErrors(fhTRKncTrklets,fhTriggeredTrklets,"w");
728 fhTRKncEffTrklets->SetName("fhTRKncEffTrklets");
729 TH1F * fhSPDOverallZreco=(TH1F*)fhSPDZZreco->Clone("fhSPDOverallZreco");
730 fhSPDOverallZreco->Add(fhSPD3DZreco);
731 TGraphAsymmErrors *fhSPDEffZreco=new TGraphAsymmErrors(fhSPD3DZreco,fhSPDOverallZreco,"w");
732 fhSPDEffZreco->SetName("fhSPDEffZreco");
734 TH1F *fhEff = new TH1F("hEff","hEff",6,0.5,6.5);
736 if(fhSPDZTrklets->GetEntries()!=0 && fhTriggeredTrklets->GetEntries()!=0){
737 fhEff->Fill(count,fhSPDZTrklets->GetEntries()/fhTriggeredTrklets->GetEntries());
738 fhEff->SetBinError(count,fhEff->GetBinContent(count)*TMath::Sqrt(1/fhSPDZTrklets->GetEntries()+1/fhTriggeredTrklets->GetEntries()));
740 fhEff->GetXaxis()->SetBinLabel(count,"SPDZ");
743 if(fhSPD3DTrklets->GetEntries()!=0 && fhTriggeredTrklets->GetEntries()!=0){
744 fhEff->Fill(count,fhSPD3DTrklets->GetEntries()/fhTriggeredTrklets->GetEntries());
745 fhEff->SetBinError(count,fhEff->GetBinContent(count)*TMath::Sqrt(1/fhSPD3DTrklets->GetEntries()+1/fhTriggeredTrklets->GetEntries()));
747 fhEff->GetXaxis()->SetBinLabel(count,"SPD3D");
750 if(fhSPDOverallTrklets->GetEntries()!=0 && fhTriggeredTrklets->GetEntries()!=0){
751 fhEff->Fill(count,fhSPDOverallTrklets->GetEntries()/fhTriggeredTrklets->GetEntries());
752 fhEff->SetBinError(count,fhEff->GetBinContent(count)*TMath::Sqrt(1/fhSPDOverallTrklets->GetEntries()+1/fhTriggeredTrklets->GetEntries()));
754 fhEff->GetXaxis()->SetBinLabel(count,"SPD Overall");
757 if(fhTRKTrklets->GetEntries()!=0 && fhTriggeredTrklets->GetEntries()!=0){
758 fhEff->Fill(count,fhTRKTrklets->GetEntries()/fhTriggeredTrklets->GetEntries());
759 fhEff->SetBinError(count,fhEff->GetBinContent(count)*TMath::Sqrt(1/fhTRKTrklets->GetEntries()+1/fhTriggeredTrklets->GetEntries()));
761 fhEff->GetXaxis()->SetBinLabel(count,"TRK");
764 if(fhTRKcTrklets->GetEntries()!=0 && fhTriggeredTrklets->GetEntries()!=0){
765 fhEff->Fill(count,fhTRKcTrklets->GetEntries()/fhTriggeredTrklets->GetEntries());
766 fhEff->SetBinError(count,fhEff->GetBinContent(count)*TMath::Sqrt(1/fhTRKcTrklets->GetEntries()+1/fhTriggeredTrklets->GetEntries()));
768 fhEff->GetXaxis()->SetBinLabel(count,"TRKc");
771 if(fhTRKncTrklets->GetEntries()!=0 && fhTriggeredTrklets->GetEntries()!=0){
772 fhEff->Fill(count,fhTRKncTrklets->GetEntries()/fhTriggeredTrklets->GetEntries());
773 fhEff->SetBinError(count,fhEff->GetBinContent(count)*TMath::Sqrt(1/fhTRKncTrklets->GetEntries()+1/fhTriggeredTrklets->GetEntries()));
775 fhEff->GetXaxis()->SetBinLabel(count,"TRKnc");
780 TFile* fileEff = new TFile("VtxEff.root","recreate");
781 fhSPDZEffTrklets->Write();
782 fhSPD3DEffTrklets->Write();
783 fhSPDOverallEffTrklets->Write();
784 fhTRKEffTrklets->Write();
785 fhTRKcEffTrklets->Write();
786 fhTRKncEffTrklets->Write();
787 fhSPDEffZreco->Write();
792 /////////////////////////////////////////
796 if (!fNtupleVertexESD){
797 Printf("ERROR: fNtuple not available");
801 fNtupleVertexESD = dynamic_cast<TNtuple*>(fOutput->FindObject("fNtupleVertexESD"));
807 //_________________________________________________________________________
808 AliESDVertex* AliAnalysisTaskVertexESD::ReconstructPrimaryVertexTPC(Bool_t constr) const {
809 // On the fly reco of TPC vertex from ESD
810 AliESDEvent* evt = (AliESDEvent*) fInputEvent;
811 AliVertexerTracks vertexer(evt->GetMagneticField());
812 if(evt->GetNumberOfTracks()<500) {
813 vertexer.SetTPCMode(); // defaults
815 vertexer.SetTPCMode(0.1,1.0,5.0,10,1,3.,0.1,1.5,3.,30.,1,1);// PbPb
817 Float_t diamondcovxy[3]; evt->GetDiamondCovXY(diamondcovxy);
818 Double_t pos[3]={evt->GetDiamondX(),evt->GetDiamondY(),0};
819 Double_t cov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,10.*10.};
820 AliESDVertex *initVertex = new AliESDVertex(pos,cov,1.,1);
821 vertexer.SetVtxStart(initVertex);
823 if(!constr) vertexer.SetConstraintOff();
825 return vertexer.FindPrimaryVertex(evt);
828 //_________________________________________________________________________
829 AliESDVertex* AliAnalysisTaskVertexESD::ReconstructPrimaryVertexITSTPC(Bool_t constr,Int_t mode) const {
830 // On the fly reco of ITS+TPC vertex from ESD
831 // mode=0 use all tracks
832 // mode=1 use odd-number tracks
833 // mode=2 use even-number tracks
835 AliESDEvent* evt = (AliESDEvent*) fInputEvent;
836 AliVertexerTracks vertexer(evt->GetMagneticField());
837 if(evt->GetNumberOfTracks()<500) {
838 vertexer.SetITSMode(); // defaults
839 vertexer.SetMinClusters(3); // default is 5
841 vertexer.SetITSMode(0.1,0.1,0.5,5,1,3.,100.,1000.,3.,30.,1,1);// PbPb
843 //vertexer.SetITSpureSA();
844 Float_t diamondcovxy[3]; evt->GetDiamondCovXY(diamondcovxy);
845 Double_t pos[3]={evt->GetDiamondX(),evt->GetDiamondY(),0};
846 Double_t cov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,10.*10.};
847 AliESDVertex *initVertex = new AliESDVertex(pos,cov,1.,1);
848 vertexer.SetVtxStart(initVertex);
850 if(!constr) vertexer.SetConstraintOff();
852 // use only ITS-TPC or only ITS-SA tracks
853 if(fOnlyITSTPCTracks || fOnlyITSSATracks || mode>0) {
855 Int_t *skip = new Int_t[evt->GetNumberOfTracks()];
856 for(Int_t itr=0;itr<evt->GetNumberOfTracks(); itr++) {
857 AliESDtrack* track = evt->GetTrack(itr);
858 if(fOnlyITSTPCTracks && track->GetNcls(1)==0) { // skip ITSSA
862 if(fOnlyITSSATracks && track->GetNcls(1)>0) { // skip ITSTPC
866 if(mode==1 && itr%2==0) skip[iskip++]=itr;
867 if(mode==2 && itr%2==1) skip[iskip++]=itr;
869 vertexer.SetSkipTracks(iskip,skip);
870 delete [] skip; skip=NULL;
873 return vertexer.FindPrimaryVertex(evt);