1 /**************************************************************************
2 * Copyright(c) 1998-2008, 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 AliAnalysisTaskSEDplus
18 // AliAnalysisTaskSE for the D+ candidates Invariant Mass Histogram and
19 //comparison of heavy-flavour decay candidates
20 // to MC truth (kinematics stored in the AOD)
21 // Authors: Renu Bala, bala@to.infn.it
22 // F. Prino, prino@to.infn.it
23 // G. Ortona, ortona@to.infn.it
24 /////////////////////////////////////////////////////////////
26 #include <TClonesArray.h>
32 #include <TDatabasePDG.h>
34 #include "AliAnalysisManager.h"
35 #include "AliRDHFCutsDplustoKpipi.h"
36 #include "AliAODHandler.h"
37 #include "AliAODEvent.h"
38 #include "AliAODVertex.h"
39 #include "AliAODTrack.h"
40 #include "AliAODMCHeader.h"
41 #include "AliAODMCParticle.h"
42 #include "AliAODRecoDecayHF3Prong.h"
43 #include "AliAnalysisVertexingHF.h"
44 #include "AliAnalysisTaskSE.h"
45 #include "AliAnalysisTaskSEDplus.h"
47 ClassImp(AliAnalysisTaskSEDplus)
50 //________________________________________________________________________
51 AliAnalysisTaskSEDplus::AliAnalysisTaskSEDplus():
73 // Default constructor
76 //________________________________________________________________________
77 AliAnalysisTaskSEDplus::AliAnalysisTaskSEDplus(const char *name,AliRDHFCutsDplustoKpipi *dpluscutsana,AliRDHFCutsDplustoKpipi *dpluscutsprod,Bool_t fillNtuple):
78 AliAnalysisTaskSE(name),
93 fRDCutsProduction(dpluscutsprod),
94 fRDCutsAnalysis(dpluscutsana),
95 fFillNtuple(fillNtuple),
100 // Standrd constructor
102 //Double_t ptlim[5]={0.,2.,3.,5,9999999.};
103 //SetPtBinLimit(5, ptlim);
104 SetPtBinLimit(fRDCutsAnalysis->GetNPtBins()+1,fRDCutsAnalysis->GetPtBinLimits());
105 // Default constructor
106 // Output slot #1 writes into a TList container
107 DefineOutput(1,TList::Class()); //My private output
108 // Output slot #2 writes cut to private output
109 // DefineOutput(2,AliRDHFCutsDplustoKpipi::Class());
110 DefineOutput(2,TList::Class());
112 // Output slot #3 writes into a TNtuple container
113 DefineOutput(3,TNtuple::Class()); //My private output
117 //________________________________________________________________________
118 AliAnalysisTaskSEDplus::~AliAnalysisTaskSEDplus()
131 for(Int_t i=0;i<3*fNPtBins;i++){
132 if(fMassHist[i]){ delete fMassHist[i]; fMassHist[i]=0;}
133 if(fCosPHist[i]){ delete fCosPHist[i]; fCosPHist[i]=0;}
134 if(fDLenHist[i]){ delete fDLenHist[i]; fDLenHist[i]=0;}
135 if(fSumd02Hist[i]){ delete fSumd02Hist[i]; fSumd02Hist[i]=0;}
136 if(fSigVertHist[i]){ delete fSigVertHist[i]; fSigVertHist[i]=0;}
137 if(fPtMaxHist[i]){ delete fPtMaxHist[i]; fPtMaxHist[i]=0;}
138 if(fDCAHist[i]){ delete fDCAHist[i]; fDCAHist[i]=0;}
139 if(fMassHistTC[i]){ delete fMassHistTC[i]; fMassHistTC[i]=0;}
141 if(fMassHistLS[i]){ delete fMassHistLS[i]; fMassHistLS[i]=0;}
142 if(fCosPHistLS[i]){ delete fCosPHistLS[i]; fCosPHistLS[i]=0;}
143 if(fDLenHistLS[i]){ delete fDLenHistLS[i]; fDLenHistLS[i]=0;}
144 if(fSumd02HistLS[i]){ delete fSumd02HistLS[i]; fSumd02HistLS[i]=0;}
145 if(fSigVertHistLS[i]){ delete fSigVertHistLS[i]; fSigVertHistLS[i]=0;}
146 if(fPtMaxHistLS[i]){ delete fPtMaxHistLS[i]; fPtMaxHistLS[i]=0;}
147 if(fDCAHistLS[i]){ delete fDCAHistLS[i]; fDCAHistLS[i]=0;}
148 if(fMassHistLSTC[i]){ delete fMassHistLSTC[i]; fMassHistLSTC[i]=0;}
182 if(fRDCutsProduction){
183 delete fRDCutsProduction;
184 fRDCutsProduction = 0;
187 delete fRDCutsAnalysis;
194 //_________________________________________________________________
195 void AliAnalysisTaskSEDplus::SetMassLimits(Float_t range){
196 // set invariant mass limits
197 Float_t bw=GetBinWidth();
198 fUpmasslimit = 1.865+range;
199 fLowmasslimit = 1.865-range;
202 //_________________________________________________________________
203 void AliAnalysisTaskSEDplus::SetMassLimits(Float_t lowlimit, Float_t uplimit){
204 // set invariant mass limits
207 Float_t bw=GetBinWidth();
208 fUpmasslimit = lowlimit;
209 fLowmasslimit = uplimit;
213 //________________________________________________________________________
214 void AliAnalysisTaskSEDplus::SetPtBinLimit(Int_t n, Float_t* lim){
215 // define pt bins for analysis
217 printf("Max. number of Pt bins = %d\n",kMaxPtBins);
219 fArrayBinLimits[0]=0.;
220 fArrayBinLimits[1]=2.;
221 fArrayBinLimits[2]=3.;
222 fArrayBinLimits[3]=5.;
223 for(Int_t i=4; i<kMaxPtBins+1; i++) fArrayBinLimits[i]=99999999.;
226 fArrayBinLimits[0]=lim[0];
227 for(Int_t i=1; i<fNPtBins+1; i++)
228 if(lim[i]>fArrayBinLimits[i-1]){
229 fArrayBinLimits[i]=lim[i];
232 fArrayBinLimits[i]=fArrayBinLimits[i-1];
234 for(Int_t i=fNPtBins; i<kMaxPtBins+1; i++) fArrayBinLimits[i]=99999999.;
237 printf("Number of Pt bins = %d\n",fNPtBins);
238 for(Int_t i=0; i<fNPtBins+1; i++) printf(" Bin%d = %8.2f-%8.2f\n",i,fArrayBinLimits[i],fArrayBinLimits[i+1]);
241 //________________________________________________________________
242 void AliAnalysisTaskSEDplus::SetBinWidth(Float_t w){
244 Int_t nbins=(Int_t)((fUpmasslimit-fLowmasslimit)/width+0.5);
245 Int_t missingbins=4-nbins%4;
246 nbins=nbins+missingbins;
247 width=(fUpmasslimit-fLowmasslimit)/nbins;
249 printf("AliAnalysisTaskSEDplus::SetBinWidth: W-bin width of %f will produce histograms not rebinnable by 4. New width set to %f\n",w,width);
252 if(fDebug>1) printf("AliAnalysisTaskSEDplus::SetBinWidth: width set to %f\n",width);
256 //_________________________________________________________________
257 Double_t AliAnalysisTaskSEDplus::GetPtBinLimit(Int_t ibin){
259 if(ibin>fNPtBins)return -1;
260 return fArrayBinLimits[ibin];
262 //_________________________________________________________________
263 Int_t AliAnalysisTaskSEDplus::GetNBinsHistos(){
264 return (Int_t)((fUpmasslimit-fLowmasslimit)/fBinWidth+0.5);
266 //_________________________________________________________________
267 void AliAnalysisTaskSEDplus::LSAnalysis(TClonesArray *arrayOppositeSign,TClonesArray *arrayLikeSign,AliAODEvent *aod,AliAODVertex *vtx1, Int_t nDplusOS){
270 // Fill the Like Sign histograms
273 //count pos/neg tracks
274 Int_t nPosTrks=0,nNegTrks=0;
275 //counter for particles passing single particle cuts
279 for(Int_t it=0;it<aod->GetNumberOfTracks();it++) {
280 AliAODTrack *track = aod->GetTrack(it);
281 if(track->Charge()>0){
283 if(track->Pt()>=0.4){
287 if(track->Charge()<0)
290 if(track->Pt()>=0.4){
296 Int_t nOStriplets = arrayOppositeSign->GetEntriesFast();
299 Int_t nLikeSign = arrayLikeSign->GetEntriesFast();
302 for(Int_t iLikeSign = 0; iLikeSign < nLikeSign; iLikeSign++) {
303 AliAODRecoDecayHF3Prong *d = (AliAODRecoDecayHF3Prong*)arrayLikeSign->UncheckedAt(iLikeSign);
304 Bool_t unsetvtx=kFALSE;
305 if(!d->GetOwnPrimaryVtx()) {
306 d->SetOwnPrimaryVtx(vtx1); // needed to compute all variables
309 if(fRDCutsProduction->IsSelected(d,AliRDHFCuts::kCandidate))nDplusLS++;
310 if(unsetvtx) d->UnsetOwnPrimaryVtx();
314 if(nLikeSign!=0)wei2 = (Float_t)nOStriplets/(Float_t)nLikeSign;
316 if(nDplusLS!=0)wei3 = (Float_t)nDplusOS/(Float_t)nDplusLS;
318 // loop over like sign candidates
319 for(Int_t iLikeSign = 0; iLikeSign < nLikeSign; iLikeSign++) {
320 AliAODRecoDecayHF3Prong *d = (AliAODRecoDecayHF3Prong*)arrayLikeSign->UncheckedAt(iLikeSign);
321 Bool_t unsetvtx=kFALSE;
322 if(!d->GetOwnPrimaryVtx()) {
323 d->SetOwnPrimaryVtx(vtx1); // needed to compute all variables
327 if(fRDCutsProduction->IsSelected(d,AliRDHFCuts::kCandidate)){
329 //set tight cuts values
331 Double_t ptCand = d->Pt();
332 for(Int_t ibin=0;ibin<fNPtBins&&iPtBin<0&&ptCand>fArrayBinLimits[0]&&ptCand<fArrayBinLimits[fNPtBins];ibin++){
333 if(ptCand<fArrayBinLimits[ibin+1])iPtBin=ibin;
340 Int_t passTightCuts=fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kCandidate);
342 Int_t sign= d->GetCharge();
345 if(sign>0&&nPosTrks>2&&nspcplus>2) { //wei* should be automatically protected, since to get a triplet there must be at least 3 good tracks in the event
347 wei=3.*(Float_t)nNegTrks/((Float_t)nPosTrks-2.);
348 wei4=3.*(Float_t)nspcminus/((Float_t)nspcplus-2.);
351 if(sign<0&&nNegTrks>2&&nspcminus>2){
352 wei=3.*(Float_t)nPosTrks/((Float_t)nNegTrks-2.);
353 wei4=3.*(Float_t)nspcplus/((Float_t)nspcminus-2.);
357 Float_t invMass = d->InvMassDplus();
358 Double_t dlen=d->DecayLength();
359 Double_t cosp=d->CosPointingAngle();
360 Double_t sumD02=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
361 Double_t dca=d->GetDCA();
362 Double_t sigvert=d->GetSigmaVert();
364 for(Int_t i=0;i<3;i++){
365 if(d->PtProng(i)>ptmax)ptmax=d->PtProng(i);
368 index=GetLSHistoIndex(iPtBin);
369 fMassHistLS[index]->Fill(invMass,wei);
370 fMassHistLS[index+1]->Fill(invMass);
371 fMassHistLS[index+2]->Fill(invMass,wei2);
372 fMassHistLS[index+3]->Fill(invMass,wei3);
373 fMassHistLS[index+4]->Fill(invMass,wei4);
375 Int_t indexcut=GetHistoIndex(iPtBin);
376 fCosPHistLS[indexcut]->Fill(cosp);
377 fDLenHistLS[indexcut]->Fill(dlen);
378 fSumd02HistLS[indexcut]->Fill(sumD02);
379 fSigVertHistLS[indexcut]->Fill(sigvert);
380 fPtMaxHistLS[indexcut]->Fill(ptmax);
381 fDCAHistLS[indexcut]->Fill(dca);
384 fMassHistLSTC[index]->Fill(invMass,wei);
385 fMassHistLSTC[index+1]->Fill(invMass);
386 fMassHistLSTC[index+2]->Fill(invMass,wei2);
387 fMassHistLSTC[index+3]->Fill(invMass,wei3);
388 fMassHistLSTC[index+4]->Fill(invMass,wei4);
391 if(unsetvtx) d->UnsetOwnPrimaryVtx();
394 //printf("------------ N. of positive tracks in Event ----- %d \n", nPosTrks);
395 //printf("------------ N. of negative tracks in Event ----- %d \n", nNegTrks);
397 // printf("LS analysis...done\n");
402 //__________________________________________
403 void AliAnalysisTaskSEDplus::Init(){
407 if(fDebug > 1) printf("AnalysisTaskSEDplus::Init() \n");
409 //PostData(2,fRDCutsloose);//we should then put those cuts in a tlist if we have more than 1
410 fListCuts=new TList();
411 AliRDHFCutsDplustoKpipi *production = new AliRDHFCutsDplustoKpipi();
412 production=fRDCutsProduction;
413 AliRDHFCutsDplustoKpipi *analysis = new AliRDHFCutsDplustoKpipi();
414 analysis=fRDCutsAnalysis;
416 fListCuts->Add(production);
417 fListCuts->Add(analysis);
418 PostData(2,fListCuts);
423 //________________________________________________________________________
424 void AliAnalysisTaskSEDplus::UserCreateOutputObjects()
426 // Create the output container
428 if(fDebug > 1) printf("AnalysisTaskSEDplus::UserCreateOutputObjects() \n");
430 // Several histograms are more conveniently managed in a TList
431 fOutput = new TList();
433 fOutput->SetName("OutputHistos");
438 Int_t nbins=GetNBinsHistos();
439 for(Int_t i=0;i<fNPtBins;i++){
441 index=GetHistoIndex(i);
442 indexLS=GetLSHistoIndex(i);
444 hisname.Form("hMassPt%d",i);
445 fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
446 fMassHist[index]->Sumw2();
447 hisname.Form("hCosPAllPt%d",i);
448 fCosPHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,1.);
449 fCosPHist[index]->Sumw2();
450 hisname.Form("hDLenAllPt%d",i);
451 fDLenHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.5);
452 fDLenHist[index]->Sumw2();
453 hisname.Form("hSumd02AllPt%d",i);
454 fSumd02Hist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,1.);
455 fSumd02Hist[index]->Sumw2();
456 hisname.Form("hSigVertAllPt%d",i);
457 fSigVertHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
458 fSigVertHist[index]->Sumw2();
459 hisname.Form("hPtMaxAllPt%d",i);
460 fPtMaxHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,5.);
461 fPtMaxHist[index]->Sumw2();
463 hisname.Form("hDCAAllPt%d",i);
464 fDCAHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
465 fDCAHist[index]->Sumw2();
469 hisname.Form("hMassPt%dTC",i);
470 fMassHistTC[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
471 fMassHistTC[index]->Sumw2();
477 hisname.Form("hCosPAllPt%dLS",i);
478 fCosPHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,1.);
479 fCosPHistLS[index]->Sumw2();
480 hisname.Form("hDLenAllPt%dLS",i);
481 fDLenHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.5);
482 fDLenHistLS[index]->Sumw2();
483 hisname.Form("hSumd02AllPt%dLS",i);
484 fSumd02HistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,1.);
485 fSumd02HistLS[index]->Sumw2();
486 hisname.Form("hSigVertAllPt%dLS",i);
487 fSigVertHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
488 fSigVertHistLS[index]->Sumw2();
489 hisname.Form("hPtMaxAllPt%dLS",i);
490 fPtMaxHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,5.);
491 fPtMaxHistLS[index]->Sumw2();
493 hisname.Form("hDCAAllPt%dLS",i);
494 fDCAHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
495 fDCAHistLS[index]->Sumw2();
497 hisname.Form("hLSPt%dLC",i);
498 fMassHistLS[indexLS] = new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
499 fMassHistLS[indexLS]->Sumw2();
501 hisname.Form("hLSPt%dTC",i);
502 fMassHistLSTC[indexLS] = new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
503 fMassHistLSTC[indexLS]->Sumw2();
507 index=GetSignalHistoIndex(i);
509 hisname.Form("hSigPt%d",i);
510 fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
511 fMassHist[index]->Sumw2();
512 hisname.Form("hCosPSigPt%d",i);
513 fCosPHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,1.);
514 fCosPHist[index]->Sumw2();
515 hisname.Form("hDLenSigPt%d",i);
516 fDLenHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.5);
517 fDLenHist[index]->Sumw2();
518 hisname.Form("hSumd02SigPt%d",i);
519 fSumd02Hist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,1.);
520 fSumd02Hist[index]->Sumw2();
521 hisname.Form("hSigVertSigPt%d",i);
522 fSigVertHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
523 fSigVertHist[index]->Sumw2();
524 hisname.Form("hPtMaxSigPt%d",i);
525 fPtMaxHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,5.);
526 fPtMaxHist[index]->Sumw2();
528 hisname.Form("hDCASigPt%d",i);
529 fDCAHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
530 fDCAHist[index]->Sumw2();
533 hisname.Form("hSigPt%dTC",i);
534 fMassHistTC[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
535 fMassHistTC[index]->Sumw2();
537 hisname.Form("hLSPt%dLCnw",i);
538 fMassHistLS[indexLS]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
539 fMassHistLS[indexLS]->Sumw2();
540 hisname.Form("hLSPt%dTCnw",i);
541 fMassHistLSTC[indexLS]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
542 fMassHistLSTC[indexLS]->Sumw2();
546 hisname.Form("hCosPSigPt%dLS",i);
547 fCosPHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,1.);
548 fCosPHistLS[index]->Sumw2();
549 hisname.Form("hDLenSigPt%dLS",i);
550 fDLenHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.5);
551 fDLenHistLS[index]->Sumw2();
552 hisname.Form("hSumd02SigPt%dLS",i);
553 fSumd02HistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,1.);
554 fSumd02HistLS[index]->Sumw2();
555 hisname.Form("hSigVertSigPt%dLS",i);
556 fSigVertHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
557 fSigVertHistLS[index]->Sumw2();
558 hisname.Form("hPtMaxSigPt%dLS",i);
559 fPtMaxHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,5.);
560 fPtMaxHistLS[index]->Sumw2();
562 hisname.Form("hDCASigPt%dLS",i);
563 fDCAHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
564 fDCAHistLS[index]->Sumw2();
568 index=GetBackgroundHistoIndex(i);
570 hisname.Form("hBkgPt%d",i);
571 fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
572 fMassHist[index]->Sumw2();
573 hisname.Form("hCosPBkgPt%d",i);
574 fCosPHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,1.);
575 fCosPHist[index]->Sumw2();
576 hisname.Form("hDLenBkgPt%d",i);
577 fDLenHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.5);
578 fDLenHist[index]->Sumw2();
579 hisname.Form("hSumd02BkgPt%d",i);
580 fSumd02Hist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,1.);
581 fSumd02Hist[index]->Sumw2();
582 hisname.Form("hSigVertBkgPt%d",i);
583 fSigVertHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
584 fSigVertHist[index]->Sumw2();
585 hisname.Form("hPtMaxBkgPt%d",i);
586 fPtMaxHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,5.);
587 fPtMaxHist[index]->Sumw2();
589 hisname.Form("hDCABkgPt%d",i);
590 fDCAHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
591 fDCAHist[index]->Sumw2();
594 hisname.Form("hBkgPt%dTC",i);
595 fMassHistTC[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
596 fMassHistTC[index]->Sumw2();
598 hisname.Form("hLSPt%dLCntrip",i);
599 fMassHistLS[indexLS]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
600 fMassHistLS[indexLS]->Sumw2();
601 hisname.Form("hLSPt%dTCntrip",i);
602 fMassHistLSTC[indexLS]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
603 fMassHistLSTC[indexLS]->Sumw2();
606 hisname.Form("hCosPBkgPt%dLS",i);
607 fCosPHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,1.);
608 fCosPHistLS[index]->Sumw2();
609 hisname.Form("hDLenBkgPt%dLS",i);
610 fDLenHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.5);
611 fDLenHistLS[index]->Sumw2();
612 hisname.Form("hSumd02BkgPt%dLS",i);
613 fSumd02HistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,1.);
614 fSumd02HistLS[index]->Sumw2();
615 hisname.Form("hSigVertBkgPt%dLS",i);
616 fSigVertHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
617 fSigVertHistLS[index]->Sumw2();
618 hisname.Form("hPtMaxBkgPt%dLS",i);
619 fPtMaxHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,5.);
620 fPtMaxHistLS[index]->Sumw2();
621 hisname.Form("hDCABkgPt%dLS",i);
622 fDCAHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
623 fDCAHistLS[index]->Sumw2();
627 hisname.Form("hLSPt%dLCntripsinglecut",i);
628 fMassHistLS[indexLS]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
629 fMassHistLS[indexLS]->Sumw2();
630 hisname.Form("hLSPt%dTCntripsinglecut",i);
631 fMassHistLSTC[indexLS]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
632 fMassHistLSTC[indexLS]->Sumw2();
635 hisname.Form("hLSPt%dLCspc",i);
636 fMassHistLS[indexLS]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
637 fMassHistLS[indexLS]->Sumw2();
638 hisname.Form("hLSPt%dTCspc",i);
639 fMassHistLSTC[indexLS]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
640 fMassHistLSTC[indexLS]->Sumw2();
643 for(Int_t i=0; i<3*fNPtBins; i++){
644 fOutput->Add(fMassHist[i]);
645 fOutput->Add(fCosPHist[i]);
646 fOutput->Add(fDLenHist[i]);
647 fOutput->Add(fSumd02Hist[i]);
648 fOutput->Add(fSigVertHist[i]);
649 fOutput->Add(fPtMaxHist[i]);
650 fOutput->Add(fDCAHist[i]);
651 fOutput->Add(fMassHistTC[i]);
653 for(Int_t i=0; i<3*fNPtBins&&fDoLS; i++){
654 fOutput->Add(fCosPHistLS[i]);
655 fOutput->Add(fDLenHistLS[i]);
656 fOutput->Add(fSumd02HistLS[i]);
657 fOutput->Add(fSigVertHistLS[i]);
658 fOutput->Add(fPtMaxHistLS[i]);
659 fOutput->Add(fDCAHistLS[i]);
661 for(Int_t i=0; i<5*fNPtBins&&fDoLS; i++){
662 fOutput->Add(fMassHistLS[i]);
663 fOutput->Add(fMassHistLSTC[i]);
667 fHistNEvents = new TH1F("fHistNEvents", "Number of processed events; ; Events",3,-1.5,1.5);
668 fHistNEvents->Sumw2();
669 fHistNEvents->SetMinimum(0);
670 fOutput->Add(fHistNEvents);
672 fPtVsMass=new TH2F("hPtVsMass","PtVsMass (prod. cuts)",nbins,fLowmasslimit,fUpmasslimit,40,0.,20.);
673 fPtVsMassTC=new TH2F("hPtVsMassTC","PtVsMass (analysis cuts)",nbins,fLowmasslimit,fUpmasslimit,40,0.,20.);
674 fYVsPt=new TH2F("hYVsPt","YvsPt (prod. cuts)",40,0.,20.,80,-2.,2.);
675 fYVsPtTC=new TH2F("hYVsPtTC","YvsPt (analysis cuts)",40,0.,20.,80,-2.,2.);
676 fYVsPtSig=new TH2F("hYVsPtSig","YvsPt (MC, only sig., prod. cuts)",40,0.,20.,80,-2.,2.);
677 fYVsPtSigTC=new TH2F("hYVsPtSigTC","YvsPt (MC, only Sig, analysis cuts)",40,0.,20.,80,-2.,2.);
679 fOutput->Add(fPtVsMass);
680 fOutput->Add(fPtVsMassTC);
681 fOutput->Add(fYVsPt);
682 fOutput->Add(fYVsPtTC);
683 fOutput->Add(fYVsPtSig);
684 fOutput->Add(fYVsPtSigTC);
687 OpenFile(2); // 2 is the slot number of the ntuple
689 fNtupleDplus = new TNtuple("fNtupleDplus","D +","pdg:Px:Py:Pz:PtTrue:VxTrue:VyTrue:VzTrue:Ptpi:PtK:Ptpi2:PtRec:PointingAngle:DecLeng:VxRec:VyRec:VzRec:InvMass:sigvert:d0Pi:d0K:d0Pi2:dca:d0square");
696 //________________________________________________________________________
697 void AliAnalysisTaskSEDplus::UserExec(Option_t */*option*/)
699 // Execute analysis for current event:
700 // heavy flavor candidates association to MC truth
702 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
704 TClonesArray *array3Prong = 0;
705 TClonesArray *arrayLikeSign =0;
706 if(!aod && AODEvent() && IsStandardAOD()) {
707 // In case there is an AOD handler writing a standard AOD, use the AOD
708 // event in memory rather than the input (ESD) event.
709 aod = dynamic_cast<AliAODEvent*> (AODEvent());
710 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
711 // have to taken from the AOD event hold by the AliAODExtension
712 AliAODHandler* aodHandler = (AliAODHandler*)
713 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
714 if(aodHandler->GetExtensions()) {
715 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
716 AliAODEvent *aodFromExt = ext->GetAOD();
717 array3Prong=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
718 arrayLikeSign=(TClonesArray*)aodFromExt->GetList()->FindObject("LikeSign3Prong");
721 array3Prong=(TClonesArray*)aod->GetList()->FindObject("Charm3Prong");
722 arrayLikeSign=(TClonesArray*)aod->GetList()->FindObject("LikeSign3Prong");
726 printf("AliAnalysisTaskSEDplus::UserExec: Charm3Prong branch not found!\n");
730 printf("AliAnalysisTaskSEDplus::UserExec: LikeSign3Prong branch not found!\n");
735 // fix for temporary bug in ESDfilter
736 // the AODs with null vertex pointer didn't pass the PhysSel
737 if(!aod->GetPrimaryVertex()) return;
739 fHistNEvents->Fill(0); // count event
740 // Post the data already here
743 TClonesArray *arrayMC=0;
744 AliAODMCHeader *mcHeader=0;
746 // AOD primary vertex
747 AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
753 arrayMC = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
755 printf("AliAnalysisTaskSEDplus::UserExec: MC particles branch not found!\n");
760 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
762 printf("AliAnalysisTaskSEDplus::UserExec: MC header branch not found!\n");
767 Int_t n3Prong = array3Prong->GetEntriesFast();
768 if(fDebug>1) printf("Number of D+->Kpipi: %d\n",n3Prong);
773 Int_t pdgDgDplustoKpipi[3]={321,211,211};
774 // Double_t cutsDplus[12]={0.2,0.4,0.4,0.,0.,0.01,0.06,0.02,0.,0.85,0.,10000000000.};//TO REMOVE
775 //Double_t *cutsDplus = new (Double_t*)fRDCuts->GetCuts();
776 for (Int_t i3Prong = 0; i3Prong < n3Prong; i3Prong++) {
777 AliAODRecoDecayHF3Prong *d = (AliAODRecoDecayHF3Prong*)array3Prong->UncheckedAt(i3Prong);
780 Bool_t unsetvtx=kFALSE;
781 if(!d->GetOwnPrimaryVtx()){
782 d->SetOwnPrimaryVtx(vtx1);
786 if(fRDCutsProduction->IsSelected(d,AliRDHFCuts::kCandidate)) {
788 Double_t ptCand = d->Pt();
790 for(Int_t ibin=0;ibin<fNPtBins&&iPtBin<0&&ptCand>fArrayBinLimits[0]&&ptCand<fArrayBinLimits[fNPtBins];ibin++){
791 if(ptCand<fArrayBinLimits[ibin+1])iPtBin=ibin;
794 Int_t passTightCuts=fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kCandidate);
806 labDp = d->MatchToMC(411,arrayMC,3,pdgDgDplustoKpipi);
808 AliAODMCParticle *partDp = (AliAODMCParticle*)arrayMC->At(labDp);
809 AliAODMCParticle *dg0 = (AliAODMCParticle*)arrayMC->At(partDp->GetDaughter(0));
810 deltaPx=partDp->Px()-d->Px();
811 deltaPy=partDp->Py()-d->Py();
812 deltaPz=partDp->Pz()-d->Pz();
817 pdgCode=TMath::Abs(partDp->GetPdgCode());
822 Double_t invMass=d->InvMassDplus();
823 Double_t rapid=d->YDplus();
824 fYVsPt->Fill(ptCand,rapid);
825 if(passTightCuts) fYVsPtTC->Fill(ptCand,rapid);
826 Bool_t isFidAcc=fRDCutsAnalysis->IsInFiducialAcceptance(ptCand,rapid);
828 fPtVsMass->Fill(invMass,ptCand);
829 if(passTightCuts) fPtVsMassTC->Fill(invMass,ptCand);
841 tmp[8]=d->PtProng(0);
842 tmp[9]=d->PtProng(1);
843 tmp[10]=d->PtProng(2);
845 tmp[12]=d->CosPointingAngle();
846 tmp[13]=d->DecayLength();
850 tmp[17]=d->InvMassDplus();
851 tmp[18]=d->GetSigmaVert();
852 tmp[19]=d->Getd0Prong(0);
853 tmp[20]=d->Getd0Prong(1);
854 tmp[21]=d->Getd0Prong(2);
856 tmp[23]=d->Prodd0d0();
857 fNtupleDplus->Fill(tmp);
858 PostData(3,fNtupleDplus);
860 Double_t dlen=d->DecayLength();
861 Double_t cosp=d->CosPointingAngle();
862 Double_t sumD02=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
863 Double_t dca=d->GetDCA();
864 Double_t sigvert=d->GetSigmaVert();
866 for(Int_t i=0;i<3;i++){
867 if(d->PtProng(i)>ptmax)ptmax=d->PtProng(i);
871 index=GetHistoIndex(iPtBin);
873 fMassHist[index]->Fill(invMass);
874 fCosPHist[index]->Fill(cosp);
875 fDLenHist[index]->Fill(dlen);
876 fSumd02Hist[index]->Fill(sumD02);
877 fSigVertHist[index]->Fill(sigvert);
878 fPtMaxHist[index]->Fill(ptmax);
879 fDCAHist[index]->Fill(dca);
882 fMassHistTC[index]->Fill(invMass);
888 index=GetSignalHistoIndex(iPtBin);
890 fMassHist[index]->Fill(invMass);
891 fCosPHist[index]->Fill(cosp);
892 fDLenHist[index]->Fill(dlen);
893 fSumd02Hist[index]->Fill(sumD02);
894 fSigVertHist[index]->Fill(sigvert);
895 fPtMaxHist[index]->Fill(ptmax);
896 fDCAHist[index]->Fill(dca);
898 fMassHistTC[index]->Fill(invMass);
901 fYVsPtSig->Fill(ptCand,rapid);
902 if(passTightCuts) fYVsPtSigTC->Fill(ptCand,rapid);
904 index=GetBackgroundHistoIndex(iPtBin);
906 fMassHist[index]->Fill(invMass);
907 fCosPHist[index]->Fill(cosp);
908 fDLenHist[index]->Fill(dlen);
909 fSumd02Hist[index]->Fill(sumD02);
910 fSigVertHist[index]->Fill(sigvert);
911 fPtMaxHist[index]->Fill(ptmax);
912 fDCAHist[index]->Fill(dca);
914 fMassHistTC[index]->Fill(invMass);
921 if(unsetvtx) d->UnsetOwnPrimaryVtx();
925 if(fDoLS && arrayLikeSign) LSAnalysis(array3Prong,arrayLikeSign,aod,vtx1,nOS);
933 //________________________________________________________________________
934 void AliAnalysisTaskSEDplus::Terminate(Option_t */*option*/)
936 // Terminate analysis
938 if(fDebug > 1) printf("AnalysisTaskSEDplus: Terminate() \n");
940 fOutput = dynamic_cast<TList*> (GetOutputData(1));
942 printf("ERROR: fOutput not available\n");
945 fHistNEvents = dynamic_cast<TH1F*>(fOutput->FindObject("fHistNEvents"));
946 fYVsPt = dynamic_cast<TH2F*>(fOutput->FindObject("hYVsPt"));
947 fYVsPtTC = dynamic_cast<TH2F*>(fOutput->FindObject("hYVsPtTC"));
948 fYVsPtSig = dynamic_cast<TH2F*>(fOutput->FindObject("hYVsPtSig"));
949 fYVsPtSigTC = dynamic_cast<TH2F*>(fOutput->FindObject("hYVsPtSigTC"));
950 fPtVsMass = dynamic_cast<TH2F*>(fOutput->FindObject("hPtVsMass"));
951 fPtVsMassTC = dynamic_cast<TH2F*>(fOutput->FindObject("hPtVsMassTC"));
958 for(Int_t i=0;i<fNPtBins;i++){
959 index=GetHistoIndex(i);
960 if(fDoLS)indexLS=GetLSHistoIndex(i);
961 hisname.Form("hMassPt%d",i);
962 fMassHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
963 hisname.Form("hCosPAllPt%d",i);
964 fCosPHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
965 hisname.Form("hDLenAllPt%d",i);
966 fDLenHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
967 hisname.Form("hSumd02AllPt%d",i);
968 fSumd02Hist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
969 hisname.Form("hSigVertAllPt%d",i);
970 fSigVertHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
971 hisname.Form("hPtMaxAllPt%d",i);
972 fPtMaxHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
973 hisname.Form("hDCAAllPt%d",i);
974 fDCAHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
975 hisname.Form("hMassPt%dTC",i);
976 fMassHistTC[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
978 hisname.Form("hLSPt%dLC",i);
979 fMassHistLS[indexLS]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
980 hisname.Form("hCosPAllPt%dLS",i);
981 fCosPHistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
982 hisname.Form("hDLenAllPt%dLS",i);
983 fDLenHistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
984 hisname.Form("hSumd02AllPt%dLS",i);
985 fSumd02HistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
986 hisname.Form("hSigVertAllPt%dLS",i);
987 fSigVertHistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
988 hisname.Form("hPtMaxAllPt%dLS",i);
989 fPtMaxHistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
990 hisname.Form("hDCAAllPt%dLS",i);
991 fDCAHistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
993 hisname.Form("hLSPt%dTC",i);
994 fMassHistLSTC[indexLS]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
998 index=GetSignalHistoIndex(i);
1000 hisname.Form("hSigPt%d",i);
1001 fMassHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1002 hisname.Form("hCosPSigPt%d",i);
1003 fCosPHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1004 hisname.Form("hDLenSigPt%d",i);
1005 fDLenHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1006 hisname.Form("hSumd02SigPt%d",i);
1007 fSumd02Hist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1008 hisname.Form("hSigVertSigPt%d",i);
1009 fSigVertHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1010 hisname.Form("hPtMaxSigPt%d",i);
1011 fPtMaxHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1012 hisname.Form("hDCASigPt%d",i);
1013 fDCAHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1015 hisname.Form("hSigPt%dTC",i);
1016 fMassHistTC[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1018 hisname.Form("hLSPt%dLCnw",i);
1019 fMassHistLS[indexLS]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1020 hisname.Form("hCosPSigPt%dLS",i);
1021 fCosPHistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1022 hisname.Form("hDLenSigPt%dLS",i);
1023 fDLenHistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1024 hisname.Form("hSumd02SigPt%dLS",i);
1025 fSumd02HistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1026 hisname.Form("hSigVertSigPt%dLS",i);
1027 fSigVertHistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1028 hisname.Form("hPtMaxSigPt%dLS",i);
1029 fPtMaxHistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1030 hisname.Form("hDCASigPt%dLS",i);
1031 fDCAHistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1033 hisname.Form("hLSPt%dTCnw",i);
1034 fMassHistLSTC[indexLS]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1037 index=GetBackgroundHistoIndex(i);
1039 hisname.Form("hBkgPt%d",i);
1040 fMassHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1041 hisname.Form("hCosPBkgPt%d",i);
1042 fCosPHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1043 hisname.Form("hDLenBkgPt%d",i);
1044 fDLenHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1045 hisname.Form("hSumd02BkgPt%d",i);
1046 fSumd02Hist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1047 hisname.Form("hSigVertBkgPt%d",i);
1048 fSigVertHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1049 hisname.Form("hPtMaxBkgPt%d",i);
1050 fPtMaxHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1051 hisname.Form("hDCABkgPt%d",i);
1052 fDCAHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1053 hisname.Form("hBkgPt%dTC",i);
1054 fMassHistTC[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1056 hisname.Form("hLSPt%dLCntrip",i);
1057 fMassHistLS[indexLS]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1060 hisname.Form("hCosPBkgPt%dLS",i);
1061 fCosPHistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1062 hisname.Form("hDLenBkgPt%dLS",i);
1063 fDLenHistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1064 hisname.Form("hSumd02BkgPt%dLS",i);
1065 fSumd02HistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1066 hisname.Form("hSigVertBkgPt%dLS",i);
1067 fSigVertHistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1068 hisname.Form("hPtMaxBkgPt%dLS",i);
1069 fPtMaxHistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1070 hisname.Form("hDCABkgPt%dLS",i);
1071 fDCAHistLS[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1073 hisname.Form("hLSPt%dTCntrip",i);
1074 fMassHistLSTC[indexLS]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1078 hisname.Form("hLSPt%dLCntripsinglecut",i);
1079 fMassHistLS[indexLS]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1081 hisname.Form("hLSPt%dTCntripsinglecut",i);
1082 fMassHistLSTC[indexLS]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1086 hisname.Form("hLSPt%dLCspc",i);
1087 fMassHistLS[indexLS]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1089 hisname.Form("hLSPt%dTCspc",i);
1090 fMassHistLSTC[indexLS]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1096 fNtupleDplus = dynamic_cast<TNtuple*>(GetOutputData(3));
1099 TCanvas *c1=new TCanvas("c1","D+ invariant mass distribution",500,500);
1101 TH1F *hMassPt=(TH1F*)fOutput->FindObject("hMassPt3TC");
1102 hMassPt->SetLineColor(kBlue);
1103 hMassPt->SetXTitle("M[GeV/c^{2}]");