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 for HF corrections as a function of many variables
18 // 6 Steps introduced: MC, MC Acc, Reco, Reco Acc, Reco Acc + ITS Cl,
19 // Reco Acc + ITS Cl + PPR cuts
20 // 12 variables used: pt, y, cosThetaStar, ptPi, ptK, ct,
21 // dca, d0Pi, d0K, d0Pixd0K, cosPointingAngle, phi
23 //-----------------------------------------------------------------------
24 // Author : C. Zampolli, CERN
25 // D. Caffarri, Univ & INFN Padova caffarri@pd.infn.it
26 //-----------------------------------------------------------------------
27 //-----------------------------------------------------------------------
28 // Base class for HF Unfolding (pt and eta)
29 // correlation matrix filled at Acceptance and PPR level
30 // Author: A.Grelli , Utrecht - agrelli@uu.nl
31 //-----------------------------------------------------------------------
33 #include <TParticle.h>
34 #include <TDatabasePDG.h>
39 #include "AliCFTaskVertexingHF.h"
41 #include "AliMCEvent.h"
42 #include "AliCFManager.h"
43 #include "AliCFContainer.h"
45 #include "AliAnalysisManager.h"
46 #include "AliAODHandler.h"
47 #include "AliAODEvent.h"
48 #include "AliAODRecoDecay.h"
49 #include "AliAODRecoDecayHF.h"
50 #include "AliAODRecoDecayHF2Prong.h"
51 #include "AliAODRecoDecayHF3Prong.h"
52 #include "AliAODRecoDecayHF4Prong.h"
53 #include "AliAODRecoCascadeHF.h"
54 #include "AliAODMCParticle.h"
55 #include "AliAODMCHeader.h"
56 #include "AliESDtrack.h"
58 #include "THnSparse.h"
60 #include "AliESDtrackCuts.h"
61 #include "AliRDHFCuts.h"
62 #include "AliRDHFCutsD0toKpi.h"
63 #include "AliRDHFCutsDplustoKpipi.h"
64 #include "AliRDHFCutsDStartoKpipi.h"
65 #include "AliRDHFCutsDstoKKpi.h"
66 #include "AliRDHFCutsLctopKpi.h"
67 #include "AliRDHFCutsD0toKpipipi.h"
68 #include "AliCFVertexingHF2Prong.h"
69 #include "AliCFVertexingHF3Prong.h"
70 #include "AliCFVertexingHFCascade.h"
71 #include "AliCFVertexingHF.h"
72 #include "AliAnalysisDataSlot.h"
73 #include "AliAnalysisDataContainer.h"
75 //__________________________________________________________________________
76 AliCFTaskVertexingHF::AliCFTaskVertexingHF() :
79 fHistEventsProcessed(0x0),
87 fCountRecoITSClusters(0),
92 fFillFromGenerated(kFALSE),
94 fAcceptanceUnf(kTRUE),
102 fCentralitySelection(kTRUE),
104 fRejectIfNoQuark(kTRUE),
111 //___________________________________________________________________________
112 AliCFTaskVertexingHF::AliCFTaskVertexingHF(const Char_t* name, AliRDHFCuts* cuts) :
113 AliAnalysisTaskSE(name),
115 fHistEventsProcessed(0x0),
123 fCountRecoITSClusters(0),
128 fFillFromGenerated(kFALSE),
129 fOriginDselection(0),
130 fAcceptanceUnf(kTRUE),
138 fCentralitySelection(kTRUE),
140 fRejectIfNoQuark(kTRUE),
144 // Constructor. Initialization of Inputs and Outputs
147 DefineInput(0) and DefineOutput(0)
148 are taken care of by AliAnalysisTaskSE constructor
150 DefineOutput(1,TH1I::Class());
151 DefineOutput(2,AliCFContainer::Class());
152 DefineOutput(3,THnSparseD::Class());
153 DefineOutput(4,AliRDHFCuts::Class());
158 //___________________________________________________________________________
159 AliCFTaskVertexingHF& AliCFTaskVertexingHF::operator=(const AliCFTaskVertexingHF& c)
162 // Assignment operator
165 AliAnalysisTaskSE::operator=(c) ;
166 fCFManager = c.fCFManager;
167 fHistEventsProcessed = c.fHistEventsProcessed;
173 //___________________________________________________________________________
174 AliCFTaskVertexingHF::AliCFTaskVertexingHF(const AliCFTaskVertexingHF& c) :
175 AliAnalysisTaskSE(c),
176 fCFManager(c.fCFManager),
177 fHistEventsProcessed(c.fHistEventsProcessed),
178 fCorrelation(c.fCorrelation),
179 fCountMC(c.fCountMC),
180 fCountAcc(c.fCountAcc),
181 fCountVertex(c.fCountVertex),
182 fCountRefit(c.fCountRefit),
183 fCountReco(c.fCountReco),
184 fCountRecoAcc(c.fCountRecoAcc),
185 fCountRecoITSClusters(c.fCountRecoITSClusters),
186 fCountRecoPPR(c.fCountRecoPPR),
187 fCountRecoPID(c.fCountRecoPID),
189 fDecayChannel(c.fDecayChannel),
190 fFillFromGenerated(c.fFillFromGenerated),
191 fOriginDselection(c.fOriginDselection),
192 fAcceptanceUnf(c.fAcceptanceUnf),
194 fUseWeight(c.fUseWeight),
197 fPartName(c.fPartName),
198 fDauNames(c.fDauNames),
200 fCentralitySelection(c.fCentralitySelection),
201 fFakeSelection(c.fFakeSelection),
202 fRejectIfNoQuark(c.fRejectIfNoQuark),
203 fUseMCVertex(c.fUseMCVertex)
210 //___________________________________________________________________________
211 AliCFTaskVertexingHF::~AliCFTaskVertexingHF()
216 if (fCFManager) delete fCFManager ;
217 if (fHistEventsProcessed) delete fHistEventsProcessed ;
218 if (fCorrelation) delete fCorrelation ;
219 if (fCuts) delete fCuts;
222 //_________________________________________________________________________-
223 void AliCFTaskVertexingHF::Init()
229 if (fDebug>1) printf("AliCFTaskVertexingHF::Init()");
230 AliRDHFCuts *copyfCuts = 0x0;
232 AliFatal("No cuts defined - Exiting...");
236 switch (fDecayChannel){
238 copyfCuts = new AliRDHFCutsD0toKpi(*(static_cast<AliRDHFCutsD0toKpi*>(fCuts)));
245 copyfCuts = new AliRDHFCutsDStartoKpipi(*(static_cast<AliRDHFCutsDStartoKpipi*>(fCuts)));
252 copyfCuts = new AliRDHFCutsDplustoKpipi(*(static_cast<AliRDHFCutsDplustoKpipi*>(fCuts)));
259 copyfCuts = new AliRDHFCutsLctopKpi(*(static_cast<AliRDHFCutsLctopKpi*>(fCuts)));
266 copyfCuts = new AliRDHFCutsDstoKKpi(*(static_cast<AliRDHFCutsDstoKKpi*>(fCuts)));
273 copyfCuts = new AliRDHFCutsD0toKpipipi(*(static_cast<AliRDHFCutsD0toKpipipi*>(fCuts)));
276 fDauNames="K+pi+pi+pi";
280 AliFatal("The decay channel MUST be defined according to AliCFVertexing::DecayChannel - Exiting...");
284 const char* nameoutput=GetOutputSlot(4)->GetContainer()->GetName();
286 copyfCuts->SetName(nameoutput);
289 PostData(4, copyfCuts);
292 AliFatal("Failing initializing AliRDHFCuts object - Exiting...");
298 //_________________________________________________
299 void AliCFTaskVertexingHF::UserExec(Option_t *)
302 // Main loop function
305 PostData(1,fHistEventsProcessed) ;
306 PostData(2,fCFManager->GetParticleContainer()) ;
307 PostData(3,fCorrelation) ;
309 if (fFillFromGenerated){
310 AliWarning("Flag to fill container with generated value ON ---> dca, d0pi, d0K, d0xd0, cosPointingAngle will be set as dummy!");
314 Error("UserExec","NO EVENT FOUND!");
318 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
320 TClonesArray *arrayBranch=0;
322 if(!aodEvent && AODEvent() && IsStandardAOD()) {
323 // In case there is an AOD handler writing a standard AOD, use the AOD
324 // event in memory rather than the input (ESD) event.
325 aodEvent = dynamic_cast<AliAODEvent*> (AODEvent());
326 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
327 // have to taken from the AOD event hold by the AliAODExtension
328 AliAODHandler* aodHandler = (AliAODHandler*)
329 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
330 if(aodHandler->GetExtensions()) {
331 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
332 AliAODEvent *aodFromExt = ext->GetAOD();
334 switch (fDecayChannel){
336 arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("D0toKpi");
340 arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("Dstar");
346 arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
350 arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm4Prong");
359 switch (fDecayChannel){
361 arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("D0toKpi");
365 arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("Dstar");
371 arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("Charm3Prong");
375 arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("Charm4Prong");
383 AliAODVertex *aodVtx = (AliAODVertex*)aodEvent->GetPrimaryVertex();
387 AliError("Could not find array of HF vertices");
393 fCFManager->SetRecEventInfo(aodEvent);
394 fCFManager->SetMCEventInfo(aodEvent);
396 //******** DEFINE number of variables of the container***** for now set at 13, in the future in the config macro.
398 //loop on the MC event
400 TClonesArray* mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
402 AliError("Could not find Monte-Carlo in AOD");
407 Int_t icountReco = 0;
408 Int_t icountVertex = 0;
409 Int_t icountRefit = 0;
410 Int_t icountRecoAcc = 0;
411 Int_t icountRecoITSClusters = 0;
412 Int_t icountRecoPPR = 0;
413 Int_t icountRecoPID = 0;
416 AliAODMCHeader *mcHeader = dynamic_cast<AliAODMCHeader*>(aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
418 AliError("Could not find MC Header in AOD");
422 Double_t* containerInput = new Double_t[fNvar];
423 Double_t* containerInputMC = new Double_t[fNvar];
426 AliCFVertexingHF* cfVtxHF=0x0;
427 switch (fDecayChannel){
429 cfVtxHF = new AliCFVertexingHF2Prong(mcArray, fOriginDselection);
433 cfVtxHF = new AliCFVertexingHFCascade(mcArray, fOriginDselection);
439 cfVtxHF = new AliCFVertexingHF3Prong(mcArray, fOriginDselection, fDecayChannel);
443 //cfVtxHF = new AliCFVertexingHF4Prong(mcArray, originDselection); // not there yet
450 AliError("No AliCFVertexingHF initialized");
451 delete[] containerInput;
452 delete[] containerInputMC;
456 Double_t zPrimVertex = aodVtx ->GetZ();
457 Double_t zMCVertex = mcHeader->GetVtxZ();
458 if (TMath::Abs(zMCVertex) > fCuts->GetMaxVtxZ()){
459 AliDebug(3,Form("z coordinate of MC vertex = %f, it was required to be within [-%f, +%f], skipping event", zMCVertex, fCuts->GetMaxVtxZ(), fCuts->GetMaxVtxZ()));
460 delete[] containerInput;
461 delete[] containerInputMC;
465 AliESDtrackCuts** trackCuts = new AliESDtrackCuts*[cfVtxHF->GetNProngs()];
466 if (fDecayChannel == 21){
467 // for the D*, setting the third element of the array of the track cuts to those for the soft pion
468 for (Int_t iProng = 0; iProng<cfVtxHF->GetNProngs()-1; iProng++){
469 trackCuts[iProng]=fCuts->GetTrackCuts();
471 trackCuts[2] = fCuts->GetTrackCutsSoftPi();
474 for (Int_t iProng = 0; iProng<cfVtxHF->GetNProngs(); iProng++){
475 trackCuts[iProng]=fCuts->GetTrackCuts();
479 //General settings: vertex, feed down and fill reco container with generated values.
480 cfVtxHF->SetRecoPrimVertex(zPrimVertex);
481 cfVtxHF->SetMCPrimaryVertex(zMCVertex);
482 cfVtxHF->SetFillFromGenerated(fFillFromGenerated);
483 cfVtxHF->SetNVar(fNvar);
484 cfVtxHF->SetFakeSelection(fFakeSelection);
485 cfVtxHF->SetRejectCandidateIfNotFromQuark(fRejectIfNoQuark);
487 // switch-off the trigger class selection (doesn't work for MC)
488 fCuts->SetTriggerClass("");
490 // MC vertex, to be used, in case, for pp
491 if (fUseMCVertex) fCuts->SetUseMCVertex();
493 if (fCentralitySelection){ // keep only the requested centrality
494 if(fCuts->IsEventSelectedInCentrality(aodEvent)!=0) {
495 delete[] containerInput;
496 delete[] containerInputMC;
500 } else { // keep all centralities
501 fCuts->SetMinCentrality(0.);
502 fCuts->SetMaxCentrality(100.);
506 Float_t centValue = fCuts->GetCentrality(aodEvent);
507 cfVtxHF->SetCentralityValue(centValue);
509 for (Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) {
510 AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(mcArray->At(iPart));
512 AliError("Failed casting particle from MC array!, Skipping particle");
515 // check the MC-level cuts, must be the desidered particle
516 if (!fCFManager->CheckParticleCuts(0, mcPart)) {
517 continue; // 0 stands for MC level
519 cfVtxHF->SetMCCandidateParam(iPart);
522 cquarks += cfVtxHF->MCcquarkCounting(mcPart);
524 if (!(cfVtxHF->SetLabelArray())){
525 AliDebug(2,Form("Impossible to set the label array (decaychannel = %d)",fDecayChannel));
529 //check the candiate family at MC level
530 if (!(cfVtxHF->CheckMCPartFamily(mcPart, mcArray))) {
531 AliDebug(2,Form("Check on the family wrong!!! (decaychannel = %d)",fDecayChannel));
535 AliDebug(2,Form("Check on the family OK!!! (decaychannel = %d)",fDecayChannel));
538 //Fill the MC container
539 Bool_t mcContainerFilled = cfVtxHF -> FillMCContainer(containerInputMC);
540 if (mcContainerFilled) {
541 if (fUseWeight)fWeight = GetWeight(containerInputMC[0]);
542 if (!fCuts->IsInFiducialAcceptance(containerInputMC[0],containerInputMC[1])) continue;
543 //MC Limited Acceptance
544 if (TMath::Abs(containerInputMC[1]) < 0.5) {
545 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepGeneratedLimAcc, fWeight);
546 AliDebug(3,"MC Lim Acc container filled\n");
550 fCFManager->GetParticleContainer()->Fill(containerInputMC, kStepGenerated, fWeight);
552 AliDebug(3,"MC cointainer filled \n");
555 // check the MC-Acceptance level cuts
556 // since standard CF functions are not applicable, using Kine Cuts on daughters
557 Bool_t mcAccepStep = cfVtxHF-> MCAcceptanceStep();
559 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepAcceptance, fWeight);
560 AliDebug(3,"MC acceptance cut passed\n");
564 if (fCuts->IsEventSelected(aodEvent)){
565 // filling the container if the vertex is ok
566 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepVertex, fWeight) ;
567 AliDebug(3,"Vertex cut passed and container filled\n");
570 //mc Refit requirement
571 Bool_t mcRefitStep = cfVtxHF->MCRefitStep(aodEvent, &trackCuts[0]);
573 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepRefit, fWeight);
574 AliDebug(3,"MC Refit cut passed and container filled\n");
580 AliDebug(3,"MC Refit cut not passed\n");
585 AliDebug (3, "MC vertex step not passed\n");
590 AliDebug (3, "MC in acceptance step not passed\n");
595 AliDebug (3, "MC container not filled\n");
599 if (cquarks<2) AliDebug(2,Form("Event with %d c-quarks", cquarks));
600 AliDebug(2,Form("Found %i MC particles that are %s!!",icountMC,fPartName.Data()));
601 AliDebug(2,Form("Found %i MC particles that are %s and satisfy Acc cuts!!",icountAcc,fPartName.Data()));
602 AliDebug(2,Form("Found %i MC particles that are %s and satisfy Vertex cuts!!",icountVertex,fPartName.Data()));
603 AliDebug(2,Form("Found %i MC particles that are %s and satisfy Refit cuts!!",icountRefit,fPartName.Data()));
605 // Now go to rec level
606 fCountMC += icountMC;
607 fCountAcc += icountAcc;
608 fCountVertex+= icountVertex;
609 fCountRefit+= icountRefit;
611 AliDebug(2,Form("Found %d vertices for decay channel %d",arrayBranch->GetEntriesFast(),fDecayChannel));
613 for(Int_t iCandid = 0; iCandid<arrayBranch->GetEntriesFast();iCandid++){
614 AliAODRecoDecayHF* charmCandidate=0x0;
615 switch (fDecayChannel){
617 charmCandidate = (AliAODRecoDecayHF2Prong*)arrayBranch->At(iCandid);
621 charmCandidate = (AliAODRecoCascadeHF*)arrayBranch->At(iCandid);
627 charmCandidate = (AliAODRecoDecayHF3Prong*)arrayBranch->At(iCandid);
631 charmCandidate = (AliAODRecoDecayHF4Prong*)arrayBranch->At(iCandid);
638 Bool_t unsetvtx=kFALSE;
639 if(!charmCandidate->GetOwnPrimaryVtx()) {
640 charmCandidate->SetOwnPrimaryVtx(aodVtx); // needed to compute all variables
644 Bool_t signAssociation = cfVtxHF->SetRecoCandidateParam((AliAODRecoDecayHF*)charmCandidate);
645 if (!signAssociation){
646 charmCandidate = 0x0;
650 Int_t isPartOrAntipart = cfVtxHF->CheckReflexion(fSign);
651 if (isPartOrAntipart == 0){
652 AliDebug(2, Form("The candidate pdg code doesn't match the requirement set in the task (fSign = %d)",fSign));
656 Bool_t recoContFilled = cfVtxHF->FillRecoContainer(containerInput);
659 if (!fCuts->IsInFiducialAcceptance(containerInput[0],containerInput[1])) continue;
662 Bool_t recoStep = cfVtxHF->RecoStep();
663 Bool_t vtxCheck = fCuts->IsEventSelected(aodEvent);
665 if (recoStep && recoContFilled && vtxCheck){
666 fCFManager->GetParticleContainer()->Fill(containerInput,kStepReconstructed, fWeight) ;
668 AliDebug(3,"Reco step passed and container filled\n");
670 //Reco in the acceptance -- take care of UNFOLDING!!!!
671 Bool_t recoAcceptanceStep = cfVtxHF->RecoAcceptStep(&trackCuts[0]);
672 if (recoAcceptanceStep) {
673 fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoAcceptance, fWeight) ;
675 AliDebug(3,"Reco acceptance cut passed and container filled\n");
678 Double_t fill[4]; //fill response matrix
679 Bool_t bUnfolding = cfVtxHF -> FillUnfoldingMatrix(fill);
680 if (bUnfolding) fCorrelation->Fill(fill);
683 //Number of ITS cluster requirements
684 Int_t recoITSnCluster = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kTracks);
685 if (recoITSnCluster){
686 fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoITSClusters, fWeight) ;
687 icountRecoITSClusters++;
688 AliDebug(3,"Reco n ITS cluster cut passed and container filled\n");
690 Bool_t iscutsusingpid = fCuts->GetIsUsePID();
691 Int_t recoAnalysisCuts = -1, recoPidSelection = -1;
692 fCuts->SetUsePID(kFALSE);
693 recoAnalysisCuts = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kCandidate, aodEvent);
695 if (recoAnalysisCuts > 3){ // Ds case, where more possibilities are considered
696 if (recoAnalysisCuts >= 8){
697 recoAnalysisCuts -= 8; // removing K0star mass
699 if (recoAnalysisCuts >= 4){
700 recoAnalysisCuts -= 4; // removing Phi mass
704 fCuts->SetUsePID(iscutsusingpid); //restoring usage of the PID from the cuts object
705 if (recoAnalysisCuts == 3 || recoAnalysisCuts == isPartOrAntipart){
706 fCFManager->GetParticleContainer()->Fill(containerInput, kStepRecoPPR, fWeight);
708 AliDebug(3,"Reco Analysis cuts passed and container filled \n");
710 //recoPidSelection = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kPID);
711 //if((fCuts->CombineSelectionLevels(3,recoAnalysisCuts,recoPidSelection)==isPartOrAntipart)||(fCuts->CombineSelectionLevels(3,recoAnalysisCuts,recoPidSelection)==3)){
712 recoPidSelection = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kCandidate, aodEvent);
713 if (recoPidSelection == 3 || recoPidSelection == isPartOrAntipart){
714 fCFManager->GetParticleContainer()->Fill(containerInput, kStepRecoPID, fWeight);
716 AliDebug(3,"Reco PID cuts passed and container filled \n");
718 Double_t fill[4]; //fill response matrix
719 Bool_t bUnfolding = cfVtxHF -> FillUnfoldingMatrix(fill);
720 if (bUnfolding) fCorrelation->Fill(fill);
724 AliDebug(3, "Analysis Cuts step not passed \n");
729 AliDebug(3, "PID selection not passed \n");
734 AliDebug(3, "Number of ITS cluster step not passed\n");
739 AliDebug(3, "Reco acceptance step not passed\n");
744 AliDebug(3, "Reco step not passed\n");
749 if(unsetvtx) charmCandidate->UnsetOwnPrimaryVtx();
750 } // end loop on candidate
752 fCountReco+= icountReco;
753 fCountRecoAcc+= icountRecoAcc;
754 fCountRecoITSClusters+= icountRecoITSClusters;
755 fCountRecoPPR+= icountRecoPPR;
756 fCountRecoPID+= icountRecoPID;
758 fHistEventsProcessed->Fill(0);
760 delete[] containerInput;
761 delete[] containerInputMC;
764 // for (Int_t i=0; i<cfVtxHF->GetNProngs(); i++){
765 // delete [] trackCuts[i];
771 //___________________________________________________________________________
772 void AliCFTaskVertexingHF::Terminate(Option_t*)
774 // The Terminate() function is the last function to be called during
775 // a query. It always runs on the client, it can be used to present
776 // the results graphically or save the results to file.
778 AliAnalysisTaskSE::Terminate();
780 AliInfo(Form("Found %i MC particles that are %s in MC, in %d events",fCountMC,fPartName.Data(),fEvents));
781 AliInfo(Form("Found %i MC particles that are %s in MC and satisfy Acc cuts, in %d events",fCountAcc,fPartName.Data(),fEvents));
782 AliInfo(Form("Found %i MC particles that are %s in MC and satisfy Acc cuts, and satisfy Vertex requirement in %d events",fCountVertex,fPartName.Data(),fEvents));
783 AliInfo(Form("Found %i MC particles that are %s in MC and satisfy Acc cuts, and satisfy ITS+TPC refit requirementin %d events",fCountRefit,fPartName.Data(),fEvents));
784 AliInfo(Form("Found %i reco %s that are decaying in %s, in %d events",fCountReco,fPartName.Data(),fDauNames.Data(),fEvents));
785 AliInfo(Form("Among the above, found %i reco %s that are decaying in %s and are in the requested acceptance, in %d events",fCountRecoAcc,fPartName.Data(),fDauNames.Data(),fEvents));
786 AliInfo(Form("Among the above, found %i reco %s that are decaying in %s and have at least 5 clusters in ITS, in %d events",fCountRecoITSClusters,fPartName.Data(),fDauNames.Data(),fEvents));
787 AliInfo(Form("Among the above, found %i reco %s that are decaying in %s and satisfy PPR cuts, in %d events",fCountRecoPPR,fPartName.Data(),fDauNames.Data(),fEvents));
788 AliInfo(Form("Among the above, found %i reco %s that are decaying in %s and satisfy PPR+PID cuts, in %d events",fCountRecoPID,fPartName.Data(),fDauNames.Data(),fEvents));
790 // draw some example plots....
792 AliCFContainer *cont= dynamic_cast<AliCFContainer*> (GetOutputData(2));
794 printf("CONTAINER NOT FOUND\n");
797 // projecting the containers to obtain histograms
798 // first argument = variable, second argument = step
801 for(Int_t iC=0;iC<12; iC++){
803 h[0][iC] = cont->ShowProjection(iC,0);
804 // MC-Acceptance level
805 h[1][iC] = cont->ShowProjection(iC,1);
807 h[2][iC] = cont->ShowProjection(iC,4);
810 if(fDecayChannel==31){
811 titles[0]="pT_Dplus (GeV/c)";
812 titles[1]="rapidity";
813 titles[2]="phi (rad)";
814 titles[3]="cT (#mum)";
815 titles[4]="cosPointingAngle";
816 titles[5]="pT_1 (GeV/c)";
817 titles[6]="pT_2 (GeV/c)";
818 titles[7]="pT_3 (GeV/c)";
819 titles[8]="d0_1 (#mum)";
820 titles[9]="d0_2 (#mum)";
821 titles[10]="d0_3 (#mum)";
822 titles[11]="zVertex (cm)";
824 titles[0]="pT_D0 (GeV/c)";
825 titles[1]="rapidity";
826 titles[2]="cosThetaStar";
827 titles[3]="pT_pi (GeV/c)";
828 titles[4]="pT_K (Gev/c)";
829 titles[5]="cT (#mum)";
830 titles[6]="dca (#mum)";
831 titles[7]="d0_pi (#mum)";
832 titles[8]="d0_K (#mum)";
833 titles[9]="d0xd0 (#mum^2)";
834 titles[10]="cosPointingAngle";
835 titles[11]="phi (rad)";
837 Int_t markers[12]={20,24,21,25,27,28,
839 Int_t colors[3]={2,8,4};
840 for(Int_t iC=0;iC<12; iC++){
841 for(Int_t iStep=0;iStep<3;iStep++){
842 h[iStep][iC]->SetTitle(titles[iC].Data());
843 h[iStep][iC]->GetXaxis()->SetTitle(titles[iC].Data());
844 Double_t maxh=h[iStep][iC]->GetMaximum();
845 h[iStep][iC]->GetYaxis()->SetRangeUser(0,maxh*1.2);
846 h[iStep][iC]->SetMarkerStyle(markers[iC]);
847 h[iStep][iC]->SetMarkerColor(colors[iStep]);
853 gStyle->SetCanvasColor(0);
854 gStyle->SetFrameFillColor(0);
855 gStyle->SetTitleFillColor(0);
856 gStyle->SetStatColor(0);
858 // drawing in 2 separate canvas for a matter of clearity
859 TCanvas * c1 =new TCanvas("c1New","Vars 0,1,2",1100,1600);
862 for(Int_t iVar=0; iVar<3; iVar++){
864 h[0][iVar]->Draw("p");
866 h[1][iVar]->Draw("p");
868 h[2][iVar]->Draw("p");
871 TCanvas * c2 =new TCanvas("c2New","Vars 3,4,5",1100,1600);
874 for(Int_t iVar=3; iVar<6; iVar++){
876 h[0][iVar]->Draw("p");
878 h[1][iVar]->Draw("p");
880 h[2][iVar]->Draw("p");
884 TCanvas * c3 =new TCanvas("c3New","Vars 6,7,8",1100,1600);
887 for(Int_t iVar=6; iVar<9; iVar++){
889 h[0][iVar]->Draw("p");
891 h[1][iVar]->Draw("p");
893 h[2][iVar]->Draw("p");
897 TCanvas * c4 =new TCanvas("c4New","Vars 9,10,11",1100,1600);
900 for(Int_t iVar=9; iVar<11; iVar++){
902 h[0][iVar]->Draw("p");
904 h[1][iVar]->Draw("p");
906 h[2][iVar]->Draw("p");
910 THnSparseD* hcorr = dynamic_cast<THnSparseD*> (GetOutputData(3));
912 TH2D* corr1 =hcorr->Projection(0,2);
913 TH2D* corr2 = hcorr->Projection(1,3);
915 TCanvas * c7 =new TCanvas("c7New","",800,400);
923 TFile* file_projection = new TFile("CFtaskHFprojectionNew.root","RECREATE");
927 for(Int_t iC=0;iC<12; iC++){
928 for(Int_t iStep=0;iStep<3;iStep++){
929 h[iStep][iC]->Write(Form("Step%d_%s",iStep,titles[iC].Data()));
932 file_projection->Close();
937 c1->SaveAs("Plots/pT_rapidity_cosThetaStar.eps");
938 c2->SaveAs("Plots/pTpi_pTK_cT.eps");
939 c3->SaveAs("Plots/dca_d0pi_d0TK.eps");
940 c4->SaveAs("Plots/d0xd0_cosPointingAngle.eps");
942 c1->SaveAs("Plots/pT_rapidity_cosThetaStar.gif");
943 c2->SaveAs("Plots/pTpi_pTK_cT.gif");
944 c3->SaveAs("Plots/dca_d0pi_d0TK.gif");
945 c4->SaveAs("Plots/d0xd0_cosPointingAngle.gif");
949 //___________________________________________________________________________
950 void AliCFTaskVertexingHF::UserCreateOutputObjects()
952 //HERE ONE CAN CREATE OUTPUT OBJECTS, IN PARTICULAR IF THE OBJECT PARAMETERS DON'T NEED
953 //TO BE SET BEFORE THE EXECUTION OF THE TASK
955 Info("UserCreateOutputObjects","CreateOutputObjects of task %s\n", GetName());
959 fHistEventsProcessed = new TH1I("CFHFchist0","",1,0,1) ;
961 PostData(1,fHistEventsProcessed) ;
962 PostData(2,fCFManager->GetParticleContainer()) ;
963 PostData(3,fCorrelation) ;
968 //_________________________________________________________________________
969 Double_t AliCFTaskVertexingHF::GetWeight(Float_t pt)
972 // calculating the weight to fill the container
976 // p0 = 1.63297e-01 --> 0.322643
982 // p0 = 1.85906e-01 --> 0.36609
987 Double_t func1[4] = {0.322643,2.96275,2.30301,2.5};
988 Double_t func2[4] = {0.36609,1.94635,1.40463,2.5};
990 Double_t dndpt_func1 = dNdptFit(pt,func1);
991 Double_t dndpt_func2 = dNdptFit(pt,func2);
992 AliDebug(2,Form("pt = %f, FONLL = %f, Pythia = %f, ratio = %f",pt,dndpt_func1,dndpt_func2,dndpt_func1/dndpt_func2));
993 return dndpt_func1/dndpt_func2;
996 //__________________________________________________________________________________________________
997 Double_t AliCFTaskVertexingHF::dNdptFit(Float_t pt, Double_t* par)
1000 // calculating dNdpt
1003 Double_t denom = TMath::Power((pt/par[1]), par[3] );
1004 Double_t dNdpt = par[0]*pt/TMath::Power(1.+denom, par[2]);