]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG3/vertexingHF/AliAnalysisTaskSED0Mass.cxx
Update from D. Blau to be used in the train
[u/mrichter/AliRoot.git] / PWG3 / vertexingHF / AliAnalysisTaskSED0Mass.cxx
CommitLineData
49061176 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//
18// AliAnalysisTaskSE for D0 candidates invariant mass histogram
a41f6fad 19// and comparison with the MC truth and cut variables distributions.
49061176 20//
21// Authors: A.Dainese, andrea.dainese@lnl.infn.it
feb73eca 22// Chiara Bianchin, chiara.bianchin@pd.infn.it (invariant mass)
23// Carmelo Di Giglio, carmelo.digiglio@ba.infn.it (like sign)
49061176 24/////////////////////////////////////////////////////////////
25
26#include <Riostream.h>
27#include <TClonesArray.h>
527f330b 28#include <TCanvas.h>
49061176 29#include <TNtuple.h>
30#include <TList.h>
31#include <TH1F.h>
a41f6fad 32#include <TH2F.h>
33#include <TDatabasePDG.h>
49061176 34
b557eb43 35#include "AliAnalysisManager.h"
34137226 36#include "AliESDtrack.h"
b557eb43 37#include "AliAODHandler.h"
49061176 38#include "AliAODEvent.h"
39#include "AliAODVertex.h"
40#include "AliAODTrack.h"
41#include "AliAODMCHeader.h"
42#include "AliAODMCParticle.h"
43#include "AliAODRecoDecayHF2Prong.h"
44#include "AliAODRecoCascadeHF.h"
45#include "AliAnalysisVertexingHF.h"
46#include "AliAnalysisTaskSE.h"
47#include "AliAnalysisTaskSED0Mass.h"
48
b557eb43 49
49061176 50ClassImp(AliAnalysisTaskSED0Mass)
51
52
53//________________________________________________________________________
54AliAnalysisTaskSED0Mass::AliAnalysisTaskSED0Mass():
55AliAnalysisTaskSE(),
9de8c723 56fOutputPPR(0),
527f330b 57fOutputmycuts(0),
feb73eca 58fNentries(0),
34137226 59fDistr(0),
60fChecks(0),
9de8c723 61fVHFPPR(0),
527f330b 62fVHFmycuts(0),
feb73eca 63fArray(0),
ce39f0ac 64fReadMC(0),
feb73eca 65fLsNormalization(1.)
66
49061176 67{
68 // Default constructor
9de8c723 69 for(Int_t i=0;i<5;i++) {fTotPosPairs[i]=0; fTotNegPairs[i]=0;}
49061176 70}
71
72//________________________________________________________________________
73AliAnalysisTaskSED0Mass::AliAnalysisTaskSED0Mass(const char *name):
74AliAnalysisTaskSE(name),
9de8c723 75fOutputPPR(0),
527f330b 76fOutputmycuts(0),
feb73eca 77fNentries(0),
34137226 78fDistr(0),
79fChecks(0),
9de8c723 80fVHFPPR(0),
527f330b 81fVHFmycuts(0),
feb73eca 82fArray(0),
ce39f0ac 83fReadMC(0),
feb73eca 84fLsNormalization(1.)
6321ee46 85
49061176 86{
87 // Default constructor
9de8c723 88 for(Int_t i=0;i<5;i++) {fTotPosPairs[i]=0; fTotNegPairs[i]=0;}
49061176 89
90 // Output slot #1 writes into a TList container
91 DefineOutput(1,TList::Class()); //My private output
a4ae02cd 92 // Output slot #2 writes into a TList container
93 DefineOutput(2,TList::Class()); //My private output
94 // Output slot #3 writes into a TH1F container
95 DefineOutput(3,TH1F::Class()); //My private output
a41f6fad 96 // Output slot #4 writes into a TList container
97 DefineOutput(4,TList::Class()); //My private output
34137226 98 // Output slot #5 writes into a TList container
99 DefineOutput(5,TList::Class()); //My private output
49061176 100}
101
102//________________________________________________________________________
103AliAnalysisTaskSED0Mass::~AliAnalysisTaskSED0Mass()
104{
9de8c723 105 if (fOutputPPR) {
106 delete fOutputPPR;
107 fOutputPPR = 0;
a4ae02cd 108 }
9de8c723 109 if (fVHFPPR) {
110 delete fVHFPPR;
111 fVHFPPR = 0;
a4ae02cd 112 }
527f330b 113 if (fOutputmycuts) {
114 delete fOutputmycuts;
115 fOutputmycuts = 0;
a4ae02cd 116 }
a41f6fad 117
118 if (fDistr) {
119 delete fDistr;
120 fDistr = 0;
121 }
122
34137226 123 if (fChecks) {
124 delete fChecks;
125 fChecks = 0;
126 }
127
527f330b 128 if (fVHFmycuts) {
129 delete fVHFmycuts;
130 fVHFmycuts = 0;
49061176 131 }
46c96ce5 132 if (fNentries){
133 delete fNentries;
134 fNentries = 0;
135 }
a41f6fad 136
137
49061176 138}
139
140//________________________________________________________________________
141void AliAnalysisTaskSED0Mass::Init()
142{
143 // Initialization
144
145 if(fDebug > 1) printf("AnalysisTaskSED0Mass::Init() \n");
146
147 gROOT->LoadMacro("$ALICE_ROOT/PWG3/vertexingHF/ConfigVertexingHF.C");
148
a4ae02cd 149 // 2 sets of dedidcated cuts -- defined in UserExec
9de8c723 150 fVHFPPR = (AliAnalysisVertexingHF*)gROOT->ProcessLine("ConfigVertexingHF()");
527f330b 151 fVHFmycuts = (AliAnalysisVertexingHF*)gROOT->ProcessLine("ConfigVertexingHF()");
a4ae02cd 152
49061176 153 return;
154}
155
156//________________________________________________________________________
157void AliAnalysisTaskSED0Mass::UserCreateOutputObjects()
158{
159
160 // Create the output container
161 //
162 if(fDebug > 1) printf("AnalysisTaskSED0Mass::UserCreateOutputObjects() \n");
163
164 // Several histograms are more conveniently managed in a TList
9de8c723 165 fOutputPPR = new TList();
166 fOutputPPR->SetOwner();
167 fOutputPPR->SetName("listPPR");
a4ae02cd 168
527f330b 169 fOutputmycuts = new TList();
170 fOutputmycuts->SetOwner();
171 fOutputmycuts->SetName("listloose");
49061176 172
a41f6fad 173 fDistr = new TList();
174 fDistr->SetOwner();
175 fDistr->SetName("distributionslist");
176
34137226 177 fChecks = new TList();
178 fChecks->SetOwner();
179 fChecks->SetName("checkHistograms");
180
9de8c723 181 const Int_t nhist=5;
a4ae02cd 182
0108fa62 183 TString nameMass=" ",nameSgn27=" ",nameSgn=" ", nameBkg=" ", nameRfl=" ",nameMassNocutsS =" ",nameMassNocutsB =" ", namedistr=" ";
49061176 184
185 for(Int_t i=0;i<nhist;i++){
b272aebf 186
7646d6da 187 nameMass="histMass_";
49061176 188 nameMass+=i+1;
9de8c723 189 nameSgn27="histSgn27_";
190 nameSgn27+=i+1;
7646d6da 191 nameSgn="histSgn_";
49061176 192 nameSgn+=i+1;
7646d6da 193 nameBkg="histBkg_";
49061176 194 nameBkg+=i+1;
a4ae02cd 195 nameRfl="histRfl_";
196 nameRfl+=i+1;
0108fa62 197 nameMassNocutsS="hMassS_";
198 nameMassNocutsS+=i+1;
199 nameMassNocutsB="hMassB_";
200 nameMassNocutsB+=i+1;
7646d6da 201
b272aebf 202 //histograms of cut variable distributions
203
204 // pT
205 namedistr="hptpiS_";
206 namedistr+=i+1;
207 TH1F *hptpiS = new TH1F(namedistr.Data(), "P_{T} distribution (pions);p_{T} [GeV/c]",200,0.,8.);
208
209 namedistr="hptKS_";
210 namedistr+=i+1;
211 TH1F *hptKS = new TH1F(namedistr.Data(), "P_{T} distribution (kaons);p_{T} [GeV/c]",200,0.,8.);
212
213 namedistr="hptB_";
214 namedistr+=i+1;
215 TH1F *hptB = new TH1F(namedistr.Data(), "P_{T} distribution;p_{T} [GeV/c]",200,0.,8.);
216
217 // pT no mass cut
218 namedistr="hptpiSnoMcut_";
219 namedistr+=i+1;
220 TH1F *hptpiSnoMcut = new TH1F(namedistr.Data(), "P_{T} distribution (pions);p_{T} [GeV/c]",200,0.,8.);
221
222 namedistr="hptKSnoMcut_";
223 namedistr+=i+1;
224 TH1F *hptKSnoMcut = new TH1F(namedistr.Data(), "P_{T} distribution (kaons);p_{T} [GeV/c]",200,0.,8.);
225
226 namedistr="hptB1prongnoMcut_";
227 namedistr+=i+1;
228 TH1F *hptB1pnoMcut = new TH1F(namedistr.Data(), "P_{T} distribution;p_{T} [GeV/c]",200,0.,8.);
229
230 namedistr="hptB2prongsnoMcut_";
231 namedistr+=i+1;
232 TH1F *hptB2pnoMcut = new TH1F(namedistr.Data(), "P_{T} distribution;p_{T} [GeV/c]",200,0.,8.);
233
234
235 // dca
236 namedistr="hdcaS_";
237 namedistr+=i+1;
238 TH1F *hdcaS = new TH1F(namedistr.Data(), "DCA distribution;dca [cm]",200,0.,0.1);
239 namedistr="hdcaB_";
240 namedistr+=i+1;
241 TH1F *hdcaB = new TH1F(namedistr.Data(), "DCA distribution;dca [cm]",200,0.,0.1);
242
243 // costhetastar
244 namedistr="hcosthetastarS_";
245 namedistr+=i+1;
246 TH1F *hcosthetastarS = new TH1F(namedistr.Data(), "cos#theta* distribution;cos#theta*",200,-1.,1.);
247 namedistr="hcosthetastarB_";
248 namedistr+=i+1;
249 TH1F *hcosthetastarB = new TH1F(namedistr.Data(), "cos#theta* distribution;cos#theta*",200,-1.,1.);
250
251 // impact parameter
252 namedistr="hd0piS_";
253 namedistr+=i+1;
254 TH1F *hd0piS = new TH1F(namedistr.Data(), "Impact parameter distribution (pions);d0(#pi) [cm]",200,-0.1,0.1);
255
256 namedistr="hd0KS_";
257 namedistr+=i+1;
258 TH1F *hd0KS = new TH1F(namedistr.Data(), "Impact parameter distribution (kaons);d0(K) [cm]",200,-0.1,0.1);
259 namedistr="hd0B_";
260 namedistr+=i+1;
261 TH1F *hd0B = new TH1F(namedistr.Data(), "Impact parameter distribution;d0 [cm]",200,-0.1,0.1);
262
263 namedistr="hd0d0S_";
264 namedistr+=i+1;
265 TH1F *hd0d0S = new TH1F(namedistr.Data(), "d_{0}#timesd_{0} distribution;d_{0}#timesd_{0} [cm^{2}]",200,-0.001,0.001);
266 namedistr="hd0d0B_";
267 namedistr+=i+1;
268 TH1F *hd0d0B = new TH1F(namedistr.Data(), "d_{0}#timesd_{0} distribution;d_{0}#timesd_{0} [cm^{2}]",200,-0.001,0.001);
269
270 // costhetapoint
271 namedistr="hcosthetapointS_";
272 namedistr+=i+1;
273 TH1F *hcosthetapointS = new TH1F(namedistr.Data(), "cos#theta_{Point} distribution;cos#theta_{Point}",200,0,1.);
274 namedistr="hcosthetapointB_";
275 namedistr+=i+1;
276 TH1F *hcosthetapointB = new TH1F(namedistr.Data(), "cos#theta_{Point} distribution;cos#theta_{Point}",200,0,1.);
277
278 namedistr="hcosthpointd0d0S_";
279 namedistr+=i+1;
280 TH2F *hcosthpointd0d0S= new TH2F(namedistr.Data(),"Correlation cos#theta_{Point}-d_{0}#timesd_{0};cos#theta_{Point};d_{0}#timesd_{0} [cm^{2}]",200,0,1.,200,-0.001,0.001);
281 namedistr="hcosthpointd0d0B_";
282 namedistr+=i+1;
283 TH2F *hcosthpointd0d0B= new TH2F(namedistr.Data(),"Correlation cos#theta_{Point}-d_{0}#timesd_{0};cos#theta_{Point};d_{0}#timesd_{0} [cm^{2}]",200,0,1.,200,-0.001,0.001);
284
285 fDistr->Add(hptpiS);
286 fDistr->Add(hptKS);
287 fDistr->Add(hptB);
288
289 fDistr->Add(hptpiSnoMcut);
290 fDistr->Add(hptKSnoMcut);
291 fDistr->Add(hptB1pnoMcut);
292 fDistr->Add(hptB2pnoMcut);
293
294 fDistr->Add(hdcaS);
295 fDistr->Add(hdcaB);
296
297 fDistr->Add(hd0piS);
298 fDistr->Add(hd0KS);
299 fDistr->Add(hd0B);
300
301 fDistr->Add(hd0d0S);
302 fDistr->Add(hd0d0B);
303
304 fDistr->Add(hcosthetastarS);
305 fDistr->Add(hcosthetastarB);
306
307 fDistr->Add(hcosthetapointS);
308 fDistr->Add(hcosthetapointB);
309
310 fDistr->Add(hcosthpointd0d0S);
311 fDistr->Add(hcosthpointd0d0B);
312
313
a41f6fad 314 //histograms of invariant mass distributions
315
46c96ce5 316 TH1F* tmpMt = new TH1F(nameMass.Data(),"D^{0} invariant mass; M [GeV]; Entries",200,1.765,1.965);
317 TH1F *tmpMl=(TH1F*)tmpMt->Clone();
318 tmpMt->Sumw2();
319 tmpMl->Sumw2();
a4ae02cd 320
9de8c723 321 //to compare with AliAnalysisTaskCharmFraction
322 TH1F* tmpS27t = new TH1F(nameSgn27.Data(),"D^{0} invariant mass in M(D^{0}) +/- 27 MeV - MC; M [GeV]; Entries",200,1.765,1.965);
323 TH1F *tmpS27l=(TH1F*)tmpS27t->Clone();
324 tmpS27t->Sumw2();
325 tmpS27l->Sumw2();
0108fa62 326
327 //distribution w/o cuts
6321ee46 328 // TH1F* tmpMS = new TH1F(nameMassNocutsS.Data(),"D^{0} invariant mass; M [GeV]; Entries",300,0.7,3.);
329 TH1F* tmpMS = new TH1F(nameMassNocutsS.Data(),"D^{0} invariant mass; M [GeV]; Entries",300,1.56484,2.16484); //range (MD0-300MeV, mD0 + 300MeV)
330 TH1F *tmpMB=(TH1F*)tmpMS->Clone();
0108fa62 331 tmpMB->SetName(nameMassNocutsB.Data());
332 tmpMS->Sumw2();
333 tmpMB->Sumw2();
334
335 //MC signal and background
46c96ce5 336 TH1F* tmpSt = new TH1F(nameSgn.Data(), "D^{0} invariant mass - MC; M [GeV]; Entries",200,1.765,1.965);
337 TH1F *tmpSl=(TH1F*)tmpSt->Clone();
338 tmpSt->Sumw2();
339 tmpSl->Sumw2();
a4ae02cd 340
46c96ce5 341 TH1F* tmpBt = new TH1F(nameBkg.Data(), "Background invariant mass - MC; M [GeV]; Entries",200,1.765,1.965);
342 TH1F *tmpBl=(TH1F*)tmpBt->Clone();
343 tmpBt->Sumw2();
344 tmpBl->Sumw2();
a4ae02cd 345
feb73eca 346 //Reflection: histo filled with D0Mass which pass the cut (also) as D0bar and with D0bar which pass (also) the cut as D0
46c96ce5 347 TH1F* tmpRt = new TH1F(nameRfl.Data(), "Reflected signal invariant mass - MC; M [GeV]; Entries",200,1.765,1.965);
348 TH1F *tmpRl=(TH1F*)tmpRt->Clone();
349 tmpRt->Sumw2();
350 tmpRl->Sumw2();
a4ae02cd 351 // printf("Created histograms %s\t%s\t%s\t%s\n",tmpM->GetName(),tmpS->GetName(),tmpB->GetName(),tmpR->GetName());
352
9de8c723 353 fOutputPPR->Add(tmpMt);
354 fOutputPPR->Add(tmpSt);
355 fOutputPPR->Add(tmpS27t);
356 fOutputPPR->Add(tmpBt);
357 fOutputPPR->Add(tmpRt);
a4ae02cd 358
527f330b 359 fOutputmycuts->Add(tmpMl);
360 fOutputmycuts->Add(tmpSl);
361 fOutputmycuts->Add(tmpS27l);
362 fOutputmycuts->Add(tmpBl);
363 fOutputmycuts->Add(tmpRl);
0108fa62 364
365 fDistr->Add(tmpMS);
366 fDistr->Add(tmpMB);
367
34137226 368
7646d6da 369 }
a4ae02cd 370
34137226 371 //histograms for vertex checking
372 TString checkname="hptGoodTr";
373
374 TH1F* hptGoodTr=new TH1F(checkname.Data(),"Pt distribution of 'good' tracks;p_{t}[GeV];Number",200,0.,8.);
375 hptGoodTr->SetTitleOffset(1.3,"Y");
376 checkname="hdistrGoodTr";
a41f6fad 377
34137226 378 TH1F* hdistrGoodTr=new TH1F(checkname.Data(),"Distribution of number of good tracks per event;no.good-tracks/ev;Entries",31,0,31);
379 hdistrGoodTr->SetTitleOffset(1.3,"Y");
380
381 //conta gli eventi con vertice buoni e almeno due tracce utilizzabili
382 fChecks->Add(hptGoodTr);
383 fChecks->Add(hdistrGoodTr);
384
385 fNentries=new TH1F("nentriesD0", "nentriesD0->Integral(1,2) = number of AODs *** nentriesD0->Integral(3,4) = number of candidates selected with cuts *** nentriesD0->Integral(5,6) = number of D0 selected with cuts *** nentriesD0->Integral(7,8) = events with good vertex", 5,0.,5.);
386
387 fNentries->GetXaxis()->SetBinLabel(1,"nEventsAnal");
388 fNentries->GetXaxis()->SetBinLabel(2,"nCandidatesSelected");
389 fNentries->GetXaxis()->SetBinLabel(3,"nD0Selected");
390 fNentries->GetXaxis()->SetBinLabel(4,"nEventsGoodVtx");
391 fNentries->GetXaxis()->SetBinLabel(5,"nEventsGoodVtx+>2tracks");
392 fNentries->GetXaxis()->SetNdivisions(1,kFALSE);
a4ae02cd 393
49061176 394 return;
395}
396
397//________________________________________________________________________
398void AliAnalysisTaskSED0Mass::UserExec(Option_t */*option*/)
399{
400 // Execute analysis for current event:
401 // heavy flavor candidates association to MC truth
a4ae02cd 402 //cout<<"I'm in UserExec"<<endl;
49061176 403 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
feb73eca 404
b557eb43 405 TString bname;
feb73eca 406 if(fArray==0){ //D0 candidates
b557eb43 407 // load D0->Kpi candidates
feb73eca 408 //cout<<"D0 candidates"<<endl;
b557eb43 409 bname="D0toKpi";
feb73eca 410 } else { //LikeSign candidates
feb73eca 411 // load like sign candidates
b557eb43 412 //cout<<"LS candidates"<<endl;
413 bname="LikeSign2Prong";
414 }
415
416 TClonesArray *inputArray=0;
34137226 417
b557eb43 418 if(!aod && AODEvent() && IsStandardAOD()) {
419 // In case there is an AOD handler writing a standard AOD, use the AOD
420 // event in memory rather than the input (ESD) event.
421 aod = dynamic_cast<AliAODEvent*> (AODEvent());
422 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
423 // have to taken from the AOD event hold by the AliAODExtension
424 AliAODHandler* aodHandler = (AliAODHandler*)
425 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
34137226 426
b557eb43 427 if(aodHandler->GetExtensions()) {
428 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
34137226 429 AliAODEvent* aodFromExt = ext->GetAOD();
b557eb43 430 inputArray=(TClonesArray*)aodFromExt->GetList()->FindObject(bname.Data());
feb73eca 431 }
b557eb43 432 } else {
433 inputArray=(TClonesArray*)aod->GetList()->FindObject(bname.Data());
434 }
feb73eca 435
b557eb43 436
437 if(!inputArray) {
438 printf("AliAnalysisTaskSED0Mass::UserExec: input branch not found!\n");
439 return;
49061176 440 }
441
442 // AOD primary vertex
443 AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
feb73eca 444
34137226 445 Bool_t isGoodVtx=kFALSE;
446
447 //vtx1->Print();
448 TString primTitle = vtx1->GetTitle();
449 if(primTitle.Contains("VertexerTracks") && vtx1->GetNContributors()>0) {
450 isGoodVtx=kTRUE;
451 fNentries->Fill(3);
452 }
453
454 //cout<<"Start checks"<<endl;
455 Int_t ntracks=0,isGoodTrack=0;
456
457 if(aod) ntracks=aod->GetNTracks();
458 //cout<<"ntracks = "<<ntracks<<endl;
459 //cout<<"Before loop"<<endl;
460 //loop on tracks in the event
461 for (Int_t k=0;k<ntracks;k++){
462 AliAODTrack* track=aod->GetTrack(k);
463 //cout<<"in loop"<<endl;
464 //check clusters of the tracks
465 Int_t nclsTot=0,nclsSPD=0;
466
467 for(Int_t l=0;l<6;l++) {
468 if(TESTBIT(track->GetITSClusterMap(),l)) {
469 nclsTot++; if(l<2) nclsSPD++;
470 }
471 }
472
473 if (track->Pt()>0.3 &&
474 track->GetStatus()&AliESDtrack::kTPCrefit &&
475 track->GetStatus()&AliESDtrack::kITSrefit &&
476 nclsTot>3 &&
477 nclsSPD>0) {//fill hist good tracks
478 //cout<<"in if"<<endl;
479 ((TH1F*)fChecks->FindObject("hptGoodTr"))->Fill(track->Pt());
480 isGoodTrack++;
481 }
482 //cout<<"isGoodTrack = "<<isGoodTrack<<endl;
483 ((TH1F*)fChecks->FindObject("hdistrGoodTr"))->Fill(isGoodTrack);
484 }
485 //number of events with good vertex and at least 2 good tracks
486 if (isGoodTrack>=2 && isGoodVtx) fNentries->Fill(4);
487
ce39f0ac 488 TClonesArray *mcArray = 0;
489 AliAODMCHeader *mcHeader = 0;
490
491 if(fReadMC) {
492 // load MC particles
493 mcArray = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
494 if(!mcArray) {
495 printf("AliAnalysisTaskSED0Mass::UserExec: MC particles branch not found!\n");
496 return;
497 }
49061176 498
ce39f0ac 499 // load MC header
500 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
501 if(!mcHeader) {
502 printf("AliAnalysisTaskSED0Mass::UserExec: MC header branch not found!\n");
503 return;
504 }
49061176 505 }
506
b557eb43 507 //printf("VERTEX Z %f %f\n",vtx1->GetZ(),mcHeader->GetVtxZ());
a4ae02cd 508
509 //histogram filled with 1 for every AOD
34137226 510 fNentries->Fill(0);
a4ae02cd 511 PostData(3,fNentries);
34137226 512 //cout<<"First PostData"<<endl;
9de8c723 513
feb73eca 514 // loop over candidates
515 Int_t nInD0toKpi = inputArray->GetEntriesFast();
4464ce7e 516 if(fDebug>1) printf("Number of D0->Kpi: %d\n",nInD0toKpi);
34137226 517
49061176 518 for (Int_t iD0toKpi = 0; iD0toKpi < nInD0toKpi; iD0toKpi++) {
feb73eca 519 //Int_t nPosPairs=0, nNegPairs=0;
a41f6fad 520 //cout<<"inside the loop"<<endl;
feb73eca 521 AliAODRecoDecayHF2Prong *d = (AliAODRecoDecayHF2Prong*)inputArray->UncheckedAt(iD0toKpi);
49061176 522 Bool_t unsetvtx=kFALSE;
523 if(!d->GetOwnPrimaryVtx()) {
524 d->SetOwnPrimaryVtx(vtx1); // needed to compute all variables
525 unsetvtx=kTRUE;
526 }
34137226 527
9de8c723 528 //check reco daughter in acceptance
529 Double_t eta0=d->EtaProng(0);
530 Double_t eta1=d->EtaProng(1);
531 Bool_t prongsinacc=kFALSE;
532 if (TMath::Abs(eta0) < 0.9 && TMath::Abs(eta1) < 0.9) prongsinacc=kTRUE;
a41f6fad 533
534 //add distr here
535 UInt_t pdgs[2];
49061176 536
a41f6fad 537 Double_t mPDG=TDatabasePDG::Instance()->GetParticle(421)->Mass();
538 pdgs[0]=211;
539 pdgs[1]=321;
540 Double_t minvD0 = d->InvMassD0();
541 pdgs[1]=211;
542 pdgs[0]=321;
543 Double_t minvD0bar = d->InvMassD0bar();
0108fa62 544 //cout<<"inside mass cut"<<endl;
545
546 Int_t pdgDgD0toKpi[2]={321,211};
547 Int_t lab=-9999;
548 if(fReadMC) lab=d->MatchToMC(421,mcArray,2,pdgDgD0toKpi); //return MC particle label if the array corresponds to a D0, -1 if not (cf. AliAODRecoDecay.cxx)
b272aebf 549 Double_t pt = d->Pt(); //mother pt
ce39f0ac 550
b272aebf 551 if(lab>=0 && fReadMC){ //signal
552
553 //check pdg of the prongs
554 AliAODTrack *prong0=(AliAODTrack*)d->GetDaughter(0);
555 AliAODTrack *prong1=(AliAODTrack*)d->GetDaughter(1);
556 Int_t labprong[2];
557 labprong[0]=prong0->GetLabel();
558 labprong[1]=prong1->GetLabel();
559 AliAODMCParticle *mcprong=0;
3f4cae8c 560 Int_t pdgProng[2]={0,0};
b272aebf 561 for (Int_t iprong=0;iprong<2;iprong++){
562 if(labprong[iprong]>=0) mcprong= (AliAODMCParticle*)mcArray->At(labprong[iprong]);
3f4cae8c 563 pdgProng[iprong]=mcprong->GetPdgCode();
b272aebf 564 }
565
34137226 566
b272aebf 567 //no mass cut ditributions: ptbis
568
569 if(pt>0. && pt<=1.) {
3f4cae8c 570 if (TMath::Abs(pdgProng[0]) == 211 && TMath::Abs(pdgProng[1]) == 321){
b272aebf 571 ((TH1F*)fDistr->FindObject("hptpiSnoMcut_1"))->Fill(d->PtProng(0));
572 ((TH1F*)fDistr->FindObject("hptKSnoMcut_1"))->Fill(d->PtProng(1));
573 }else {
3f4cae8c 574 if (TMath::Abs(pdgProng[0]) == 321 && TMath::Abs(pdgProng[1]) == 211){
b272aebf 575 ((TH1F*)fDistr->FindObject("hptKSnoMcut_1"))->Fill(d->PtProng(0));
576 ((TH1F*)fDistr->FindObject("hptpiSnoMcut_1"))->Fill(d->PtProng(1));
577 }
578 }
579 }
580 if(pt>1. && pt<=2.) {
3f4cae8c 581 if (TMath::Abs(pdgProng[0]) == 211 && TMath::Abs(pdgProng[1]) == 321){
b272aebf 582 ((TH1F*)fDistr->FindObject("hptpiSnoMcut_2"))->Fill(d->PtProng(0));
583 ((TH1F*)fDistr->FindObject("hptKSnoMcut_2"))->Fill(d->PtProng(1));
584 }else {
3f4cae8c 585 if (TMath::Abs(pdgProng[0]) == 321 && TMath::Abs(pdgProng[1]) == 211){
b272aebf 586 ((TH1F*)fDistr->FindObject("hptKSnoMcut_2"))->Fill(d->PtProng(0));
587 ((TH1F*)fDistr->FindObject("hptpiSnoMcut_2"))->Fill(d->PtProng(1));
588 }
589 }
590 }
591 if(pt>2. && pt<=3.) {
3f4cae8c 592 if (TMath::Abs(pdgProng[0]) == 211 && TMath::Abs(pdgProng[1]) == 321){
b272aebf 593 ((TH1F*)fDistr->FindObject("hptpiSnoMcut_3"))->Fill(d->PtProng(0));
594 ((TH1F*)fDistr->FindObject("hptKSnoMcut_3"))->Fill(d->PtProng(1));
595 }else {
3f4cae8c 596 if (TMath::Abs(pdgProng[0]) == 321 && TMath::Abs(pdgProng[1]) == 211){
b272aebf 597 ((TH1F*)fDistr->FindObject("hptKSnoMcut_3"))->Fill(d->PtProng(0));
598 ((TH1F*)fDistr->FindObject("hptpiSnoMcut_3"))->Fill(d->PtProng(1));
599 }
600 }
601 }
602 if(pt>3. && pt<=5.) {
603
3f4cae8c 604 if (TMath::Abs(pdgProng[0]) == 211 && TMath::Abs(pdgProng[1]) == 321){
b272aebf 605 ((TH1F*)fDistr->FindObject("hptpiSnoMcut_4"))->Fill(d->PtProng(0));
606 ((TH1F*)fDistr->FindObject("hptKSnoMcut_4"))->Fill(d->PtProng(1));
607 }else {
3f4cae8c 608 if (TMath::Abs(pdgProng[0]) == 321 && TMath::Abs(pdgProng[1]) == 211){
b272aebf 609 ((TH1F*)fDistr->FindObject("hptKSnoMcut_4"))->Fill(d->PtProng(0));
610 ((TH1F*)fDistr->FindObject("hptpiSnoMcut_4"))->Fill(d->PtProng(1));
611 }
612 }
613 }
614 if(pt>5.) {
615
3f4cae8c 616 if (TMath::Abs(pdgProng[0]) == 211 && TMath::Abs(pdgProng[1]) == 321){
b272aebf 617 ((TH1F*)fDistr->FindObject("hptpiSnoMcut_5"))->Fill(d->PtProng(0));
618 ((TH1F*)fDistr->FindObject("hptKSnoMcut_5"))->Fill(d->PtProng(1));
619 }else {
3f4cae8c 620 if (TMath::Abs(pdgProng[0]) == 321 && TMath::Abs(pdgProng[1]) == 211){
b272aebf 621 ((TH1F*)fDistr->FindObject("hptKSnoMcut_5"))->Fill(d->PtProng(0));
622 ((TH1F*)fDistr->FindObject("hptpiSnoMcut_5"))->Fill(d->PtProng(1));
623 }
624 }
625 }
626
0108fa62 627 if (((AliAODMCParticle*)mcArray->At(lab))->GetPdgCode() == 421){//D0
b272aebf 628
629 //no mass cut ditributions: mass, costhetastar
630
631 if(pt>0. && pt<=1.) {
632 ((TH1F*)fDistr->FindObject("hMassS_1"))->Fill(minvD0);
633 }
634 if(pt>1. && pt<=2.) {
635 ((TH1F*)fDistr->FindObject("hMassS_2"))->Fill(minvD0);
636
637 }
638 if(pt>2. && pt<=3.) {
639 ((TH1F*)fDistr->FindObject("hMassS_3"))->Fill(minvD0);
640
641 }
642 if(pt>3. && pt<=5.) {
643 ((TH1F*)fDistr->FindObject("hMassS_4"))->Fill(minvD0);
644
645 }
646 if(pt>5.) {
647 ((TH1F*)fDistr->FindObject("hMassS_5"))->Fill(minvD0);
648
0108fa62 649 }
0108fa62 650
651 }
652 else { //D0bar
b272aebf 653
654 //no mass cut ditributions: mass
655
656 if(pt>0. && pt<=1.) {
657 ((TH1F*)fDistr->FindObject("hMassS_1"))->Fill(minvD0bar);
658
659 }
660 if(pt>1. && pt<=2.) {
661 ((TH1F*)fDistr->FindObject("hMassS_2"))->Fill(minvD0bar);
662
0108fa62 663 }
b272aebf 664 if(pt>2. && pt<=3.) {
665 ((TH1F*)fDistr->FindObject("hMassS_3"))->Fill(minvD0bar);
0108fa62 666
b272aebf 667 }
668 if(pt>3. && pt<=5.) {
669 ((TH1F*)fDistr->FindObject("hMassS_4"))->Fill(minvD0bar);
670
671 }
672 if(pt>5.) {
673 ((TH1F*)fDistr->FindObject("hMassS_5"))->Fill(minvD0bar);
674 }
0108fa62 675
676 }
677
678 //apply cut on invariant mass on the pair
679 if(TMath::Abs(minvD0-mPDG)<0.03 || TMath::Abs(minvD0bar-mPDG)<0.03){
680
681 if(fArray==1) cout<<"LS signal: ERROR"<<endl;
682 for (Int_t iprong=0; iprong<2; iprong++){
683 AliAODTrack *prong=(AliAODTrack*)d->GetDaughter(iprong);
04e09ffc 684 labprong[iprong]=prong->GetLabel();
0108fa62 685
686 //cout<<"prong name = "<<prong->GetName()<<" label = "<<prong->GetLabel()<<endl;
04e09ffc 687 if(labprong[iprong]>=0) mcprong= (AliAODMCParticle*)mcArray->At(labprong[iprong]);
0108fa62 688 Int_t pdgprong=mcprong->GetPdgCode();
689 if(TMath::Abs(pdgprong)==211) {
690 //cout<<"pi"<<endl;
b272aebf 691 if(pt>0. && pt<=1.){
692 ((TH1F*)fDistr->FindObject("hptpiS_1"))->Fill(d->PtProng(iprong));
693 ((TH1F*)fDistr->FindObject("hd0piS_1"))->Fill(d->Getd0Prong(iprong));
694 }
695 if(pt>1. && pt<=2.){
696 ((TH1F*)fDistr->FindObject("hptpiS_2"))->Fill(d->PtProng(iprong));
697 ((TH1F*)fDistr->FindObject("hd0piS_2"))->Fill(d->Getd0Prong(iprong));
698 }
699
700 if(pt>2. && pt<=3.){
701 ((TH1F*)fDistr->FindObject("hptpiS_3"))->Fill(d->PtProng(iprong));
702 ((TH1F*)fDistr->FindObject("hd0piS_3"))->Fill(d->Getd0Prong(iprong));
0108fa62 703
b272aebf 704 }
705 if(pt>3. && pt<=5.){
706 ((TH1F*)fDistr->FindObject("hptpiS_4"))->Fill(d->PtProng(iprong));
707 ((TH1F*)fDistr->FindObject("hd0piS_4"))->Fill(d->Getd0Prong(iprong));
708
709 }
710 if(pt>5.) {
711 ((TH1F*)fDistr->FindObject("hptpiS_5"))->Fill(d->PtProng(iprong));
712 ((TH1F*)fDistr->FindObject("hd0piS_5"))->Fill(d->Getd0Prong(iprong));
713
714 }
715
716
717 }
718
719 if(TMath::Abs(pdgprong)==321) {
0108fa62 720 //cout<<"kappa"<<endl;
b272aebf 721 if(pt>0. && pt<=1.){
722 ((TH1F*)fDistr->FindObject("hptKS_1"))->Fill(d->PtProng(iprong));
723 ((TH1F*)fDistr->FindObject("hd0KS_1"))->Fill(d->Getd0Prong(iprong));
724 }
725 if(pt>1. && pt<=2.){
726 ((TH1F*)fDistr->FindObject("hptKS_2"))->Fill(d->PtProng(iprong));
727 ((TH1F*)fDistr->FindObject("hd0KS_2"))->Fill(d->Getd0Prong(iprong));
728 }
729 if(pt>2. && pt<=3.){
730 ((TH1F*)fDistr->FindObject("hptKS_3"))->Fill(d->PtProng(iprong));
731 ((TH1F*)fDistr->FindObject("hd0KS_3"))->Fill(d->Getd0Prong(iprong));
732 }
733 if(pt>3. && pt<=5.){
734 ((TH1F*)fDistr->FindObject("hptKS_4"))->Fill(d->PtProng(iprong));
735 ((TH1F*)fDistr->FindObject("hd0KS_4"))->Fill(d->Getd0Prong(iprong));
736
737 }
738 if(pt>5.) {
739 ((TH1F*)fDistr->FindObject("hptKS_5"))->Fill(d->PtProng(iprong));
740 ((TH1F*)fDistr->FindObject("hd0KS_5"))->Fill(d->Getd0Prong(iprong));
741
742 }
743
0108fa62 744 }
0108fa62 745
b272aebf 746 if(pt>0. && pt<=1.){
747 ((TH1F*)fDistr->FindObject("hdcaS_1"))->Fill(d->GetDCA());
748
749 if (((AliAODMCParticle*)mcArray->At(lab))->GetPdgCode() == 421)
750 ((TH1F*)fDistr->FindObject("hcosthetastarS_1"))->Fill(d->CosThetaStarD0());
751 else ((TH1F*)fDistr->FindObject("hcosthetastarS_1"))->Fill(d->CosThetaStarD0bar());
752
753 }
754 if(pt>1. && pt<=2.){
755 ((TH1F*)fDistr->FindObject("hdcaS_2"))->Fill(d->GetDCA());
756
757 if (((AliAODMCParticle*)mcArray->At(lab))->GetPdgCode() == 421)
758 ((TH1F*)fDistr->FindObject("hcosthetastarS_2"))->Fill(d->CosThetaStarD0());
759 else ((TH1F*)fDistr->FindObject("hcosthetastarS_2"))->Fill(d->CosThetaStarD0bar());
760
761 }
762 if(pt>2. && pt<=3.){
763 ((TH1F*)fDistr->FindObject("hdcaS_3"))->Fill(d->GetDCA());
0108fa62 764
b272aebf 765 if (((AliAODMCParticle*)mcArray->At(lab))->GetPdgCode() == 421)
766 ((TH1F*)fDistr->FindObject("hcosthetastarS_3"))->Fill(d->CosThetaStarD0());
767 else ((TH1F*)fDistr->FindObject("hcosthetastarS_3"))->Fill(d->CosThetaStarD0bar());
0108fa62 768
b272aebf 769 }
770 if(pt>3. && pt<=5.){
771 ((TH1F*)fDistr->FindObject("hdcaS_4"))->Fill(d->GetDCA());
772
773 if (((AliAODMCParticle*)mcArray->At(lab))->GetPdgCode() == 421)
774 ((TH1F*)fDistr->FindObject("hcosthetastarS_4"))->Fill(d->CosThetaStarD0());
775 else ((TH1F*)fDistr->FindObject("hcosthetastarS_4"))->Fill(d->CosThetaStarD0bar());
776
777 }
778 if(pt>5.) {
779 ((TH1F*)fDistr->FindObject("hdcaS_5"))->Fill(d->GetDCA());
0108fa62 780
b272aebf 781 if (((AliAODMCParticle*)mcArray->At(lab))->GetPdgCode() == 421)
782 ((TH1F*)fDistr->FindObject("hcosthetastarS_5"))->Fill(d->CosThetaStarD0());
783 else ((TH1F*)fDistr->FindObject("hcosthetastarS_5"))->Fill(d->CosThetaStarD0bar());
784
785 }
786
6321ee46 787 }
0108fa62 788
b272aebf 789 if(pt>0. && pt<=1.){
790 ((TH1F*)fDistr->FindObject("hd0d0S_1"))->Fill(d->Prodd0d0());
791 ((TH1F*)fDistr->FindObject("hcosthetapointS_1"))->Fill(d->CosPointingAngle());
792 ((TH1F*)fDistr->FindObject("hcosthpointd0d0S_1"))->Fill(d->CosPointingAngle(),d->Prodd0d0());
793 }
794 if(pt>1. && pt<=2.){
795 ((TH1F*)fDistr->FindObject("hd0d0S_2"))->Fill(d->Prodd0d0());
796 ((TH1F*)fDistr->FindObject("hcosthetapointS_2"))->Fill(d->CosPointingAngle());
797 ((TH1F*)fDistr->FindObject("hcosthpointd0d0S_2"))->Fill(d->CosPointingAngle(),d->Prodd0d0());
798 }
799 if(pt>2. && pt<=3.){
800 ((TH1F*)fDistr->FindObject("hd0d0S_3"))->Fill(d->Prodd0d0());
801 ((TH1F*)fDistr->FindObject("hcosthetapointS_3"))->Fill(d->CosPointingAngle());
802 ((TH1F*)fDistr->FindObject("hcosthpointd0d0S_3"))->Fill(d->CosPointingAngle(),d->Prodd0d0());
803 }
804 if(pt>3. && pt<=5.){
805 ((TH1F*)fDistr->FindObject("hd0d0S_4"))->Fill(d->Prodd0d0());
806 ((TH1F*)fDistr->FindObject("hcosthetapointS_4"))->Fill(d->CosPointingAngle());
807 ((TH1F*)fDistr->FindObject("hcosthpointd0d0S_4"))->Fill(d->CosPointingAngle(),d->Prodd0d0());
808 }
809 if(pt>5.) {
810 ((TH1F*)fDistr->FindObject("hd0d0S_5"))->Fill(d->Prodd0d0());
811 ((TH1F*)fDistr->FindObject("hcosthetapointS_5"))->Fill(d->CosPointingAngle());
812 ((TH1F*)fDistr->FindObject("hcosthpointd0d0S_5"))->Fill(d->CosPointingAngle(),d->Prodd0d0());
813 }
0108fa62 814
815 } //invmass cut
816
817 } else{ //Background or LS
818 //cout<<"is background"<<endl;
3f4cae8c 819 pt = d->Pt();
b272aebf 820
821 //no mass cut distributions: mass, ptbis
0108fa62 822 if(pt>0. && pt<=1.) {
823 ((TH1F*)fDistr->FindObject("hMassB_1"))->Fill(minvD0);
824 ((TH1F*)fDistr->FindObject("hMassB_1"))->Fill(minvD0bar);
b272aebf 825
826 ((TH1F*)fDistr->FindObject("hptB1prongnoMcut_1"))->Fill(d->PtProng(0));
827 ((TH1F*)fDistr->FindObject("hptB2prongsnoMcut_1"))->Fill(d->PtProng(0));
828 ((TH1F*)fDistr->FindObject("hptB2prongsnoMcut_1"))->Fill(d->PtProng(1));
829
0108fa62 830 }
831 if(pt>1. && pt<=2.) {
832 ((TH1F*)fDistr->FindObject("hMassB_2"))->Fill(minvD0);
833 ((TH1F*)fDistr->FindObject("hMassB_2"))->Fill(minvD0bar);
b272aebf 834
835 ((TH1F*)fDistr->FindObject("hptB1prongnoMcut_2"))->Fill(d->PtProng(0));
836 ((TH1F*)fDistr->FindObject("hptB2prongsnoMcut_2"))->Fill(d->PtProng(0));
837 ((TH1F*)fDistr->FindObject("hptB2prongsnoMcut_2"))->Fill(d->PtProng(1));
838
0108fa62 839 }
840 if(pt>2. && pt<=3.) {
841 ((TH1F*)fDistr->FindObject("hMassB_3"))->Fill(minvD0);
842 ((TH1F*)fDistr->FindObject("hMassB_3"))->Fill(minvD0bar);
b272aebf 843
844 ((TH1F*)fDistr->FindObject("hptB1prongnoMcut_3"))->Fill(d->PtProng(0));
845 ((TH1F*)fDistr->FindObject("hptB2prongsnoMcut_3"))->Fill(d->PtProng(0));
846 ((TH1F*)fDistr->FindObject("hptB2prongsnoMcut_3"))->Fill(d->PtProng(1));
847
0108fa62 848 }
849 if(pt>3. && pt<=5.) {
850 ((TH1F*)fDistr->FindObject("hMassB_4"))->Fill(minvD0);
851 ((TH1F*)fDistr->FindObject("hMassB_4"))->Fill(minvD0bar);
b272aebf 852
853 ((TH1F*)fDistr->FindObject("hptB1prongnoMcut_4"))->Fill(d->PtProng(0));
854 ((TH1F*)fDistr->FindObject("hptB2prongsnoMcut_4"))->Fill(d->PtProng(0));
855 ((TH1F*)fDistr->FindObject("hptB2prongsnoMcut_4"))->Fill(d->PtProng(1));
856
0108fa62 857 }
858 if(pt>5.) {
859 ((TH1F*)fDistr->FindObject("hMassB_5"))->Fill(minvD0);
860 ((TH1F*)fDistr->FindObject("hMassB_5"))->Fill(minvD0bar);
b272aebf 861
862 ((TH1F*)fDistr->FindObject("hptB1prongnoMcut_5"))->Fill(d->PtProng(0));
863 ((TH1F*)fDistr->FindObject("hptB2prongsnoMcut_5"))->Fill(d->PtProng(0));
864 ((TH1F*)fDistr->FindObject("hptB2prongsnoMcut_5"))->Fill(d->PtProng(1));
865
0108fa62 866 }
867
868 //apply cut on invariant mass on the pair
869 if(TMath::Abs(minvD0-mPDG)<0.03 || TMath::Abs(minvD0bar-mPDG)<0.03){
870
871
872 AliAODTrack *prong=(AliAODTrack*)d->GetDaughter(0);
873 if(!prong) cout<<"No daughter found";
874 else{
875 if(prong->Charge()==1) {fTotPosPairs[4]++;} else {fTotNegPairs[4]++;}
876 }
b272aebf 877 if(pt>0. && pt<=1.){
878 //normalise pt distr to half afterwards
879 ((TH1F*)fDistr->FindObject("hptB_1"))->Fill(d->PtProng(0));((TH1F*)fDistr->FindObject("hptB_1"))->Fill(d->PtProng(1));
880 ((TH1F*)fDistr->FindObject("hd0B_1"))->Fill(d->Getd0Prong(0));
881 ((TH1F*)fDistr->FindObject("hdcaB_1"))->Fill(d->GetDCA());
882 ((TH1F*)fDistr->FindObject("hcosthetastarB_1"))->Fill(d->CosThetaStarD0());
883 ((TH1F*)fDistr->FindObject("hcosthetastarB_1"))->Fill(d->CosThetaStarD0bar());
884 ((TH1F*)fDistr->FindObject("hd0d0B_1"))->Fill(d->Prodd0d0());
885 ((TH1F*)fDistr->FindObject("hcosthetapointB_1"))->Fill(d->CosPointingAngle());
886 ((TH1F*)fDistr->FindObject("hcosthpointd0d0B_1"))->Fill(d->CosPointingAngle(),d->Prodd0d0());
887 }
888 if(pt>1. && pt<=2.){
889 ((TH1F*)fDistr->FindObject("hptB_2"))->Fill(d->PtProng(0));((TH1F*)fDistr->FindObject("hptB_2"))->Fill(d->PtProng(1));
890 ((TH1F*)fDistr->FindObject("hd0B_2"))->Fill(d->Getd0Prong(0));
891 ((TH1F*)fDistr->FindObject("hdcaB_2"))->Fill(d->GetDCA());
892 ((TH1F*)fDistr->FindObject("hcosthetastarB_2"))->Fill(d->CosThetaStarD0());
893 ((TH1F*)fDistr->FindObject("hcosthetastarB_2"))->Fill(d->CosThetaStarD0bar());
894 ((TH1F*)fDistr->FindObject("hd0d0B_2"))->Fill(d->Prodd0d0());
895 ((TH1F*)fDistr->FindObject("hcosthetapointB_2"))->Fill(d->CosPointingAngle());
896 ((TH1F*)fDistr->FindObject("hcosthpointd0d0B_2"))->Fill(d->CosPointingAngle(),d->Prodd0d0());
897 }
898 if(pt>2. && pt<=3.){
899 ((TH1F*)fDistr->FindObject("hptB_3"))->Fill(d->PtProng(0));((TH1F*)fDistr->FindObject("hptB_3"))->Fill(d->PtProng(1));
900 ((TH1F*)fDistr->FindObject("hd0B_3"))->Fill(d->Getd0Prong(0));
901 ((TH1F*)fDistr->FindObject("hdcaB_3"))->Fill(d->GetDCA());
902 ((TH1F*)fDistr->FindObject("hcosthetastarB_3"))->Fill(d->CosThetaStarD0());
903 ((TH1F*)fDistr->FindObject("hcosthetastarB_3"))->Fill(d->CosThetaStarD0bar());
904 ((TH1F*)fDistr->FindObject("hd0d0B_3"))->Fill(d->Prodd0d0());
905 ((TH1F*)fDistr->FindObject("hcosthetapointB_3"))->Fill(d->CosPointingAngle());
906 ((TH1F*)fDistr->FindObject("hcosthpointd0d0B_3"))->Fill(d->CosPointingAngle(),d->Prodd0d0());
907 }
908 if(pt>3. && pt<=5.){
909 ((TH1F*)fDistr->FindObject("hptB_4"))->Fill(d->PtProng(0));((TH1F*)fDistr->FindObject("hptB_4"))->Fill(d->PtProng(1));
910 ((TH1F*)fDistr->FindObject("hd0B_4"))->Fill(d->Getd0Prong(0));
911 ((TH1F*)fDistr->FindObject("hdcaB_4"))->Fill(d->GetDCA());
912 ((TH1F*)fDistr->FindObject("hcosthetastarB_4"))->Fill(d->CosThetaStarD0());
913 ((TH1F*)fDistr->FindObject("hcosthetastarB_4"))->Fill(d->CosThetaStarD0bar());
914 ((TH1F*)fDistr->FindObject("hd0d0B_4"))->Fill(d->Prodd0d0());
915 ((TH1F*)fDistr->FindObject("hcosthetapointB_4"))->Fill(d->CosPointingAngle());
916 ((TH1F*)fDistr->FindObject("hcosthpointd0d0B_4"))->Fill(d->CosPointingAngle(),d->Prodd0d0());
917 }
918 if(pt>5.) {
919 ((TH1F*)fDistr->FindObject("hptB_5"))->Fill(d->PtProng(0));((TH1F*)fDistr->FindObject("hptB_5"))->Fill(d->PtProng(1));
920 ((TH1F*)fDistr->FindObject("hd0B_5"))->Fill(d->Getd0Prong(0));
921 ((TH1F*)fDistr->FindObject("hdcaB_5"))->Fill(d->GetDCA());
922 ((TH1F*)fDistr->FindObject("hcosthetastarB_5"))->Fill(d->CosThetaStarD0());
923 ((TH1F*)fDistr->FindObject("hcosthetastarB_5"))->Fill(d->CosThetaStarD0bar());
924 ((TH1F*)fDistr->FindObject("hd0d0B_5"))->Fill(d->Prodd0d0());
925 ((TH1F*)fDistr->FindObject("hcosthetapointB_5"))->Fill(d->CosPointingAngle());
926 ((TH1F*)fDistr->FindObject("hcosthpointd0d0B_5"))->Fill(d->CosPointingAngle(),d->Prodd0d0());
927 }
0108fa62 928
929
930 }// end if inv mass cut
931 }//end if background
ce39f0ac 932
0108fa62 933
a41f6fad 934
9de8c723 935 //cuts order
936// printf(" |M-MD0| [GeV] < %f\n",fD0toKpiCuts[0]);
937// printf(" dca [cm] < %f\n",fD0toKpiCuts[1]);
938// printf(" cosThetaStar < %f\n",fD0toKpiCuts[2]);
939// printf(" pTK [GeV/c] > %f\n",fD0toKpiCuts[3]);
940// printf(" pTpi [GeV/c] > %f\n",fD0toKpiCuts[4]);
941// printf(" |d0K| [cm] < %f\n",fD0toKpiCuts[5]);
942// printf(" |d0pi| [cm] < %f\n",fD0toKpiCuts[6]);
943// printf(" d0d0 [cm^2] < %f\n",fD0toKpiCuts[7]);
944// printf(" cosThetaPoint > %f\n",fD0toKpiCuts[8]);
0108fa62 945
49061176 946 Int_t ptbin=0;
6321ee46 947 Bool_t isInRange=kFALSE;
49061176 948
949 //cout<<"P_t = "<<pt<<endl;
950 if (pt>0. && pt<=1.) {
a4ae02cd 951 ptbin=1;
6321ee46 952 isInRange=kTRUE;
11ecfd50 953 /*
954 //test d0 cut
955 fVHFPPR->SetD0toKpiCuts(0.7,0.04,0.8,0.5,0.5,0.05,0.1,-0.0002,0.5);
956 fVHFmycuts->SetD0toKpiCuts(0.7,0.04,0.8,0.5,0.5,0.05,0.1,-0.00025,0.7);
957 */
958 //original
9de8c723 959 fVHFPPR->SetD0toKpiCuts(0.7,0.04,0.8,0.5,0.5,0.05,0.05,-0.0002,0.5);
527f330b 960 fVHFmycuts->SetD0toKpiCuts(0.7,0.04,0.8,0.5,0.5,0.05,0.05,-0.00025,0.7);
11ecfd50 961
9de8c723 962// fVHFPPR->SetD0toKpiCuts(0.7,0.04,0.8,0.5,0.5,0.05,0.05,-0.0002,0.7);
527f330b 963// fVHFmycuts->SetD0toKpiCuts(0.7,0.04,0.8,0.5,0.5,1,1,-0.00015,0.5);
49061176 964 //printf("I'm in the bin %d\n",ptbin);
a4ae02cd 965
49061176 966 }
11ecfd50 967
46c96ce5 968 if(pt>1. && pt<=3.) {
9de8c723 969 if(pt>1. && pt<=2.) ptbin=2;
970 if(pt>2. && pt<=3.) ptbin=3;
6321ee46 971 isInRange=kTRUE;
11ecfd50 972 /*
973 //test d0 cut
974 fVHFPPR->SetD0toKpiCuts(0.7,0.02,0.8,0.7,0.7,0.05,0.1,-0.0002,0.6);
975 fVHFmycuts->SetD0toKpiCuts(0.7,0.02,0.8,0.7,0.7,1,0.1,-0.00025,0.8);
976 */
977 //original
978 fVHFPPR->SetD0toKpiCuts(0.7,0.02,0.8,0.7,0.7,0.05,0.05,-0.0002,0.6);
527f330b 979 fVHFmycuts->SetD0toKpiCuts(0.7,0.02,0.8,0.7,0.7,1,1,-0.00025,0.8);
11ecfd50 980
46c96ce5 981 //printf("I'm in the bin %d\n",ptbin);
982 }
983
984 if(pt>3. && pt<=5.){
6321ee46 985 ptbin=4;
986 isInRange=kTRUE;
987 /*
988 //test d0 cut
989 fVHFPPR->SetD0toKpiCuts(0.7,0.02,0.8,0.7,0.7,0.05,0.1,-0.0001,0.8);
990 fVHFmycuts->SetD0toKpiCuts(0.7,0.02,0.8,0.7,0.7,0.05,0.1,-0.00015,0.8);
991 */
992 //original
993 fVHFPPR->SetD0toKpiCuts(0.7,0.02,0.8,0.7,0.7,0.05,0.05,-0.0001,0.8);
994 fVHFmycuts->SetD0toKpiCuts(0.7,0.02,0.8,0.7,0.7,0.05,0.05,-0.00015,0.8);
995
996 //printf("I'm in the bin %d\n",ptbin);
49061176 997 }
6321ee46 998 if(pt>5.&& pt<=10.){ //additional upper limit to compare with Correction Framework
9de8c723 999 ptbin=5;
6321ee46 1000 isInRange=kTRUE;
11ecfd50 1001 /*
1002 //test d0 cut
1003 fVHFPPR->SetD0toKpiCuts(0.7,0.02,0.8,0.7,0.7,0.05,0.1,-0.00005,0.8);
1004 fVHFmycuts->SetD0toKpiCuts(0.7,0.02,0.8,0.7,0.7,0.05,0.1,-0.00015,0.9);
1005 */
1006 //original
9de8c723 1007 fVHFPPR->SetD0toKpiCuts(0.7,0.02,0.8,0.7,0.7,0.05,0.05,-0.00005,0.8);
527f330b 1008 fVHFmycuts->SetD0toKpiCuts(0.7,0.02,0.8,0.7,0.7,0.05,0.05,-0.00015,0.9);
11ecfd50 1009
1010 }//if(pt>5) if (pt>0. && pt<=1.) {
a4ae02cd 1011 //printf("I'm in the bin %d\n",ptbin);
1012 //old
1013 //fVHF->SetD0toKpiCuts(0.7,0.03,0.8,0.06,0.06,0.05,0.05,-0.0002,0.6); //2.p-p vertex reconstructed
6321ee46 1014 if(prongsinacc && isInRange){
9de8c723 1015 FillHists(ptbin,d,mcArray,fVHFPPR,fOutputPPR);
527f330b 1016 FillHists(ptbin,d,mcArray,fVHFmycuts,fOutputmycuts);
9de8c723 1017 }
49061176 1018 if(unsetvtx) d->UnsetOwnPrimaryVtx();
0108fa62 1019 } //end for prongs
46c96ce5 1020
34137226 1021
49061176 1022
1023
1024
1025 // Post the data
9de8c723 1026 PostData(1,fOutputPPR);
527f330b 1027 PostData(2,fOutputmycuts);
a41f6fad 1028 PostData(4,fDistr);
34137226 1029 PostData(5,fChecks);
1030 //cout<<"Other PostData"<<endl;
49061176 1031 return;
1032}
1033//____________________________________________________________________________*
a4ae02cd 1034void AliAnalysisTaskSED0Mass::FillHists(Int_t ptbin, AliAODRecoDecayHF2Prong *part, TClonesArray *arrMC, AliAnalysisVertexingHF *vhf, TList *listout){
49061176 1035 //
1036 // function used in UserExec:
1037 //
9de8c723 1038
1039
1040 Double_t mPDG=TDatabasePDG::Instance()->GetParticle(421)->Mass();
1041
49061176 1042 Int_t okD0=0,okD0bar=0;
feb73eca 1043 //cout<<"inside FillHist"<<endl;
a4ae02cd 1044 if(part->SelectD0(vhf->GetD0toKpiCuts(),okD0,okD0bar)) {//selected
49061176 1045 Double_t invmassD0 = part->InvMassD0(), invmassD0bar = part->InvMassD0bar();
1046 //printf("SELECTED\n");
feb73eca 1047
9de8c723 1048
feb73eca 1049 AliAODTrack *prong=(AliAODTrack*)part->GetDaughter(0);
1050 if(!prong) cout<<"No daughter found";
1051 else{
9de8c723 1052 if(prong->Charge()==1) {fTotPosPairs[ptbin-1]++;} else {fTotNegPairs[ptbin-1]++;}
feb73eca 1053 }
1054
1055 TString fillthis="";
c8112d2f 1056 Int_t pdgDgD0toKpi[2]={321,211};
ce39f0ac 1057 Int_t labD0=-1;
1058 if (fReadMC) labD0 = part->MatchToMC(421,arrMC,2,pdgDgD0toKpi); //return MC particle label if the array corresponds to a D0, -1 if not (cf. AliAODRecoDecay.cxx)
a41f6fad 1059
9de8c723 1060 //count candidates selected by cuts
34137226 1061 fNentries->Fill(1);
9de8c723 1062 //count true D0 selected by cuts
34137226 1063 if (fReadMC && labD0>=0) fNentries->Fill(2);
9de8c723 1064 PostData(3,fNentries);
1065
a4ae02cd 1066 if (okD0==1) {
1067 fillthis="histMass_";
7646d6da 1068 fillthis+=ptbin;
1069 //cout<<"Filling "<<fillthis<<endl;
1070
49061176 1071 //printf("Fill mass with D0");
a4ae02cd 1072 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0);
feb73eca 1073
a4ae02cd 1074 if(labD0>=0) {
feb73eca 1075 if(fArray==1) cout<<"LS signal ERROR"<<endl;
1076
a4ae02cd 1077 AliAODMCParticle *partD0 = (AliAODMCParticle*)arrMC->At(labD0);
1078 Int_t pdgD0 = partD0->GetPdgCode();
1079 //cout<<"pdg = "<<pdgD0<<endl;
a4ae02cd 1080 if (pdgD0==421){ //D0
1081 //cout<<"Fill S with D0"<<endl;
46c96ce5 1082 fillthis="histSgn_";
1083 fillthis+=ptbin;
a4ae02cd 1084 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0);
9de8c723 1085 if(TMath::Abs(invmassD0 - mPDG) < 0.027){
1086 fillthis="histSgn27_";
1087 fillthis+=ptbin;
1088 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0);
1089 }
a4ae02cd 1090 } else{ //it was a D0bar
46c96ce5 1091 fillthis="histRfl_";
1092 fillthis+=ptbin;
1093 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0);
a4ae02cd 1094 }
1095 } else {//background
1096 fillthis="histBkg_";
1097 fillthis+=ptbin;
1098 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0);
1099 }
feb73eca 1100
49061176 1101 }
1102 if (okD0bar==1) {
a4ae02cd 1103 fillthis="histMass_";
1104 fillthis+=ptbin;
49061176 1105 //printf("Fill mass with D0bar");
a4ae02cd 1106 ((TH1F*)listout->FindObject(fillthis))->Fill(invmassD0bar);
feb73eca 1107
a4ae02cd 1108 if(labD0>=0) {
feb73eca 1109 if(fArray==1) cout<<"LS signal ERROR"<<endl;
a4ae02cd 1110 AliAODMCParticle *partD0 = (AliAODMCParticle*)arrMC->At(labD0);
1111 Int_t pdgD0 = partD0->GetPdgCode();
1112 //cout<<" pdg = "<<pdgD0<<endl;
1113 if (pdgD0==-421){ //D0bar
1114 fillthis="histSgn_";
1115 fillthis+=ptbin;
1116 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0bar);
9de8c723 1117 if (TMath::Abs(invmassD0bar - mPDG) < 0.027){
1118 fillthis="histSgn27_";
1119 fillthis+=ptbin;
1120 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0bar);
1121 }
1122
a4ae02cd 1123
1124 } else{
46c96ce5 1125 fillthis="histRfl_";
1126 fillthis+=ptbin;
1127 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0bar);
a4ae02cd 1128 }
feb73eca 1129 } else {//background or LS
a4ae02cd 1130 fillthis="histBkg_";
1131 fillthis+=ptbin;
1132 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0bar);
1133 }
1134 }
1135
1136
49061176 1137 } //else cout<<"NOT SELECTED"<<endl;
1138
1139}
1140//________________________________________________________________________
1141void AliAnalysisTaskSED0Mass::Terminate(Option_t */*option*/)
1142{
1143 // Terminate analysis
1144 //
1145 if(fDebug > 1) printf("AnalysisTaskSED0Mass: Terminate() \n");
1146
6321ee46 1147
9de8c723 1148 fOutputPPR = dynamic_cast<TList*> (GetOutputData(1));
1149 if (!fOutputPPR) {
a41f6fad 1150 printf("ERROR: fOutputthight not available\n");
a4ae02cd 1151 return;
1152 }
527f330b 1153 fOutputmycuts = dynamic_cast<TList*> (GetOutputData(2));
1154 if (!fOutputmycuts) {
1155 printf("ERROR: fOutputmycuts not available\n");
a41f6fad 1156 return;
1157 }
9de8c723 1158 fDistr = dynamic_cast<TList*> (GetOutputData(4));
a41f6fad 1159 if (!fDistr) {
1160 printf("ERROR: fDistr not available\n");
49061176 1161 return;
1162 }
1163
34137226 1164 fChecks = dynamic_cast<TList*> (GetOutputData(5));
1165 if (!fChecks) {
1166 printf("ERROR: fChecks not available\n");
1167 return;
1168 }
1169
feb73eca 1170 if(fArray==1){
1171 for(Int_t ipt=0;ipt<4;ipt++){
1172 fLsNormalization = 2.*TMath::Sqrt(fTotPosPairs[ipt]*fTotNegPairs[ipt]);
1173
1174
1175 if(fLsNormalization>0) {
9de8c723 1176
feb73eca 1177 TString massName="histMass_";
1178 massName+=ipt+1;
9de8c723 1179 ((TH1F*)fOutputPPR->FindObject(massName))->Scale((1/fLsNormalization)*((TH1F*)fOutputPPR->FindObject(massName))->GetEntries());
527f330b 1180 ((TH1F*)fOutputmycuts->FindObject(massName))->Scale((1/fLsNormalization)*((TH1F*)fOutputmycuts->FindObject(massName))->GetEntries());
feb73eca 1181 }
1182 }
1183
1184 fLsNormalization = 2.*TMath::Sqrt(fTotPosPairs[4]*fTotNegPairs[4]);
1185
1186 if(fLsNormalization>0) {
1187
1188 TString nameDistr="hptB";
1189 ((TH1F*)fDistr->FindObject(nameDistr))->Scale((1/fLsNormalization)*((TH1F*)fDistr->FindObject(nameDistr))->GetEntries());
1190 nameDistr="hdcaB";
1191 ((TH1F*)fDistr->FindObject(nameDistr))->Scale((1/fLsNormalization)*((TH1F*)fDistr->FindObject(nameDistr))->GetEntries());
1192 nameDistr="hcosthetastarB";
1193 ((TH1F*)fDistr->FindObject(nameDistr))->Scale((1/fLsNormalization)*((TH1F*)fDistr->FindObject(nameDistr))->GetEntries());
1194 nameDistr="hd0B";
1195 ((TH1F*)fDistr->FindObject(nameDistr))->Scale((1/fLsNormalization)*((TH1F*)fDistr->FindObject(nameDistr))->GetEntries());
1196 nameDistr="hd0d0B";
1197 ((TH1F*)fDistr->FindObject(nameDistr))->Scale((1/fLsNormalization)*((TH1F*)fDistr->FindObject(nameDistr))->GetEntries());
1198 nameDistr="hcosthetapointB";
1199 ((TH1F*)fDistr->FindObject(nameDistr))->Scale((1/fLsNormalization)*((TH1F*)fDistr->FindObject(nameDistr))->GetEntries());
1200 nameDistr="hcosthpointd0d0B";
1201 ((TH2F*)fDistr->FindObject(nameDistr))->Scale((1/fLsNormalization)*((TH2F*)fDistr->FindObject(nameDistr))->GetEntries());
1202
1203 }
1204 }
6ce5994f 1205
527f330b 1206 TString cvname;
1207
1208 if (fArray==0){
1209 cvname="D0invmass";
1210 } else cvname="LSinvmass";
1211
34137226 1212 TCanvas *cMass=new TCanvas(cvname,cvname);
1213 cMass->cd();
527f330b 1214 ((TH1F*)fOutputPPR->FindObject("histMass_4"))->Draw();
1215
34137226 1216 TCanvas* cStat=new TCanvas("cstat","Stat");
1217 cStat->cd();
1218 cStat->SetGridy();
1219 fNentries->Draw("htext0");
527f330b 1220
49061176 1221 return;
1222}
1223