1 /**************************************************************************
2 * Copyright(c) 1998-1999, 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 **************************************************************************/
17 ////////////////////////////////////////////////////////////////////////
19 // Task for Heavy Flavour Electron Flow with TPC plus EMCal //
20 // Non-Photonic Electron identified with Invariant mass //
21 // analysis methos in function SelectPhotonicElectron //
24 // Author: Andrea Dubla (Utrecht University) //
27 ////////////////////////////////////////////////////////////////////////
34 #include "THnSparse.h"
35 #include "TLorentzVector.h"
38 #include "AliAnalysisTask.h"
39 #include "AliAnalysisManager.h"
40 #include "AliESDEvent.h"
41 #include "AliESDHandler.h"
42 #include "AliAODEvent.h"
43 #include "AliAODHandler.h"
44 #include "AliAnalysisTaskFlowTPCEMCalQCSP.h"
45 #include "TGeoGlobalMagField.h"
47 #include "AliAnalysisTaskSE.h"
48 #include "TRefArray.h"
50 #include "AliESDInputHandler.h"
51 #include "AliESDpid.h"
52 #include "AliAODInputHandler.h"
53 #include "AliAODPid.h"
54 #include "AliESDtrackCuts.h"
55 #include "AliPhysicsSelection.h"
56 #include "AliCentralitySelectionTask.h"
57 #include "AliESDCaloCluster.h"
58 #include "AliAODCaloCluster.h"
59 #include "AliESDCaloTrigger.h"
60 #include "AliEMCALRecoUtils.h"
61 #include "AliEMCALGeometry.h"
62 #include "AliGeomManager.h"
64 #include "TGeoManager.h"
67 #include "AliEMCALTrack.h"
68 //#include "AliEMCALTracker.h"
70 #include "AliKFParticle.h"
71 #include "AliKFVertex.h"
73 #include "AliPIDResponse.h"
74 #include "AliHFEcontainer.h"
75 #include "AliHFEcuts.h"
76 #include "AliHFEpid.h"
77 #include "AliHFEpidBase.h"
78 #include "AliHFEpidQAmanager.h"
79 #include "AliHFEtools.h"
80 #include "AliCFContainer.h"
81 #include "AliCFManager.h"
82 #include "AliKFParticle.h"
83 #include "AliKFVertex.h"
84 #include "AliCentrality.h"
85 #include "AliVEvent.h"
87 #include "AliMCEvent.h"
89 #include "AliFlowCandidateTrack.h"
90 #include "AliFlowTrackCuts.h"
91 #include "AliFlowEventSimple.h"
92 #include "AliFlowCommonConstants.h"
93 #include "AliFlowEvent.h"
96 #include "AliESDVZERO.h"
97 #include "AliAODVZERO.h"
99 #include "AliPIDResponse.h"
100 #include "AliFlowTrack.h"
101 #include "AliAnalysisTaskVnV0.h"
102 #include "AliSelectNonHFE.h"
105 class AliFlowTrackCuts;
109 ClassImp(AliAnalysisTaskFlowTPCEMCalQCSP)
110 //________________________________________________________________________
111 AliAnalysisTaskFlowTPCEMCalQCSP::AliAnalysisTaskFlowTPCEMCalQCSP(const char *name)
112 : AliAnalysisTaskSE(name)
118 ,fIdentifiedAsOutInz(kFALSE)
119 ,fPassTheEventCut(kFALSE)
123 ,fCutsRP(0) // track cuts for reference particles
124 ,fNullCuts(0) // dummy cuts for flow event tracks
125 ,fFlowEvent(0) //! flow events (one for each inv mass band)
126 ,fkCentralityMethod(0)
145 ,fCentralityNoPass(0)
161 ,fMultCorAfterCuts(0)
168 ,fSparseElectronHadron(0)
170 ,fMultCorBeforeCuts(0)
171 ,fSideBandsFlow(kFALSE)
172 ,fPhiminusPsi(kFALSE)
173 ,fFlowEventCont(0) //! flow events (one for each inv mass band)
175 ,fSparseElectronpurity(0)
178 ,fNonHFE(new AliSelectNonHFE)
185 ,fMultCorAfterCentrBeforeCuts(0)
186 ,fMultCorAfterVZTRKComp(0)
187 ,fCentralityBeforePileup(0)
188 ,fCentralityAfterVZTRK(0)
189 ,fCentralityAfterCorrCut(0)
190 ,fMultCorAfterCorrCut(0)
194 ,fSubEventDPhiv2new(0)
196 ,fHistCentrDistr(0x0)
197 ,fCentralityNoPassForFlattening(0)
198 ,fInvmassLS1highpt(0)
199 ,fInvmassULS1highpt(0)
207 fPID = new AliHFEpid("hfePid");
208 // Define input and output slots here
209 // Input slot #0 works with a TChain
210 DefineInput(0, TChain::Class());
211 // Output slot #0 id reserved by the base class for AOD
212 // Output slot #1 writes into a TH1 container
213 // DefineOutput(1, TH1I::Class());
214 DefineOutput(1, TList::Class());
215 DefineOutput(2, AliFlowEventSimple::Class());
217 DefineOutput(3, AliFlowEventSimple::Class());
219 // DefineOutput(3, TTree::Class());
222 //________________________________________________________________________
223 AliAnalysisTaskFlowTPCEMCalQCSP::AliAnalysisTaskFlowTPCEMCalQCSP()
224 : AliAnalysisTaskSE("DefaultAnalysis_AliAnalysisTaskFlowTPCEMCalQCSP")
230 ,fIdentifiedAsOutInz(kFALSE)
231 ,fPassTheEventCut(kFALSE)
235 ,fCutsRP(0) // track cuts for reference particles
236 ,fNullCuts(0) // dummy cuts for flow event tracks
237 ,fFlowEvent(0) //! flow events (one for each inv mass band)
238 ,fkCentralityMethod(0)
257 ,fCentralityNoPass(0)
273 ,fMultCorAfterCuts(0)
280 ,fSparseElectronHadron(0)
282 ,fMultCorBeforeCuts(0)
283 ,fSideBandsFlow(kFALSE)
284 ,fPhiminusPsi(kFALSE)
285 ,fFlowEventCont(0) //! flow events (one for each inv mass band)
287 ,fSparseElectronpurity(0)
290 ,fNonHFE(new AliSelectNonHFE)
297 ,fMultCorAfterCentrBeforeCuts(0)
298 ,fMultCorAfterVZTRKComp(0)
299 ,fCentralityBeforePileup(0)
300 ,fCentralityAfterVZTRK(0)
301 ,fCentralityAfterCorrCut(0)
302 ,fMultCorAfterCorrCut(0)
306 ,fSubEventDPhiv2new(0)
308 ,fHistCentrDistr(0x0)
309 ,fCentralityNoPassForFlattening(0)
310 ,fInvmassLS1highpt(0)
311 ,fInvmassULS1highpt(0)
317 //Default constructor
318 fPID = new AliHFEpid("hfePid");
320 // Define input and output slots here
321 // Input slot #0 works with a TChain
322 DefineInput(0, TChain::Class());
323 // Output slot #0 id reserved by the base class for AOD
324 // Output slot #1 writes into a TH1 container
325 // DefineOutput(1, TH1I::Class());
326 DefineOutput(1, TList::Class());
327 DefineOutput(2, AliFlowEventSimple::Class());
328 // DefineOutput(3, TTree::Class());
330 DefineOutput(3, AliFlowEventSimple::Class());
332 //DefineOutput(3, TTree::Class());
334 //_________________________________________
336 AliAnalysisTaskFlowTPCEMCalQCSP::~AliAnalysisTaskFlowTPCEMCalQCSP()
345 if (fDCA) delete fNonHFE;
346 if (fOutputList) delete fOutputList;
347 if (fFlowEvent) delete fFlowEvent;
348 if (fFlowEventCont) delete fFlowEventCont;
351 //_________________________________________
353 void AliAnalysisTaskFlowTPCEMCalQCSP::UserExec(Option_t*)
356 //Called for each event
358 // create pointer to event
360 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
363 printf("ERROR: fAOD not available\n");
369 AliError("HFE cuts not available");
373 if(!fPID->IsInitialized())
375 // Initialize PID with the given run number
376 AliWarning("PID not initialised, get from Run no");
377 fPID->InitializePID(fAOD->GetRunNumber());
380 // cout << "kTrigger == " << fTrigger <<endl;
383 if(!(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kCentral) ) return;
386 if(!(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & (AliVEvent::kSemiCentral))) return;
389 if(!(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kEMCEGA) ) return;
392 if(!(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB) ) return;
395 if(!(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & (AliVEvent::kCentral | AliVEvent::kSemiCentral))) return;
399 //---------------CENTRALITY AND EVENT SELECTION-----------------------
400 Int_t fNOtrks = fAOD->GetNumberOfTracks();
402 const AliAODVertex* trkVtx = fAOD->GetPrimaryVertex();
403 if (!trkVtx || trkVtx->GetNContributors()<=0)return;
404 TString vtxTtl = trkVtx->GetTitle();
405 if (!vtxTtl.Contains("VertexerTracks"))return;
406 const AliAODVertex* spdVtx = fAOD->GetPrimaryVertexSPD();
407 if (!spdVtx || spdVtx->GetNContributors()<=0)return;
408 if (TMath::Abs(spdVtx->GetZ() - trkVtx->GetZ())>0.5)return;
409 vtxz = trkVtx->GetZ();
410 if(TMath::Abs(vtxz)>10)return;
413 if(!fCFM->CheckEventCuts(AliHFEcuts::kEventStepReconstructed, fAOD)) return;
414 if(fNOtrks<2) return;
416 Bool_t pass = kFALSE; //to select centrality and pile up protection
417 CheckCentrality(fAOD,pass);
422 PlotVZeroMultiplcities(fAOD);
425 PrepareFlowEvent(fAOD->GetNumberOfTracks(),fFlowEvent); //Calculate event plane Qvector and EP resolution for inclusive
428 PrepareFlowEvent(fAOD->GetNumberOfTracks(),fFlowEventCont); //Calculate event plane Qvector and EP resolution for inclusive
431 AliPIDResponse *pidResponse = fInputHandler->GetPIDResponse();
434 AliDebug(1, "Using default PID Response");
435 pidResponse = AliHFEtools::GetDefaultPID(kFALSE, fInputEvent->IsA() == AliAODEvent::Class());
438 fPID->SetPIDResponse(pidResponse);
439 fCFM->SetRecEventInfo(fAOD);
441 // Look for kink mother
442 Int_t numberofvertices = fAOD->GetNumberOfVertices();
443 Double_t listofmotherkink[numberofvertices];
444 Int_t numberofmotherkink = 0;
445 for(Int_t ivertex=0; ivertex < numberofvertices; ivertex++) {
446 AliAODVertex *aodvertex = fAOD->GetVertex(ivertex);
447 if(!aodvertex) continue;
448 if(aodvertex->GetType()==AliAODVertex::kKink) {
449 AliAODTrack *mother = (AliAODTrack *) aodvertex->GetParent();
450 if(!mother) continue;
451 Int_t idmother = mother->GetID();
452 listofmotherkink[numberofmotherkink] = idmother;
453 //printf("ID %d\n",idmother);
454 numberofmotherkink++;
459 //=============================================V0EP from Alex======================================================================
460 Double_t qxEPa = 0, qyEPa = 0;
461 Double_t qxEPc = 0, qyEPc = 0;
462 Double_t qxEP = 0, qyEP = 0;
464 Double_t evPlAngV0A = fAOD->GetEventplane()->CalculateVZEROEventPlane(fAOD, 8, 2, qxEPa, qyEPa);
465 Double_t evPlAngV0C = fAOD->GetEventplane()->CalculateVZEROEventPlane(fAOD, 9, 2, qxEPc, qyEPc);
466 Double_t evPlAngV0 = fAOD->GetEventplane()->CalculateVZEROEventPlane(fAOD, 10, 2, qxEP, qyEP);
469 Double_t Qx2 = 0, Qy2 = 0;
470 Double_t Qx2p = 0, Qy2p = 0;
471 Double_t Qx2n = 0, Qy2n = 0;
473 for (Int_t iT = 0; iT < fAOD->GetNumberOfTracks(); iT++){
475 AliAODTrack* aodTrack = fAOD->GetTrack(iT);
480 if ((TMath::Abs(aodTrack->Eta()) > 0.8) || (aodTrack->Pt() < 0.2) || (aodTrack->GetTPCNcls() < 70) || (aodTrack->Pt() >= 20.0))
483 if (!aodTrack->TestFilterBit(128))
487 if(aodTrack->Eta()>0 && aodTrack->Eta()<0.8){
489 Qx2p += TMath::Cos(2*aodTrack->Phi());
490 Qy2p += TMath::Sin(2*aodTrack->Phi());
492 if(aodTrack->Eta()<0 && aodTrack->Eta()> -0.8){
494 Qx2n += TMath::Cos(2*aodTrack->Phi());
495 Qy2n += TMath::Sin(2*aodTrack->Phi());
499 Qx2 += TMath::Cos(2*aodTrack->Phi());
500 Qy2 += TMath::Sin(2*aodTrack->Phi());
507 Double_t evPlAngTPC = TMath::ATan2(Qy2, Qx2)/2.;
508 Double_t evPlAngTPCn = TMath::ATan2(Qy2n, Qx2n)/2.;
509 Double_t evPlAngTPCp = TMath::ATan2(Qy2p, Qx2p)/2.;
511 EPVzA->Fill(evPlAngV0A);
512 EPVzC->Fill(evPlAngV0C);
513 EPTPC->Fill(evPlAngTPC);
515 EPTPCn->Fill(evPlAngTPCn);
516 EPTPCp->Fill(evPlAngTPCp);
517 EPVz->Fill(evPlAngV0);
522 fSubEventDPhiv2->Fill(0.5, TMath::Cos(2.*(evPlAngV0A-evPlAngTPC))); // vzeroa - tpc
523 fSubEventDPhiv2->Fill(1.5, TMath::Cos(2.*(evPlAngV0A-evPlAngV0C))); // vzeroa - vzeroc
524 fSubEventDPhiv2->Fill(2.5, TMath::Cos(2.*(evPlAngV0C-evPlAngTPC))); // tpc - vzeroc
527 fSubEventDPhiv2new->Fill(0.5, TMath::Cos(2.*(evPlAngV0-evPlAngTPCp))); // vzero - tpcp
528 fSubEventDPhiv2new->Fill(1.5, TMath::Cos(2.*(evPlAngV0-evPlAngTPCn))); // vzero - tpcn
529 fSubEventDPhiv2new->Fill(2.5, TMath::Cos(2.*(evPlAngTPCp-evPlAngTPCn))); // tpcp - tpcn
534 //====================================================================================================================
537 AliAODTrack *track = NULL;
540 for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++)
542 track = fAOD->GetTrack(iTracks);
545 printf("ERROR: Could not receive track %d\n", iTracks);
549 if(!track->TestFilterMask(AliAODTrack::kTrkGlobalNoDCA)) continue; // TESTBIT FOR AOD double Counting
550 //----------hfe begin---------
551 if(track->Eta()<-0.7 || track->Eta()>0.7) continue; //eta cuts on candidates
553 // RecKine: ITSTPC cuts
554 if(!ProcessCutStep(AliHFEcuts::kStepRecKineITSTPC, track)) continue;
556 // Reject kink mother
557 Bool_t kinkmotherpass = kTRUE;
558 for(Int_t kinkmother = 0; kinkmother < numberofmotherkink; kinkmother++) {
559 if(track->GetID() == listofmotherkink[kinkmother]) {
560 kinkmotherpass = kFALSE;
564 if(!kinkmotherpass) continue;
567 // if(!ProcessCutStep(AliHFEcuts::kStepRecPrim, track)) continue; //deleted for DCA absence
568 // HFEcuts: ITS layers cuts
569 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsITS, track)) continue;
570 // HFE cuts: TPC PID cleanup
571 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTPC, track)) continue;
573 Double_t fClsE = -999, p = -999, fEovP=-999, pt = -999, fTPCnSigma=0;
574 // Track extrapolation
575 Int_t fClsId = track->GetEMCALcluster();
576 if(fClsId < 0) continue;
577 AliAODCaloCluster *cluster = fAOD->GetCaloCluster(fClsId);
578 if(TMath::Abs(cluster->GetTrackDx()) > 0.05 || TMath::Abs(cluster->GetTrackDz()) > 0.05) continue;
580 pt = track->Pt(); //pt track after cuts
581 if(pt<fpTCut) continue;
582 fClsE = cluster->E();
584 // dEdx = track->GetTPCsignal();
586 fTPCnSigma = fPID->GetPIDResponse() ? fPID->GetPIDResponse()->NumberOfSigmasTPC(track, AliPID::kElectron) : 1000;
587 Double_t m20 =cluster->GetM20();
588 Double_t m02 =cluster->GetM02();
589 Double_t disp=cluster->GetDispersion();
590 if(fTPCnSigma >= -1 && fTPCnSigma <= 3)fTrkEovPBef->Fill(pt,fEovP);
591 fTPCnsigma->Fill(p,fTPCnSigma);
592 // fdEdxBef->Fill(p,dEdx);
593 Double_t eta = track->Eta();
594 Double_t phi = track->Phi();
595 //-----------------------Phiminupsi method to remove the contamination-----------------------------------------------
596 //-----------------------fTPCnSigma < -3.5 hadrons will be selected from this region--------------------------
597 Float_t dPhi_aeh = TVector2::Phi_0_2pi(phi - evPlAngV0A);
598 if(dPhi_aeh > TMath::Pi()) dPhi_aeh = dPhi_aeh - TMath::Pi();
599 Float_t dPhi_ceh = TVector2::Phi_0_2pi(phi - evPlAngV0C);
600 if(dPhi_ceh > TMath::Pi()) dPhi_ceh = dPhi_ceh - TMath::Pi();
603 Double_t valueElh[8] = {
612 fSparseElectronHadron->Fill(valueElh);
614 //----------------------------------------------------------------------------------------------------------
615 //---------------------------From here usual electron selection---------------------------------------------
616 //----------------------------------------------------------------------------------------------------------
617 if(m20 < fminM20 || m20 > fmaxM20) continue;
618 if(m02 < fminM02 || m02 > fmaxM02) continue;
619 if(disp > fDispersion ) continue;
620 //---------------------------------for purity---------------------------------------------------------------
622 Double_t valuepurity[3] = {
626 fSparseElectronpurity->Fill(valuepurity);
628 //----------------------------------------------------------------------------------------------------------
629 //----------------------------------------------------------------------------------------------------------
630 if(fTPCnSigma < fminTPC || fTPCnSigma > fmaxTPC) continue; //cuts on nsigma tpc and EoP
631 //===============================Flow Event for Contamination=============================================
633 if(fEovP>0 && fEovP<0.6){
634 AliFlowTrack *sTrackCont = new AliFlowTrack();
635 sTrackCont->Set(track);
636 sTrackCont->SetID(track->GetID());
637 sTrackCont->SetForRPSelection(kTRUE);
638 sTrackCont->SetForPOISelection(kTRUE);
639 sTrackCont->SetMass(2637);
640 for(int iRPs=0; iRPs!=fFlowEventCont->NumberOfTracks(); ++iRPs)
642 // cout << " no of rps " << iRPs << endl;
643 AliFlowTrack *iRPCont = dynamic_cast<AliFlowTrack*>(fFlowEventCont->GetTrack( iRPs ));
644 if (!iRPCont) continue;
645 if (!iRPCont->InRPSelection()) continue;
646 if( sTrackCont->GetID() == iRPCont->GetID())
648 if(fDebug) printf(" was in RP set");
649 // cout << sTrack->GetID() <<" == " << iRP->GetID() << " was in RP set" <<endl;
650 iRPCont->SetForRPSelection(kFALSE);
651 // fFlowEventCont->SetNumberOfRPs(fFlowEventCont->GetNumberOfRPs() - 1);
653 } //end of for loop on RPs
654 fFlowEventCont->InsertTrack(((AliFlowTrack*) sTrackCont));
655 fFlowEventCont->SetNumberOfPOIs(fFlowEventCont->GetNumberOfPOIs()+1);
659 //==========================================================================================================
660 //===============================From here eovP cut is used fro QC, SP and EPV0=============================
661 if(fEovP < fminEovP || fEovP >fmaxEovP) continue;
662 //==========================================================================================================
663 //============================Event Plane Method with V0====================================================
664 Double_t v2PhiV0A = TMath::Cos(2*(phi - evPlAngV0A));
665 Double_t v2PhiV0C = TMath::Cos(2*(phi - evPlAngV0C));
666 Double_t v2Phi[3] = {
672 Double_t v2PhiVz = TMath::Cos(2*(phi - evPlAngV0));
673 Double_t v2PhiV0tot[2] = {
676 fV2Phivzerotot->Fill(v2PhiV0tot);
677 //=========================================================================================================
678 fTPCnsigmaAft->Fill(p,fTPCnSigma);
679 fInclusiveElecPt->Fill(pt);
682 //----------------------Flow of Inclusive Electrons--------------------------------------------------------
683 AliFlowTrack *sTrack = new AliFlowTrack();
685 sTrack->SetID(track->GetID());
686 sTrack->SetForRPSelection(kTRUE);
687 sTrack->SetForPOISelection(kTRUE);
688 sTrack->SetMass(263732);
689 for(int iRPs=0; iRPs!=fFlowEvent->NumberOfTracks(); ++iRPs)
691 // cout << " no of rps " << iRPs << endl;
692 AliFlowTrack *iRP = dynamic_cast<AliFlowTrack*>(fFlowEvent->GetTrack( iRPs ));
694 if (!iRP->InRPSelection()) continue;
695 if( sTrack->GetID() == iRP->GetID())
697 if(fDebug) printf(" was in RP set");
698 // cout << sTrack->GetID() <<" == " << iRP->GetID() << " was in RP set" <<endl;
699 iRP->SetForRPSelection(kFALSE);
700 // fFlowEvent->SetNumberOfRPs(fFlowEvent->GetNumberOfRPs() - 1);
702 } //end of for loop on RPs
703 fFlowEvent->InsertTrack(((AliFlowTrack*) sTrack));
704 fFlowEvent->SetNumberOfPOIs(fFlowEvent->GetNumberOfPOIs()+1);
708 //----------------------Selection of Photonic Electrons DCA-----------------------------
709 fNonHFE = new AliSelectNonHFE();
710 fNonHFE->SetAODanalysis(kTRUE);
711 fNonHFE->SetInvariantMassCut(fInvmassCut);
712 if(fOP_angle) fNonHFE->SetOpeningAngleCut(fOpeningAngleCut);
713 //fNonHFE->SetChi2OverNDFCut(fChi2Cut);
714 //if(fDCAcutFlag) fNonHFE->SetDCACut(fDCAcut);
715 fNonHFE->SetAlgorithm("DCA"); //KF
716 fNonHFE->SetPIDresponse(pidResponse);
717 fNonHFE->SetTrackCuts(-3,3);
719 fNonHFE->SetHistAngleBack(fOpeningAngleLS);
720 fNonHFE->SetHistAngle(fOpeningAngleULS);
721 //fNonHFE->SetHistDCABack(fDCABack);
722 //fNonHFE->SetHistDCA(fDCA);
723 fNonHFE->SetHistMassBack(fInvmassLS1);
724 fNonHFE->SetHistMass(fInvmassULS1);
726 fNonHFE->FindNonHFE(iTracks,track,fAOD);
728 // Int_t *fUlsPartner = fNonHFE->GetPartnersULS();
729 // Int_t *fLsPartner = fNonHFE->GetPartnersLS();
730 // Bool_t fUlsIsPartner = kFALSE;
731 // Bool_t fLsIsPartner = kFALSE;
732 if(fNonHFE->IsULS()){
733 for(Int_t kULS =0; kULS < fNonHFE->GetNULS(); kULS++){
734 fULSElecPt->Fill(track->Pt());
739 for(Int_t kLS =0; kLS < fNonHFE->GetNLS(); kLS++){
740 fLSElecPt->Fill(track->Pt());
746 //----------------------Selection of Photonic Electrons KFParticle-----------------------------
747 Bool_t fFlagPhotonicElec = kFALSE;
748 SelectPhotonicElectron(iTracks,track,fEovP, evPlAngV0, fFlagPhotonicElec);
749 if(fFlagPhotonicElec){fPhotoElecPt->Fill(pt);}
750 // Semi inclusive electron
751 if(!fFlagPhotonicElec){fSemiInclElecPt->Fill(pt);}
758 PostData(1, fOutputList);
759 PostData(2, fFlowEvent);
761 PostData(3, fFlowEventCont);
764 //----------hfe end---------
766 //_________________________________________
767 void AliAnalysisTaskFlowTPCEMCalQCSP::SelectPhotonicElectron(Int_t itrack,const AliAODTrack *track,Double_t fEovP,Double_t evPlAngV0, Bool_t &fFlagPhotonicElec)
769 //Identify non-heavy flavour electrons using Invariant mass method KF
771 Bool_t flagPhotonicElec = kFALSE;
773 for(Int_t jTracks = 0; jTracks<fAOD->GetNumberOfTracks(); jTracks++){
774 AliAODTrack *trackAsso = fAOD->GetTrack(jTracks);
776 printf("ERROR: Could not receive track %d\n", jTracks);
779 // if(!track->TestFilterMask(AliAODTrack::kTrkGlobalNoDCA)) continue; // TESTBIT FOR AOD double Counting
780 if(!trackAsso->TestFilterMask(AliAODTrack::kTrkTPCOnly)) continue;
781 // if((!(trackAsso->GetStatus()&AliESDtrack::kITSrefit) || (!(trackAsso->GetStatus()&AliESDtrack::kTPCrefit)))) continue;
784 if(!(trackAsso->GetStatus()&AliESDtrack::kITSrefit)) continue;
787 if(!(trackAsso->GetStatus()&AliESDtrack::kTPCrefit)) continue;
789 if(jTracks == itrack) continue;
790 Double_t ptAsso=-999., nsigma=-999.0;
791 Double_t mass=-999., width = -999;
792 Bool_t fFlagLS=kFALSE, fFlagULS=kFALSE;
793 Double_t openingAngle = -999.;
794 Double_t ptcutonmasshighpt = track->Pt();
796 ptAsso = trackAsso->Pt();
797 Short_t chargeAsso = trackAsso->Charge();
798 Short_t charge = track->Charge();
800 nsigma = fPID->GetPIDResponse() ? fPID->GetPIDResponse()->NumberOfSigmasTPC(trackAsso, AliPID::kElectron) : 1000;
803 if(trackAsso->GetTPCNcls() < fAssoTPCCluster) continue;
804 if(nsigma < -3 || nsigma > 3) continue;
805 if(trackAsso->Eta()<-0.9 || trackAsso->Eta()>0.9) continue;
806 if(ptAsso <0.3) continue;
808 Int_t fPDGe1 = 11; Int_t fPDGe2 = 11;
809 if(charge>0) fPDGe1 = -11;
810 if(chargeAsso>0) fPDGe2 = -11;
812 if(charge == chargeAsso) fFlagLS = kTRUE;
813 if(charge != chargeAsso) fFlagULS = kTRUE;
815 AliKFParticle::SetField(fAOD->GetMagneticField());
816 AliKFParticle ge1 = AliKFParticle(*track, fPDGe1);
817 AliKFParticle ge2 = AliKFParticle(*trackAsso, fPDGe2);
818 AliKFParticle recg(ge1, ge2);
820 if(recg.GetNDF()<1) continue;
821 Double_t chi2recg = recg.GetChi2()/recg.GetNDF();
822 if(TMath::Sqrt(TMath::Abs(chi2recg))>3.) continue;
823 recg.GetMass(mass,width);
825 openingAngle = ge1.GetAngle(ge2);
826 if(fFlagLS) fOpeningAngleLS->Fill(openingAngle);
827 if(fFlagULS) fOpeningAngleULS->Fill(openingAngle);
828 if(fOP_angle)if(openingAngle > fOpeningAngleCut) continue;
831 if(fFlagLS) fInvmassLS1->Fill(mass);
832 if(fFlagULS) fInvmassULS1->Fill(mass);
835 Double_t MassSparseULS[3] = {
839 fSparseMassULS->Fill(MassSparseULS);
842 Double_t MassSparseLS[3] = {
846 fSparseMassLS->Fill(MassSparseLS);
850 if(ptcutonmasshighpt >= 8.){
851 if(fFlagLS) fInvmassLS1highpt->Fill(mass);
852 if(fFlagULS) fInvmassULS1highpt->Fill(mass);
856 if(mass<fInvmassCut){
857 if(fFlagULS){fULSElecPt->Fill(track->Pt());}
858 if(fFlagLS){fLSElecPt->Fill(track->Pt());}
863 Double_t phi = track->Phi();
864 Float_t DeltaPhi_eEP = TVector2::Phi_0_2pi(phi - evPlAngV0);
865 if(DeltaPhi_eEP > TMath::Pi()) {DeltaPhi_eEP = DeltaPhi_eEP - TMath::Pi();}
868 if(mass<fInvmassCut){
870 Double_t ulsSparse[3] = {
875 fSparsephipsiULS->Fill(ulsSparse);
878 Double_t lsSparse[3] = {
883 fSparsephipsiLS->Fill(lsSparse);
889 if(mass<fInvmassCut && fFlagULS && !flagPhotonicElec){
890 flagPhotonicElec = kTRUE;
893 fFlagPhotonicElec = flagPhotonicElec;
895 //__________________________________________________________________________________
896 void AliAnalysisTaskFlowTPCEMCalQCSP::UserCreateOutputObjects()
900 //----------hfe initialising begin---------
901 fNullCuts = new AliFlowTrackCuts("null_cuts");
903 AliFlowCommonConstants* cc = AliFlowCommonConstants::GetMaster();
904 cc->SetNbinsMult(10000);
906 cc->SetMultMax(10000);
912 cc->SetNbinsPhi(180);
914 cc->SetPhiMax(TMath::TwoPi());
924 //--------Initialize PID
925 fPID->SetHasMCData(kFALSE);
926 if(!fPID->GetNumberOfPIDdetectors())
928 fPID->AddDetector("TPC", 0);
929 fPID->AddDetector("EMCAL", 1);
932 fPID->SortDetectors();
933 fPIDqa = new AliHFEpidQAmanager();
934 fPIDqa->Initialize(fPID);
936 //--------Initialize correction Framework and Cuts
937 fCFM = new AliCFManager;
938 const Int_t kNcutSteps = AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack + AliHFEcuts::kNcutStepsDETrack;
939 fCFM->SetNStepParticle(kNcutSteps);
940 for(Int_t istep = 0; istep < kNcutSteps; istep++)
941 fCFM->SetParticleCutsList(istep, NULL);
944 AliWarning("Cuts not available. Default cuts will be used");
945 fCuts = new AliHFEcuts;
946 fCuts->CreateStandardCuts();
950 fCuts->Initialize(fCFM);
951 //----------hfe initialising end--------
952 //---------Output Tlist
953 fOutputList = new TList();
954 fOutputList->SetOwner();
955 fOutputList->Add(fPIDqa->MakeList("PIDQA"));
957 fNoEvents = new TH1F("fNoEvents","",1,0,1) ;
958 fOutputList->Add(fNoEvents);
960 fTPCnsigma = new TH2F("fTPCnsigma", "TPC - n sigma before HFE pid",1000,0,50,200,-10,10);
961 fOutputList->Add(fTPCnsigma);
963 fTPCnsigmaAft = new TH2F("fTPCnsigmaAft", "TPC - n sigma after HFE pid",1000,0,50,200,-10,10);
964 fOutputList->Add(fTPCnsigmaAft);
966 fTrkEovPBef = new TH2F("fTrkEovPBef","track E/p before HFE pid",1000,0,50,100,0,2);
967 fOutputList->Add(fTrkEovPBef);
969 // fdEdxBef = new TH2F("fdEdxBef","track dEdx vs p before HFE pid",1000,0,50,150,0,150);
970 // fOutputList->Add(fdEdxBef);
972 fInclusiveElecPt = new TH1F("fInclElecPt", "Inclusive electron pt",1000,0,100);
973 fOutputList->Add(fInclusiveElecPt);
975 fPhotoElecPt = new TH1F("fPhotoElecPt", "photonic electron pt",1000,0,100);
976 fOutputList->Add(fPhotoElecPt);
978 fSemiInclElecPt = new TH1F("fSemiInclElecPt", "Semi-inclusive electron pt",1000,0,100);
979 fOutputList->Add(fSemiInclElecPt);
981 fULSElecPt = new TH1F("fULSElecPt", "ULS electron pt",1000,0,100);
982 fOutputList->Add(fULSElecPt);
984 fLSElecPt = new TH1F("fLSElecPt", "LS electron pt",1000,0,100);
985 fOutputList->Add(fLSElecPt);
987 fInvmassLS1 = new TH1F("fInvmassLS1", "Inv mass of LS (e,e); mass(GeV/c^2); counts;", 1000,0,1.0);
988 fOutputList->Add(fInvmassLS1);
990 fInvmassULS1 = new TH1F("fInvmassULS1", "Inv mass of ULS (e,e); mass(GeV/c^2); counts;", 1000,0,1.0);
991 fOutputList->Add(fInvmassULS1);
993 fInvmassLS1highpt = new TH1F("fInvmassLS1highpt", "Inv mass of LS (e,e); mass(GeV/c^2) highpt; counts;", 1000,0,1.0);
994 fOutputList->Add(fInvmassLS1highpt);
996 fInvmassULS1highpt = new TH1F("fInvmassULS1highpt", "Inv mass of ULS (e,e); mass(GeV/c^2) highpt; counts;", 1000,0,1.0);
997 fOutputList->Add(fInvmassULS1highpt);
999 fCentralityPass = new TH1F("fCentralityPass", "Centrality Pass", 101, -1, 100);
1000 fOutputList->Add(fCentralityPass);
1002 fCentralityNoPass = new TH1F("fCentralityNoPass", "Centrality No Pass", 101, -1, 100);
1003 fOutputList->Add(fCentralityNoPass);
1005 fCentralityNoPassForFlattening = new TH1F("fCentralityNoPassForFlattening", "Centrality No Pass for flattening", 101, -1, 100);
1006 fOutputList->Add(fCentralityNoPassForFlattening);
1008 fCentralityBeforePileup = new TH1F("fCentralityBeforePileup", "fCentralityBeforePileup Pass", 101, -1, 100);
1009 fOutputList->Add(fCentralityBeforePileup);
1011 fCentralityAfterVZTRK = new TH1F("fCentralityAfterVZTRK", "fCentralityAfterVZTRK Pass", 101, -1, 100);
1012 fOutputList->Add(fCentralityAfterVZTRK);
1014 fCentralityAfterCorrCut = new TH1F("fCentralityAfterCorrCut", "fCentralityAfterCorrCut Pass", 101, -1, 100);
1015 fOutputList->Add(fCentralityAfterCorrCut);
1017 fPhi = new TH1F("fPhi", "#phi distribution", 100, -.5, 7);
1018 fOutputList->Add(fPhi);
1020 fEta = new TH1F("fEta", "#eta distribution", 100, -1.1, 1.1);
1021 fOutputList->Add(fEta);
1023 fVZEROA = new TH1F("fVZEROA", "VZERO A Multiplicity", 1000, 0, 10000);
1024 fOutputList->Add(fVZEROA);
1026 fVZEROC = new TH1F("fVZEROC", "VZERO C Multiplicity", 1000, 0, 10000);
1027 fOutputList->Add(fVZEROC);
1029 fTPCM = new TH1F("fTPCM", "TPC multiplicity", 1000, 0, 10000);
1030 fOutputList->Add(fTPCM);
1032 fvertex = new TH1D("fvertex", "vertex distribution", 300, -15,15);
1033 fOutputList->Add(fvertex);
1035 fMultCorBeforeCuts = new TH2F("fMultCorBeforeCuts", "TPC vs Global multiplicity (Before cuts); Global multiplicity; TPC multiplicity", 100, 0, 3000, 100, 0, 3000);
1036 fOutputList->Add(fMultCorBeforeCuts);
1038 fMultCorAfterCuts = new TH2F("fMultCorAfterCuts", "TPC vs Global multiplicity (After cuts); Global multiplicity; TPC multiplicity", 100, 0, 3000, 100, 0, 3000);
1039 fOutputList->Add(fMultCorAfterCuts);
1041 fMultCorAfterCentrBeforeCuts = new TH2F("fMultCorAfterCentrBeforeCuts", "TPC vs Global multiplicity (After CC before cuts); Global multiplicity; TPC multiplicity", 100, 0, 3000, 100, 0, 3000);
1042 fOutputList->Add(fMultCorAfterCentrBeforeCuts);
1044 fMultCorAfterVZTRKComp = new TH2F("fMultCorAfterVZTRKComp", "TPC vs Global multiplicity (After V0-TRK); Global multiplicity; TPC multiplicity", 100, 0, 3000, 100, 0, 3000);
1045 fOutputList->Add(fMultCorAfterVZTRKComp);
1047 fMultCorAfterCorrCut = new TH2F("fMultCorAfterCorrCut", "TPC vs Global multiplicity (After CorrCut); Global multiplicity; TPC multiplicity", 100, 0, 3000, 100, 0, 3000);
1048 fOutputList->Add(fMultCorAfterCorrCut);
1050 fMultvsCentr = new TH2F("fMultvsCentr", "Multiplicity vs centrality; centrality; Multiplicity", 100, 0., 100, 100, 0, 3000);
1051 fOutputList->Add(fMultvsCentr);
1053 fOpeningAngleLS = new TH1F("fOpeningAngleLS","Opening angle for LS pairs",100,0,1);
1054 fOutputList->Add(fOpeningAngleLS);
1056 fOpeningAngleULS = new TH1F("fOpeningAngleULS","Opening angle for ULS pairs",100,0,1);
1057 fOutputList->Add(fOpeningAngleULS);
1060 //----------------------------------------------------------------------------
1061 EPVzA = new TH1D("EPVzA", "EPVzA", 80, -2, 2);
1062 fOutputList->Add(EPVzA);
1063 EPVzC = new TH1D("EPVzC", "EPVzC", 80, -2, 2);
1064 fOutputList->Add(EPVzC);
1065 EPTPC = new TH1D("EPTPC", "EPTPC", 80, -2, 2);
1066 fOutputList->Add(EPTPC);
1069 EPVz = new TH1D("EPVz", "EPVz", 80, -2, 2);
1070 fOutputList->Add(EPVz);
1071 EPTPCp = new TH1D("EPTPCp", "EPTPCp", 80, -2, 2);
1072 fOutputList->Add(EPTPCp);
1073 EPTPCn = new TH1D("EPTPCn", "EPTPCn", 80, -2, 2);
1074 fOutputList->Add(EPTPCn);
1076 //----------------------------------------------------------------------------
1077 fSubEventDPhiv2 = new TProfile("fSubEventDPhiv2", "fSubEventDPhiv2", 3, 0, 3);
1078 fSubEventDPhiv2->GetXaxis()->SetBinLabel(1, "<cos(2(#Psi_{a} - #Psi_{b}))>");
1079 fSubEventDPhiv2->GetXaxis()->SetBinLabel(2, "<cos(2(#Psi_{a} - #Psi_{c}>))");
1080 fSubEventDPhiv2->GetXaxis()->SetBinLabel(3, "<cos(2(#Psi_{b} - #Psi_{c}>))");
1081 fOutputList->Add(fSubEventDPhiv2);
1085 fSubEventDPhiv2new = new TProfile("fSubEventDPhiv2new", "fSubEventDPhiv2new", 3, 0, 3);
1086 fSubEventDPhiv2new->GetXaxis()->SetBinLabel(1, "<cos(2(#Psi_{a} - #Psi_{b}))>");
1087 fSubEventDPhiv2new->GetXaxis()->SetBinLabel(2, "<cos(2(#Psi_{a} - #Psi_{c}>))");
1088 fSubEventDPhiv2new->GetXaxis()->SetBinLabel(3, "<cos(2(#Psi_{b} - #Psi_{c}>))");
1089 fOutputList->Add(fSubEventDPhiv2new);
1090 //================================Event Plane with VZERO A & C=====================
1091 const Int_t nPtBins = 12;
1092 Double_t binsPt[nPtBins+1] = {0, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 10, 13};
1094 Int_t bins[3] = { 50, 50, nPtBins};
1095 Double_t xmin[3] = { -1., -1., 0};
1096 Double_t xmax[3] = { 1., 1., 13};
1097 fV2Phi = new THnSparseF("fV2Phi", "v2A:v2C:pt", 3, bins, xmin, xmax);
1098 // Set bin limits for axes which are not standard binned
1099 fV2Phi->SetBinEdges(2, binsPt);
1101 fV2Phi->GetAxis(0)->SetTitle("v_{2} (V0A)");
1102 fV2Phi->GetAxis(1)->SetTitle("v_{2} (V0C)");
1103 fV2Phi->GetAxis(2)->SetTitle("p_{T} (GeV/c)");
1104 fOutputList->Add(fV2Phi);
1108 //================================Event Plane with VZERO=====================
1109 // const Int_t nPtBins = 10;
1110 // Double_t binsPt[nPtBins+1] = {0, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0};
1112 Int_t binsV[2] = { 50, nPtBins};
1113 Double_t xminV[2] = { -1., 0};
1114 Double_t xmaxV[2] = { 1., 13};
1115 fV2Phivzerotot = new THnSparseF("fV2Phivzerotot", "v2:pt", 2, binsV, xminV, xmaxV);
1116 // Set bin limits for axes which are not standard binned
1117 fV2Phivzerotot->SetBinEdges(1, binsPt);
1119 fV2Phivzerotot->GetAxis(0)->SetTitle("v_{2} (V0)");
1120 fV2Phivzerotot->GetAxis(1)->SetTitle("p_{T} (GeV/c)");
1121 fOutputList->Add(fV2Phivzerotot);
1125 //----------------------------------------------------------------------------
1128 Int_t binsvElectH[8]={ 600, 200, 200 ,100, 100, 100, 10, 10}; //pt, E/p,TPCnSigma,M20,M02,Disp Phi-psiV0A ,Phi-PsiV0C,eta (commented)
1129 Double_t xminvElectH[8]={0, 0, -10 , 0, 0, 0, 0, 0};
1130 Double_t xmaxvElectH[8]={20, 2, 10 , 2, 2, 2, TMath::Pi(), TMath::Pi()};
1131 fSparseElectronHadron = new THnSparseD("ElectronHadron","ElectronHadron",8,binsvElectH,xminvElectH,xmaxvElectH);
1132 fSparseElectronHadron->GetAxis(0)->SetTitle("p_{T} (GeV/c)");
1133 fSparseElectronHadron->GetAxis(1)->SetTitle("EovP");
1134 fSparseElectronHadron->GetAxis(2)->SetTitle("TPCnSigma");
1135 fSparseElectronHadron->GetAxis(3)->SetTitle("M20");
1136 fSparseElectronHadron->GetAxis(4)->SetTitle("M02");
1137 fSparseElectronHadron->GetAxis(5)->SetTitle("Disp");
1138 fSparseElectronHadron->GetAxis(6)->SetTitle("phiminuspsi V0A");
1139 fSparseElectronHadron->GetAxis(7)->SetTitle("phiminuspsi V0C");
1140 fOutputList->Add(fSparseElectronHadron);
1142 //----------------------------------------------------------------------------
1143 //----------------------------------------------------------------------------
1145 Int_t binsvpurity[3]={ 600,200, 200}; //pt, E/p,TPCnSigma
1146 Double_t xminvpurity[3]={0, 0, -10};
1147 Double_t xmaxvpurity[3]={30, 2, 10};
1148 fSparseElectronpurity = new THnSparseD("Electronpurity","Electronpurity",3,binsvpurity,xminvpurity,xmaxvpurity);
1149 fSparseElectronpurity->GetAxis(0)->SetTitle("p_{T} (GeV/c)");
1150 fSparseElectronpurity->GetAxis(1)->SetTitle("EovP");
1151 fSparseElectronpurity->GetAxis(2)->SetTitle("TPCnSigma");
1152 fOutputList->Add(fSparseElectronpurity);
1154 //----------------------------------------------------------------------------
1157 Int_t binsphipsi[3] = { 100, 200, 6};
1158 Double_t xminphipsi[3] = { 0., 0, 0};
1159 Double_t xmaxphipsi[3] = { 10., 2, TMath::Pi()};
1160 fSparsephipsiULS = new THnSparseF("fSparsephipsiULS", "pt:eop:DeltaPhiULS", 3, binsphipsi, xminphipsi, xmaxphipsi);
1161 fSparsephipsiULS->GetAxis(0)->SetTitle("pt (Gev/c)");
1162 fSparsephipsiULS->GetAxis(1)->SetTitle("eop");
1163 fSparsephipsiULS->GetAxis(2)->SetTitle("DeltaPhiULS");
1164 fOutputList->Add(fSparsephipsiULS);
1166 fSparsephipsiLS = new THnSparseF("fSparsephipsiLS", "pt:eop:DeltaPhiLS", 3, binsphipsi, xminphipsi, xmaxphipsi);
1167 fSparsephipsiLS->GetAxis(0)->SetTitle("pt (Gev/c)");
1168 fSparsephipsiLS->GetAxis(1)->SetTitle("eop");
1169 fSparsephipsiLS->GetAxis(2)->SetTitle("DeltaPhiLS");
1170 fOutputList->Add(fSparsephipsiLS);
1172 Int_t binsmass[2] = { 100, 200};
1173 Double_t xminmass[2] = { 0., 0};
1174 Double_t xmaxmass[2] = { 10., 1.};
1175 fSparseMassULS = new THnSparseF("fSparseMassULS", "pt:mass (GeV/c^{2})", 2, binsmass, xminmass, xmaxmass);
1176 fSparseMassULS->GetAxis(0)->SetTitle("pt (Gev/c)");
1177 fSparseMassULS->GetAxis(1)->SetTitle("mass");
1178 fOutputList->Add(fSparseMassULS);
1180 fSparseMassLS = new THnSparseF("fSparseMassLS", "pt:mass (GeV/c^{2})", 2, binsmass, xminmass, xmaxmass);
1181 fSparseMassLS->GetAxis(0)->SetTitle("pt (Gev/c)");
1182 fSparseMassLS->GetAxis(1)->SetTitle("mass");
1183 fOutputList->Add(fSparseMassLS);
1187 PostData(1,fOutputList);
1188 // create and post flowevent
1189 fFlowEvent = new AliFlowEvent(10000);
1190 PostData(2, fFlowEvent);
1193 fFlowEventCont = new AliFlowEvent(10000);
1194 PostData(3, fFlowEventCont);
1198 //________________________________________________________________________
1199 void AliAnalysisTaskFlowTPCEMCalQCSP::Terminate(Option_t *)
1201 // Info("Terminate");
1202 AliAnalysisTaskSE::Terminate();
1204 //_____________________________________________________________________________
1205 template <typename T> void AliAnalysisTaskFlowTPCEMCalQCSP::PlotVZeroMultiplcities(const T* event) const
1207 // QA multiplicity plots
1208 fVZEROA->Fill(event->GetVZEROData()->GetMTotV0A());
1209 fVZEROC->Fill(event->GetVZEROData()->GetMTotV0C());
1211 //_____________________________________________________________________________
1212 template <typename T> void AliAnalysisTaskFlowTPCEMCalQCSP::SetNullCuts(T* event)
1215 if (fDebug) cout << " fCutsRP " << fCutsRP << endl;
1216 fCutsRP->SetEvent(event, MCEvent());
1217 fNullCuts->SetParamType(AliFlowTrackCuts::kGlobal);
1218 fNullCuts->SetPtRange(+1, -1); // select nothing QUICK
1219 fNullCuts->SetEtaRange(+1, -1); // select nothing VZERO
1220 fNullCuts->SetEvent(event, MCEvent());
1222 //_____________________________________________________________________________
1223 void AliAnalysisTaskFlowTPCEMCalQCSP::PrepareFlowEvent(Int_t iMulti, AliFlowEvent *FlowEv) const
1225 //Prepare flow events
1226 FlowEv->ClearFast();
1227 FlowEv->Fill(fCutsRP, fNullCuts);
1228 FlowEv->SetReferenceMultiplicity(iMulti);
1229 FlowEv->DefineDeadZone(0, 0, 0, 0);
1230 // FlowEv->TagSubeventsInEta(-0.7, 0, 0, 0.7);
1232 //_____________________________________________________________________________
1233 Bool_t AliAnalysisTaskFlowTPCEMCalQCSP::ProcessCutStep(Int_t cutStep, AliVParticle *track)
1235 // Check single track cuts for a given cut step
1236 const Int_t kMCOffset = AliHFEcuts::kNcutStepsMCTrack;
1237 if(!fCFM->CheckParticleCuts(cutStep + kMCOffset, track)) return kFALSE;
1240 //_________________________________________
1241 void AliAnalysisTaskFlowTPCEMCalQCSP::CheckCentrality(AliAODEvent* event, Bool_t ¢ralitypass)
1243 //============================Multiplicity TPV vs Global===============================================================================
1244 const Int_t nGoodTracks = event->GetNumberOfTracks();
1245 Float_t multTPC(0.); // tpc mult estimate
1246 Float_t multGlob(0.); // global multiplicity
1247 for(Int_t iTracks = 0; iTracks < nGoodTracks; iTracks++) { // fill tpc mult
1248 AliAODTrack* trackAOD = event->GetTrack(iTracks);
1249 if (!trackAOD) continue;
1250 if (!(trackAOD->TestFilterBit(1))) continue;
1251 if ((trackAOD->Pt() < .2) || (trackAOD->Pt() > 5.0) || (TMath::Abs(trackAOD->Eta()) > .8) || (trackAOD->GetTPCNcls() < 70) || (trackAOD->GetDetPid()->GetTPCsignal() < 10.0) || (trackAOD->Chi2perNDF() < 0.2)) continue;
1254 for(Int_t iTracks = 0; iTracks < nGoodTracks; iTracks++) { // fill global mult
1255 AliAODTrack* trackAOD = event->GetTrack(iTracks);
1256 if (!trackAOD) continue;
1257 if (!(trackAOD->TestFilterBit(16))) continue;
1258 if ((trackAOD->Pt() < .2) || (trackAOD->Pt() > 5.0) || (TMath::Abs(trackAOD->Eta()) > .8) || (trackAOD->GetTPCNcls() < 70) || (trackAOD->GetDetPid()->GetTPCsignal() < 10.0) || (trackAOD->Chi2perNDF() < 0.1)) continue;
1259 Double_t b[2] = {-99., -99.};
1260 Double_t bCov[3] = {-99., -99., -99.};
1261 if (!(trackAOD->PropagateToDCA(event->GetPrimaryVertex(), event->GetMagneticField(), 100., b, bCov))) continue;
1262 if ((TMath::Abs(b[0]) > 0.3) || (TMath::Abs(b[1]) > 0.3)) continue;
1265 fMultCorBeforeCuts->Fill(multGlob, multTPC);//before all cuts...even before centrality selectrion
1266 //============================================================================================================================
1267 // Check if event is within the set centrality range. Falls back to V0 centrality determination if no method is set
1268 if (!fkCentralityMethod) AliFatal("No centrality method set! FATAL ERROR!");
1269 fCentrality = event->GetCentrality()->GetCentralityPercentile(fkCentralityMethod);
1270 // cout << "--------------Centrality evaluated-------------------------"<<endl;
1271 if ((fCentrality <= fCentralityMin) || (fCentrality > fCentralityMax))
1273 fCentralityNoPass->Fill(fCentrality);
1274 // cout << "--------------Fill no pass-----"<< fCentrality <<"--------------------"<<endl;
1275 centralitypass = kFALSE;
1278 // cout << "--------------Fill pass----"<< fCentrality <<"---------------------"<<endl;
1279 centralitypass = kTRUE;
1281 if (centralitypass){
1282 fMultCorAfterCentrBeforeCuts->Fill(multGlob, multTPC);
1283 fCentralityBeforePileup->Fill(fCentrality);
1284 }//...after centrality selectrion
1285 //============================================================================================================================
1286 //to remove the bias introduced by multeplicity outliers---------------------
1287 Float_t centTrk = event->GetCentrality()->GetCentralityPercentile("TRK");
1288 Float_t centv0 = event->GetCentrality()->GetCentralityPercentile("V0M");
1289 if (TMath::Abs(centv0 - centTrk) > 5.0){
1290 centralitypass = kFALSE;
1291 fCentralityNoPass->Fill(fCentrality);
1293 if (centralitypass){
1294 fMultCorAfterVZTRKComp->Fill(multGlob, multTPC);
1295 fCentralityAfterVZTRK->Fill(fCentrality);
1296 }//...after centrality selectrion
1297 //============================================================================================================================
1299 if(fTrigger==1 || fTrigger==4){
1300 if(! (multTPC > (-36.73 + 1.48*multGlob) && multTPC < (62.87 + 1.78*multGlob))){
1301 // cout <<" Trigger ==" <<fTrigger<< endl;
1302 centralitypass = kFALSE;
1303 fCentralityNoPass->Fill(fCentrality);
1307 if(! (multTPC > (77.9 + 1.395*multGlob) && multTPC < (187.3 + 1.665*multGlob))){
1308 // cout <<" Trigger ==" <<fTrigger<< endl;
1309 centralitypass = kFALSE;
1310 fCentralityNoPass->Fill(fCentrality);
1314 if (centralitypass){
1315 fMultCorAfterCorrCut->Fill(multGlob, multTPC);
1316 fCentralityAfterCorrCut->Fill(fCentrality);
1317 }//...after CORR CUT
1318 //=================================All cuts are passed==================++++==================================================
1319 //=================================Now Centrality flattening for central trigger==================++++==================================================
1320 if(fTrigger==0 || fTrigger==4){
1321 if(!IsEventSelectedForCentrFlattening(fCentrality)){
1322 centralitypass = kFALSE;
1323 fCentralityNoPassForFlattening->Fill(fCentrality);
1326 //==============================fill histo after all cuts==============================++++==================================================
1328 fCentralityPass->Fill(fCentrality);
1329 fMultCorAfterCuts->Fill(multGlob, multTPC);
1330 fMultvsCentr->Fill(fCentrality, multTPC);
1333 //_____________________________________________________________________________
1334 void AliAnalysisTaskFlowTPCEMCalQCSP::SetCentralityParameters(Double_t CentralityMin, Double_t CentralityMax, const char* CentralityMethod)
1336 // Set a centrality range ]min, max] and define the method to use for centrality selection
1337 fCentralityMin = CentralityMin;
1338 fCentralityMax = CentralityMax;
1339 fkCentralityMethod = CentralityMethod;
1341 //_____________________________________________________________________________
1342 void AliAnalysisTaskFlowTPCEMCalQCSP::SetIDCuts(Double_t minTPC, Double_t maxTPC, Double_t minEovP, Double_t maxEovP, Double_t minM20, Double_t maxM20, Double_t minM02, Double_t maxM02, Double_t Dispersion)
1353 fDispersion = Dispersion;
1355 //_____________________________________________________________________________
1356 //_____________________________________________________________________________
1357 void AliAnalysisTaskFlowTPCEMCalQCSP::SetHistoForCentralityFlattening(TH1F *h,Double_t minCentr,Double_t maxCentr,Double_t centrRef,Int_t switchTRand){
1358 // set the histo for centrality flattening
1359 // the centrality is flatten in the range minCentr,maxCentr
1360 // if centrRef is zero, the minimum in h within (minCentr,maxCentr) defines the reference
1361 // positive, the value of h(centrRef) defines the reference (-> the centrality distribution might be not flat in the whole desired range)
1362 // negative, h(bin with max in range)*centrRef is used to define the reference (-> defines the maximum loss of events, also in this case the distribution might be not flat)
1363 // switchTRand is used to set the unerflow bin of the histo: if it is < -1 in the analysis the random event selection will be done on using TRandom
1365 if(maxCentr<minCentr){
1366 AliWarning("AliAnalysisCheckCorrdist::Wrong centralities values while setting the histogram for centrality flattening");
1369 if(fHistCentrDistr)delete fHistCentrDistr;
1370 fHistCentrDistr=(TH1F*)h->Clone("hCentralityFlat");
1371 fHistCentrDistr->SetTitle("Reference histo for centrality flattening");
1372 Int_t minbin=fHistCentrDistr->FindBin(minCentr*1.00001); // fast if fix bin width
1373 Int_t maxbin=fHistCentrDistr->FindBin(maxCentr*0.9999);
1374 fHistCentrDistr->GetXaxis()->SetRange(minbin,maxbin);
1375 Double_t ref=0.,bincont=0.,binrefwidth=1.;
1377 if(TMath::Abs(centrRef)<0.0001){
1378 binref=fHistCentrDistr->GetMinimumBin();
1379 binrefwidth=fHistCentrDistr->GetBinWidth(binref);
1380 ref=fHistCentrDistr->GetBinContent(binref)/binrefwidth;
1382 else if(centrRef>0.){
1383 binref=h->FindBin(centrRef);
1384 if(binref<1||binref>h->GetNbinsX()){
1385 AliWarning("AliRDHFCuts::Wrong centrality reference value while setting the histogram for centrality flattening");
1387 binrefwidth=fHistCentrDistr->GetBinWidth(binref);
1388 ref=fHistCentrDistr->GetBinContent(binref)/binrefwidth;
1391 if(centrRef<-1) AliWarning("AliRDHFCuts: with this centrality reference no flattening will be applied");
1392 binref=fHistCentrDistr->GetMaximumBin();
1393 binrefwidth=fHistCentrDistr->GetBinWidth(binref);
1394 ref=fHistCentrDistr->GetMaximum()*TMath::Abs(centrRef)/binrefwidth;
1397 for(Int_t j=1;j<=h->GetNbinsX();j++){// Now set the "probabilities"
1398 if(h->GetBinLowEdge(j)*1.0001>=minCentr&&h->GetBinLowEdge(j+1)*0.9999<=maxCentr){
1399 bincont=h->GetBinContent(j);
1400 fHistCentrDistr->SetBinContent(j,ref/bincont*h->GetBinWidth(j));
1401 fHistCentrDistr->SetBinError(j,h->GetBinError(j)*ref/bincont);
1404 h->SetBinContent(j,1.1);// prob > 1 to assure that events will not be rejected
1408 fHistCentrDistr->SetBinContent(0,switchTRand);
1413 //-------------------------------------------------
1414 Bool_t AliAnalysisTaskFlowTPCEMCalQCSP::IsEventSelectedForCentrFlattening(Float_t centvalue){
1416 // Random event selection, based on fHistCentrDistr, to flatten the centrality distribution
1417 // Can be faster if it was required that fHistCentrDistr covers
1418 // exactly the desired centrality range (e.g. part of the lines below should be done during the
1419 // setting of the histo) and TH1::SetMinimum called
1422 if(!fHistCentrDistr) return kTRUE;
1423 // Int_t maxbin=fHistCentrDistr->FindBin(fMaxCentrality*0.9999);
1424 // if(maxbin>fHistCentrDistr->GetNbinsX()){
1425 // AliWarning("AliRDHFCuts: The maximum centrality exceeds the x-axis limit of the histogram for centrality flattening");
1428 Int_t bin=fHistCentrDistr->FindBin(centvalue); // Fast if the histo has a fix bin
1429 Double_t bincont=fHistCentrDistr->GetBinContent(bin);
1430 Double_t centDigits=centvalue-(Int_t)(centvalue*100.)/100.;// this is to extract a random number between 0 and 0.01
1432 if(fHistCentrDistr->GetBinContent(0)<-0.9999){
1433 if(gRandom->Uniform(1.)<bincont)return kTRUE;
1437 if(centDigits*100.<bincont)return kTRUE;
1441 //---------------------------------------------------------------------------