1 #include "AliAnalysisTaskK0sBayes.h"
7 #include "AliInputEventHandler.h"
8 #include "AliAODEvent.h"
9 #include "AliAODVertex.h"
10 #include "AliAODTrack.h"
11 #include "AliESDtrack.h"
12 #include "AliCentrality.h"
13 #include "AliVHeader.h"
14 #include "AliAODVZERO.h"
16 #include "AliOADBContainer.h"
19 #include "AliGenHijingEventHeader.h"
20 #include "AliMCEvent.h"
21 #include "AliAODMCHeader.h"
22 #include "AliAODMCParticle.h"
24 #include "AliESDtrackCuts.h"
25 #include "AliESDVertex.h"
26 #include "AliEventplane.h"
27 #include "AliAnalysisManager.h"
31 Float_t AliAnalysisTaskK0sBayes::fPtKsMin[AliAnalysisTaskK0sBayes::nPtBin] = {0.,0.25,0.5,0.75,1,1.5,2,2.5,3,3.5,4.,5.,6.};// ptmin bin
32 Float_t AliAnalysisTaskK0sBayes::fPtKsMax[AliAnalysisTaskK0sBayes::nPtBin] = {0.25,0.5,0.75,1,1.5,2,2.5,3,3.5,4.,5.,6.,10.};// ptmax bin
36 //using namespace std;
38 ClassImp(AliAnalysisTaskK0sBayes)
39 //_____________________________________________________________________________
40 AliAnalysisTaskK0sBayes::AliAnalysisTaskK0sBayes():
42 fVtxCut(10.0), // cut on |vertex| < fVtxCut
43 fEtaCut(0.8), // cut on |eta| < fEtaCut
44 fMinPt(0.15), // cut on pt > fMinPt
84 // Default constructor (should not be used)
85 fList->SetName("contKsBayes1");
86 fList2->SetName("contKsBayes2");
87 fList3->SetName("contKsBayes3");
89 fList->SetOwner(kTRUE);
90 fList2->SetOwner(kTRUE);
91 fList3->SetOwner(kTRUE);
93 TFile *fmism = new TFile("$ALICE_ROOT/TOF/data/TOFmismatchDistr.root");
94 fHmismTOF = (TH1F *) fmism->Get("TOFmismDistr");
96 TFile *fchDist = new TFile("$ALICE_ROOT/TOF/data/TOFchannelDist.root");
97 fHchannelTOFdistr = (TH1D *) fchDist->Get("hTOFchanDist");
99 for(Int_t i=0;i < nCentrBin;i++){
109 for(Int_t i=0;i < 4;i++){
113 for(Int_t i=0;i < 1000;i++){
124 //______________________________________________________________________________
125 AliAnalysisTaskK0sBayes::AliAnalysisTaskK0sBayes(const char *name):
126 AliAnalysisTaskSE(name),
127 fVtxCut(10.0), // cut on |vertex| < fVtxCut
128 fEtaCut(0.8), // cut on |eta| < fEtaCut
129 fMinPt(0.15), // cut on pt > fMinPt
163 fHchannelTOFdistr(0),
170 DefineOutput(1, TList::Class());
171 DefineOutput(2, TList::Class());
172 DefineOutput(3, TList::Class());
173 DefineOutput(4, TList::Class());
175 // Output slot #1 writes into a TTree
176 fList->SetName("contKsBayes1");
177 fList2->SetName("contKsBayes2");
178 fList3->SetName("contKsBayes3");
180 fList->SetOwner(kTRUE);
181 fList2->SetOwner(kTRUE);
182 fList3->SetOwner(kTRUE);
184 TFile *fmism = new TFile("$ALICE_ROOT/TOF/data/TOFmismatchDistr.root");
185 fHmismTOF = (TH1F *) fmism->Get("TOFmismDistr");
187 TFile *fchDist = new TFile("$ALICE_ROOT/TOF/data/TOFchannelDist.root");
188 fHchannelTOFdistr = (TH1D *) fchDist->Get("hTOFchanDist");
190 for(Int_t i=0;i < nCentrBin;i++){
200 for(Int_t i=0;i < 4;i++){
204 for(Int_t i=0;i < 1000;i++){
214 //_____________________________________________________________________________
215 AliAnalysisTaskK0sBayes::~AliAnalysisTaskK0sBayes()
220 //______________________________________________________________________________
221 void AliAnalysisTaskK0sBayes::UserCreateOutputObjects()
224 fPIDCombined=new AliPIDCombined;
225 fPIDCombined->SetDefaultTPCPriors();
226 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF);
228 Float_t invMmin = 0.497-0.005*8;
229 Float_t invMmax = 0.497+0.005*8;
231 const Int_t nBinPid = 14;
233 Int_t binPid[nBinPid] = {1/*ptKs*/,1+7*(!fToEP)/*EtaPiP*/,20/*pt+*/,1/*pt-*/,5/*P+*/,1/*P-*/,2/*TOFmatch+*/,1/*TOFmatch-*/,2/*istrue*/,4/*Nsigma+*/,1/*Nsigma-*/,1+4*(fToEP)/*DeltaPhi+*/,1/*DeltaPhi-*/,1+4*(fToEP)/*Psi*/};
235 Int_t binPid2[nBinPid] = {1/*ptKs*/,1+7*(!fToEP)/*EtaPiN*/,1/*pt+*/,20/*pt-*/,1/*P+*/,5/*P-*/,1/*TOFmatch+*/,2/*TOFmatch-*/,2/*istrue*/,1/*Nsigma+*/,4/*Nsigma-*/,1/*DeltaPhi+*/,1+4*(fToEP)/*DeltaPhi-*/,1+4*(fToEP)/*Psi*/};
237 fContPid = new AliPIDperfContainer("contPID",nBinPid,binPid);
238 fContPid->SetTitleX("M_{K^{0}_{s}}");
239 fContPid->SetTitleY("centrality (%)");
240 fContPid->SetVarName(0,"p_{T}^{K^{0}_{s}}");
241 fContPid->SetVarRange(0,0,10);
242 fContPid->SetVarName(1,"#eta^{K^{0}_{s}}");
243 fContPid->SetVarRange(1,-0.8,0.8);
244 fContPid->SetVarName(2,"p_{T}^{Kp}");
245 fContPid->SetVarRange(2,0.3,4.3);
246 fContPid->SetVarName(3,"p_{T}^{Kn}");
247 fContPid->SetVarRange(3,0.3,4.3);
248 fContPid->SetVarName(4,"BayesProb^{Kp}");
249 fContPid->SetVarRange(4,0,1.);
250 fContPid->SetVarName(5,"BayesProb^{Kn}");
251 fContPid->SetVarRange(5,0,1.);
252 fContPid->SetVarName(6,"isTOFmatch^{Kp}");
253 fContPid->SetVarRange(6,-0.5,1.5);
254 fContPid->SetVarName(7,"isTOFmatch^{Kn}");
255 fContPid->SetVarRange(7,-0.5,1.5);
256 fContPid->SetVarName(8,"isKsTrue^{Kn}");
257 fContPid->SetVarRange(8,-0.5,1.5);
258 fContPid->SetVarName(9,"N#sigma^{Kp}");
259 fContPid->SetVarRange(9,1.25,6.25);
260 fContPid->SetVarName(10,"N#sigma^{Kn}");
261 fContPid->SetVarRange(10,1.25,6.25);
262 fContPid->SetVarName(11,"#Delta#phi^{Kp}");
263 fContPid->SetVarRange(11,-TMath::Pi(),TMath::Pi());
264 fContPid->SetVarName(12,"#Delta#phi^{Kn}");
265 fContPid->SetVarRange(12,-TMath::Pi(),TMath::Pi());
266 fContPid->SetVarName(13,"#Psi");
267 fContPid->SetVarRange(13,-TMath::Pi()/2,TMath::Pi()/2);
269 fContPid2 = new AliPIDperfContainer("contPID2",nBinPid,binPid2);
270 fContPid2->SetTitleX("M_{K^{0}_{s}}");
271 fContPid2->SetTitleY("centrality (%)");
272 fContPid2->SetVarName(0,"p_{T}^{K^{0}_{s}}");
273 fContPid2->SetVarRange(0,0,10);
274 fContPid2->SetVarName(1,"#eta^{K^{0}_{s}}");
275 fContPid2->SetVarRange(1,-0.8,0.8);
276 fContPid2->SetVarName(2,"p_{T}^{Kp}");
277 fContPid2->SetVarRange(2,0.3,4.3);
278 fContPid2->SetVarName(3,"p_{T}^{Kn}");
279 fContPid2->SetVarRange(3,0.3,4.3);
280 fContPid2->SetVarName(4,"BayesProb^{Kp}");
281 fContPid2->SetVarRange(4,0,1.);
282 fContPid2->SetVarName(5,"BayesProb^{Kn}");
283 fContPid2->SetVarRange(5,0,1.);
284 fContPid2->SetVarName(6,"isTOFmatch^{Kp}");
285 fContPid2->SetVarRange(6,-0.5,1.5);
286 fContPid2->SetVarName(7,"isTOFmatch^{Kn}");
287 fContPid2->SetVarRange(7,-0.5,1.5);
288 fContPid2->SetVarName(8,"isKsTrue^{Kn}");
289 fContPid2->SetVarRange(8,-0.5,1.5);
290 fContPid2->SetVarName(9,"N#sigma^{Kp}");
291 fContPid2->SetVarRange(9,1.25,6.25);
292 fContPid2->SetVarName(10,"N#sigma^{Kn}");
293 fContPid2->SetVarRange(10,1.25,6.25);
294 fContPid2->SetVarName(11,"#Delta#phi^{Kp}");
295 fContPid2->SetVarRange(11,-TMath::Pi(),TMath::Pi());
296 fContPid2->SetVarName(12,"#Delta#phi^{Kn}");
297 fContPid2->SetVarRange(12,-TMath::Pi(),TMath::Pi());
298 fContPid2->SetVarName(13,"#Psi");
299 fContPid2->SetVarRange(13,-TMath::Pi()/2,TMath::Pi()/2);
301 const Int_t nDETsignal = 100; // mass
302 Double_t binDETsignal[nDETsignal+1];
303 for(Int_t i=0;i<nDETsignal+1;i++){
304 binDETsignal[i] = invMmin + i*(invMmax - invMmin) / nDETsignal;
306 const Int_t nDETsignal2 = 10; // centrality
307 Double_t binDETsignal2[nDETsignal2+1];
308 for(Int_t i=0;i<nDETsignal2+1;i++){
309 binDETsignal2[i] = i*100./ nDETsignal2;
311 fContPid->AddSpecies("K0s",nDETsignal,binDETsignal,nDETsignal2,binDETsignal2);
312 fContPid2->AddSpecies("K0s2",nDETsignal,binDETsignal,nDETsignal2,binDETsignal2);
314 fList->Add(fContPid);
315 fList->Add(fContPid2);
317 const Int_t nBinUser = 6;
318 Int_t binUser[nBinUser] = {8/*Eta*/,20/*pt*/,2/*istrue*/,4/*whatSelection*/,1/*DeltaPhi*/,1/*Psi*/};
319 fContUser = new AliPIDperfContainer("contUserPID",nBinUser,binUser);
320 fContUser->SetTitleX("M_{K^{0}_{s}}");
321 fContUser->SetTitleY("centrality (%)");
322 fContUser->SetVarName(0,"#eta^{K^{0}_{s}}");
323 fContUser->SetVarRange(0,-0.8,0.8);
324 fContUser->SetVarName(1,"p_{T}");
325 fContUser->SetVarRange(1,0.3,4.3);
326 fContUser->SetVarName(2,"isKsTrue^{Kn}");
327 fContUser->SetVarRange(2,-0.5,1.5);
328 fContUser->SetVarName(3,"whatSelected"); // 0=no, 1=pi, 2=K, 3=p
329 fContUser->SetVarRange(3,-0.5,3.5);
330 fContUser->SetVarName(4,"#Delta#phi");
331 fContUser->SetVarRange(4,-TMath::Pi(),TMath::Pi());
332 fContUser->SetVarName(5,"#Psi");
333 fContUser->SetVarRange(5,-TMath::Pi()/2,TMath::Pi()/2);
335 fContUser2 = new AliPIDperfContainer("contUserPID2",nBinUser,binUser);
336 fContUser2->SetTitleX("M_{K^{0}_{s}}");
337 fContUser2->SetTitleY("centrality (%)");
338 fContUser2->SetVarName(0,"#eta^{K^{0}_{s}}");
339 fContUser2->SetVarRange(0,-0.8,0.8);
340 fContUser2->SetVarName(1,"p_{T}");
341 fContUser2->SetVarRange(1,0.3,4.3);
342 fContUser2->SetVarName(2,"isKsTrue^{Kn}");
343 fContUser2->SetVarRange(2,-0.5,1.5);
344 fContUser2->SetVarName(3,"whatSelected");
345 fContUser2->SetVarRange(3,-0.5,3.5);
346 fContUser2->SetVarName(4,"#Delta#phi");
347 fContUser2->SetVarRange(4,-TMath::Pi(),TMath::Pi());
348 fContUser2->SetVarName(5,"#Psi");
349 fContUser2->SetVarRange(5,-TMath::Pi()/2,TMath::Pi()/2);
351 fContUser->AddSpecies("K0s",nDETsignal,binDETsignal,nDETsignal2,binDETsignal2);
352 fContUser2->AddSpecies("K0s2",nDETsignal,binDETsignal,nDETsignal2,binDETsignal2);
354 fList->Add(fContUser);
355 fList->Add(fContUser2);
357 hMatching[0] = new TH2F("hMatchAll","TOF matched (all);p_{T} (GeV/#it{c});centrality (%)",50,0,10,nDETsignal2,0,100);
358 hMatching[1] = new TH2F("hMatchPi","TOF matched (#pi);p_{T} (GeV/#it{c});centrality (%)",50,0,10,nDETsignal2,0,100);
359 hMatching[2] = new TH2F("hMatchKa","TOF matched (K);p_{T} (GeV/#it{c});centrality (%)",50,0,10,nDETsignal2,0,100);
360 hMatching[3] = new TH2F("hMatchPr","TOF matched (p);p_{T} (GeV/#it{c});centrality (%)",50,0,10,nDETsignal2,0,100);
362 hTracking[0] = new TH2F("hTrackingAll","TPC tracks (all);p_{T} (GeV/#it{c});centrality (%)",50,0,10,nDETsignal2,0,100);
363 hTracking[1] = new TH2F("hTrackingPi","TPC tracks (#pi);p_{T} (GeV/#it{c});centrality (%)",50,0,10,nDETsignal2,0,100);
364 hTracking[2] = new TH2F("hTrackingKa","TPC tracks (K);p_{T} (GeV/#it{c});centrality (%)",50,0,10,nDETsignal2,0,100);
365 hTracking[3] = new TH2F("hTrackingPr","TPC tracks (p);p_{T} (GeV/#it{c});centrality (%)",50,0,10,nDETsignal2,0,100);
367 fList2->Add(hMatching[0]);
368 fList2->Add(hMatching[1]);
369 fList2->Add(hMatching[2]);
370 fList2->Add(hMatching[3]);
371 fList2->Add(hTracking[0]);
372 fList2->Add(hTracking[1]);
373 fList2->Add(hTracking[2]);
374 fList2->Add(hTracking[3]);
376 fTOFTPCsignal = new TH2F("hTOFTPCsignal","TOF-TPC signal for pions (0.8 < p_{T} < 0.9 GeV/#it{c}, cent. = 0-20);N#sigma_{TOF};N#sigma_{TPC}",100,-5,5,100,-5,5);
377 fList2->Add(fTOFTPCsignal);
378 fCombsignal = new TH1F("hCombsignal","Combined signal for pions (0.8 < p_{T} < 0.9 GeV/#it{c}, cent. = 0-20);N#sigma",100,0,5);
379 fList2->Add(fCombsignal);
382 char name[100],title[400];
383 for(Int_t i=0;i < nCentrBin;i++){
384 snprintf(name,100,"hPiTPCQA_%i",i);
385 snprintf(title,400,"TPC signal for #pi cent=%i-%i%c;p_{T} (GeV/#it{c});N#sigma",i*10,(i+1)*10,'%');
386 fPiTPC[i] = new TH2F(name,title,50,0,4,200,-10,10);
387 fList3->Add(fPiTPC[i]);
389 snprintf(name,100,"hKaTPCQA_%i",i);
390 snprintf(title,400,"TPC signal for K cent=%i-%i%c;p_{T} (GeV/#it{c});N#sigma",i*10,(i+1)*10,'%');
391 fKaTPC[i] = new TH2F(name,title,50,0,4,200,-10,10);
392 fList3->Add(fKaTPC[i]);
394 snprintf(name,100,"hPrTPCQA_%i",i);
395 snprintf(title,400,"TPC signal for p cent=%i-%i%c;p_{T} (GeV/#it{c});N#sigma",i*10,(i+1)*10,'%');
396 fPrTPC[i] = new TH2F(name,title,50,0,4,200,-10,10);
397 fList3->Add(fPrTPC[i]);
399 snprintf(name,100,"hElTPCQA_%i",i);
400 snprintf(title,400,"TPC signal for e cent=%i-%i%c;p_{T} (GeV/#it{c});N#sigma",i*10,(i+1)*10,'%');
401 fElTPC[i] = new TH2F(name,title,50,0,4,200,-10,10);
402 fList3->Add(fElTPC[i]);
404 snprintf(name,100,"hPiTOFQA_%i",i);
405 snprintf(title,400,"TOF signal for #pi cent=%i-%i%c;p_{T} (GeV/#it{c});N#sigma",i*10,(i+1)*10,'%');
406 fPiTOF[i] = new TH2F(name,title,50,0,4,200,-10,10);
407 fList3->Add(fPiTOF[i]);
409 snprintf(name,100,"hKaTOFQA_%i",i);
410 snprintf(title,400,"TOF signal for K cent=%i-%i%c;p_{T} (GeV/#it{c});N#sigma",i*10,(i+1)*10,'%');
411 fKaTOF[i] = new TH2F(name,title,50,0,4,200,-10,10);
412 fList3->Add(fKaTOF[i]);
414 snprintf(name,100,"hPrTOFQA_%i",i);
415 snprintf(title,400,"TOF signal for p cent=%i-%i%c;p_{T} (GeV/#it{c});N#sigma",i*10,(i+1)*10,'%');
416 fPrTOF[i] = new TH2F(name,title,50,0,4,200,-10,10);
417 fList3->Add(fPrTOF[i]);
419 snprintf(name,100,"hElTOFQA_%i",i);
420 snprintf(title,400,"TOF signal for e cent=%i-%i%c;p_{T} (GeV/#it{c});N#sigma",i*10,(i+1)*10,'%');
421 fElTOF[i] = new TH2F(name,title,50,0,4,200,-10,10);
422 fList3->Add(fElTOF[i]);
432 //______________________________________________________________________________
433 void AliAnalysisTaskK0sBayes::UserExec(Option_t *)
436 // Called for each event
438 fOutputAOD = dynamic_cast<AliAODEvent*>(InputEvent());
440 Printf("%s:%d AODEvent not found in Input Manager",(char*)__FILE__,__LINE__);
445 Float_t zvtx = GetVertex(fOutputAOD);
451 AliAODMCHeader *mcHeader = dynamic_cast<AliAODMCHeader*>(fOutputAOD->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
453 AliError("Could not find MC Header in AOD");
458 if (TMath::Abs(zvtx) < fVtxCut) {
463 Float_t v0Centr = -10.;
464 Float_t trkCentr = -10.;
465 AliCentrality *centrality = fOutputAOD->GetCentrality();
467 trkCentr = centrality->GetCentralityPercentile("V0M");
468 v0Centr = centrality->GetCentralityPercentile("TRK");
472 v0Centr=100./(fOutputAOD->GetNumberOfTracks()/12.+1);
476 if((TMath::Abs(v0Centr - trkCentr) < 5.0 || (fTypeCol!=2)) && v0Centr>0){ // consistency cut on centrality selection
477 fCentrality = v0Centr;
478 Analyze(fOutputAOD); // Do analysis!!!!
485 //________________________________________________________________________
486 void AliAnalysisTaskK0sBayes::Analyze(AliAODEvent* aodEvent)
489 Int_t ntrack = aodEvent->GetNumberOfTracks();
491 fPtKp=0.,fPhiKp=0.,fEtaKp=0.;
492 fPtKn=0.,fPhiKn=0.,fEtaKn=0.;
500 Float_t invMmin = 0.497-0.005*8;
501 Float_t invMmax = 0.497+0.005*8;
504 if(fCentrality < 0) icentr = 8;
505 else if(fCentrality < 10) icentr = 0;
506 else if(fCentrality < 20) icentr = 1;
507 else if(fCentrality < 30) icentr = 2;
508 else if(fCentrality < 40) icentr = 3;
509 else if(fCentrality < 50) icentr = 4;
510 else if(fCentrality < 60) icentr = 5;
511 else if(fCentrality < 70) icentr = 6;
512 else if(fCentrality < 80) icentr = 7;
514 Float_t addMismatchForMC = 0.005;
515 if(fCentrality < 50) addMismatchForMC += 0.005;
516 if(fCentrality < 20) addMismatchForMC += 0.02;
518 if(fTypeCol == 0 || fTypeCol == 1) addMismatchForMC = 0.005;
522 Double_t Qx2 = 0, Qy2 = 0;
523 Double_t Qx3 = 0, Qy3 = 0;
524 for(Int_t iT = 0; iT < ntrack; iT++) {
525 AliAODTrack* aodTrack = dynamic_cast<AliAODTrack*>(aodEvent->GetTrack(iT));
526 if(!aodTrack) AliFatal("Not a standard AOD");
532 Bool_t trkFlag = aodTrack->TestFilterBit(fFilterBit);
534 if ((TMath::Abs(aodTrack->Eta()) > 0.8) || (aodTrack->Pt() < 0.2) || (aodTrack->GetTPCNcls() < fNcluster) || !trkFlag)
537 Double_t b[2] = {-99., -99.};
538 Double_t bCov[3] = {-99., -99., -99.};
539 if (!aodTrack->PropagateToDCA(aodEvent->GetPrimaryVertex(), aodEvent->GetMagneticField(), 100., b, bCov))
542 if ((TMath::Abs(b[0]) > 3.0) || (TMath::Abs(b[1]) > 2.4))
545 Qx2 += TMath::Cos(2*aodTrack->Phi());
546 Qy2 += TMath::Sin(2*aodTrack->Phi());
547 Qx3 += TMath::Cos(3*aodTrack->Phi());
548 Qy3 += TMath::Sin(3*aodTrack->Phi());
552 fPsi = TMath::ATan2(Qy2, Qx2)/2.;
554 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
555 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
556 AliPIDResponse *PIDResponse=inputHandler->GetPIDResponse();
558 PIDResponse->SetTOFResponse(aodEvent,AliPIDResponse::kTOF_T0);
560 PIDResponse->GetTOFResponse().SetTOFtailAllPara(-23,1.1);
562 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
564 Double_t probP[10] = {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.};
565 Double_t probN[10] = {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.};
566 Double_t nSigmaTPC,nSigmaTOF=6,nSigmaTPC2,nSigmaTOF2=6,nSigmaComb,nSigmaComb2;
567 Double_t nSigmaTPCRef,nSigmaTOFRef=6,nSigmaTPC2Ref,nSigmaTOF2Ref=6,nSigmaCombRef,nSigmaComb2Ref;
570 AliAODMCHeader *mcHeader = dynamic_cast<AliAODMCHeader*>(aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
571 TClonesArray *mcArray = NULL;
573 mcArray = (TClonesArray*)aodEvent->GetList()->FindObject(AliAODMCParticle::StdBranchName());
577 nmc = mcArray->GetEntries();
579 for(Int_t i=0;i < ntrack;i++){ // loop on tracks
580 AliAODTrack* track = dynamic_cast<AliAODTrack*>(aodEvent->GetTrack(i));
581 if(!track) AliFatal("Not a standard AOD");
583 AliAODMCParticle *mcp = NULL;
590 Int_t tofMatch = (track->GetStatus() & AliVTrack::kTOFout) && (track->GetStatus() & AliVTrack::kTIME);
594 label = track->GetLabel();
595 if(label != -1 && label < nmc){
596 label = TMath::Abs(label);
597 mcp = (AliAODMCParticle*)mcArray->At(label);
598 pdg = TMath::Abs(mcp->GetPdgCode());
604 /*UInt_t detUsed =*/ fPIDCombined->ComputeProbabilities(track, PIDResponse, probP);
607 if(track->TestFilterBit(fFilterBit) && TMath::Abs(track->Eta()) < 0.8 && track->Charge() > 0){
608 hTracking[0]->Fill(track->Pt(),fCentrality);
610 hTracking[1]->Fill(track->Pt(),fCentrality);
612 hTracking[2]->Fill(track->Pt(),fCentrality);
614 hTracking[3]->Fill(track->Pt(),fCentrality);
615 else if(! mcp){ // Fill matching histo with the prob
616 hTracking[1]->Fill(track->Pt(),fCentrality,probP[2]);
617 hTracking[2]->Fill(track->Pt(),fCentrality,probP[3]);
618 hTracking[3]->Fill(track->Pt(),fCentrality,probP[4]);
622 if(!tofMatch) continue;
624 if(track->TestFilterBit(fFilterBit) && TMath::Abs(track->Eta()) < 0.8 && track->Charge() > 0){
625 hMatching[0]->Fill(track->Pt(),fCentrality);
627 hMatching[1]->Fill(track->Pt(),fCentrality);
629 hMatching[2]->Fill(track->Pt(),fCentrality);
631 hMatching[3]->Fill(track->Pt(),fCentrality);
632 else if(! mcp){ // Fill matching histo with the prob
633 hMatching[1]->Fill(track->Pt(),fCentrality,probP[2]);
634 hMatching[2]->Fill(track->Pt(),fCentrality,probP[3]);
635 hMatching[3]->Fill(track->Pt(),fCentrality,probP[4]);
644 // start analysis K0s
645 for(Int_t i=0;i < ntrack;i++){ // loop on positive tracks
646 AliAODTrack* KpTrack = dynamic_cast<AliAODTrack*>(aodEvent->GetTrack(i));
647 if(!KpTrack) AliFatal("Not a standard AOD");
653 if(!(KpTrack->Charge() > 0 && KpTrack->Pt() > 0.3 && TMath::Abs(KpTrack->Eta()) < 0.8)) continue;
659 fPtKp=KpTrack->Pt(),fPhiKp=KpTrack->Phi(),fEtaKp=KpTrack->Eta();
662 UInt_t detUsedP = fPIDCombined->ComputeProbabilities(KpTrack, PIDResponse, probP);
665 fPIDCombined->GetPriors(KpTrack, oldpP, PIDResponse, detUsedP);
667 nSigmaTPC = PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kPion);
668 nSigmaTPCRef = PIDResponse->NumberOfSigmasTPC(KpTrack,(AliPID::EParticleType) fSpeciesRef);
670 if(! (TMath::Abs(nSigmaTPC) < 5)) continue;
672 Int_t tofMatch1 = (KpTrack->GetStatus() & AliVTrack::kTOFout) && (KpTrack->GetStatus() & AliVTrack::kTIME);
676 Int_t labelK = TMath::Abs(KpTrack->GetLabel());
677 AliAODMCParticle *mcp1 = (AliAODMCParticle*)mcArray->At(labelK);
678 pdg1 = TMath::Abs(mcp1->GetPdgCode());
682 fPidKp = Int_t(probP[2]*100);
685 if(!IsChannelValid(TMath::Abs(KpTrack->Eta()))){
686 // remove this tof hit
687 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
688 detUsedP = fPIDCombined->ComputeProbabilities(KpTrack, PIDResponse, probP);
689 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
690 fPidKp = Int_t(probP[4]*100);
694 if(probP[2] > probP[3] && probP[2] > probP[4] && probP[2] > probP[0]) fPidKp += 128; // max prob
696 nSigmaTOF = PIDResponse->NumberOfSigmasTOF(KpTrack,AliPID::kProton);
697 if(TMath::Abs(PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kProton))<1) fPrTOF[icentr]->Fill(fPtKp,nSigmaTOF);
698 if(TMath::Abs(nSigmaTOF)<1) fPrTPC[icentr]->Fill(fPtKp,PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kProton));
699 nSigmaTOF = PIDResponse->NumberOfSigmasTOF(KpTrack,AliPID::kElectron);
700 if(TMath::Abs(PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kElectron))<1) fElTOF[icentr]->Fill(fPtKp,nSigmaTOF);
701 if(TMath::Abs(nSigmaTOF)<1) fElTPC[icentr]->Fill(fPtKp,PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kElectron));
702 nSigmaTOF = PIDResponse->NumberOfSigmasTOF(KpTrack,AliPID::kKaon);
703 if(TMath::Abs(PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kKaon))<1) fKaTOF[icentr]->Fill(fPtKp,nSigmaTOF);
704 if(TMath::Abs(nSigmaTOF)<1) fKaTPC[icentr]->Fill(fPtKp,PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kKaon));
705 nSigmaTOF = PIDResponse->NumberOfSigmasTOF(KpTrack,AliPID::kPion);
706 if(TMath::Abs(PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kPion))<1) fPiTOF[icentr]->Fill(fPtKp,nSigmaTOF);
707 if(TMath::Abs(nSigmaTOF)<1) fPiTPC[icentr]->Fill(fPtKp,PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kPion));
708 nSigmaTOFRef = PIDResponse->NumberOfSigmasTOF(KpTrack,(AliPID::EParticleType) fSpeciesRef);
711 Float_t mismAdd = addMismatchForMC;
712 if(KpTrack->Pt() < 1) mismAdd = addMismatchForMC/KpTrack->Pt();
714 if(gRandom->Rndm() < mismAdd){
715 Float_t etaAbs = TMath::Abs(KpTrack->Eta());
716 Int_t channel = Int_t(4334.09 - 4758.36 * etaAbs -1989.71 * etaAbs*etaAbs + 1957.62*etaAbs*etaAbs*etaAbs);
717 channel = channel % 8736;
718 Float_t distIP = fHchannelTOFdistr->GetBinContent(channel);
720 // generate random time
721 Float_t timeRandom = fHmismTOF->GetRandom() + distIP*3.35655419905265973e+01;
722 Double_t times[AliPID::kSPECIESC];
723 KpTrack->GetIntegratedTimes(times,AliPID::kSPECIESC);
724 nSigmaTOF = TMath::Abs(timeRandom - times[2])/PIDResponse->GetTOFResponse().GetExpectedSigma(KpTrack->P(), times[2], AliPID::kPion);
725 nSigmaTOFRef = TMath::Abs(timeRandom - times[fSpeciesRef])/PIDResponse->GetTOFResponse().GetExpectedSigma(KpTrack->P(), times[fSpeciesRef], fSpeciesRef);
729 if(fCentrality < 20 && KpTrack->Pt() < 0.9 && KpTrack->Pt() > 0.8)fTOFTPCsignal->Fill(nSigmaTOF,nSigmaTPC);
730 nSigmaTOF = TMath::Abs(nSigmaTOF);
732 if(nSigmaTOF < 2) fPidKp += 256;
733 else if(nSigmaTOF < 3) fPidKp += 512;
738 nSigmaComb = TMath::Sqrt(nSigmaTOF*nSigmaTOF + nSigmaTPC*nSigmaTPC);
739 nSigmaCombRef = TMath::Sqrt(nSigmaTOFRef*nSigmaTOFRef + nSigmaTPCRef*nSigmaTPCRef);
740 if(nSigmaTOF < 5 && fCentrality < 20 && KpTrack->Pt() < 0.9 && KpTrack->Pt() > 0.8){
741 fCombsignal->Fill(nSigmaComb);
744 nSigmaComb = TMath::Abs(nSigmaTPC);
745 nSigmaCombRef = TMath::Abs(nSigmaTPCRef);
748 // use sigmaTOF instead of sigmaComb
749 nSigmaTOFRef = TMath::Abs(nSigmaTOFRef);
752 nSigmaComb = nSigmaTOF;
753 nSigmaCombRef = nSigmaTOFRef;
756 if(nSigmaComb < 2) nSigmaComb = 2;
757 else if(nSigmaComb < 3) nSigmaComb = 3;
758 else if(nSigmaComb < 5) nSigmaComb = 4.99;
761 if(nSigmaCombRef < 2) nSigmaCombRef = 2;
762 else if(nSigmaCombRef < 3) nSigmaCombRef = 3;
763 else if(nSigmaCombRef < 5) nSigmaCombRef = 4.99;
764 else nSigmaCombRef = 6;
767 for(Int_t k=0;k < fNK0s;k++){ // find the K0s which contains the positive track
768 if(i == fIpiP[k]) iks = k;
771 if(fPtKp > 4.299) fPtKp = 4.299;
773 if(iks > -1 && fIpiN[iks] > -1){
774 //for(Int_t j=0;j < ntrack;j++){ // loop on negative tracks
775 Int_t j = fIpiN[iks];
776 AliAODTrack* KnTrack = dynamic_cast<AliAODTrack*>(aodEvent->GetTrack(j));
777 if(!KnTrack) AliFatal("Not a standard AOD");
783 if(!(KnTrack->Charge() < 0 && KnTrack->Pt() > 0.3 && TMath::Abs(KnTrack->Eta()) < 0.8)) continue;
785 fPtKn=KnTrack->Pt(),fPhiKn=KnTrack->Phi(),fEtaKn=KnTrack->Eta();
788 UInt_t detUsedN = fPIDCombined->ComputeProbabilities(KnTrack, PIDResponse, probN);
790 fPIDCombined->GetPriors(KnTrack, oldpN, PIDResponse, detUsedN);
792 nSigmaTPC2 = PIDResponse->NumberOfSigmasTPC(KnTrack,AliPID::kPion);
793 nSigmaTPC2Ref = PIDResponse->NumberOfSigmasTPC(KnTrack,(AliPID::EParticleType) fSpeciesRef);
795 if(! (TMath::Abs(nSigmaTPC2) < 5)) continue;
802 Int_t tofMatch2 = (KnTrack->GetStatus() & AliVTrack::kTOFout) && (KnTrack->GetStatus() & AliVTrack::kTIME);
805 Int_t labelK = TMath::Abs(KnTrack->GetLabel());
806 AliAODMCParticle *mcp2 = (AliAODMCParticle*)mcArray->At(labelK);
807 pdg2 = TMath::Abs(mcp2->GetPdgCode());
811 fPidKn = Int_t(probN[2]*100);
814 if(!IsChannelValid(TMath::Abs(KnTrack->Eta()))){
815 // remove this tof hit
816 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
817 detUsedP = fPIDCombined->ComputeProbabilities(KnTrack, PIDResponse, probN);
818 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
819 fPidKn = Int_t(probN[4]*100);
823 if(probN[2] > probN[3] && probN[2] > probN[4] && probN[2] > probN[0]) fPidKn += 128; // max prob
825 nSigmaTOF2 = PIDResponse->NumberOfSigmasTOF(KnTrack,AliPID::kPion);
826 nSigmaTOF2 = TMath::Abs(nSigmaTOF2);
827 nSigmaTOF2Ref = PIDResponse->NumberOfSigmasTOF(KnTrack,(AliPID::EParticleType) fSpeciesRef);
828 nSigmaTOF2Ref = TMath::Abs(nSigmaTOF2Ref);
831 Float_t mismAdd = addMismatchForMC;
832 if(KnTrack->Pt() < 1) mismAdd = addMismatchForMC/KnTrack->Pt();
834 if(gRandom->Rndm() < mismAdd){
835 Float_t etaAbs = TMath::Abs(KnTrack->Eta());
836 Int_t channel = Int_t(4334.09 - 4758.36 * etaAbs -1989.71 * etaAbs*etaAbs + 1957.62*etaAbs*etaAbs*etaAbs);
837 channel = channel % 8736;
838 Float_t distIP = fHchannelTOFdistr->GetBinContent(channel);
840 // generate random time
841 Float_t timeRandom = fHmismTOF->GetRandom() + distIP*3.35655419905265973e+00;
842 Double_t times[AliPID::kSPECIESC];
843 KnTrack->GetIntegratedTimes(times,AliPID::kSPECIESC);
844 nSigmaTOF2 = TMath::Abs(timeRandom - times[2])/PIDResponse->GetTOFResponse().GetExpectedSigma(KnTrack->P(), times[2], AliPID::kPion);
845 nSigmaTOF2Ref = TMath::Abs(timeRandom - times[fSpeciesRef])/PIDResponse->GetTOFResponse().GetExpectedSigma(KnTrack->P(), times[fSpeciesRef], fSpeciesRef);
849 if(fCentrality < 20 && KnTrack->Pt() < 1.2 && KnTrack->Pt() > 1) fTOFTPCsignal->Fill(nSigmaTOF2,nSigmaTPC2);
851 if(nSigmaTOF2 < 2) fPidKn += 256;
852 else if(nSigmaTOF2 < 3) fPidKn += 512;
856 px = KpTrack->Px() + KnTrack->Px();
857 py = KpTrack->Py() + KnTrack->Py();
858 pz = KpTrack->Pz() + KnTrack->Pz();
859 E = TMath::Sqrt(KpTrack->P()*KpTrack->P() + 1.39e-01*1.39e-01);
860 E += TMath::Sqrt(KnTrack->P()*KnTrack->P()+ 1.39e-01*1.39e-01);
862 ksV.SetPxPyPzE(px,py,pz,E);
863 fMassV0 = fMassKs[iks];
865 if(fMassV0 < invMmin || fMassV0 > invMmax) continue;
873 nSigmaComb2 = TMath::Sqrt(nSigmaTOF2*nSigmaTOF2+ nSigmaTPC2*nSigmaTPC2);
874 nSigmaComb2Ref = TMath::Sqrt(nSigmaTOF2Ref*nSigmaTOF2Ref+ nSigmaTPC2Ref*nSigmaTPC2Ref);
875 if(nSigmaTOF2 < 5 && fCentrality < 20 && KnTrack->Pt() < 1.2 && KnTrack->Pt() > 1){
876 fCombsignal->Fill(nSigmaComb2);
879 nSigmaComb2 = TMath::Abs(nSigmaTPC2);
880 nSigmaComb2Ref = TMath::Abs(nSigmaTPC2Ref);
883 // use sigmaTOF instead of sigmaComb
885 nSigmaComb2 = nSigmaTOF2;
886 nSigmaComb2Ref = nSigmaTOF2Ref;
889 if(nSigmaComb2 < 2) nSigmaComb2 = 2;
890 else if(nSigmaComb2 < 3) nSigmaComb2 = 3;
891 else if(nSigmaComb2 < 5) nSigmaComb2 = 4.99;
892 else nSigmaComb2 = 6;
893 if(nSigmaComb2Ref < 2) nSigmaComb2Ref = 2;
894 else if(nSigmaComb2Ref < 3) nSigmaComb2Ref = 3;
895 else if(nSigmaComb2Ref < 5) nSigmaComb2Ref = 4.99;
896 else nSigmaComb2Ref = 6;
898 Bool_t isTrue = kFALSE;
901 Int_t labelP = TMath::Abs(KpTrack->GetLabel());
902 Int_t labelN = TMath::Abs(KnTrack->GetLabel());
904 if(labelP > -1 && labelN > -1){
905 AliAODMCParticle *partP = (AliAODMCParticle*)mcArray->At(labelP);
906 AliAODMCParticle *partN = (AliAODMCParticle*)mcArray->At(labelN);
908 Int_t mP = partP->GetMother();
909 Int_t mN = partN->GetMother();
910 if(mP == mN && mP > -1){
911 AliAODMCParticle *partM = (AliAODMCParticle*)mcArray->At(mP);
912 Int_t pdgM = partM->GetPdgCode();
913 if(pdgM == 310) isTrue = kTRUE;
919 Double_t deltaphi1 = KpTrack->Phi() - fPsi;
920 Double_t deltaphi2 = KnTrack->Phi() - fPsi;
922 if(gRandom->Rndm() < 0.5){
923 deltaphi1 += TMath::Pi();
924 deltaphi2 += TMath::Pi();
927 while(deltaphi1 > TMath::Pi()) deltaphi1 -= TMath::Pi()*2;
928 while(deltaphi1 < -TMath::Pi()) deltaphi1 += TMath::Pi()*2;
929 while(deltaphi2 > TMath::Pi()) deltaphi2 -= TMath::Pi()*2;
930 while(deltaphi2 < -TMath::Pi()) deltaphi2 += TMath::Pi()*2;
932 if(fPtKn > 4.299) fPtKn = 4.299;
934 Float_t xTOfill[] = {static_cast<Float_t>(fPtKs),static_cast<Float_t>(KpTrack->Eta()),static_cast<Float_t>(fPtKp),static_cast<Float_t>(fPtKn),static_cast<Float_t>(probP[2]),static_cast<Float_t>(probN[2]),static_cast<Float_t>(tofMatch1),static_cast<Float_t>(tofMatch2),static_cast<Float_t>(isTrue),static_cast<Float_t>(nSigmaComb),static_cast<Float_t>(nSigmaComb2),static_cast<Float_t>(deltaphi1),static_cast<Float_t>(deltaphi2),static_cast<Float_t>(fPsi)};
935 Float_t xTOfill2[] = {static_cast<Float_t>(fPtKs),static_cast<Float_t>(KpTrack->Eta()),static_cast<Float_t>(fPtKp),static_cast<Float_t>(fPtKn),static_cast<Float_t>(probP[2]),static_cast<Float_t>(probN[2]),static_cast<Float_t>(tofMatch1),static_cast<Float_t>(tofMatch2),static_cast<Float_t>(isTrue),static_cast<Float_t>(nSigmaComb),static_cast<Float_t>(nSigmaComb2),static_cast<Float_t>(deltaphi1),static_cast<Float_t>(deltaphi2),static_cast<Float_t>(fPsi)};
938 while(ipt < nPtBin && fPtKsMin[ipt] < fPtKs){
942 if(ipt < 0) ipt = 0; // just to be sure
944 if(TMath::Abs(fEtaKs) < 0.8 && fPtKp > 0.3 && fPtKn > 0.3){
945 if(fSpeciesRef != 2){
946 xTOfill[4] = probP[fSpeciesRef];
947 xTOfill2[5] = probN[fSpeciesRef];
949 xTOfill[9] = nSigmaCombRef;
950 xTOfill2[10] = nSigmaComb2Ref;
954 fContPid->Fill(0,fMassV0,fCentrality,xTOfill);
955 xTOfill[1] = KnTrack->Eta();
956 fContPid2->Fill(0,fMassV0,fCentrality,xTOfill2);
959 Float_t xUser[] = {static_cast<Float_t>(KpTrack->Eta()),static_cast<Float_t>(fPtKp),static_cast<Float_t>(isTrue),0,static_cast<Float_t>(deltaphi1),static_cast<Float_t>(fPsi)};
960 Float_t xUser2[] = {static_cast<Float_t>(KnTrack->Eta()),static_cast<Float_t>(fPtKn),static_cast<Float_t>(isTrue),0,static_cast<Float_t>(deltaphi2),static_cast<Float_t>(fPsi)};
962 if(fPIDuserCut->IsSelected(KpTrack,AliPID::kPion)){ // to be filled for positive
964 } else if(fPIDuserCut->IsSelected(KpTrack,AliPID::kKaon)){
966 } else if(fPIDuserCut->IsSelected(KpTrack,AliPID::kProton)){
969 if(fPIDuserCut->IsSelected(KnTrack,AliPID::kPion)){ // to be filled for negative
971 } else if(fPIDuserCut->IsSelected(KnTrack,AliPID::kKaon)){
973 } else if(fPIDuserCut->IsSelected(KnTrack,AliPID::kProton)){
976 fContUser->Fill(0,fMassV0,fCentrality,xUser);
977 fContUser2->Fill(0,fMassV0,fCentrality,xUser2);
987 //_____________________________________________________________________________
988 Float_t AliAnalysisTaskK0sBayes::GetVertex(AliAODEvent* aod) const
993 const AliAODVertex* vtxAOD = aod->GetPrimaryVertex();
996 if(vtxAOD->GetNContributors()>0)
997 zvtx = vtxAOD->GetZ();
1001 //_____________________________________________________________________________
1002 void AliAnalysisTaskK0sBayes::Terminate(Option_t *)
1005 Printf("Terminate()");
1007 //=======================================================================
1008 void AliAnalysisTaskK0sBayes::SelectK0s(){
1013 Int_t nV0s = fOutputAOD->GetNumberOfV0s();
1016 for (Int_t i=0; i!=nV0s; ++i) {
1017 myV0 = (AliAODv0*) fOutputAOD->GetV0(i);
1019 if(myV0->Pt()<0.1 || TMath::Abs(myV0->Eta()) > 0.8) continue; // skipping low momentum
1020 Int_t pass = PassesAODCuts(myV0,fOutputAOD,0); // check for K0s
1022 dMASS = myV0->MassK0Short();
1023 Float_t massLambda = myV0->MassLambda();
1024 Float_t massAntiLambda = myV0->MassAntiLambda();
1026 if(TMath::Abs(dMASS-0.497)/0.005 < 8 && TMath::Abs(massLambda-1.115)/0.005 > 8 && TMath::Abs(massAntiLambda-1.115)/0.005 > 8){
1027 AliAODTrack *iT=(AliAODTrack*) myV0->GetDaughter(0); // positive
1028 AliAODTrack *jT=(AliAODTrack*) myV0->GetDaughter(1); // negative
1030 iT=(AliAODTrack*) myV0->GetDaughter(1); // positive
1031 jT=(AliAODTrack*) myV0->GetDaughter(0); // negative
1033 fPhiK0s[fNK0s] = myV0->Phi();
1034 fPtK0s[fNK0s] = myV0->Pt();
1035 fIpiP[fNK0s] = FindDaugheterIndex(iT);
1036 fIpiN[fNK0s] = FindDaugheterIndex(jT);
1037 fMassKs[fNK0s] = dMASS;
1038 if(fIpiP[fNK0s] > -1 && fIpiN[fNK0s] > -1)
1046 Int_t nAODTracks = fOutputAOD->GetNumberOfTracks();
1047 for(Int_t iT = 0; iT < nAODTracks; iT++) { // loop on the tracks
1048 AliAODTrack* aodTrack = dynamic_cast<AliAODTrack*>(fOutputAOD->GetTrack(iT));
1049 if(!aodTrack) AliFatal("Not a standard AOD");
1055 Bool_t trkFlag = aodTrack->TestFilterBit(fFilterBit);
1057 if ((TMath::Abs(aodTrack->Eta()) > fEtaCut) || (aodTrack->Pt() < fMinPt) || (aodTrack->GetTPCNcls() < fNcluster) || !trkFlag){
1061 Double_t b[2] = {-99., -99.};
1062 Double_t bCov[3] = {-99., -99., -99.};
1063 if (!aodTrack->PropagateToDCA(fOutputAOD->GetPrimaryVertex(), fOutputAOD->GetMagneticField(), 100., b, bCov))
1066 if(TMath::Abs(b[0]) < 0.3/aodTrack->Pt()) continue;
1069 Int_t charge = aodTrack->Charge();
1071 fIPiPos[fNpiPos] = iT;
1075 fIPiNeg[fNpiNeg] = iT;
1080 for(Int_t i=0;i < fNpiPos;i++){
1081 AliAODTrack *pip = fOutputAOD->GetTrack(fIPiPos[i]);
1082 AliESDtrack pipE(pip);
1084 for(Int_t j=0;j < fNpiNeg;j++){
1085 AliAODTrack *pin = fOutputAOD->GetTrack(fIPiNeg[j]);
1086 AliESDtrack pinE(pin);
1088 Double_t xn, xp, mindist=pinE.GetDCA(&pipE,fOutputAOD->GetMagneticField(),xn,xp);
1092 pipE.GetPxPyPzAt(xp,fOutputAOD->GetMagneticField(),pPos);
1093 pinE.GetPxPyPzAt(xn,fOutputAOD->GetMagneticField(),pNeg);
1095 Float_t length = (xp+xn)*0.5;
1097 Float_t pxs = pPos[0] + pNeg[0];
1098 Float_t pys = pPos[1] + pNeg[1];
1099 Float_t pzs = pPos[2] + pNeg[2];
1100 Float_t es = TMath::Sqrt(pPos[0]*pPos[0] + pPos[1]*pPos[1] + pPos[2]*pPos[2] + 0.13957*0.13957) + TMath::Sqrt(pNeg[0]*pNeg[0] + pNeg[1]*pNeg[1] + pNeg[2]*pNeg[2] + 0.13957*0.13957);
1102 Float_t pt = TMath::Sqrt(pxs*pxs + pys*pys);
1103 Float_t phi = TMath::ATan2(pys,pxs);
1104 Float_t mass = TMath::Sqrt(es*es - pt*pt - pzs*pzs);
1106 // if(length > 1) printf("length = %f - distance = %f - mass= %f\n",length,mindist,mass);
1108 if(mindist < 0.4&& length > 0.7 && length < 25){
1109 Float_t esL = TMath::Sqrt(pPos[0]*pPos[0] + pPos[1]*pPos[1] + pPos[2]*pPos[2] + 0.938*0.938) + TMath::Sqrt(pNeg[0]*pNeg[0] + pNeg[1]*pNeg[1] + pNeg[2]*pNeg[2] + 0.13957*0.13957);
1110 Float_t esAL = TMath::Sqrt(pPos[0]*pPos[0] + pPos[1]*pPos[1] + pPos[2]*pPos[2] + 0.13957*0.13957) + TMath::Sqrt(pNeg[0]*pNeg[0] + pNeg[1]*pNeg[1] + pNeg[2]*pNeg[2] + 0.938*0.938);
1112 Float_t massaL = TMath::Sqrt(esL*esL - pt*pt - pzs*pzs);
1113 Float_t massaAL = TMath::Sqrt(esAL*esAL - pt*pt - pzs*pzs);
1115 if(TMath::Abs(mass-0.497)/0.005 < 8 && massaL > 1.15 && massaAL > 1.15){
1116 fPhiK0s[fNK0s] = phi;
1118 fIpiP[fNK0s] =fIPiPos[i] ;
1119 fIpiN[fNK0s] = fIPiNeg[j];
1120 fMassKs[fNK0s] = mass;
1129 //=======================================================================
1130 Int_t AliAnalysisTaskK0sBayes::PassesAODCuts(AliAODv0 *myV0, AliAODEvent *tAOD,Int_t specie)
1132 if (myV0->GetOnFlyStatus() ) return 0;
1134 //the following is needed in order to evualuate track-quality
1135 AliAODTrack *iT, *jT;
1136 AliAODVertex *vV0s = myV0->GetSecondaryVtx();
1137 Double_t pos[3],cov[6];
1139 vV0s->GetCovarianceMatrix(cov);
1140 const AliESDVertex vESD(pos,cov,100.,100);
1144 iT=(AliAODTrack*) myV0->GetDaughter(0);
1145 if(iT->Charge()>0) {
1152 iT=(AliAODTrack*) myV0->GetDaughter(iPos); // positive
1154 jT=(AliAODTrack*) myV0->GetDaughter(iNeg); // negative
1156 Bool_t trkFlag = iT->TestFilterBit(fFilterBit);
1157 if(!trkFlag) return 0;
1158 Bool_t trkFlag2 = jT->TestFilterBit(fFilterBit);
1159 if(!trkFlag2) return 0;
1161 Double_t pvertex[3];
1162 pvertex[0]=tAOD->GetPrimaryVertex()->GetX();
1163 pvertex[1]=tAOD->GetPrimaryVertex()->GetY();
1164 pvertex[2]=tAOD->GetPrimaryVertex()->GetZ();
1166 Double_t dDL=myV0->DecayLengthV0( pvertex );
1167 if(dDL < 0.5 || dDL > 25) return 0;
1169 Double_t dDCA=myV0->DcaV0Daughters();
1170 if(dDCA >0.5) return 0;
1172 Double_t dCTP=myV0->CosPointingAngle( pvertex );
1173 if(dCTP < -1) return 0;
1175 // AliESDtrack ieT( iT );
1176 // Double_t dD0P=ieT.GetD(pvertex[0],pvertex[1],tAOD->GetMagneticField());
1177 // if(TMath::Abs(dD0P) < 0]) return 0;
1179 // AliESDtrack jeT( jT );
1180 // Double_t dD0M=jeT.GetD(pvertex[0],pvertex[1],tAOD->GetMagneticField());
1181 // if(TMath::Abs(dD0M) < 0) return 0;
1183 // Double_t dD0D0=dD0P*dD0M;
1184 // if(dD0D0>0) return 0;
1186 // Double_t dETA=myV0->Eta();
1187 // if(dETA <-0.8) return 0;
1188 // if(dETA >0.8) return 0;
1190 // Double_t dQT=myV0->PtArmV0();
1191 // if(specie==0) if(dQT<???) return 0;
1193 Double_t dALPHA=myV0->AlphaV0(); // AlphaV0 -> AODRecoDecat::Alpha -> return 1.-2./(1.+QlProng(0)/QlProng(1));
1194 if(myV0->ChargeProng(iPos)<0) dALPHA = -dALPHA; // protects for a change in convention
1196 if(specie==1 && dALPHA<0) return 2; // antilambda
1197 return 1; // K0s or lambda
1199 //-------------------------------------------------------------------------
1200 Int_t AliAnalysisTaskK0sBayes::FindDaugheterIndex(AliAODTrack *trk){
1201 Int_t ntrack = fOutputAOD->GetNumberOfTracks();
1203 for(Int_t i=0;i < ntrack;i++){ // loop on tracks
1204 AliAODTrack* track = dynamic_cast<AliAODTrack*>(fOutputAOD->GetTrack(i));
1205 if(!track) AliFatal("Not a standard AOD");
1206 if(track == trk) return i;
1209 printf("Daughter for %p not found\n",trk);
1212 //-------------------------------------------------------------------------
1213 Int_t AliAnalysisTaskK0sBayes::IsChannelValid(Float_t etaAbs){
1214 if(!fIsMC) return 1; // used only on MC
1216 if(fTypeCol == 2){ // LHC10h or LHC11h because of TOF matching window at 3 cm
1217 Int_t channel = Int_t(4334.09 - 4758.36 * etaAbs -1989.71 * etaAbs*etaAbs + 1957.62*etaAbs*etaAbs*etaAbs);
1219 if(!(channel%20)) return 0; // 5% additional loss in MC