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 **************************************************************************/
18 //*************************************************************************
19 // Class AliAnalysisTaskSEDplusCorrelations
20 // AliAnalysisTaskSE for the D+ candidates Invariant Mass Histogram and
21 //comparison of heavy-flavour decay candidates
22 // to MC truth (kinematics stored in the AOD)
23 // Authors: Sadhana Dash (correlation)
24 /////////////////////////////////////////////////////////////
26 #include <TClonesArray.h>
31 #include <TDatabasePDG.h>
33 #include <AliAnalysisDataSlot.h>
34 #include <AliAnalysisDataContainer.h>
35 #include "AliAnalysisManager.h"
36 #include "AliRDHFCutsDplustoKpipi.h"
37 #include "AliAODHandler.h"
38 #include "AliAODEvent.h"
39 #include "AliAODPidHF.h"
40 #include "AliAODVertex.h"
41 #include "AliAODTrack.h"
42 #include "AliAODRecoDecayHF3Prong.h"
43 #include "AliAnalysisVertexingHF.h"
44 #include "AliAnalysisTaskSE.h"
45 #include "AliAnalysisTaskSEDplusCorrelations.h"
46 #include "AliNormalizationCounter.h"
47 #include "AliVParticle.h"
48 #include "AliHFAssociatedTrackCuts.h"
49 #include "AliReducedParticle.h"
50 #include "AliHFCorrelator.h"
56 ClassImp(AliAnalysisTaskSEDplusCorrelations)
59 //________________________________________________________________________
60 AliAnalysisTaskSEDplusCorrelations::AliAnalysisTaskSEDplusCorrelations():
92 // Default constructor
94 for(Int_t i=0;i<3*kMaxPtBins;i++){
95 if(fMassVsdPhiHistHad[i])fMassVsdPhiHistHad[i]=0;
96 if(fMassVsdEtaHistHad[i])fMassVsdEtaHistHad[i]=0;
97 if(fMassVsdPhiHistKaon[i])fMassVsdPhiHistKaon[i]=0;
98 if(fMassVsdEtaHistKaon[i])fMassVsdEtaHistKaon[i]=0;
99 if(fMassVsdPhiHistKshort[i])fMassVsdPhiHistKshort[i]=0;
100 if(fMassVsdEtaHistKshort[i])fMassVsdEtaHistKshort[i]=0;
101 if(fMassVsdPhiHistLeadHad[i])fMassVsdPhiHistLeadHad[i]=0;
102 if(fMassVsdEtaHistLeadHad[i])fMassVsdEtaHistLeadHad[i]=0;
103 if(fMassHistK0S[i])fMassHistK0S[i]=0;
104 if(fLeadPt[i])fLeadPt[i]=0;
105 if(fMassHist[i])fMassHist[i]=0;
106 if(fMassHistTCPlus[i])fMassHistTCPlus[i]=0;
107 if(fMassHistTCMinus[i])fMassHistTCMinus[i]=0;
110 for(Int_t i=0;i<kMaxPtBins+1;i++){
111 fArrayBinLimits[i]=0;
116 //________________________________________________________________________
117 AliAnalysisTaskSEDplusCorrelations::AliAnalysisTaskSEDplusCorrelations(const char *name,AliRDHFCutsDplustoKpipi *dpluscutsana, AliHFAssociatedTrackCuts *asstrkcuts):
118 AliAnalysisTaskSE(name),
136 fLowmasslimit(1.765),
141 fRDCutsAnalysis(dpluscutsana),
150 // Standrd constructor
152 fNPtBins=fRDCutsAnalysis->GetNPtBins();
155 for(Int_t i=0;i<3*kMaxPtBins;i++){
156 if(fMassVsdPhiHistHad[i])fMassVsdPhiHistHad[i]=0;
157 if(fMassVsdEtaHistHad[i])fMassVsdEtaHistHad[i]=0;
158 if(fMassVsdPhiHistKaon[i])fMassVsdPhiHistKaon[i]=0;
159 if(fMassVsdEtaHistKaon[i])fMassVsdEtaHistKaon[i]=0;
160 if(fMassVsdPhiHistKshort[i])fMassVsdPhiHistKshort[i]=0;
161 if(fMassVsdEtaHistKshort[i])fMassVsdEtaHistKshort[i]=0;
162 if(fMassVsdPhiHistLeadHad[i])fMassVsdPhiHistLeadHad[i]=0;
163 if(fMassVsdEtaHistLeadHad[i])fMassVsdEtaHistLeadHad[i]=0;
164 if(fMassHistK0S[i])fMassHistK0S[i]=0;
165 if(fLeadPt[i])fLeadPt[i]=0;
166 if(fMassHist[i])fMassHist[i]=0;
167 if(fMassHistTC[i])fMassHistTC[i]=0;
168 if(fMassHistTCPlus[i])fMassHistTCPlus[i]=0;
169 if(fMassHistTCMinus[i])fMassHistTCMinus[i]=0;
174 for(Int_t i=0;i<kMaxPtBins+1;i++){
175 fArrayBinLimits[i]=0;
179 // Default constructor
180 // Output slot #1 writes into a TList container
181 DefineOutput(1,TList::Class()); //My private output
182 // Output slot #2 writes cut to private output
183 // DefineOutput(2,AliRDHFCutsDplusCorrelationstoKpipi::Class());
184 DefineOutput(2,TList::Class());
185 // Output slot #3 writes cut to private output
186 DefineOutput(3,AliNormalizationCounter::Class());
187 DefineOutput(4,AliHFAssociatedTrackCuts::Class());
192 //________________________________________________________________________
193 AliAnalysisTaskSEDplusCorrelations::~AliAnalysisTaskSEDplusCorrelations()
200 delete fRDCutsAnalysis;
207 //_________________________________________________________________
208 void AliAnalysisTaskSEDplusCorrelations::SetMassLimits(Float_t range){
209 // set invariant mass limits
210 Float_t bw=GetBinWidth();
211 fUpmasslimit = 1.865+range;
212 fLowmasslimit = 1.865-range;
215 //_________________________________________________________________
216 void AliAnalysisTaskSEDplusCorrelations::SetMassLimits(Float_t lowlimit, Float_t uplimit){
217 // set invariant mass limits
220 Float_t bw=GetBinWidth();
221 fUpmasslimit = lowlimit;
222 fLowmasslimit = uplimit;
226 //________________________________________________________________
227 void AliAnalysisTaskSEDplusCorrelations::SetBinWidth(Float_t w){
228 // Define width of mass bins
230 Int_t nbins=(Int_t)((fUpmasslimit-fLowmasslimit)/width+0.5);
231 Int_t missingbins=4-nbins%4;
232 nbins=nbins+missingbins;
233 width=(fUpmasslimit-fLowmasslimit)/nbins;
235 printf("AliAnalysisTaskSEDplusCorrelations::SetBinWidth: W-bin width of %f will produce histograms not rebinnable by 4. New width set to %f\n",w,width);
238 if(fDebug>1) printf("AliAnalysisTaskSEDplusCorrelations::SetBinWidth: width set to %f\n",width);
242 //_________________________________________________________________
243 Int_t AliAnalysisTaskSEDplusCorrelations::GetNBinsHistos(){
244 // Compute number of mass bins
245 return (Int_t)((fUpmasslimit-fLowmasslimit)/fBinWidth+0.5);
249 //__________________________________________
250 void AliAnalysisTaskSEDplusCorrelations::Init(){
254 if(fDebug > 1) printf("AnalysisTaskSEDplusCorrelations::Init() \n");
256 //PostData(2,fRDCutsloose);//we should then put those cuts in a tlist if we have more than 1
257 fListCuts=new TList();
258 // fListCutsAsso=new TList();
260 AliRDHFCutsDplustoKpipi *analysis = new AliRDHFCutsDplustoKpipi(*fRDCutsAnalysis);
261 analysis->SetName("AnalysisCuts");
263 // AliHFAssociatedTrackCuts *trkcuts = new AliHFAssociatedTrackCuts(*fCuts);
264 //trkcuts->SetName("Assotrkcuts");
266 fListCuts->Add(analysis);
267 //fListCuts->Add(trkcuts);
271 PostData(2,fListCuts);
277 //________________________________________________________________________
278 void AliAnalysisTaskSEDplusCorrelations::UserCreateOutputObjects()
280 // Create the output container
282 if(fDebug > 1) printf("AnalysisTaskSEDplusCorrelations::UserCreateOutputObjects() \n");
283 // correlator creation and definition
285 Double_t Pi = TMath::Pi();
286 fCorrelator = new AliHFCorrelator("Correlator",fCuts,fSystem); // fCuts is the hadron cut object, fSystem to switch between pp or PbPb
287 fCorrelator->SetDeltaPhiInterval((-0.5-1./32)*Pi,(1.5-1./32)*Pi); // set correct phi interval
288 //fCorrelator->SetDeltaPhiInterval(-1.57,4.71);
289 fCorrelator->SetEventMixing(fMixing); //set kFALSE/kTRUE for mixing Off/On
290 fCorrelator->SetAssociatedParticleType(fSelect); // set 1/2/3 for hadron/kaons/kzeros
291 fCorrelator->SetApplyDisplacementCut(fDisplacement); //set kFALSE/kTRUE for using the displacement cut
292 fCorrelator->SetUseMC(fReadMC);
294 Bool_t pooldef = fCorrelator->DefineEventPool();
296 if(!pooldef) AliInfo("Warning:: Event pool not defined properly");
299 // Several histograms are more conveniently managed in a TList
300 fOutput = new TList();
302 fOutput->SetName("OutputHistos");
306 Int_t nbins=GetNBinsHistos();
308 for(Int_t i=0;i<fNPtBins;i++){
310 index=GetHistoIndex(i);
313 hisname.Form("hMassVsdPhiHad%d",i);
314 fMassVsdPhiHistHad[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
315 fMassVsdPhiHistHad[index]->Sumw2();
317 hisname.Form("hMassVsdEtaHad%d",i);
318 fMassVsdEtaHistHad[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
319 fMassVsdEtaHistHad[index]->Sumw2();
321 hisname.Form("hMassVsdPhiKaon%d",i);
322 fMassVsdPhiHistKaon[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
323 fMassVsdPhiHistKaon[index]->Sumw2();
325 hisname.Form("hMassVsdEtaKaon%d",i);
326 fMassVsdEtaHistKaon[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
327 fMassVsdEtaHistKaon[index]->Sumw2();
329 hisname.Form("hMassVsdPhiK0%d",i);
330 fMassVsdPhiHistKshort[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
331 fMassVsdPhiHistKshort[index]->Sumw2();
333 hisname.Form("hMassVsdEtaK0%d",i);
334 fMassVsdEtaHistKshort[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
335 fMassVsdEtaHistKshort[index]->Sumw2();
337 hisname.Form("hMassVsdPhiLeadHad%d",i);
338 fMassVsdPhiHistLeadHad[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
339 fMassVsdPhiHistLeadHad[index]->Sumw2();
341 hisname.Form("hMassVsdEtaLeadHad%d",i);
342 fMassVsdEtaHistLeadHad[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
343 fMassVsdEtaHistLeadHad[index]->Sumw2();
345 hisname.Form("hMassPtK0S%d",i);
346 fMassHistK0S[index]=new TH1F(hisname.Data(),hisname.Data(),500,0.3,0.8);
347 fMassHistK0S[index]->Sumw2();
349 hisname.Form("hLeadPt%d",i);
350 fLeadPt[index]=new TH1F(hisname.Data(),hisname.Data(),500,0.0,50);
351 fLeadPt[index]->Sumw2();
354 hisname.Form("hMassPt%d",i);
355 fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
356 fMassHist[index]->Sumw2();
359 hisname.Form("hMassPt%dTC",i);
360 fMassHistTC[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
361 fMassHistTC[index]->Sumw2();
363 hisname.Form("hMassPt%dTCPlus",i);
364 fMassHistTCPlus[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
365 fMassHistTCPlus[index]->Sumw2();
367 hisname.Form("hMassPt%dTCMinus",i);
368 fMassHistTCMinus[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
369 fMassHistTCMinus[index]->Sumw2();
373 index=GetSignalHistoIndex(i);
375 hisname.Form("hMassVsdPhiHadSig%d",i);
376 fMassVsdPhiHistHad[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
377 fMassVsdPhiHistHad[index]->Sumw2();
379 hisname.Form("hMassVsdEtaHadSig%d",i);
380 fMassVsdEtaHistHad[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
381 fMassVsdEtaHistHad[index]->Sumw2();
383 hisname.Form("hMassVsdPhiKaonSig%d",i);
384 fMassVsdPhiHistKaon[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
385 fMassVsdPhiHistKaon[index]->Sumw2();
387 hisname.Form("hMassVsdEtaKaonSig%d",i);
388 fMassVsdEtaHistKaon[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
389 fMassVsdEtaHistKaon[index]->Sumw2();
391 hisname.Form("hMassVsdPhiK0Sig%d",i);
392 fMassVsdPhiHistKshort[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
393 fMassVsdPhiHistKshort[index]->Sumw2();
395 hisname.Form("hMassVsdEtaK0Sig%d",i);
396 fMassVsdEtaHistKshort[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
397 fMassVsdEtaHistKshort[index]->Sumw2();
399 hisname.Form("hMassVsdPhiLeadHadSig%d",i);
400 fMassVsdPhiHistLeadHad[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
401 fMassVsdPhiHistLeadHad[index]->Sumw2();
403 hisname.Form("hMassVsdEtaLeadHadSig%d",i);
404 fMassVsdEtaHistLeadHad[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
405 fMassVsdEtaHistLeadHad[index]->Sumw2();
408 hisname.Form("hSigPtK0S%d",i);
409 fMassHistK0S[index]=new TH1F(hisname.Data(),hisname.Data(),500,0.3,0.8);
410 fMassHistK0S[index]->Sumw2();
412 hisname.Form("hSigLeadPt%d",i);
413 fLeadPt[index]=new TH1F(hisname.Data(),hisname.Data(),500,0.0,50);
414 fLeadPt[index]->Sumw2();
416 hisname.Form("hSigPt%d",i);
417 fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
418 fMassHist[index]->Sumw2();
420 hisname.Form("hSigPt%dTC",i);
421 fMassHistTC[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
422 fMassHistTC[index]->Sumw2();
423 hisname.Form("hSigPt%dTCPlus",i);
424 fMassHistTCPlus[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
425 fMassHistTCPlus[index]->Sumw2();
426 hisname.Form("hSigPt%dTCMinus",i);
427 fMassHistTCMinus[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
428 fMassHistTCMinus[index]->Sumw2();
432 index=GetBackgroundHistoIndex(i);
434 hisname.Form("hMassVsdPhiBkgHad%d",i);
435 fMassVsdPhiHistHad[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
436 fMassVsdPhiHistHad[index]->Sumw2();
438 hisname.Form("hMassVsdEtaBkgHad%d",i);
439 fMassVsdEtaHistHad[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
440 fMassVsdEtaHistHad[index]->Sumw2();
442 hisname.Form("hMassVsdPhiBkgKaon%d",i);
443 fMassVsdPhiHistKaon[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
444 fMassVsdPhiHistKaon[index]->Sumw2();
446 hisname.Form("hMassVsdEtaBkgKaon%d",i);
447 fMassVsdEtaHistKaon[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
448 fMassVsdEtaHistKaon[index]->Sumw2();
450 hisname.Form("hMassVsdPhiBkgKshort%d",i);
451 fMassVsdPhiHistKshort[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
452 fMassVsdPhiHistKshort[index]->Sumw2();
455 hisname.Form("hMassVsdPhiBkgKshort%d",i);
456 fMassVsdEtaHistKshort[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
457 fMassVsdEtaHistKshort[index]->Sumw2();
459 hisname.Form("hMassVsdPhiBkgLeadHad%d",i);
460 fMassVsdPhiHistLeadHad[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
461 fMassVsdPhiHistLeadHad[index]->Sumw2();
463 hisname.Form("hMassVsdPhiBkgKshort%d",i);
464 fMassVsdEtaHistLeadHad[index]=new TH2F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit,25,(-1)*TMath::Pi()/2,3.*TMath::Pi()/2.);
465 fMassVsdEtaHistLeadHad[index]->Sumw2();
467 hisname.Form("hBkgPtK0S%d",i);
468 fMassHistK0S[index]=new TH1F(hisname.Data(),hisname.Data(),500,0.3,0.8);
469 fMassHistK0S[index]->Sumw2();
471 hisname.Form("hLeadBkgPt%d",i);
472 fLeadPt[index]=new TH1F(hisname.Data(),hisname.Data(),500,0.0,50);
473 fLeadPt[index]->Sumw2();
475 hisname.Form("hBkgPt%dTC",i);
476 fMassHistTC[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
477 fMassHistTC[index]->Sumw2();
479 hisname.Form("hBkgPt%dTCPlus",i);
480 fMassHistTCPlus[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
481 fMassHistTCPlus[index]->Sumw2();
483 hisname.Form("hBkgPt%dTCMinus",i);
484 fMassHistTCMinus[index]=new TH1F(hisname.Data(),hisname.Data(),nbins,fLowmasslimit,fUpmasslimit);
485 fMassHistTCMinus[index]->Sumw2();
489 for(Int_t i=0; i<3*fNPtBins; i++){
490 fOutput->Add(fMassVsdPhiHistHad[i]);
491 fOutput->Add(fMassVsdEtaHistHad[i]);
492 fOutput->Add(fMassVsdPhiHistKaon[i]);
493 fOutput->Add(fMassVsdEtaHistKaon[i]);
494 fOutput->Add(fMassVsdPhiHistKshort[i]);
495 fOutput->Add(fMassVsdEtaHistKshort[i]);
496 fOutput->Add(fMassVsdPhiHistLeadHad[i]);
497 fOutput->Add(fMassVsdEtaHistLeadHad[i]);
498 // fOutput->Add(fMassVsdPhiHist[i]);
499 fOutput->Add(fMassHistK0S[i]);
500 fOutput->Add(fLeadPt[i]);
501 fOutput->Add(fMassHist[i]);
502 fOutput->Add(fMassHistTC[i]);
503 fOutput->Add(fMassHistTCPlus[i]);
504 fOutput->Add(fMassHistTCMinus[i]);
509 fInvMassK0S = new TH2F("K0S","K0S", 500,0.3,0.8,500,0,50);
510 fInvMassK0S->GetXaxis()->SetTitle("Invariant Mass (#pi #pi) (GeV/c^{2})");
511 fInvMassK0S->GetYaxis()->SetTitle("K0S pt (GeV/c)");
512 fOutput->Add(fInvMassK0S);
514 fMCSources = new TH1F("MCSources","Origin of associated particles in MC", 10, -0.5, 9.5);
515 fMCSources->GetXaxis()->SetBinLabel(1,"All ");
516 fMCSources->GetXaxis()->SetBinLabel(2," from Heavy flavour");
517 fMCSources->GetXaxis()->SetBinLabel(3," from c->D");
518 fMCSources->GetXaxis()->SetBinLabel(4," from b->D");
519 fMCSources->GetXaxis()->SetBinLabel(5," from b->B");
520 if(fReadMC) fOutput->Add(fMCSources);
522 fK0Origin = new TH1F("K0Origin","Origin of K0 ", 10, -0.5, 5.5);
523 fK0Origin->GetXaxis()->SetBinLabel(1,"All K0s");
524 fK0Origin->GetXaxis()->SetBinLabel(2,"K0s from Heavy flavour");
525 fK0Origin->GetXaxis()->SetBinLabel(3,"K0s from Charm");
526 fK0Origin->GetXaxis()->SetBinLabel(4,"K0s from Beauty");
527 if(fReadMC) fOutput->Add(fK0Origin);
529 fKaonOrigin = new TH1F("K0Origin","Origin of Kaon ", 10, -0.5, 5.5);
530 fKaonOrigin->GetXaxis()->SetBinLabel(1,"All Kaons");
531 fKaonOrigin->GetXaxis()->SetBinLabel(2,"Kaons from Heavy flavour");
532 fKaonOrigin->GetXaxis()->SetBinLabel(3,"Kaons from Charm");
533 fKaonOrigin->GetXaxis()->SetBinLabel(4,"Kaons from Beauty");
534 if(fReadMC) fOutput->Add(fKaonOrigin);
538 fEventMix = new TH2F("EventMixingCheck","EventMixingCheck",5,-0.5,4.5,7,-0.5,6.5);
539 if(fMixing)fOutput->Add(fEventMix);
542 fHistNEvents = new TH1F("fHistNEvents", "number of events ",11,-0.5,10.5);
543 fHistNEvents->GetXaxis()->SetBinLabel(1,"nEventsAnal");
544 fHistNEvents->GetXaxis()->SetBinLabel(2,"nEvents accepted");
545 fHistNEvents->GetXaxis()->SetBinLabel(3,"Rejected due to trigger");
546 fHistNEvents->GetXaxis()->SetBinLabel(4,"Rejected pileup events");
547 fHistNEvents->GetXaxis()->SetBinLabel(5,"Rejected due to centrality");
548 fHistNEvents->GetXaxis()->SetBinLabel(6,"Rejected due to vtxz");
549 fHistNEvents->GetXaxis()->SetBinLabel(7,"Rejected due to Physics Sel");
550 fHistNEvents->GetXaxis()->SetBinLabel(8,"Total no. of candidate");
551 fHistNEvents->GetXaxis()->SetBinLabel(9,"no. of cand wo bitmask");
552 fHistNEvents->GetXaxis()->SetBinLabel(10,"D+ after loose cuts");
553 fHistNEvents->GetXaxis()->SetBinLabel(11,"D+ after tight cuts");
555 fHistNEvents->GetXaxis()->SetNdivisions(1,kFALSE);
556 fHistNEvents->Sumw2();
557 fHistNEvents->SetMinimum(0);
558 fOutput->Add(fHistNEvents);
560 fPtVsMass=new TH2F("hPtVsMass","PtVsMass (prod. cuts)",nbins,fLowmasslimit,fUpmasslimit,200,0.,20.);
561 fPtVsMassTC=new TH2F("hPtVsMassTC","PtVsMass (analysis cuts)",nbins,fLowmasslimit,fUpmasslimit,200,0.,20.);
562 fYVsPt=new TH2F("hYVsPt","YvsPt (prod. cuts)",40,0.,20.,80,-2.,2.);
563 fYVsPtTC=new TH2F("hYVsPtTC","YvsPt (analysis cuts)",40,0.,20.,80,-2.,2.);
564 fYVsPtSig=new TH2F("hYVsPtSig","YvsPt (MC, only sig., prod. cuts)",40,0.,20.,80,-2.,2.);
565 fYVsPtSigTC=new TH2F("hYVsPtSigTC","YvsPt (MC, only Sig, analysis cuts)",40,0.,20.,80,-2.,2.);
567 fOutput->Add(fPtVsMass);
568 fOutput->Add(fPtVsMassTC);
569 fOutput->Add(fYVsPt);
570 fOutput->Add(fYVsPtTC);
571 fOutput->Add(fYVsPtSig);
572 fOutput->Add(fYVsPtSigTC);
575 // Counter for Normalization
576 TString normName="NormalizationCounter";
577 AliAnalysisDataContainer *cont = GetOutputSlot(3)->GetContainer();
578 if(cont)normName=(TString)cont->GetName();
579 fCounter = new AliNormalizationCounter(normName.Data());
585 PostData(3,fCounter);
589 //________________________________________________________________________
590 void AliAnalysisTaskSEDplusCorrelations::UserExec(Option_t */*option*/)
593 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
594 TClonesArray *array3Prong = 0;
597 if(fSelect==1) cout << "TASK::Correlation with hadrons on SE "<< endl;
598 if(fSelect==2) cout << "TASK::Correlation with kaons on SE "<< endl;
599 if(fSelect==3) cout << "TASK::Correlation with kzeros on SE "<< endl;
602 if(fSelect==1) cout << "TASK::Correlation with hadrons on ME "<< endl;
603 if(fSelect==2) cout << "TASK::Correlation with kaons on ME "<< endl;
604 if(fSelect==3) cout << "TASK::Correlation with kzeros on ME "<< endl;
608 if(!aod && AODEvent() && IsStandardAOD()) {
610 aod = dynamic_cast<AliAODEvent*> (AODEvent());
611 AliAODHandler* aodHandler = (AliAODHandler*)
612 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
613 if(aodHandler->GetExtensions()) {
614 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
615 AliAODEvent *aodFromExt = ext->GetAOD();
616 array3Prong=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
619 array3Prong=(TClonesArray*)aod->GetList()->FindObject("Charm3Prong");
622 if(!aod || !array3Prong) {
623 printf("AliAnalysisTaskSEDplusCorrelations::UserExec: Charm3Prong branch not found!\n");
628 // the AODs with null vertex pointer didn't pass the PhysSel
629 if(!aod->GetPrimaryVertex()||TMath::Abs(aod->GetMagneticField())<0.001) return;
630 fCounter->StoreEvent(aod,fRDCutsAnalysis,fReadMC);
631 fHistNEvents->Fill(0); // count event
634 Bool_t isEvSel=fRDCutsAnalysis->IsEventSelected(aod);
640 fHistNEvents->Fill(1);
644 TClonesArray *arrayMC=0;
645 AliAODMCHeader *mcHeader=0;
646 // AOD primary vertex
647 AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
649 TString primTitle = vtx1->GetTitle();
650 //if(primTitle.Contains("VertexerTracks") && vtx1->GetNContributors()>0)fHistNEvents->Fill(2);
655 arrayMC = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
657 printf("AliAnalysisTaskSEDplusCorrelations::UserExec: MC particles branch not found!\n");
662 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
664 printf("AliAnalysisTaskSEDplusCorrelations::UserExec: MC header branch not found!\n");
669 //HFCorrelators initialization (for this event)
671 fCorrelator->SetAODEvent(aod); // set the event to be processedfCorrelator->
672 Bool_t correlatorON = fCorrelator->Initialize(); //define the pool for mixing
674 AliInfo("AliHFCorrelator didn't initialize the pool correctly or processed a bad event");
677 if(fReadMC) fCorrelator->SetMCArray(arrayMC);
681 Int_t n3Prong = array3Prong->GetEntriesFast();
682 // printf("Number of D+->Kpipi: %d and of tracks: %d\n",n3Prong,aod->GetNumberOfTracks());
685 Int_t pdgDgDplustoKpipi[3]={321,211,211};
686 Int_t nSelectedloose=0,nSelectedtight=0;
690 for (Int_t i3Prong = 0; i3Prong < n3Prong; i3Prong++) {
691 AliAODRecoDecayHF3Prong *d = (AliAODRecoDecayHF3Prong*)array3Prong->UncheckedAt(i3Prong);
692 fHistNEvents->Fill(7);
694 if(fUseBit && !d->HasSelectionBit(AliRDHFCuts::kDplusCuts)){
695 fHistNEvents->Fill(8);
699 Int_t passTightCuts=fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kAll,aod);
701 if(!fRDCutsAnalysis->GetIsSelectedCuts()) continue;
703 Bool_t unsetvtx=kFALSE;
704 if(!d->GetOwnPrimaryVtx()){
705 d->SetOwnPrimaryVtx(vtx1);
710 Double_t ptCand = d->Pt();
711 Int_t iPtBin = fRDCutsAnalysis->PtBin(ptCand);
712 Bool_t recVtx=kFALSE;
713 AliAODVertex *origownvtx=0x0;
714 if(fRDCutsAnalysis->GetIsPrimaryWithoutDaughters()){
715 if(d->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*d->GetOwnPrimaryVtx());
716 if(fRDCutsAnalysis->RecalcOwnPrimaryVtx(d,aod))recVtx=kTRUE;
717 else fRDCutsAnalysis->CleanOwnPrimaryVtx(d,aod,origownvtx);
724 Bool_t isDplus = kFALSE;
727 labDp = d->MatchToMC(411,arrayMC,3,pdgDgDplustoKpipi);
734 Double_t invMass=d->InvMassDplus();
735 Double_t rapid=d->YDplus();
736 fYVsPt->Fill(ptCand,rapid);
737 if(passTightCuts>0.) {fYVsPtTC->Fill(ptCand,rapid);nOS++;}
738 //printf("****************: %d and of tracks: %d\n",n3Prong,nOS);
739 Bool_t isFidAcc=fRDCutsAnalysis->IsInFiducialAcceptance(ptCand,rapid);
741 fPtVsMass->Fill(invMass,ptCand);
742 if(passTightCuts>0) fPtVsMassTC->Fill(invMass,ptCand);
747 index=GetHistoIndex(iPtBin);
749 fHistNEvents->Fill(9);
751 fMassHist[index]->Fill(invMass);
753 // loop for tight cuts
755 fHistNEvents->Fill(10);
757 fMassHistTC[index]->Fill(invMass);
761 Double_t phiDplus = fCorrelator->SetCorrectPhiRange(d->Phi());
762 fCorrelator->SetTriggerParticleProperties(d->Pt(),phiDplus,d->Eta());
764 Int_t nIDs[3] = {-9999999};
765 nIDs[0] = ((AliAODTrack*)d->GetDaughter(0))->GetID();
766 nIDs[1] = ((AliAODTrack*)d->GetDaughter(1))->GetID();
767 nIDs[2] = ((AliAODTrack*)d->GetDaughter(2))->GetID();
770 Double_t philead = 0;
775 Bool_t execPool = fCorrelator->ProcessEventPool();
777 // printf("*************: %d\n",execPool);
778 if(fMixing && !execPool) {
779 AliInfo("Mixed event analysis: pool is not ready");
782 Int_t NofEventsinPool = 1;
784 NofEventsinPool = fCorrelator->GetNofEventsInPool();
789 for (Int_t jMix =0; jMix < NofEventsinPool; jMix++){// loop on events in the pool; if it is SE analysis, stops at one
791 Bool_t analyzetracks = fCorrelator->ProcessAssociatedTracks(jMix);
793 AliInfo("AliHFCorrelator::Cannot process the track array");
797 //start the track loop
799 // Int_t NofTracks = fCorrelator->GetNofTracks();
801 for (Int_t iTrack = 0;iTrack<fCorrelator->GetNofTracks();iTrack++) {
802 Bool_t runcorrelation = fCorrelator->Correlate(iTrack);
804 if(!runcorrelation) continue;
805 Double_t DeltaPhi = fCorrelator->GetDeltaPhi();
806 Double_t DeltaEta = fCorrelator->GetDeltaEta();
808 AliReducedParticle* redpart = fCorrelator->GetAssociatedParticle();
809 Double_t phiHad=redpart->Phi();
810 Double_t ptHad=redpart->Pt();
811 Int_t label = redpart->GetLabel();
812 Int_t trackid = redpart->GetID();
813 phiHad = fCorrelator->SetCorrectPhiRange(phiHad);
816 // discard the dplus daughters
818 if( trackid == nIDs[0] || trackid == nIDs[1] || trackid == nIDs[2]) continue;
820 // discard the negative id tracks
821 if(trackid < 0) continue;
824 FillCorrelations(d,DeltaPhi,DeltaEta,index,fSelect);
826 // For leading particle
829 refpt = ptHad; ptlead = ptHad;
830 philead = d->Phi() - phiHad;
831 if (philead < (-1)*TMath::Pi()/2) philead += 2*TMath::Pi();
832 if (philead > 3*TMath::Pi()/2) philead -= 2*TMath::Pi();
838 if(fReadMC && isDplus) {
840 index=GetSignalHistoIndex(iPtBin);
842 Int_t PartSource = fCuts->IsMCpartFromHF(label,arrayMC); // check source of associated particle (hadron/kaon/K0)
843 FillMCCorrelations(d,DeltaPhi,DeltaEta,index,PartSource,fSelect);
850 // For leading particle
851 fMassVsdPhiHistLeadHad[index]->Fill(invMass,philead);
852 fLeadPt[index]->Fill(ptlead);
854 if(fReadMC && isDplus) {
855 index=GetSignalHistoIndex(iPtBin);
856 fMassVsdPhiHistLeadHad[index]->Fill(invMass,philead);
857 fLeadPt[index]->Fill(ptlead);
871 if(recVtx)fRDCutsAnalysis->CleanOwnPrimaryVtx(d,aod,origownvtx);
873 if(unsetvtx) d->UnsetOwnPrimaryVtx();
878 Bool_t updated = fCorrelator->PoolUpdate();
880 if(!updated) AliInfo("Pool was not updated");
882 fCounter->StoreCandidates(aod,nSelectedloose,kTRUE);
883 fCounter->StoreCandidates(aod,nSelectedtight,kFALSE);
887 PostData(2,fListCuts);
888 PostData(3,fCounter);
892 //________________________________________________________________________
893 void AliAnalysisTaskSEDplusCorrelations::Terminate(Option_t */*option*/)
895 // Terminate analysis
897 if(fDebug > 1) printf("AnalysisTaskSEDplusCorrelations: Terminate() \n");
899 fOutput = dynamic_cast<TList*> (GetOutputData(1));
901 printf("ERROR: fOutput not available\n");
904 fHistNEvents = dynamic_cast<TH1F*>(fOutput->FindObject("fHistNEvents"));
909 for(Int_t i=0;i<fNPtBins;i++){
910 index=GetHistoIndex(i);
912 hisname.Form("hMassPt%dTC",i);
913 fMassHistTC[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
916 TCanvas *c1=new TCanvas("c1","D+ invariant mass distribution",500,500);
918 TH1F *hMassPt=(TH1F*)fOutput->FindObject("hMassPt3TC");
919 hMassPt->SetLineColor(kBlue);
920 hMassPt->SetXTitle("M[GeV/c^{2}]");
927 //________________________________________________________________________
928 void AliAnalysisTaskSEDplusCorrelations::FillCorrelations(AliAODRecoDecayHF3Prong* d, Double_t deltaPhi, Double_t deltaEta, Int_t ind, Int_t sel) const{
931 Double_t invMass=d->InvMassDplus();
935 fMassVsdPhiHistHad[ind]->Fill(invMass,deltaPhi);
936 fMassVsdEtaHistHad[ind]->Fill(invMass,deltaEta);
939 fMassVsdPhiHistKaon[ind]->Fill(invMass,deltaPhi);
940 fMassVsdEtaHistKaon[ind]->Fill(invMass,deltaEta);
943 fMassVsdPhiHistKshort[ind]->Fill(invMass,deltaPhi);
944 fMassVsdEtaHistKshort[ind]->Fill(invMass,deltaEta);
952 //________________________________________________________________________
953 void AliAnalysisTaskSEDplusCorrelations::FillMCCorrelations(AliAODRecoDecayHF3Prong* d, Double_t deltaPhi, Double_t deltaEta, Int_t ind,Int_t mcSource, Int_t sel) const{
954 // Filling histos with MC information
956 Double_t invMass=d->InvMassDplus();
960 fMassVsdPhiHistHad[ind]->Fill(invMass,deltaPhi);
961 fMassVsdEtaHistHad[ind]->Fill(invMass,deltaEta);
966 if (mcSource==44){ // is from charm ->D
970 if (mcSource==54){ // is from beauty -> D
974 if (mcSource==55){ // is from beauty ->B
981 fMassVsdPhiHistKaon[ind]->Fill(invMass,deltaPhi);
982 fMassVsdEtaHistKaon[ind]->Fill(invMass,deltaEta);
983 fKaonOrigin->Fill(0);
984 if (mcSource==44){ // is from charm ->D
985 fKaonOrigin->Fill(1);
986 fKaonOrigin->Fill(2);
988 if (mcSource==54){ // is from beauty -> D
989 fKaonOrigin->Fill(1);
990 fKaonOrigin->Fill(3);
992 if (mcSource==55){ // is from beauty ->B
993 fKaonOrigin->Fill(1);
994 fKaonOrigin->Fill(4);
998 fMassVsdPhiHistKshort[ind]->Fill(invMass,deltaPhi);
999 fMassVsdEtaHistKshort[ind]->Fill(invMass,deltaEta);
1001 if (mcSource==44){ // is from charm ->D
1005 if (mcSource==54){ // is from beauty -> D
1009 if (mcSource==55){ // is from beauty ->B