1 /**************************************************************************
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 // Task for selecting D mesons to be used as an input for D-Jet correlations
19 //-----------------------------------------------------------------------
21 // C. Bianchin (Utrecht University) chiara.bianchin@cern.ch
22 // A.Grelli (Utrecht University) a.grelli@uu.nl
23 // Xiaoming Zhang (LBNL) XMZhang@lbl.gov
24 //-----------------------------------------------------------------------
26 #include <TDatabasePDG.h>
27 #include <TParticle.h>
32 #include "AliRDHFCutsDStartoKpipi.h"
33 #include "AliRDHFCutsD0toKpi.h"
34 #include "AliAODMCHeader.h"
35 #include "AliAODHandler.h"
36 #include "AliAnalysisManager.h"
38 #include "AliAODVertex.h"
39 #include "AliAODRecoDecay.h"
40 #include "AliAODRecoCascadeHF.h"
41 #include "AliAODRecoDecayHF2Prong.h"
42 #include "AliESDtrack.h"
43 #include "AliAODMCParticle.h"
44 #include "AliAnalysisTaskSEDmesonsFilterCJ.h"
46 ClassImp(AliAnalysisTaskSEDmesonsFilterCJ)
48 //_______________________________________________________________________________
50 AliAnalysisTaskSEDmesonsFilterCJ::AliAnalysisTaskSEDmesonsFilterCJ() :
71 // Default constructor
74 for (Int_t i=4; i--;) fPDGdaughters[i] = 0;
75 for (Int_t i=30; i--;) fSigmaD0[i] = 0.;
78 //_______________________________________________________________________________
80 AliAnalysisTaskSEDmesonsFilterCJ::AliAnalysisTaskSEDmesonsFilterCJ(const char *name, AliRDHFCuts *cuts, ECandidateType candtype) :
81 AliAnalysisTaskSE(name),
84 fCandidateType(candtype),
101 // Constructor. Initialization of Inputs and Outputs
104 Info("AliAnalysisTaskSEDmesonsFilterCJ","Calling Constructor");
106 for (Int_t i=4; i--;) fPDGdaughters[i] = 0;
107 for (Int_t i=30; i--;) fSigmaD0[i] = 0.;
109 const Int_t nptbins = fCuts->GetNPtBins();
110 Float_t defaultSigmaD013[13] = { 0.012, 0.012, 0.012, 0.015, 0.015, 0.018, 0.018, 0.020, 0.020, 0.030, 0.030, 0.037, 0.040 };
112 switch (fCandidateType) {
114 fCandidateName = "D0";
117 fPDGdaughters[0] = 211; // pi
118 fPDGdaughters[1] = 321; // K
119 fPDGdaughters[2] = 0; // empty
120 fPDGdaughters[3] = 0; // empty
121 fBranchName = "D0toKpi";
124 fCandidateName = "Dstar";
127 fPDGdaughters[1] = 211; // pi soft
128 fPDGdaughters[0] = 421; // D0
129 fPDGdaughters[2] = 211; // pi fromD0
130 fPDGdaughters[3] = 321; // K from D0
131 fBranchName = "Dstar";
134 for (Int_t ipt=0; ipt<nptbins;ipt++) fSigmaD0[ipt] = defaultSigmaD013[ipt];
136 AliFatal(Form("Default sigma D0 not enough for %d pt bins, use SetSigmaD0ForDStar to set them",nptbins));
140 printf("%d not accepted!!\n",fCandidateType);
144 if (fCandidateType==kD0toKpi) SetMassLimits(0.15, fPDGmother);
145 if (fCandidateType==kDstartoKpipi) SetMassLimits(0.015, fPDGmother);
147 DefineOutput(1, TList::Class()); // histos
148 DefineOutput(2, AliRDHFCuts::Class()); // my cuts
149 DefineOutput(3, TClonesArray::Class()); //array of candidates
150 DefineOutput(4, TClonesArray::Class()); //array of SB candidates
153 //_______________________________________________________________________________
155 AliAnalysisTaskSEDmesonsFilterCJ::~AliAnalysisTaskSEDmesonsFilterCJ()
161 Info("~AliAnalysisTaskSEDmesonsFilterCJ","Calling Destructor");
163 if (fOutput) { delete fOutput; fOutput = 0; }
164 if (fCuts) { delete fCuts; fCuts = 0; }
165 if (fCandidateArray) { delete fCandidateArray; fCandidateArray = 0; }
166 delete fSideBandArray;
170 //_______________________________________________________________________________
172 void AliAnalysisTaskSEDmesonsFilterCJ::Init()
178 if(fDebug>1) printf("AnalysisTaskSEDmesonsForJetCorrelations::Init() \n");
180 switch (fCandidateType) {
183 AliRDHFCutsD0toKpi* copyfCutsDzero = new AliRDHFCutsD0toKpi(*(static_cast<AliRDHFCutsD0toKpi*>(fCuts)));
184 copyfCutsDzero->SetName("AnalysisCutsDzero");
185 PostData(2, copyfCutsDzero); // Post the data
189 AliRDHFCutsDStartoKpipi* copyfCutsDstar = new AliRDHFCutsDStartoKpipi(*(static_cast<AliRDHFCutsDStartoKpipi*>(fCuts)));
190 copyfCutsDstar->SetName("AnalysisCutsDStar");
191 PostData(2, copyfCutsDstar); // Post the cuts
199 //_______________________________________________________________________________
201 void AliAnalysisTaskSEDmesonsFilterCJ::UserCreateOutputObjects()
207 Info("UserCreateOutputObjects","CreateOutputObjects of task %s\n", GetName());
209 fOutput = new TList(); fOutput->SetOwner();
210 DefineHistoForAnalysis(); // define histograms
212 if (fCandidateType==kD0toKpi){
213 fCandidateArray = new TClonesArray("AliAODRecoDecayHF",0);
214 fSideBandArray = new TClonesArray("AliAODRecoDecayHF",0);
217 if (fCandidateType==kDstartoKpipi) {
218 fCandidateArray = new TClonesArray("AliAODRecoCascadeHF",0);
219 fSideBandArray = new TClonesArray("AliAODRecoCascadeHF",0);
222 fCandidateArray->SetOwner();
223 fCandidateArray->SetName(Form("fCandidateArray%s%s",fCandidateName.Data(),fUseReco ? "rec" : "gen"));
225 //this is used for the DStar side bands and MC!
226 fSideBandArray->SetOwner();
227 fSideBandArray->SetName(Form("fSideBandArray%s%s",fCandidateName.Data(),fUseReco ? "rec" : "gen"));
229 PostData(1, fOutput);
230 PostData(3, fCandidateArray);
231 PostData(4, fSideBandArray);
236 //_______________________________________________________________________________
238 void AliAnalysisTaskSEDmesonsFilterCJ::UserExec(Option_t *){
243 AliAODEvent *aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
245 TClonesArray *arrayDStartoD0pi = 0;
246 if (!aodEvent && AODEvent() && IsStandardAOD()) {
248 // In case there is an AOD handler writing a standard AOD, use the AOD
249 // event in memory rather than the input (ESD) event.
250 aodEvent = dynamic_cast<AliAODEvent*>(AODEvent());
252 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
253 // have to taken from the AOD event hold by the AliAODExtension
254 AliAODHandler *aodHandler = (AliAODHandler*)((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
255 if(aodHandler->GetExtensions()) {
256 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
257 AliAODEvent *aodFromExt = ext->GetAOD();
258 arrayDStartoD0pi = (TClonesArray*)aodFromExt->GetList()->FindObject(fBranchName.Data());
261 arrayDStartoD0pi = (TClonesArray*)aodEvent->GetList()->FindObject(fBranchName.Data());
264 if (!arrayDStartoD0pi) {
265 AliInfo(Form("Could not find array %s, skipping the event",fBranchName.Data()));
268 AliDebug(2, Form("Found %d vertices",arrayDStartoD0pi->GetEntriesFast()));
271 TClonesArray* mcArray = 0x0;
273 mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
275 printf("AliAnalysisTaskSEDStarSpectra::UserExec: MC particles not found!\n");
281 TH1I* hstat = (TH1I*)fOutput->FindObject("hstat");
282 TH1F* hnSBCandEv=(TH1F*)fOutput->FindObject("hnSBCandEv");
283 TH1F* hnCandEv=(TH1F*)fOutput->FindObject("hnCandEv");
284 TH2F* hInvMassptD = (TH2F*)fOutput->FindObject("hInvMassptD");
287 if (fCandidateType==kDstartoKpipi) hPtPion = (TH1F*)fOutput->FindObject("hPtPion");
290 // fix for temporary bug in ESDfilter
291 // the AODs with null vertex pointer didn't pass the PhysSel
292 if(!aodEvent->GetPrimaryVertex() || TMath::Abs(aodEvent->GetMagneticField())<0.001) return;
295 Bool_t iseventselected=fCuts->IsEventSelected(aodEvent);
296 //TString firedTriggerClasses=((AliAODEvent*)aodEvent)->GetFiredTriggerClasses();
297 if (!iseventselected) return;
300 const Int_t nD = arrayDStartoD0pi->GetEntriesFast();
301 if(!fUseMCInfo) hstat->Fill(2, nD);
303 //D* and D0 prongs needed to MatchToMC method
304 Int_t pdgDgDStartoD0pi[2] = { 421, 211 }; // D0,pi
305 Int_t pdgDgD0toKpi[2] = { 321, 211 }; // K, pi
308 Int_t pdgdaughtersD0[2] = { 211, 321 }; // pi,K
309 Int_t pdgdaughtersD0bar[2] = { 321, 211 }; // K,pi
313 Int_t isSelected = 0;
314 AliAODRecoDecayHF *charmCand = 0;
315 AliAODRecoCascadeHF *dstar = 0;
316 AliAODMCParticle *charmPart = 0;
317 Bool_t isMCBkg=kFALSE;
319 Double_t mPDGD0 = TDatabasePDG::Instance()->GetParticle(421)->Mass();
321 Int_t mcLabel = -9999;
322 Int_t pdgMeson = 413;
323 if (fCandidateType==kD0toKpi) pdgMeson = 421;
325 //clear the TClonesArray from the previous event
326 fCandidateArray->Clear();
327 fSideBandArray->Clear();
329 for (Int_t icharm=0; icharm<nD; icharm++) { //loop over D candidates
330 charmCand = (AliAODRecoDecayHF*)arrayDStartoD0pi->At(icharm); // D candidates
331 if (!charmCand) continue;
333 TString smcTruth="S";
335 if (fCandidateType==kDstartoKpipi) dstar = (AliAODRecoCascadeHF*)charmCand;
337 if (fUseMCInfo) { // Look in MC, try to simulate the z
338 if (fCandidateType==kDstartoKpipi) {
339 mcLabel = dstar->MatchToMC(413,421,pdgDgDStartoD0pi,pdgDgD0toKpi,mcArray);
342 if (fCandidateType==kD0toKpi)
343 mcLabel = charmCand->MatchToMC(421,mcArray,fNProngs,fPDGdaughters);
353 if (!isMCBkg) charmPart=(AliAODMCParticle*)mcArray->At(mcLabel);
355 if (isMCBkg) smcTruth="B";
359 Double_t ptD = charmCand->Pt();
361 // region of interest + cuts
362 if (!fCuts->IsInFiducialAcceptance(ptD,charmCand->Y(pdgMeson))) continue;
364 if(!fUseMCInfo && fCandidateType==kDstartoKpipi){
365 //select by track cuts the side band candidates (don't want mass cut)
366 isSelected = fCuts->IsSelected(charmCand,AliRDHFCuts::kTracks,aodEvent);
367 if (!isSelected) continue;
368 //add a reasonable cut on the invariant mass (e.g. (+-2\sigma, +-10 \sigma), with \sigma = fSigmaD0[bin])
369 Int_t bin = fCuts->PtBin(ptD);
370 if(bin<0 || bin>=fCuts->GetNPtBins()) {
371 AliError(Form("Pt %.3f out of bounds",ptD));
374 //if data and Dstar from D0 side band
375 if (((dstar->InvMassD0()<=(mPDGD0-3.*fSigmaD0[bin])) && (dstar->InvMassD0()>(mPDGD0-10.*fSigmaD0[bin]))) /*left side band*/|| ((dstar->InvMassD0()>=(mPDGD0+3.*fSigmaD0[bin])) && (dstar->InvMassD0()<(mPDGD0+10.*fSigmaD0[bin])))/*right side band*/){
377 new ((*fSideBandArray)[iSBCand]) AliAODRecoCascadeHF(*dstar);
381 //candidate selected by cuts and PID
382 isSelected = fCuts->IsSelected(charmCand,AliRDHFCuts::kAll,aodEvent); //selected
383 if (!isSelected) continue;
385 Int_t nprongs=charmCand->GetNProngs();
387 //for data and MC signal fill fCandidateArray
388 if(!fUseMCInfo || (fUseMCInfo && !isMCBkg)){
389 // for data or MC with the requirement fUseReco fill with candidates
392 if (fCandidateType==kDstartoKpipi){
393 new ((*fCandidateArray)[iCand]) AliAODRecoCascadeHF(*dstar);
394 AliInfo(Form("Dstar delta mass = %f",dstar->DeltaInvMass()));
395 fhInvMassS->Fill(dstar->DeltaInvMass());
398 new ((*fCandidateArray)[iCand]) AliAODRecoDecayHF(*charmCand);
399 //Printf("Filling reco");
400 for(Int_t kd=0;kd<nprongs;kd++){
401 fhImpPar->Fill(charmCand->Getd0Prong(kd),charmCand->PtProng(kd));
404 masses[0] = charmCand->InvMass(fNProngs, (UInt_t*)pdgdaughtersD0); //D0
405 masses[1] = charmCand->InvMass(fNProngs, (UInt_t*)pdgdaughtersD0bar); //D0bar
406 fhInvMassS->Fill(masses[0]);
407 fhInvMassS->Fill(masses[1]);
414 // for MC with requirement particle level fill with AliAODMCParticle
415 else if (fUseMCInfo) {
416 new ((*fCandidateArray)[iCand]) AliAODMCParticle(*charmPart);
417 //Printf("Filling gen");
423 //for MC background fill fSideBandArray (which is instead filled above for DStar in case of data for the side bands candidates)
425 if (fCandidateType==kDstartoKpipi){
426 new ((*fSideBandArray)[iSBCand]) AliAODRecoCascadeHF(*dstar);
427 fhInvMassB->Fill(dstar->DeltaInvMass());
429 if (fCandidateType==kD0toKpi){
430 new ((*fSideBandArray)[iSBCand]) AliAODRecoDecayHF(*charmCand);
432 masses[0] = charmCand->InvMass(fNProngs, (UInt_t*)pdgdaughtersD0); //D0
433 masses[1] = charmCand->InvMass(fNProngs, (UInt_t*)pdgdaughtersD0bar); //D0bar
434 fhInvMassB->Fill(masses[0]);
435 fhInvMassB->Fill(masses[1]);
443 if (fCandidateType==kDstartoKpipi) { //D*->D0pi->Kpipi
445 //softpion from D* decay
446 AliAODTrack *track2 = (AliAODTrack*)dstar->GetBachelor();
448 // select D* in the D0 window.
449 // In the cut object window is loose to allow for side bands
452 // retrieve the corresponding pt bin for the candidate
453 // and set the expected D0 width (x3)
454 // static const Int_t n = fCuts->GetNPtBins();
455 Int_t bin = fCuts->PtBin(ptD);
456 if(bin<0 || bin>=fCuts->GetNPtBins()) {
457 AliError(Form("Pt %.3f out of bounds",ptD));
461 AliInfo(Form("Pt bin %d and sigma D0 %.4f",bin,fSigmaD0[bin]));
462 //consider the Dstar candidates only if the mass of the D0 is in 3 sigma wrt the PDG value
463 if ((dstar->InvMassD0()>=(mPDGD0-3.*fSigmaD0[bin])) && (dstar->InvMassD0()<=(mPDGD0+3.*fSigmaD0[bin]))) {
464 masses[0] = dstar->DeltaInvMass(); //D*
465 masses[1] = 0.; //dummy for D*
468 hInvMassptD->Fill(masses[0], ptD); // 2 D slice for pt bins
470 // D* pt and soft pion pt for good candidates
471 Double_t mPDGDstar = TDatabasePDG::Instance()->GetParticle(413)->Mass();
472 Double_t invmassDelta = dstar->DeltaInvMass();
473 if (TMath::Abs(invmassDelta-(mPDGDstar-mPDGD0))<0.0021) hPtPion->Fill(track2->Pt());
476 if (fUseMCInfo){ //fill histograms of kinematics, using MC truth
478 TH2F *halphaDD = (TH2F*)fOutput->FindObject(Form("halphaDD%s",smcTruth.Data()));
479 TH2F *halphaDpis = (TH2F*)fOutput->FindObject(Form("halphaDpis%s",smcTruth.Data()));
480 TH2F *halphaDpi = (TH2F*)fOutput->FindObject(Form("halphaDpi%s",smcTruth.Data()));
481 TH2F *halphaDK = (TH2F*)fOutput->FindObject(Form("halphaDK%s",smcTruth.Data()));
483 TH2F *hdeltaRDD = (TH2F*)fOutput->FindObject(Form("hdeltaRDD%s",smcTruth.Data()));
484 TH2F *hdeltaRDpis = (TH2F*)fOutput->FindObject(Form("hdeltaRDpis%s",smcTruth.Data()));
485 TH2F *hdeltaRDpi = (TH2F*)fOutput->FindObject(Form("hdeltaRDpi%s",smcTruth.Data()));
486 TH2F *hdeltaRDK = (TH2F*)fOutput->FindObject(Form("hdeltaRDK%s",smcTruth.Data()));
488 Double_t aD = dstar->Phi(),
491 AliAODRecoDecayHF2Prong* D0fromDstar=dstar->Get2Prong();
492 Double_t aD0 = D0fromDstar->Phi();
493 Int_t isD0= D0fromDstar->Charge()>0 ? kTRUE : kFALSE;
494 Double_t aK = isD0 ? D0fromDstar->PhiProng(0) : D0fromDstar->PhiProng(1),
495 api= isD0 ? D0fromDstar->PhiProng(1) : D0fromDstar->PhiProng(0);
496 Double_t dRDD0 = DeltaR(dstar,D0fromDstar),
497 dRDpis = DeltaR(dstar,track2),
498 dRDpi = DeltaR(dstar, isD0 ? (AliVParticle*)D0fromDstar->GetDaughter(1) : (AliVParticle*)D0fromDstar->GetDaughter(0)),
499 dRDK = DeltaR(dstar, isD0 ? (AliVParticle*)D0fromDstar->GetDaughter(0) : (AliVParticle*)D0fromDstar->GetDaughter(1));
501 halphaDD-> Fill(aD-aD0,ptD);
502 halphaDpis->Fill(aD-apis,ptD);
503 halphaDpi-> Fill(aD-api,ptD);
504 halphaDK-> Fill(aD-aK,ptD);
506 hdeltaRDD-> Fill(dRDD0,ptD);
507 hdeltaRDpis->Fill(dRDpis,ptD);
508 hdeltaRDpi-> Fill(dRDpi,ptD);
509 hdeltaRDK-> Fill(dRDK,ptD);
512 fhImpParB->Fill(charmCand->Getd0Prong(0),charmCand->PtProng(0)); //bachelor
513 fhImpParB->Fill(D0fromDstar->Getd0Prong(0),D0fromDstar->PtProng(0));
514 fhImpParB->Fill(D0fromDstar->Getd0Prong(1),D0fromDstar->PtProng(1));
517 fhImpPar->Fill(charmCand->Getd0Prong(0),charmCand->PtProng(0)); //bachelor
518 fhImpPar->Fill(D0fromDstar->Getd0Prong(0),D0fromDstar->PtProng(0));
519 fhImpPar->Fill(D0fromDstar->Getd0Prong(1),D0fromDstar->PtProng(1));
525 fhImpPar->Fill(charmCand->Getd0Prong(0),charmCand->PtProng(0)); //bachelor
526 AliAODRecoDecayHF2Prong* D0fromDstar=dstar->Get2Prong();
527 fhImpPar->Fill(D0fromDstar->Getd0Prong(0),D0fromDstar->PtProng(0));
528 fhImpPar->Fill(D0fromDstar->Getd0Prong(1),D0fromDstar->PtProng(1));
533 if (fCandidateType==kD0toKpi) { //D0->Kpi
536 masses[0] = charmCand->InvMass(fNProngs, (UInt_t*)pdgdaughtersD0); //D0
537 masses[1] = charmCand->InvMass(fNProngs, (UInt_t*)pdgdaughtersD0bar); //D0bar
541 if (isSelected==1 || isSelected==3) hInvMassptD->Fill(masses[0],ptD);
542 if (isSelected>=2) hInvMassptD->Fill(masses[1],ptD);
544 if (fUseMCInfo) { //fill histograms of kinematics, using MC truth
546 Double_t aD = charmCand->Phi();
547 Double_t adaugh[2]={charmCand->PhiProng(0),charmCand->PhiProng(1)};
548 AliAODTrack* p0=(AliAODTrack*)charmCand->GetDaughter(0);
549 AliAODTrack* p1=(AliAODTrack*)charmCand->GetDaughter(1);
550 Float_t dR0 = DeltaR(charmCand, p0), dR1 = DeltaR(charmCand, p1);
552 if(mcLabel==421) isD0=kTRUE;
553 if(mcLabel==-421) isD0=kFALSE;
555 if(isMCBkg) { //background
556 TH2F *halphaDpi = (TH2F*)fOutput->FindObject(Form("halphaDpi%s",smcTruth.Data()));
557 TH2F *halphaDK = (TH2F*)fOutput->FindObject(Form("halphaDK%s",smcTruth.Data()));
559 TH2F *hdeltaRDpi = (TH2F*)fOutput->FindObject(Form("hdeltaRDpi%s",smcTruth.Data()));
560 TH2F *hdeltaRDK = (TH2F*)fOutput->FindObject(Form("hdeltaRDK%s",smcTruth.Data()));
563 if (isSelected==1 || isSelected==3) { // selected as D0
564 halphaDK->Fill(aD-adaugh[0],ptD);
565 halphaDpi->Fill(aD-adaugh[1],ptD);
567 hdeltaRDK->Fill(dR0,ptD);
568 hdeltaRDpi->Fill(dR1,ptD);
571 if (isSelected>=2) { //selected as D0bar
572 halphaDpi->Fill(aD-adaugh[0],ptD);
573 halphaDK->Fill(aD-adaugh[1],ptD);
575 hdeltaRDpi->Fill(dR0,ptD);
576 hdeltaRDK->Fill(dR1,ptD);
580 }else{ //signal and reflections
581 TH2F *halphaDpiS = (TH2F*)fOutput->FindObject("halphaDpiS");
582 TH2F *halphaDKS = (TH2F*)fOutput->FindObject("halphaDKS");
583 TH2F *halphaDpiR = (TH2F*)fOutput->FindObject("halphaDpiR");
584 TH2F *halphaDKR = (TH2F*)fOutput->FindObject("halphaDKR");
586 TH2F *hdeltaRDpiS = (TH2F*)fOutput->FindObject("hdeltaRDpiS");
587 TH2F *hdeltaRDKS = (TH2F*)fOutput->FindObject("hdeltaRDKS");
588 TH2F *hdeltaRDpiR = (TH2F*)fOutput->FindObject("hdeltaRDpiR");
589 TH2F *hdeltaRDKR = (TH2F*)fOutput->FindObject("hdeltaRDKR");
592 halphaDKS->Fill(aD-adaugh[0],ptD);
593 halphaDpiS->Fill(aD-adaugh[1],ptD);
595 hdeltaRDKS->Fill(dR0,ptD);
596 hdeltaRDpiS->Fill(dR1,ptD);
597 if(isSelected>=2){ //selected as D0bar
598 halphaDpiR->Fill(aD-adaugh[0],ptD);
599 halphaDKR->Fill(aD-adaugh[1],ptD);
601 hdeltaRDpiR->Fill(dR0,ptD);
602 hdeltaRDKR->Fill(dR1,ptD);
605 halphaDKS->Fill(aD-adaugh[1],ptD);
606 halphaDpiS->Fill(aD-adaugh[0],ptD);
608 hdeltaRDKS->Fill(dR1,ptD);
609 hdeltaRDpiS->Fill(dR0,ptD);
611 if(isSelected>=2){ //selected as D0bar
612 halphaDpiR->Fill(aD-adaugh[1],ptD);
613 halphaDKR->Fill(aD-adaugh[0],ptD);
615 hdeltaRDpiR->Fill(dR1,ptD);
616 hdeltaRDKR->Fill(dR0,ptD);
620 } //end signal and reflections
630 } // end of D cand loop
632 hnCandEv->Fill(fCandidateArray->GetEntriesFast());
633 if (fCandidateType==kDstartoKpipi || fUseMCInfo) {
634 Int_t nsbcand=fSideBandArray->GetEntriesFast();
635 hstat->Fill(4,nsbcand);
636 hnSBCandEv->Fill(nsbcand);
638 //Printf("N candidates selected %d, counter = %d",fCandidateArray->GetEntries(), iCand);
639 PostData(1, fOutput);
640 PostData(3, fCandidateArray);
641 PostData(4, fSideBandArray);
646 //_______________________________________________________________________________
648 void AliAnalysisTaskSEDmesonsFilterCJ::Terminate(Option_t*)
650 // The Terminate() function is the last function to be called during
651 // a query. It always runs on the client, it can be used to present
652 // the results graphically or save the results to file.
654 Info("Terminate"," terminate");
655 AliAnalysisTaskSE::Terminate();
657 fOutput = dynamic_cast<TList*>(GetOutputData(1));
659 printf("ERROR: fOutput not available\n");
666 //_______________________________________________________________________________
668 void AliAnalysisTaskSEDmesonsFilterCJ::SetMassLimits(Double_t range, Int_t pdg)
671 // AliAnalysisTaskSEDmesonsFilterCJ::SetMassLimits
674 Float_t mass = TDatabasePDG::Instance()->GetParticle(TMath::Abs(pdg))->Mass();
676 // compute the Delta mass for the D*
677 if (fCandidateType==kDstartoKpipi) mass -= TDatabasePDG::Instance()->GetParticle(421)->Mass();
680 fMinMass = mass - range;
681 fMaxMass = mass + range;
683 AliInfo(Form("Setting mass limits to %f, %f",fMinMass,fMaxMass));
684 if ((fMinMass<0.) || (fMaxMass<=0.) || (fMaxMass<fMinMass)) AliFatal("Wrong mass limits!\n");
689 //_______________________________________________________________________________
691 void AliAnalysisTaskSEDmesonsFilterCJ::SetMassLimits(Double_t lowlimit, Double_t uplimit)
694 // AliAnalysisTaskSEDmesonsFilterCJ::SetMassLimits
697 if (uplimit>lowlimit) {
701 printf("Error! Lower limit larger than upper limit!\n");
702 fMinMass = uplimit - uplimit*0.2;
709 //_______________________________________________________________________________
711 Bool_t AliAnalysisTaskSEDmesonsFilterCJ::SetD0WidthForDStar(Int_t nptbins, Float_t *width)
714 // AliAnalysisTaskSEDmesonsFilterCJ::SetD0WidthForDStar
718 AliInfo("Maximum number of bins allowed is 30!");
722 if (!width) return kFALSE;
723 for (Int_t ipt=0; ipt<nptbins; ipt++) fSigmaD0[ipt]=width[ipt];
728 //_______________________________________________________________________________
730 Bool_t AliAnalysisTaskSEDmesonsFilterCJ::DefineHistoForAnalysis()
733 // AliAnalysisTaskSEDmesonsFilterCJ::DefineHistoForAnalysis
737 TH1I* hstat = new TH1I("hstat","Statistics",6,-0.5,5.5);
738 hstat->GetXaxis()->SetBinLabel(1, "N ev anal");
739 hstat->GetXaxis()->SetBinLabel(2, "N ev sel");
741 if(fUseReco) hstat->GetXaxis()->SetBinLabel(3, "N D");
742 else hstat->GetXaxis()->SetBinLabel(3, "N Gen D");
743 } else hstat->GetXaxis()->SetBinLabel(3, "N Cand");
744 hstat->GetXaxis()->SetBinLabel(4, "N cand sel cuts");
745 if (fCandidateType==kDstartoKpipi) hstat->GetXaxis()->SetBinLabel(5, "N side band cand");
747 hstat->GetXaxis()->SetBinLabel(6, "N Background");
749 hstat->SetNdivisions(1);
752 TH1F* hnCandEv=new TH1F("hnCandEv", "Number of candidates per event (after cuts);# cand/ev", 100, 0.,100.);
753 fOutput->Add(hnCandEv);
755 // Invariant mass related histograms
756 const Int_t nbinsmass = 200;
757 const Int_t ptbinsD=100;
758 Float_t ptmin=0.,ptmax=50.;
759 TH2F *hInvMass = new TH2F("hInvMassptD", "D invariant mass distribution", nbinsmass, fMinMass, fMaxMass, ptbinsD, ptmin, ptmax);
760 hInvMass->SetStats(kTRUE);
761 hInvMass->GetXaxis()->SetTitle("mass (GeV/c)");
762 hInvMass->GetYaxis()->SetTitle("p_{T} (GeV/c)");
763 fOutput->Add(hInvMass);
764 if ((fCandidateType==kDstartoKpipi) || fUseMCInfo){
765 TH1F* hnSBCandEv=new TH1F("hnSBCandEv", "Number of side bands candidates per event (after cuts);# cand/ev", 100, 0.,100.);
766 fOutput->Add(hnSBCandEv);
768 if (fCandidateType==kDstartoKpipi) {
770 TH1F* hPtPion = new TH1F("hPtPion", "Primary pions candidates pt", 500, 0., 10.);
771 hPtPion->SetStats(kTRUE);
772 hPtPion->GetXaxis()->SetTitle("p_{T} (GeV/c)");
773 hPtPion->GetYaxis()->SetTitle("entries");
774 fOutput->Add(hPtPion);
777 fhImpPar = new TH2F("hImpPar", "Impact parameter of daughter tracks; Getd0Prong();#it{p}^{daugh}_{T} (GeV/c)",200, -0.1,0.1,ptbinsD, ptmin, ptmax); //same range of pt of the D, but pt daughter used
778 fOutput->Add(fhImpPar);
780 const Int_t nbinsalpha=200;
781 Float_t minalpha=-TMath::Pi(), maxalpha=TMath::Pi();
782 const Int_t nbinsdeltaR= 200;
783 Float_t mindeltaR = 0., maxdeltaR = 10.;
785 if (fCandidateType==kDstartoKpipi){
786 TH2F* halphaDDS =new TH2F("halphaDDS","Angle D^{*}-D^{0} (Signal);#varphi (D^{*}) - #varphi (D0);p_{T}^{D*}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax);
787 TH2F* halphaDpisS=new TH2F("halphaDpisS","Angle D^{*}-#pi_{soft} (Signal);#varphi (D^{*}) - #varphi (#pi_{soft});p_{T}^{D*}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax);
788 TH2F* halphaDpiS =new TH2F("halphaDpiS","Angle D^{*}-#pi (Signal);#varphi (D^{*}) - #varphi (#pi);p_{T}^{D*}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax);
789 TH2F* halphaDKS =new TH2F("halphaDKS","Angle D^{*}-K (Signal);#varphi (D^{*}) - #varphi (K);p_{T}^{D*}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax);
791 TH2F* halphaDDB =new TH2F("halphaDDB","Angle D^{*}-D^{0} (Background);#varphi (D^{*}) - #varphi (D0);p_{T}^{D*}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax);
792 TH2F* halphaDpisB=new TH2F("halphaDpisB","Angle D^{*}-#pi_{soft} (Background);#varphi (D^{*}) - #varphi (#pi_{soft});p_{T}^{D*}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax);
793 TH2F* halphaDpiB =new TH2F("halphaDpiB","Angle D^{*}-#pi (Background);#varphi (D^{*}) - #varphi (#pi);p_{T}^{D*}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax);
794 TH2F* halphaDKB =new TH2F("halphaDKB","Angle D^{*}-K (Background);#varphi (D^{*}) - #varphi (K);p_{T}^{D*}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax);
796 TH2F* hdeltaRDDS =new TH2F("hdeltaRDDS","Angle D^{*}-D^{0} (Signal);#varphi (D^{*}) - #varphi (D0);p_{T}^{D*}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax);
797 TH2F* hdeltaRDpisS=new TH2F("hdeltaRDpisS","Angle D^{*}-#pi_{soft} (Signal);#varphi (D^{*}) - #varphi (#pi_{soft});p_{T}^{D*}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax);
798 TH2F* hdeltaRDpiS =new TH2F("hdeltaRDpiS","Angle D^{*}-#pi (Signal);#varphi (D^{*}) - #varphi (#pi);p_{T}^{D*}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax);
799 TH2F* hdeltaRDKS =new TH2F("hdeltaRDKS","Angle D^{*}-K (Signal);#varphi (D^{*}) - #varphi (K);p_{T}^{D*}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax);
801 TH2F* hdeltaRDDB =new TH2F("hdeltaRDDB","Angle D^{*}-D^{0} (Background);#varphi (D^{*}) - #varphi (D0);p_{T}^{D*}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax);
802 TH2F* hdeltaRDpisB=new TH2F("hdeltaRDpisB","Angle D^{*}-#pi_{soft} (Background);#varphi (D^{*}) - #varphi (#pi_{soft});p_{T}^{D*}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax);
803 TH2F* hdeltaRDpiB =new TH2F("hdeltaRDpiB","Angle D^{*}-#pi (Background);#varphi (D^{*}) - #varphi (#pi);p_{T}^{D*}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax);
804 TH2F* hdeltaRDKB =new TH2F("hdeltaRDKB","Angle D^{*}-K (Background);#varphi (D^{*}) - #varphi (K);p_{T}^{D*}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax);
806 fOutput->Add(halphaDDS);
807 fOutput->Add(halphaDpisS);
808 fOutput->Add(halphaDpiS);
809 fOutput->Add(halphaDKS);
810 fOutput->Add(halphaDDB);
811 fOutput->Add(halphaDpisB);
812 fOutput->Add(halphaDpiB);
813 fOutput->Add(halphaDKB);
815 fOutput->Add(hdeltaRDDS);
816 fOutput->Add(hdeltaRDpisS);
817 fOutput->Add(hdeltaRDpiS);
818 fOutput->Add(hdeltaRDKS);
819 fOutput->Add(hdeltaRDDB);
820 fOutput->Add(hdeltaRDpisB);
821 fOutput->Add(hdeltaRDpiB);
822 fOutput->Add(hdeltaRDKB);
825 if (fCandidateType==kD0toKpi){
827 TH2F* halphaDpiS=new TH2F("halphaDpiS","Angle D^{0}-#pi (Signal);#varphi (D^{0}) - #varphi (#pi);p_{T}^{D0}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax);
828 TH2F* halphaDKS =new TH2F("halphaDKS","Angle D^{0}-K (Signal);#varphi (D^{0}) - #varphi (K);p_{T}^{D0}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax);
829 TH2F* halphaDpiR=new TH2F("halphaDpiR","Angle D^{0}-#pi (Reflections);#varphi (D^{0}) - #varphi (#pi);p_{T}^{D0}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax);
830 TH2F* halphaDKR =new TH2F("halphaDKR","Angle D^{0}-K (Reflections);#varphi (D^{0}) - #varphi (K);p_{T}^{D0}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax);
832 TH2F* halphaDpiB=new TH2F("halphaDpiB","Angle D^{0}-#pi (Background);#varphi (D^{0}) - #varphi (#pi);p_{T}^{D0}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax);
833 TH2F* halphaDKB =new TH2F("halphaDKB","Angle D^{0}-K (Background);#varphi (D^{0}) - #varphi (K);p_{T}^{D0}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax);
836 TH2F* hdeltaRDpiS=new TH2F("hdeltaRDpiS","Angle D^{0}-#pi (Signal);#varphi (D^{0}) - #varphi (#pi);p_{T}^{D0}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax);
837 TH2F* hdeltaRDKS =new TH2F("hdeltaRDKS","Angle D^{0}-K (Signal);#varphi (D^{0}) - #varphi (K);p_{T}^{D0}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax);
838 TH2F* hdeltaRDpiR=new TH2F("hdeltaRDpiR","Angle D^{0}-#pi (Reflections);#varphi (D^{0}) - #varphi (#pi);p_{T}^{D0}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax);
839 TH2F* hdeltaRDKR =new TH2F("hdeltaRDKR","Angle D^{0}-K (Reflections);#varphi (D^{0}) - #varphi (K);p_{T}^{D0}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax);
841 TH2F* hdeltaRDpiB=new TH2F("hdeltaRDpiB","Angle D^{0}-#pi (Background);#varphi (D^{0}) - #varphi (#pi);p_{T}^{D0}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax);
842 TH2F* hdeltaRDKB =new TH2F("hdeltaRDKB","Angle D^{0}-K (Background);#varphi (D^{0}) - #varphi (K);p_{T}^{D0}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax);
844 fOutput->Add(halphaDpiS);
845 fOutput->Add(halphaDKS);
846 fOutput->Add(halphaDpiR);
847 fOutput->Add(halphaDKR);
848 fOutput->Add(halphaDpiB);
849 fOutput->Add(halphaDKB);
851 fOutput->Add(hdeltaRDpiS);
852 fOutput->Add(hdeltaRDKS);
853 fOutput->Add(hdeltaRDpiR);
854 fOutput->Add(hdeltaRDKR);
855 fOutput->Add(hdeltaRDpiB);
856 fOutput->Add(hdeltaRDKB);
859 fhImpParB = new TH2F("hImpParB", "Impact parameter of daughter tracks (Background); Getd0Prong();#it{p}^{daugh}_{T} (GeV/c)",200, -0.1,0.1,ptbinsD, ptmin, ptmax); //same range of pt of the D, but pt daughter used
860 fOutput->Add(fhImpParB);
862 fhInvMassS = new TH1F("hInvMassS", "D invariant mass distribution", nbinsmass, fMinMass, fMaxMass);
863 fhInvMassS->SetStats(kTRUE);
864 fhInvMassS->GetXaxis()->SetTitle("mass (GeV/c)");
865 fhInvMassS->GetYaxis()->SetTitle("p_{T} (GeV/c)");
866 fOutput->Add(fhInvMassS);
868 fhInvMassB = new TH1F("hInvMassB", "D invariant mass distribution", nbinsmass, fMinMass, fMaxMass);
869 fhInvMassB->SetStats(kTRUE);
870 fhInvMassB->GetXaxis()->SetTitle("mass (GeV/c)");
871 fhInvMassB->GetYaxis()->SetTitle("p_{T} (GeV/c)");
872 fOutput->Add(fhInvMassB);
878 //_______________________________________________________________________________
880 Float_t AliAnalysisTaskSEDmesonsFilterCJ::DeltaR(AliVParticle *p1, AliVParticle *p2) const {
881 //Calculate DeltaR between p1 and p2: DeltaR=sqrt(Delataphi^2+DeltaEta^2)
883 if(!p1 || !p2) return -1;
884 Double_t phi1=p1->Phi(),eta1=p1->Eta();
885 Double_t phi2 = p2->Phi(),eta2 = p2->Eta() ;
887 Double_t dPhi=phi1-phi2;
888 if(dPhi<=-(TMath::Pi())/2) dPhi = dPhi+2*(TMath::Pi());
889 if(dPhi>(3*(TMath::Pi()))/2) dPhi = dPhi-2*(TMath::Pi());
891 Double_t dEta=eta1-eta2;
892 Double_t deltaR=TMath::Sqrt(dEta*dEta + dPhi*dPhi );