2 /**************************************************************************
3 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
17 //-----------------------------------------------------------------
18 // AliSpectraAODEventCuts class
19 //-----------------------------------------------------------------
30 #include "AliAnalysisTask.h"
31 #include "AliAnalysisManager.h"
32 #include "AliAODTrack.h"
33 #include "AliAODMCParticle.h"
34 #include "AliAODEvent.h"
35 #include "AliAODInputHandler.h"
36 #include "AliAnalysisTaskESDfilter.h"
37 #include "AliAnalysisDataContainer.h"
38 #include "AliESDVZERO.h"
39 #include "AliAODVZERO.h"
40 #include "AliSpectraAODEventCuts.h"
41 #include "AliSpectraAODTrackCuts.h"
46 ClassImp(AliSpectraAODEventCuts)
48 AliSpectraAODEventCuts::AliSpectraAODEventCuts(const char *name) :
49 TNamed(name, "AOD Event Cuts"),
51 fSelectBit(AliVEvent::kMB),
52 fCentralityMethod("V0M"),
58 fCentralityCutMin(0.),
59 fCentralityCutMax(999),
60 fQVectorCutMin(-999.),
64 fMultiplicityCutMin(-999.),
65 fMultiplicityCutMax(99999.),
92 fSplineArrayV0Agen(0),
93 fSplineArrayV0Cgen(0),
102 fOutput->SetName("fOutput");
106 fCalib->SetName("fCalib");
108 fQvecIntList=new TList();
109 fQvecIntList->SetOwner();
110 fQvecIntList->SetName("fQvecIntList");
112 TH1I *fHistoCuts = new TH1I("fHistoCuts", "Event Cuts", kNVtxCuts, -0.5, kNVtxCuts - 0.5);
113 TH1F *fHistoVtxBefSel = new TH1F("fHistoVtxBefSel", "Vtx distr before event selection;z (cm)",500,-15,15);
114 TH1F *fHistoVtxAftSel = new TH1F("fHistoVtxAftSel", "Vtx distr after event selection;z (cm)",500,-15,15);
115 TH1F *fHistoEtaBefSel = new TH1F("fHistoEtaBefSel", "Eta distr before event selection;eta",500,-2,2);
116 TH1F *fHistoEtaAftSel = new TH1F("fHistoEtaAftSel", "Eta distr after event selection;eta",500,-2,2);
117 TH1F *fHistoNChAftSel = new TH1F("fHistoNChAftSel", "NCh distr after event selection;Nch",2000,-0.5,1999.5);
118 TH2F *fHistoQVector = new TH2F("fHistoQVector", "QVector with VZERO distribution;centrality;Q vector from EP task",20,0,100,100,0,10);
119 TH2F *fHistoEP = new TH2F("fHistoEP", "EP with VZERO distribution;centrality;Psi_{EP} from EP task",20,0,100,100,-2,2);
120 TH2F *fPsiACor = new TH2F("fPsiACor", "EP with VZERO A distribution;centrality;Psi_{EP} VZERO-A",20,0,100,100,-2,2);
121 TH2F *fPsiCCor = new TH2F("fPsiCCor", "EP with VZERO C distribution;centrality;Psi_{EP} VZERO-C",20,0,100,100,-2,2);
122 TH2F *fQVecACor = new TH2F("fQVecACor", "QVec VZERO A;centrality;Qvector VZERO-A",20,0,100,100,0,10);
123 TH2F *fQVecCCor = new TH2F("fQVecCCor", "QVec VZERO C;centrality;Qvector VZERO-C",20,0,100,100,0,10);
124 TH2F *fV0M = new TH2F("fV0M", "V0 Multiplicity, before correction;V0 sector",64,-.5,63.5,500,0,1000);
125 TH2F *fV0MCor = new TH2F("fV0MCor", "V0 Multiplicity, after correction;V0 sector",64,-.5,63.5,500,0,1000);
126 TH2F *fV0Mmc = new TH2F("fV0Mmc", "V0 Multiplicity, before correction;V0 sector",64,-.5,63.5,500,0,1000);
128 fSplineArrayV0A = new TObjArray();
129 fSplineArrayV0A->SetOwner();
130 fSplineArrayV0C = new TObjArray();
131 fSplineArrayV0C->SetOwner();
132 fSplineArrayV0Agen = new TObjArray();
133 fSplineArrayV0Agen->SetOwner();
134 fSplineArrayV0Cgen = new TObjArray();
135 fSplineArrayV0Cgen->SetOwner();
137 fOutput->Add(fHistoCuts);
138 fOutput->Add(fHistoVtxBefSel);
139 fOutput->Add(fHistoVtxAftSel);
140 fOutput->Add(fHistoEtaBefSel);
141 fOutput->Add(fHistoEtaAftSel);
142 fOutput->Add(fHistoNChAftSel);
143 fOutput->Add(fHistoQVector);
144 fOutput->Add(fHistoEP);
145 fOutput->Add(fPsiACor);
146 fOutput->Add(fPsiCCor);
147 fOutput->Add(fQVecACor);
148 fOutput->Add(fQVecCCor);
150 fOutput->Add(fV0MCor);
151 fOutput->Add(fV0Mmc);
153 for (Int_t i = 0; i<10; i++){
161 //______________________________________________________
162 Bool_t AliSpectraAODEventCuts::IsSelected(AliAODEvent * aod,AliSpectraAODTrackCuts *trackcuts)
164 // Returns true if Event Cuts are selected and applied
166 fTrackCuts = trackcuts; // FIXME: if track cuts is 0, do not set (use the pre-set member). Do we need to pass this here at all??
167 // FIXME: all those references by name are slow.
168 ((TH1I*)fOutput->FindObject("fHistoCuts"))->Fill(kProcessedEvents);
169 Bool_t IsPhysSel = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fSelectBit);
170 if(!IsPhysSel)return IsPhysSel;
171 ((TH1I*)fOutput->FindObject("fHistoCuts"))->Fill(kPhysSelEvents);
172 //loop on tracks, before event selection, filling QA histos
173 AliAODVertex * vertex = fAOD->GetPrimaryVertex();//FIXME vertex is recreated
174 if(vertex)((TH1F*)fOutput->FindObject("fHistoVtxBefSel"))->Fill(vertex->GetZ());
176 if(CheckVtxRange() && CheckCentralityCut() && CheckMultiplicityCut()){ //selection on vertex and Centrality
177 fIsSelected=CheckQVectorCut(); // QVector is calculated only if the centrality and vertex are correct (performance)
180 ((TH1I*)fOutput->FindObject("fHistoCuts"))->Fill(kAcceptedEvents);
181 if(vertex)((TH1F*)fOutput->FindObject("fHistoVtxAftSel"))->Fill(vertex->GetZ());
184 for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++) {
185 AliAODTrack* track = fAOD->GetTrack(iTracks);
186 if (!fTrackCuts->IsSelected(track,kFALSE)) continue;
187 ((TH1F*)fOutput->FindObject("fHistoEtaBefSel"))->Fill(track->Eta());
189 ((TH1F*)fOutput->FindObject("fHistoEtaAftSel"))->Fill(track->Eta());
194 if(fIsSelected)((TH1F*)fOutput->FindObject("fHistoNChAftSel"))->Fill(Nch);
198 //______________________________________________________
199 Bool_t AliSpectraAODEventCuts::CheckVtxRange()
201 // reject events outside of range
202 AliAODVertex * vertex = fAOD->GetPrimaryVertex();
203 //when moving to 2011 wìone has to add a cut using SPD vertex.
204 //The point is that for events with |z|>20 the vertexer tracks is not working (only 2011!). One has to put a safety cut using SPD vertex large e.g. 15cm
207 ((TH1I*)fOutput->FindObject("fHistoCuts"))->Fill(kVtxNoEvent);
210 if (vertex->GetZ() > fVertexCutMin && vertex->GetZ() < fVertexCutMax)
214 ((TH1I*)fOutput->FindObject("fHistoCuts"))->Fill(kVtxRange);
218 //______________________________________________________
219 Bool_t AliSpectraAODEventCuts::CheckCentralityCut()
221 // Check centrality cut
223 fCent=fAOD->GetCentrality()->GetCentralityPercentile(fCentralityMethod.Data());
224 if ( (fCent <= fCentralityCutMax) && (fCent >= fCentralityCutMin) ) return kTRUE;
225 ((TH1I*)fOutput->FindObject("fHistoCuts"))->Fill(kVtxCentral);
229 //______________________________________________________
230 Bool_t AliSpectraAODEventCuts::CheckMultiplicityCut()
232 // Check multiplicity cut
233 // FIXME: why this is not tracket in the track stats histos?
235 for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++){
236 AliAODTrack* track = fAOD->GetTrack(iTracks);
237 if (!fTrackCuts->IsSelected(track,kFALSE)) continue;
240 if(Ncharged>fMultiplicityCutMin && Ncharged<fMultiplicityCutMax)return kTRUE;
245 //______________________________________________________
246 Bool_t AliSpectraAODEventCuts::CheckQVectorCut()
248 Double_t qVZERO = -999.;
252 qVZERO=CalculateQVectorLHC10h();
255 qVZERO=CalculateQVector();
260 if(qVZERO<fQVectorCutMin || qVZERO>fQVectorCutMax)return kFALSE;
261 Double_t cent=fAOD->GetCentrality()->GetCentralityPercentile(fCentralityMethod.Data());
262 ((TH2F*)fOutput->FindObject("fHistoQVector"))->Fill(cent,qVZERO);
263 ((TH2F*)fOutput->FindObject("fHistoEP"))->Fill(cent,psi);
264 ((TH1I*)fOutput->FindObject("fHistoCuts"))->Fill(kQVector);
270 //______________________________________________________
271 Double_t AliSpectraAODEventCuts::CalculateQVectorLHC10h(){
273 Int_t run = fAOD->GetRunNumber();
275 // Load the calibrations run dependent
276 if(OpenInfoCalbration(run))fRun=run;
285 Double_t Qxa2 = 0, Qya2 = 0;
286 Double_t Qxc2 = 0, Qyc2 = 0;
287 Double_t sumMc = 0, sumMa = 0;
289 AliAODVZERO* aodV0 = fAOD->GetVZEROData();
291 for (Int_t iv0 = 0; iv0 < 64; iv0++) {
293 Double_t phiV0 = TMath::PiOver4()*(0.5 + iv0 % 8);
295 Float_t multv0 = aodV0->GetMultiplicity(iv0);
296 ((TH2F*)fOutput->FindObject("fV0M"))->Fill(iv0,multv0);
300 Double_t multCorC = -10;
303 multCorC = multv0*fV0Cpol1/fMultV0->GetBinContent(iv0+1);
304 else if (iv0 >= 8 && iv0 < 16)
305 multCorC = multv0*fV0Cpol2/fMultV0->GetBinContent(iv0+1);
306 else if (iv0 >= 16 && iv0 < 24)
307 multCorC = multv0*fV0Cpol3/fMultV0->GetBinContent(iv0+1);
308 else if (iv0 >= 24 && iv0 < 32)
309 multCorC = multv0*fV0Cpol4/fMultV0->GetBinContent(iv0+1);
312 cout<<"Problem with multiplicity in V0C"<<endl;
318 Qxc2 += TMath::Cos(2*phiV0) * multCorC;
319 Qyc2 += TMath::Sin(2*phiV0) * multCorC;
322 ((TH2F*)fOutput->FindObject("fV0MCor"))->Fill(iv0,multCorC);
326 Double_t multCorA = -10;
328 if (iv0 >= 32 && iv0 < 40)
329 multCorA = multv0*fV0Apol1/fMultV0->GetBinContent(iv0+1);
330 else if (iv0 >= 40 && iv0 < 48)
331 multCorA = multv0*fV0Apol2/fMultV0->GetBinContent(iv0+1);
332 else if (iv0 >= 48 && iv0 < 56)
333 multCorA = multv0*fV0Apol3/fMultV0->GetBinContent(iv0+1);
334 else if (iv0 >= 56 && iv0 < 64)
335 multCorA = multv0*fV0Apol4/fMultV0->GetBinContent(iv0+1);
338 cout<<"Problem with multiplicity in V0A"<<endl;
344 Qxa2 += TMath::Cos(2*phiV0) * multCorA;
345 Qya2 += TMath::Sin(2*phiV0) * multCorA;
348 ((TH2F*)fOutput->FindObject("fV0MCor"))->Fill(iv0,multCorA);
352 Short_t centrV0 = GetCentrCode(fAOD);
354 Double_t Qxamean2 = 0.;
355 Double_t Qyamean2 = 0.;
356 Double_t Qxcmean2 = 0.;
357 Double_t Qycmean2 = 0.;
360 Qxamean2 = fMeanQxa2[centrV0];
361 Qyamean2 = fMeanQya2[centrV0];
362 Qxcmean2 = fMeanQxc2[centrV0];
363 Qycmean2 = fMeanQyc2[centrV0];
366 Double_t QxaCor2 = Qxa2 - Qxamean2*sumMa;
367 Double_t QyaCor2 = Qya2 - Qyamean2*sumMa;
368 Double_t QxcCor2 = Qxc2 - Qxcmean2*sumMc;
369 Double_t QycCor2 = Qyc2 - Qycmean2*sumMc;
371 fPsiV0A = TMath::ATan2(QyaCor2, QxaCor2)/2.;
372 fPsiV0C = TMath::ATan2(QycCor2, QxcCor2)/2.;
374 ((TH2F*)fOutput->FindObject("fPsiACor"))->Fill((Float_t)fAOD->GetCentrality()->GetCentralityPercentile("V0M"), fPsiV0A);
375 ((TH2F*)fOutput->FindObject("fPsiCCor"))->Fill((Float_t)fAOD->GetCentrality()->GetCentralityPercentile("V0M"), fPsiV0C);
377 fqV0A = TMath::Sqrt((QxaCor2*QxaCor2 + QyaCor2*QyaCor2)/sumMa);
378 fqV0C = TMath::Sqrt((QxcCor2*QxcCor2 + QycCor2*QycCor2)/sumMc);
379 fqV0Ax = QxaCor2*TMath::Sqrt(1./sumMa);
380 fqV0Cx = QxcCor2*TMath::Sqrt(1./sumMc);
381 fqV0Ay = QyaCor2*TMath::Sqrt(1./sumMa);
382 fqV0Cy = QycCor2*TMath::Sqrt(1./sumMc);
384 ((TH2F*)fOutput->FindObject("fQVecACor"))->Fill((Float_t)fAOD->GetCentrality()->GetCentralityPercentile("V0M"), fqV0A);
385 ((TH2F*)fOutput->FindObject("fQVecCCor"))->Fill((Float_t)fAOD->GetCentrality()->GetCentralityPercentile("V0M"), fqV0C);
387 return fqV0A; //FIXME we have to combine VZERO-A and C
390 //______________________________________________________
391 Double_t AliSpectraAODEventCuts::CalculateQVector(){
394 Double_t Qxa2 = 0, Qya2 = 0;
395 Double_t Qxc2 = 0, Qyc2 = 0;
397 AliAODVZERO* aodV0 = fAOD->GetVZEROData();
399 for (Int_t iv0 = 0; iv0 < 64; iv0++) {
401 Float_t multv0 = aodV0->GetMultiplicity(iv0);
403 ((TH2F*)fOutput->FindObject("fV0M"))->Fill(iv0,multv0);
407 fPsiV0A = fAOD->GetEventplane()->CalculateVZEROEventPlane(fAOD,8,2,Qxa2,Qya2); // V0A
408 fPsiV0C = fAOD->GetEventplane()->CalculateVZEROEventPlane(fAOD,9,2,Qxc2,Qyc2); // V0C
410 ((TH2F*)fOutput->FindObject("fPsiACor"))->Fill((Float_t)fAOD->GetCentrality()->GetCentralityPercentile("V0M"), fPsiV0A);
411 ((TH2F*)fOutput->FindObject("fPsiCCor"))->Fill((Float_t)fAOD->GetCentrality()->GetCentralityPercentile("V0M"), fPsiV0C);
413 fqV0A = TMath::Sqrt((Qxa2*Qxa2 + Qya2*Qya2));
414 fqV0C = TMath::Sqrt((Qxc2*Qxc2 + Qyc2*Qyc2));
420 ((TH2F*)fOutput->FindObject("fQVecACor"))->Fill((Float_t)fAOD->GetCentrality()->GetCentralityPercentile("V0M"), fqV0A);
421 ((TH2F*)fOutput->FindObject("fQVecCCor"))->Fill((Float_t)fAOD->GetCentrality()->GetCentralityPercentile("V0M"), fqV0C);
423 return fqV0A; //FIXME we have to combine VZERO-A and C
427 //______________________________________________________
428 Short_t AliSpectraAODEventCuts::GetCentrCode(AliVEvent* ev)
431 Short_t centrCode = -1;
433 AliCentrality* centrality = 0;
434 AliAODEvent* aod = (AliAODEvent*)ev;
435 centrality = aod->GetHeader()->GetCentralityP();
437 Float_t centV0 = centrality->GetCentralityPercentile("V0M");
438 Float_t centTrk = centrality->GetCentralityPercentile("TRK");
441 if (TMath::Abs(centV0 - centTrk) < 5.0 && centV0 <= 80 && centV0 > 0){
443 if ((centV0 > 0) && (centV0 <= 5.0))
445 else if ((centV0 > 5.0) && (centV0 <= 10.0))
447 else if ((centV0 > 10.0) && (centV0 <= 20.0))
449 else if ((centV0 > 20.0) && (centV0 <= 30.0))
451 else if ((centV0 > 30.0) && (centV0 <= 40.0))
453 else if ((centV0 > 40.0) && (centV0 <= 50.0))
455 else if ((centV0 > 50.0) && (centV0 <= 60.0))
457 else if ((centV0 > 60.0) && (centV0 <= 70.0))
459 else if ((centV0 > 70.0) && (centV0 <= 80.0))
467 //______________________________________________________
468 void AliSpectraAODEventCuts::PrintCuts()
470 // print info about event cuts
471 cout << "Event Stats" << endl;
472 cout << " > Trigger Selection: " << fSelectBit << endl;
473 cout << " > Centrality estimator: " << fCentralityMethod << endl;
474 cout << " > Number of accepted events: " << NumberOfEvents() << endl;
475 cout << " > Number of processed events: " << NumberOfProcessedEvents() << endl;
476 cout << " > Number of PhysSel events: " << NumberOfPhysSelEvents() << endl;
477 cout << " > Vertex out of range: " << ((TH1I*)fOutput->FindObject("fHistoCuts"))->GetBinContent(kVtxRange + 1) << endl;
478 cout << " > Events cut by centrality: " << ((TH1I*)fOutput->FindObject("fHistoCuts"))->GetBinContent(kVtxCentral + 1) << endl;
479 cout << " > Events without vertex: " << ((TH1I*)fOutput->FindObject("fHistoCuts"))->GetBinContent(kVtxNoEvent + 1) << endl;
480 cout << " > QVector cut: " << ((TH1I*)fOutput->FindObject("fHistoCuts"))->GetBinContent(kQVector + 1) << endl;
481 cout << " > Track type used for the QVector calculation: " << fTrackBits << endl;
482 cout << " > QRange: [" << fQVectorCutMin <<"," <<fQVectorCutMax<<"]"<< endl;
483 cout << " > Vertex: [" << fVertexCutMin <<"," <<fVertexCutMax<<"]"<< endl;
484 cout << " > Multiplicity: [" << fMultiplicityCutMin <<"," <<fMultiplicityCutMax<<"]"<< endl;
485 cout << " > Centrality: [" << fCentralityCutMin <<"," <<fCentralityCutMax<<"]"<< endl;
488 //_____________________________________________________________________________
489 Bool_t AliSpectraAODEventCuts::OpenInfoCalbration(Int_t run)
492 AliOADBContainer* cont = (AliOADBContainer*) fCalib->FindObject("hMultV0BefCorr");
494 printf("OADB object hMultV0BefCorr is not available in the file\n");
498 if(!(cont->GetObject(run))){
499 printf("OADB object hMultV0BefCorr is not available for run %i\n",run);
502 fMultV0 = ((TH2F*) cont->GetObject(run))->ProfileX();
504 TF1* fpolc1 = new TF1("fpolc1","pol0", 0, 7);
505 fMultV0->Fit(fpolc1, "RN");
506 fV0Cpol1 = fpolc1->GetParameter(0);
508 TF1* fpolc2 = new TF1("fpolc2","pol0", 8, 15);
509 fMultV0->Fit(fpolc2, "RN");
510 fV0Cpol2 = fpolc2->GetParameter(0);
512 TF1* fpolc3 = new TF1("fpolc3","pol0", 16, 23);
513 fMultV0->Fit(fpolc3, "RN");
514 fV0Cpol3 = fpolc3->GetParameter(0);
516 TF1* fpolc4 = new TF1("fpolc4","pol0", 24, 31);
517 fMultV0->Fit(fpolc4, "RN");
518 fV0Cpol4 = fpolc4->GetParameter(0);
520 TF1* fpola1 = new TF1("fpola1","pol0", 32, 39);
521 fMultV0->Fit(fpola1, "RN");
522 fV0Apol1 = fpola1->GetParameter(0);
524 TF1* fpola2 = new TF1("fpola2","pol0", 40, 47);
525 fMultV0->Fit(fpola2, "RN");
526 fV0Apol2 = fpola2->GetParameter(0);
528 TF1* fpola3 = new TF1("fpola3","pol0", 48, 55);
529 fMultV0->Fit(fpola3, "RN");
530 fV0Apol3 = fpola3->GetParameter(0);
532 TF1* fpola4 = new TF1("fpola4","pol0", 56, 63);
533 fMultV0->Fit(fpola4, "RN");
534 fV0Apol4 = fpola4->GetParameter(0);
536 for(Int_t i=0; i < 10; i++){
539 snprintf(nameQxa2,100, "hQxa2m_%i", i);
542 snprintf(nameQya2,100, "hQya2m_%i", i);
545 snprintf(nameQxc2,100, "hQxc2m_%i", i);
548 snprintf(nameQyc2,100, "hQyc2m_%i", i);
550 AliOADBContainer* contQxa2 = (AliOADBContainer*) fCalib->FindObject(nameQxa2);
552 printf("OADB object %s is not available in the file\n", nameQxa2);
556 if(!(contQxa2->GetObject(run))){
557 printf("OADB object %s is not available for run %i\n", nameQxa2, run);
561 fMeanQxa2[i] = ((TH1F*) contQxa2->GetObject(run))->GetMean();
564 AliOADBContainer* contQya2 = (AliOADBContainer*) fCalib->FindObject(nameQya2);
566 printf("OADB object %s is not available in the file\n", nameQya2);
570 if(!(contQya2->GetObject(run))){
571 printf("OADB object %s is not available for run %i\n", nameQya2, run);
575 fMeanQya2[i] = ((TH1F*) contQya2->GetObject(run))->GetMean();
578 AliOADBContainer* contQxc2 = (AliOADBContainer*) fCalib->FindObject(nameQxc2);
580 printf("OADB object %s is not available in the file\n", nameQxc2);
584 if(!(contQxc2->GetObject(run))){
585 printf("OADB object %s is not available for run %i\n", nameQxc2, run);
589 fMeanQxc2[i] = ((TH1F*) contQxc2->GetObject(run))->GetMean();
592 AliOADBContainer* contQyc2 = (AliOADBContainer*) fCalib->FindObject(nameQyc2);
594 printf("OADB object %s is not available in the file\n", nameQyc2);
598 if(!(contQyc2->GetObject(run))){
599 printf("OADB object %s is not available for run %i\n", nameQyc2, run);
603 fMeanQyc2[i] = ((TH1F*) contQyc2->GetObject(run))->GetMean();
609 //______________________________________________________
612 Long64_t AliSpectraAODEventCuts::Merge(TCollection* list)
614 // Merge a list of AliSpectraAODEventCuts objects with this.
615 // Returns the number of merged objects (including this).
625 TIterator* iter = list->MakeIterator();
628 // collections of all histograms
633 while ((obj = iter->Next())) {
634 AliSpectraAODEventCuts* entry = dynamic_cast<AliSpectraAODEventCuts*> (obj);
638 TList * l = entry->GetOutputList();
643 fOutput->Merge(&collections);
650 //______________________________________________________
651 Double_t AliSpectraAODEventCuts::GetQvecPercentile(Int_t v0side){
653 //check Qvec and Centrality consistency
654 if(fCent>90.) return -999.;
655 if(v0side==0/*V0A*/){ if(fqV0A== -999.) return -999.; }
656 if(v0side==1/*V0C*/){ if(fqV0C== -999.) return -999.; }
660 if(v0side==0/*V0A*/){ fQvecIntegral = (TH2D*)fQvecIntList->FindObject("VZEROA"); }
661 if(v0side==1/*V0C*/){ fQvecIntegral = (TH2D*)fQvecIntList->FindObject("VZEROC"); }
666 if(fQvecCalibType==1){
667 if(fNch<0.) return -999.;
668 ic = GetNchBin(fQvecIntegral);
669 } else ic = (Int_t)fCent; //fQvecIntegral: 1% centrality bin
671 TH1D *h1D = (TH1D*)fQvecIntegral->ProjectionY("h1D",ic+1,ic+1);
673 TSpline *spline = 0x0;
675 if(v0side==0/*V0A*/){
676 if( CheckSplineArray(fSplineArrayV0A, ic) ) {
677 spline = (TSpline*)fSplineArrayV0A->At(ic);
678 //cout<<"Qvec V0A - ic: "<<ic<<" - Found TSpline..."<<endl;
680 spline = new TSpline3(h1D,"sp3");
681 fSplineArrayV0A->AddAtAndExpand(spline,ic);
682 //cout<<"Qvec V0A - ic: "<<ic<<" - TSpline not found. Creating..."<<endl;
685 else if(v0side==1/*V0C*/){
686 if( CheckSplineArray(fSplineArrayV0C, ic) ) {
687 spline = (TSpline*)fSplineArrayV0C->At(ic);
689 spline = new TSpline3(h1D,"sp3");
690 fSplineArrayV0C->AddAtAndExpand(spline,ic);
694 Double_t percentile = -999.;
695 if(v0side==0/*V0A*/){ percentile = 100*spline->Eval(fqV0A); }
696 if(v0side==1/*V0C*/){ percentile = 100*spline->Eval(fqV0C); }
698 if(percentile>100. || percentile<0.) return -999.;
703 //______________________________________________________
704 Double_t AliSpectraAODEventCuts::CalculateQVectorMC(Int_t v0side, Int_t type=1){
706 if(!fIsMC) return -999.;
711 fV0Aeff = (TH1F*)fQvecIntList->FindObject("vzeroa_efficiency_prim_plus_sec_over_gen");
712 if(!fV0Aeff) return -999.;
716 TClonesArray *arrayMC = (TClonesArray*) fAOD->GetList()->FindObject(AliAODMCParticle::StdBranchName());
718 if (!arrayMC) AliFatal("Error: MC particles branch not found!\n");
720 Double_t Qx2mc = 0., Qy2mc = 0.;
721 Double_t mult2mc = 0;
723 Int_t nMC = arrayMC->GetEntries();
725 if(type==0){ // type==0: q-vec from tracks in vzero acceptance
728 for (Int_t iMC = 0; iMC < nMC; iMC++){
729 AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(iMC);
730 if(!partMC->Charge()) continue;//Skip neutrals
733 if( CheckVZEROacceptance(partMC->Eta()) != v0side ) continue;
735 // Calculate Qvec components
736 Qx2mc += TMath::Cos(2.*partMC->Phi());
737 Qy2mc += TMath::Sin(2.*partMC->Phi());
740 }// end loop on generated.
744 else if(type==1){ // type==1 (default): q-vec from vzero
746 // only used in qgen_vzero
747 Double_t multv0mc[64];
748 for(Int_t iCh=0;iCh<64;iCh++) multv0mc[iCh]=0; // initialize multv0mc to zero
751 for (Int_t iMC = 0; iMC < nMC; iMC++){
753 AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(iMC);
754 if(!partMC->Charge()) continue;//Skip neutrals
757 if( CheckVZEROacceptance(partMC->Eta()) != v0side ) continue;
759 //get v0 channel of gen track
760 Int_t iv0 = CheckVZEROchannel(v0side, partMC->Eta(), partMC->Phi());
762 //use the efficiecy as a weigth
763 multv0mc[iv0] += fV0Aeff->GetFunction("f")->Eval(partMC->Pt());
765 //calculate multiplicity for each vzero channell
768 }// end loop on generated.
770 Int_t firstCh=-1,lastCh=-1;
775 else if (v0side == 1) {
779 for(Int_t iCh = firstCh; iCh < lastCh; ++iCh) {
780 Double_t phi = TMath::Pi()/8. + TMath::Pi()/4.*(iCh%8);
781 Double_t mult = multv0mc[iCh];
782 Qx2mc += mult*TMath::Cos(2*phi);
783 Qy2mc += mult*TMath::Sin(2*phi);
786 ((TH2F*)fOutput->FindObject("fV0Mmc"))->Fill(iCh,multv0mc[iCh]);
792 fQvecMC = TMath::Sqrt((Qx2mc*Qx2mc + Qy2mc*Qy2mc)/mult2mc);
798 //______________________________________________________
799 Int_t AliSpectraAODEventCuts::CheckVZEROchannel(Int_t vzeroside, Double_t eta, Double_t phi){
801 //VZEROA eta acceptance
804 if ( vzeroside == 0){
805 if (eta > 4.5 && eta <= 5.1 ) ring = 0;
806 if (eta > 3.9 && eta <= 4.5 ) ring = 1;
807 if (eta > 3.4 && eta <= 3.9 ) ring = 2;
808 if (eta > 2.8 && eta <= 3.4 ) ring = 3;
809 } else if (vzeroside == 1){
810 if (eta > -3.7 && eta <= -3.2 ) ring = 0;
811 if (eta > -3.2 && eta <= -2.7 ) ring = 1;
812 if (eta > -2.7 && eta <= -2.2 ) ring = 2;
813 if (eta > -2.2 && eta <= -1.7 ) ring = 3;
817 //VZEROAC phi acceptance
821 if ( phi > 0. && phi <= TMath::Pi()/4. ) phisector = 0;
823 else if (phi > TMath::Pi()/4. && phi <= TMath::Pi()/2.) phisector = 1;
825 else if (phi > TMath::Pi()/2 && phi <= (3./4.)*TMath::Pi() ) phisector =2;
827 else if (phi > (3./4.)*TMath::Pi() && phi <= TMath::Pi() ) phisector = 3;
829 else if (phi > TMath::Pi() && phi <= (5./4.)*TMath::Pi() ) phisector = 4;
831 else if (phi > (5./4.)*TMath::Pi() && phi <= (3./2.)*TMath::Pi() ) phisector = 5;
833 else if (phi > (3./2.)*TMath::Pi() && phi <= (7./4.)*TMath::Pi() ) phisector = 6;
835 else if (phi > (7./4.)*TMath::Pi() && phi <= TMath::TwoPi() ) phisector = 7;
837 if (vzeroside ==0) return Int_t(32+(phisector+(ring*8.))); // iv0 >= 32 -> V0A
838 if (vzeroside ==1) return Int_t(phisector+(ring*8.)); // iv0 < 32 -> V0C
843 //______________________________________________________
844 Int_t AliSpectraAODEventCuts::CheckVZEROacceptance(Double_t eta){
846 // eval VZERO side - FIXME Add TPC!
848 if(eta > 2.8 && eta < 5.1) return 0; //VZEROA
850 else if (eta > -3.7 && eta < -1.7) return 1; //VZEROC
856 //______________________________________________________
857 Double_t AliSpectraAODEventCuts::GetQvecPercentileMC(Int_t v0side, Int_t type=1){
859 //check Qvec and Centrality consistency
860 if(fCent>90.) return -999.;
862 Double_t qvec = CalculateQVectorMC(v0side, type);
863 if(qvec==-999.) return -999.;
868 if(v0side==0/*V0A*/){ fQgenIntegral = (TH2D*)fQvecIntList->FindObject("VZEROAgen"); }
869 if(v0side==1/*V0C*/){ fQgenIntegral = (TH2D*)fQvecIntList->FindObject("VZEROCgen"); }
871 if(v0side==0/*V0A*/){ fQgenIntegral = (TH2D*)fQvecIntList->FindObject("VZEROAgen_vzero"); }
872 if(v0side==1/*V0C*/){ fQgenIntegral = (TH2D*)fQvecIntList->FindObject("VZEROCgen_vzero"); }
876 //FIXME you need a check on the TH2D, add AliFatal or a return.
880 if(fQvecCalibType==1){
881 if(fNch<0.) return -999.;
882 ic = GetNchBin(fQgenIntegral);
883 } else ic = (Int_t)fCent; //fQvecIntegral: 1% centrality bin
885 TH1D *h1D = (TH1D*)fQgenIntegral->ProjectionY("h1Dgen",ic+1,ic+1);
887 TSpline *spline = 0x0;
889 if(v0side==0/*V0A*/){
890 if( CheckSplineArray(fSplineArrayV0Agen, ic) ) {
891 spline = (TSpline*)fSplineArrayV0Agen->At(ic);
892 //cout<<"Qvec V0A - ic: "<<ic<<" - Found TSpline..."<<endl;
894 spline = new TSpline3(h1D,"sp3");
895 fSplineArrayV0Agen->AddAtAndExpand(spline,ic);
898 else if(v0side==1/*V0C*/){
899 if( CheckSplineArray(fSplineArrayV0Cgen, ic) ) {
900 spline = (TSpline*)fSplineArrayV0Cgen->At(ic);
902 spline = new TSpline3(h1D,"sp3");
903 fSplineArrayV0Cgen->AddAtAndExpand(spline,ic);
907 Double_t percentile = 100*spline->Eval(qvec);
909 if(percentile>100. || percentile<0.) return -999.;
915 //______________________________________________________
916 Bool_t AliSpectraAODEventCuts::CheckSplineArray(TObjArray * splarr, Int_t n){
917 //check TSpline array consistency
919 // Int_t n = (Int_t)fCent; //FIXME should be ok for icentr and nch
921 if(splarr->GetSize()<n) return kFALSE;
923 if(!splarr->At(n)) return kFALSE;
929 //______________________________________________________
930 Int_t AliSpectraAODEventCuts::GetNchBin(TH2D * h){
932 Double_t xmax = h->GetXaxis()->GetXmax();
934 if(fNch>xmax) return (Int_t)h->GetNbinsX();
936 return (fNch*h->GetNbinsX())/h->GetXaxis()->GetXmax();