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 "AliCFVertexingHF.h"
71 #include "AliAnalysisDataSlot.h"
72 #include "AliAnalysisDataContainer.h"
74 //__________________________________________________________________________
75 AliCFTaskVertexingHF::AliCFTaskVertexingHF() :
78 fHistEventsProcessed(0x0),
86 fCountRecoITSClusters(0),
91 fFillFromGenerated(kFALSE),
93 fAcceptanceUnf(kTRUE),
105 //___________________________________________________________________________
106 AliCFTaskVertexingHF::AliCFTaskVertexingHF(const Char_t* name, AliRDHFCuts* cuts) :
107 AliAnalysisTaskSE(name),
109 fHistEventsProcessed(0x0),
117 fCountRecoITSClusters(0),
122 fFillFromGenerated(kFALSE),
123 fOriginDselection(0),
124 fAcceptanceUnf(kTRUE),
133 // Constructor. Initialization of Inputs and Outputs
136 DefineInput(0) and DefineOutput(0)
137 are taken care of by AliAnalysisTaskSE constructor
139 DefineOutput(1,TH1I::Class());
140 DefineOutput(2,AliCFContainer::Class());
141 DefineOutput(3,THnSparseD::Class());
142 DefineOutput(4,AliRDHFCuts::Class());
147 //___________________________________________________________________________
148 AliCFTaskVertexingHF& AliCFTaskVertexingHF::operator=(const AliCFTaskVertexingHF& c)
151 // Assignment operator
154 AliAnalysisTaskSE::operator=(c) ;
155 fCFManager = c.fCFManager;
156 fHistEventsProcessed = c.fHistEventsProcessed;
162 //___________________________________________________________________________
163 AliCFTaskVertexingHF::AliCFTaskVertexingHF(const AliCFTaskVertexingHF& c) :
164 AliAnalysisTaskSE(c),
165 fCFManager(c.fCFManager),
166 fHistEventsProcessed(c.fHistEventsProcessed),
167 fCorrelation(c.fCorrelation),
168 fCountMC(c.fCountMC),
169 fCountAcc(c.fCountAcc),
170 fCountVertex(c.fCountVertex),
171 fCountRefit(c.fCountRefit),
172 fCountReco(c.fCountReco),
173 fCountRecoAcc(c.fCountRecoAcc),
174 fCountRecoITSClusters(c.fCountRecoITSClusters),
175 fCountRecoPPR(c.fCountRecoPPR),
176 fCountRecoPID(c.fCountRecoPID),
178 fDecayChannel(c.fDecayChannel),
179 fFillFromGenerated(c.fFillFromGenerated),
180 fOriginDselection(c.fOriginDselection),
181 fAcceptanceUnf(c.fAcceptanceUnf),
183 fUseWeight(c.fUseWeight),
186 fPartName(c.fPartName),
187 fDauNames(c.fDauNames)
194 //___________________________________________________________________________
195 AliCFTaskVertexingHF::~AliCFTaskVertexingHF()
200 if (fCFManager) delete fCFManager ;
201 if (fHistEventsProcessed) delete fHistEventsProcessed ;
202 if (fCorrelation) delete fCorrelation ;
203 if (fCuts) delete fCuts;
206 //_________________________________________________________________________-
207 void AliCFTaskVertexingHF::Init()
213 if (fDebug>1) printf("AliCFTaskVertexingHF::Init()");
214 AliRDHFCuts *copyfCuts = 0x0;
216 switch (fDecayChannel){
218 copyfCuts = new AliRDHFCutsD0toKpi(*(dynamic_cast<AliRDHFCutsD0toKpi*>(fCuts)));
225 copyfCuts = new AliRDHFCutsDStartoKpipi(*(dynamic_cast<AliRDHFCutsDStartoKpipi*>(fCuts)));
232 copyfCuts = new AliRDHFCutsDplustoKpipi(*(dynamic_cast<AliRDHFCutsDplustoKpipi*>(fCuts)));
239 copyfCuts = new AliRDHFCutsLctopKpi(*(dynamic_cast<AliRDHFCutsLctopKpi*>(fCuts)));
246 copyfCuts = new AliRDHFCutsDstoKKpi(*(dynamic_cast<AliRDHFCutsDstoKKpi*>(fCuts)));
253 copyfCuts = new AliRDHFCutsD0toKpipipi(*(dynamic_cast<AliRDHFCutsD0toKpipipi*>(fCuts)));
256 fDauNames="K+pi+pi+pi";
260 AliFatal("The decay channel MUST be defined according to AliCFVertexing::DecayChannel - Exiting...");
264 const char* nameoutput=GetOutputSlot(4)->GetContainer()->GetName();
265 copyfCuts->SetName(nameoutput);
268 PostData(4, copyfCuts);
273 //_________________________________________________
274 void AliCFTaskVertexingHF::UserExec(Option_t *)
277 // Main loop function
280 PostData(1,fHistEventsProcessed) ;
281 PostData(2,fCFManager->GetParticleContainer()) ;
282 PostData(3,fCorrelation) ;
284 AliESDtrackCuts* trackCuts = fCuts->GetTrackCuts();
286 if (fFillFromGenerated){
287 AliWarning("Flag to fill container with generated value ON ---> dca, d0pi, d0K, d0xd0, cosPointingAngle will be set as dummy!");
291 Error("UserExec","NO EVENT FOUND!");
295 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
297 TClonesArray *arrayBranch=0;
299 if(!aodEvent && AODEvent() && IsStandardAOD()) {
300 // In case there is an AOD handler writing a standard AOD, use the AOD
301 // event in memory rather than the input (ESD) event.
302 aodEvent = dynamic_cast<AliAODEvent*> (AODEvent());
303 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
304 // have to taken from the AOD event hold by the AliAODExtension
305 AliAODHandler* aodHandler = (AliAODHandler*)
306 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
307 if(aodHandler->GetExtensions()) {
308 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
309 AliAODEvent *aodFromExt = ext->GetAOD();
311 switch (fDecayChannel){
313 arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("D0toKpi");
317 arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("Dstar");
323 arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
327 arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm4Prong");
336 switch (fDecayChannel){
338 arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("D0toKpi");
342 arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("Dstar");
348 arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("Charm3Prong");
352 arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("Charm4Prong");
360 AliAODVertex *aodVtx = (AliAODVertex*)aodEvent->GetPrimaryVertex();
364 AliError("Could not find array of HF vertices");
370 fCFManager->SetRecEventInfo(aodEvent);
371 fCFManager->SetMCEventInfo(aodEvent);
373 //******** DEFINE number of variables of the container***** for now set at 13, in the future in the config macro.
375 Double_t* containerInput = new Double_t[fNvar];
376 Double_t* containerInputMC = new Double_t[fNvar];
378 //loop on the MC event
380 TClonesArray* mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
382 AliError("Could not find Monte-Carlo in AOD");
387 Int_t icountReco = 0;
388 Int_t icountVertex = 0;
389 Int_t icountRefit = 0;
390 Int_t icountRecoAcc = 0;
391 Int_t icountRecoITSClusters = 0;
392 Int_t icountRecoPPR = 0;
393 Int_t icountRecoPID = 0;
396 AliAODMCHeader *mcHeader = dynamic_cast<AliAODMCHeader*>(aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
398 AliError("Could not find MC Header in AOD");
402 AliCFVertexingHF* cfVtxHF=0x0;
403 switch (fDecayChannel){
405 cfVtxHF = new AliCFVertexingHF2Prong(mcArray, fOriginDselection);
409 // cfVtxHF = new AliCFVertexingHFCascade(mcArray, originDselection); // not there yet
415 cfVtxHF = new AliCFVertexingHF3Prong(mcArray, fOriginDselection, fDecayChannel);
419 //cfVtxHF = new AliCFVertexingHF4Prong(mcArray, originDselection); // not there yet
426 Double_t zPrimVertex = aodVtx ->GetZ();
427 Double_t zMCVertex = mcHeader->GetVtxZ();
429 //General settings: vertex, feed down and fill reco container with generated values.
430 cfVtxHF->SetRecoPrimVertex(zPrimVertex);
431 cfVtxHF->SetMCPrimaryVertex(zMCVertex);
432 cfVtxHF->SetFillFromGenerated(fFillFromGenerated);
434 for (Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) {
436 AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(mcArray->At(iPart));
438 // check the MC-level cuts, must be the desidered particle
439 if (!fCFManager->CheckParticleCuts(0, mcPart)) continue; // 0 stands for MC level
441 cfVtxHF->SetMCCandidateParam(iPart);
442 cfVtxHF->SetNVar(fNvar);
444 cquarks += cfVtxHF->MCcquarkCounting(mcPart);
446 if (!(cfVtxHF->SetLabelArray())){
447 AliDebug(2,Form("Impossible to set the label array (decaychannel = %d)",fDecayChannel));
451 //check the candiate family at MC level
452 if (!(cfVtxHF->CheckMCPartFamily(mcPart, mcArray))) {
453 AliDebug(2,Form("Check on the family wrong!!! (decaychannel = %d)",fDecayChannel));
457 AliDebug(2,Form("Check on the family OK!!! (decaychannel = %d)",fDecayChannel));
460 //Fill the MC container
461 Bool_t mcContainerFilled = cfVtxHF -> FillMCContainer(containerInputMC);
462 if (mcContainerFilled) {
463 if (fUseWeight)fWeight = GetWeight(containerInputMC[0]);
464 if (!fCuts->IsInFiducialAcceptance(containerInputMC[0],containerInputMC[1])) continue;
465 //MC Limited Acceptance
466 if (TMath::Abs(containerInputMC[1]) < 0.5) {
467 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepGeneratedLimAcc, fWeight);
468 AliDebug(3,"MC Lim Acc container filled\n");
472 fCFManager->GetParticleContainer()->Fill(containerInputMC, kStepGenerated, fWeight);
474 AliDebug(3,"MC cointainer filled \n");
477 // check the MC-Acceptance level cuts
478 // since standard CF functions are not applicable, using Kine Cuts on daughters
479 Bool_t mcAccepStep = cfVtxHF-> MCAcceptanceStep();
481 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepAcceptance, fWeight);
482 AliDebug(3,"MC acceptance cut passed\n");
486 if (fCuts->IsEventSelected(aodEvent)){
487 // filling the container if the vertex is ok
488 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepVertex, fWeight) ;
489 AliDebug(3,"Vertex cut passed and container filled\n");
492 //mc Refit requirement
493 Bool_t mcRefitStep = cfVtxHF->MCRefitStep(aodEvent, trackCuts);
495 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepRefit, fWeight);
496 AliDebug(3,"MC Refit cut passed and container filled\n");
500 AliDebug(3,"MC Refit cut not passed\n");
505 AliDebug (3, "MC vertex step not passed\n");
510 AliDebug (3, "MC in acceptance step not passed\n");
515 AliDebug (3, "MC container not filled\n");
519 if (cquarks<2) AliDebug(2,Form("Event with %d c-quarks", cquarks));
520 AliDebug(2,Form("Found %i MC particles that are %s!!",icountMC,fPartName.Data()));
521 AliDebug(2,Form("Found %i MC particles that are %s and satisfy Acc cuts!!",icountAcc,fPartName.Data()));
522 AliDebug(2,Form("Found %i MC particles that are %s and satisfy Vertex cuts!!",icountVertex,fPartName.Data()));
523 AliDebug(2,Form("Found %i MC particles that are %s and satisfy Refit cuts!!",icountRefit,fPartName.Data()));
525 // Now go to rec level
526 fCountMC += icountMC;
527 fCountAcc += icountAcc;
528 fCountVertex+= icountVertex;
529 fCountRefit+= icountRefit;
531 AliDebug(2,Form("Found %d vertices for decay channel %d",arrayBranch->GetEntriesFast(),fDecayChannel));
533 for(Int_t iCandid = 0; iCandid<arrayBranch->GetEntriesFast();iCandid++){
534 AliAODRecoDecayHF* charmCandidate=0x0;
535 switch (fDecayChannel){
537 charmCandidate = (AliAODRecoDecayHF2Prong*)arrayBranch->At(iCandid);
541 charmCandidate = (AliAODRecoCascadeHF*)arrayBranch->At(iCandid);
547 charmCandidate = (AliAODRecoDecayHF3Prong*)arrayBranch->At(iCandid);
551 charmCandidate = (AliAODRecoDecayHF4Prong*)arrayBranch->At(iCandid);
558 Bool_t unsetvtx=kFALSE;
559 if(!charmCandidate->GetOwnPrimaryVtx()) {
560 charmCandidate->SetOwnPrimaryVtx(aodVtx); // needed to compute all variables
564 Bool_t signAssociation = cfVtxHF->SetRecoCandidateParam((AliAODRecoDecayHF*)charmCandidate);
565 if (!signAssociation){
566 charmCandidate = 0x0;
570 Int_t isPartOrAntipart = cfVtxHF->CheckReflexion();
571 Bool_t recoContFilled = cfVtxHF->FillRecoContainer(containerInput);
574 if (!fCuts->IsInFiducialAcceptance(containerInput[0],containerInput[1])) continue;
577 Bool_t recoStep = cfVtxHF->RecoStep();
578 Bool_t vtxCheck = fCuts->IsEventSelected(aodEvent);
580 if (recoStep && recoContFilled && vtxCheck){
581 fCFManager->GetParticleContainer()->Fill(containerInput,kStepReconstructed, fWeight) ;
583 AliDebug(3,"Reco step passed and container filled\n");
585 //Reco in the acceptance -- take care of UNFOLDING!!!!
586 Bool_t recoAcceptanceStep = cfVtxHF->RecoAcceptStep(trackCuts);
587 if (recoAcceptanceStep) {
588 fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoAcceptance, fWeight) ;
590 AliDebug(3,"Reco acceptance cut passed and container filled\n");
593 Double_t fill[4]; //fill response matrix
594 Bool_t bUnfolding = cfVtxHF -> FillUnfoldingMatrix(fill);
595 if (bUnfolding) fCorrelation->Fill(fill);
598 //Number of ITS cluster requirements
599 Int_t recoITSnCluster = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kTracks);
600 if (recoITSnCluster){
601 fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoITSClusters, fWeight) ;
602 icountRecoITSClusters++;
603 AliDebug(3,"Reco n ITS cluster cut passed and container filled\n");
605 Bool_t iscutsusingpid = fCuts->GetIsUsePID();
606 Int_t recoAnalysisCuts = -1, recoPidSelection = -1;
607 fCuts->SetUsePID(kFALSE);
608 recoAnalysisCuts = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kCandidate, aodEvent);
610 if (recoAnalysisCuts > 3){ // Ds case, where more possibilities are considered
611 if (recoAnalysisCuts >= 8){
612 recoAnalysisCuts -= 8; // removing K0star mass
614 if (recoAnalysisCuts >= 4){
615 recoAnalysisCuts -= 4; // removing Phi mass
619 fCuts->SetUsePID(iscutsusingpid); //restoring usage of the PID from the cuts object
620 if (recoAnalysisCuts == 3 || recoAnalysisCuts == isPartOrAntipart){
621 fCFManager->GetParticleContainer()->Fill(containerInput, kStepRecoPPR, fWeight);
623 AliDebug(3,"Reco Analysis cuts passed and container filled \n");
625 //recoPidSelection = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kPID);
626 //if((fCuts->CombineSelectionLevels(3,recoAnalysisCuts,recoPidSelection)==isPartOrAntipart)||(fCuts->CombineSelectionLevels(3,recoAnalysisCuts,recoPidSelection)==3)){
627 recoPidSelection = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kCandidate, aodEvent);
628 if (recoPidSelection == 3 || recoPidSelection == isPartOrAntipart){
629 fCFManager->GetParticleContainer()->Fill(containerInput, kStepRecoPID, fWeight);
631 AliDebug(3,"Reco PID cuts passed and container filled \n");
633 Double_t fill[4]; //fill response matrix
634 Bool_t bUnfolding = cfVtxHF -> FillUnfoldingMatrix(fill);
635 if (bUnfolding) fCorrelation->Fill(fill);
639 AliDebug(3, "Analysis Cuts step not passed \n");
644 AliDebug(3, "PID selection not passed \n");
649 AliDebug(3, "Number of ITS cluster step not passed\n");
654 AliDebug(3, "Reco acceptance step not passed\n");
659 AliDebug(3, "Reco step not passed\n");
664 if(unsetvtx) charmCandidate->UnsetOwnPrimaryVtx();
665 } // end loop on candidate
667 fCountReco+= icountReco;
668 fCountRecoAcc+= icountRecoAcc;
669 fCountRecoITSClusters+= icountRecoITSClusters;
670 fCountRecoPPR+= icountRecoPPR;
671 fCountRecoPID+= icountRecoPID;
673 fHistEventsProcessed->Fill(0);
675 delete[] containerInput;
676 containerInput = 0x0;
677 delete[] containerInputMC;
678 containerInputMC = 0x0;
683 //___________________________________________________________________________
684 void AliCFTaskVertexingHF::Terminate(Option_t*)
686 // The Terminate() function is the last function to be called during
687 // a query. It always runs on the client, it can be used to present
688 // the results graphically or save the results to file.
690 AliAnalysisTaskSE::Terminate();
692 AliInfo(Form("Found %i MC particles that are %s in MC, in %d events",fCountMC,fPartName.Data(),fEvents));
693 AliInfo(Form("Found %i MC particles that are %s in MC and satisfy Acc cuts, in %d events",fCountAcc,fPartName.Data(),fEvents));
694 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));
695 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));
696 AliInfo(Form("Found %i reco %s that are decaying in %s, in %d events",fCountReco,fPartName.Data(),fDauNames.Data(),fEvents));
697 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));
698 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));
699 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));
700 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));
702 // draw some example plots....
704 AliCFContainer *cont= dynamic_cast<AliCFContainer*> (GetOutputData(2));
706 printf("CONTAINER NOT FOUND\n");
709 // projecting the containers to obtain histograms
710 // first argument = variable, second argument = step
713 for(Int_t iC=0;iC<12; iC++){
715 h[0][iC] = cont->ShowProjection(iC,0);
716 // MC-Acceptance level
717 h[1][iC] = cont->ShowProjection(iC,1);
719 h[2][iC] = cont->ShowProjection(iC,4);
722 if(fDecayChannel==31){
723 titles[0]="pT_Dplus (GeV/c)";
724 titles[1]="rapidity";
725 titles[2]="phi (rad)";
726 titles[3]="cT (#mum)";
727 titles[4]="cosPointingAngle";
728 titles[5]="pT_1 (GeV/c)";
729 titles[6]="pT_2 (GeV/c)";
730 titles[7]="pT_3 (GeV/c)";
731 titles[8]="d0_1 (#mum)";
732 titles[9]="d0_2 (#mum)";
733 titles[10]="d0_3 (#mum)";
734 titles[11]="zVertex (cm)";
736 titles[0]="pT_D0 (GeV/c)";
737 titles[1]="rapidity";
738 titles[2]="cosThetaStar";
739 titles[3]="pT_pi (GeV/c)";
740 titles[4]="pT_K (Gev/c)";
741 titles[5]="cT (#mum)";
742 titles[6]="dca (#mum)";
743 titles[7]="d0_pi (#mum)";
744 titles[8]="d0_K (#mum)";
745 titles[9]="d0xd0 (#mum^2)";
746 titles[10]="cosPointingAngle";
747 titles[11]="phi (rad)";
749 Int_t markers[12]={20,24,21,25,27,28,
751 Int_t colors[3]={2,8,4};
752 for(Int_t iC=0;iC<12; iC++){
753 for(Int_t iStep=0;iStep<3;iStep++){
754 h[iStep][iC]->SetTitle(titles[iC].Data());
755 h[iStep][iC]->GetXaxis()->SetTitle(titles[iC].Data());
756 Double_t maxh=h[iStep][iC]->GetMaximum();
757 h[iStep][iC]->GetYaxis()->SetRangeUser(0,maxh*1.2);
758 h[iStep][iC]->SetMarkerStyle(markers[iC]);
759 h[iStep][iC]->SetMarkerColor(colors[iStep]);
765 gStyle->SetCanvasColor(0);
766 gStyle->SetFrameFillColor(0);
767 gStyle->SetTitleFillColor(0);
768 gStyle->SetStatColor(0);
770 // drawing in 2 separate canvas for a matter of clearity
771 TCanvas * c1 =new TCanvas("c1New","Vars 0,1,2",1100,1600);
774 for(Int_t iVar=0; iVar<3; iVar++){
776 h[0][iVar]->Draw("p");
778 h[1][iVar]->Draw("p");
780 h[2][iVar]->Draw("p");
783 TCanvas * c2 =new TCanvas("c2New","Vars 3,4,5",1100,1600);
786 for(Int_t iVar=3; iVar<6; iVar++){
788 h[0][iVar]->Draw("p");
790 h[1][iVar]->Draw("p");
792 h[2][iVar]->Draw("p");
796 TCanvas * c3 =new TCanvas("c3New","Vars 6,7,8",1100,1600);
799 for(Int_t iVar=6; iVar<9; iVar++){
801 h[0][iVar]->Draw("p");
803 h[1][iVar]->Draw("p");
805 h[2][iVar]->Draw("p");
809 TCanvas * c4 =new TCanvas("c4New","Vars 9,10,11",1100,1600);
812 for(Int_t iVar=9; iVar<11; iVar++){
814 h[0][iVar]->Draw("p");
816 h[1][iVar]->Draw("p");
818 h[2][iVar]->Draw("p");
822 THnSparseD* hcorr = dynamic_cast<THnSparseD*> (GetOutputData(3));
824 TH2D* corr1 =hcorr->Projection(0,2);
825 TH2D* corr2 = hcorr->Projection(1,3);
827 TCanvas * c7 =new TCanvas("c7New","",800,400);
835 TFile* file_projection = new TFile("CFtaskHFprojectionNew.root","RECREATE");
839 for(Int_t iC=0;iC<12; iC++){
840 for(Int_t iStep=0;iStep<3;iStep++){
841 h[iStep][iC]->Write(Form("Step%d_%s",iStep,titles[iC].Data()));
844 file_projection->Close();
849 c1->SaveAs("Plots/pT_rapidity_cosThetaStar.eps");
850 c2->SaveAs("Plots/pTpi_pTK_cT.eps");
851 c3->SaveAs("Plots/dca_d0pi_d0TK.eps");
852 c4->SaveAs("Plots/d0xd0_cosPointingAngle.eps");
854 c1->SaveAs("Plots/pT_rapidity_cosThetaStar.gif");
855 c2->SaveAs("Plots/pTpi_pTK_cT.gif");
856 c3->SaveAs("Plots/dca_d0pi_d0TK.gif");
857 c4->SaveAs("Plots/d0xd0_cosPointingAngle.gif");
861 //___________________________________________________________________________
862 void AliCFTaskVertexingHF::UserCreateOutputObjects()
864 //HERE ONE CAN CREATE OUTPUT OBJECTS, IN PARTICULAR IF THE OBJECT PARAMETERS DON'T NEED
865 //TO BE SET BEFORE THE EXECUTION OF THE TASK
867 Info("UserCreateOutputObjects","CreateOutputObjects of task %s\n", GetName());
871 fHistEventsProcessed = new TH1I("CFHFchist0","",1,0,1) ;
875 //_________________________________________________________________________
876 Double_t AliCFTaskVertexingHF::GetWeight(Float_t pt)
879 // calculating the weight to fill the container
883 // p0 = 1.63297e-01 --> 0.322643
889 // p0 = 1.85906e-01 --> 0.36609
894 Double_t func1[4] = {0.322643,2.96275,2.30301,2.5};
895 Double_t func2[4] = {0.36609,1.94635,1.40463,2.5};
897 Double_t dndpt_func1 = dNdptFit(pt,func1);
898 Double_t dndpt_func2 = dNdptFit(pt,func2);
899 AliDebug(2,Form("pt = %f, FONLL = %f, Pythia = %f, ratio = %f",pt,dndpt_func1,dndpt_func2,dndpt_func1/dndpt_func2));
900 return dndpt_func1/dndpt_func2;
903 //__________________________________________________________________________________________________
904 Double_t AliCFTaskVertexingHF::dNdptFit(Float_t pt, Double_t* par)
910 Double_t denom = TMath::Power((pt/par[1]), par[3] );
911 Double_t dNdpt = par[0]*pt/TMath::Power(1.+denom, par[2]);