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"
46 #include "AliNormalizationCounter.h"
48 ClassImp(AliAnalysisTaskSEDplus)
51 //________________________________________________________________________
52 AliAnalysisTaskSEDplus::AliAnalysisTaskSEDplus():
73 fUseStrangeness(kFALSE),
76 // Default constructor
79 //________________________________________________________________________
80 AliAnalysisTaskSEDplus::AliAnalysisTaskSEDplus(const char *name,AliRDHFCutsDplustoKpipi *dpluscutsana,AliRDHFCutsDplustoKpipi *dpluscutsprod,Bool_t fillNtuple):
81 AliAnalysisTaskSE(name),
96 fRDCutsProduction(dpluscutsprod),
97 fRDCutsAnalysis(dpluscutsana),
99 fFillNtuple(fillNtuple),
101 fUseStrangeness(kFALSE),
105 // Standrd constructor
107 //Double_t ptlim[5]={0.,2.,3.,5,9999999.};
108 //SetPtBinLimit(5, ptlim);
109 SetPtBinLimit(fRDCutsAnalysis->GetNPtBins()+1,fRDCutsAnalysis->GetPtBinLimits());
110 // Default constructor
111 // Output slot #1 writes into a TList container
112 DefineOutput(1,TList::Class()); //My private output
113 // Output slot #2 writes cut to private output
114 // DefineOutput(2,AliRDHFCutsDplustoKpipi::Class());
115 DefineOutput(2,TList::Class());
116 // Output slot #3 writes cut to private output
117 DefineOutput(3,AliNormalizationCounter::Class());
120 // Output slot #4 writes into a TNtuple container
121 DefineOutput(4,TNtuple::Class()); //My private output
125 //________________________________________________________________________
126 AliAnalysisTaskSEDplus::~AliAnalysisTaskSEDplus()
139 for(Int_t i=0;i<3;i++){
140 if(fHistCentrality[i]){delete fHistCentrality[i]; fHistCentrality[i]=0;}
142 for(Int_t i=0;i<3*fNPtBins;i++){
143 if(fMassHist[i]){ delete fMassHist[i]; fMassHist[i]=0;}
144 if(fCosPHist[i]){ delete fCosPHist[i]; fCosPHist[i]=0;}
145 if(fDLenHist[i]){ delete fDLenHist[i]; fDLenHist[i]=0;}
146 if(fSumd02Hist[i]){ delete fSumd02Hist[i]; fSumd02Hist[i]=0;}
147 if(fSigVertHist[i]){ delete fSigVertHist[i]; fSigVertHist[i]=0;}
148 if(fPtMaxHist[i]){ delete fPtMaxHist[i]; fPtMaxHist[i]=0;}
149 if(fDCAHist[i]){ delete fDCAHist[i]; fDCAHist[i]=0;}
150 if(fMassHistTC[i]){ delete fMassHistTC[i]; fMassHistTC[i]=0;}
151 if(fMassHistTCPlus[i]){ delete fMassHistTCPlus[i]; fMassHistTCPlus[i]=0;}
152 if(fMassHistTCMinus[i]){ delete fMassHistTCMinus[i]; fMassHistTCMinus[i]=0;}
154 if(fMassHistLS[i]){ delete fMassHistLS[i]; fMassHistLS[i]=0;}
155 if(fCosPHistLS[i]){ delete fCosPHistLS[i]; fCosPHistLS[i]=0;}
156 if(fDLenHistLS[i]){ delete fDLenHistLS[i]; fDLenHistLS[i]=0;}
157 if(fSumd02HistLS[i]){ delete fSumd02HistLS[i]; fSumd02HistLS[i]=0;}
158 if(fSigVertHistLS[i]){ delete fSigVertHistLS[i]; fSigVertHistLS[i]=0;}
159 if(fPtMaxHistLS[i]){ delete fPtMaxHistLS[i]; fPtMaxHistLS[i]=0;}
160 if(fDCAHistLS[i]){ delete fDCAHistLS[i]; fDCAHistLS[i]=0;}
161 if(fMassHistLSTC[i]){ delete fMassHistLSTC[i]; fMassHistLSTC[i]=0;}
195 if(fRDCutsProduction){
196 delete fRDCutsProduction;
197 fRDCutsProduction = 0;
200 delete fRDCutsAnalysis;
211 //_________________________________________________________________
212 void AliAnalysisTaskSEDplus::SetMassLimits(Float_t range){
213 // set invariant mass limits
214 Float_t bw=GetBinWidth();
215 fUpmasslimit = 1.865+range;
216 fLowmasslimit = 1.865-range;
219 //_________________________________________________________________
220 void AliAnalysisTaskSEDplus::SetMassLimits(Float_t lowlimit, Float_t uplimit){
221 // set invariant mass limits
224 Float_t bw=GetBinWidth();
225 fUpmasslimit = lowlimit;
226 fLowmasslimit = uplimit;
230 //________________________________________________________________________
231 void AliAnalysisTaskSEDplus::SetPtBinLimit(Int_t n, Float_t* lim){
232 // define pt bins for analysis
234 printf("Max. number of Pt bins = %d\n",kMaxPtBins);
236 fArrayBinLimits[0]=0.;
237 fArrayBinLimits[1]=2.;
238 fArrayBinLimits[2]=3.;
239 fArrayBinLimits[3]=5.;
240 for(Int_t i=4; i<kMaxPtBins+1; i++) fArrayBinLimits[i]=99999999.;
243 fArrayBinLimits[0]=lim[0];
244 for(Int_t i=1; i<fNPtBins+1; i++)
245 if(lim[i]>fArrayBinLimits[i-1]){
246 fArrayBinLimits[i]=lim[i];
249 fArrayBinLimits[i]=fArrayBinLimits[i-1];
251 for(Int_t i=fNPtBins; i<kMaxPtBins+1; i++) fArrayBinLimits[i]=99999999.;
254 printf("Number of Pt bins = %d\n",fNPtBins);
255 for(Int_t i=0; i<fNPtBins+1; i++) printf(" Bin%d = %8.2f-%8.2f\n",i,fArrayBinLimits[i],fArrayBinLimits[i+1]);
258 //________________________________________________________________
259 void AliAnalysisTaskSEDplus::SetBinWidth(Float_t w){
261 Int_t nbins=(Int_t)((fUpmasslimit-fLowmasslimit)/width+0.5);
262 Int_t missingbins=4-nbins%4;
263 nbins=nbins+missingbins;
264 width=(fUpmasslimit-fLowmasslimit)/nbins;
266 printf("AliAnalysisTaskSEDplus::SetBinWidth: W-bin width of %f will produce histograms not rebinnable by 4. New width set to %f\n",w,width);
269 if(fDebug>1) printf("AliAnalysisTaskSEDplus::SetBinWidth: width set to %f\n",width);
273 //_________________________________________________________________
274 Double_t AliAnalysisTaskSEDplus::GetPtBinLimit(Int_t ibin){
276 if(ibin>fNPtBins)return -1;
277 return fArrayBinLimits[ibin];
279 //_________________________________________________________________
280 Int_t AliAnalysisTaskSEDplus::GetNBinsHistos(){
281 return (Int_t)((fUpmasslimit-fLowmasslimit)/fBinWidth+0.5);
283 //_________________________________________________________________
284 void AliAnalysisTaskSEDplus::LSAnalysis(TClonesArray *arrayOppositeSign,TClonesArray *arrayLikeSign,AliAODEvent *aod,AliAODVertex *vtx1, Int_t nDplusOS){
287 // Fill the Like Sign histograms
290 //count pos/neg tracks
291 Int_t nPosTrks=0,nNegTrks=0;
292 //counter for particles passing single particle cuts
296 for(Int_t it=0;it<aod->GetNumberOfTracks();it++) {
297 AliAODTrack *track = aod->GetTrack(it);
298 if(track->Charge()>0){
300 if(track->Pt()>=0.4){
304 if(track->Charge()<0)
307 if(track->Pt()>=0.4){
313 Int_t nOStriplets = arrayOppositeSign->GetEntriesFast();
316 Int_t nLikeSign = arrayLikeSign->GetEntriesFast();
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
326 if(fRDCutsProduction->IsSelected(d,AliRDHFCuts::kCandidate,aod))nDplusLS++;
327 if(unsetvtx) d->UnsetOwnPrimaryVtx();
331 if(nLikeSign!=0)wei2 = (Float_t)nOStriplets/(Float_t)nLikeSign;
333 if(nDplusLS!=0)wei3 = (Float_t)nDplusOS/(Float_t)nDplusLS;
335 // loop over like sign candidates
336 for(Int_t iLikeSign = 0; iLikeSign < nLikeSign; iLikeSign++) {
337 AliAODRecoDecayHF3Prong *d = (AliAODRecoDecayHF3Prong*)arrayLikeSign->UncheckedAt(iLikeSign);
338 Bool_t unsetvtx=kFALSE;
339 if(!d->GetOwnPrimaryVtx()) {
340 d->SetOwnPrimaryVtx(vtx1); // needed to compute all variables
344 if(fRDCutsProduction->IsSelected(d,AliRDHFCuts::kCandidate,aod)){
346 //set tight cuts values
348 Double_t ptCand = d->Pt();
349 for(Int_t ibin=0;ibin<fNPtBins&&iPtBin<0&&ptCand>fArrayBinLimits[0]&&ptCand<fArrayBinLimits[fNPtBins];ibin++){
350 if(ptCand<fArrayBinLimits[ibin+1])iPtBin=ibin;
357 Int_t passTightCuts=fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kCandidate,aod);
359 Int_t sign= d->GetCharge();
362 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
364 wei=3.*(Float_t)nNegTrks/((Float_t)nPosTrks-2.);
365 wei4=3.*(Float_t)nspcminus/((Float_t)nspcplus-2.);
368 if(sign<0&&nNegTrks>2&&nspcminus>2){
369 wei=3.*(Float_t)nPosTrks/((Float_t)nNegTrks-2.);
370 wei4=3.*(Float_t)nspcplus/((Float_t)nspcminus-2.);
374 Float_t invMass = d->InvMassDplus();
375 Double_t dlen=d->DecayLength();
376 Double_t cosp=d->CosPointingAngle();
377 Double_t sumD02=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
378 Double_t dca=d->GetDCA();
379 Double_t sigvert=d->GetSigmaVert();
381 for(Int_t i=0;i<3;i++){
382 if(d->PtProng(i)>ptmax)ptmax=d->PtProng(i);
385 index=GetLSHistoIndex(iPtBin);
386 fMassHistLS[index]->Fill(invMass,wei);
387 fMassHistLS[index+1]->Fill(invMass);
388 fMassHistLS[index+2]->Fill(invMass,wei2);
389 fMassHistLS[index+3]->Fill(invMass,wei3);
390 fMassHistLS[index+4]->Fill(invMass,wei4);
392 Int_t indexcut=GetHistoIndex(iPtBin);
393 fCosPHistLS[indexcut]->Fill(cosp);
394 fDLenHistLS[indexcut]->Fill(dlen);
395 fSumd02HistLS[indexcut]->Fill(sumD02);
396 fSigVertHistLS[indexcut]->Fill(sigvert);
397 fPtMaxHistLS[indexcut]->Fill(ptmax);
398 fDCAHistLS[indexcut]->Fill(dca);
401 fMassHistLSTC[index]->Fill(invMass,wei);
402 fMassHistLSTC[index+1]->Fill(invMass);
403 fMassHistLSTC[index+2]->Fill(invMass,wei2);
404 fMassHistLSTC[index+3]->Fill(invMass,wei3);
405 fMassHistLSTC[index+4]->Fill(invMass,wei4);
408 if(unsetvtx) d->UnsetOwnPrimaryVtx();
411 //printf("------------ N. of positive tracks in Event ----- %d \n", nPosTrks);
412 //printf("------------ N. of negative tracks in Event ----- %d \n", nNegTrks);
414 // printf("LS analysis...done\n");
419 //__________________________________________
420 void AliAnalysisTaskSEDplus::Init(){
424 if(fDebug > 1) printf("AnalysisTaskSEDplus::Init() \n");
426 //PostData(2,fRDCutsloose);//we should then put those cuts in a tlist if we have more than 1
427 fListCuts=new TList();
428 AliRDHFCutsDplustoKpipi *production = new AliRDHFCutsDplustoKpipi();
429 production=fRDCutsProduction;
430 AliRDHFCutsDplustoKpipi *analysis = new AliRDHFCutsDplustoKpipi();
431 analysis=fRDCutsAnalysis;
433 fListCuts->Add(production);
434 fListCuts->Add(analysis);
435 PostData(2,fListCuts);
440 //________________________________________________________________________
441 void AliAnalysisTaskSEDplus::UserCreateOutputObjects()
443 // Create the output container
445 if(fDebug > 1) printf("AnalysisTaskSEDplus::UserCreateOutputObjects() \n");
447 // Several histograms are more conveniently managed in a TList
448 fOutput = new TList();
450 fOutput->SetName("OutputHistos");
455 Int_t nbins=GetNBinsHistos();
456 fHistCentrality[0]=new TH1F("centrality","centrality",100,0.5,30000.5);
457 fHistCentrality[1]=new TH1F("centrality(selectedCent)","centrality(selectedCent)",100,0.5,30000.5);
458 fHistCentrality[2]=new TH1F("centrality(OutofCent)","centrality(OutofCent)",100,0.5,30000.5);
459 for(Int_t i=0;i<3;i++){
460 fHistCentrality[i]->Sumw2();
461 fOutput->Add(fHistCentrality[i]);
463 for(Int_t i=0;i<fNPtBins;i++){
465 index=GetHistoIndex(i);
466 indexLS=GetLSHistoIndex(i);
468 hisname.Form("hMassPt%d",i);
469 fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
470 fMassHist[index]->Sumw2();
471 hisname.Form("hCosPAllPt%d",i);
472 fCosPHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,1.);
473 fCosPHist[index]->Sumw2();
474 hisname.Form("hDLenAllPt%d",i);
475 fDLenHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.5);
476 fDLenHist[index]->Sumw2();
477 hisname.Form("hSumd02AllPt%d",i);
478 fSumd02Hist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,1.);
479 fSumd02Hist[index]->Sumw2();
480 hisname.Form("hSigVertAllPt%d",i);
481 fSigVertHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
482 fSigVertHist[index]->Sumw2();
483 hisname.Form("hPtMaxAllPt%d",i);
484 fPtMaxHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,5.);
485 fPtMaxHist[index]->Sumw2();
487 hisname.Form("hDCAAllPt%d",i);
488 fDCAHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
489 fDCAHist[index]->Sumw2();
493 hisname.Form("hMassPt%dTC",i);
494 fMassHistTC[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
495 fMassHistTC[index]->Sumw2();
496 hisname.Form("hMassPt%dTCPlus",i);
497 fMassHistTCPlus[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
498 fMassHistTCPlus[index]->Sumw2();
499 hisname.Form("hMassPt%dTCMinus",i);
500 fMassHistTCMinus[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
501 fMassHistTCMinus[index]->Sumw2();
506 hisname.Form("hCosPAllPt%dLS",i);
507 fCosPHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,1.);
508 fCosPHistLS[index]->Sumw2();
509 hisname.Form("hDLenAllPt%dLS",i);
510 fDLenHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.5);
511 fDLenHistLS[index]->Sumw2();
512 hisname.Form("hSumd02AllPt%dLS",i);
513 fSumd02HistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,1.);
514 fSumd02HistLS[index]->Sumw2();
515 hisname.Form("hSigVertAllPt%dLS",i);
516 fSigVertHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
517 fSigVertHistLS[index]->Sumw2();
518 hisname.Form("hPtMaxAllPt%dLS",i);
519 fPtMaxHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,5.);
520 fPtMaxHistLS[index]->Sumw2();
522 hisname.Form("hDCAAllPt%dLS",i);
523 fDCAHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
524 fDCAHistLS[index]->Sumw2();
526 hisname.Form("hLSPt%dLC",i);
527 fMassHistLS[indexLS] = new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
528 fMassHistLS[indexLS]->Sumw2();
530 hisname.Form("hLSPt%dTC",i);
531 fMassHistLSTC[indexLS] = new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
532 fMassHistLSTC[indexLS]->Sumw2();
536 index=GetSignalHistoIndex(i);
538 hisname.Form("hSigPt%d",i);
539 fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
540 fMassHist[index]->Sumw2();
541 hisname.Form("hCosPSigPt%d",i);
542 fCosPHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,1.);
543 fCosPHist[index]->Sumw2();
544 hisname.Form("hDLenSigPt%d",i);
545 fDLenHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.5);
546 fDLenHist[index]->Sumw2();
547 hisname.Form("hSumd02SigPt%d",i);
548 fSumd02Hist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,1.);
549 fSumd02Hist[index]->Sumw2();
550 hisname.Form("hSigVertSigPt%d",i);
551 fSigVertHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
552 fSigVertHist[index]->Sumw2();
553 hisname.Form("hPtMaxSigPt%d",i);
554 fPtMaxHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,5.);
555 fPtMaxHist[index]->Sumw2();
557 hisname.Form("hDCASigPt%d",i);
558 fDCAHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
559 fDCAHist[index]->Sumw2();
562 hisname.Form("hSigPt%dTC",i);
563 fMassHistTC[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
564 fMassHistTC[index]->Sumw2();
565 hisname.Form("hSigPt%dTCPlus",i);
566 fMassHistTCPlus[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
567 fMassHistTCPlus[index]->Sumw2();
568 hisname.Form("hSigPt%dTCMinus",i);
569 fMassHistTCMinus[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
570 fMassHistTCMinus[index]->Sumw2();
572 hisname.Form("hLSPt%dLCnw",i);
573 fMassHistLS[indexLS]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
574 fMassHistLS[indexLS]->Sumw2();
575 hisname.Form("hLSPt%dTCnw",i);
576 fMassHistLSTC[indexLS]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
577 fMassHistLSTC[indexLS]->Sumw2();
581 hisname.Form("hCosPSigPt%dLS",i);
582 fCosPHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,1.);
583 fCosPHistLS[index]->Sumw2();
584 hisname.Form("hDLenSigPt%dLS",i);
585 fDLenHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.5);
586 fDLenHistLS[index]->Sumw2();
587 hisname.Form("hSumd02SigPt%dLS",i);
588 fSumd02HistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,1.);
589 fSumd02HistLS[index]->Sumw2();
590 hisname.Form("hSigVertSigPt%dLS",i);
591 fSigVertHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
592 fSigVertHistLS[index]->Sumw2();
593 hisname.Form("hPtMaxSigPt%dLS",i);
594 fPtMaxHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,5.);
595 fPtMaxHistLS[index]->Sumw2();
597 hisname.Form("hDCASigPt%dLS",i);
598 fDCAHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
599 fDCAHistLS[index]->Sumw2();
603 index=GetBackgroundHistoIndex(i);
605 hisname.Form("hBkgPt%d",i);
606 fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
607 fMassHist[index]->Sumw2();
608 hisname.Form("hCosPBkgPt%d",i);
609 fCosPHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,1.);
610 fCosPHist[index]->Sumw2();
611 hisname.Form("hDLenBkgPt%d",i);
612 fDLenHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.5);
613 fDLenHist[index]->Sumw2();
614 hisname.Form("hSumd02BkgPt%d",i);
615 fSumd02Hist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,1.);
616 fSumd02Hist[index]->Sumw2();
617 hisname.Form("hSigVertBkgPt%d",i);
618 fSigVertHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
619 fSigVertHist[index]->Sumw2();
620 hisname.Form("hPtMaxBkgPt%d",i);
621 fPtMaxHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,5.);
622 fPtMaxHist[index]->Sumw2();
624 hisname.Form("hDCABkgPt%d",i);
625 fDCAHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
626 fDCAHist[index]->Sumw2();
629 hisname.Form("hBkgPt%dTC",i);
630 fMassHistTC[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
631 fMassHistTC[index]->Sumw2();
632 hisname.Form("hBkgPt%dTCPlus",i);
633 fMassHistTCPlus[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
634 fMassHistTCPlus[index]->Sumw2();
635 hisname.Form("hBkgPt%dTCMinus",i);
636 fMassHistTCMinus[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
637 fMassHistTCMinus[index]->Sumw2();
639 hisname.Form("hLSPt%dLCntrip",i);
640 fMassHistLS[indexLS]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
641 fMassHistLS[indexLS]->Sumw2();
642 hisname.Form("hLSPt%dTCntrip",i);
643 fMassHistLSTC[indexLS]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
644 fMassHistLSTC[indexLS]->Sumw2();
647 hisname.Form("hCosPBkgPt%dLS",i);
648 fCosPHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,1.);
649 fCosPHistLS[index]->Sumw2();
650 hisname.Form("hDLenBkgPt%dLS",i);
651 fDLenHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.5);
652 fDLenHistLS[index]->Sumw2();
653 hisname.Form("hSumd02BkgPt%dLS",i);
654 fSumd02HistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,1.);
655 fSumd02HistLS[index]->Sumw2();
656 hisname.Form("hSigVertBkgPt%dLS",i);
657 fSigVertHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
658 fSigVertHistLS[index]->Sumw2();
659 hisname.Form("hPtMaxBkgPt%dLS",i);
660 fPtMaxHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.5,5.);
661 fPtMaxHistLS[index]->Sumw2();
662 hisname.Form("hDCABkgPt%dLS",i);
663 fDCAHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,0.,0.1);
664 fDCAHistLS[index]->Sumw2();
668 hisname.Form("hLSPt%dLCntripsinglecut",i);
669 fMassHistLS[indexLS]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
670 fMassHistLS[indexLS]->Sumw2();
671 hisname.Form("hLSPt%dTCntripsinglecut",i);
672 fMassHistLSTC[indexLS]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
673 fMassHistLSTC[indexLS]->Sumw2();
676 hisname.Form("hLSPt%dLCspc",i);
677 fMassHistLS[indexLS]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
678 fMassHistLS[indexLS]->Sumw2();
679 hisname.Form("hLSPt%dTCspc",i);
680 fMassHistLSTC[indexLS]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
681 fMassHistLSTC[indexLS]->Sumw2();
684 for(Int_t i=0; i<3*fNPtBins; i++){
685 fOutput->Add(fMassHist[i]);
686 fOutput->Add(fCosPHist[i]);
687 fOutput->Add(fDLenHist[i]);
688 fOutput->Add(fSumd02Hist[i]);
689 fOutput->Add(fSigVertHist[i]);
690 fOutput->Add(fPtMaxHist[i]);
691 fOutput->Add(fDCAHist[i]);
692 fOutput->Add(fMassHistTC[i]);
693 fOutput->Add(fMassHistTCPlus[i]);
694 fOutput->Add(fMassHistTCMinus[i]);
696 for(Int_t i=0; i<3*fNPtBins&&fDoLS; i++){
697 fOutput->Add(fCosPHistLS[i]);
698 fOutput->Add(fDLenHistLS[i]);
699 fOutput->Add(fSumd02HistLS[i]);
700 fOutput->Add(fSigVertHistLS[i]);
701 fOutput->Add(fPtMaxHistLS[i]);
702 fOutput->Add(fDCAHistLS[i]);
704 for(Int_t i=0; i<5*fNPtBins&&fDoLS; i++){
705 fOutput->Add(fMassHistLS[i]);
706 fOutput->Add(fMassHistLSTC[i]);
710 fHistNEvents = new TH1F("fHistNEvents", "number of events ",8,-0.5,7.5);
711 fHistNEvents->GetXaxis()->SetBinLabel(1,"nEventsAnal");
712 fHistNEvents->GetXaxis()->SetBinLabel(2,"nEvents with good vertex");
713 fHistNEvents->GetXaxis()->SetBinLabel(3,"nEvents with PbPb HM trigger");
714 fHistNEvents->GetXaxis()->SetBinLabel(4,"no. of Rejected pileup events");
715 fHistNEvents->GetXaxis()->SetBinLabel(5,"no. of candidate");
716 fHistNEvents->GetXaxis()->SetBinLabel(6,"no. of D+ after loose cuts");
717 fHistNEvents->GetXaxis()->SetBinLabel(7,"no. of D+ after tight cuts");
718 fHistNEvents->GetXaxis()->SetBinLabel(8,"no. of out centrality events");
720 fHistNEvents->GetXaxis()->SetNdivisions(1,kFALSE);
722 fHistNEvents->Sumw2();
723 fHistNEvents->SetMinimum(0);
724 fOutput->Add(fHistNEvents);
726 fPtVsMass=new TH2F("hPtVsMass","PtVsMass (prod. cuts)",nbins,fLowmasslimit,fUpmasslimit,200,0.,20.);
727 fPtVsMassTC=new TH2F("hPtVsMassTC","PtVsMass (analysis cuts)",nbins,fLowmasslimit,fUpmasslimit,200,0.,20.);
728 fYVsPt=new TH2F("hYVsPt","YvsPt (prod. cuts)",40,0.,20.,80,-2.,2.);
729 fYVsPtTC=new TH2F("hYVsPtTC","YvsPt (analysis cuts)",40,0.,20.,80,-2.,2.);
730 fYVsPtSig=new TH2F("hYVsPtSig","YvsPt (MC, only sig., prod. cuts)",40,0.,20.,80,-2.,2.);
731 fYVsPtSigTC=new TH2F("hYVsPtSigTC","YvsPt (MC, only Sig, analysis cuts)",40,0.,20.,80,-2.,2.);
733 fOutput->Add(fPtVsMass);
734 fOutput->Add(fPtVsMassTC);
735 fOutput->Add(fYVsPt);
736 fOutput->Add(fYVsPtTC);
737 fOutput->Add(fYVsPtSig);
738 fOutput->Add(fYVsPtSigTC);
741 //Counter for Normalization
742 TString normName="NormalizationCounter";
743 AliAnalysisDataContainer *cont = GetOutputSlot(3)->GetContainer();
744 if(cont)normName=(TString)cont->GetName();
745 fCounter = new AliNormalizationCounter(normName.Data());
746 fCounter->SetRejectPileUp(fRDCutsProduction->GetOptPileUp());
749 OpenFile(4); // 4 is the slot number of the ntuple
751 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");
758 //________________________________________________________________________
759 void AliAnalysisTaskSEDplus::UserExec(Option_t */*option*/)
761 // Execute analysis for current event:
762 // heavy flavor candidates association to MC truth
764 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
768 TClonesArray *array3Prong = 0;
769 TClonesArray *arrayLikeSign =0;
770 if(!aod && AODEvent() && IsStandardAOD()) {
771 // In case there is an AOD handler writing a standard AOD, use the AOD
772 // event in memory rather than the input (ESD) event.
773 aod = dynamic_cast<AliAODEvent*> (AODEvent());
774 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
775 // have to taken from the AOD event hold by the AliAODExtension
776 AliAODHandler* aodHandler = (AliAODHandler*)
777 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
778 if(aodHandler->GetExtensions()) {
779 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
780 AliAODEvent *aodFromExt = ext->GetAOD();
781 array3Prong=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
782 arrayLikeSign=(TClonesArray*)aodFromExt->GetList()->FindObject("LikeSign3Prong");
785 array3Prong=(TClonesArray*)aod->GetList()->FindObject("Charm3Prong");
786 arrayLikeSign=(TClonesArray*)aod->GetList()->FindObject("LikeSign3Prong");
790 printf("AliAnalysisTaskSEDplus::UserExec: Charm3Prong branch not found!\n");
793 if(!arrayLikeSign && fDoLS) {
794 printf("AliAnalysisTaskSEDplus::UserExec: LikeSign3Prong branch not found!\n");
799 // fix for temporary bug in ESDfilter
800 // the AODs with null vertex pointer didn't pass the PhysSel
801 if(!aod->GetPrimaryVertex()||TMath::Abs(aod->GetMagneticField())<0.001) return;
802 fCounter->StoreEvent(aod,fReadMC);
803 fHistNEvents->Fill(0); // count event
805 Bool_t isEvSel=fRDCutsAnalysis->IsEventSelected(aod);
806 Float_t centrality=aod->GetNTracks();//fRDCutsAnalysis->GetCentrality(aod);
807 fHistCentrality[0]->Fill(centrality);
808 // trigger class for PbPb C0SMH-B-NOPF-ALLNOTRD
809 TString trigclass=aod->GetFiredTriggerClasses();
810 if(trigclass.Contains("C0SMH-B-NOPF-ALLNOTRD")||trigclass.Contains("C0SMH-B-NOPF-ALL")) fHistNEvents->Fill(2);
811 if(fRDCutsAnalysis->GetWhyRejection()==1)fHistNEvents->Fill(3);
812 if(fRDCutsAnalysis->GetWhyRejection()==2){fHistNEvents->Fill(7);fHistCentrality[2]->Fill(centrality);}
814 // Post the data already here
818 fHistCentrality[1]->Fill(centrality);
819 fHistNEvents->Fill(1);
821 TClonesArray *arrayMC=0;
822 AliAODMCHeader *mcHeader=0;
824 // AOD primary vertex
825 AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
827 TString primTitle = vtx1->GetTitle();
828 //if(primTitle.Contains("VertexerTracks") && vtx1->GetNContributors()>0)fHistNEvents->Fill(2);
833 arrayMC = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
835 printf("AliAnalysisTaskSEDplus::UserExec: MC particles branch not found!\n");
840 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
842 printf("AliAnalysisTaskSEDplus::UserExec: MC header branch not found!\n");
847 Int_t n3Prong = array3Prong->GetEntriesFast();
848 if(fDebug>1) printf("Number of D+->Kpipi: %d\n",n3Prong);
853 Int_t pdgDgDplustoKpipi[3]={321,211,211};
854 // 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
855 //Double_t *cutsDplus = new (Double_t*)fRDCuts->GetCuts();
856 Int_t nSelectedloose=0,nSelectedtight=0;
857 for (Int_t i3Prong = 0; i3Prong < n3Prong; i3Prong++) {
858 AliAODRecoDecayHF3Prong *d = (AliAODRecoDecayHF3Prong*)array3Prong->UncheckedAt(i3Prong);
859 fHistNEvents->Fill(4);
861 Bool_t unsetvtx=kFALSE;
862 if(!d->GetOwnPrimaryVtx()){
863 d->SetOwnPrimaryVtx(vtx1);
867 if(fRDCutsProduction->IsSelected(d,AliRDHFCuts::kCandidate,aod)) {
872 Double_t ptCand = d->Pt();
874 for(Int_t ibin=0;ibin<fNPtBins&&iPtBin<0&&ptCand>fArrayBinLimits[0]&&ptCand<fArrayBinLimits[fNPtBins];ibin++){
875 if(ptCand<fArrayBinLimits[ibin+1])iPtBin=ibin;
878 Int_t passTightCuts=fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kCandidate,aod);
891 labDp = d->MatchToMC(411,arrayMC,3,pdgDgDplustoKpipi);
893 AliAODMCParticle *partDp = (AliAODMCParticle*)arrayMC->At(labDp);
894 AliAODMCParticle *dg0 = (AliAODMCParticle*)arrayMC->At(partDp->GetDaughter(0));
895 deltaPx=partDp->Px()-d->Px();
896 deltaPy=partDp->Py()-d->Py();
897 deltaPz=partDp->Pz()-d->Pz();
902 pdgCode=TMath::Abs(partDp->GetPdgCode());
907 Double_t invMass=d->InvMassDplus();
908 Double_t rapid=d->YDplus();
909 fYVsPt->Fill(ptCand,rapid);
910 if(passTightCuts) fYVsPtTC->Fill(ptCand,rapid);
911 Bool_t isFidAcc=fRDCutsAnalysis->IsInFiducialAcceptance(ptCand,rapid);
913 fPtVsMass->Fill(invMass,ptCand);
914 if(passTightCuts) fPtVsMassTC->Fill(invMass,ptCand);
926 tmp[8]=d->PtProng(0);
927 tmp[9]=d->PtProng(1);
928 tmp[10]=d->PtProng(2);
930 tmp[12]=d->CosPointingAngle();
931 tmp[13]=d->DecayLength();
935 tmp[17]=d->InvMassDplus();
936 tmp[18]=d->GetSigmaVert();
937 tmp[19]=d->Getd0Prong(0);
938 tmp[20]=d->Getd0Prong(1);
939 tmp[21]=d->Getd0Prong(2);
941 tmp[23]=d->Prodd0d0();
942 fNtupleDplus->Fill(tmp);
943 PostData(4,fNtupleDplus);
945 Double_t dlen=d->DecayLength();
946 Double_t cosp=d->CosPointingAngle();
947 Double_t sumD02=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
948 Double_t dca=d->GetDCA();
949 Double_t sigvert=d->GetSigmaVert();
951 for(Int_t i=0;i<3;i++){
952 if(d->PtProng(i)>ptmax)ptmax=d->PtProng(i);
956 index=GetHistoIndex(iPtBin);
958 fHistNEvents->Fill(5);
960 fMassHist[index]->Fill(invMass);
961 fCosPHist[index]->Fill(cosp);
962 fDLenHist[index]->Fill(dlen);
963 fSumd02Hist[index]->Fill(sumD02);
964 fSigVertHist[index]->Fill(sigvert);
965 fPtMaxHist[index]->Fill(ptmax);
966 fDCAHist[index]->Fill(dca);
968 if(passTightCuts){ fHistNEvents->Fill(6);
970 fMassHistTC[index]->Fill(invMass);
971 if(d->GetCharge()>0) fMassHistTCPlus[index]->Fill(invMass);
972 else if(d->GetCharge()<0) fMassHistTCMinus[index]->Fill(invMass);
978 index=GetSignalHistoIndex(iPtBin);
980 Float_t factor[3]={1.,1.,1.};
982 for(Int_t iprong=0;iprong<3;iprong++){
983 AliAODTrack *trad = (AliAODTrack*)d->GetDaughter(iprong);
984 Int_t labd= trad->GetLabel();
986 AliAODMCParticle *dau = (AliAODMCParticle*)arrayMC->At(labd);
988 Int_t labm = dau->GetMother();
990 AliAODMCParticle *mot = (AliAODMCParticle*)arrayMC->At(labm);
992 if(TMath::Abs(mot->GetPdgCode())==310 || TMath::Abs(mot->GetPdgCode())==130 || TMath::Abs(mot->GetPdgCode())==321){ //K0_S, K0_L, K^+-
993 if(d->PtProng(iprong)<=1)factor[iprong]=1./.7;
994 else factor[iprong]=1./.6;
995 // fNentries->Fill(12);
997 if(TMath::Abs(mot->GetPdgCode())==3122) { //Lambda
998 factor[iprong]=1./0.25;
999 // fNentries->Fill(13);
1007 Float_t fact=1.;for(Int_t k=0;k<3;k++)fact=fact*factor[k];
1008 fMassHist[index]->Fill(invMass);
1009 fCosPHist[index]->Fill(cosp,fact);
1010 fDLenHist[index]->Fill(dlen,fact);
1011 Float_t sumd02s=d->Getd0Prong(0)*d->Getd0Prong(0)*factor[0]*factor[0]+d->Getd0Prong(1)*d->Getd0Prong(1)*factor[1]*factor[1]+d->Getd0Prong(2)*d->Getd0Prong(2)*factor[2]*factor[2];
1012 fSumd02Hist[index]->Fill(sumd02s);
1013 fSigVertHist[index]->Fill(sigvert,fact);
1014 fPtMaxHist[index]->Fill(ptmax,fact);
1015 fDCAHist[index]->Fill(dca,fact);
1017 fMassHistTC[index]->Fill(invMass);
1018 if(d->GetCharge()>0) fMassHistTCPlus[index]->Fill(invMass);
1019 else if(d->GetCharge()<0) fMassHistTCMinus[index]->Fill(invMass);
1022 fYVsPtSig->Fill(ptCand,rapid);
1023 if(passTightCuts) fYVsPtSigTC->Fill(ptCand,rapid);
1025 index=GetBackgroundHistoIndex(iPtBin);
1027 Float_t factor[3]={1.,1.,1.};
1028 if(fUseStrangeness){
1029 for(Int_t iprong=0;iprong<3;iprong++){
1030 AliAODTrack *trad = (AliAODTrack*)d->GetDaughter(iprong);
1031 Int_t labd= trad->GetLabel();
1033 AliAODMCParticle *dau = (AliAODMCParticle*)arrayMC->At(labd);
1035 Int_t labm = dau->GetMother();
1037 AliAODMCParticle *mot = (AliAODMCParticle*)arrayMC->At(labm);
1039 if(TMath::Abs(mot->GetPdgCode())==310 || TMath::Abs(mot->GetPdgCode())==130 || TMath::Abs(mot->GetPdgCode())==321){ //K0_S, K0_L, K^+-
1040 if(d->PtProng(iprong)<=1)factor[iprong]=1./.7;
1041 else factor[iprong]=1./.6;
1042 // fNentries->Fill(12);
1044 if(TMath::Abs(mot->GetPdgCode())==3122) { //Lambda
1045 factor[iprong]=1./0.25;
1046 // fNentries->Fill(13);
1054 Float_t fact=1.;for(Int_t k=0;k<3;k++)fact=fact*factor[k];
1055 fMassHist[index]->Fill(invMass);
1056 fCosPHist[index]->Fill(cosp,fact);
1057 fDLenHist[index]->Fill(dlen,fact);
1058 Float_t sumd02s=d->Getd0Prong(0)*d->Getd0Prong(0)*factor[0]*factor[0]+d->Getd0Prong(1)*d->Getd0Prong(1)*factor[1]*factor[1]+d->Getd0Prong(2)*d->Getd0Prong(2)*factor[2]*factor[2];
1059 fSumd02Hist[index]->Fill(sumd02s);
1060 fSigVertHist[index]->Fill(sigvert,fact);
1061 fPtMaxHist[index]->Fill(ptmax,fact);
1062 fDCAHist[index]->Fill(dca,fact);
1064 fMassHistTC[index]->Fill(invMass);
1065 if(d->GetCharge()>0) fMassHistTCPlus[index]->Fill(invMass);
1066 else if(d->GetCharge()<0) fMassHistTCMinus[index]->Fill(invMass);
1073 if(unsetvtx) d->UnsetOwnPrimaryVtx();
1075 fCounter->StoreCandidates(aod,nSelectedloose,kTRUE);
1076 fCounter->StoreCandidates(aod,nSelectedtight,kFALSE);
1079 if(fDoLS && arrayLikeSign) LSAnalysis(array3Prong,arrayLikeSign,aod,vtx1,nOS);
1081 PostData(1,fOutput);
1082 PostData(3,fCounter);
1088 //________________________________________________________________________
1089 void AliAnalysisTaskSEDplus::Terminate(Option_t */*option*/)
1091 // Terminate analysis
1093 if(fDebug > 1) printf("AnalysisTaskSEDplus: Terminate() \n");
1095 fOutput = dynamic_cast<TList*> (GetOutputData(1));
1097 printf("ERROR: fOutput not available\n");
1100 fHistNEvents = dynamic_cast<TH1F*>(fOutput->FindObject("fHistNEvents"));
1105 for(Int_t i=0;i<fNPtBins;i++){
1106 index=GetHistoIndex(i);
1108 hisname.Form("hMassPt%dTC",i);
1109 fMassHistTC[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
1112 TCanvas *c1=new TCanvas("c1","D+ invariant mass distribution",500,500);
1114 TH1F *hMassPt=(TH1F*)fOutput->FindObject("hMassPt3TC");
1115 hMassPt->SetLineColor(kBlue);
1116 hMassPt->SetXTitle("M[GeV/c^{2}]");