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 AliESDtrackCuts** trackCuts = new AliESDtrackCuts*[cfVtxHF->GetNProngs()];
455 if (fDecayChannel == 21){
456 // for the D*, setting the third element of the array of the track cuts to those for the soft pion
457 for (Int_t iProng = 0; iProng<cfVtxHF->GetNProngs()-1; iProng++){
458 trackCuts[iProng]=fCuts->GetTrackCuts();
460 trackCuts[2] = fCuts->GetTrackCutsSoftPi();
463 for (Int_t iProng = 0; iProng<cfVtxHF->GetNProngs(); iProng++){
464 trackCuts[iProng]=fCuts->GetTrackCuts();
468 //General settings: vertex, feed down and fill reco container with generated values.
469 cfVtxHF->SetRecoPrimVertex(zPrimVertex);
470 cfVtxHF->SetMCPrimaryVertex(zMCVertex);
471 cfVtxHF->SetFillFromGenerated(fFillFromGenerated);
472 cfVtxHF->SetNVar(fNvar);
473 cfVtxHF->SetFakeSelection(fFakeSelection);
475 if (fCentralitySelection)
476 if(fCuts->IsEventSelectedInCentrality(aodEvent)!=0) {
477 delete[] containerInput;
478 delete[] containerInputMC;
483 Float_t centValue = fCuts->GetCentrality(aodEvent);
484 cfVtxHF->SetCentralityValue(centValue);
486 for (Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) {
487 AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(mcArray->At(iPart));
489 AliError("Failed casting particle from MC array!, Skipping particle");
492 // check the MC-level cuts, must be the desidered particle
493 if (!fCFManager->CheckParticleCuts(0, mcPart)) {
494 continue; // 0 stands for MC level
496 cfVtxHF->SetMCCandidateParam(iPart);
499 cquarks += cfVtxHF->MCcquarkCounting(mcPart);
501 if (!(cfVtxHF->SetLabelArray())){
502 AliDebug(2,Form("Impossible to set the label array (decaychannel = %d)",fDecayChannel));
506 //check the candiate family at MC level
507 if (!(cfVtxHF->CheckMCPartFamily(mcPart, mcArray))) {
508 AliDebug(2,Form("Check on the family wrong!!! (decaychannel = %d)",fDecayChannel));
512 AliDebug(2,Form("Check on the family OK!!! (decaychannel = %d)",fDecayChannel));
515 //Fill the MC container
516 Bool_t mcContainerFilled = cfVtxHF -> FillMCContainer(containerInputMC);
517 if (mcContainerFilled) {
518 if (fUseWeight)fWeight = GetWeight(containerInputMC[0]);
519 if (!fCuts->IsInFiducialAcceptance(containerInputMC[0],containerInputMC[1])) continue;
520 //MC Limited Acceptance
521 if (TMath::Abs(containerInputMC[1]) < 0.5) {
522 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepGeneratedLimAcc, fWeight);
523 AliDebug(3,"MC Lim Acc container filled\n");
527 fCFManager->GetParticleContainer()->Fill(containerInputMC, kStepGenerated, fWeight);
529 AliDebug(3,"MC cointainer filled \n");
532 // check the MC-Acceptance level cuts
533 // since standard CF functions are not applicable, using Kine Cuts on daughters
534 Bool_t mcAccepStep = cfVtxHF-> MCAcceptanceStep();
536 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepAcceptance, fWeight);
537 AliDebug(3,"MC acceptance cut passed\n");
541 if (fCuts->IsEventSelected(aodEvent)){
542 // filling the container if the vertex is ok
543 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepVertex, fWeight) ;
544 AliDebug(3,"Vertex cut passed and container filled\n");
547 //mc Refit requirement
548 Bool_t mcRefitStep = cfVtxHF->MCRefitStep(aodEvent, &trackCuts[0]);
550 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepRefit, fWeight);
551 AliDebug(3,"MC Refit cut passed and container filled\n");
557 AliDebug(3,"MC Refit cut not passed\n");
562 AliDebug (3, "MC vertex step not passed\n");
567 AliDebug (3, "MC in acceptance step not passed\n");
572 AliDebug (3, "MC container not filled\n");
576 if (cquarks<2) AliDebug(2,Form("Event with %d c-quarks", cquarks));
577 AliDebug(2,Form("Found %i MC particles that are %s!!",icountMC,fPartName.Data()));
578 AliDebug(2,Form("Found %i MC particles that are %s and satisfy Acc cuts!!",icountAcc,fPartName.Data()));
579 AliDebug(2,Form("Found %i MC particles that are %s and satisfy Vertex cuts!!",icountVertex,fPartName.Data()));
580 AliDebug(2,Form("Found %i MC particles that are %s and satisfy Refit cuts!!",icountRefit,fPartName.Data()));
582 // Now go to rec level
583 fCountMC += icountMC;
584 fCountAcc += icountAcc;
585 fCountVertex+= icountVertex;
586 fCountRefit+= icountRefit;
588 AliDebug(2,Form("Found %d vertices for decay channel %d",arrayBranch->GetEntriesFast(),fDecayChannel));
590 for(Int_t iCandid = 0; iCandid<arrayBranch->GetEntriesFast();iCandid++){
591 AliAODRecoDecayHF* charmCandidate=0x0;
592 switch (fDecayChannel){
594 charmCandidate = (AliAODRecoDecayHF2Prong*)arrayBranch->At(iCandid);
598 charmCandidate = (AliAODRecoCascadeHF*)arrayBranch->At(iCandid);
604 charmCandidate = (AliAODRecoDecayHF3Prong*)arrayBranch->At(iCandid);
608 charmCandidate = (AliAODRecoDecayHF4Prong*)arrayBranch->At(iCandid);
615 Bool_t unsetvtx=kFALSE;
616 if(!charmCandidate->GetOwnPrimaryVtx()) {
617 charmCandidate->SetOwnPrimaryVtx(aodVtx); // needed to compute all variables
621 Bool_t signAssociation = cfVtxHF->SetRecoCandidateParam((AliAODRecoDecayHF*)charmCandidate);
622 if (!signAssociation){
623 charmCandidate = 0x0;
627 Int_t isPartOrAntipart = cfVtxHF->CheckReflexion(fSign);
628 if (isPartOrAntipart == 0){
629 AliDebug(2, Form("The candidate pdg code doesn't match the requirement set in the task (fSign = %d)",fSign));
633 Bool_t recoContFilled = cfVtxHF->FillRecoContainer(containerInput);
636 if (!fCuts->IsInFiducialAcceptance(containerInput[0],containerInput[1])) continue;
639 Bool_t recoStep = cfVtxHF->RecoStep();
640 Bool_t vtxCheck = fCuts->IsEventSelected(aodEvent);
642 if (recoStep && recoContFilled && vtxCheck){
643 fCFManager->GetParticleContainer()->Fill(containerInput,kStepReconstructed, fWeight) ;
645 AliDebug(3,"Reco step passed and container filled\n");
647 //Reco in the acceptance -- take care of UNFOLDING!!!!
648 Bool_t recoAcceptanceStep = cfVtxHF->RecoAcceptStep(&trackCuts[0]);
649 if (recoAcceptanceStep) {
650 fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoAcceptance, fWeight) ;
652 AliDebug(3,"Reco acceptance cut passed and container filled\n");
655 Double_t fill[4]; //fill response matrix
656 Bool_t bUnfolding = cfVtxHF -> FillUnfoldingMatrix(fill);
657 if (bUnfolding) fCorrelation->Fill(fill);
660 //Number of ITS cluster requirements
661 Int_t recoITSnCluster = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kTracks);
662 if (recoITSnCluster){
663 fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoITSClusters, fWeight) ;
664 icountRecoITSClusters++;
665 AliDebug(3,"Reco n ITS cluster cut passed and container filled\n");
667 Bool_t iscutsusingpid = fCuts->GetIsUsePID();
668 Int_t recoAnalysisCuts = -1, recoPidSelection = -1;
669 fCuts->SetUsePID(kFALSE);
670 recoAnalysisCuts = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kCandidate, aodEvent);
672 if (recoAnalysisCuts > 3){ // Ds case, where more possibilities are considered
673 if (recoAnalysisCuts >= 8){
674 recoAnalysisCuts -= 8; // removing K0star mass
676 if (recoAnalysisCuts >= 4){
677 recoAnalysisCuts -= 4; // removing Phi mass
681 fCuts->SetUsePID(iscutsusingpid); //restoring usage of the PID from the cuts object
682 if (recoAnalysisCuts == 3 || recoAnalysisCuts == isPartOrAntipart){
683 fCFManager->GetParticleContainer()->Fill(containerInput, kStepRecoPPR, fWeight);
685 AliDebug(3,"Reco Analysis cuts passed and container filled \n");
687 //recoPidSelection = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kPID);
688 //if((fCuts->CombineSelectionLevels(3,recoAnalysisCuts,recoPidSelection)==isPartOrAntipart)||(fCuts->CombineSelectionLevels(3,recoAnalysisCuts,recoPidSelection)==3)){
689 recoPidSelection = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kCandidate, aodEvent);
690 if (recoPidSelection == 3 || recoPidSelection == isPartOrAntipart){
691 fCFManager->GetParticleContainer()->Fill(containerInput, kStepRecoPID, fWeight);
693 AliDebug(3,"Reco PID cuts passed and container filled \n");
695 Double_t fill[4]; //fill response matrix
696 Bool_t bUnfolding = cfVtxHF -> FillUnfoldingMatrix(fill);
697 if (bUnfolding) fCorrelation->Fill(fill);
701 AliDebug(3, "Analysis Cuts step not passed \n");
706 AliDebug(3, "PID selection not passed \n");
711 AliDebug(3, "Number of ITS cluster step not passed\n");
716 AliDebug(3, "Reco acceptance step not passed\n");
721 AliDebug(3, "Reco step not passed\n");
726 if(unsetvtx) charmCandidate->UnsetOwnPrimaryVtx();
727 } // end loop on candidate
729 fCountReco+= icountReco;
730 fCountRecoAcc+= icountRecoAcc;
731 fCountRecoITSClusters+= icountRecoITSClusters;
732 fCountRecoPPR+= icountRecoPPR;
733 fCountRecoPID+= icountRecoPID;
735 fHistEventsProcessed->Fill(0);
737 delete[] containerInput;
738 delete[] containerInputMC;
741 // for (Int_t i=0; i<cfVtxHF->GetNProngs(); i++){
742 // delete [] trackCuts[i];
748 //___________________________________________________________________________
749 void AliCFTaskVertexingHF::Terminate(Option_t*)
751 // The Terminate() function is the last function to be called during
752 // a query. It always runs on the client, it can be used to present
753 // the results graphically or save the results to file.
755 AliAnalysisTaskSE::Terminate();
757 AliInfo(Form("Found %i MC particles that are %s in MC, in %d events",fCountMC,fPartName.Data(),fEvents));
758 AliInfo(Form("Found %i MC particles that are %s in MC and satisfy Acc cuts, in %d events",fCountAcc,fPartName.Data(),fEvents));
759 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));
760 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));
761 AliInfo(Form("Found %i reco %s that are decaying in %s, in %d events",fCountReco,fPartName.Data(),fDauNames.Data(),fEvents));
762 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));
763 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));
764 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));
765 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));
767 // draw some example plots....
769 AliCFContainer *cont= dynamic_cast<AliCFContainer*> (GetOutputData(2));
771 printf("CONTAINER NOT FOUND\n");
774 // projecting the containers to obtain histograms
775 // first argument = variable, second argument = step
778 for(Int_t iC=0;iC<12; iC++){
780 h[0][iC] = cont->ShowProjection(iC,0);
781 // MC-Acceptance level
782 h[1][iC] = cont->ShowProjection(iC,1);
784 h[2][iC] = cont->ShowProjection(iC,4);
787 if(fDecayChannel==31){
788 titles[0]="pT_Dplus (GeV/c)";
789 titles[1]="rapidity";
790 titles[2]="phi (rad)";
791 titles[3]="cT (#mum)";
792 titles[4]="cosPointingAngle";
793 titles[5]="pT_1 (GeV/c)";
794 titles[6]="pT_2 (GeV/c)";
795 titles[7]="pT_3 (GeV/c)";
796 titles[8]="d0_1 (#mum)";
797 titles[9]="d0_2 (#mum)";
798 titles[10]="d0_3 (#mum)";
799 titles[11]="zVertex (cm)";
801 titles[0]="pT_D0 (GeV/c)";
802 titles[1]="rapidity";
803 titles[2]="cosThetaStar";
804 titles[3]="pT_pi (GeV/c)";
805 titles[4]="pT_K (Gev/c)";
806 titles[5]="cT (#mum)";
807 titles[6]="dca (#mum)";
808 titles[7]="d0_pi (#mum)";
809 titles[8]="d0_K (#mum)";
810 titles[9]="d0xd0 (#mum^2)";
811 titles[10]="cosPointingAngle";
812 titles[11]="phi (rad)";
814 Int_t markers[12]={20,24,21,25,27,28,
816 Int_t colors[3]={2,8,4};
817 for(Int_t iC=0;iC<12; iC++){
818 for(Int_t iStep=0;iStep<3;iStep++){
819 h[iStep][iC]->SetTitle(titles[iC].Data());
820 h[iStep][iC]->GetXaxis()->SetTitle(titles[iC].Data());
821 Double_t maxh=h[iStep][iC]->GetMaximum();
822 h[iStep][iC]->GetYaxis()->SetRangeUser(0,maxh*1.2);
823 h[iStep][iC]->SetMarkerStyle(markers[iC]);
824 h[iStep][iC]->SetMarkerColor(colors[iStep]);
830 gStyle->SetCanvasColor(0);
831 gStyle->SetFrameFillColor(0);
832 gStyle->SetTitleFillColor(0);
833 gStyle->SetStatColor(0);
835 // drawing in 2 separate canvas for a matter of clearity
836 TCanvas * c1 =new TCanvas("c1New","Vars 0,1,2",1100,1600);
839 for(Int_t iVar=0; iVar<3; iVar++){
841 h[0][iVar]->Draw("p");
843 h[1][iVar]->Draw("p");
845 h[2][iVar]->Draw("p");
848 TCanvas * c2 =new TCanvas("c2New","Vars 3,4,5",1100,1600);
851 for(Int_t iVar=3; iVar<6; iVar++){
853 h[0][iVar]->Draw("p");
855 h[1][iVar]->Draw("p");
857 h[2][iVar]->Draw("p");
861 TCanvas * c3 =new TCanvas("c3New","Vars 6,7,8",1100,1600);
864 for(Int_t iVar=6; iVar<9; iVar++){
866 h[0][iVar]->Draw("p");
868 h[1][iVar]->Draw("p");
870 h[2][iVar]->Draw("p");
874 TCanvas * c4 =new TCanvas("c4New","Vars 9,10,11",1100,1600);
877 for(Int_t iVar=9; iVar<11; iVar++){
879 h[0][iVar]->Draw("p");
881 h[1][iVar]->Draw("p");
883 h[2][iVar]->Draw("p");
887 THnSparseD* hcorr = dynamic_cast<THnSparseD*> (GetOutputData(3));
889 TH2D* corr1 =hcorr->Projection(0,2);
890 TH2D* corr2 = hcorr->Projection(1,3);
892 TCanvas * c7 =new TCanvas("c7New","",800,400);
900 TFile* file_projection = new TFile("CFtaskHFprojectionNew.root","RECREATE");
904 for(Int_t iC=0;iC<12; iC++){
905 for(Int_t iStep=0;iStep<3;iStep++){
906 h[iStep][iC]->Write(Form("Step%d_%s",iStep,titles[iC].Data()));
909 file_projection->Close();
914 c1->SaveAs("Plots/pT_rapidity_cosThetaStar.eps");
915 c2->SaveAs("Plots/pTpi_pTK_cT.eps");
916 c3->SaveAs("Plots/dca_d0pi_d0TK.eps");
917 c4->SaveAs("Plots/d0xd0_cosPointingAngle.eps");
919 c1->SaveAs("Plots/pT_rapidity_cosThetaStar.gif");
920 c2->SaveAs("Plots/pTpi_pTK_cT.gif");
921 c3->SaveAs("Plots/dca_d0pi_d0TK.gif");
922 c4->SaveAs("Plots/d0xd0_cosPointingAngle.gif");
926 //___________________________________________________________________________
927 void AliCFTaskVertexingHF::UserCreateOutputObjects()
929 //HERE ONE CAN CREATE OUTPUT OBJECTS, IN PARTICULAR IF THE OBJECT PARAMETERS DON'T NEED
930 //TO BE SET BEFORE THE EXECUTION OF THE TASK
932 Info("UserCreateOutputObjects","CreateOutputObjects of task %s\n", GetName());
936 fHistEventsProcessed = new TH1I("CFHFchist0","",1,0,1) ;
940 //_________________________________________________________________________
941 Double_t AliCFTaskVertexingHF::GetWeight(Float_t pt)
944 // calculating the weight to fill the container
948 // p0 = 1.63297e-01 --> 0.322643
954 // p0 = 1.85906e-01 --> 0.36609
959 Double_t func1[4] = {0.322643,2.96275,2.30301,2.5};
960 Double_t func2[4] = {0.36609,1.94635,1.40463,2.5};
962 Double_t dndpt_func1 = dNdptFit(pt,func1);
963 Double_t dndpt_func2 = dNdptFit(pt,func2);
964 AliDebug(2,Form("pt = %f, FONLL = %f, Pythia = %f, ratio = %f",pt,dndpt_func1,dndpt_func2,dndpt_func1/dndpt_func2));
965 return dndpt_func1/dndpt_func2;
968 //__________________________________________________________________________________________________
969 Double_t AliCFTaskVertexingHF::dNdptFit(Float_t pt, Double_t* par)
975 Double_t denom = TMath::Power((pt/par[1]), par[3] );
976 Double_t dNdpt = par[0]*pt/TMath::Power(1.+denom, par[2]);