]>
Commit | Line | Data |
---|---|---|
c683985a | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
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 | **************************************************************************/ | |
15 | // | |
16 | // | |
17 | // Task for selecting D mesons to be used as an input for D-Jet correlations | |
18 | // | |
19 | //----------------------------------------------------------------------- | |
20 | // Authors: | |
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 | //----------------------------------------------------------------------- | |
25 | ||
26 | #include <TDatabasePDG.h> | |
27 | #include <TParticle.h> | |
28 | #include <TVector3.h> | |
29 | #include "TROOT.h" | |
30 | #include <TH3F.h> | |
31 | ||
32 | #include "AliRDHFCutsDStartoKpipi.h" | |
33 | #include "AliRDHFCutsD0toKpi.h" | |
34 | #include "AliAODMCHeader.h" | |
35 | #include "AliAODHandler.h" | |
36 | #include "AliAnalysisManager.h" | |
37 | #include "AliLog.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" | |
45 | ||
46 | ClassImp(AliAnalysisTaskSEDmesonsFilterCJ) | |
47 | ||
48 | //_______________________________________________________________________________ | |
49 | ||
50 | AliAnalysisTaskSEDmesonsFilterCJ::AliAnalysisTaskSEDmesonsFilterCJ() : | |
51 | AliAnalysisTaskSE(), | |
52 | fUseMCInfo(kFALSE), | |
53 | fUseReco(kTRUE), | |
54 | fCandidateType(0), | |
55 | fCandidateName(""), | |
56 | fPDGmother(0), | |
57 | fNProngs(0), | |
58 | fBranchName(""), | |
59 | fOutput(0), | |
60 | fCuts(0), | |
61 | fMinMass(0.), | |
62 | fMaxMass(0.), | |
bbb94467 | 63 | fCandidateArray(0), |
e278882f | 64 | fSideBandArray(0), |
d69d07c3 | 65 | fhImpPar(), |
66 | fhImpParB(), | |
67 | fhInvMassS(), | |
68 | fhInvMassB() | |
c683985a | 69 | { |
70 | // | |
71 | // Default constructor | |
72 | // | |
73 | ||
74 | for (Int_t i=4; i--;) fPDGdaughters[i] = 0; | |
75 | for (Int_t i=30; i--;) fSigmaD0[i] = 0.; | |
76 | } | |
77 | ||
78 | //_______________________________________________________________________________ | |
79 | ||
80 | AliAnalysisTaskSEDmesonsFilterCJ::AliAnalysisTaskSEDmesonsFilterCJ(const char *name, AliRDHFCuts *cuts, ECandidateType candtype) : | |
81 | AliAnalysisTaskSE(name), | |
82 | fUseMCInfo(kFALSE), | |
83 | fUseReco(kTRUE), | |
84 | fCandidateType(candtype), | |
85 | fCandidateName(""), | |
86 | fPDGmother(0), | |
87 | fNProngs(0), | |
88 | fBranchName(""), | |
89 | fOutput(0), | |
90 | fCuts(cuts), | |
91 | fMinMass(0.), | |
92 | fMaxMass(0.), | |
bbb94467 | 93 | fCandidateArray(0), |
e278882f | 94 | fSideBandArray(0), |
d69d07c3 | 95 | fhImpPar(), |
96 | fhImpParB(), | |
97 | fhInvMassS(), | |
98 | fhInvMassB() | |
c683985a | 99 | { |
100 | // | |
101 | // Constructor. Initialization of Inputs and Outputs | |
102 | // | |
103 | ||
104 | Info("AliAnalysisTaskSEDmesonsFilterCJ","Calling Constructor"); | |
105 | ||
106 | for (Int_t i=4; i--;) fPDGdaughters[i] = 0; | |
107 | for (Int_t i=30; i--;) fSigmaD0[i] = 0.; | |
108 | ||
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 }; | |
111 | ||
112 | switch (fCandidateType) { | |
113 | case 0 : | |
114 | fCandidateName = "D0"; | |
115 | fPDGmother = 421; | |
116 | fNProngs = 2; | |
117 | fPDGdaughters[0] = 211; // pi | |
118 | fPDGdaughters[1] = 321; // K | |
119 | fPDGdaughters[2] = 0; // empty | |
120 | fPDGdaughters[3] = 0; // empty | |
121 | fBranchName = "D0toKpi"; | |
122 | break; | |
123 | case 1 : | |
124 | fCandidateName = "Dstar"; | |
125 | fPDGmother = 413; | |
126 | fNProngs = 3; | |
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"; | |
132 | ||
133 | if (nptbins<=13) { | |
134 | for (Int_t ipt=0; ipt<nptbins;ipt++) fSigmaD0[ipt] = defaultSigmaD013[ipt]; | |
135 | } else { | |
136 | AliFatal(Form("Default sigma D0 not enough for %d pt bins, use SetSigmaD0ForDStar to set them",nptbins)); | |
137 | } | |
138 | break; | |
139 | default : | |
140 | printf("%d not accepted!!\n",fCandidateType); | |
141 | break; | |
142 | } | |
143 | ||
144 | if (fCandidateType==kD0toKpi) SetMassLimits(0.15, fPDGmother); | |
145 | if (fCandidateType==kDstartoKpipi) SetMassLimits(0.015, fPDGmother); | |
146 | ||
147 | DefineOutput(1, TList::Class()); // histos | |
148 | DefineOutput(2, AliRDHFCuts::Class()); // my cuts | |
bbb94467 | 149 | DefineOutput(3, TClonesArray::Class()); //array of candidates |
150 | DefineOutput(4, TClonesArray::Class()); //array of SB candidates | |
c683985a | 151 | } |
152 | ||
153 | //_______________________________________________________________________________ | |
154 | ||
155 | AliAnalysisTaskSEDmesonsFilterCJ::~AliAnalysisTaskSEDmesonsFilterCJ() | |
156 | { | |
157 | // | |
158 | // destructor | |
159 | // | |
160 | ||
161 | Info("~AliAnalysisTaskSEDmesonsFilterCJ","Calling Destructor"); | |
162 | ||
163 | if (fOutput) { delete fOutput; fOutput = 0; } | |
164 | if (fCuts) { delete fCuts; fCuts = 0; } | |
165 | if (fCandidateArray) { delete fCandidateArray; fCandidateArray = 0; } | |
bbb94467 | 166 | delete fSideBandArray; |
c683985a | 167 | |
168 | } | |
169 | ||
170 | //_______________________________________________________________________________ | |
171 | ||
172 | void AliAnalysisTaskSEDmesonsFilterCJ::Init() | |
173 | { | |
174 | // | |
175 | // Initialization | |
176 | // | |
177 | ||
178 | if(fDebug>1) printf("AnalysisTaskSEDmesonsForJetCorrelations::Init() \n"); | |
179 | ||
180 | switch (fCandidateType) { | |
bbb94467 | 181 | case 0: |
182 | { | |
c683985a | 183 | AliRDHFCutsD0toKpi* copyfCutsDzero = new AliRDHFCutsD0toKpi(*(static_cast<AliRDHFCutsD0toKpi*>(fCuts))); |
184 | copyfCutsDzero->SetName("AnalysisCutsDzero"); | |
185 | PostData(2, copyfCutsDzero); // Post the data | |
bbb94467 | 186 | } break; |
187 | case 1: | |
188 | { | |
189 | AliRDHFCutsDStartoKpipi* copyfCutsDstar = new AliRDHFCutsDStartoKpipi(*(static_cast<AliRDHFCutsDStartoKpipi*>(fCuts))); | |
190 | copyfCutsDstar->SetName("AnalysisCutsDStar"); | |
191 | PostData(2, copyfCutsDstar); // Post the cuts | |
192 | } break; | |
193 | default: return; | |
c683985a | 194 | } |
195 | ||
196 | return; | |
197 | } | |
198 | ||
199 | //_______________________________________________________________________________ | |
200 | ||
201 | void AliAnalysisTaskSEDmesonsFilterCJ::UserCreateOutputObjects() | |
202 | { | |
203 | // | |
204 | // output | |
205 | // | |
206 | ||
207 | Info("UserCreateOutputObjects","CreateOutputObjects of task %s\n", GetName()); | |
208 | ||
209 | fOutput = new TList(); fOutput->SetOwner(); | |
210 | DefineHistoForAnalysis(); // define histograms | |
211 | ||
bbb94467 | 212 | if (fCandidateType==kD0toKpi){ |
213 | fCandidateArray = new TClonesArray("AliAODRecoDecayHF",0); | |
214 | fSideBandArray = new TClonesArray("AliAODRecoDecayHF",0); | |
215 | } | |
c683985a | 216 | |
bbb94467 | 217 | if (fCandidateType==kDstartoKpipi) { |
218 | fCandidateArray = new TClonesArray("AliAODRecoCascadeHF",0); | |
219 | fSideBandArray = new TClonesArray("AliAODRecoCascadeHF",0); | |
c683985a | 220 | } |
221 | ||
bbb94467 | 222 | fCandidateArray->SetOwner(); |
223 | fCandidateArray->SetName(Form("fCandidateArray%s%s",fCandidateName.Data(),fUseReco ? "rec" : "gen")); | |
224 | ||
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")); | |
228 | ||
c683985a | 229 | PostData(1, fOutput); |
bbb94467 | 230 | PostData(3, fCandidateArray); |
231 | PostData(4, fSideBandArray); | |
232 | ||
c683985a | 233 | return; |
234 | } | |
235 | ||
236 | //_______________________________________________________________________________ | |
237 | ||
238 | void AliAnalysisTaskSEDmesonsFilterCJ::UserExec(Option_t *){ | |
239 | // | |
240 | // user exec | |
241 | // | |
c683985a | 242 | // Load the event |
243 | AliAODEvent *aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent); | |
244 | ||
245 | TClonesArray *arrayDStartoD0pi = 0; | |
246 | if (!aodEvent && AODEvent() && IsStandardAOD()) { | |
247 | ||
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()); | |
251 | ||
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()); | |
259 | } | |
260 | } else { | |
261 | arrayDStartoD0pi = (TClonesArray*)aodEvent->GetList()->FindObject(fBranchName.Data()); | |
262 | } | |
263 | ||
264 | if (!arrayDStartoD0pi) { | |
265 | AliInfo(Form("Could not find array %s, skipping the event",fBranchName.Data())); | |
266 | return; | |
267 | } else { | |
268 | AliDebug(2, Form("Found %d vertices",arrayDStartoD0pi->GetEntriesFast())); | |
269 | } | |
270 | ||
271 | TClonesArray* mcArray = 0x0; | |
272 | if (fUseMCInfo) { | |
273 | mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName())); | |
274 | if (!mcArray) { | |
275 | printf("AliAnalysisTaskSEDStarSpectra::UserExec: MC particles not found!\n"); | |
276 | return; | |
277 | } | |
278 | } | |
279 | ||
280 | //Histograms | |
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"); | |
285 | ||
286 | TH1F* hPtPion=0x0; | |
287 | if (fCandidateType==kDstartoKpipi) hPtPion = (TH1F*)fOutput->FindObject("hPtPion"); | |
288 | hstat->Fill(0); | |
289 | ||
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; | |
293 | ||
294 | //Event selection | |
295 | Bool_t iseventselected=fCuts->IsEventSelected(aodEvent); | |
296 | //TString firedTriggerClasses=((AliAODEvent*)aodEvent)->GetFiredTriggerClasses(); | |
297 | if (!iseventselected) return; | |
298 | hstat->Fill(1); | |
299 | ||
300 | const Int_t nD = arrayDStartoD0pi->GetEntriesFast(); | |
e278882f | 301 | if(!fUseMCInfo) hstat->Fill(2, nD); |
c683985a | 302 | |
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 | |
306 | ||
307 | //D0 from D0 bar | |
308 | Int_t pdgdaughtersD0[2] = { 211, 321 }; // pi,K | |
309 | Int_t pdgdaughtersD0bar[2] = { 321, 211 }; // K,pi | |
310 | ||
311 | Int_t iCand =0; | |
312 | Int_t iSBCand=0; | |
313 | Int_t isSelected = 0; | |
314 | AliAODRecoDecayHF *charmCand = 0; | |
bbb94467 | 315 | AliAODRecoCascadeHF *dstar = 0; |
c683985a | 316 | AliAODMCParticle *charmPart = 0; |
317 | Bool_t isMCBkg=kFALSE; | |
318 | ||
319 | Double_t mPDGD0 = TDatabasePDG::Instance()->GetParticle(421)->Mass(); | |
320 | ||
321 | Int_t mcLabel = -9999; | |
322 | Int_t pdgMeson = 413; | |
323 | if (fCandidateType==kD0toKpi) pdgMeson = 421; | |
324 | ||
bbb94467 | 325 | //clear the TClonesArray from the previous event |
326 | fCandidateArray->Clear(); | |
327 | fSideBandArray->Clear(); | |
328 | ||
c683985a | 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; | |
332 | ||
8577f7bc | 333 | TString smcTruth="S"; |
334 | ||
bbb94467 | 335 | if (fCandidateType==kDstartoKpipi) dstar = (AliAODRecoCascadeHF*)charmCand; |
c683985a | 336 | |
337 | if (fUseMCInfo) { // Look in MC, try to simulate the z | |
338 | if (fCandidateType==kDstartoKpipi) { | |
bbb94467 | 339 | mcLabel = dstar->MatchToMC(413,421,pdgDgDStartoD0pi,pdgDgD0toKpi,mcArray); |
c683985a | 340 | } |
341 | ||
342 | if (fCandidateType==kD0toKpi) | |
343 | mcLabel = charmCand->MatchToMC(421,mcArray,fNProngs,fPDGdaughters); | |
344 | ||
e278882f | 345 | if (mcLabel<=0) { |
346 | isMCBkg=kTRUE; | |
347 | hstat->Fill(5); | |
348 | } | |
349 | else { | |
350 | hstat->Fill(2); | |
351 | ||
352 | } | |
c683985a | 353 | if (!isMCBkg) charmPart=(AliAODMCParticle*)mcArray->At(mcLabel); |
8577f7bc | 354 | |
355 | if (isMCBkg) smcTruth="B"; | |
356 | ||
c683985a | 357 | } |
358 | ||
359 | Double_t ptD = charmCand->Pt(); | |
360 | ||
361 | // region of interest + cuts | |
362 | if (!fCuts->IsInFiducialAcceptance(ptD,charmCand->Y(pdgMeson))) continue; | |
363 | ||
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)); | |
372 | continue; | |
373 | } | |
c683985a | 374 | //if data and Dstar from D0 side band |
bbb94467 | 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*/){ |
c683985a | 376 | |
bbb94467 | 377 | new ((*fSideBandArray)[iSBCand]) AliAODRecoCascadeHF(*dstar); |
c683985a | 378 | iSBCand++; |
379 | } | |
380 | } | |
381 | //candidate selected by cuts and PID | |
382 | isSelected = fCuts->IsSelected(charmCand,AliRDHFCuts::kAll,aodEvent); //selected | |
383 | if (!isSelected) continue; | |
384 | ||
e278882f | 385 | Int_t nprongs=charmCand->GetNProngs(); |
386 | ||
c683985a | 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 | |
e278882f | 390 | |
c683985a | 391 | if(fUseReco) { |
bbb94467 | 392 | if (fCandidateType==kDstartoKpipi){ |
393 | new ((*fCandidateArray)[iCand]) AliAODRecoCascadeHF(*dstar); | |
d69d07c3 | 394 | fhInvMassS->Fill(dstar->DeltaInvMass(),dstar->Pt()); |
e278882f | 395 | |
bbb94467 | 396 | } else{ |
397 | new ((*fCandidateArray)[iCand]) AliAODRecoDecayHF(*charmCand); | |
398 | //Printf("Filling reco"); | |
e278882f | 399 | for(Int_t kd=0;kd<nprongs;kd++){ |
400 | fhImpPar->Fill(charmCand->Getd0Prong(kd),charmCand->PtProng(kd)); | |
401 | } | |
402 | Double_t masses[2]; | |
403 | masses[0] = charmCand->InvMass(fNProngs, (UInt_t*)pdgdaughtersD0); //D0 | |
404 | masses[1] = charmCand->InvMass(fNProngs, (UInt_t*)pdgdaughtersD0bar); //D0bar | |
405 | fhInvMassS->Fill(masses[0]); | |
406 | fhInvMassS->Fill(masses[1]); | |
407 | ||
bbb94467 | 408 | } |
409 | ||
c683985a | 410 | hstat->Fill(3); |
e278882f | 411 | |
c683985a | 412 | } |
413 | // for MC with requirement particle level fill with AliAODMCParticle | |
414 | else if (fUseMCInfo) { | |
415 | new ((*fCandidateArray)[iCand]) AliAODMCParticle(*charmPart); | |
416 | //Printf("Filling gen"); | |
417 | hstat->Fill(3); | |
418 | } | |
419 | ||
420 | iCand++; | |
421 | } | |
422 | //for MC background fill fSideBandArray (which is instead filled above for DStar in case of data for the side bands candidates) | |
423 | else if(fUseReco){ | |
bbb94467 | 424 | if (fCandidateType==kDstartoKpipi){ |
425 | new ((*fSideBandArray)[iSBCand]) AliAODRecoCascadeHF(*dstar); | |
e278882f | 426 | fhInvMassB->Fill(dstar->DeltaInvMass()); |
bbb94467 | 427 | } |
428 | if (fCandidateType==kD0toKpi){ | |
429 | new ((*fSideBandArray)[iSBCand]) AliAODRecoDecayHF(*charmCand); | |
e278882f | 430 | Double_t masses[2]; |
431 | masses[0] = charmCand->InvMass(fNProngs, (UInt_t*)pdgdaughtersD0); //D0 | |
432 | masses[1] = charmCand->InvMass(fNProngs, (UInt_t*)pdgdaughtersD0bar); //D0bar | |
433 | fhInvMassB->Fill(masses[0]); | |
434 | fhInvMassB->Fill(masses[1]); | |
435 | ||
bbb94467 | 436 | } |
c683985a | 437 | iSBCand++; |
438 | } | |
439 | ||
440 | ||
441 | Double_t masses[2]; | |
442 | if (fCandidateType==kDstartoKpipi) { //D*->D0pi->Kpipi | |
443 | ||
444 | //softpion from D* decay | |
bbb94467 | 445 | AliAODTrack *track2 = (AliAODTrack*)dstar->GetBachelor(); |
c683985a | 446 | |
447 | // select D* in the D0 window. | |
448 | // In the cut object window is loose to allow for side bands | |
449 | ||
450 | ||
451 | // retrieve the corresponding pt bin for the candidate | |
452 | // and set the expected D0 width (x3) | |
453 | // static const Int_t n = fCuts->GetNPtBins(); | |
454 | Int_t bin = fCuts->PtBin(ptD); | |
455 | if(bin<0 || bin>=fCuts->GetNPtBins()) { | |
456 | AliError(Form("Pt %.3f out of bounds",ptD)); | |
457 | continue; | |
458 | } | |
459 | ||
460 | AliInfo(Form("Pt bin %d and sigma D0 %.4f",bin,fSigmaD0[bin])); | |
461 | //consider the Dstar candidates only if the mass of the D0 is in 3 sigma wrt the PDG value | |
bbb94467 | 462 | if ((dstar->InvMassD0()>=(mPDGD0-3.*fSigmaD0[bin])) && (dstar->InvMassD0()<=(mPDGD0+3.*fSigmaD0[bin]))) { |
463 | masses[0] = dstar->DeltaInvMass(); //D* | |
c683985a | 464 | masses[1] = 0.; //dummy for D* |
465 | ||
466 | //D* delta mass | |
467 | hInvMassptD->Fill(masses[0], ptD); // 2 D slice for pt bins | |
468 | ||
469 | // D* pt and soft pion pt for good candidates | |
470 | Double_t mPDGDstar = TDatabasePDG::Instance()->GetParticle(413)->Mass(); | |
bbb94467 | 471 | Double_t invmassDelta = dstar->DeltaInvMass(); |
c683985a | 472 | if (TMath::Abs(invmassDelta-(mPDGDstar-mPDGD0))<0.0021) hPtPion->Fill(track2->Pt()); |
473 | } | |
8577f7bc | 474 | |
475 | if (fUseMCInfo){ //fill histograms of kinematics, using MC truth | |
476 | //get histos | |
477 | TH2F *halphaDD = (TH2F*)fOutput->FindObject(Form("halphaDD%s",smcTruth.Data())); | |
478 | TH2F *halphaDpis = (TH2F*)fOutput->FindObject(Form("halphaDpis%s",smcTruth.Data())); | |
479 | TH2F *halphaDpi = (TH2F*)fOutput->FindObject(Form("halphaDpi%s",smcTruth.Data())); | |
480 | TH2F *halphaDK = (TH2F*)fOutput->FindObject(Form("halphaDK%s",smcTruth.Data())); | |
481 | ||
482 | TH2F *hdeltaRDD = (TH2F*)fOutput->FindObject(Form("hdeltaRDD%s",smcTruth.Data())); | |
483 | TH2F *hdeltaRDpis = (TH2F*)fOutput->FindObject(Form("hdeltaRDpis%s",smcTruth.Data())); | |
484 | TH2F *hdeltaRDpi = (TH2F*)fOutput->FindObject(Form("hdeltaRDpi%s",smcTruth.Data())); | |
485 | TH2F *hdeltaRDK = (TH2F*)fOutput->FindObject(Form("hdeltaRDK%s",smcTruth.Data())); | |
486 | ||
487 | Double_t aD = dstar->Phi(), | |
488 | apis= track2->Phi(); | |
489 | ||
490 | AliAODRecoDecayHF2Prong* D0fromDstar=dstar->Get2Prong(); | |
491 | Double_t aD0 = D0fromDstar->Phi(); | |
492 | Int_t isD0= D0fromDstar->Charge()>0 ? kTRUE : kFALSE; | |
493 | Double_t aK = isD0 ? D0fromDstar->PhiProng(0) : D0fromDstar->PhiProng(1), | |
494 | api= isD0 ? D0fromDstar->PhiProng(1) : D0fromDstar->PhiProng(0); | |
495 | Double_t dRDD0 = DeltaR(dstar,D0fromDstar), | |
496 | dRDpis = DeltaR(dstar,track2), | |
497 | dRDpi = DeltaR(dstar, isD0 ? (AliVParticle*)D0fromDstar->GetDaughter(1) : (AliVParticle*)D0fromDstar->GetDaughter(0)), | |
498 | dRDK = DeltaR(dstar, isD0 ? (AliVParticle*)D0fromDstar->GetDaughter(0) : (AliVParticle*)D0fromDstar->GetDaughter(1)); | |
499 | ||
500 | halphaDD-> Fill(aD-aD0,ptD); | |
501 | halphaDpis->Fill(aD-apis,ptD); | |
502 | halphaDpi-> Fill(aD-api,ptD); | |
503 | halphaDK-> Fill(aD-aK,ptD); | |
504 | ||
505 | hdeltaRDD-> Fill(dRDD0,ptD); | |
506 | hdeltaRDpis->Fill(dRDpis,ptD); | |
507 | hdeltaRDpi-> Fill(dRDpi,ptD); | |
508 | hdeltaRDK-> Fill(dRDK,ptD); | |
509 | ||
e278882f | 510 | if (isMCBkg){ |
511 | fhImpParB->Fill(charmCand->Getd0Prong(0),charmCand->PtProng(0)); //bachelor | |
512 | fhImpParB->Fill(D0fromDstar->Getd0Prong(0),D0fromDstar->PtProng(0)); | |
513 | fhImpParB->Fill(D0fromDstar->Getd0Prong(1),D0fromDstar->PtProng(1)); | |
514 | ||
515 | } else { | |
516 | fhImpPar->Fill(charmCand->Getd0Prong(0),charmCand->PtProng(0)); //bachelor | |
517 | fhImpPar->Fill(D0fromDstar->Getd0Prong(0),D0fromDstar->PtProng(0)); | |
518 | fhImpPar->Fill(D0fromDstar->Getd0Prong(1),D0fromDstar->PtProng(1)); | |
519 | ||
520 | } | |
521 | ||
522 | ||
523 | } else{ | |
524 | fhImpPar->Fill(charmCand->Getd0Prong(0),charmCand->PtProng(0)); //bachelor | |
525 | AliAODRecoDecayHF2Prong* D0fromDstar=dstar->Get2Prong(); | |
526 | fhImpPar->Fill(D0fromDstar->Getd0Prong(0),D0fromDstar->PtProng(0)); | |
527 | fhImpPar->Fill(D0fromDstar->Getd0Prong(1),D0fromDstar->PtProng(1)); | |
8577f7bc | 528 | } |
529 | ||
c683985a | 530 | } //Dstar specific |
531 | ||
532 | if (fCandidateType==kD0toKpi) { //D0->Kpi | |
533 | ||
534 | //needed quantities | |
535 | masses[0] = charmCand->InvMass(fNProngs, (UInt_t*)pdgdaughtersD0); //D0 | |
536 | masses[1] = charmCand->InvMass(fNProngs, (UInt_t*)pdgdaughtersD0bar); //D0bar | |
537 | hstat->Fill(3); | |
538 | ||
539 | // mass vs pt | |
540 | if (isSelected==1 || isSelected==3) hInvMassptD->Fill(masses[0],ptD); | |
541 | if (isSelected>=2) hInvMassptD->Fill(masses[1],ptD); | |
8577f7bc | 542 | |
543 | if (fUseMCInfo) { //fill histograms of kinematics, using MC truth | |
544 | ||
545 | Double_t aD = charmCand->Phi(); | |
546 | Double_t adaugh[2]={charmCand->PhiProng(0),charmCand->PhiProng(1)}; | |
547 | AliAODTrack* p0=(AliAODTrack*)charmCand->GetDaughter(0); | |
548 | AliAODTrack* p1=(AliAODTrack*)charmCand->GetDaughter(1); | |
549 | Float_t dR0 = DeltaR(charmCand, p0), dR1 = DeltaR(charmCand, p1); | |
550 | Bool_t isD0=kFALSE; | |
551 | if(mcLabel==421) isD0=kTRUE; | |
552 | if(mcLabel==-421) isD0=kFALSE; | |
553 | ||
554 | if(isMCBkg) { //background | |
555 | TH2F *halphaDpi = (TH2F*)fOutput->FindObject(Form("halphaDpi%s",smcTruth.Data())); | |
556 | TH2F *halphaDK = (TH2F*)fOutput->FindObject(Form("halphaDK%s",smcTruth.Data())); | |
557 | ||
558 | TH2F *hdeltaRDpi = (TH2F*)fOutput->FindObject(Form("hdeltaRDpi%s",smcTruth.Data())); | |
559 | TH2F *hdeltaRDK = (TH2F*)fOutput->FindObject(Form("hdeltaRDK%s",smcTruth.Data())); | |
560 | ||
561 | ||
562 | if (isSelected==1 || isSelected==3) { // selected as D0 | |
563 | halphaDK->Fill(aD-adaugh[0],ptD); | |
564 | halphaDpi->Fill(aD-adaugh[1],ptD); | |
565 | ||
566 | hdeltaRDK->Fill(dR0,ptD); | |
567 | hdeltaRDpi->Fill(dR1,ptD); | |
568 | ||
569 | } | |
570 | if (isSelected>=2) { //selected as D0bar | |
571 | halphaDpi->Fill(aD-adaugh[0],ptD); | |
572 | halphaDK->Fill(aD-adaugh[1],ptD); | |
573 | ||
574 | hdeltaRDpi->Fill(dR0,ptD); | |
575 | hdeltaRDK->Fill(dR1,ptD); | |
576 | ||
577 | } | |
578 | ||
579 | }else{ //signal and reflections | |
580 | TH2F *halphaDpiS = (TH2F*)fOutput->FindObject("halphaDpiS"); | |
581 | TH2F *halphaDKS = (TH2F*)fOutput->FindObject("halphaDKS"); | |
582 | TH2F *halphaDpiR = (TH2F*)fOutput->FindObject("halphaDpiR"); | |
583 | TH2F *halphaDKR = (TH2F*)fOutput->FindObject("halphaDKR"); | |
584 | ||
585 | TH2F *hdeltaRDpiS = (TH2F*)fOutput->FindObject("hdeltaRDpiS"); | |
586 | TH2F *hdeltaRDKS = (TH2F*)fOutput->FindObject("hdeltaRDKS"); | |
587 | TH2F *hdeltaRDpiR = (TH2F*)fOutput->FindObject("hdeltaRDpiR"); | |
588 | TH2F *hdeltaRDKR = (TH2F*)fOutput->FindObject("hdeltaRDKR"); | |
589 | ||
590 | if(isD0) { //D0 | |
591 | halphaDKS->Fill(aD-adaugh[0],ptD); | |
592 | halphaDpiS->Fill(aD-adaugh[1],ptD); | |
593 | ||
594 | hdeltaRDKS->Fill(dR0,ptD); | |
595 | hdeltaRDpiS->Fill(dR1,ptD); | |
596 | if(isSelected>=2){ //selected as D0bar | |
597 | halphaDpiR->Fill(aD-adaugh[0],ptD); | |
598 | halphaDKR->Fill(aD-adaugh[1],ptD); | |
599 | ||
600 | hdeltaRDpiR->Fill(dR0,ptD); | |
601 | hdeltaRDKR->Fill(dR1,ptD); | |
602 | } | |
603 | } else { //D0bar | |
604 | halphaDKS->Fill(aD-adaugh[1],ptD); | |
605 | halphaDpiS->Fill(aD-adaugh[0],ptD); | |
606 | ||
607 | hdeltaRDKS->Fill(dR1,ptD); | |
608 | hdeltaRDpiS->Fill(dR0,ptD); | |
609 | ||
610 | if(isSelected>=2){ //selected as D0bar | |
611 | halphaDpiR->Fill(aD-adaugh[1],ptD); | |
612 | halphaDKR->Fill(aD-adaugh[0],ptD); | |
613 | ||
614 | hdeltaRDpiR->Fill(dR1,ptD); | |
615 | hdeltaRDKR->Fill(dR0,ptD); | |
616 | } | |
617 | } | |
618 | ||
619 | } //end signal and reflections | |
620 | ||
621 | ||
622 | }// end MC | |
623 | ||
624 | ||
c683985a | 625 | } //D0 specific |
626 | ||
627 | charmCand = 0; | |
628 | isMCBkg=kFALSE; | |
629 | } // end of D cand loop | |
630 | ||
631 | hnCandEv->Fill(fCandidateArray->GetEntriesFast()); | |
632 | if (fCandidateType==kDstartoKpipi || fUseMCInfo) { | |
633 | Int_t nsbcand=fSideBandArray->GetEntriesFast(); | |
634 | hstat->Fill(4,nsbcand); | |
635 | hnSBCandEv->Fill(nsbcand); | |
636 | } | |
c3c1ab31 | 637 | //Printf("N candidates selected %d, counter = %d",fCandidateArray->GetEntries(), iCand); |
bbb94467 | 638 | PostData(1, fOutput); |
639 | PostData(3, fCandidateArray); | |
640 | PostData(4, fSideBandArray); | |
641 | ||
c683985a | 642 | return; |
643 | } | |
644 | ||
645 | //_______________________________________________________________________________ | |
646 | ||
647 | void AliAnalysisTaskSEDmesonsFilterCJ::Terminate(Option_t*) | |
648 | { | |
649 | // The Terminate() function is the last function to be called during | |
650 | // a query. It always runs on the client, it can be used to present | |
651 | // the results graphically or save the results to file. | |
652 | ||
653 | Info("Terminate"," terminate"); | |
654 | AliAnalysisTaskSE::Terminate(); | |
655 | ||
656 | fOutput = dynamic_cast<TList*>(GetOutputData(1)); | |
657 | if (!fOutput) { | |
658 | printf("ERROR: fOutput not available\n"); | |
659 | return; | |
660 | } | |
661 | ||
662 | return; | |
663 | } | |
664 | ||
665 | //_______________________________________________________________________________ | |
666 | ||
667 | void AliAnalysisTaskSEDmesonsFilterCJ::SetMassLimits(Double_t range, Int_t pdg) | |
668 | { | |
669 | // | |
670 | // AliAnalysisTaskSEDmesonsFilterCJ::SetMassLimits | |
671 | // | |
672 | ||
673 | Float_t mass = TDatabasePDG::Instance()->GetParticle(TMath::Abs(pdg))->Mass(); | |
674 | ||
675 | // compute the Delta mass for the D* | |
676 | if (fCandidateType==kDstartoKpipi) mass -= TDatabasePDG::Instance()->GetParticle(421)->Mass(); | |
677 | ||
678 | ||
679 | fMinMass = mass - range; | |
680 | fMaxMass = mass + range; | |
681 | ||
682 | AliInfo(Form("Setting mass limits to %f, %f",fMinMass,fMaxMass)); | |
683 | if ((fMinMass<0.) || (fMaxMass<=0.) || (fMaxMass<fMinMass)) AliFatal("Wrong mass limits!\n"); | |
684 | ||
685 | return; | |
686 | } | |
687 | ||
688 | //_______________________________________________________________________________ | |
689 | ||
690 | void AliAnalysisTaskSEDmesonsFilterCJ::SetMassLimits(Double_t lowlimit, Double_t uplimit) | |
691 | { | |
692 | // | |
693 | // AliAnalysisTaskSEDmesonsFilterCJ::SetMassLimits | |
694 | // | |
695 | ||
696 | if (uplimit>lowlimit) { | |
697 | fMinMass = lowlimit; | |
698 | fMaxMass = uplimit; | |
699 | } else { | |
700 | printf("Error! Lower limit larger than upper limit!\n"); | |
701 | fMinMass = uplimit - uplimit*0.2; | |
702 | fMaxMass = uplimit; | |
703 | } | |
704 | ||
705 | return; | |
706 | } | |
707 | ||
708 | //_______________________________________________________________________________ | |
709 | ||
710 | Bool_t AliAnalysisTaskSEDmesonsFilterCJ::SetD0WidthForDStar(Int_t nptbins, Float_t *width) | |
711 | { | |
712 | // | |
713 | // AliAnalysisTaskSEDmesonsFilterCJ::SetD0WidthForDStar | |
714 | // | |
715 | ||
716 | if (nptbins>30) { | |
717 | AliInfo("Maximum number of bins allowed is 30!"); | |
718 | return kFALSE; | |
719 | } | |
720 | ||
721 | if (!width) return kFALSE; | |
722 | for (Int_t ipt=0; ipt<nptbins; ipt++) fSigmaD0[ipt]=width[ipt]; | |
723 | ||
724 | return kTRUE; | |
725 | } | |
726 | ||
727 | //_______________________________________________________________________________ | |
728 | ||
729 | Bool_t AliAnalysisTaskSEDmesonsFilterCJ::DefineHistoForAnalysis() | |
730 | { | |
731 | // | |
732 | // AliAnalysisTaskSEDmesonsFilterCJ::DefineHistoForAnalysis | |
733 | // | |
734 | ||
735 | // Statistics | |
e278882f | 736 | TH1I* hstat = new TH1I("hstat","Statistics",6,-0.5,5.5); |
c683985a | 737 | hstat->GetXaxis()->SetBinLabel(1, "N ev anal"); |
738 | hstat->GetXaxis()->SetBinLabel(2, "N ev sel"); | |
e278882f | 739 | if(fUseMCInfo){ |
740 | if(fUseReco) hstat->GetXaxis()->SetBinLabel(3, "N D"); | |
741 | else hstat->GetXaxis()->SetBinLabel(3, "N Gen D"); | |
742 | } else hstat->GetXaxis()->SetBinLabel(3, "N Cand"); | |
c683985a | 743 | hstat->GetXaxis()->SetBinLabel(4, "N cand sel cuts"); |
744 | if (fCandidateType==kDstartoKpipi) hstat->GetXaxis()->SetBinLabel(5, "N side band cand"); | |
e278882f | 745 | if(fUseMCInfo) { |
746 | hstat->GetXaxis()->SetBinLabel(6, "N Background"); | |
747 | } | |
c683985a | 748 | hstat->SetNdivisions(1); |
749 | fOutput->Add(hstat); | |
750 | ||
751 | TH1F* hnCandEv=new TH1F("hnCandEv", "Number of candidates per event (after cuts);# cand/ev", 100, 0.,100.); | |
752 | fOutput->Add(hnCandEv); | |
753 | ||
754 | // Invariant mass related histograms | |
755 | const Int_t nbinsmass = 200; | |
8577f7bc | 756 | const Int_t ptbinsD=100; |
757 | Float_t ptmin=0.,ptmax=50.; | |
758 | TH2F *hInvMass = new TH2F("hInvMassptD", "D invariant mass distribution", nbinsmass, fMinMass, fMaxMass, ptbinsD, ptmin, ptmax); | |
c683985a | 759 | hInvMass->SetStats(kTRUE); |
760 | hInvMass->GetXaxis()->SetTitle("mass (GeV/c)"); | |
761 | hInvMass->GetYaxis()->SetTitle("p_{T} (GeV/c)"); | |
762 | fOutput->Add(hInvMass); | |
8577f7bc | 763 | if ((fCandidateType==kDstartoKpipi) || fUseMCInfo){ |
c683985a | 764 | TH1F* hnSBCandEv=new TH1F("hnSBCandEv", "Number of side bands candidates per event (after cuts);# cand/ev", 100, 0.,100.); |
765 | fOutput->Add(hnSBCandEv); | |
8577f7bc | 766 | } |
767 | if (fCandidateType==kDstartoKpipi) { | |
c683985a | 768 | |
769 | TH1F* hPtPion = new TH1F("hPtPion", "Primary pions candidates pt", 500, 0., 10.); | |
770 | hPtPion->SetStats(kTRUE); | |
771 | hPtPion->GetXaxis()->SetTitle("p_{T} (GeV/c)"); | |
772 | hPtPion->GetYaxis()->SetTitle("entries"); | |
773 | fOutput->Add(hPtPion); | |
774 | } | |
775 | ||
e278882f | 776 | 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 |
777 | fOutput->Add(fhImpPar); | |
d69d07c3 | 778 | |
779 | fhInvMassS = new TH1F("hInvMassS", "D invariant mass distribution (filled with fCandidateArray)", nbinsmass, fMinMass, fMaxMass); | |
780 | fhInvMassS->SetStats(kTRUE); | |
781 | fhInvMassS->GetXaxis()->SetTitle("mass (GeV/c)"); | |
782 | fhInvMassS->GetYaxis()->SetTitle("p_{T} (GeV/c)"); | |
783 | fOutput->Add(fhInvMassS); | |
784 | ||
8577f7bc | 785 | const Int_t nbinsalpha=200; |
786 | Float_t minalpha=-TMath::Pi(), maxalpha=TMath::Pi(); | |
787 | const Int_t nbinsdeltaR= 200; | |
788 | Float_t mindeltaR = 0., maxdeltaR = 10.; | |
789 | if(fUseMCInfo){ | |
790 | if (fCandidateType==kDstartoKpipi){ | |
791 | TH2F* halphaDDS =new TH2F("halphaDDS","Angle D^{*}-D^{0} (Signal);#varphi (D^{*}) - #varphi (D0);p_{T}^{D*}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax); | |
792 | TH2F* halphaDpisS=new TH2F("halphaDpisS","Angle D^{*}-#pi_{soft} (Signal);#varphi (D^{*}) - #varphi (#pi_{soft});p_{T}^{D*}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax); | |
793 | TH2F* halphaDpiS =new TH2F("halphaDpiS","Angle D^{*}-#pi (Signal);#varphi (D^{*}) - #varphi (#pi);p_{T}^{D*}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax); | |
794 | TH2F* halphaDKS =new TH2F("halphaDKS","Angle D^{*}-K (Signal);#varphi (D^{*}) - #varphi (K);p_{T}^{D*}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax); | |
795 | ||
796 | TH2F* halphaDDB =new TH2F("halphaDDB","Angle D^{*}-D^{0} (Background);#varphi (D^{*}) - #varphi (D0);p_{T}^{D*}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax); | |
797 | TH2F* halphaDpisB=new TH2F("halphaDpisB","Angle D^{*}-#pi_{soft} (Background);#varphi (D^{*}) - #varphi (#pi_{soft});p_{T}^{D*}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax); | |
798 | TH2F* halphaDpiB =new TH2F("halphaDpiB","Angle D^{*}-#pi (Background);#varphi (D^{*}) - #varphi (#pi);p_{T}^{D*}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax); | |
799 | TH2F* halphaDKB =new TH2F("halphaDKB","Angle D^{*}-K (Background);#varphi (D^{*}) - #varphi (K);p_{T}^{D*}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax); | |
800 | ||
801 | TH2F* hdeltaRDDS =new TH2F("hdeltaRDDS","Angle D^{*}-D^{0} (Signal);#varphi (D^{*}) - #varphi (D0);p_{T}^{D*}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax); | |
802 | TH2F* hdeltaRDpisS=new TH2F("hdeltaRDpisS","Angle D^{*}-#pi_{soft} (Signal);#varphi (D^{*}) - #varphi (#pi_{soft});p_{T}^{D*}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax); | |
803 | TH2F* hdeltaRDpiS =new TH2F("hdeltaRDpiS","Angle D^{*}-#pi (Signal);#varphi (D^{*}) - #varphi (#pi);p_{T}^{D*}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax); | |
804 | TH2F* hdeltaRDKS =new TH2F("hdeltaRDKS","Angle D^{*}-K (Signal);#varphi (D^{*}) - #varphi (K);p_{T}^{D*}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax); | |
805 | ||
806 | TH2F* hdeltaRDDB =new TH2F("hdeltaRDDB","Angle D^{*}-D^{0} (Background);#varphi (D^{*}) - #varphi (D0);p_{T}^{D*}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax); | |
807 | TH2F* hdeltaRDpisB=new TH2F("hdeltaRDpisB","Angle D^{*}-#pi_{soft} (Background);#varphi (D^{*}) - #varphi (#pi_{soft});p_{T}^{D*}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax); | |
808 | TH2F* hdeltaRDpiB =new TH2F("hdeltaRDpiB","Angle D^{*}-#pi (Background);#varphi (D^{*}) - #varphi (#pi);p_{T}^{D*}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax); | |
809 | TH2F* hdeltaRDKB =new TH2F("hdeltaRDKB","Angle D^{*}-K (Background);#varphi (D^{*}) - #varphi (K);p_{T}^{D*}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax); | |
810 | ||
811 | fOutput->Add(halphaDDS); | |
812 | fOutput->Add(halphaDpisS); | |
813 | fOutput->Add(halphaDpiS); | |
814 | fOutput->Add(halphaDKS); | |
815 | fOutput->Add(halphaDDB); | |
816 | fOutput->Add(halphaDpisB); | |
817 | fOutput->Add(halphaDpiB); | |
818 | fOutput->Add(halphaDKB); | |
819 | ||
820 | fOutput->Add(hdeltaRDDS); | |
821 | fOutput->Add(hdeltaRDpisS); | |
822 | fOutput->Add(hdeltaRDpiS); | |
823 | fOutput->Add(hdeltaRDKS); | |
824 | fOutput->Add(hdeltaRDDB); | |
825 | fOutput->Add(hdeltaRDpisB); | |
826 | fOutput->Add(hdeltaRDpiB); | |
827 | fOutput->Add(hdeltaRDKB); | |
828 | } | |
829 | ||
830 | if (fCandidateType==kD0toKpi){ | |
831 | ||
832 | TH2F* halphaDpiS=new TH2F("halphaDpiS","Angle D^{0}-#pi (Signal);#varphi (D^{0}) - #varphi (#pi);p_{T}^{D0}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax); | |
833 | TH2F* halphaDKS =new TH2F("halphaDKS","Angle D^{0}-K (Signal);#varphi (D^{0}) - #varphi (K);p_{T}^{D0}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax); | |
834 | TH2F* halphaDpiR=new TH2F("halphaDpiR","Angle D^{0}-#pi (Reflections);#varphi (D^{0}) - #varphi (#pi);p_{T}^{D0}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax); | |
835 | TH2F* halphaDKR =new TH2F("halphaDKR","Angle D^{0}-K (Reflections);#varphi (D^{0}) - #varphi (K);p_{T}^{D0}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax); | |
836 | ||
837 | TH2F* halphaDpiB=new TH2F("halphaDpiB","Angle D^{0}-#pi (Background);#varphi (D^{0}) - #varphi (#pi);p_{T}^{D0}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax); | |
838 | TH2F* halphaDKB =new TH2F("halphaDKB","Angle D^{0}-K (Background);#varphi (D^{0}) - #varphi (K);p_{T}^{D0}",nbinsalpha, minalpha, maxalpha, ptbinsD, ptmin, ptmax); | |
839 | ||
840 | ||
841 | TH2F* hdeltaRDpiS=new TH2F("hdeltaRDpiS","Angle D^{0}-#pi (Signal);#varphi (D^{0}) - #varphi (#pi);p_{T}^{D0}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax); | |
842 | TH2F* hdeltaRDKS =new TH2F("hdeltaRDKS","Angle D^{0}-K (Signal);#varphi (D^{0}) - #varphi (K);p_{T}^{D0}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax); | |
843 | TH2F* hdeltaRDpiR=new TH2F("hdeltaRDpiR","Angle D^{0}-#pi (Reflections);#varphi (D^{0}) - #varphi (#pi);p_{T}^{D0}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax); | |
844 | TH2F* hdeltaRDKR =new TH2F("hdeltaRDKR","Angle D^{0}-K (Reflections);#varphi (D^{0}) - #varphi (K);p_{T}^{D0}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax); | |
845 | ||
846 | TH2F* hdeltaRDpiB=new TH2F("hdeltaRDpiB","Angle D^{0}-#pi (Background);#varphi (D^{0}) - #varphi (#pi);p_{T}^{D0}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax); | |
847 | TH2F* hdeltaRDKB =new TH2F("hdeltaRDKB","Angle D^{0}-K (Background);#varphi (D^{0}) - #varphi (K);p_{T}^{D0}",nbinsdeltaR, mindeltaR, maxdeltaR, ptbinsD, ptmin, ptmax); | |
848 | ||
849 | fOutput->Add(halphaDpiS); | |
850 | fOutput->Add(halphaDKS); | |
851 | fOutput->Add(halphaDpiR); | |
852 | fOutput->Add(halphaDKR); | |
853 | fOutput->Add(halphaDpiB); | |
854 | fOutput->Add(halphaDKB); | |
855 | ||
856 | fOutput->Add(hdeltaRDpiS); | |
857 | fOutput->Add(hdeltaRDKS); | |
858 | fOutput->Add(hdeltaRDpiR); | |
859 | fOutput->Add(hdeltaRDKR); | |
860 | fOutput->Add(hdeltaRDpiB); | |
861 | fOutput->Add(hdeltaRDKB); | |
862 | ||
863 | } | |
e278882f | 864 | 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 |
865 | fOutput->Add(fhImpParB); | |
d69d07c3 | 866 | |
e278882f | 867 | fhInvMassB = new TH1F("hInvMassB", "D invariant mass distribution", nbinsmass, fMinMass, fMaxMass); |
868 | fhInvMassB->SetStats(kTRUE); | |
869 | fhInvMassB->GetXaxis()->SetTitle("mass (GeV/c)"); | |
870 | fhInvMassB->GetYaxis()->SetTitle("p_{T} (GeV/c)"); | |
871 | fOutput->Add(fhInvMassB); | |
872 | ||
8577f7bc | 873 | } |
c683985a | 874 | return kTRUE; |
875 | } | |
8577f7bc | 876 | |
877 | //_______________________________________________________________________________ | |
878 | ||
879 | Float_t AliAnalysisTaskSEDmesonsFilterCJ::DeltaR(AliVParticle *p1, AliVParticle *p2) const { | |
880 | //Calculate DeltaR between p1 and p2: DeltaR=sqrt(Delataphi^2+DeltaEta^2) | |
881 | ||
882 | if(!p1 || !p2) return -1; | |
883 | Double_t phi1=p1->Phi(),eta1=p1->Eta(); | |
884 | Double_t phi2 = p2->Phi(),eta2 = p2->Eta() ; | |
885 | ||
886 | Double_t dPhi=phi1-phi2; | |
887 | if(dPhi<=-(TMath::Pi())/2) dPhi = dPhi+2*(TMath::Pi()); | |
888 | if(dPhi>(3*(TMath::Pi()))/2) dPhi = dPhi-2*(TMath::Pi()); | |
889 | ||
890 | Double_t dEta=eta1-eta2; | |
891 | Double_t deltaR=TMath::Sqrt(dEta*dEta + dPhi*dPhi ); | |
892 | return deltaR; | |
893 | ||
894 | } |