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),
109 //___________________________________________________________________________
110 AliCFTaskVertexingHF::AliCFTaskVertexingHF(const Char_t* name, AliRDHFCuts* cuts) :
111 AliAnalysisTaskSE(name),
113 fHistEventsProcessed(0x0),
121 fCountRecoITSClusters(0),
126 fFillFromGenerated(kFALSE),
127 fOriginDselection(0),
128 fAcceptanceUnf(kTRUE),
136 fCentralitySelection(kTRUE),
140 // Constructor. Initialization of Inputs and Outputs
143 DefineInput(0) and DefineOutput(0)
144 are taken care of by AliAnalysisTaskSE constructor
146 DefineOutput(1,TH1I::Class());
147 DefineOutput(2,AliCFContainer::Class());
148 DefineOutput(3,THnSparseD::Class());
149 DefineOutput(4,AliRDHFCuts::Class());
154 //___________________________________________________________________________
155 AliCFTaskVertexingHF& AliCFTaskVertexingHF::operator=(const AliCFTaskVertexingHF& c)
158 // Assignment operator
161 AliAnalysisTaskSE::operator=(c) ;
162 fCFManager = c.fCFManager;
163 fHistEventsProcessed = c.fHistEventsProcessed;
169 //___________________________________________________________________________
170 AliCFTaskVertexingHF::AliCFTaskVertexingHF(const AliCFTaskVertexingHF& c) :
171 AliAnalysisTaskSE(c),
172 fCFManager(c.fCFManager),
173 fHistEventsProcessed(c.fHistEventsProcessed),
174 fCorrelation(c.fCorrelation),
175 fCountMC(c.fCountMC),
176 fCountAcc(c.fCountAcc),
177 fCountVertex(c.fCountVertex),
178 fCountRefit(c.fCountRefit),
179 fCountReco(c.fCountReco),
180 fCountRecoAcc(c.fCountRecoAcc),
181 fCountRecoITSClusters(c.fCountRecoITSClusters),
182 fCountRecoPPR(c.fCountRecoPPR),
183 fCountRecoPID(c.fCountRecoPID),
185 fDecayChannel(c.fDecayChannel),
186 fFillFromGenerated(c.fFillFromGenerated),
187 fOriginDselection(c.fOriginDselection),
188 fAcceptanceUnf(c.fAcceptanceUnf),
190 fUseWeight(c.fUseWeight),
193 fPartName(c.fPartName),
194 fDauNames(c.fDauNames),
196 fCentralitySelection(c.fCentralitySelection),
197 fFakeSelection(c.fFakeSelection)
204 //___________________________________________________________________________
205 AliCFTaskVertexingHF::~AliCFTaskVertexingHF()
210 if (fCFManager) delete fCFManager ;
211 if (fHistEventsProcessed) delete fHistEventsProcessed ;
212 if (fCorrelation) delete fCorrelation ;
213 if (fCuts) delete fCuts;
216 //_________________________________________________________________________-
217 void AliCFTaskVertexingHF::Init()
223 if (fDebug>1) printf("AliCFTaskVertexingHF::Init()");
224 AliRDHFCuts *copyfCuts = 0x0;
226 AliFatal("No cuts defined - Exiting...");
230 switch (fDecayChannel){
232 copyfCuts = new AliRDHFCutsD0toKpi(*(static_cast<AliRDHFCutsD0toKpi*>(fCuts)));
239 copyfCuts = new AliRDHFCutsDStartoKpipi(*(static_cast<AliRDHFCutsDStartoKpipi*>(fCuts)));
246 copyfCuts = new AliRDHFCutsDplustoKpipi(*(static_cast<AliRDHFCutsDplustoKpipi*>(fCuts)));
253 copyfCuts = new AliRDHFCutsLctopKpi(*(static_cast<AliRDHFCutsLctopKpi*>(fCuts)));
260 copyfCuts = new AliRDHFCutsDstoKKpi(*(static_cast<AliRDHFCutsDstoKKpi*>(fCuts)));
267 copyfCuts = new AliRDHFCutsD0toKpipipi(*(static_cast<AliRDHFCutsD0toKpipipi*>(fCuts)));
270 fDauNames="K+pi+pi+pi";
274 AliFatal("The decay channel MUST be defined according to AliCFVertexing::DecayChannel - Exiting...");
278 const char* nameoutput=GetOutputSlot(4)->GetContainer()->GetName();
280 copyfCuts->SetName(nameoutput);
283 PostData(4, copyfCuts);
286 AliFatal("Failing initializing AliRDHFCuts object - Exiting...");
292 //_________________________________________________
293 void AliCFTaskVertexingHF::UserExec(Option_t *)
296 // Main loop function
299 PostData(1,fHistEventsProcessed) ;
300 PostData(2,fCFManager->GetParticleContainer()) ;
301 PostData(3,fCorrelation) ;
304 if (fFillFromGenerated){
305 AliWarning("Flag to fill container with generated value ON ---> dca, d0pi, d0K, d0xd0, cosPointingAngle will be set as dummy!");
309 Error("UserExec","NO EVENT FOUND!");
313 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
315 TClonesArray *arrayBranch=0;
317 if(!aodEvent && AODEvent() && IsStandardAOD()) {
318 // In case there is an AOD handler writing a standard AOD, use the AOD
319 // event in memory rather than the input (ESD) event.
320 aodEvent = dynamic_cast<AliAODEvent*> (AODEvent());
321 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
322 // have to taken from the AOD event hold by the AliAODExtension
323 AliAODHandler* aodHandler = (AliAODHandler*)
324 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
325 if(aodHandler->GetExtensions()) {
326 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
327 AliAODEvent *aodFromExt = ext->GetAOD();
329 switch (fDecayChannel){
331 arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("D0toKpi");
335 arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("Dstar");
341 arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
345 arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm4Prong");
354 switch (fDecayChannel){
356 arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("D0toKpi");
360 arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("Dstar");
366 arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("Charm3Prong");
370 arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("Charm4Prong");
378 AliAODVertex *aodVtx = (AliAODVertex*)aodEvent->GetPrimaryVertex();
382 AliError("Could not find array of HF vertices");
388 fCFManager->SetRecEventInfo(aodEvent);
389 fCFManager->SetMCEventInfo(aodEvent);
391 //******** DEFINE number of variables of the container***** for now set at 13, in the future in the config macro.
393 //loop on the MC event
395 TClonesArray* mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
397 AliError("Could not find Monte-Carlo in AOD");
402 Int_t icountReco = 0;
403 Int_t icountVertex = 0;
404 Int_t icountRefit = 0;
405 Int_t icountRecoAcc = 0;
406 Int_t icountRecoITSClusters = 0;
407 Int_t icountRecoPPR = 0;
408 Int_t icountRecoPID = 0;
411 AliAODMCHeader *mcHeader = dynamic_cast<AliAODMCHeader*>(aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
413 AliError("Could not find MC Header in AOD");
417 Double_t* containerInput = new Double_t[fNvar];
418 Double_t* containerInputMC = new Double_t[fNvar];
421 AliCFVertexingHF* cfVtxHF=0x0;
422 switch (fDecayChannel){
424 cfVtxHF = new AliCFVertexingHF2Prong(mcArray, fOriginDselection);
428 cfVtxHF = new AliCFVertexingHFCascade(mcArray, fOriginDselection);
434 cfVtxHF = new AliCFVertexingHF3Prong(mcArray, fOriginDselection, fDecayChannel);
438 //cfVtxHF = new AliCFVertexingHF4Prong(mcArray, originDselection); // not there yet
445 AliError("No AliCFVertexingHF initialized");
446 delete[] containerInput;
447 delete[] containerInputMC;
451 Double_t zPrimVertex = aodVtx ->GetZ();
452 Double_t zMCVertex = mcHeader->GetVtxZ();
454 if (TMath::Abs(zMCVertex) > fCuts->GetMaxVtxZ()){
455 AliDebug(3,Form("z coordinate of MC vertex = %f, it was required to be within [-%f, +%f], skipping event", zMCVertex, fCuts->GetMaxVtxZ(), fCuts->GetMaxVtxZ()));
456 delete[] containerInput;
457 delete[] containerInputMC;
461 AliESDtrackCuts** trackCuts = new AliESDtrackCuts*[cfVtxHF->GetNProngs()];
462 if (fDecayChannel == 21){
463 // for the D*, setting the third element of the array of the track cuts to those for the soft pion
464 for (Int_t iProng = 0; iProng<cfVtxHF->GetNProngs()-1; iProng++){
465 trackCuts[iProng]=fCuts->GetTrackCuts();
467 trackCuts[2] = fCuts->GetTrackCutsSoftPi();
470 for (Int_t iProng = 0; iProng<cfVtxHF->GetNProngs(); iProng++){
471 trackCuts[iProng]=fCuts->GetTrackCuts();
475 //General settings: vertex, feed down and fill reco container with generated values.
476 cfVtxHF->SetRecoPrimVertex(zPrimVertex);
477 cfVtxHF->SetMCPrimaryVertex(zMCVertex);
478 cfVtxHF->SetFillFromGenerated(fFillFromGenerated);
479 cfVtxHF->SetNVar(fNvar);
480 cfVtxHF->SetFakeSelection(fFakeSelection);
482 // switch-off the trigger class selection (doesn't work for MC)
483 fCuts->SetTriggerClass("");
486 if (fCentralitySelection){ // consider only events in the class requested
487 if(fCuts->IsEventSelectedInCentrality(aodEvent)!=0) {
488 delete[] containerInput;
489 delete[] containerInputMC;
493 } else { // disable the centrality sel in IsEventSelected
494 fCuts->SetUseCentrality(0);
498 Float_t centValue = fCuts->GetCentrality(aodEvent);
499 cfVtxHF->SetCentralityValue(centValue);
501 for (Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) {
502 AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(mcArray->At(iPart));
504 AliError("Failed casting particle from MC array!, Skipping particle");
507 // check the MC-level cuts, must be the desidered particle
508 if (!fCFManager->CheckParticleCuts(0, mcPart)) {
509 continue; // 0 stands for MC level
511 cfVtxHF->SetMCCandidateParam(iPart);
514 cquarks += cfVtxHF->MCcquarkCounting(mcPart);
516 if (!(cfVtxHF->SetLabelArray())){
517 AliDebug(2,Form("Impossible to set the label array (decaychannel = %d)",fDecayChannel));
521 //check the candiate family at MC level
522 if (!(cfVtxHF->CheckMCPartFamily(mcPart, mcArray))) {
523 AliDebug(2,Form("Check on the family wrong!!! (decaychannel = %d)",fDecayChannel));
527 AliDebug(2,Form("Check on the family OK!!! (decaychannel = %d)",fDecayChannel));
530 //Fill the MC container
531 Bool_t mcContainerFilled = cfVtxHF -> FillMCContainer(containerInputMC);
532 if (mcContainerFilled) {
533 if (fUseWeight)fWeight = GetWeight(containerInputMC[0]);
534 if (!fCuts->IsInFiducialAcceptance(containerInputMC[0],containerInputMC[1])) continue;
535 //MC Limited Acceptance
536 if (TMath::Abs(containerInputMC[1]) < 0.5) {
537 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepGeneratedLimAcc, fWeight);
538 AliDebug(3,"MC Lim Acc container filled\n");
542 fCFManager->GetParticleContainer()->Fill(containerInputMC, kStepGenerated, fWeight);
544 AliDebug(3,"MC cointainer filled \n");
547 // check the MC-Acceptance level cuts
548 // since standard CF functions are not applicable, using Kine Cuts on daughters
549 Bool_t mcAccepStep = cfVtxHF-> MCAcceptanceStep();
551 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepAcceptance, fWeight);
552 AliDebug(3,"MC acceptance cut passed\n");
556 if (fCuts->IsEventSelected(aodEvent)){
557 // filling the container if the vertex is ok
558 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepVertex, fWeight) ;
559 AliDebug(3,"Vertex cut passed and container filled\n");
562 //mc Refit requirement
563 Bool_t mcRefitStep = cfVtxHF->MCRefitStep(aodEvent, &trackCuts[0]);
565 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepRefit, fWeight);
566 AliDebug(3,"MC Refit cut passed and container filled\n");
572 AliDebug(3,"MC Refit cut not passed\n");
577 AliDebug (3, "MC vertex step not passed\n");
582 AliDebug (3, "MC in acceptance step not passed\n");
587 AliDebug (3, "MC container not filled\n");
591 if (cquarks<2) AliDebug(2,Form("Event with %d c-quarks", cquarks));
592 AliDebug(2,Form("Found %i MC particles that are %s!!",icountMC,fPartName.Data()));
593 AliDebug(2,Form("Found %i MC particles that are %s and satisfy Acc cuts!!",icountAcc,fPartName.Data()));
594 AliDebug(2,Form("Found %i MC particles that are %s and satisfy Vertex cuts!!",icountVertex,fPartName.Data()));
595 AliDebug(2,Form("Found %i MC particles that are %s and satisfy Refit cuts!!",icountRefit,fPartName.Data()));
597 // Now go to rec level
598 fCountMC += icountMC;
599 fCountAcc += icountAcc;
600 fCountVertex+= icountVertex;
601 fCountRefit+= icountRefit;
603 AliDebug(2,Form("Found %d vertices for decay channel %d",arrayBranch->GetEntriesFast(),fDecayChannel));
605 for(Int_t iCandid = 0; iCandid<arrayBranch->GetEntriesFast();iCandid++){
606 AliAODRecoDecayHF* charmCandidate=0x0;
607 switch (fDecayChannel){
609 charmCandidate = (AliAODRecoDecayHF2Prong*)arrayBranch->At(iCandid);
613 charmCandidate = (AliAODRecoCascadeHF*)arrayBranch->At(iCandid);
619 charmCandidate = (AliAODRecoDecayHF3Prong*)arrayBranch->At(iCandid);
623 charmCandidate = (AliAODRecoDecayHF4Prong*)arrayBranch->At(iCandid);
630 Bool_t unsetvtx=kFALSE;
631 if(!charmCandidate->GetOwnPrimaryVtx()) {
632 charmCandidate->SetOwnPrimaryVtx(aodVtx); // needed to compute all variables
636 Bool_t signAssociation = cfVtxHF->SetRecoCandidateParam((AliAODRecoDecayHF*)charmCandidate);
637 if (!signAssociation){
638 charmCandidate = 0x0;
642 Int_t isPartOrAntipart = cfVtxHF->CheckReflexion(fSign);
643 if (isPartOrAntipart == 0){
644 AliDebug(2, Form("The candidate pdg code doesn't match the requirement set in the task (fSign = %d)",fSign));
648 Bool_t recoContFilled = cfVtxHF->FillRecoContainer(containerInput);
651 if (!fCuts->IsInFiducialAcceptance(containerInput[0],containerInput[1])) continue;
654 Bool_t recoStep = cfVtxHF->RecoStep();
655 Bool_t vtxCheck = fCuts->IsEventSelected(aodEvent);
657 if (recoStep && recoContFilled && vtxCheck){
658 fCFManager->GetParticleContainer()->Fill(containerInput,kStepReconstructed, fWeight) ;
660 AliDebug(3,"Reco step passed and container filled\n");
662 //Reco in the acceptance -- take care of UNFOLDING!!!!
663 Bool_t recoAcceptanceStep = cfVtxHF->RecoAcceptStep(&trackCuts[0]);
664 if (recoAcceptanceStep) {
665 fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoAcceptance, fWeight) ;
667 AliDebug(3,"Reco acceptance cut passed and container filled\n");
670 Double_t fill[4]; //fill response matrix
671 Bool_t bUnfolding = cfVtxHF -> FillUnfoldingMatrix(fill);
672 if (bUnfolding) fCorrelation->Fill(fill);
675 //Number of ITS cluster requirements
676 Int_t recoITSnCluster = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kTracks);
677 if (recoITSnCluster){
678 fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoITSClusters, fWeight) ;
679 icountRecoITSClusters++;
680 AliDebug(3,"Reco n ITS cluster cut passed and container filled\n");
682 Bool_t iscutsusingpid = fCuts->GetIsUsePID();
683 Int_t recoAnalysisCuts = -1, recoPidSelection = -1;
684 fCuts->SetUsePID(kFALSE);
685 recoAnalysisCuts = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kCandidate, aodEvent);
687 if (recoAnalysisCuts > 3){ // Ds case, where more possibilities are considered
688 if (recoAnalysisCuts >= 8){
689 recoAnalysisCuts -= 8; // removing K0star mass
691 if (recoAnalysisCuts >= 4){
692 recoAnalysisCuts -= 4; // removing Phi mass
696 fCuts->SetUsePID(iscutsusingpid); //restoring usage of the PID from the cuts object
697 if (recoAnalysisCuts == 3 || recoAnalysisCuts == isPartOrAntipart){
698 fCFManager->GetParticleContainer()->Fill(containerInput, kStepRecoPPR, fWeight);
700 AliDebug(3,"Reco Analysis cuts passed and container filled \n");
702 //recoPidSelection = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kPID);
703 //if((fCuts->CombineSelectionLevels(3,recoAnalysisCuts,recoPidSelection)==isPartOrAntipart)||(fCuts->CombineSelectionLevels(3,recoAnalysisCuts,recoPidSelection)==3)){
704 recoPidSelection = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kCandidate, aodEvent);
705 if (recoPidSelection == 3 || recoPidSelection == isPartOrAntipart){
706 fCFManager->GetParticleContainer()->Fill(containerInput, kStepRecoPID, fWeight);
708 AliDebug(3,"Reco PID cuts passed and container filled \n");
710 Double_t fill[4]; //fill response matrix
711 Bool_t bUnfolding = cfVtxHF -> FillUnfoldingMatrix(fill);
712 if (bUnfolding) fCorrelation->Fill(fill);
716 AliDebug(3, "Analysis Cuts step not passed \n");
721 AliDebug(3, "PID selection not passed \n");
726 AliDebug(3, "Number of ITS cluster step not passed\n");
731 AliDebug(3, "Reco acceptance step not passed\n");
736 AliDebug(3, "Reco step not passed\n");
741 if(unsetvtx) charmCandidate->UnsetOwnPrimaryVtx();
742 } // end loop on candidate
744 fCountReco+= icountReco;
745 fCountRecoAcc+= icountRecoAcc;
746 fCountRecoITSClusters+= icountRecoITSClusters;
747 fCountRecoPPR+= icountRecoPPR;
748 fCountRecoPID+= icountRecoPID;
750 fHistEventsProcessed->Fill(0);
752 delete[] containerInput;
753 delete[] containerInputMC;
756 // for (Int_t i=0; i<cfVtxHF->GetNProngs(); i++){
757 // delete [] trackCuts[i];
763 //___________________________________________________________________________
764 void AliCFTaskVertexingHF::Terminate(Option_t*)
766 // The Terminate() function is the last function to be called during
767 // a query. It always runs on the client, it can be used to present
768 // the results graphically or save the results to file.
770 AliAnalysisTaskSE::Terminate();
772 AliInfo(Form("Found %i MC particles that are %s in MC, in %d events",fCountMC,fPartName.Data(),fEvents));
773 AliInfo(Form("Found %i MC particles that are %s in MC and satisfy Acc cuts, in %d events",fCountAcc,fPartName.Data(),fEvents));
774 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));
775 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));
776 AliInfo(Form("Found %i reco %s that are decaying in %s, in %d events",fCountReco,fPartName.Data(),fDauNames.Data(),fEvents));
777 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));
778 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));
779 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));
780 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));
782 // draw some example plots....
784 AliCFContainer *cont= dynamic_cast<AliCFContainer*> (GetOutputData(2));
786 printf("CONTAINER NOT FOUND\n");
789 // projecting the containers to obtain histograms
790 // first argument = variable, second argument = step
793 for(Int_t iC=0;iC<12; iC++){
795 h[0][iC] = cont->ShowProjection(iC,0);
796 // MC-Acceptance level
797 h[1][iC] = cont->ShowProjection(iC,1);
799 h[2][iC] = cont->ShowProjection(iC,4);
802 if(fDecayChannel==31){
803 titles[0]="pT_Dplus (GeV/c)";
804 titles[1]="rapidity";
805 titles[2]="phi (rad)";
806 titles[3]="cT (#mum)";
807 titles[4]="cosPointingAngle";
808 titles[5]="pT_1 (GeV/c)";
809 titles[6]="pT_2 (GeV/c)";
810 titles[7]="pT_3 (GeV/c)";
811 titles[8]="d0_1 (#mum)";
812 titles[9]="d0_2 (#mum)";
813 titles[10]="d0_3 (#mum)";
814 titles[11]="zVertex (cm)";
816 titles[0]="pT_D0 (GeV/c)";
817 titles[1]="rapidity";
818 titles[2]="cosThetaStar";
819 titles[3]="pT_pi (GeV/c)";
820 titles[4]="pT_K (Gev/c)";
821 titles[5]="cT (#mum)";
822 titles[6]="dca (#mum)";
823 titles[7]="d0_pi (#mum)";
824 titles[8]="d0_K (#mum)";
825 titles[9]="d0xd0 (#mum^2)";
826 titles[10]="cosPointingAngle";
827 titles[11]="phi (rad)";
829 Int_t markers[12]={20,24,21,25,27,28,
831 Int_t colors[3]={2,8,4};
832 for(Int_t iC=0;iC<12; iC++){
833 for(Int_t iStep=0;iStep<3;iStep++){
834 h[iStep][iC]->SetTitle(titles[iC].Data());
835 h[iStep][iC]->GetXaxis()->SetTitle(titles[iC].Data());
836 Double_t maxh=h[iStep][iC]->GetMaximum();
837 h[iStep][iC]->GetYaxis()->SetRangeUser(0,maxh*1.2);
838 h[iStep][iC]->SetMarkerStyle(markers[iC]);
839 h[iStep][iC]->SetMarkerColor(colors[iStep]);
845 gStyle->SetCanvasColor(0);
846 gStyle->SetFrameFillColor(0);
847 gStyle->SetTitleFillColor(0);
848 gStyle->SetStatColor(0);
850 // drawing in 2 separate canvas for a matter of clearity
851 TCanvas * c1 =new TCanvas("c1New","Vars 0,1,2",1100,1600);
854 for(Int_t iVar=0; iVar<3; iVar++){
856 h[0][iVar]->Draw("p");
858 h[1][iVar]->Draw("p");
860 h[2][iVar]->Draw("p");
863 TCanvas * c2 =new TCanvas("c2New","Vars 3,4,5",1100,1600);
866 for(Int_t iVar=3; iVar<6; iVar++){
868 h[0][iVar]->Draw("p");
870 h[1][iVar]->Draw("p");
872 h[2][iVar]->Draw("p");
876 TCanvas * c3 =new TCanvas("c3New","Vars 6,7,8",1100,1600);
879 for(Int_t iVar=6; iVar<9; iVar++){
881 h[0][iVar]->Draw("p");
883 h[1][iVar]->Draw("p");
885 h[2][iVar]->Draw("p");
889 TCanvas * c4 =new TCanvas("c4New","Vars 9,10,11",1100,1600);
892 for(Int_t iVar=9; iVar<11; iVar++){
894 h[0][iVar]->Draw("p");
896 h[1][iVar]->Draw("p");
898 h[2][iVar]->Draw("p");
902 THnSparseD* hcorr = dynamic_cast<THnSparseD*> (GetOutputData(3));
904 TH2D* corr1 =hcorr->Projection(0,2);
905 TH2D* corr2 = hcorr->Projection(1,3);
907 TCanvas * c7 =new TCanvas("c7New","",800,400);
915 TFile* file_projection = new TFile("CFtaskHFprojectionNew.root","RECREATE");
919 for(Int_t iC=0;iC<12; iC++){
920 for(Int_t iStep=0;iStep<3;iStep++){
921 h[iStep][iC]->Write(Form("Step%d_%s",iStep,titles[iC].Data()));
924 file_projection->Close();
929 c1->SaveAs("Plots/pT_rapidity_cosThetaStar.eps");
930 c2->SaveAs("Plots/pTpi_pTK_cT.eps");
931 c3->SaveAs("Plots/dca_d0pi_d0TK.eps");
932 c4->SaveAs("Plots/d0xd0_cosPointingAngle.eps");
934 c1->SaveAs("Plots/pT_rapidity_cosThetaStar.gif");
935 c2->SaveAs("Plots/pTpi_pTK_cT.gif");
936 c3->SaveAs("Plots/dca_d0pi_d0TK.gif");
937 c4->SaveAs("Plots/d0xd0_cosPointingAngle.gif");
941 //___________________________________________________________________________
942 void AliCFTaskVertexingHF::UserCreateOutputObjects()
944 //HERE ONE CAN CREATE OUTPUT OBJECTS, IN PARTICULAR IF THE OBJECT PARAMETERS DON'T NEED
945 //TO BE SET BEFORE THE EXECUTION OF THE TASK
947 Info("UserCreateOutputObjects","CreateOutputObjects of task %s\n", GetName());
951 fHistEventsProcessed = new TH1I("CFHFchist0","",1,0,1) ;
955 //_________________________________________________________________________
956 Double_t AliCFTaskVertexingHF::GetWeight(Float_t pt)
959 // calculating the weight to fill the container
963 // p0 = 1.63297e-01 --> 0.322643
969 // p0 = 1.85906e-01 --> 0.36609
974 Double_t func1[4] = {0.322643,2.96275,2.30301,2.5};
975 Double_t func2[4] = {0.36609,1.94635,1.40463,2.5};
977 Double_t dndpt_func1 = dNdptFit(pt,func1);
978 Double_t dndpt_func2 = dNdptFit(pt,func2);
979 AliDebug(2,Form("pt = %f, FONLL = %f, Pythia = %f, ratio = %f",pt,dndpt_func1,dndpt_func2,dndpt_func1/dndpt_func2));
980 return dndpt_func1/dndpt_func2;
983 //__________________________________________________________________________________________________
984 Double_t AliCFTaskVertexingHF::dNdptFit(Float_t pt, Double_t* par)
990 Double_t denom = TMath::Power((pt/par[1]), par[3] );
991 Double_t dNdpt = par[0]*pt/TMath::Power(1.+denom, par[2]);