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),
106 //___________________________________________________________________________
107 AliCFTaskVertexingHF::AliCFTaskVertexingHF(const Char_t* name, AliRDHFCuts* cuts) :
108 AliAnalysisTaskSE(name),
110 fHistEventsProcessed(0x0),
118 fCountRecoITSClusters(0),
123 fFillFromGenerated(kFALSE),
124 fOriginDselection(0),
125 fAcceptanceUnf(kTRUE),
135 // Constructor. Initialization of Inputs and Outputs
138 DefineInput(0) and DefineOutput(0)
139 are taken care of by AliAnalysisTaskSE constructor
141 DefineOutput(1,TH1I::Class());
142 DefineOutput(2,AliCFContainer::Class());
143 DefineOutput(3,THnSparseD::Class());
144 DefineOutput(4,AliRDHFCuts::Class());
149 //___________________________________________________________________________
150 AliCFTaskVertexingHF& AliCFTaskVertexingHF::operator=(const AliCFTaskVertexingHF& c)
153 // Assignment operator
156 AliAnalysisTaskSE::operator=(c) ;
157 fCFManager = c.fCFManager;
158 fHistEventsProcessed = c.fHistEventsProcessed;
164 //___________________________________________________________________________
165 AliCFTaskVertexingHF::AliCFTaskVertexingHF(const AliCFTaskVertexingHF& c) :
166 AliAnalysisTaskSE(c),
167 fCFManager(c.fCFManager),
168 fHistEventsProcessed(c.fHistEventsProcessed),
169 fCorrelation(c.fCorrelation),
170 fCountMC(c.fCountMC),
171 fCountAcc(c.fCountAcc),
172 fCountVertex(c.fCountVertex),
173 fCountRefit(c.fCountRefit),
174 fCountReco(c.fCountReco),
175 fCountRecoAcc(c.fCountRecoAcc),
176 fCountRecoITSClusters(c.fCountRecoITSClusters),
177 fCountRecoPPR(c.fCountRecoPPR),
178 fCountRecoPID(c.fCountRecoPID),
180 fDecayChannel(c.fDecayChannel),
181 fFillFromGenerated(c.fFillFromGenerated),
182 fOriginDselection(c.fOriginDselection),
183 fAcceptanceUnf(c.fAcceptanceUnf),
185 fUseWeight(c.fUseWeight),
188 fPartName(c.fPartName),
189 fDauNames(c.fDauNames),
197 //___________________________________________________________________________
198 AliCFTaskVertexingHF::~AliCFTaskVertexingHF()
203 if (fCFManager) delete fCFManager ;
204 if (fHistEventsProcessed) delete fHistEventsProcessed ;
205 if (fCorrelation) delete fCorrelation ;
206 if (fCuts) delete fCuts;
209 //_________________________________________________________________________-
210 void AliCFTaskVertexingHF::Init()
216 if (fDebug>1) printf("AliCFTaskVertexingHF::Init()");
217 AliRDHFCuts *copyfCuts = 0x0;
219 AliFatal("No cuts defined - Exiting...");
223 switch (fDecayChannel){
225 copyfCuts = new AliRDHFCutsD0toKpi(*(dynamic_cast<AliRDHFCutsD0toKpi*>(fCuts)));
232 copyfCuts = new AliRDHFCutsDStartoKpipi(*(dynamic_cast<AliRDHFCutsDStartoKpipi*>(fCuts)));
239 copyfCuts = new AliRDHFCutsDplustoKpipi(*(dynamic_cast<AliRDHFCutsDplustoKpipi*>(fCuts)));
246 copyfCuts = new AliRDHFCutsLctopKpi(*(dynamic_cast<AliRDHFCutsLctopKpi*>(fCuts)));
253 copyfCuts = new AliRDHFCutsDstoKKpi(*(dynamic_cast<AliRDHFCutsDstoKKpi*>(fCuts)));
260 copyfCuts = new AliRDHFCutsD0toKpipipi(*(dynamic_cast<AliRDHFCutsD0toKpipipi*>(fCuts)));
263 fDauNames="K+pi+pi+pi";
267 AliFatal("The decay channel MUST be defined according to AliCFVertexing::DecayChannel - Exiting...");
271 const char* nameoutput=GetOutputSlot(4)->GetContainer()->GetName();
273 copyfCuts->SetName(nameoutput);
276 PostData(4, copyfCuts);
279 AliFatal("Failing initializing AliRDHFCuts object - Exiting...");
285 //_________________________________________________
286 void AliCFTaskVertexingHF::UserExec(Option_t *)
289 // Main loop function
292 PostData(1,fHistEventsProcessed) ;
293 PostData(2,fCFManager->GetParticleContainer()) ;
294 PostData(3,fCorrelation) ;
296 AliESDtrackCuts* trackCuts = fCuts->GetTrackCuts();
298 if (fFillFromGenerated){
299 AliWarning("Flag to fill container with generated value ON ---> dca, d0pi, d0K, d0xd0, cosPointingAngle will be set as dummy!");
303 Error("UserExec","NO EVENT FOUND!");
307 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
309 TClonesArray *arrayBranch=0;
311 if(!aodEvent && AODEvent() && IsStandardAOD()) {
312 // In case there is an AOD handler writing a standard AOD, use the AOD
313 // event in memory rather than the input (ESD) event.
314 aodEvent = dynamic_cast<AliAODEvent*> (AODEvent());
315 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
316 // have to taken from the AOD event hold by the AliAODExtension
317 AliAODHandler* aodHandler = (AliAODHandler*)
318 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
319 if(aodHandler->GetExtensions()) {
320 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
321 AliAODEvent *aodFromExt = ext->GetAOD();
323 switch (fDecayChannel){
325 arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("D0toKpi");
329 arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("Dstar");
335 arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
339 arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm4Prong");
348 switch (fDecayChannel){
350 arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("D0toKpi");
354 arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("Dstar");
360 arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("Charm3Prong");
364 arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("Charm4Prong");
372 AliAODVertex *aodVtx = (AliAODVertex*)aodEvent->GetPrimaryVertex();
376 AliError("Could not find array of HF vertices");
382 fCFManager->SetRecEventInfo(aodEvent);
383 fCFManager->SetMCEventInfo(aodEvent);
385 //******** DEFINE number of variables of the container***** for now set at 13, in the future in the config macro.
387 //loop on the MC event
389 TClonesArray* mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
391 AliError("Could not find Monte-Carlo in AOD");
396 Int_t icountReco = 0;
397 Int_t icountVertex = 0;
398 Int_t icountRefit = 0;
399 Int_t icountRecoAcc = 0;
400 Int_t icountRecoITSClusters = 0;
401 Int_t icountRecoPPR = 0;
402 Int_t icountRecoPID = 0;
405 AliAODMCHeader *mcHeader = dynamic_cast<AliAODMCHeader*>(aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
407 AliError("Could not find MC Header in AOD");
411 Double_t* containerInput = new Double_t[fNvar];
412 Double_t* containerInputMC = new Double_t[fNvar];
415 AliCFVertexingHF* cfVtxHF=0x0;
416 switch (fDecayChannel){
418 cfVtxHF = new AliCFVertexingHF2Prong(mcArray, fOriginDselection);
422 // cfVtxHF = new AliCFVertexingHFCascade(mcArray, originDselection); // not there yet
428 cfVtxHF = new AliCFVertexingHF3Prong(mcArray, fOriginDselection, fDecayChannel);
432 //cfVtxHF = new AliCFVertexingHF4Prong(mcArray, originDselection); // not there yet
439 AliError("No AliCFVertexingHF initialized");
440 delete[] containerInput;
441 delete[] containerInputMC;
445 Double_t zPrimVertex = aodVtx ->GetZ();
446 Double_t zMCVertex = mcHeader->GetVtxZ();
448 //General settings: vertex, feed down and fill reco container with generated values.
449 cfVtxHF->SetRecoPrimVertex(zPrimVertex);
450 cfVtxHF->SetMCPrimaryVertex(zMCVertex);
451 cfVtxHF->SetFillFromGenerated(fFillFromGenerated);
453 for (Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) {
455 AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(mcArray->At(iPart));
457 AliError("Failed casting particle from MC array!, Skipping particle");
460 // check the MC-level cuts, must be the desidered particle
461 if (!fCFManager->CheckParticleCuts(0, mcPart)) continue; // 0 stands for MC level
463 cfVtxHF->SetMCCandidateParam(iPart);
464 cfVtxHF->SetNVar(fNvar);
466 cquarks += cfVtxHF->MCcquarkCounting(mcPart);
468 if (!(cfVtxHF->SetLabelArray())){
469 AliDebug(2,Form("Impossible to set the label array (decaychannel = %d)",fDecayChannel));
473 //check the candiate family at MC level
474 if (!(cfVtxHF->CheckMCPartFamily(mcPart, mcArray))) {
475 AliDebug(2,Form("Check on the family wrong!!! (decaychannel = %d)",fDecayChannel));
479 AliDebug(2,Form("Check on the family OK!!! (decaychannel = %d)",fDecayChannel));
482 //Fill the MC container
483 Bool_t mcContainerFilled = cfVtxHF -> FillMCContainer(containerInputMC);
484 if (mcContainerFilled) {
485 if (fUseWeight)fWeight = GetWeight(containerInputMC[0]);
486 if (!fCuts->IsInFiducialAcceptance(containerInputMC[0],containerInputMC[1])) continue;
487 //MC Limited Acceptance
488 if (TMath::Abs(containerInputMC[1]) < 0.5) {
489 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepGeneratedLimAcc, fWeight);
490 AliDebug(3,"MC Lim Acc container filled\n");
494 fCFManager->GetParticleContainer()->Fill(containerInputMC, kStepGenerated, fWeight);
496 AliDebug(3,"MC cointainer filled \n");
499 // check the MC-Acceptance level cuts
500 // since standard CF functions are not applicable, using Kine Cuts on daughters
501 Bool_t mcAccepStep = cfVtxHF-> MCAcceptanceStep();
503 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepAcceptance, fWeight);
504 AliDebug(3,"MC acceptance cut passed\n");
508 if (fCuts->IsEventSelected(aodEvent)){
509 // filling the container if the vertex is ok
510 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepVertex, fWeight) ;
511 AliDebug(3,"Vertex cut passed and container filled\n");
514 //mc Refit requirement
515 Bool_t mcRefitStep = cfVtxHF->MCRefitStep(aodEvent, trackCuts);
517 fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepRefit, fWeight);
518 AliDebug(3,"MC Refit cut passed and container filled\n");
522 AliDebug(3,"MC Refit cut not passed\n");
527 AliDebug (3, "MC vertex step not passed\n");
532 AliDebug (3, "MC in acceptance step not passed\n");
537 AliDebug (3, "MC container not filled\n");
541 if (cquarks<2) AliDebug(2,Form("Event with %d c-quarks", cquarks));
542 AliDebug(2,Form("Found %i MC particles that are %s!!",icountMC,fPartName.Data()));
543 AliDebug(2,Form("Found %i MC particles that are %s and satisfy Acc cuts!!",icountAcc,fPartName.Data()));
544 AliDebug(2,Form("Found %i MC particles that are %s and satisfy Vertex cuts!!",icountVertex,fPartName.Data()));
545 AliDebug(2,Form("Found %i MC particles that are %s and satisfy Refit cuts!!",icountRefit,fPartName.Data()));
547 // Now go to rec level
548 fCountMC += icountMC;
549 fCountAcc += icountAcc;
550 fCountVertex+= icountVertex;
551 fCountRefit+= icountRefit;
553 AliDebug(2,Form("Found %d vertices for decay channel %d",arrayBranch->GetEntriesFast(),fDecayChannel));
555 for(Int_t iCandid = 0; iCandid<arrayBranch->GetEntriesFast();iCandid++){
556 AliAODRecoDecayHF* charmCandidate=0x0;
557 switch (fDecayChannel){
559 charmCandidate = (AliAODRecoDecayHF2Prong*)arrayBranch->At(iCandid);
563 charmCandidate = (AliAODRecoCascadeHF*)arrayBranch->At(iCandid);
569 charmCandidate = (AliAODRecoDecayHF3Prong*)arrayBranch->At(iCandid);
573 charmCandidate = (AliAODRecoDecayHF4Prong*)arrayBranch->At(iCandid);
580 Bool_t unsetvtx=kFALSE;
581 if(!charmCandidate->GetOwnPrimaryVtx()) {
582 charmCandidate->SetOwnPrimaryVtx(aodVtx); // needed to compute all variables
586 Bool_t signAssociation = cfVtxHF->SetRecoCandidateParam((AliAODRecoDecayHF*)charmCandidate);
587 if (!signAssociation){
588 charmCandidate = 0x0;
592 Int_t isPartOrAntipart = cfVtxHF->CheckReflexion(fSign);
593 if (isPartOrAntipart == 0){
594 AliDebug(2, Form("The candidate pdg code doesn't match the requirement set in the task (fSign = %d)",fSign));
598 Bool_t recoContFilled = cfVtxHF->FillRecoContainer(containerInput);
601 if (!fCuts->IsInFiducialAcceptance(containerInput[0],containerInput[1])) continue;
604 Bool_t recoStep = cfVtxHF->RecoStep();
605 Bool_t vtxCheck = fCuts->IsEventSelected(aodEvent);
607 if (recoStep && recoContFilled && vtxCheck){
608 fCFManager->GetParticleContainer()->Fill(containerInput,kStepReconstructed, fWeight) ;
610 AliDebug(3,"Reco step passed and container filled\n");
612 //Reco in the acceptance -- take care of UNFOLDING!!!!
613 Bool_t recoAcceptanceStep = cfVtxHF->RecoAcceptStep(trackCuts);
614 if (recoAcceptanceStep) {
615 fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoAcceptance, fWeight) ;
617 AliDebug(3,"Reco acceptance cut passed and container filled\n");
620 Double_t fill[4]; //fill response matrix
621 Bool_t bUnfolding = cfVtxHF -> FillUnfoldingMatrix(fill);
622 if (bUnfolding) fCorrelation->Fill(fill);
625 //Number of ITS cluster requirements
626 Int_t recoITSnCluster = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kTracks);
627 if (recoITSnCluster){
628 fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoITSClusters, fWeight) ;
629 icountRecoITSClusters++;
630 AliDebug(3,"Reco n ITS cluster cut passed and container filled\n");
632 Bool_t iscutsusingpid = fCuts->GetIsUsePID();
633 Int_t recoAnalysisCuts = -1, recoPidSelection = -1;
634 fCuts->SetUsePID(kFALSE);
635 recoAnalysisCuts = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kCandidate, aodEvent);
637 if (recoAnalysisCuts > 3){ // Ds case, where more possibilities are considered
638 if (recoAnalysisCuts >= 8){
639 recoAnalysisCuts -= 8; // removing K0star mass
641 if (recoAnalysisCuts >= 4){
642 recoAnalysisCuts -= 4; // removing Phi mass
646 fCuts->SetUsePID(iscutsusingpid); //restoring usage of the PID from the cuts object
647 if (recoAnalysisCuts == 3 || recoAnalysisCuts == isPartOrAntipart){
648 fCFManager->GetParticleContainer()->Fill(containerInput, kStepRecoPPR, fWeight);
650 AliDebug(3,"Reco Analysis cuts passed and container filled \n");
652 //recoPidSelection = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kPID);
653 //if((fCuts->CombineSelectionLevels(3,recoAnalysisCuts,recoPidSelection)==isPartOrAntipart)||(fCuts->CombineSelectionLevels(3,recoAnalysisCuts,recoPidSelection)==3)){
654 recoPidSelection = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kCandidate, aodEvent);
655 if (recoPidSelection == 3 || recoPidSelection == isPartOrAntipart){
656 fCFManager->GetParticleContainer()->Fill(containerInput, kStepRecoPID, fWeight);
658 AliDebug(3,"Reco PID cuts passed and container filled \n");
660 Double_t fill[4]; //fill response matrix
661 Bool_t bUnfolding = cfVtxHF -> FillUnfoldingMatrix(fill);
662 if (bUnfolding) fCorrelation->Fill(fill);
666 AliDebug(3, "Analysis Cuts step not passed \n");
671 AliDebug(3, "PID selection not passed \n");
676 AliDebug(3, "Number of ITS cluster step not passed\n");
681 AliDebug(3, "Reco acceptance step not passed\n");
686 AliDebug(3, "Reco step not passed\n");
691 if(unsetvtx) charmCandidate->UnsetOwnPrimaryVtx();
692 } // end loop on candidate
694 fCountReco+= icountReco;
695 fCountRecoAcc+= icountRecoAcc;
696 fCountRecoITSClusters+= icountRecoITSClusters;
697 fCountRecoPPR+= icountRecoPPR;
698 fCountRecoPID+= icountRecoPID;
700 fHistEventsProcessed->Fill(0);
702 delete[] containerInput;
703 delete[] containerInputMC;
708 //___________________________________________________________________________
709 void AliCFTaskVertexingHF::Terminate(Option_t*)
711 // The Terminate() function is the last function to be called during
712 // a query. It always runs on the client, it can be used to present
713 // the results graphically or save the results to file.
715 AliAnalysisTaskSE::Terminate();
717 AliInfo(Form("Found %i MC particles that are %s in MC, in %d events",fCountMC,fPartName.Data(),fEvents));
718 AliInfo(Form("Found %i MC particles that are %s in MC and satisfy Acc cuts, in %d events",fCountAcc,fPartName.Data(),fEvents));
719 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));
720 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));
721 AliInfo(Form("Found %i reco %s that are decaying in %s, in %d events",fCountReco,fPartName.Data(),fDauNames.Data(),fEvents));
722 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));
723 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));
724 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));
725 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));
727 // draw some example plots....
729 AliCFContainer *cont= dynamic_cast<AliCFContainer*> (GetOutputData(2));
731 printf("CONTAINER NOT FOUND\n");
734 // projecting the containers to obtain histograms
735 // first argument = variable, second argument = step
738 for(Int_t iC=0;iC<12; iC++){
740 h[0][iC] = cont->ShowProjection(iC,0);
741 // MC-Acceptance level
742 h[1][iC] = cont->ShowProjection(iC,1);
744 h[2][iC] = cont->ShowProjection(iC,4);
747 if(fDecayChannel==31){
748 titles[0]="pT_Dplus (GeV/c)";
749 titles[1]="rapidity";
750 titles[2]="phi (rad)";
751 titles[3]="cT (#mum)";
752 titles[4]="cosPointingAngle";
753 titles[5]="pT_1 (GeV/c)";
754 titles[6]="pT_2 (GeV/c)";
755 titles[7]="pT_3 (GeV/c)";
756 titles[8]="d0_1 (#mum)";
757 titles[9]="d0_2 (#mum)";
758 titles[10]="d0_3 (#mum)";
759 titles[11]="zVertex (cm)";
761 titles[0]="pT_D0 (GeV/c)";
762 titles[1]="rapidity";
763 titles[2]="cosThetaStar";
764 titles[3]="pT_pi (GeV/c)";
765 titles[4]="pT_K (Gev/c)";
766 titles[5]="cT (#mum)";
767 titles[6]="dca (#mum)";
768 titles[7]="d0_pi (#mum)";
769 titles[8]="d0_K (#mum)";
770 titles[9]="d0xd0 (#mum^2)";
771 titles[10]="cosPointingAngle";
772 titles[11]="phi (rad)";
774 Int_t markers[12]={20,24,21,25,27,28,
776 Int_t colors[3]={2,8,4};
777 for(Int_t iC=0;iC<12; iC++){
778 for(Int_t iStep=0;iStep<3;iStep++){
779 h[iStep][iC]->SetTitle(titles[iC].Data());
780 h[iStep][iC]->GetXaxis()->SetTitle(titles[iC].Data());
781 Double_t maxh=h[iStep][iC]->GetMaximum();
782 h[iStep][iC]->GetYaxis()->SetRangeUser(0,maxh*1.2);
783 h[iStep][iC]->SetMarkerStyle(markers[iC]);
784 h[iStep][iC]->SetMarkerColor(colors[iStep]);
790 gStyle->SetCanvasColor(0);
791 gStyle->SetFrameFillColor(0);
792 gStyle->SetTitleFillColor(0);
793 gStyle->SetStatColor(0);
795 // drawing in 2 separate canvas for a matter of clearity
796 TCanvas * c1 =new TCanvas("c1New","Vars 0,1,2",1100,1600);
799 for(Int_t iVar=0; iVar<3; iVar++){
801 h[0][iVar]->Draw("p");
803 h[1][iVar]->Draw("p");
805 h[2][iVar]->Draw("p");
808 TCanvas * c2 =new TCanvas("c2New","Vars 3,4,5",1100,1600);
811 for(Int_t iVar=3; iVar<6; iVar++){
813 h[0][iVar]->Draw("p");
815 h[1][iVar]->Draw("p");
817 h[2][iVar]->Draw("p");
821 TCanvas * c3 =new TCanvas("c3New","Vars 6,7,8",1100,1600);
824 for(Int_t iVar=6; iVar<9; iVar++){
826 h[0][iVar]->Draw("p");
828 h[1][iVar]->Draw("p");
830 h[2][iVar]->Draw("p");
834 TCanvas * c4 =new TCanvas("c4New","Vars 9,10,11",1100,1600);
837 for(Int_t iVar=9; iVar<11; iVar++){
839 h[0][iVar]->Draw("p");
841 h[1][iVar]->Draw("p");
843 h[2][iVar]->Draw("p");
847 THnSparseD* hcorr = dynamic_cast<THnSparseD*> (GetOutputData(3));
849 TH2D* corr1 =hcorr->Projection(0,2);
850 TH2D* corr2 = hcorr->Projection(1,3);
852 TCanvas * c7 =new TCanvas("c7New","",800,400);
860 TFile* file_projection = new TFile("CFtaskHFprojectionNew.root","RECREATE");
864 for(Int_t iC=0;iC<12; iC++){
865 for(Int_t iStep=0;iStep<3;iStep++){
866 h[iStep][iC]->Write(Form("Step%d_%s",iStep,titles[iC].Data()));
869 file_projection->Close();
874 c1->SaveAs("Plots/pT_rapidity_cosThetaStar.eps");
875 c2->SaveAs("Plots/pTpi_pTK_cT.eps");
876 c3->SaveAs("Plots/dca_d0pi_d0TK.eps");
877 c4->SaveAs("Plots/d0xd0_cosPointingAngle.eps");
879 c1->SaveAs("Plots/pT_rapidity_cosThetaStar.gif");
880 c2->SaveAs("Plots/pTpi_pTK_cT.gif");
881 c3->SaveAs("Plots/dca_d0pi_d0TK.gif");
882 c4->SaveAs("Plots/d0xd0_cosPointingAngle.gif");
886 //___________________________________________________________________________
887 void AliCFTaskVertexingHF::UserCreateOutputObjects()
889 //HERE ONE CAN CREATE OUTPUT OBJECTS, IN PARTICULAR IF THE OBJECT PARAMETERS DON'T NEED
890 //TO BE SET BEFORE THE EXECUTION OF THE TASK
892 Info("UserCreateOutputObjects","CreateOutputObjects of task %s\n", GetName());
896 fHistEventsProcessed = new TH1I("CFHFchist0","",1,0,1) ;
900 //_________________________________________________________________________
901 Double_t AliCFTaskVertexingHF::GetWeight(Float_t pt)
904 // calculating the weight to fill the container
908 // p0 = 1.63297e-01 --> 0.322643
914 // p0 = 1.85906e-01 --> 0.36609
919 Double_t func1[4] = {0.322643,2.96275,2.30301,2.5};
920 Double_t func2[4] = {0.36609,1.94635,1.40463,2.5};
922 Double_t dndpt_func1 = dNdptFit(pt,func1);
923 Double_t dndpt_func2 = dNdptFit(pt,func2);
924 AliDebug(2,Form("pt = %f, FONLL = %f, Pythia = %f, ratio = %f",pt,dndpt_func1,dndpt_func2,dndpt_func1/dndpt_func2));
925 return dndpt_func1/dndpt_func2;
928 //__________________________________________________________________________________________________
929 Double_t AliCFTaskVertexingHF::dNdptFit(Float_t pt, Double_t* par)
935 Double_t denom = TMath::Power((pt/par[1]), par[3] );
936 Double_t dNdpt = par[0]*pt/TMath::Power(1.+denom, par[2]);