]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGHF/vertexingHF/AliAnalysisTaskSELc2V0bachelor.cxx
Additional odifications to compile without ZeroMQ
[u/mrichter/AliRoot.git] / PWGHF / vertexingHF / AliAnalysisTaskSELc2V0bachelor.cxx
CommitLineData
992ba7d8 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 * appeuear 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/* $Id$ */
17
18//
19//
20// Base class for Lc2V0 Analysis
21//
22//
23// The Lc spectra study is done 2D histograms:
24// cascade_invariantMass VS cascade_pT
25//
26// Cuts have been centralized in AliRDHFCutsLctoV0 class
27//
28//-------------------------------------------------------------------------
29//
30// Authors: A.De Caro(a,b), P. Pagano(b)
e7af8919 31// (a) Centro 'E.Fermi' - Roma
32// (b) INFN and University of Salerno
992ba7d8 33//
e7af8919 34// Contatcs: decaro@sa.infn.it
35// paola.pagano@sa.infn.it
992ba7d8 36//-------------------------------------------------------------------------
37
38#include <TSystem.h>
39#include <TParticle.h>
40#include <TParticlePDG.h>
41#include <TH1F.h>
42#include <TH2F.h>
516f546e 43#include <TH3F.h>
44#include <THnSparse.h>
a578b2da 45#include <TTree.h>
992ba7d8 46#include "TROOT.h"
47#include <TDatabasePDG.h>
48#include <AliAnalysisDataSlot.h>
49#include <AliAnalysisDataContainer.h>
50#include "AliStack.h"
51#include "AliMCEvent.h"
52#include "AliAnalysisManager.h"
53#include "AliAODMCHeader.h"
54#include "AliAODHandler.h"
55#include "AliLog.h"
43c7bace 56#include "AliExternalTrackParam.h"
992ba7d8 57#include "AliAODVertex.h"
58#include "AliAODRecoDecay.h"
59#include "AliAODRecoDecayHF.h"
60#include "AliAODRecoCascadeHF.h"
61#include "AliAnalysisVertexingHF.h"
62#include "AliESDtrack.h"
63#include "AliAODTrack.h"
64#include "AliAODv0.h"
65#include "AliAODMCParticle.h"
66#include "AliAnalysisTaskSE.h"
67#include "AliAnalysisTaskSELc2V0bachelor.h"
68#include "AliNormalizationCounter.h"
69#include "AliAODPidHF.h"
992ba7d8 70#include "AliInputEventHandler.h"
43c7bace 71#include "AliESDtrackCuts.h"
72#include "AliNeutralTrackParam.h"
992ba7d8 73
c64cb1f6 74using std::cout;
75using std::endl;
76
992ba7d8 77ClassImp(AliAnalysisTaskSELc2V0bachelor)
78
79//__________________________________________________________________________
43c7bace 80AliAnalysisTaskSELc2V0bachelor::AliAnalysisTaskSELc2V0bachelor() : AliAnalysisTaskSE(),
992ba7d8 81 fUseMCInfo(kFALSE),
82 fOutput(0),
83 fOutputAll(0),
84 fOutputPIDBach(0),
85 fCEvents(0),
43c7bace 86 fIsK0SAnalysis(kFALSE),
992ba7d8 87 fCounter(0),
992ba7d8 88 fAnalCuts(0),
0dbd1d4f 89 fUseOnTheFlyV0(kFALSE),
a578b2da 90 fIsEventSelected(kFALSE),
91 fWriteVariableTree(kFALSE),
92 fVariablesTree(0),
93 fCandidateVariables(),
94 fVtx1(0),
43c7bace 95 fBzkG(0),
516f546e 96 fAdditionalChecks(kFALSE),
97 fTrackRotation(kFALSE),
98 fOutputPIDBachTR(0),
99 fMinAngleForRot(5*TMath::Pi()/6),
100 fMaxAngleForRot(7*TMath::Pi()/6),
101 fMinMass(0),
102 fMaxMass(0),
103 fNRotations(9)
992ba7d8 104{
105 //
106 // Default ctor
107 //
516f546e 108
109 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
110 fMinMass=mLcPDG-0.250;
111 fMaxMass=mLcPDG+0.250;
112
992ba7d8 113}
114//___________________________________________________________________________
43c7bace 115AliAnalysisTaskSELc2V0bachelor::AliAnalysisTaskSELc2V0bachelor(const Char_t* name,
a578b2da 116 AliRDHFCutsLctoV0* analCuts, Bool_t useOnTheFly,
516f546e 117 Bool_t writeVariableTree, Bool_t additionalChecks, Bool_t trackRotation) :
992ba7d8 118 AliAnalysisTaskSE(name),
119 fUseMCInfo(kFALSE),
120 fOutput(0),
121 fOutputAll(0),
122 fOutputPIDBach(0),
123 fCEvents(0),
43c7bace 124 fIsK0SAnalysis(kFALSE),
992ba7d8 125 fCounter(0),
992ba7d8 126 fAnalCuts(analCuts),
0dbd1d4f 127 fUseOnTheFlyV0(useOnTheFly),
a578b2da 128 fIsEventSelected(kFALSE),
129 fWriteVariableTree(writeVariableTree),
130 fVariablesTree(0),
131 fCandidateVariables(),
132 fVtx1(0),
43c7bace 133 fBzkG(0),
516f546e 134 fAdditionalChecks(additionalChecks),
135 fTrackRotation(trackRotation),
136 fOutputPIDBachTR(0),
137 fMinAngleForRot(5*TMath::Pi()/6),
138 fMaxAngleForRot(7*TMath::Pi()/6),
139 fMinMass(0),
140 fMaxMass(0),
141 fNRotations(9)
992ba7d8 142{
143 //
144 // Constructor. Initialization of Inputs and Outputs
145 //
146 Info("AliAnalysisTaskSELc2V0bachelor","Calling Constructor");
147
516f546e 148 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
149 fMinMass=mLcPDG-0.250;
150 fMaxMass=mLcPDG+0.250;
151
992ba7d8 152 DefineOutput(1,TList::Class()); //conters
43c7bace 153 DefineOutput(2,AliNormalizationCounter::Class());
154 DefineOutput(3,AliRDHFCutsLctoV0::Class());
155 if (!writeVariableTree) {
156 DefineOutput(4,TList::Class()); //All Entries output
157 DefineOutput(5,TList::Class()); //3sigma PID output
516f546e 158 if (trackRotation) {
159 DefineOutput(6,TList::Class()); //All Entries output
160 }
43c7bace 161 } else {
162 // Output slot #4 keeps a tree of the candidate variables after track selection
163 DefineOutput(4,TTree::Class()); //My private output
164 }
a578b2da 165
992ba7d8 166}
167
168//___________________________________________________________________________
169AliAnalysisTaskSELc2V0bachelor::~AliAnalysisTaskSELc2V0bachelor() {
170 //
171 // destructor
172 //
173 Info("~AliAnalysisTaskSELc2V0bachelor","Calling Destructor");
174
175 if (fOutput) {
176 delete fOutput;
177 fOutput = 0;
178 }
179
180 if (fOutputAll) {
181 delete fOutputAll;
182 fOutputAll = 0;
183 }
184
185 if (fOutputPIDBach) {
186 delete fOutputPIDBach;
187 fOutputPIDBach = 0;
188 }
189
992ba7d8 190 if (fCounter) {
191 delete fCounter;
192 fCounter = 0;
193 }
194
992ba7d8 195 if (fAnalCuts) {
196 delete fAnalCuts;
197 fAnalCuts = 0;
198 }
199
43c7bace 200 if (fVariablesTree) {
a578b2da 201 delete fVariablesTree;
202 fVariablesTree = 0;
203 }
204
516f546e 205 if (fOutputPIDBachTR) {
206 delete fOutputPIDBachTR;
207 fOutputPIDBachTR = 0;
208 }
209
992ba7d8 210}
211//_________________________________________________
212void AliAnalysisTaskSELc2V0bachelor::Init() {
213 //
214 // Initialization
215 //
216
0dbd1d4f 217 fIsEventSelected=kFALSE;
218
992ba7d8 219 if (fDebug > 1) AliInfo("Init");
220
43c7bace 221 PostData(3,fAnalCuts);
992ba7d8 222
223 return;
224}
225
226//_________________________________________________
227void AliAnalysisTaskSELc2V0bachelor::UserExec(Option_t *)
228{
229 // user exec
230 if (!fInputEvent) {
231 AliError("NO EVENT FOUND!");
232 return;
233 }
234
235 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
236 TClonesArray *arrayLctopKos=0;
237
238 if (!aodEvent && AODEvent() && IsStandardAOD()) {
239 // In case there is an AOD handler writing a standard AOD, use the AOD
240 // event in memory rather than the input (ESD) event.
241 aodEvent = dynamic_cast<AliAODEvent*> (AODEvent());
242 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
243 // have to taken from the AOD event hold by the AliAODExtension
244 AliAODHandler* aodHandler = (AliAODHandler*)
245 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
43c7bace 246
992ba7d8 247 if (aodHandler->GetExtensions()) {
248 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
249 AliAODEvent *aodFromExt = ext->GetAOD();
250 arrayLctopKos=(TClonesArray*)aodFromExt->GetList()->FindObject("CascadesHF");
251 }
252 } else {
253 arrayLctopKos=(TClonesArray*)aodEvent->GetList()->FindObject("CascadesHF");
254 }
255
256 fCEvents->Fill(1);
43c7bace 257
258 if (fUseMCInfo)
259 fAnalCuts->SetTriggerClass("");
992ba7d8 260
0dbd1d4f 261 // AOD primary vertex
a578b2da 262 fVtx1 = (AliAODVertex*)aodEvent->GetPrimaryVertex();
263 if (!fVtx1) return;
0dbd1d4f 264
43c7bace 265 fIsEventSelected = fAnalCuts->IsEventSelected(aodEvent); // better to initialize before CheckEventSelection call
266
267 CheckEventSelection(aodEvent);
268
269
992ba7d8 270 // fix for temporary bug in ESDfilter
a578b2da 271 fBzkG = (Double_t)aodEvent->GetMagneticField();
272 if (TMath::Abs(fBzkG)<0.001) return;
992ba7d8 273 fCEvents->Fill(2);
274
992ba7d8 275 if (!arrayLctopKos) {
276 AliInfo("Could not find array of HF cascades, skipping the event");
277 return;
278 } else {
0dbd1d4f 279 if (arrayLctopKos->GetEntriesFast()) {
992ba7d8 280 AliInfo(Form("Found %d cascades",arrayLctopKos->GetEntriesFast()));
281 }
282 }
43c7bace 283 fCEvents->Fill(3);
992ba7d8 284
285 // mc analysis
286 TClonesArray *mcArray = 0;
287 AliAODMCHeader *mcHeader=0;
288
289 if (fUseMCInfo) {
290 // MC array need for maching
291 mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
292 if (!mcArray) {
293 AliError("Could not find Monte-Carlo in AOD");
294 return;
295 }
43c7bace 296 fCEvents->Fill(4); // in case of MC events
992ba7d8 297
298 // load MC header
299 mcHeader = (AliAODMCHeader*)aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName());
300 if (!mcHeader) {
301 AliError("AliAnalysisTaskSELc2V0bachelor::UserExec: MC header branch not found!\n");
302 return;
303 }
43c7bace 304 fCEvents->Fill(5); // in case of MC events
53c91ed7 305
306 Double_t zMCVertex = mcHeader->GetVtxZ();
307 if (TMath::Abs(zMCVertex) > fAnalCuts->GetMaxVtxZ()) {
308 AliDebug(2,Form("Event rejected: abs(zVtxMC)=%f > fAnalCuts->GetMaxVtxZ()=%f",zMCVertex,fAnalCuts->GetMaxVtxZ()));
309 return;
310 } else {
311 fCEvents->Fill(17); // in case of MC events
312 }
992ba7d8 313 }
314
43c7bace 315 fCounter->StoreEvent(aodEvent,fAnalCuts,fUseMCInfo); // it is very important that it stays BEFORE any other event selection
0dbd1d4f 316
43c7bace 317 if (fVtx1->GetNContributors()>0) // this check is done in IsEventSelected
318 fCEvents->Fill(6);
0dbd1d4f 319
43c7bace 320 if ( !fIsEventSelected ) return; // don't take into account not selected events
321 fCEvents->Fill(7);
0dbd1d4f 322
43c7bace 323 Int_t nSelectedAnal = 0;
324 if (fIsK0SAnalysis) {
325 MakeAnalysisForLc2prK0S(arrayLctopKos,mcArray, nSelectedAnal, fAnalCuts);
0dbd1d4f 326
43c7bace 327 if (nSelectedAnal)
328 CheckEventSelectionWithCandidates(aodEvent);
0dbd1d4f 329
330 }
331
43c7bace 332 fCounter->StoreCandidates(aodEvent,nSelectedAnal,kTRUE);
992ba7d8 333 fCounter->StoreCandidates(aodEvent,nSelectedAnal,kFALSE);
334
335 PostData(1,fOutput);
43c7bace 336 PostData(2,fCounter);
337 if (!fWriteVariableTree) {
338 PostData(4,fOutputAll);
339 PostData(5,fOutputPIDBach);
516f546e 340 if (fTrackRotation)
341 PostData(6,fOutputPIDBachTR);
43c7bace 342 } else {
343 PostData(4,fVariablesTree);
344 }
345
346 fIsEventSelected=kFALSE;
992ba7d8 347
43c7bace 348 return;
992ba7d8 349}
43c7bace 350
992ba7d8 351//________________________________________ terminate ___________________________
352void AliAnalysisTaskSELc2V0bachelor::Terminate(Option_t*)
353{
354 // The Terminate() function is the last function to be called during
355 // a query. It always runs on the client, it can be used to present
356 // the results graphically or save the results to file.
357
358 //AliInfo("Terminate","");
359 AliAnalysisTaskSE::Terminate();
360
361 fOutput = dynamic_cast<TList*> (GetOutputData(1));
362 if (!fOutput) {
363 AliError("fOutput not available");
364 return;
365 }
366
a578b2da 367 //fCEvents = dynamic_cast<TH1F*>(fOutput->FindObject("fCEvents"));
43c7bace 368 if (!fWriteVariableTree) {
369 fOutputAll = dynamic_cast<TList*> (GetOutputData(4));
370 if (!fOutputAll) {
371 AliError("fOutputAll not available");
372 return;
373 }
992ba7d8 374
43c7bace 375 fOutputPIDBach = dynamic_cast<TList*> (GetOutputData(5));
376 if (!fOutputPIDBach) {
377 AliError("fOutputPIDBach not available");
378 return;
379 }
516f546e 380
381 if (fTrackRotation) {
382 fOutputPIDBachTR = dynamic_cast<TList*> (GetOutputData(6));
383 if (!fOutputPIDBachTR) {
384 AliError("fOutputPIDBachTR not available");
385 return;
386 }
387 }
388
992ba7d8 389 }
390
391 return;
392}
393//___________________________________________________________________________
394void AliAnalysisTaskSELc2V0bachelor::UserCreateOutputObjects() {
395 // output
396 AliInfo(Form("CreateOutputObjects of task %s\n", GetName()));
992ba7d8 397
43c7bace 398 fOutput = new TList();
399 fOutput->SetOwner();
400 fOutput->SetName("chist0");
401 DefineGeneralHistograms(); // define general histograms
992ba7d8 402 PostData(1,fOutput);
992ba7d8 403
404 fCounter = new AliNormalizationCounter("NormalizationCounter");
405 fCounter->Init();
43c7bace 406 PostData(2,fCounter);
407
408 if (!fWriteVariableTree) {
409
410 fOutputAll = new TList();
411 fOutputAll->SetOwner();
412 fOutputAll->SetName("listAll");
413
414 fOutputPIDBach = new TList();
415 fOutputPIDBach->SetOwner();
416 fOutputPIDBach->SetName("listPIDBach");
417
516f546e 418 if (fTrackRotation) {
419 fOutputPIDBachTR = new TList();
420 fOutputPIDBachTR->SetOwner();
421 fOutputPIDBachTR->SetName("listPIDBachTR");
422 }
423
43c7bace 424 DefineAnalysisHistograms(); // define analysis histograms
425
426 PostData(4,fOutputAll);
427 PostData(5,fOutputPIDBach);
516f546e 428
429 if (fTrackRotation)
430 PostData(6,fOutputPIDBachTR);
431
43c7bace 432 }
433 else {
434 DefineTreeVariables();
435 PostData(4,fVariablesTree);
a578b2da 436 }
437
992ba7d8 438 return;
439}
992ba7d8 440
43c7bace 441//-------------------------------------------------------------------------------
442void AliAnalysisTaskSELc2V0bachelor::MakeAnalysisForLc2prK0S(TClonesArray *arrayLctopKos,
443 TClonesArray *mcArray,
444 Int_t &nSelectedAnal,
445 AliRDHFCutsLctoV0 *cutsAnal)
446{
992ba7d8 447
43c7bace 448 // make the analysis
992ba7d8 449
43c7bace 450 Int_t pdgCand = 4122;
451 Int_t pdgDgLctoV0bachelor[2]={2212,310}; // always 1st bachelor, 2nd V0
452 Int_t pdgDgV0toDaughters[2]={211,211};
992ba7d8 453
43c7bace 454 // loop over cascades to search for candidates Lc->p+K0S
455 Int_t nCascades= arrayLctopKos->GetEntriesFast();
456 if (nCascades==0) {
457 AliInfo("Could not find cascades, skipping the event");
458 return;
459 }
992ba7d8 460
43c7bace 461 for (Int_t iLctopK0S = 0; iLctopK0S<nCascades; iLctopK0S++) {
992ba7d8 462
43c7bace 463 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(0);
992ba7d8 464
43c7bace 465 // Lc candidates and K0S from Lc
466 AliAODRecoCascadeHF* lcK0Spr = dynamic_cast<AliAODRecoCascadeHF*>(arrayLctopKos->At(iLctopK0S));
467 if (!lcK0Spr) {
468 AliDebug(2,Form("Cascade %d doens't exist, skipping",iLctopK0S));
469 continue;
470 }
a578b2da 471
53c91ed7 472 Bool_t unsetvtx=kFALSE;
473 if (!lcK0Spr->GetOwnPrimaryVtx()) {
474 lcK0Spr->SetOwnPrimaryVtx(fVtx1);
475 unsetvtx=kTRUE;
476 }
477
43c7bace 478 if (!lcK0Spr->GetSecondaryVtx()) {
479 AliInfo("No secondary vertex"); // it will be done in AliRDHFCutsLctoV0::IsSelected
480 continue;
481 }
a578b2da 482
43c7bace 483 if (lcK0Spr->GetNDaughters()!=2) {
484 AliDebug(2,Form("Cascade %d has not 2 daughters (nDaughters=%d)",iLctopK0S,lcK0Spr->GetNDaughters())); // it will be done in AliRDHFCutsLctoV0::IsSelected
485 continue;
486 }
a578b2da 487
43c7bace 488 AliAODv0 * v0part = dynamic_cast<AliAODv0*>(lcK0Spr->Getv0());
489 AliAODTrack * bachPart = dynamic_cast<AliAODTrack*>(lcK0Spr->GetBachelor());
490 if (!v0part || !bachPart) {
491 AliDebug(2,Form("Cascade %d has no V0 or no bachelor object",iLctopK0S)); // it will be done in AliRDHFCutsLctoV0::IsSelected
492 continue;
493 }
a578b2da 494
43c7bace 495 if (!v0part->GetSecondaryVtx()) {
496 AliDebug(2,Form("No secondary vertex for V0 by cascade %d",iLctopK0S)); // it will be done in AliRDHFCutsLctoV0::IsSelected
497 continue;
498 }
a578b2da 499
43c7bace 500 if (v0part->GetNDaughters()!=2) {
501 AliDebug(2,Form("current V0 has not 2 daughters (onTheFly=%d, nDaughters=%d)",v0part->GetOnFlyStatus(),v0part->GetNDaughters())); // it will be done in AliRDHFCutsLctoV0::IsSelected
502 continue;
503 }
a578b2da 504
43c7bace 505 AliAODTrack * v0Pos = dynamic_cast<AliAODTrack*>(lcK0Spr->Getv0PositiveTrack());
506 AliAODTrack * v0Neg = dynamic_cast<AliAODTrack*>(lcK0Spr->Getv0NegativeTrack());
91ec9084 507 if (!v0Neg || !v0Pos) {
43c7bace 508 AliDebug(2,Form("V0 by cascade %d has no V0positive of V0negative object",iLctopK0S)); // it will be done in AliRDHFCutsLctoV0::IsSelected
509 continue;
510 }
a578b2da 511
43c7bace 512 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(1);
a578b2da 513
43c7bace 514 if (v0Pos->Charge() == v0Neg->Charge()) continue;
a578b2da 515
43c7bace 516 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(2);
a578b2da 517
43c7bace 518 Int_t isLc = 0;
a578b2da 519
43c7bace 520 if (fUseMCInfo) {
a578b2da 521
43c7bace 522 Int_t pdgCode=-2;
a578b2da 523
43c7bace 524 // find associated MC particle for Lc -> p+K0 and K0S->pi+pi
525 Int_t mcLabel = lcK0Spr->MatchToMC(pdgCand,pdgDgLctoV0bachelor[1],pdgDgLctoV0bachelor,pdgDgV0toDaughters,mcArray,kTRUE);
526 if (mcLabel!=-1) {
527 AliDebug(2,Form(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cascade number %d (total cascade number = %d)", iLctopK0S,nCascades));
0dbd1d4f 528
43c7bace 529 AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel));
530 if (partLc) {
531 pdgCode = partLc->GetPdgCode();
532 if (pdgCode<0) AliDebug(2,Form(" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", mcLabel, pdgCode));
533 pdgCode = TMath::Abs(pdgCode);
534 isLc = 1;
535 }
536 } else {
53c91ed7 537 AliDebug(2,Form("No MC candidate (cascade number %d -total cascade number = %d -)", iLctopK0S,nCascades));
43c7bace 538 pdgCode=-1;
539 }
540 }
0dbd1d4f 541
43c7bace 542 FillLc2pK0Sspectrum(lcK0Spr, isLc,
543 nSelectedAnal, cutsAnal,
544 mcArray);
53c91ed7 545
546 if (unsetvtx) lcK0Spr->UnsetOwnPrimaryVtx();
547
43c7bace 548 }
0dbd1d4f 549
43c7bace 550 AliDebug(2, Form("Found %d Reco particles that are Lc!!", nSelectedAnal));
992ba7d8 551
552 return;
553}
43c7bace 554
992ba7d8 555//________________________________________________________________________
556void AliAnalysisTaskSELc2V0bachelor::FillLc2pK0Sspectrum(AliAODRecoCascadeHF *part,
a578b2da 557 Int_t isLc,
a578b2da 558 Int_t &nSelectedAnal,
559 AliRDHFCutsLctoV0 *cutsAnal,
560 TClonesArray *mcArray)
992ba7d8 561{
562 //
563 // Fill histos for Lc -> K0S+proton
564 //
992ba7d8 565
566 TString fillthis="";
567
43c7bace 568 AliAODTrack *bachelor = (AliAODTrack*)part->GetBachelor();
569 Double_t momBach = bachelor->P();
992ba7d8 570
571 AliAODv0 * v0part = (AliAODv0*)part->Getv0();
572 Bool_t onFlyV0 = v0part->GetOnFlyStatus(); // on-the-flight V0s
43c7bace 573
574 Bool_t areCutsUsingPID = cutsAnal->GetIsUsePID();
575 cutsAnal->SetUsePID(kFALSE);
a578b2da 576 Bool_t isInCascadeWindow = (((cutsAnal->IsSelectedSingleCut(part,AliRDHFCuts::kCandidate,0))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)); // cut on Lc->p+K0S invMass
43c7bace 577 cutsAnal->SetUsePID(areCutsUsingPID);
992ba7d8 578
43c7bace 579 if ( onFlyV0 && !fUseOnTheFlyV0 ) return;
0dbd1d4f 580
43c7bace 581 if (fAdditionalChecks) CheckCandidatesAtDifferentLevels(part,cutsAnal);
a578b2da 582
516f546e 583 // track rotation
584 if (fTrackRotation) {
585 if (onFlyV0) {
586 TrackRotation(cutsAnal,part,"");
587 }
588 else {
589 TrackRotation(cutsAnal,part,"Offline");
590 }
591 if (fUseMCInfo) {
592 if (isLc==1) {
593 if (onFlyV0) {
594 TrackRotation(cutsAnal,part,"Sgn");
595 }
596 else {
597 TrackRotation(cutsAnal,part,"OfflineSgn");
598 }
599 }// sgn
600 else { // bkg
601 if (onFlyV0) {
602 TrackRotation(cutsAnal,part,"Bkg");
603 }
604 else {
605 TrackRotation(cutsAnal,part,"OfflineBkg");
606 }
607 }
608 } // if fUseMCInfo
609 } // if fTrackRotation
610
611
612
613
43c7bace 614 if ( !(cutsAnal->IsInFiducialAcceptance(part->Pt(),part->Y(4122))) ) return;
a578b2da 615
53c91ed7 616 if ( !( ( (cutsAnal->IsSelected(part,AliRDHFCuts::kTracks))&(AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) ) return;
617
43c7bace 618 if ( ( ( (cutsAnal->IsSelected(part,AliRDHFCuts::kAll))&(AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) ) nSelectedAnal++;
a578b2da 619
43c7bace 620 // Fill candidate variable Tree (track selection, V0 invMass selection)
621 if ( fWriteVariableTree ) {
622 Double_t invmassK0S = v0part->MassK0Short();
623 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
624 if ( !onFlyV0 && isInCascadeWindow && part->CosV0PointingAngle()>0.99 && TMath::Abs(invmassK0S-mk0sPDG)<=0.05)
625 FillTheTree(part,cutsAnal,mcArray,isLc);
626 return;
a578b2da 627 }
992ba7d8 628
43c7bace 629 cutsAnal->SetUsePID(kFALSE);
630 Bool_t isCandidateSelectedCuts = (((cutsAnal->IsSelected(part,AliRDHFCuts::kCandidate))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)); // kinematic/topological cuts
631 cutsAnal->SetUsePID(areCutsUsingPID);
632 Bool_t isBachelorID = (((cutsAnal->IsSelected(part,AliRDHFCuts::kPID))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)); // ID x bachelor
0dbd1d4f 633
43c7bace 634 //if (((cutsAnal->IsSelected(part,AliRDHFCuts::kCandidate))&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr) {
635 if (((cutsAnal->IsSelected(part,AliRDHFCuts::kAll))&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr) {
636 if (fUseMCInfo && isLc && !fWriteVariableTree) {
637 Int_t pdgCand1 = 4122;
638 Int_t pdgDgLctoV0bachelor1[2]={2212,310};
639 Int_t pdgDgV0toDaughters1[2]={211,211};
640 Int_t mcLabel1=part->MatchToMC(pdgCand1,pdgDgLctoV0bachelor1[1],pdgDgLctoV0bachelor1,pdgDgV0toDaughters1,mcArray,kTRUE);
641 AliDebug(2,Form(" Found true MC candidate: Lc->pK0S(%d) - onTheFly=%1d",mcLabel1,onFlyV0));
a578b2da 642 }
643 }
0dbd1d4f 644
a578b2da 645 Double_t nSigmaTPCpr=-999.;
646 cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,4,nSigmaTPCpr);
647 Double_t nSigmaTOFpr=-999.;
648 cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,4,nSigmaTOFpr);
649
a578b2da 650 Double_t nSigmaTPCpi=-999.;
651 cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,2,nSigmaTPCpi);
652 Double_t nSigmaTOFpi=-999.;
653 cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,2,nSigmaTOFpi);
654
a578b2da 655 Double_t nSigmaTPCka=-999.;
656 cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,3,nSigmaTPCka);
657 Double_t nSigmaTOFka=-999.;
658 cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,3,nSigmaTOFka);
659
43c7bace 660 if (onFlyV0) {
516f546e 661 if (isCandidateSelectedCuts) {
43c7bace 662 FillAnalysisHistograms(part,isBachelorID,"");
516f546e 663 }
992ba7d8 664 }
43c7bace 665 else {
a578b2da 666 if (isCandidateSelectedCuts) {
a578b2da 667 fillthis="histoprotonBachSigmaVspTOF";
668 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTOFpr);
669 fillthis="histoprotonBachSigmaVspTPC";
670 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTPCpr);
43c7bace 671 FillAnalysisHistograms(part,isBachelorID,"Offline");
992ba7d8 672 }
673 }
992ba7d8 674 if (fUseMCInfo) {
675 if (isLc==1) {
43c7bace 676 if (onFlyV0) {
516f546e 677 if (isCandidateSelectedCuts) {
43c7bace 678 FillAnalysisHistograms(part,isBachelorID,"Sgn");
516f546e 679 }
992ba7d8 680 }
43c7bace 681 else {
a578b2da 682 if (isCandidateSelectedCuts) {
a578b2da 683 fillthis="histoprotonBachSigmaVspTOFsgn";
684 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTOFpr);
685 fillthis="histoprotonBachSigmaVspTPCsgn";
686 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTPCpr);
43c7bace 687 FillAnalysisHistograms(part,isBachelorID,"OfflineSgn");
992ba7d8 688 }
992ba7d8 689 }
992ba7d8 690 }// sgn
691 else { // bkg
43c7bace 692 if (onFlyV0) {
516f546e 693 if (isCandidateSelectedCuts) {
43c7bace 694 FillAnalysisHistograms(part,isBachelorID,"Bkg");
516f546e 695 }
992ba7d8 696 }
43c7bace 697 else {
a578b2da 698 if (isCandidateSelectedCuts) {
a578b2da 699 fillthis="histoprotonBachSigmaVspTOFbkg";
700 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTOFpr);
701 fillthis="histoprotonBachSigmaVspTPCbkg";
702 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTPCpr);
43c7bace 703 FillAnalysisHistograms(part,isBachelorID,"OfflineBkg");
992ba7d8 704 }
0dbd1d4f 705 }
992ba7d8 706 }
707 } // if fUseMCInfo
516f546e 708
992ba7d8 709 return;
710}
992ba7d8 711
43c7bace 712//----------------------------------------------------
713void AliAnalysisTaskSELc2V0bachelor::DefineK0SHistos()
714{
992ba7d8 715
43c7bace 716 TString nameMass=" ", nameSgn=" ", nameBkg=" ";
992ba7d8 717
43c7bace 718 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
719 Double_t mK0SPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
992ba7d8 720
43c7bace 721 if (fUseOnTheFlyV0) {
0dbd1d4f 722
43c7bace 723 // V0 invariant masses (on-the-fly)
724 nameMass="histK0SMass";
725 TH2F* spectrumK0SMass = new TH2F(nameMass.Data(),"K^{0}_{S} invariant mass VS p_{T}; M(#pi^{+}#pi^{-}) [GeV/c^{2}]; p_{T}(K^{0}_{S}) [GeV/c]; Entries",
726 1000,mK0SPDG-0.050,mK0SPDG+0.050,175,0.,35.);
ff12b981 727
43c7bace 728 // Lc invariant masses (x K0S on-the-fly)
729 nameMass="histLcMassByK0S";
730 TH2F* spectrumLcMassByK0S = new TH2F(nameMass.Data(),"#Lambda_{c} invariant mass (by K^{0}_{S}) vs p_{T} ; m_{inv}(p-K^{0}_{S}) [GeV/c^{2}]; p_{T}(#Lambda_{c}) [GeV/c]",
731 1000,mLcPDG-0.250,mLcPDG+0.250,175,0.,35.);
992ba7d8 732
43c7bace 733 nameMass="histpK0Svsp";
734 TH2F* momentumDistributionK0Svsp = new TH2F(nameMass.Data(),"#Lambda_{c}: p(K^{0}_{S}) vs p(p); p_{p}; p_{K^{0}_{S}} ",
735 175,0.,35.,175,0.,35.);
ff12b981 736
43c7bace 737 nameMass="histArmPodK0S";
738 TH2F* armenterosPodK0S = new TH2F(nameMass.Data(),"K^{0}_{S}: Armenteros-Podolanski distribution; #frac{p_{L}^{+}-p_{L}^{-}}{p_{L}^{+}+p_{L}^{-}}; p_{T}^{+} [GeV/c]",
739 200,-1.,1.,300,0.,0.3);
740
741 nameMass="histDCAtoPVvspK0S";
742 TH2F *dcatoPVvspK0S = new TH2F(nameMass.Data(),"K^{0}_{S}: DCA to Primary Vertex vs K^{0}_{S} momentum ; p(K^{0}_{S}) [GeV/c]; DCA to Primary Vertex [n#sigmas]; Entries",
743 175,0.,35.,50,0.,5.);
ff12b981 744
43c7bace 745 nameMass="histK0ScosPAwrtPVvspK0S";
746 TH2F *cosPAwrtPVvspK0S = new TH2F(nameMass.Data(),"K^{0}_{S}: cosine of pointing angle wrt primary vertex vs K^{0}_{S} momentum ; p(K^{0}_{S}) [GeV/c]; cosine; Entries",
747 175,0.,35.,100,0.99,1.);
ff12b981 748
43c7bace 749 TH2F* allspectrumK0SMass = (TH2F*)spectrumK0SMass->Clone();
750 TH2F* allspectrumLcMassByK0S = (TH2F*)spectrumLcMassByK0S->Clone();
751 TH2F* allmomentumDistributionK0Svsp= (TH2F*)momentumDistributionK0Svsp->Clone();
752 TH2F* alldcatoPVvspK0S=(TH2F*)dcatoPVvspK0S->Clone();
753 TH2F* allcosV0PAwrtPVvspK0S=(TH2F*)cosPAwrtPVvspK0S->Clone();
ff12b981 754
43c7bace 755 TH2F* pidBachspectrumK0SMass = (TH2F*)spectrumK0SMass->Clone();
756 TH2F* pidBachspectrumLcMassByK0S = (TH2F*)spectrumLcMassByK0S->Clone();
757 TH2F* pidBachmomentumDistributionK0Svsp= (TH2F*)momentumDistributionK0Svsp->Clone();
758 TH2F* pidBachdcatoPVvspK0S=(TH2F*)dcatoPVvspK0S->Clone();
759 TH2F* pidBachcosV0PAwrtPVvspK0S=(TH2F*)cosPAwrtPVvspK0S->Clone();
ff12b981 760
43c7bace 761 TH2F* allArmenterosPodK0S = (TH2F*)armenterosPodK0S->Clone();
762 TH2F* pidBachArmenterosPodK0S = (TH2F*)armenterosPodK0S->Clone();
ff12b981 763
43c7bace 764 fOutputAll->Add(allspectrumK0SMass);
765 fOutputAll->Add(allspectrumLcMassByK0S);
766 fOutputAll->Add(allmomentumDistributionK0Svsp);
767 fOutputAll->Add(allArmenterosPodK0S);
768 fOutputAll->Add(alldcatoPVvspK0S);
769 fOutputAll->Add(allcosV0PAwrtPVvspK0S);
0dbd1d4f 770
43c7bace 771 fOutputPIDBach->Add(pidBachspectrumK0SMass);
772 fOutputPIDBach->Add(pidBachspectrumLcMassByK0S);
773 fOutputPIDBach->Add(pidBachmomentumDistributionK0Svsp);
774 fOutputPIDBach->Add(pidBachArmenterosPodK0S);
775 fOutputPIDBach->Add(pidBachdcatoPVvspK0S);
776 fOutputPIDBach->Add(pidBachcosV0PAwrtPVvspK0S);
777
516f546e 778 if (fTrackRotation){
779 TH2F* pidBachTRspectrumLcMassByK0S = (TH2F*)spectrumLcMassByK0S->Clone();
780 fOutputPIDBachTR->Add(pidBachTRspectrumLcMassByK0S);
781 }
782
43c7bace 783 }
ff12b981 784
43c7bace 785 // V0 invariant masses (offline)
786 nameMass="histK0SMassOffline";
787 TH2F* spectrumK0SMassOffline = new TH2F(nameMass.Data(),"K^{0}_{S} invariant mass VS p_{T}; M(#pi^{+}#pi^{-}) [GeV/c^{2}]; p_{T}(K^{0}_{S}) [GeV/c]; Entries",
788 1000,mK0SPDG-0.050,mK0SPDG+0.050,175,0.,35.);
0dbd1d4f 789
43c7bace 790 // Lc invariant masses (x K0S offline)
791 nameMass="histLcMassByK0SOffline";
792 TH2F* spectrumLcMassOfflineByK0S = new TH2F(nameMass.Data(),"#Lambda_{c} invariant mass (by K^{0}_{S}) vs p_{T}; M(K^{0}_{S}p) [GeV/c^{2}]; p_{T} [GeV/c]",
793 1000,mLcPDG-0.250,mLcPDG+0.250,175,0.,35.);
992ba7d8 794
43c7bace 795 nameMass="histpK0SvspOffline";
796 TH2F* momentumDistributionK0SvspOffline = new TH2F(nameMass.Data(),"#Lambda_{c}: p(K^{0}_{S}) vs p(p) - Offline ; p_{p} [GeV/c]; p_{K^{0}_{S}} [GeV/c]",
797 175,0.,35.,175,0.,35.);
992ba7d8 798
43c7bace 799 nameMass="histArmPodK0SOffline";
800 TH2F* armenterosPodK0SOff = new TH2F(nameMass.Data(),"K^{0}_{S} Armenteros-Podolanski distribution - Offline; #frac{p_{L}^{+}-p_{L}^{-}}{p_{L}^{+}+p_{L}^{-}}; p_{T}^{+} [GeV/c]",
801 200,-1.,1.,300,0.,0.3);
992ba7d8 802
43c7bace 803 nameMass="histDCAtoPVvspK0SOffline";
804 TH2F *dcatoPVvspK0SOffline = new TH2F(nameMass.Data(),"K^{0}_{S}: DCA to Primary Vertex vs K^{0}_{S} invariant mass - Offline; p(K^{0}_{S}) [GeV/c]; DCA to Primary Vertex [n#sigmas]; Entries",
805 175,0.,35.,50,0.,5.);
992ba7d8 806
43c7bace 807 nameMass="histK0ScosPAwrtPVvspK0SOffline";
808 TH2F *cosPAwrtPVvspK0SOffline = new TH2F(nameMass.Data(),"K^{0}_{S}: cosine of pointing angle wrt primary vertex vs K^{0}_{S} momentum - Offline; p(K^{0}_{S}) [GeV/c]; cosine; Entries",
809 175,0.,35.,100,0.99,1.);
992ba7d8 810
992ba7d8 811
992ba7d8 812
43c7bace 813 TH2F* allspectrumK0SMassOffline = (TH2F*)spectrumK0SMassOffline->Clone();
814 TH2F* allspectrumLcMassOfflineByK0S = (TH2F*)spectrumLcMassOfflineByK0S->Clone();
815 TH2F* allmomentumDistributionK0SvspOffline= (TH2F*)momentumDistributionK0SvspOffline->Clone();
816 TH2F* alldcatoPVvspK0SOffline=(TH2F*)dcatoPVvspK0SOffline->Clone();
817 TH2F* allcosPAwrtPVvspK0SOffline=(TH2F*)cosPAwrtPVvspK0SOffline->Clone();
818 TH2F* allArmenterosPodK0SOff = (TH2F*)armenterosPodK0SOff->Clone();
992ba7d8 819
43c7bace 820 TH2F* pidBachspectrumK0SMassOffline = (TH2F*)spectrumK0SMassOffline->Clone();
821 TH2F* pidBachspectrumLcMassOfflineByK0S = (TH2F*)spectrumLcMassOfflineByK0S->Clone();
822 TH2F* pidBachmomentumDistributionK0SvspOffline= (TH2F*)momentumDistributionK0SvspOffline->Clone();
823 TH2F* pidBachdcatoPVvspK0SOffline=(TH2F*)dcatoPVvspK0SOffline->Clone();
824 TH2F* pidBachcosPAwrtPVvspK0SOffline=(TH2F*)cosPAwrtPVvspK0SOffline->Clone();
825 TH2F* pidBachArmenterosPodK0SOff = (TH2F*)armenterosPodK0SOff->Clone();
992ba7d8 826
992ba7d8 827
43c7bace 828 fOutputAll->Add(allspectrumK0SMassOffline);
829 fOutputAll->Add(allspectrumLcMassOfflineByK0S);
830 fOutputAll->Add(allmomentumDistributionK0SvspOffline);
831 fOutputAll->Add(allArmenterosPodK0SOff);
832 fOutputAll->Add(alldcatoPVvspK0SOffline);
833 fOutputAll->Add(allcosPAwrtPVvspK0SOffline);
85036182 834
43c7bace 835 fOutputPIDBach->Add(pidBachspectrumK0SMassOffline);
836 fOutputPIDBach->Add(pidBachspectrumLcMassOfflineByK0S);
837 fOutputPIDBach->Add(pidBachmomentumDistributionK0SvspOffline);
838 fOutputPIDBach->Add(pidBachArmenterosPodK0SOff);
839 fOutputPIDBach->Add(pidBachdcatoPVvspK0SOffline);
840 fOutputPIDBach->Add(pidBachcosPAwrtPVvspK0SOffline);
841
516f546e 842 if (fTrackRotation) {
843 TH2F* pidBachTRspectrumLcMassOfflineByK0S = (TH2F*)spectrumLcMassOfflineByK0S->Clone();
844 fOutputPIDBachTR->Add(pidBachTRspectrumLcMassOfflineByK0S);
845 }
846
43c7bace 847 if (fUseMCInfo) {
848
849 if (fUseOnTheFlyV0) {
850
851 nameSgn="histK0SMassSgn";
852 nameBkg="histK0SMassBkg";
853 TH2F* spectrumK0SMassSgn = new TH2F(nameSgn.Data(), "K^{0}_{S} - sgn: invariant mass VS p_{T} - MC; m_{inv}(#pi^{+}#pi^{-}) [GeV/c^{2}]; p_{T}(K^{0}_{S}) [GeV/c]; Entries",
854 1000,mK0SPDG-0.050,mK0SPDG+0.050,175,0.,35.);
855 TH2F* spectrumK0SMassBkg = new TH2F(nameBkg.Data(), "K^{0}_{S} - bkg: invariant mass VS p_{T} - MC; m_{inv}(#pi^{+}#pi^{-}) [GeV/c^{2}]; p_{T}(K^{0}_{S}) [GeV/c]; Entries",
856 1000,mK0SPDG-0.050,mK0SPDG+0.050,175,0.,35.);
857
43c7bace 858 nameSgn="histLcMassByK0SSgn";
859 nameBkg="histLcMassByK0SBkg";
860 TH2F* spectrumLcMassByK0SSgn = new TH2F(nameSgn.Data(), "#Lambda_{c} - sgn: invariant mass (by K^{0}_{S}) vs p_{T} - MC; m_{inv}(p-K^{0}_{S}) [GeV/c^{2}]; p_{T}",
861 1000,mLcPDG-0.250,mLcPDG+0.250,175,0.,35.);
862 TH2F* spectrumLcMassByK0SBkg = new TH2F(nameBkg.Data(), "#Lambda_{c} - bkg: invariant mass (by K^{0}_{S}) vs p_{T} - MC; m_{inv}(p-K^{0}_{S}) [GeV/c^{2}]; p_{T}",
863 1000,mLcPDG-0.250,mLcPDG+0.250,175,0.,35.);
43c7bace 864 nameSgn="histpK0SvspSgn";
865 nameBkg="histpK0SvspBkg";
866 TH2F* momentumDistributionK0SvspSgn= new TH2F(nameSgn.Data(),"#Lambda_{c} - sgn: K^{0}_{S} vs p Total Momentum Distribution - MC; p_{p}; p_{K^{0}_{S}}",
867 175,0.,35.,175,0.,35.);
868 TH2F* momentumDistributionK0SvspBkg= new TH2F(nameBkg.Data(),"#Lambda_{c} - bkg: K^{0}_{S} vs p Total Momentum Distribution - MC; p_{p}; p_{K^{0}_{S}}",
869 175,0.,35.,175,0.,35.);
43c7bace 870 // armenteros-podolanski plots K0S
871 nameSgn="histArmPodK0SSgn";
872 nameBkg="histArmPodK0SBkg";
873 TH2F* armenterosPodK0SSgn = new TH2F(nameSgn.Data(),"K^{0}_{S} Armenteros-Podolanski distribution (sgn); #frac{p_{L}^{+}-p_{L}^{-}}{p_{L}^{+}+p_{L}^{-}}; p_{T}^{+} [GeV/c]",
874 200,-1.,1.,300,0.,0.3);
875 TH2F* armenterosPodK0SBkg = new TH2F(nameBkg.Data(),"K^{0}_{S} Armenteros-Podolanski distribution (bkg); #frac{p_{L}^{+}-p_{L}^{-}}{p_{L}^{+}+p_{L}^{-}}; p_{T}^{+} [GeV/c]",
876 200,-1.,1.,300,0.,0.3);
43c7bace 877 nameSgn="histDCAtoPVvspK0SSgn";
878 nameBkg="histDCAtoPVvspK0SBkg";
879 TH2F *dcatoPVvspK0SSgn=new TH2F(nameSgn.Data(),"K^{0}_{S} - sgn: DCA to Primary Vertex vs K^{0}_{S} invariant mass (sgn); p(K^{0}_{S}) [GeV/c]; DCA to Primary Vertex [n#sigmas]; Entries",175,0.,35.,50,0.,5.);
880 TH2F *dcatoPVvspK0SBkg=new TH2F(nameBkg.Data(),"K^{0}_{S} - bkg: DCA to Primary Vertex vs K^{0}_{S} invariant mass (bkg); p(K^{0}_{S}) [GeV/c]; DCA to Primary Vertex [n#sigmas]; Entries",175,0.,35.,50,0.,5.);
881
516f546e 882 TH2F* allspectrumK0SMassSgn = (TH2F*)spectrumK0SMassSgn->Clone();
883 TH2F* allspectrumK0SMassBkg = (TH2F*) spectrumK0SMassBkg->Clone();
884 TH2F* allspectrumLcMassByK0SSgn = (TH2F*)spectrumLcMassByK0SSgn->Clone();
885 TH2F* allspectrumLcMassByK0SBkg = (TH2F*) spectrumLcMassByK0SBkg->Clone();
886 TH2F* allmomentumDistributionK0SvspSgn= (TH2F*)momentumDistributionK0SvspSgn->Clone();
887 TH2F* allmomentumDistributionK0SvspBkg= (TH2F*)momentumDistributionK0SvspBkg->Clone();
888 TH2F* allArmenterosPodK0SSgn = (TH2F*)armenterosPodK0SSgn->Clone();
889 TH2F* allArmenterosPodK0SBkg = (TH2F*)armenterosPodK0SBkg->Clone();
43c7bace 890 TH2F* alldcatoPVvspK0SSgn= (TH2F*)dcatoPVvspK0SSgn->Clone();
891 TH2F* alldcatoPVvspK0SBkg= (TH2F*)dcatoPVvspK0SBkg->Clone();
516f546e 892
893 TH2F* pidBachspectrumK0SMassSgn = (TH2F*)spectrumK0SMassSgn->Clone();
894 TH2F* pidBachspectrumK0SMassBkg = (TH2F*) spectrumK0SMassBkg->Clone();
895 TH2F* pidBachspectrumLcMassByK0SSgn = (TH2F*)spectrumLcMassByK0SSgn->Clone();
896 TH2F* pidBachspectrumLcMassByK0SBkg = (TH2F*) spectrumLcMassByK0SBkg->Clone();
897 TH2F* pidBachmomentumDistributionK0SvspSgn= (TH2F*)momentumDistributionK0SvspSgn->Clone();
898 TH2F* pidBachmomentumDistributionK0SvspBkg= (TH2F*)momentumDistributionK0SvspBkg->Clone();
899 TH2F* pidBachArmenterosPodK0SSgn = (TH2F*)armenterosPodK0SSgn->Clone();
900 TH2F* pidBachArmenterosPodK0SBkg = (TH2F*)armenterosPodK0SBkg->Clone();
43c7bace 901 TH2F* pidBachdcatoPVvspK0SSgn= (TH2F*)dcatoPVvspK0SSgn->Clone();
902 TH2F* pidBachdcatoPVvspK0SBkg= (TH2F*)dcatoPVvspK0SBkg->Clone();
903
516f546e 904 fOutputAll->Add(allspectrumK0SMassSgn);
905 fOutputAll->Add(allspectrumK0SMassBkg);
906 fOutputAll->Add(allspectrumLcMassByK0SSgn);
907 fOutputAll->Add(allspectrumLcMassByK0SBkg);
908 fOutputAll->Add(allmomentumDistributionK0SvspSgn);
909 fOutputAll->Add(allmomentumDistributionK0SvspBkg);
910 fOutputAll->Add(allArmenterosPodK0SSgn);
911 fOutputAll->Add(allArmenterosPodK0SBkg);
43c7bace 912 fOutputAll->Add(alldcatoPVvspK0SSgn);
43c7bace 913 fOutputAll->Add(alldcatoPVvspK0SBkg);
516f546e 914
915 fOutputPIDBach->Add(pidBachspectrumK0SMassSgn);
916 fOutputPIDBach->Add(pidBachspectrumK0SMassBkg);
917 fOutputPIDBach->Add(pidBachspectrumLcMassByK0SSgn);
918 fOutputPIDBach->Add(pidBachspectrumLcMassByK0SBkg);
919 fOutputPIDBach->Add(pidBachmomentumDistributionK0SvspSgn);
920 fOutputPIDBach->Add(pidBachmomentumDistributionK0SvspBkg);
921 fOutputPIDBach->Add(pidBachArmenterosPodK0SSgn);
922 fOutputPIDBach->Add(pidBachArmenterosPodK0SBkg);
923 fOutputPIDBach->Add(pidBachdcatoPVvspK0SSgn);
43c7bace 924 fOutputPIDBach->Add(pidBachdcatoPVvspK0SBkg);
925
516f546e 926 if (fTrackRotation) {
927 TH2F* pidBachTRspectrumLcMassByK0SSgn = (TH2F*)spectrumLcMassByK0SSgn->Clone();
928 TH2F* pidBachTRspectrumLcMassByK0SBkg = (TH2F*) spectrumLcMassByK0SBkg->Clone();
929 fOutputPIDBachTR->Add(pidBachTRspectrumLcMassByK0SSgn);
930 fOutputPIDBachTR->Add(pidBachTRspectrumLcMassByK0SBkg);
931 }
932
43c7bace 933 }
934
935
936 nameSgn="histK0SMassOfflineSgn";
937 nameBkg="histK0SMassOfflineBkg";
938 TH2F* spectrumK0SMassOfflineSgn = new TH2F(nameSgn.Data(), "K^{0}_{S} - sgn: invariant mass VS p_{T} - MC; m_{inv}(#pi^{+}-#pi^{-}) [GeV/c^{2}]; p_{T}(K^{0}_{S}) [GeV/c]; Entries",
939 1000,mK0SPDG-0.050,mK0SPDG+0.050,175,0.,35.);
940 TH2F* spectrumK0SMassOfflineBkg = new TH2F(nameBkg.Data(), "K^{0}_{S} - bkg: invariant mass VS p_{T} - MC; m_{inv}(#pi^{+}-#pi^{-}) [GeV/c^{2}]; p_{T}(K^{0}_{S}) [GeV/c]; Entries",
941 1000,mK0SPDG-0.050,mK0SPDG+0.050,175,0.,35.);
942
43c7bace 943 nameSgn="histLcMassByK0SOfflineSgn";
944 nameBkg="histLcMassByK0SOfflineBkg";
945 TH2F* spectrumLcMassOfflineByK0SSgn = new TH2F(nameSgn.Data(), "#Lambda_{c} - sgn: invariant mass (by K^{0}_{S}) vs p_{T} - MC; M(#Lambda_{c}) [GeV/c^{2}]; p_{T}",
946 1000,mLcPDG-0.250,mLcPDG+0.250,175,0.,35.);
947 TH2F* spectrumLcMassOfflineByK0SBkg = new TH2F(nameBkg.Data(), "#Lambda_{c} - bkg: invariant mass (by K^{0}_{S}) vs p_{T} - MC; M(#Lambda_{c}) [GeV/c^{2}]; p_{T}",
948 1000,mLcPDG-0.250,mLcPDG+0.250,175,0.,35.);
43c7bace 949 nameSgn="histpK0SvspOfflineSgn";
950 nameBkg="histpK0SvspOfflineBkg";
951 TH2F* momentumDistributionK0SvspOfflineSgn= new TH2F(nameSgn.Data(),"#Lambda_{c} - sgn: K^{0}_{S} vs p Total Momentum Distribution - Offline - MC; p_{p}; p_{K^{0}_{S}}",
952 175,0.,35.,175,0.,35.);
953 TH2F* momentumDistributionK0SvspOfflineBkg= new TH2F(nameBkg.Data(),"#Lambda_{c} - bkg: K^{0}_{S} vs p Total Momentum Distribution - Offline - MC; p_{p}; p_{K^{0}_{S}}",
954 175,0.,35.,175,0.,35.);
43c7bace 955 // armenteros-podolanski plots K0S (offline)
956 nameSgn="histArmPodK0SOfflineSgn";
957 nameBkg="histArmPodK0SOfflineBkg";
958 TH2F* armenterosPodK0SOffSgn = new TH2F(nameSgn.Data(),"K^{0}_{S} Armenteros-Podolanski distribution (sgn) -offline-; #frac{p_{L}^{+}-p_{L}^{-}}{p_{L}^{+}+p_{L}^{-}}; p_{T}^{+} [GeV/c]",
959 200,-1.,1.,300,0.,0.3);
960 TH2F* armenterosPodK0SOffBkg = new TH2F(nameBkg.Data(),"K^{0}_{S} Armenteros-Podolanski distribution (bkg) -offline-; #frac{p_{L}^{+}-p_{L}^{-}}{p_{L}^{+}+p_{L}^{-}}; p_{T}^{+} [GeV/c]",
961 200,-1.,1.,300,0.,0.3);
43c7bace 962 nameSgn="histDCAtoPVvspK0SOfflineSgn";
963 nameBkg="histDCAtoPVvspK0SOfflineBkg";
964 TH2F *dcatoPVvspK0SOfflineSgn=new TH2F(nameSgn.Data(),"K^{0}_{S} -offline - (sgn): DCA to Primary Vertex vs K^{0}_{S} invariant mass; p(K^{0}_{S}) [GeV/c]; DCA to Primary Vertex [n#sigmas]; Entries",
965 175,0.,35.,50,0.,5.);
966 TH2F *dcatoPVvspK0SOfflineBkg=new TH2F(nameBkg.Data(),"K^{0}_{S} -offline - (bkg): DCA to Primary Vertex vs K^{0}_{S} invariant mass; p(K^{0}_{S}) [GeV/c]; DCA to Primary Vertex [n#sigmas]; Entries",
967 175,0.,35.,50,0.,5.);
43c7bace 968
516f546e 969
970 TH2F* allspectrumK0SMassOfflineSgn = (TH2F*)spectrumK0SMassOfflineSgn->Clone();
971 TH2F* allspectrumK0SMassOfflineBkg = (TH2F*) spectrumK0SMassOfflineBkg->Clone();
972 TH2F* allspectrumLcMassOfflineByK0SSgn = (TH2F*)spectrumLcMassOfflineByK0SSgn->Clone();
973 TH2F* allspectrumLcMassOfflineByK0SBkg = (TH2F*) spectrumLcMassOfflineByK0SBkg->Clone();
974 TH2F* allmomentumDistributionK0SvspOfflineSgn= (TH2F*)momentumDistributionK0SvspOfflineSgn->Clone();
975 TH2F* allmomentumDistributionK0SvspOfflineBkg= (TH2F*)momentumDistributionK0SvspOfflineBkg->Clone();
976 TH2F* allArmenterosPodK0SOffSgn = (TH2F*)armenterosPodK0SOffSgn->Clone();
977 TH2F* allArmenterosPodK0SOffBkg = (TH2F*)armenterosPodK0SOffBkg->Clone();
43c7bace 978 TH2F* alldcatoPVvspK0SOfflineSgn= (TH2F*)dcatoPVvspK0SOfflineSgn->Clone();
43c7bace 979 TH2F* alldcatoPVvspK0SOfflineBkg= (TH2F*)dcatoPVvspK0SOfflineBkg->Clone();
43c7bace 980
516f546e 981 TH2F* pidBachspectrumLcMassOfflineByK0SSgn = (TH2F*)spectrumLcMassOfflineByK0SSgn->Clone();
982 TH2F* pidBachspectrumLcMassOfflineByK0SBkg = (TH2F*) spectrumLcMassOfflineByK0SBkg->Clone();
983 TH2F* pidBachspectrumK0SMassOfflineSgn = (TH2F*)spectrumK0SMassOfflineSgn->Clone();
984 TH2F* pidBachspectrumK0SMassOfflineBkg = (TH2F*) spectrumK0SMassOfflineBkg->Clone();
985 TH2F* pidBachmomentumDistributionK0SvspOfflineSgn= (TH2F*)momentumDistributionK0SvspOfflineSgn->Clone();
986 TH2F* pidBachmomentumDistributionK0SvspOfflineBkg= (TH2F*)momentumDistributionK0SvspOfflineBkg->Clone();
987 TH2F* pidBachArmenterosPodK0SOffSgn = (TH2F*)armenterosPodK0SOffSgn->Clone();
988 TH2F* pidBachArmenterosPodK0SOffBkg = (TH2F*)armenterosPodK0SOffBkg->Clone();
989 TH2F* pidBachdcatoPVvspK0SOfflineSgn= (TH2F*)dcatoPVvspK0SOfflineSgn->Clone();
990 TH2F* pidBachdcatoPVvspK0SOfflineBkg= (TH2F*)dcatoPVvspK0SOfflineBkg->Clone();
43c7bace 991
516f546e 992 fOutputAll->Add(allspectrumK0SMassOfflineSgn);
993 fOutputAll->Add(allspectrumK0SMassOfflineBkg);
994 fOutputAll->Add(allspectrumLcMassOfflineByK0SSgn);
995 fOutputAll->Add(allspectrumLcMassOfflineByK0SBkg);
996 fOutputAll->Add(allmomentumDistributionK0SvspOfflineSgn);
997 fOutputAll->Add(allmomentumDistributionK0SvspOfflineBkg);
998 fOutputAll->Add(allArmenterosPodK0SOffSgn);
999 fOutputAll->Add(allArmenterosPodK0SOffBkg);
43c7bace 1000 fOutputAll->Add(alldcatoPVvspK0SOfflineSgn);
43c7bace 1001 fOutputAll->Add(alldcatoPVvspK0SOfflineBkg);
516f546e 1002
1003 fOutputPIDBach->Add(pidBachspectrumK0SMassOfflineSgn);
1004 fOutputPIDBach->Add(pidBachspectrumK0SMassOfflineBkg);
1005 fOutputPIDBach->Add(pidBachspectrumLcMassOfflineByK0SSgn);
1006 fOutputPIDBach->Add(pidBachspectrumLcMassOfflineByK0SBkg);
1007 fOutputPIDBach->Add(pidBachmomentumDistributionK0SvspOfflineSgn);
1008 fOutputPIDBach->Add(pidBachmomentumDistributionK0SvspOfflineBkg);
1009 fOutputPIDBach->Add(pidBachArmenterosPodK0SOffSgn);
1010 fOutputPIDBach->Add(pidBachArmenterosPodK0SOffBkg);
1011 fOutputPIDBach->Add(pidBachdcatoPVvspK0SOfflineSgn);
43c7bace 1012 fOutputPIDBach->Add(pidBachdcatoPVvspK0SOfflineBkg);
1013
516f546e 1014 if (fTrackRotation) {
1015 TH2F* pidBachTRspectrumLcMassOfflineByK0SSgn = (TH2F*)spectrumLcMassOfflineByK0SSgn->Clone();
1016 TH2F* pidBachTRspectrumLcMassOfflineByK0SBkg = (TH2F*) spectrumLcMassOfflineByK0SBkg->Clone();
1017 fOutputPIDBachTR->Add(pidBachTRspectrumLcMassOfflineByK0SSgn);
1018 fOutputPIDBachTR->Add(pidBachTRspectrumLcMassOfflineByK0SBkg);
1019 }
1020
1021 }
1022
1023
1024 if (fTrackRotation) {
1025
1026 TH1F *hNormRotated=new TH1F("hNormRotated","",11,-0.5,10.5);
1027 TH1F *hNormRotatedOffline=new TH1F("hNormRotatedOffline","",11,-0.5,10.5);
1028 TH1F *hNormRotatedSgn=new TH1F("hNormRotatedSgn","",11,-0.5,10.5);
1029 TH1F *hNormRotatedOfflineSgn=new TH1F("hNormRotatedOfflineSgn","",11,-0.5,10.5);
1030 TH1F *hNormRotatedBkg=new TH1F("hNormRotatedBkg","",11,-0.5,10.5);
1031 TH1F *hNormRotatedOfflineBkg=new TH1F("hNormRotatedOfflineBkg","",11,-0.5,10.5);
1032 hNormRotated->Sumw2();
1033 hNormRotatedOffline->Sumw2();
1034 hNormRotatedSgn->Sumw2();
1035 hNormRotatedOfflineSgn->Sumw2();
1036 hNormRotatedBkg->Sumw2();
1037 hNormRotatedOfflineBkg->Sumw2();
1038 hNormRotated->SetMinimum(0);
1039 hNormRotatedOffline->SetMinimum(0);
1040 hNormRotatedSgn->SetMinimum(0);
1041 hNormRotatedOfflineSgn->SetMinimum(0);
1042 hNormRotatedBkg->SetMinimum(0);
1043 hNormRotatedOfflineBkg->SetMinimum(0);
1044
1045 fOutputPIDBachTR->Add(hNormRotated);
1046 fOutputPIDBachTR->Add(hNormRotatedOffline);
1047 fOutputPIDBachTR->Add(hNormRotatedSgn);
1048 fOutputPIDBachTR->Add(hNormRotatedOfflineSgn);
1049 fOutputPIDBachTR->Add(hNormRotatedBkg);
1050 fOutputPIDBachTR->Add(hNormRotatedOfflineBkg);
1051
1052 Int_t nMassBins=fMaxMass*1000.-fMinMass*1000.;
1053 Double_t maxm=fMinMass+nMassBins*0.001;
1054 TH3F *hMassVsPtVsY=new TH3F("hMassVsPtVsY","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1055 TH3F *hMassVsPtVsYOffline=new TH3F("hMassVsPtVsYOffline","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1056 TH3F *hMassVsPtVsYSgn=new TH3F("hMassVsPtVsYSgn","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1057 TH3F *hMassVsPtVsYOfflineSgn=new TH3F("hMassVsPtVsYOfflineSgn","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1058 TH3F *hMassVsPtVsYBkg=new TH3F("hMassVsPtVsYBkg","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1059 TH3F *hMassVsPtVsYOfflineBkg=new TH3F("hMassVsPtVsYOfflineBkg","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1060
1061 hMassVsPtVsY->Sumw2();
1062 hMassVsPtVsYOffline->Sumw2();
1063 hMassVsPtVsYSgn->Sumw2();
1064 hMassVsPtVsYOfflineSgn->Sumw2();
1065 hMassVsPtVsYBkg->Sumw2();
1066 hMassVsPtVsYOfflineBkg->Sumw2();
1067 hMassVsPtVsY->SetMinimum(0);
1068 hMassVsPtVsYOffline->SetMinimum(0);
1069 hMassVsPtVsYSgn->SetMinimum(0);
1070 hMassVsPtVsYOfflineSgn->SetMinimum(0);
1071 hMassVsPtVsYBkg->SetMinimum(0);
1072 hMassVsPtVsYOfflineBkg->SetMinimum(0);
1073
1074 fOutputPIDBachTR->Add(hMassVsPtVsY);
1075 fOutputPIDBachTR->Add(hMassVsPtVsYOffline);
1076 fOutputPIDBachTR->Add(hMassVsPtVsYSgn);
1077 fOutputPIDBachTR->Add(hMassVsPtVsYOfflineSgn);
1078 fOutputPIDBachTR->Add(hMassVsPtVsYBkg);
1079 fOutputPIDBachTR->Add(hMassVsPtVsYOfflineBkg);
1080
1081 TH3F *hMassVsPtVsYRot=new TH3F("hMassVsPtVsYRot","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1082 TH3F *hMassVsPtVsYRotOffline=new TH3F("hMassVsPtVsYRotOffline","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1083 TH3F *hMassVsPtVsYRotSgn=new TH3F("hMassVsPtVsYRotSgn","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1084 TH3F *hMassVsPtVsYRotOfflineSgn=new TH3F("hMassVsPtVsYRotOfflineSgn","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1085 TH3F *hMassVsPtVsYRotBkg=new TH3F("hMassVsPtVsYRotBkg","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1086 TH3F *hMassVsPtVsYRotOfflineBkg=new TH3F("hMassVsPtVsYRotOfflineBkg","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1087
1088 hMassVsPtVsYRot->Sumw2();
1089 hMassVsPtVsYRotOffline->Sumw2();
1090 hMassVsPtVsYRotSgn->Sumw2();
1091 hMassVsPtVsYRotOfflineSgn->Sumw2();
1092 hMassVsPtVsYRotBkg->Sumw2();
1093 hMassVsPtVsYRotOfflineBkg->Sumw2();
1094 hMassVsPtVsYRot->SetMinimum(0);
1095 hMassVsPtVsYRotOffline->SetMinimum(0);
1096 hMassVsPtVsYRotSgn->SetMinimum(0);
1097 hMassVsPtVsYRotOfflineSgn->SetMinimum(0);
1098 hMassVsPtVsYRotBkg->SetMinimum(0);
1099 hMassVsPtVsYRotOfflineBkg->SetMinimum(0);
1100
1101 fOutputPIDBachTR->Add(hMassVsPtVsYRot);
1102 fOutputPIDBachTR->Add(hMassVsPtVsYRotOffline);
1103 fOutputPIDBachTR->Add(hMassVsPtVsYRotSgn);
1104 fOutputPIDBachTR->Add(hMassVsPtVsYRotOfflineSgn);
1105 fOutputPIDBachTR->Add(hMassVsPtVsYRotBkg);
1106 fOutputPIDBachTR->Add(hMassVsPtVsYRotOfflineBkg);
1107
1108
1109 TH1F *hDeltaMass=new TH1F("hDeltaMass","",100,-0.4,0.4);
1110 TH1F *hDeltaMassOffline=new TH1F("hDeltaMassOffline","",100,-0.4,0.4);
1111 TH1F *hDeltaMassSgn=new TH1F("hDeltaMassSgn","",100,-0.4,0.4);
1112 TH1F *hDeltaMassOfflineSgn=new TH1F("hDeltaMassOfflineSgn","",100,-0.4,0.4);
1113 TH1F *hDeltaMassBkg=new TH1F("hDeltaMassBkg","",100,-0.4,0.4);
1114 TH1F *hDeltaMassOfflineBkg=new TH1F("hDeltaMassOfflineBkg","",100,-0.4,0.4);
1115 hDeltaMass->Sumw2();
1116 hDeltaMassOffline->Sumw2();
1117 hDeltaMassSgn->Sumw2();
1118 hDeltaMassOfflineSgn->Sumw2();
1119 hDeltaMassBkg->Sumw2();
1120 hDeltaMassOfflineBkg->Sumw2();
1121
1122 hDeltaMass->SetMinimum(0);
1123 hDeltaMassOffline->SetMinimum(0);
1124 hDeltaMassSgn->SetMinimum(0);
1125 hDeltaMassOfflineSgn->SetMinimum(0);
1126 hDeltaMassBkg->SetMinimum(0);
1127 hDeltaMassOfflineBkg->SetMinimum(0);
1128
1129 fOutputPIDBachTR->Add(hDeltaMass);
1130 fOutputPIDBachTR->Add(hDeltaMassOffline);
1131 fOutputPIDBachTR->Add(hDeltaMassSgn);
1132 fOutputPIDBachTR->Add(hDeltaMassOfflineSgn);
1133 fOutputPIDBachTR->Add(hDeltaMassBkg);
1134 fOutputPIDBachTR->Add(hDeltaMassOfflineBkg);
1135
1136 /*
1137 Int_t binSparseDMassRot[5]={nMassBins,100,24,40,20};
1138 Double_t edgeLowSparseDMassRot[5]={fMinMass,-0.4,0.,-4.,0};
1139 Double_t edgeHighSparseDMassRot[5]={maxm,0.4,12.,4.,3.14};
1140 THnSparse *hDeltaMassFullAnalysis=new THnSparseF("hDeltaMassFullAnalysis","hDeltaMassFullAnalysis;inv mass (GeV/c);#Delta inv mass (GeV/c) ; p_{T}^{#Lambda_{c}} (GeV/c); #Delta p_{T} (GeV/c); daughter angle (2prongs) (rad);",5,binSparseDMassRot,edgeLowSparseDMassRot,edgeHighSparseDMassRot);
1141 THnSparse *hDeltaMassFullAnalysisOffline=new THnSparseF("fDeltaMassFullAnalysisOffline","hDeltaMassFullAnalysisOffline;inv mass (GeV/c);#Delta inv mass (GeV/c) ; p_{T}^{#Lambda_{c}} (GeV/c); #Delta p_{T} (GeV/c); daughter angle (2prongs) (rad);",5,binSparseDMassRot,edgeLowSparseDMassRot,edgeHighSparseDMassRot);
1142
1143 THnSparse *hDeltaMassFullAnalysisSgn=new THnSparseF("hDeltaMassFullAnalysisSgn","hDeltaMassFullAnalysisSgn;inv mass (GeV/c);#Delta inv mass (GeV/c) ; p_{T}^{#Lambda_{c}} (GeV/c); #Delta p_{T} (GeV/c); daughter angle (2prongs) (rad);",5,binSparseDMassRot,edgeLowSparseDMassRot,edgeHighSparseDMassRot);
1144 THnSparse *hDeltaMassFullAnalysisOfflineSgn=new THnSparseF("fDeltaMassFullAnalysisOfflineSgn","hDeltaMassFullAnalysisOfflineSgn;inv mass (GeV/c);#Delta inv mass (GeV/c) ; p_{T}^{#Lambda_{c}} (GeV/c); #Delta p_{T} (GeV/c); daughter angle (2prongs) (rad);",5,binSparseDMassRot,edgeLowSparseDMassRot,edgeHighSparseDMassRot);
1145
1146 THnSparse *hDeltaMassFullAnalysisBkg=new THnSparseF("hDeltaMassFullAnalysisBkg","hDeltaMassFullAnalysisBkg;inv mass (GeV/c);#Delta inv mass (GeV/c) ; p_{T}^{#Lambda_{c}} (GeV/c); #Delta p_{T} (GeV/c); daughter angle (2prongs) (rad);",5,binSparseDMassRot,edgeLowSparseDMassRot,edgeHighSparseDMassRot);
1147 THnSparse *hDeltaMassFullAnalysisOfflineBkg=new THnSparseF("fDeltaMassFullAnalysisOfflineBkg","hDeltaMassFullAnalysisOfflineBkg;inv mass (GeV/c);#Delta inv mass (GeV/c) ; p_{T}^{#Lambda_{c}} (GeV/c); #Delta p_{T} (GeV/c); daughter angle (2prongs) (rad);",5,binSparseDMassRot,edgeLowSparseDMassRot,edgeHighSparseDMassRot);
1148
1149 fOutputPIDBachTR->Add(hDeltaMassFullAnalysis);
1150 fOutputPIDBachTR->Add(hDeltaMassFullAnalysisOffline);
1151 fOutputPIDBachTR->Add(hDeltaMassFullAnalysisSgn);
1152 fOutputPIDBachTR->Add(hDeltaMassFullAnalysisOfflineSgn);
1153 fOutputPIDBachTR->Add(hDeltaMassFullAnalysisBkg);
1154 fOutputPIDBachTR->Add(hDeltaMassFullAnalysisOfflineBkg);
1155 */
43c7bace 1156 }
1157
1158 return;
1159}
1160
1161//---------------------------
1162void AliAnalysisTaskSELc2V0bachelor::CheckEventSelection(AliAODEvent *aodEvent) {
1163 //
1164 // To fill control histograms
1165 //
1166
1167 TClonesArray *arrayLctopKos=0;
14666b78 1168 if (!aodEvent){
1169 if(AODEvent() && IsStandardAOD()) {
1170 // In case there is an AOD handler writing a standard AOD, use the AOD
1171 // event in memory rather than the input (ESD) event.
1172 aodEvent = dynamic_cast<AliAODEvent*> (AODEvent());
1173 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
1174 // have to taken from the AOD event hold by the AliAODExtension
1175 AliAODHandler* aodHandler = (AliAODHandler*)
1176 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
1177
1178 if (aodHandler->GetExtensions()) {
1179 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
1180 AliAODEvent *aodFromExt = ext->GetAOD();
1181 arrayLctopKos=(TClonesArray*)aodFromExt->GetList()->FindObject("CascadesHF");
1182 }
43c7bace 1183 }
1184 } else {
1185 arrayLctopKos=(TClonesArray*)aodEvent->GetList()->FindObject("CascadesHF");
1186 }
1187
1188 Float_t zVertex = fVtx1->GetZ();
1189 TString titleVtx=fVtx1->GetTitle();
1190
1191 if (TMath::Abs(fBzkG)>=0.001) {
1192
1193 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ2")))->Fill(zVertex);
1194
1195 if (arrayLctopKos) {
1196
1197 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ3")))->Fill(zVertex);
1198
1199 // mc analysis
1200 TClonesArray *mcArray = 0;
1201 AliAODMCHeader *mcHeader=0;
1202
1203 if (fUseMCInfo) {
1204 // MC array need for maching
1205 mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
43c7bace 1206
1207 if (mcArray) {
1208 // load MC header
14666b78 1209 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ4")))->Fill(zVertex);
43c7bace 1210 mcHeader = (AliAODMCHeader*)aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName());
14666b78 1211
1212 if (mcHeader && fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ5")))->Fill(zVertex);
43c7bace 1213
1214 // check on MC Lc Daughter
1215 if (fAdditionalChecks) {
1216 for (Int_t iii=0; iii<mcArray->GetEntries(); iii++)
1217 SearchLcDaughter(mcArray,iii);
1218 }
1219
1220 }
1221
1222 }
1223
1224 if (fVtx1->GetNContributors()>0) {
1225 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ6")))->Fill(zVertex);
1226
1227 TString firedTriggerClasses = aodEvent->GetFiredTriggerClasses(); // trigger class
1228 ULong64_t fTriggerMask=AliVEvent::kAnyINT;
1229 Bool_t check1 = kFALSE;
1230 if ( !fUseMCInfo && // don't do for MC...
1231 (aodEvent->GetRunNumber()<136851 || aodEvent->GetRunNumber()>139517) ) { // ...and for PbPb 2010 data
1232 if ( !(firedTriggerClasses.Contains("CINT1")) ) {
1233 AliInfo(Form(" ======================== firedTriggerClasses.Data() = %s",firedTriggerClasses.Data()));
1234 fCEvents->Fill(8);
1235 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ8")))->Fill(zVertex);
1236 check1 = kTRUE;
1237 }
1238 }
1239
1240 Bool_t isSelectedAAA = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
1241 if (!isSelectedAAA) {
1242 fCEvents->Fill(9);
1243 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ9")))->Fill(zVertex);
1244 }
1245
1246 if (!isSelectedAAA || check1) {
1247 fCEvents->Fill(16);
1248 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ16")))->Fill(zVertex);
1249 }
1250
1251 fTriggerMask=AliVEvent::kAny;
1252 Bool_t isSelectedBBB = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
1253 if (!isSelectedBBB) {
1254 fCEvents->Fill(10);
1255 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ10")))->Fill(zVertex);
1256 }
1257
1258 if (titleVtx.Contains("Z")) {
1259 fCEvents->Fill(11);
1260 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ11")))->Fill(zVertex);
1261 }
1262 else if (titleVtx.Contains("3D")) {
1263 fCEvents->Fill(12);
1264 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ12")))->Fill(zVertex);
1265 } else {
1266 fCEvents->Fill(13);
1267 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ13")))->Fill(zVertex);
1268 }
1269
1270 if (TMath::Abs(zVertex)<=fAnalCuts->GetMaxVtxZ()) {
1271 fCEvents->Fill(14);
1272 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ14")))->Fill(zVertex);
1273 }
1274
1275 if ( fIsEventSelected ) {
1276 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ7")))->Fill(zVertex);
1277 } else {
1278 fCEvents->Fill(15);
1279 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ15")))->Fill(zVertex);
1280 }
1281
1282 } // nContributors>=1
1283 } // analysisArray exists
1284 } // magnetic field exists
1285
1286 return;
1287}
1288
1289//-----------------
1290void AliAnalysisTaskSELc2V0bachelor::CheckEventSelectionWithCandidates(AliAODEvent *aodEvent) {
1291 //
1292 // To fill control histograms
1293 //
1294
1295 Float_t zVertex = fVtx1->GetZ();
1296 TString titleVtx=fVtx1->GetTitle();
1297 TString firedTriggerClasses = aodEvent->GetFiredTriggerClasses(); // trigger class
1298 ULong64_t fTriggerMask=AliVEvent::kAnyINT;
1299
1300 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(6);
1301 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ6a")))->Fill(zVertex);
1302
1303 Bool_t check1a = kFALSE;
1304 if ( !fUseMCInfo && // don't do for MC...
1305 (aodEvent->GetRunNumber()<136851 || aodEvent->GetRunNumber()>139517) ) { // ...and for PbPb 2010 data
1306 if ( !(firedTriggerClasses.Contains("CINT1")) ) {
1307 AliInfo(Form(" ======================== firedTriggerClasses.Data() = %s",firedTriggerClasses.Data()));
1308 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(8);
1309 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ8a")))->Fill(zVertex);
1310 check1a = kTRUE;
1311 }
1312 }
1313
1314 Bool_t isSelectedAAAa = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
1315 if (!isSelectedAAAa) {
1316 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(9);
1317 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ9a")))->Fill(zVertex);
1318 }
1319
1320 if (!isSelectedAAAa || check1a) {
1321 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(16);
1322 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ16a")))->Fill(zVertex);
1323 }
1324
1325 fTriggerMask=AliVEvent::kAny;
1326 Bool_t isSelectedBBBa = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
1327 if (!isSelectedBBBa) {
1328 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(10);
1329 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ10a")))->Fill(zVertex);
1330 }
1331
1332 if (titleVtx.Contains("Z")) {
1333 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(11);
1334 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ11a")))->Fill(zVertex);
1335 }
1336 else if (titleVtx.Contains("3D")) {
1337 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(12);
1338 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ12a")))->Fill(zVertex);
1339 } else {
1340 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(13);
1341 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ13a")))->Fill(zVertex);
1342 }
1343
1344 if (TMath::Abs(zVertex)<=fAnalCuts->GetMaxVtxZ()) {
1345 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(14);
1346 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ14a")))->Fill(zVertex);
1347 }
1348
1349 if ( fIsEventSelected ) {
1350 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(7);
1351 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ7a")))->Fill(zVertex);
1352 } else {
1353 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(15);
1354 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ15a")))->Fill(zVertex);
1355 }
1356
1357 return;
1358}
1359
1360//-----------------------------
1361Int_t AliAnalysisTaskSELc2V0bachelor::MatchToMC(AliAODRecoCascadeHF *lc2bacV0,
1362 Int_t *pdgDgLc2bacV0, Int_t *pdgDgV0,
1363 TClonesArray *mcArray) {
1364 //
1365 // This is now implemented in AliAODRecoCascadeHF
1366 //
1367
1368 // bachelor
1369 AliAODTrack *bachelor = (AliAODTrack*)lc2bacV0->GetBachelor();
1370 if (!bachelor) return -1;
1371 Int_t labBachelor = TMath::Abs(bachelor->GetLabel());
1372 if (labBachelor<0) return -1;
1373 AliAODMCParticle *partBachelor = (AliAODMCParticle*)mcArray->At(labBachelor);
1374 if (!partBachelor) return -1;
1375 if (TMath::Abs(partBachelor->GetPdgCode())!=pdgDgLc2bacV0[0]) return -1;
1376
1377 Int_t labBacMother = partBachelor->GetMother();
1378 if (labBacMother<0) return -1;
1379 AliAODMCParticle *partBacMother = (AliAODMCParticle*)mcArray->At(labBacMother);
1380 if (!partBacMother) return -1;
1381 if (TMath::Abs(partBacMother->GetPdgCode())!=4122) return -1;
1382
1383 // V0
1384 AliAODTrack *posV0Daugh = (AliAODTrack*)lc2bacV0->Getv0PositiveTrack();
1385 AliAODTrack *negV0Daugh = (AliAODTrack*)lc2bacV0->Getv0NegativeTrack();
1386 if (!posV0Daugh || !negV0Daugh) return -1;
1387
1388 Int_t labV0pos = TMath::Abs(posV0Daugh->GetLabel());
1389 Int_t labV0neg = TMath::Abs(negV0Daugh->GetLabel());
992ba7d8 1390 if (labV0pos<0 || labV0neg<0) return -1;
85036182 1391
992ba7d8 1392 AliAODMCParticle *partV0pos = (AliAODMCParticle*)mcArray->At(labV0neg);
1393 AliAODMCParticle *partV0neg = (AliAODMCParticle*)mcArray->At(labV0pos);
85036182 1394 if (!partV0pos || !partV0neg) return -1;
992ba7d8 1395
1396 if ( ! ( (TMath::Abs(partV0pos->GetPdgCode())==pdgDgV0[0] &&
1397 TMath::Abs(partV0neg->GetPdgCode())==pdgDgV0[1]) ||
1398 (TMath::Abs(partV0pos->GetPdgCode())==pdgDgV0[1] &&
1399 TMath::Abs(partV0neg->GetPdgCode())==pdgDgV0[0]) ) ) return -1;
1400 Int_t labV0posMother = partV0pos->GetMother();
1401 Int_t labV0negMother = partV0neg->GetMother();
1402
1403 if (labV0posMother<0 || labV0negMother<0) return -1;
1404 if (labV0posMother!=labV0negMother) return -1;
1405
1406 AliAODMCParticle *motherV0 = (AliAODMCParticle*)mcArray->At(labV0posMother);
85036182 1407 if (!motherV0) return-1;
992ba7d8 1408
1409 if (TMath::Abs(motherV0->GetPdgCode())!=pdgDgLc2bacV0[1]) return -1;
1410 Int_t labV0mother = motherV0->GetMother();
1411 if (labV0mother<0) return -1;
1412 AliAODMCParticle *gMotherV0 = (AliAODMCParticle*)mcArray->At(labV0mother);
85036182 1413 if (!gMotherV0) return-1;
992ba7d8 1414
1415 if ( !(pdgDgLc2bacV0[1]==310 && TMath::Abs(gMotherV0->GetPdgCode())==311) &&
1416 !(pdgDgLc2bacV0[1]==3122 && TMath::Abs(motherV0->GetPdgCode())==3122) ) return -1;
1417
1418 if ( (pdgDgLc2bacV0[1]==310 && TMath::Abs(gMotherV0->GetPdgCode())==311) ) {
1419 Int_t labV0GMother = gMotherV0->GetMother();
1420 if (labV0GMother<0) return -1;
1421 AliAODMCParticle *ggMotherV0 = (AliAODMCParticle*)mcArray->At(labV0GMother);
85036182 1422 if (!ggMotherV0) return-1;
992ba7d8 1423
1424 if (TMath::Abs(ggMotherV0->GetPdgCode())!=4122) return -1;
1425 gMotherV0 = (AliAODMCParticle*)ggMotherV0;
1426 labV0mother=labV0GMother;
1427 }
1428 else if (pdgDgLc2bacV0[1]==3122 && TMath::Abs(motherV0->GetPdgCode())==3122) {
1429 if (TMath::Abs(gMotherV0->GetPdgCode())!=4122) return -1;
1430 }
1431
1432 if (labBacMother!=labV0mother) {
992ba7d8 1433 return -1;
1434 }
1435
43c7bace 1436 return labBacMother;
992ba7d8 1437
1438}
1439
ff12b981 1440//________________________________________________________________
43c7bace 1441Int_t AliAnalysisTaskSELc2V0bachelor::SearchLcDaughter(TClonesArray *arrayMC, Int_t iii) {
1442 //
1443 // This is to check Lc dinasty
1444 //
ff12b981 1445
1446 Int_t indexToBeReturned=-999;
1447
1448 Int_t pdgLc=4122;
1449 Int_t pdgLambda=3122;
1450 Int_t pdgV0=310;
1451 Int_t pdgK0=311;
1452 Int_t pdgBachelor=2212;
1453 Int_t pdgBachelorPi=211;
992ba7d8 1454
1455 TString fillthis="";
1456 fillthis="histMcStatLc";
1457
ff12b981 1458 AliAODMCParticle *searchLc = dynamic_cast<AliAODMCParticle*>(arrayMC->At(iii));
4184976e 1459 if(!searchLc) return -999;
ff12b981 1460 if (TMath::Abs(searchLc->GetPdgCode()) != pdgLc) return -999;
1461
1462 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(0);
1463 indexToBeReturned = 0;
1464
1465 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*1);
1466 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*1;
1467
1468 Int_t nDaughLc = searchLc->GetNDaughters();
1469 if (nDaughLc!=2) {
1470 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*10);
1471 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*10;
1472 return indexToBeReturned;
1473 }
1474
1475 Int_t index1=searchLc->GetDaughter(0);
1476 Int_t index2=searchLc->GetDaughter(1);
1477 if (index1<=0 || index2<=0) {
1478 return -999;
1479 }
1480
1481 AliAODMCParticle *daugh1 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(index1));
1482 AliAODMCParticle *daugh2 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(index2));
1483 if (!daugh1 || !daugh2) return -999;
1484
1485 Int_t daughPdg1 = TMath::Abs(daugh1->GetPdgCode());
1486 Int_t daughPdg2 = TMath::Abs(daugh2->GetPdgCode());
1487 if ( !( (daughPdg1==pdgBachelor && daughPdg2==pdgK0) ||
1488 (daughPdg2==pdgBachelor && daughPdg1==pdgK0) ||
1489 (daughPdg1==pdgLambda && daughPdg2==pdgBachelorPi) ||
1490 (daughPdg2==pdgLambda && daughPdg1==pdgBachelorPi) ) ) {
1491 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*10);
1492 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*10;
1493 return indexToBeReturned;
1494 }
1495
1496 if (daughPdg1==pdgK0 || daughPdg1==pdgLambda) {
1497 index1=searchLc->GetDaughter(1);
1498 index2=searchLc->GetDaughter(0);
1499 }
1500 daugh1 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(index1));
1501 daugh2 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(index2));
4184976e 1502 if (!daugh1 || !daugh2) return -999;
1503
ff12b981 1504 daughPdg1=TMath::Abs(daugh1->GetPdgCode());
1505 daughPdg2=TMath::Abs(daugh2->GetPdgCode());
1506
1507 if ( daughPdg1==pdgBachelor && daughPdg2==pdgK0 ) { // Lc+ -> p K0bar
1508
1509 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*2);
1510 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*2;
1511
1512 Int_t nDaughK0 = daugh2->GetNDaughters();
1513 if (nDaughK0!=1) return -999;
1514
1515 Int_t indexK0daugh=daugh2->GetDaughter(0);
1516 if (indexK0daugh<=0) return -999;
1517
1518 AliAODMCParticle *daughK0 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(indexK0daugh));
1519 if (!daughK0) return -999;
1520
1521 Int_t daughK0Pdg=TMath::Abs(daughK0->GetPdgCode());
1522 if (daughK0Pdg!=pdgV0) {
1523 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*4); // K0L
1524 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*4;
1525 return indexToBeReturned;
1526 }
1527 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*3); // K0S
1528 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*3;
1529
1530 Int_t nDaughK0S = daughK0->GetNDaughters();
1531 if (nDaughK0S!=2) {
1532 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*5); // other decays for K0S
1533 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*5;
1534 return indexToBeReturned;
1535 }
1536
1537 index1=daughK0->GetDaughter(0);
1538 index2=daughK0->GetDaughter(1);
1539 if(index1<=0 || index2<=0) {
1540 return -999;
1541 }
1542
43c7bace 1543 AliAODMCParticle *daughK0S1 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(index1));
1544 AliAODMCParticle *daughK0S2 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(index2));
1545 if (!daughK0S1 || !daughK0S2) return -999;
ff12b981 1546
43c7bace 1547 Int_t daughK0S1pdg=TMath::Abs(daughK0S1->GetPdgCode());
1548 Int_t daughK0S2pdg=TMath::Abs(daughK0S2->GetPdgCode());
ff12b981 1549
43c7bace 1550 if ( daughK0S1pdg==211 && daughK0S2pdg==211 ) {
ff12b981 1551 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*6); // K0S -> pi+ pi-
1552 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*6;
1553 } else {
1554 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*5); // other decays for K0S
43c7bace 1555 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*5;
ff12b981 1556 }
1557
1558 } //if (daughPdg1==pdgBachelor && daughPdg2==pdgK0)
1559 else if ( daughPdg1==pdgBachelorPi && daughPdg2==pdgLambda ) { // Lc+ -> pi+ Lambda
1560
1561 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*7);
1562 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*7;
992ba7d8 1563
ff12b981 1564 Int_t nDaughL = daugh2->GetNDaughters();
1565 if (nDaughL!=2) {
1566 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*8);
1567 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*8;
1568 return indexToBeReturned;
1569 }
1570
1571 index1=daugh2->GetDaughter(0);
1572 index2=daugh2->GetDaughter(1);
1573 if(index1<=0 || index2<=0) {
1574 return -999;
1575 }
1576
1577 AliAODMCParticle *daughL1 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(index1));
1578 AliAODMCParticle *daughL2 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(index2));
1579 if (!daughL1 || !daughL2) return -999;
1580
1581 Int_t daughL1pdg=TMath::Abs(daughL1->GetPdgCode());
1582 Int_t daughL2pdg=TMath::Abs(daughL2->GetPdgCode());
1583 if ( (daughL1pdg==211 && daughL2pdg==2212) ||
1584 (daughL2pdg==211 && daughL1pdg==2212) ) {
1585 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*9);
1586 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*9;
1587 } else {
1588 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*8);
1589 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*8;
1590 }
1591
1592 } //else if (daughPdg1==pdgBachelorPi && daughPdg2==pdgLambda)
1593
1594 return indexToBeReturned;
ff12b981 1595}
43c7bace 1596
ff12b981 1597//________________________________________________________________
992ba7d8 1598void AliAnalysisTaskSELc2V0bachelor::FillArmPodDistribution(AliAODv0 *vZero,
43c7bace 1599 TString histoTitle,
1600 TList *histoList) {
1601 //
1602 // This is to fill Armenteros Podolanski plots
1603 //
992ba7d8 1604
1605 Double_t alpha = vZero->AlphaV0();
1606 Double_t qT = vZero->PtArmV0();
1607
1608 ((TH2F*)(histoList->FindObject(histoTitle)))->Fill(alpha,qT);
1609
1610}
992ba7d8 1611
43c7bace 1612//-------------------------------------------------------------------------------
1613void AliAnalysisTaskSELc2V0bachelor::CheckCandidatesAtDifferentLevels(AliAODRecoCascadeHF *part, AliRDHFCutsLctoV0* cutsAnal) {
1614 //
1615 // This is to check candidates at different levels
1616 //
992ba7d8 1617
43c7bace 1618 Bool_t areCutsUsingPID = cutsAnal->GetIsUsePID();
992ba7d8 1619
43c7bace 1620 AliAODv0 * v0part = (AliAODv0*)part->Getv0();
1621 Bool_t onFlyV0 = v0part->GetOnFlyStatus(); // on-the-flight V0s
0dbd1d4f 1622
43c7bace 1623 AliAODTrack *bachelor = (AliAODTrack*)part->GetBachelor();
0dbd1d4f 1624
43c7bace 1625 if ( !onFlyV0 )
1626 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(3); // it counts number of candidates coming from offline V0s
a578b2da 1627
43c7bace 1628 if ( cutsAnal->IsInFiducialAcceptance(part->Pt(),part->Y(4122)) )
1629 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(4);
1630 if ( (((cutsAnal->IsSelected(part,AliRDHFCuts::kTracks))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)) )
1631 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(5);
1632 cutsAnal->SetUsePID(kFALSE);
1633 if ( (((cutsAnal->IsSelected(part,AliRDHFCuts::kCandidate))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)) )
1634 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(6);
1635 cutsAnal->SetUsePID(areCutsUsingPID);
1636 if ( (((cutsAnal->IsSelected(part,AliRDHFCuts::kPID))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)) )
1637 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(7);
1638 if ( (((cutsAnal->IsSelected(part,AliRDHFCuts::kCandidate))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)) )
1639 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(8);
1640 if ( (((cutsAnal->IsSelected(part,AliRDHFCuts::kAll))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)) )
1641 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(9);
a578b2da 1642
43c7bace 1643 if ( cutsAnal->IsInFiducialAcceptance(part->Pt(),part->Y(4122)) ) {
0dbd1d4f 1644
43c7bace 1645 if ( ( (cutsAnal->IsSelected(part,AliRDHFCuts::kTracks))&(AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) {
a578b2da 1646
43c7bace 1647 Int_t aaa = cutsAnal->IsSelected(part,AliRDHFCuts::kTracks);
1648 if ( (aaa&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr ) {
1649 if ( ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi && bachelor->Charge()==-1) ||
1650 ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi && bachelor->Charge()==+1) )
1651 ((TH1F*)(fOutput->FindObject("hSwitchOnCandidates1")))->Fill( -aaa );
1652 else
1653 ((TH1F*)(fOutput->FindObject("hSwitchOnCandidates1")))->Fill( aaa );
1654 }
0dbd1d4f 1655
43c7bace 1656 cutsAnal->SetUsePID(kFALSE);
1657 aaa = cutsAnal->IsSelected(part,AliRDHFCuts::kCandidate);
1658 if ((aaa&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr) {
1659 if ( ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi && bachelor->Charge()==-1) ||
1660 ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi && bachelor->Charge()==+1) )
1661 ((TH1F*)(fOutput->FindObject("hSwitchOnCandidates2")))->Fill( -aaa );
1662 else
1663 ((TH1F*)(fOutput->FindObject("hSwitchOnCandidates2")))->Fill( aaa );
1664 }
1665 cutsAnal->SetUsePID(areCutsUsingPID);
1666
1667 aaa = cutsAnal->IsSelected(part,AliRDHFCuts::kPID);
1668 if ((aaa&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr) {
1669 if ( ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi && bachelor->Charge()==-1) ||
1670 ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi && bachelor->Charge()==+1) )
1671 ((TH1F*)(fOutput->FindObject("hSwitchOnCandidates3")))->Fill( -aaa );
1672 else
1673 ((TH1F*)(fOutput->FindObject("hSwitchOnCandidates3")))->Fill( aaa );
1674 }
0dbd1d4f 1675
43c7bace 1676 aaa = cutsAnal->IsSelected(part,AliRDHFCuts::kAll);
1677 if ((aaa&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr) {
1678 if ( ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi && bachelor->Charge()==-1) ||
1679 ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi && bachelor->Charge()==+1) )
1680 ((TH1F*)(fOutput->FindObject("hSwitchOnCandidates4")))->Fill( -aaa );
1681 else
1682 ((TH1F*)(fOutput->FindObject("hSwitchOnCandidates4")))->Fill( aaa );
1683 }
0dbd1d4f 1684
43c7bace 1685 }
1686 }
0dbd1d4f 1687
43c7bace 1688 return;
1689}
0dbd1d4f 1690
43c7bace 1691//-------------------------------------------------------------------------------
1692void AliAnalysisTaskSELc2V0bachelor::FillTheTree(AliAODRecoCascadeHF *part, AliRDHFCutsLctoV0 *cutsAnal, TClonesArray *mcArray, Int_t isLc) {
1693 //
1694 // This is to fill tree
1695 //
992ba7d8 1696
43c7bace 1697 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
1698 Double_t mLPDG = TDatabasePDG::Instance()->GetParticle(3122)->Mass();
992ba7d8 1699
43c7bace 1700 Double_t invmassLc = part->InvMassLctoK0sP();
1701 Double_t invmassLc2Lpi = part->InvMassLctoLambdaPi();
992ba7d8 1702
43c7bace 1703 AliAODTrack *bachelor = (AliAODTrack*)part->GetBachelor();
992ba7d8 1704
43c7bace 1705 AliAODv0 * v0part = (AliAODv0*)part->Getv0();
1706 Double_t dcaV0ptp = v0part->GetDCA();
1707 Double_t invmassK0S = v0part->MassK0Short();
1708 Double_t invmassLambda = v0part->MassLambda();
1709 Double_t invmassLambdaBar = v0part->MassAntiLambda();
0dbd1d4f 1710
43c7bace 1711 Int_t isLc2LBarpi=0, isLc2Lpi=0;
1712 Int_t mcLabel = -1;
1713 Int_t isDp2K0Spi=0, isDs2K0SK=0;
1714 Int_t mcLabel2 = -1;
1715 Int_t mcLabel3 = -1;
14fe9f43 1716 Int_t isKstar12K0Spi=0, isKstar22K0Spi=0;
1717 Int_t mcLabel4 = -1;
1718 Int_t mcLabel5 = -1;
53c91ed7 1719 Double_t ptCandByMC = 0.;//fmcPartCandidate->Pt();
1720 Double_t yCandByMC = 0.;//fmcPartCandidate->Y() ;
43c7bace 1721 if (fUseMCInfo) {
53c91ed7 1722 if (isLc) {
1723 Int_t pdgCand0 = 4122;
1724 Int_t pdgDgLctoV0bachelor0[2]={2212,310};
1725 Int_t pdgDgV0toDaughters0[2]={211,211};
1726 Int_t mcLabelLc2pK0S = part->MatchToMC(pdgCand0,pdgDgLctoV0bachelor0[1],pdgDgLctoV0bachelor0,pdgDgV0toDaughters0,mcArray,kTRUE);
1727 AliAODMCParticle *lambdaCpartMC = (AliAODMCParticle*)mcArray->At(mcLabelLc2pK0S);
1728 if (lambdaCpartMC) {
1729 ptCandByMC = lambdaCpartMC->Pt();
1730 yCandByMC = lambdaCpartMC->Y() ;
1731 }
1732 }
1733
43c7bace 1734 Int_t pdgCand = 4122;
1735 Int_t pdgDgLctoV0bachelor[2]={211,3122};
1736 Int_t pdgDgV0toDaughters[2]={2212,211};
1737 mcLabel = part->MatchToMC(pdgCand,pdgDgLctoV0bachelor[1],pdgDgLctoV0bachelor,pdgDgV0toDaughters,mcArray,kTRUE);
1738 if (mcLabel!=-1) {
1739 if (bachelor->Charge()==-1) isLc2LBarpi=1;
1740 if (bachelor->Charge()==+1) isLc2Lpi=1;
53c91ed7 1741 AliAODMCParticle *lambdaCpartMC = (AliAODMCParticle*)mcArray->At(mcLabel);
1742 if (lambdaCpartMC) {
1743 ptCandByMC = lambdaCpartMC->Pt();
1744 yCandByMC = lambdaCpartMC->Y() ;
1745 }
43c7bace 1746 }
0dbd1d4f 1747
43c7bace 1748 Int_t pdgCand2 = 411; // D+ -> pi+ K0S
1749 Int_t pdgCand3 = 431; // Ds+ -> K+ K0S
1750 Int_t pdgDgCand2[2]={211,310};
1751 Int_t pdgDgCand3[2]={321,310};
1752 pdgDgV0toDaughters[0]=211;
1753 pdgDgV0toDaughters[1]=211;
1754 mcLabel2 = part->MatchToMC(pdgCand2,pdgDgCand2[1],pdgDgCand2,pdgDgV0toDaughters,mcArray,kTRUE);
1755 mcLabel3 = part->MatchToMC(pdgCand3,pdgDgCand3[1],pdgDgCand3,pdgDgV0toDaughters,mcArray,kTRUE);
53c91ed7 1756 if (mcLabel2!=-1) {
1757 isDp2K0Spi=1;
1758 AliAODMCParticle *lambdaCpartMC = (AliAODMCParticle*)mcArray->At(mcLabel2);
1759 if (lambdaCpartMC) {
1760 ptCandByMC = lambdaCpartMC->Pt();
1761 yCandByMC = lambdaCpartMC->Y() ;
1762 }
1763 }
1764 if (mcLabel3!=-1) {
1765 isDs2K0SK=1;
1766 AliAODMCParticle *lambdaCpartMC = (AliAODMCParticle*)mcArray->At(mcLabel3);
1767 if (lambdaCpartMC) {
1768 ptCandByMC = lambdaCpartMC->Pt();
1769 yCandByMC = lambdaCpartMC->Y() ;
1770 }
1771 }
14fe9f43 1772
1773 Int_t pdgCand4 = 313; // K*(892)+ -> pi+ K0S
1774 Int_t pdgCand5 = 325; // K*(1430)+ -> pi+ K0S
1775 Int_t pdgDgCand4[2]={211,310};
1776 Int_t pdgDgCand5[2]={211,310};
1777 pdgDgV0toDaughters[0]=211;
1778 pdgDgV0toDaughters[1]=211;
1779 mcLabel4 = part->MatchToMC(pdgCand4,pdgDgCand4[1],pdgDgCand4,pdgDgV0toDaughters,mcArray,kTRUE);
1780 mcLabel5 = part->MatchToMC(pdgCand5,pdgDgCand5[1],pdgDgCand5,pdgDgV0toDaughters,mcArray,kTRUE);
1781 if (mcLabel4!=-1) {
1782 isKstar12K0Spi=1;
1783 AliAODMCParticle *lambdaCpartMC = (AliAODMCParticle*)mcArray->At(mcLabel4);
1784 if (lambdaCpartMC) {
1785 ptCandByMC = lambdaCpartMC->Pt();
1786 yCandByMC = lambdaCpartMC->Y() ;
1787 }
1788 }
1789 if (mcLabel5!=-1) {
1790 isKstar22K0Spi=1;
1791 AliAODMCParticle *lambdaCpartMC = (AliAODMCParticle*)mcArray->At(mcLabel5);
1792 if (lambdaCpartMC) {
1793 ptCandByMC = lambdaCpartMC->Pt();
1794 yCandByMC = lambdaCpartMC->Y() ;
1795 }
1796 }
43c7bace 1797 }
992ba7d8 1798
14fe9f43 1799 Int_t isLcByMC = isLc+isLc2LBarpi*2+isLc2Lpi*4+isDp2K0Spi*8+isDs2K0SK*16+isKstar12K0Spi*32+isKstar22K0Spi*64;
a578b2da 1800
53c91ed7 1801 Bool_t isMCparticleInFiducialAcceptance = kTRUE;
14fe9f43 1802 if (isLc || isLc2LBarpi || isLc2Lpi || isDp2K0Spi || isDs2K0SK || isKstar12K0Spi || isKstar22K0Spi) {
53c91ed7 1803 isMCparticleInFiducialAcceptance = cutsAnal->IsInFiducialAcceptance(ptCandByMC,yCandByMC);
1804 }
1805
43c7bace 1806 Int_t isK0S = 0;
1807 Int_t isLambda = 0;
1808 Int_t isLambdaBar = 0;
1809 Int_t isGamma = 0;
1810 if (fUseMCInfo) {
1811 Int_t pdgDg2prong[2] = {211, 211};
1812 Int_t labelK0S = v0part->MatchToMC(310,mcArray,2,pdgDg2prong);
1813 if (labelK0S>=0) isK0S = 1;
992ba7d8 1814
43c7bace 1815 pdgDg2prong[0] = 211;
1816 pdgDg2prong[1] = 2212;
1817 Int_t lambdaLabel = v0part->MatchToMC(3122,mcArray,2,pdgDg2prong);
1818 if (lambdaLabel>=0) {
1819 AliAODMCParticle *lambdaTrack = (AliAODMCParticle*)mcArray->At(lambdaLabel);
1820 if (lambdaTrack->GetPdgCode()==3122) isLambda = 1;
1821 else if (lambdaTrack->GetPdgCode()==-3122) isLambdaBar = 1;
1822 }
992ba7d8 1823
43c7bace 1824 pdgDg2prong[0] = 11;
1825 pdgDg2prong[1] = 11;
1826 Int_t gammaLabel = v0part->MatchToMC(22,mcArray,2,pdgDg2prong);
1827 if (gammaLabel>=0) {
1828 AliAODMCParticle *gammaTrack = (AliAODMCParticle*)mcArray->At(gammaLabel);
1829 if (gammaTrack->GetPdgCode()==22) isGamma = 1;
1830 }
1831 }
992ba7d8 1832
43c7bace 1833 Int_t isV0ByMC = isK0S+isLambdaBar*2+isLambda*4+isGamma*8;
992ba7d8 1834
43c7bace 1835 Int_t isBachelorSelected = (bachelor->TestFilterMask(BIT(4)))*1 + (!(bachelor->TestFilterMask(BIT(4))))*2;
1836 isBachelorSelected += (bachelor->GetLabel()<0)*4 + (bachelor->GetLabel()>=0)*8;
1837 if ( ( !(bachelor->HasPointOnITSLayer(0)) && !(bachelor->HasPointOnITSLayer(1)) ) )
1838 isBachelorSelected += 16;
1839 else {
1840 if ( bachelor->HasPointOnITSLayer(0) && !(bachelor->HasPointOnITSLayer(1)) )
1841 isBachelorSelected += 32;
1842 else if ( !(bachelor->HasPointOnITSLayer(0)) && bachelor->HasPointOnITSLayer(1) )
1843 isBachelorSelected += 64;
1844 else
1845 isBachelorSelected += 128;
1846 }
992ba7d8 1847
43c7bace 1848 AliAODTrack *v0pos = (AliAODTrack*)part->Getv0PositiveTrack();
1849 AliAODTrack *v0neg = (AliAODTrack*)part->Getv0NegativeTrack();
992ba7d8 1850
43c7bace 1851 Int_t areV0daughtersSelected = (v0pos->TestFilterMask(BIT(4)))*1 + (!(v0pos->TestFilterMask(BIT(4))))*2;
1852 areV0daughtersSelected += (v0pos->GetLabel()<0)*4 + (v0pos->GetLabel()>=0)*8;
1853 areV0daughtersSelected += (v0neg->TestFilterMask(BIT(4)))*16 + (!(v0neg->TestFilterMask(BIT(4))))*32;
1854 areV0daughtersSelected += (v0neg->GetLabel()<0)*64 + (v0neg->GetLabel()>=0)*128;
992ba7d8 1855
43c7bace 1856 Double_t nSigmaITSpr=-999.;
1857 cutsAnal->GetPidHF()->GetnSigmaITS(bachelor,4,nSigmaITSpr);
1858 Double_t nSigmaTPCpr=-999.;
1859 cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,4,nSigmaTPCpr);
1860 Double_t nSigmaTOFpr=-999.;
1861 cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,4,nSigmaTOFpr);
1862
1863 Double_t nSigmaITSpi=-999.;
1864 cutsAnal->GetPidHF()->GetnSigmaITS(bachelor,2,nSigmaITSpi);
1865 Double_t nSigmaTPCpi=-999.;
1866 cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,2,nSigmaTPCpi);
1867 Double_t nSigmaTOFpi=-999.;
1868 cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,2,nSigmaTOFpi);
1869
1870 Double_t nSigmaITSka=-999.;
1871 cutsAnal->GetPidHF()->GetnSigmaITS(bachelor,3,nSigmaITSka);
1872 Double_t nSigmaTPCka=-999.;
1873 cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,3,nSigmaTPCka);
1874 Double_t nSigmaTOFka=-999.;
1875 cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,3,nSigmaTOFka);
992ba7d8 1876
43c7bace 1877
1878 Int_t flagToCheckCandidate = 1*(TMath::Abs(invmassK0S-mk0sPDG)<=0.050);
1879 flagToCheckCandidate+=2*((TMath::Abs(invmassLambdaBar-mLPDG)<=0.050) && (bachelor->Charge()==-1));
1880 flagToCheckCandidate+=4*((TMath::Abs(invmassLambda-mLPDG)<=0.050) && (bachelor->Charge()==+1));
1881 flagToCheckCandidate+=8*((TMath::Abs(invmassLambdaBar-mLPDG)<=0.050) && (bachelor->Charge()==+1));
1882 flagToCheckCandidate+=16*((TMath::Abs(invmassLambda-mLPDG)<=0.050) && (bachelor->Charge()==-1));
992ba7d8 1883
a578b2da 1884 /*
43c7bace 1885 Bool_t areCutsUsingPID = cutsAnal->GetIsUsePID();
1886 cutsAnal->SetUsePID(kFALSE);
1887 Int_t aaa = cutsAnal->IsSelected(part,AliRDHFCuts::kCandidate);
1888 if ( (aaa&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr ) {
1889 if ( aaa==AliRDHFCutsLctoV0::kLcToK0Spr ) {
1890 flagToCheckCandidate = aaa; // Lc->K0S+p OK
1891 } else {
1892 if ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi ) {
1893 if (bachelor->Charge()==+1)
1894 flagToCheckCandidate = aaa; // Lc->Lambda+pi+
1895 else if (bachelor->Charge()==-1)
1896 flagToCheckCandidate =-aaa; // Lambda+pi- AS Lc->K0S+p candidate
1897 }
1898 if ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi ) {
1899 if (bachelor->Charge()==-1)
1900 flagToCheckCandidate = aaa; // Lc->LambdaBar+pi-
1901 else if (bachelor->Charge()==+1)
1902 flagToCheckCandidate =-aaa; // LambdaBar+pi+ AS Lc->K0S+p candidate
1903 }
1904 }
1905 } else {
1906 //if ( aaa==AliRDHFCutsLctoV0::kLcToK0Spr ) {
1907 //flagToCheckCandidate = -10-(AliRDHFCutsLctoV0::kLcToK0Spr); // NEVER
1908 //} else {
1909 if ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi ) {
1910 if (bachelor->Charge()==+1)
1911 flagToCheckCandidate = aaa; // Lc->Lambda+pi+ OK
1912 else if (bachelor->Charge()==-1)
1913 flagToCheckCandidate =-aaa; // Lambda+pi- AS Lc->Lambda+pi+ candidate
1914 }
1915 if ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi ) {
1916 if (bachelor->Charge()==-1)
1917 flagToCheckCandidate = aaa; // Lc->LambdaBar+pi- OK
1918 else if (bachelor->Charge()==+1)
1919 flagToCheckCandidate =-aaa; // LambdaBar+pi+ AS Lc->LambdaBar+pi- candidate
1920 }
1921 //}
1922 }
1923 cutsAnal->SetUsePID(areCutsUsingPID);
a578b2da 1924 */
992ba7d8 1925
516f546e 1926 fCandidateVariables[ 0] = fUseMCInfo+isLcByMC; // 0: real data; 1: bkg; 2: Lc->K0S+p; 3: Lc->LambdaBar+pbar; 5: Lc->Lambda+p; 9: D+->K0S+pi; 17: Ds+->K0S+K; 33: K*+->K0S+pi; 65: K*+->K0S+K
43c7bace 1927 fCandidateVariables[ 1] = fUseMCInfo+isV0ByMC; // 0: real data; 1: bkg; 2: K0S->pi+pi; 3: LambdaBar->pbar+pi+; 5: Lambda->p+pi-
1928 fCandidateVariables[ 2] = isBachelorSelected;
1929 fCandidateVariables[ 3] = areV0daughtersSelected;
1930 fCandidateVariables[ 4] = flagToCheckCandidate;
1931 fCandidateVariables[ 5] = invmassLc;
1932 fCandidateVariables[ 6] = invmassLc2Lpi;
1933 fCandidateVariables[ 7] = part->InvMass2Prongs(0,1,211,310); // D+ -> pi+ K0S
1934 fCandidateVariables[ 8] = part->InvMass2Prongs(0,1,321,310); // D+S -> K+ K0S
1935 fCandidateVariables[ 9] = invmassK0S;
1936 fCandidateVariables[10] = invmassLambda;
1937 fCandidateVariables[11] = invmassLambdaBar;
1938 fCandidateVariables[12] = v0part->InvMass2Prongs(0,1,11,11);
1939 fCandidateVariables[13] = part->GetDCA();
1940 fCandidateVariables[14] = dcaV0ptp;
1941 fCandidateVariables[15] = part->Getd0Prong(0);
1942 fCandidateVariables[16] = part->Getd0Prong(1);
1943 fCandidateVariables[17] = v0part->Getd0Prong(0);
1944 fCandidateVariables[18] = v0part->Getd0Prong(1);
1945 fCandidateVariables[19] = part->CosPointingAngle();
1946 fCandidateVariables[20] = part->CosV0PointingAngle();
1947 fCandidateVariables[21] = v0part->RadiusSecVtx();
1948 fCandidateVariables[22] = nSigmaITSpr;
1949 fCandidateVariables[23] = nSigmaITSpi;
1950 fCandidateVariables[24] = nSigmaITSka;
1951 fCandidateVariables[25] = nSigmaTPCpr;
1952 fCandidateVariables[26] = nSigmaTPCpi;
1953 fCandidateVariables[27] = nSigmaTPCka;
1954 fCandidateVariables[28] = nSigmaTOFpr;
1955 fCandidateVariables[29] = nSigmaTOFpi;
1956 fCandidateVariables[30] = nSigmaTOFka;
1957 fCandidateVariables[31] = part->Y(4122);
1958 fCandidateVariables[32] = bachelor->Eta();
1959 fCandidateVariables[33] = v0pos->Eta();
1960 fCandidateVariables[34] = v0neg->Eta();
1961 fCandidateVariables[35] = part->P();
1962 fCandidateVariables[36] = part->Pt();
1963 fCandidateVariables[37] = v0part->P();
1964 fCandidateVariables[38] = v0part->Pt();
1965 fCandidateVariables[39] = bachelor->P();
1966 fCandidateVariables[40] = bachelor->Pt();
1967 fCandidateVariables[41] = v0pos->P();
1968 fCandidateVariables[42] = v0pos->Pt();
1969 fCandidateVariables[43] = v0neg->P();
1970 fCandidateVariables[44] = v0neg->Pt();
1971 fCandidateVariables[45] = part->DecayLength();
1972 fCandidateVariables[46] = part->DecayLengthV0();
1973 fCandidateVariables[47] = part->CosPointingAngleXY();
1974 fCandidateVariables[48] = part->CosV0PointingAngleXY();
1975 fCandidateVariables[49] = part->DecayLengthXY();
1976 fCandidateVariables[50] = part->DecayLengthXYV0();
1977 fCandidateVariables[51] = part->NormalizedDecayLength();
1978 fCandidateVariables[52] = part->NormalizedV0DecayLength();
1979 fCandidateVariables[53] = part->NormalizedDecayLengthXY();
1980 fCandidateVariables[54] = part->NormalizedV0DecayLengthXY();
1981 Double_t xVtxLc=0, yVtxLc=0, zVtxLc=0;
1982 Double_t xLcMC=0,yLcMC=0,zLcMC=0;
1983 Double_t pxVtxBachelor=0, pyVtxBachelor=0, pzVtxBachelor=0;
1984 Double_t dcaForLc = PropagateToDCA(v0part,bachelor,fBzkG, xVtxLc, yVtxLc, zVtxLc, pxVtxBachelor, pyVtxBachelor, pzVtxBachelor);
1985 if (isLc) {
1986 Int_t pdgCand0 = 4122;
1987 Int_t pdgDgLctoV0bachelor0[2]={2212,310};
1988 Int_t pdgDgV0toDaughters0[2]={211,211};
1989 Int_t mcLabel0 = part->MatchToMC(pdgCand0,pdgDgLctoV0bachelor0[1],pdgDgLctoV0bachelor0,pdgDgV0toDaughters0,mcArray,kTRUE);
1990 AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel0));
14666b78 1991 if(partLc){
1992 AliAODMCParticle *partLcDaug0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(partLc->GetDaughter(0)));
1993 if(partLcDaug0){
1994 xLcMC=partLcDaug0->Xv(), yLcMC=partLcDaug0->Yv(), zLcMC=partLcDaug0->Zv();
1995 }
1996 }
43c7bace 1997 } else if (isLc2LBarpi || isLc2Lpi) {
1998 AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel));
1999 AliAODMCParticle *partLcDaug0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(partLc->GetDaughter(0)));
2000 xLcMC=partLcDaug0->Xv(), yLcMC=partLcDaug0->Yv(), zLcMC=partLcDaug0->Zv();
2001 } else if (isDp2K0Spi) {
2002 AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel2));
2003 AliAODMCParticle *partLcDaug0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(partLc->GetDaughter(0)));
2004 xLcMC=partLcDaug0->Xv(), yLcMC=partLcDaug0->Yv(), zLcMC=partLcDaug0->Zv();
2005 } else if (isDs2K0SK) {
2006 AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel3));
2007 AliAODMCParticle *partLcDaug0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(partLc->GetDaughter(0)));
2008 xLcMC=partLcDaug0->Xv(), yLcMC=partLcDaug0->Yv(), zLcMC=partLcDaug0->Zv();
14fe9f43 2009 } else if (isKstar12K0Spi) {
2010 AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel4));
2011 AliAODMCParticle *partLcDaug0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(partLc->GetDaughter(0)));
2012 xLcMC=partLcDaug0->Xv(), yLcMC=partLcDaug0->Yv(), zLcMC=partLcDaug0->Zv();
2013 } else if (isKstar22K0Spi) {
2014 AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel5));
2015 AliAODMCParticle *partLcDaug0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(partLc->GetDaughter(0)));
2016 xLcMC=partLcDaug0->Xv(), yLcMC=partLcDaug0->Yv(), zLcMC=partLcDaug0->Zv();
43c7bace 2017 }
2018 fCandidateVariables[55]=dcaForLc;
2019 fCandidateVariables[56]=part->GetSecVtxX();
2020 fCandidateVariables[57]=part->GetSecVtxY();
2021 fCandidateVariables[58]=part->GetSecVtxZ();
2022 fCandidateVariables[59]=xVtxLc;
2023 fCandidateVariables[60]=yVtxLc;
2024 fCandidateVariables[61]=zVtxLc;
2025 fCandidateVariables[62]=xLcMC;
2026 fCandidateVariables[63]=yLcMC;
2027 fCandidateVariables[64]=zLcMC;
2028 fCandidateVariables[65]=bachelor->Px();
2029 fCandidateVariables[66]=bachelor->Py();
2030 fCandidateVariables[67]=pxVtxBachelor;
2031 fCandidateVariables[68]=pyVtxBachelor;
2032 fCandidateVariables[69]=v0part->Px();
2033 fCandidateVariables[70]=v0part->Py();
2034 fCandidateVariables[71]=fVtx1->GetX();
2035 fCandidateVariables[72]=fVtx1->GetY();
2036 fCandidateVariables[73]=fVtx1->GetZ();
2037 fCandidateVariables[74]=part->CosThetaStar(0,4122,2212,310);
2038 fCandidateVariables[75]=part->CosThetaStar(1,4122,2212,310);
2039 fCandidateVariables[76]=v0part->Eta();
2040 fCandidateVariables[77]=v0part->Y(310);
2041 fCandidateVariables[78]=pzVtxBachelor;
2042 fCandidateVariables[79]=v0part->Pz();
53c91ed7 2043 fCandidateVariables[80]=bachelor->Charge();
2044 fCandidateVariables[81]=isMCparticleInFiducialAcceptance;
2045 if (fUseMCInfo) {
2db138e0 2046 fCandidateVariables[82]=0;
53c91ed7 2047 if (bachelor->GetLabel()!=-1) {
2048 AliAODMCParticle *partBachelor = dynamic_cast<AliAODMCParticle*>(mcArray->At(TMath::Abs(bachelor->GetLabel())));
2db138e0 2049 if(partBachelor) fCandidateVariables[82]=partBachelor->GetPdgCode();
53c91ed7 2050 }
2051 } else {
2052 fCandidateVariables[82]=-1;
2053 }
14fe9f43 2054 fCandidateVariables[83] = part->InvMass2Prongs(0,1,211,310); // Kstar( 892)+ -> pi+K0S
2055 fCandidateVariables[84] = part->InvMass2Prongs(0,1,321,310); // Kstar(1430)+ -> pi+K0S
2056
2057 fCandidateVariables[85]=0;
2058 fCandidateVariables[86]=0;
2059 fCandidateVariables[87]=0;
516f546e 2060 fCandidateVariables[88]=0;
14fe9f43 2061 if (fUseMCInfo) {
516f546e 2062 if (v0pos->GetLabel()!=-1 &&
2063 v0neg->GetLabel()!=-1) {
2064 const Int_t ndg=2;
2065 Int_t dgLabels[ndg]={TMath::Abs(v0pos->GetLabel()),
2066 TMath::Abs(v0neg->GetLabel())};
2067 Int_t ndgCk=0;
2068 Int_t *pdgDg=0;
2069 Int_t absLabelMother=-1;
2070 Int_t nDauCand=-1;
2071 fCandidateVariables[88]=SearchForCommonMother(mcArray,
2072 dgLabels,ndg,ndgCk,pdgDg,absLabelMother,nDauCand);
2073 }
14fe9f43 2074 if (bachelor->GetLabel()!=-1 &&
2075 v0pos->GetLabel()!=-1 &&
2076 v0neg->GetLabel()!=-1) {
2077 const Int_t ndg=3;
2078 Int_t dgLabels[ndg]={TMath::Abs(bachelor->GetLabel()),
2079 TMath::Abs(v0pos->GetLabel()),
2080 TMath::Abs(v0neg->GetLabel())};
2081 Int_t ndgCk=0;
2082 Int_t *pdgDg=0;
2083 Int_t absLabelMother=-1;
516f546e 2084 Int_t nDauCand=-1;
14fe9f43 2085 fCandidateVariables[85]=SearchForCommonMother(mcArray,
516f546e 2086 dgLabels,ndg,ndgCk,pdgDg,absLabelMother,nDauCand);
14fe9f43 2087 AliAODMCParticle *part1 = dynamic_cast<AliAODMCParticle*>(mcArray->At(TMath::Abs(v0pos->GetLabel())));
2088 AliAODMCParticle *part2 = dynamic_cast<AliAODMCParticle*>(mcArray->At(TMath::Abs(v0neg->GetLabel())));
516f546e 2089 if(part1) fCandidateVariables[86]=part1->GetPdgCode();
2090 if(part2) fCandidateVariables[87]=part2->GetPdgCode();
14fe9f43 2091 }
2092 }
2093
2094 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
2095 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
2096 AliPIDResponse *pidResponse=inputHandler->GetPIDResponse();
516f546e 2097 fCandidateVariables[89]=pidResponse->GetTOFResponse().GetStartTimeMask(bachelor->P());
43c7bace 2098
2099 //fCandidateVariables[65] = bachelor->Px();
2100 //fCandidateVariables[66] = bachelor->Py();
2101 //fCandidateVariables[67] = bachelor->Pz();
2102 //fCandidateVariables[68] = v0pos->Px();
2103 //fCandidateVariables[69] = v0pos->Py();
2104 //fCandidateVariables[70] = v0pos->Pz();
2105 //fCandidateVariables[71] = v0neg->Px();
2106 //fCandidateVariables[72] = v0neg->Py();
2107 //fCandidateVariables[73] = v0neg->Pz();
2108 //fCandidateVariables[74] = part->PxProng(0);
2109 //fCandidateVariables[75] = part->PyProng(0);
2110 //fCandidateVariables[76] = part->PzProng(0);
2111 //fCandidateVariables[77] = part->PxProng(1);
2112 //fCandidateVariables[78] = part->PyProng(1);
2113 //fCandidateVariables[79] = part->PzProng(1);
2114 //fCandidateVariables[80] = v0part->PxProng(0);
2115 //fCandidateVariables[81] = v0part->PyProng(0);
2116 //fCandidateVariables[82] = v0part->PzProng(0);
2117 //fCandidateVariables[83] = v0part->PxProng(1);
2118 //fCandidateVariables[84] = v0part->PyProng(1);
2119 //fCandidateVariables[85] = v0part->PzProng(1);
2120 //fCandidateVariables[86] = part->QtProng(0);
2121 //fCandidateVariables[87] = part->Alpha();
2122
2123 fVariablesTree->Fill();
992ba7d8 2124
43c7bace 2125 return;
2126}
0dbd1d4f 2127
43c7bace 2128//-------------------------------------------------------------------------------
2129void AliAnalysisTaskSELc2V0bachelor::DefineTreeVariables() {
2130 //
2131 // This is to define tree variables
2132 //
0dbd1d4f 2133
43c7bace 2134 const char* nameoutput = GetOutputSlot(4)->GetContainer()->GetName();
2135 fVariablesTree = new TTree(nameoutput,"Candidates variables tree");
516f546e 2136 Int_t nVar = 90;
43c7bace 2137 fCandidateVariables = new Float_t [nVar];
2138 TString * fCandidateVariableNames = new TString[nVar];
2139 fCandidateVariableNames[ 0]="isLcByMC";
2140 fCandidateVariableNames[ 1]="isV0ByMC";
2141 fCandidateVariableNames[ 2]="flagToCheckBachelor";
2142 fCandidateVariableNames[ 3]="flagToCheckV0daughters";
2143 fCandidateVariableNames[ 4]="flagToCheckCandidate";
2144 fCandidateVariableNames[ 5]="massLc2K0Sp";
2145 fCandidateVariableNames[ 6]="massLc2Lambdapi";
2146 fCandidateVariableNames[ 7]="massD2K0Spi"; // D+ -> pi+ K0S
2147 fCandidateVariableNames[ 8]="massDS2K0SK"; // D+S -> K+ K0S
2148 fCandidateVariableNames[ 9]="massK0S";
2149 fCandidateVariableNames[10]="massLambda";
2150 fCandidateVariableNames[11]="massLambdaBar";
2151 fCandidateVariableNames[12]="massGamma";
2152 fCandidateVariableNames[13]="dcaLcptp"; // DCA Lc prong-to-prong
2153 fCandidateVariableNames[14]="dcaV0ptp";
2154 fCandidateVariableNames[15]="tImpParBach";
2155 fCandidateVariableNames[16]="tImpParV0";
2156 fCandidateVariableNames[17]="dcaV0postoPV";
2157 fCandidateVariableNames[18]="dcaV0negtoPV";
2158 fCandidateVariableNames[19]="cosPALc";
2159 fCandidateVariableNames[20]="cosPAK0S";
2160 fCandidateVariableNames[21]="rhoV0";
2161 fCandidateVariableNames[22]="nSigmaITSpr";
2162 fCandidateVariableNames[23]="nSigmaITSpi";
2163 fCandidateVariableNames[24]="nSigmaITSka";
2164 fCandidateVariableNames[25]="nSigmaTPCpr";
2165 fCandidateVariableNames[26]="nSigmaTPCpi";
2166 fCandidateVariableNames[27]="nSigmaTPCka";
2167 fCandidateVariableNames[28]="nSigmaTOFpr";
2168 fCandidateVariableNames[29]="nSigmaTOFpi";
2169 fCandidateVariableNames[30]="nSigmaTOFka";
2170 fCandidateVariableNames[31]="yLc";
2171 fCandidateVariableNames[32]="etaBach"; // etaBachelor
2172 fCandidateVariableNames[33]="etaV0pos"; // etaV0pos
2173 fCandidateVariableNames[34]="etaV0neg"; // etaV0neg
2174 fCandidateVariableNames[35]="LcP"; // @ DCA
2175 fCandidateVariableNames[36]="LcPt"; // @ DCA
2176 fCandidateVariableNames[37]="v0P"; // @ V0 DCA
2177 fCandidateVariableNames[38]="v0Pt"; // @ V0 DCA
2178 fCandidateVariableNames[39]="bachelorP"; // @ prim vtx
2179 fCandidateVariableNames[40]="bachelorPt"; // @ prim vtx
2180 fCandidateVariableNames[41]="V0positiveP"; // @ prim vtx
2181 fCandidateVariableNames[42]="V0positivePt"; // @ prim vtx
2182 fCandidateVariableNames[43]="V0negativeP"; // @ prim vtx
2183 fCandidateVariableNames[44]="V0negativePt"; // @ prim vtx
2184 fCandidateVariableNames[45]="decayLengthLc";
2185 fCandidateVariableNames[46]="decayLengthV0";
2186 fCandidateVariableNames[47]="cosPALcXY"; // cosPA XY x Lc
2187 fCandidateVariableNames[48]="cosPAV0XY"; // cosPA XY x V0
2188 fCandidateVariableNames[49]="decayLengthLcXY"; // decay length XY x Lc
2189 fCandidateVariableNames[50]="decayLengthV0XY"; // decay length XY x V0
2190 fCandidateVariableNames[51]="normalizedDecayLengthLc"; // normalized decay length x Lc
2191 fCandidateVariableNames[52]="normalizedDecayLengthV0"; // normalized decay length x V0
2192 fCandidateVariableNames[53]="normalizedDecayLengthXYLc"; // normalized decay length XY x Lc
2193 fCandidateVariableNames[54]="normalizedDecayLengthXYV0"; // normalized decay length XY x V0
2194 fCandidateVariableNames[55]="newLcDCA";
2195 fCandidateVariableNames[56]="xVtxLcBad";
2196 fCandidateVariableNames[57]="yVtxLcBad";
2197 fCandidateVariableNames[58]="zVtxLcBad";
2198 fCandidateVariableNames[59]="xVtxLcGood";
2199 fCandidateVariableNames[60]="yVtxLcGood";
2200 fCandidateVariableNames[61]="zVtxLcGood";
2201 fCandidateVariableNames[62]="xVtxLcMC";
2202 fCandidateVariableNames[63]="yVtxLcMC";
2203 fCandidateVariableNames[64]="zVtxLcMC";
2204 fCandidateVariableNames[65]="pxVtxBachelorBad";
2205 fCandidateVariableNames[66]="pyVtxBachelorBad";
2206 fCandidateVariableNames[67]="pxVtxBachelorGood";
2207 fCandidateVariableNames[68]="pyVtxBachelorGood";
2208 fCandidateVariableNames[69]="pxVtxV0";
2209 fCandidateVariableNames[70]="pyVtxV0";
2210 fCandidateVariableNames[71]="xPvtx";
2211 fCandidateVariableNames[72]="yPvtx";
2212 fCandidateVariableNames[73]="zPvtx";
2213 fCandidateVariableNames[74]="cosThetaStarBachelor";
2214 fCandidateVariableNames[75]="cosThetaStarV0";
2215 fCandidateVariableNames[76]="etaV0";
2216 fCandidateVariableNames[77]="yV0";
2217 fCandidateVariableNames[78]="pzVtxBachelorGood";
2218 fCandidateVariableNames[79]="pzVtxV0";
53c91ed7 2219 fCandidateVariableNames[80]="bachelorCharge";
2220 fCandidateVariableNames[81]="isMCparticleInFiducialAcceptance";
14fe9f43 2221 fCandidateVariableNames[82]="pdgBachelor"; // pdg MC bachelor
2222 fCandidateVariableNames[83]="massKstar12K0Spi"; // Kstar( 892)+ -> pi+ K0S
2223 fCandidateVariableNames[84]="massKstar22K0Spi"; // Kstar(1430)+ -> pi+ K0S
2224 fCandidateVariableNames[85]="pdgCandidate"; // pdg MC candidate recovered via new method
2225 fCandidateVariableNames[86]="pdgV0pos"; // pdg MC V0 positive
2226 fCandidateVariableNames[87]="pdgV0neg"; // pdg MC V0 negative
516f546e 2227 fCandidateVariableNames[88]="pdgV0Candidate"; // pdg MC V0candidate recovered via new method
2228 fCandidateVariableNames[89]="startTimeMask"; // start time mask
43c7bace 2229
2230 //fCandidateVariableNames[65]="bachelorPx";
2231 //fCandidateVariableNames[66]="bachelorPy";
2232 //fCandidateVariableNames[67]="bachelorPz";
2233 //fCandidateVariableNames[68]="V0positivePx";
2234 //fCandidateVariableNames[69]="V0positivePy";
2235 //fCandidateVariableNames[70]="V0positivePz";
2236 //fCandidateVariableNames[71]="V0negativePx";
2237 //fCandidateVariableNames[72]="V0negativePy";
2238 //fCandidateVariableNames[73]="V0negativePz";
2239 //fCandidateVariableNames[74]="bachelorPxDCA";
2240 //fCandidateVariableNames[75]="bachelorPyDCA";
2241 //fCandidateVariableNames[76]="bachelorPzDCA";
2242 //fCandidateVariableNames[77]="v0PxDCA";
2243 //fCandidateVariableNames[78]="v0PyDCA";
2244 //fCandidateVariableNames[79]="v0PzDCA";
2245 //fCandidateVariableNames[80]="V0positivePxDCA";
2246 //fCandidateVariableNames[81]="V0positivePyDCA";
2247 //fCandidateVariableNames[82]="V0positivePzDCA";
2248 //fCandidateVariableNames[83]="V0negativePxDCA";
2249 //fCandidateVariableNames[84]="V0negativePyDCA";
2250 //fCandidateVariableNames[85]="V0negativePzDCA";
2251 //fCandidateVariableNames[86]="qtLc";
2252 //fCandidateVariableNames[87]="alphaLc";
2253
2254 for (Int_t ivar=0; ivar<nVar; ivar++) {
2255 fVariablesTree->Branch(fCandidateVariableNames[ivar].Data(),&fCandidateVariables[ivar],Form("%s/f",fCandidateVariableNames[ivar].Data()));
2256 }
992ba7d8 2257
43c7bace 2258 return;
2259}
0dbd1d4f 2260
43c7bace 2261//__________________________________________________________________________
2262void AliAnalysisTaskSELc2V0bachelor::DefineGeneralHistograms() {
2263 //
2264 // This is to define general histograms
2265 //
0dbd1d4f 2266
53c91ed7 2267 fCEvents = new TH1F("fCEvents","conter",18,0,18);
43c7bace 2268 fCEvents->SetStats(kTRUE);
2269 fCEvents->GetXaxis()->SetBinLabel(1,"X1");
2270 fCEvents->GetXaxis()->SetBinLabel(2,"Analyzed events");
2271 fCEvents->GetXaxis()->SetBinLabel(3,"AliAODVertex exists");
2272 fCEvents->GetXaxis()->SetBinLabel(4,"CascadesHF exists");
2273 fCEvents->GetXaxis()->SetBinLabel(5,"MCarray exists");
2274 fCEvents->GetXaxis()->SetBinLabel(6,"MCheader exists");
2275 fCEvents->GetXaxis()->SetBinLabel(7,"GetNContributors()>0");
2276 fCEvents->GetXaxis()->SetBinLabel(8,"IsEventSelected");
2277 fCEvents->GetXaxis()->SetBinLabel(9,"triggerClass!=CINT1");
2278 fCEvents->GetXaxis()->SetBinLabel(10,"triggerMask!=kAnyINT");
2279 fCEvents->GetXaxis()->SetBinLabel(11,"triggerMask!=kAny");
2280 fCEvents->GetXaxis()->SetBinLabel(12,"vtxTitle.Contains(Z)");
2281 fCEvents->GetXaxis()->SetBinLabel(13,"vtxTitle.Contains(3D)");
2282 fCEvents->GetXaxis()->SetBinLabel(14,"vtxTitle.Doesn'tContain(Z-3D)");
2283 fCEvents->GetXaxis()->SetBinLabel(15,Form("zVtx<=%2.0fcm",fAnalCuts->GetMaxVtxZ()));
2284 fCEvents->GetXaxis()->SetBinLabel(16,"!IsEventSelected");
2285 fCEvents->GetXaxis()->SetBinLabel(17,"triggerMask!=kAnyINT || triggerClass!=CINT1");
53c91ed7 2286 fCEvents->GetXaxis()->SetBinLabel(18,Form("zVtxMC<=%2.0fcm",fAnalCuts->GetMaxVtxZ()));
43c7bace 2287 //fCEvents->GetXaxis()->SetTitle("");
2288 fCEvents->GetYaxis()->SetTitle("counts");
0dbd1d4f 2289
43c7bace 2290 fOutput->Add(fCEvents);
2291 TString fillthis="";
0dbd1d4f 2292
43c7bace 2293 if (fUseMCInfo && fAdditionalChecks) {
2294 fillthis="histMcStatLc";
2295 TH1F* mcStatisticLc = new TH1F(fillthis.Data(),"#Lambda_{c} generated and their decays",21,-10.5,10.5);
2296 fOutput->Add(mcStatisticLc);
2297 }
0dbd1d4f 2298
43c7bace 2299 //fillthis="histopionV0SigmaVspTOF";
2300 //TH2F *hpionV0SigmaVspTOF=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2301 fillthis="histoprotonBachSigmaVspTOF";
2302 TH2F *hprotonBachSigmaVspTOF=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
0dbd1d4f 2303
43c7bace 2304 //fOutput->Add(hpionV0SigmaVspTOF);
2305 fOutput->Add(hprotonBachSigmaVspTOF);
0dbd1d4f 2306
43c7bace 2307 //fillthis="histopionV0SigmaVspTPC";
2308 //TH2F *hpionV0SigmaVspTPC=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2309 fillthis="histoprotonBachSigmaVspTPC";
2310 TH2F *hprotonBachSigmaVspTPC=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
0dbd1d4f 2311
43c7bace 2312 //fOutput->Add(hpionV0SigmaVspTPC);
2313 fOutput->Add(hprotonBachSigmaVspTPC);
0dbd1d4f 2314
43c7bace 2315 if (fUseMCInfo) {
0dbd1d4f 2316
43c7bace 2317 //fillthis="histopionV0SigmaVspTOFsgn";
2318 //TH2F *hpionV0SigmaVspTOFsgn=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2319 fillthis="histoprotonBachSigmaVspTOFsgn";
2320 TH2F *hprotonBachSigmaVspTOFsgn=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
0dbd1d4f 2321
43c7bace 2322 //fOutput->Add(hpionV0SigmaVspTOFsgn);
2323 fOutput->Add(hprotonBachSigmaVspTOFsgn);
0dbd1d4f 2324
43c7bace 2325 //fillthis="histopionV0SigmaVspTPCsgn";
2326 //TH2F *hpionV0SigmaVspTPCsgn=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2327 fillthis="histoprotonBachSigmaVspTPCsgn";
2328 TH2F *hprotonBachSigmaVspTPCsgn=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
0dbd1d4f 2329
43c7bace 2330 //fOutput->Add(hpionV0SigmaVspTPCsgn);
2331 fOutput->Add(hprotonBachSigmaVspTPCsgn);
0dbd1d4f 2332
0dbd1d4f 2333
43c7bace 2334 //fillthis="histopionV0SigmaVspTOFbkg";
2335 //TH2F *hpionV0SigmaVspTOFbkg=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2336 fillthis="histoprotonBachSigmaVspTOFbkg";
2337 TH2F *hprotonBachSigmaVspTOFbkg=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
0dbd1d4f 2338
43c7bace 2339 //fOutput->Add(hpionV0SigmaVspTOFbkg);
2340 fOutput->Add(hprotonBachSigmaVspTOFbkg);
992ba7d8 2341
43c7bace 2342 //fillthis="histopionV0SigmaVspTPCbkg";
2343 //TH2F *hpionV0SigmaVspTPCbkg=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2344 fillthis="histoprotonBachSigmaVspTPCbkg";
2345 TH2F *hprotonBachSigmaVspTPCbkg=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
992ba7d8 2346
43c7bace 2347 //fOutput->Add(hpionV0SigmaVspTPCbkg);
2348 fOutput->Add(hprotonBachSigmaVspTPCbkg);
992ba7d8 2349
43c7bace 2350 }
992ba7d8 2351
43c7bace 2352 if (fAdditionalChecks) {
2353
2354 TH1F *hZ2 = new TH1F("hZ2","",100,-50.,50.);
2355 fOutput->Add(hZ2);
2356 TH1F *hZ3 = new TH1F("hZ3","",100,-50.,50.);
2357 fOutput->Add(hZ3);
2358 TH1F *hZ4 = new TH1F("hZ4","",100,-50.,50.);
2359 fOutput->Add(hZ4);
2360 TH1F *hZ5 = new TH1F("hZ5","",100,-50.,50.);
2361 fOutput->Add(hZ5);
2362 TH1F *hZ6 = new TH1F("hZ6","",100,-50.,50.);
2363 fOutput->Add(hZ6);
2364 TH1F *hZ7 = new TH1F("hZ7","",100,-50.,50.);
2365 fOutput->Add(hZ7);
2366 TH1F *hZ8 = new TH1F("hZ8","",100,-50.,50.);
2367 fOutput->Add(hZ8);
2368 TH1F *hZ9 = new TH1F("hZ9","",100,-50.,50.);
2369 fOutput->Add(hZ9);
2370 TH1F *hZ10 = new TH1F("hZ10","",100,-50.,50.);
2371 fOutput->Add(hZ10);
2372 TH1F *hZ11 = new TH1F("hZ11","",100,-50.,50.);
2373 fOutput->Add(hZ11);
2374 TH1F *hZ12 = new TH1F("hZ12","",100,-50.,50.);
2375 fOutput->Add(hZ12);
2376 TH1F *hZ13 = new TH1F("hZ13","",100,-50.,50.);
2377 fOutput->Add(hZ13);
2378 TH1F *hZ14 = new TH1F("hZ14","",100,-50.,50.);
2379 fOutput->Add(hZ14);
2380 TH1F *hZ15 = new TH1F("hZ15","",100,-50.,50.);
2381 fOutput->Add(hZ15);
2382 TH1F *hZ16 = new TH1F("hZ16","",100,-50.,50.);
2383 fOutput->Add(hZ16);
2384 }
992ba7d8 2385
43c7bace 2386 TH1F *hCandidateSelection = new TH1F("hCandidateSelection","",10,-0.5,9.5);
2387 hCandidateSelection->GetXaxis()->SetBinLabel(1,"IsEventSelected");
2388 hCandidateSelection->GetXaxis()->SetBinLabel(2,"IsSecondaryVtx");
2389 hCandidateSelection->GetXaxis()->SetBinLabel(3,"V0toPosNeg");
2390 hCandidateSelection->GetXaxis()->SetBinLabel(4,"offlineV0");
2391 hCandidateSelection->GetXaxis()->SetBinLabel(5,"isInFiducialAcceptance");
2392 hCandidateSelection->GetXaxis()->SetBinLabel(6,"analCuts::kTracks");
2393 hCandidateSelection->GetXaxis()->SetBinLabel(7,"analCuts::kCandidateNoPID");
2394 hCandidateSelection->GetXaxis()->SetBinLabel(8,"analCuts::kPID");
2395 hCandidateSelection->GetXaxis()->SetBinLabel(9,"analCuts::kCandidateWithPID");
2396 hCandidateSelection->GetXaxis()->SetBinLabel(10,"analCuts::kAll");
2397 fOutput->Add(hCandidateSelection);
992ba7d8 2398
43c7bace 2399 TH1F *hEventsWithCandidates = new TH1F("hEventsWithCandidates","conter",11,5.5,16.5);
2400 hEventsWithCandidates->GetXaxis()->SetBinLabel(1,"GetNContributors()>0");
2401 hEventsWithCandidates->GetXaxis()->SetBinLabel(2,"IsEventSelected");
2402 hEventsWithCandidates->GetXaxis()->SetBinLabel(3,"triggerClass!=CINT1");
2403 hEventsWithCandidates->GetXaxis()->SetBinLabel(4,"triggerMask!=kAnyINT");
2404 hEventsWithCandidates->GetXaxis()->SetBinLabel(5,"triggerMask!=kAny");
2405 hEventsWithCandidates->GetXaxis()->SetBinLabel(6,"vtxTitle.Contains(Z)");
2406 hEventsWithCandidates->GetXaxis()->SetBinLabel(7,"vtxTitle.Contains(3D)");
2407 hEventsWithCandidates->GetXaxis()->SetBinLabel(8,"vtxTitle.Doesn'tContain(Z-3D)");
2408 hEventsWithCandidates->GetXaxis()->SetBinLabel(9,Form("zVtx<=%2.0fcm",fAnalCuts->GetMaxVtxZ()));
2409 hEventsWithCandidates->GetXaxis()->SetBinLabel(10,"!IsEventSelected");
2410 hEventsWithCandidates->GetXaxis()->SetBinLabel(11,"triggerMask!=kAnyINT || triggerClass!=CINT1");
2411 fOutput->Add(hEventsWithCandidates);
992ba7d8 2412
43c7bace 2413 if (fAdditionalChecks) {
2414
2415 TH1F *hZ6a = new TH1F("hZ6a","",100,-50.,50.);
2416 fOutput->Add(hZ6a);
2417 TH1F *hZ7a = new TH1F("hZ7a","",100,-50.,50.);
2418 fOutput->Add(hZ7a);
2419 TH1F *hZ8a = new TH1F("hZ8a","",100,-50.,50.);
2420 fOutput->Add(hZ8a);
2421 TH1F *hZ9a = new TH1F("hZ9a","",100,-50.,50.);
2422 fOutput->Add(hZ9a);
2423 TH1F *hZ10a = new TH1F("hZ10a","",100,-50.,50.);
2424 fOutput->Add(hZ10a);
2425 TH1F *hZ11a = new TH1F("hZ11a","",100,-50.,50.);
2426 fOutput->Add(hZ11a);
2427 TH1F *hZ12a = new TH1F("hZ12a","",100,-50.,50.);
2428 fOutput->Add(hZ12a);
2429 TH1F *hZ13a = new TH1F("hZ13a","",100,-50.,50.);
2430 fOutput->Add(hZ13a);
2431 TH1F *hZ14a = new TH1F("hZ14a","",100,-50.,50.);
2432 fOutput->Add(hZ14a);
2433 TH1F *hZ15a = new TH1F("hZ15a","",100,-50.,50.);
2434 fOutput->Add(hZ15a);
2435 TH1F *hZ16a = new TH1F("hZ16a","",100,-50.,50.);
2436 fOutput->Add(hZ16a);
2437 }
992ba7d8 2438
43c7bace 2439 TH1F *hSwitchOnCandidates1 = new TH1F("hSwitchOnCandidates1","",15,-7.5,7.5);
2440 fOutput->Add(hSwitchOnCandidates1);
2441 TH1F *hSwitchOnCandidates2 = new TH1F("hSwitchOnCandidates2","",15,-7.5,7.5);
2442 fOutput->Add(hSwitchOnCandidates2);
2443 TH1F *hSwitchOnCandidates3 = new TH1F("hSwitchOnCandidates3","",15,-7.5,7.5);
2444 fOutput->Add(hSwitchOnCandidates3);
2445 TH1F *hSwitchOnCandidates4 = new TH1F("hSwitchOnCandidates4","",15,-7.5,7.5);
2446 fOutput->Add(hSwitchOnCandidates4);
992ba7d8 2447
43c7bace 2448 return;
2449}
992ba7d8 2450
43c7bace 2451//________________________________________________________________________
2452void AliAnalysisTaskSELc2V0bachelor::DefineAnalysisHistograms() {
2453 //
2454 // This is to define analysis histograms
2455 //
2456
2457 if (fIsK0SAnalysis) DefineK0SHistos();// hK0S histos declarations
2458
2459 return;
2460}
992ba7d8 2461
43c7bace 2462//________________________________________________________________________
2463void AliAnalysisTaskSELc2V0bachelor::FillAnalysisHistograms(AliAODRecoCascadeHF *part, Bool_t isBachelorID, TString appendthis) {
2464 //
2465 // This is to fill analysis histograms
2466 //
992ba7d8 2467
43c7bace 2468 TString fillthis="";
992ba7d8 2469
43c7bace 2470 Double_t invmassLc = part->InvMassLctoK0sP();
2471 Double_t lambdacpt = part->Pt();
992ba7d8 2472
43c7bace 2473 AliAODTrack *bachelor = (AliAODTrack*)part->GetBachelor();
2474 Double_t momBach = bachelor->P();
992ba7d8 2475
43c7bace 2476 AliAODv0 * v0part = (AliAODv0*)part->Getv0();
2477 Double_t momK0S = v0part->P();
2478 Double_t ptK0S = v0part->Pt();
2479 Double_t dcaV0ptp = v0part->GetDCA();
2480 Double_t invmassK0S = v0part->MassK0Short();
992ba7d8 2481
516f546e 2482 fillthis="histK0SMass"+appendthis;
2483 // cout << fillthis << endl;
2484 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassK0S,ptK0S);
2485 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassK0S,ptK0S);
992ba7d8 2486
516f546e 2487 fillthis="histpK0Svsp"+appendthis;
2488 // cout << fillthis << endl;
2489 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momBach,momK0S);
2490 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momBach,momK0S);
992ba7d8 2491
516f546e 2492 fillthis="histDCAtoPVvspK0S"+appendthis;
2493 // cout << fillthis << endl;
2494 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momK0S,dcaV0ptp);
2495 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momK0S,dcaV0ptp);
992ba7d8 2496
516f546e 2497 fillthis="histArmPodK0S"+appendthis;
2498 // cout << fillthis << endl;
2499 FillArmPodDistribution(v0part,fillthis,fOutputAll);
2500 if (isBachelorID) FillArmPodDistribution(v0part,fillthis,fOutputPIDBach);
992ba7d8 2501
516f546e 2502 fillthis="histLcMassByK0S"+appendthis;
2503 // cout << fillthis << endl;
2504 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
2505 if (isBachelorID)((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
992ba7d8 2506
516f546e 2507 return;
43c7bace 2508}
2509//---------------------------
2510Double_t AliAnalysisTaskSELc2V0bachelor::PropagateToDCA(AliAODv0 *v, AliAODTrack *bachelor, Double_t b,
2511 Double_t &xVtxLc, Double_t &yVtxLc, Double_t &zVtxLc,
2512 Double_t &pxVtxBachelor, Double_t &pyVtxBachelor, Double_t &pzVtxBachelor) {
2513 //--------------------------------------------------------------------
2514 // This function returns the DCA between the V0 and the track
2515 // This is a copy of AliCascadeVertexer::PropagateToDCA(...) method
2516 //--------------------------------------------------------------------
2517
2518 // Get AliExternalTrackParam out of the AliAODTracks
2519 Double_t xyz[3], pxpypz[3], cv[21]; Short_t sign;
2520 bachelor->PxPyPz(pxpypz);
2521 bachelor->XvYvZv(xyz);
2522 bachelor->GetCovarianceXYZPxPyPz(cv);
2523 sign=bachelor->Charge();
2524 AliExternalTrackParam *t = new AliExternalTrackParam(xyz,pxpypz,cv,sign);
2525
2526 Double_t alpha=t->GetAlpha(), cs1=TMath::Cos(alpha), sn1=TMath::Sin(alpha);
2527 //Double_t alpha = GetAlpha(xyz,pxpypz), cs1=TMath::Cos(alpha), sn1=TMath::Sin(alpha);
2528
2529 // position and momentum of bachelor
2530 Double_t x1=xyz[0], y1=xyz[1], z1=xyz[2];
2531 Double_t px1=pxpypz[0], py1=pxpypz[1], pz1=pxpypz[2];
2532
2533 // position and momentum of V0
2534 Double_t x2=v->DecayVertexV0X(),
2535 y2=v->DecayVertexV0Y(),
2536 z2=v->DecayVertexV0Z();
2537 Double_t px2=v->Px(),
2538 py2=v->Py(),
2539 pz2=v->Pz();
992ba7d8 2540
43c7bace 2541 /*
2542 AliAODTrack *trackP = (AliAODTrack*) v->GetDaughter(0);
2543 //Double_t pxpypzP[3]; trackP->PxPyPz(pxpypzP);
2544 //Double_t xyzP[3]; trackP->XvYvZv(xyzP);
2545 Double_t cvP[21]; trackP->GetCovarianceXYZPxPyPz(cvP);
2546 //Short_t signP=trackP->Charge();
2547 //AliExternalTrackParam *tP = new AliExternalTrackParam(xyzP,pxpypzP,cvP,signP);
2548
2549 // Get AliExternalTrackParam out of the AliAODTrack
2550 AliAODTrack *trackN = (AliAODTrack*) v->GetDaughter(1);
2551 //Double_t pxpypzN[3]; trackN->PxPyPz(pxpypzN);
2552 //Double_t xyzN[3]; trackN->XvYvZv(xyzN);
2553 Double_t cvN[21]; trackN->GetCovarianceXYZPxPyPz(cvN);
2554 //Short_t signN=trackN->Charge();
2555 //AliExternalTrackParam *tN = new AliExternalTrackParam(xyzN,pxpypzN,cvN,signN);
2556
2557 Double_t xyzV0[3]={x2,y2,z2};
2558 Double_t pxpypzV0[3]={px2,py2,pz2};
2559 Double_t cvV0[21]; for (Int_t ii=0; ii<21; ii++) cvV0[ii]=cvP[ii]+cvN[ii];
2560 AliNeutralTrackParam *trackV0 = new AliNeutralTrackParam(xyzV0,pxpypzV0,cvV0,0);
2561 */
2562
2563 // calculation dca
2564 Double_t dd= Det(x2-x1,y2-y1,z2-z1,px1,py1,pz1,px2,py2,pz2);
2565 Double_t ax= Det(py1,pz1,py2,pz2);
2566 Double_t ay=-Det(px1,pz1,px2,pz2);
2567 Double_t az= Det(px1,py1,px2,py2);
2568
2569 Double_t dca=TMath::Abs(dd)/TMath::Sqrt(ax*ax + ay*ay + az*az);
2570
2571 // bachelor point @ the DCA
2572 Double_t t1 = Det(x2-x1,y2-y1,z2-z1,px2,py2,pz2,ax,ay,az)/
2573 Det(px1,py1,pz1,px2,py2,pz2,ax,ay,az);
2574 x1 += px1*t1; y1 += py1*t1; z1 += pz1*t1;
2575
2576 //propagate track to the point of DCA
2577 Double_t rho1=x1*cs1 + y1*sn1;
2578 if (!t->PropagateTo(rho1,b)) {
2579 Error("PropagateToDCA","Propagation failed !");
2580 delete t; t=NULL;
2581 return 1.e+33;
2582 }
992ba7d8 2583
43c7bace 2584 Double_t pBachelorDCA[3]; t->GetPxPyPz(pBachelorDCA);
2585 pxVtxBachelor=pBachelorDCA[0], pyVtxBachelor=pBachelorDCA[1], pzVtxBachelor=pBachelorDCA[2];
0dbd1d4f 2586
43c7bace 2587 delete t; t=NULL;
992ba7d8 2588
43c7bace 2589 // V0 point @ the DCA
2590 Double_t t2 = Det(x1-x2,y1-y2,z1-z2,px1,py1,pz1,ax,ay,az)/
2591 Det(px2,py2,pz2,px1,py1,pz1,ax,ay,az);
2592 x2 += px2*t2; y2 += py2*t2; z2 += pz2*t2;
992ba7d8 2593
992ba7d8 2594
43c7bace 2595 // Lc decay vtx
2596 xVtxLc = 0.5*(x1+x2);
2597 yVtxLc = 0.5*(y1+y2);
2598 zVtxLc = 0.5*(z1+z2);
2599
2600 return dca;
992ba7d8 2601
43c7bace 2602}
992ba7d8 2603
43c7bace 2604//---------------------------
2605Double_t AliAnalysisTaskSELc2V0bachelor::GetAlpha(Double_t xyz[3],Double_t pxpypz[3])
2606{
2607 //
2608 // To estimate alpha according to what done in the AliExternalTrackParam::Set(...) method
2609 //
992ba7d8 2610
43c7bace 2611 Double_t alpha = 0.;
2612
2613 const double kSafe = 1e-5;
2614 Double_t radPos2 = xyz[0]*xyz[0]+xyz[1]*xyz[1];
2615 Double_t radMax = 45.; // approximately ITS outer radius
2616 if (radPos2 < radMax*radMax) { // inside the ITS
2617 alpha = TMath::ATan2(pxpypz[1],pxpypz[0]);
2618 } else { // outside the ITS
2619 Float_t phiPos = TMath::Pi()+TMath::ATan2(-xyz[1], -xyz[0]);
2620 alpha =
2621 TMath::DegToRad()*(20*((((Int_t)(phiPos*TMath::RadToDeg()))/20))+10);
2622 }
992ba7d8 2623
43c7bace 2624 Double_t cs=TMath::Cos(alpha), sn=TMath::Sin(alpha);
2625 // protection: avoid alpha being too close to 0 or +-pi/2
2626 if (TMath::Abs(sn)<2*kSafe) {
2627 if (alpha>0) alpha += alpha< TMath::Pi()/2. ? 2*kSafe : -2*kSafe;
2628 else alpha += alpha>-TMath::Pi()/2. ? -2*kSafe : 2*kSafe;
2629 cs=TMath::Cos(alpha);
2630 sn=TMath::Sin(alpha);
2631 }
2632 else if (TMath::Abs(cs)<2*kSafe) {
2633 if (alpha>0) alpha += alpha> TMath::Pi()/2. ? 2*kSafe : -2*kSafe;
2634 else alpha += alpha>-TMath::Pi()/2. ? 2*kSafe : -2*kSafe;
2635 cs=TMath::Cos(alpha);
2636 sn=TMath::Sin(alpha);
992ba7d8 2637 }
2638
2639
43c7bace 2640 return alpha;
992ba7d8 2641}
43c7bace 2642
2643//---------------------------
2644Double_t AliAnalysisTaskSELc2V0bachelor::Det(Double_t a00, Double_t a01,
2645 Double_t a10, Double_t a11) const {
2646 //--------------------------------------------------------------------
2647 // This function calculates locally a 2x2 determinant.
2648 // This is a copy of the AliCascadeVertexer::Det(...) method
2649 //--------------------------------------------------------------------
2650 return a00*a11 - a01*a10;
2651}
2652
2653//---------------------------
2654Double_t AliAnalysisTaskSELc2V0bachelor::Det(Double_t a00,Double_t a01,Double_t a02,
2655 Double_t a10,Double_t a11,Double_t a12,
2656 Double_t a20,Double_t a21,Double_t a22) const {
2657 //--------------------------------------------------------------------
2658 // This function calculates locally a 3x3 determinant
2659 // This is a copy of the AliCascadeVertexer::Det(...) method
2660 //--------------------------------------------------------------------
2661 return a00*Det(a11,a12,a21,a22)-a01*Det(a10,a12,a20,a22)+a02*Det(a10,a11,a20,a21);
2662}
2663
53c91ed7 2664//----------------------------------------------------------------------------
2665Int_t AliAnalysisTaskSELc2V0bachelor::MatchToMClabelC(AliAODRecoCascadeHF *candidate,
2666 TClonesArray *mcArray)
2667{
2668 //
2669 // Check if this candidate is matched to a MC signal Lc -> p K0S + X
2670 // If no, return -1
2671 // If yes, return label (>=0) of the AliAODMCParticle
2672 //
2673
2674 AliAODv0 *theV0 = dynamic_cast<AliAODv0*>(candidate->Getv0()); // the V0
2675 AliVTrack *trk = dynamic_cast<AliVTrack*>(candidate->GetBachelor()); // the bachelor
2676 if (!trk || !theV0) return -1;
2677
2678 if (trk->GetLabel()==-1) return -1;
2679 Int_t bachLabels = TMath::Abs(trk->GetLabel());
2680 AliAODMCParticle*bachelorMC = dynamic_cast<AliAODMCParticle*>(mcArray->At(bachLabels));
2681 if (!bachelorMC) return -1;
2682 if (TMath::Abs(bachelorMC->GetPdgCode())!=2212) return -1;
2683 Int_t indexMotherBach = bachelorMC->GetMother();
2684 if (indexMotherBach==-1) return -1;
2685
2686 Int_t pdgDg2prong[2] = {211,211};
2687 Int_t lab2Prong = theV0->MatchToMC(310,mcArray,2,pdgDg2prong); // the V0
2688 if(lab2Prong<0) return -1;
2689 AliAODMCParticle*partK0S = dynamic_cast<AliAODMCParticle*>(mcArray->At(lab2Prong));
2690 if (!partK0S) return -1;
2691 Int_t indexMotherK0S = partK0S->GetMother();
2692 if (indexMotherK0S==-1) return -1;
2693 AliAODMCParticle*partK0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(indexMotherK0S));
2694 if (!partK0) return -1;
2695 Int_t indexMotherK0 = partK0->GetMother();
2696 if (indexMotherK0==-1) return -1;
2697
2698 if (indexMotherBach!=indexMotherK0) return -1; // p e K0S sono fratelli
2699
2700 AliAODMCParticle*partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(indexMotherK0));
2701 if (!partLc) return -1;
2702 Int_t ndg2 = partLc->GetDaughter(1)-partLc->GetDaughter(0)+1;
2703 if (ndg2==2) return -1;
2704
2db138e0 2705 TString stringaCheck = Form(">>>>>>>> %d -> ",partLc->GetPdgCode());
53c91ed7 2706 for(Int_t ii=0; ii<ndg2; ii++) {
2707 AliAODMCParticle* partDau=(AliAODMCParticle*)(mcArray->At(partLc->GetDaughter(0)+ii));
2db138e0 2708 stringaCheck.Append(Form(" %d",partDau->GetPdgCode()));
53c91ed7 2709 }
516f546e 2710 //printf("%s \n",stringaCheck.Data());
53c91ed7 2711
2712 return indexMotherBach;
2713
2714}
516f546e 2715//--------------------------------------------------------------------------
14fe9f43 2716Int_t AliAnalysisTaskSELc2V0bachelor::SearchForCommonMother(TClonesArray *mcArray,
2717 Int_t dgLabels[10],Int_t ndg,
516f546e 2718 Int_t &ndgCk, Int_t *pdgDg, Int_t &absLabelMother, Int_t &nDauCand) const
14fe9f43 2719{
2720 //
2721 // Check if this candidate is matched to a MC signal
2722 // If no, return 0
2723 // If yes, return pdgCode of particle
2724 //
2725
2726 Int_t lab=-1,labMother=-1,pdgMother=0;
2727 AliAODMCParticle *part=0;
2728 AliAODMCParticle *mother=0;
2729
2730 // loop on daughter labels
2731 TArrayI **labelMother = new TArrayI*[ndg];
2732 for(Int_t i=0; i<ndg; i++) labelMother[i] = new TArrayI(0);
2733 for(Int_t i=0; i<ndg; i++) {
2734 lab = TMath::Abs(dgLabels[i]);
2735 if(lab<0) {
516f546e 2736 AliDebug(2,Form("daughter with negative label %d",lab));
14fe9f43 2737 return 0;
2738 }
2739 part = (AliAODMCParticle*)mcArray->At(lab);
2740 if(!part) {
516f546e 2741 AliDebug(2,"no MC particle");
14fe9f43 2742 return 0;
2743 }
2744
2745 mother = part;
2746 while(mother->GetMother()>=0) {
2747 labMother=mother->GetMother();
2748 mother = (AliAODMCParticle*)mcArray->At(labMother);
2749 if(!mother) {
516f546e 2750 AliDebug(2,"no MC mother particle");
14fe9f43 2751 break;
2752 }
2753 pdgMother = TMath::Abs(mother->GetPdgCode());
2754 if (pdgMother<10 || (pdgMother>18 && pdgMother<111)) {
2755 break;
2756 }
2757 labelMother[i]->Set(labelMother[i]->GetSize()+1);
2758 labelMother[i]->AddAt(labMother,labelMother[i]->GetSize()-1);
2759 }
2760
2761 } // end loop on daughters
2762
516f546e 2763
2764 TString stringaCheck;
14fe9f43 2765 for(Int_t i=0; i<ndg; i++) {
2766 AliAODMCParticle*part0 = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels[i]));
516f546e 2767 stringaCheck.Append(Form("part[%d]->GetLabel()=%d(%d) | ",i,dgLabels[i],part0->GetPdgCode()));
2768 stringaCheck.Append(Form("labelMother[%d] = ",i));
14fe9f43 2769 for (Int_t jj=0;jj<labelMother[i]->GetSize(); jj++)
516f546e 2770 stringaCheck.Append(Form("%d, ",labelMother[i]->At(jj)));
14fe9f43 2771 }
516f546e 2772 printf("%s \n",stringaCheck.Data());
14fe9f43 2773 Int_t pdgToBeReturned=0;
516f546e 2774
2775 TString stringaCheck2;
2776 ndgCk=ndg;
2777 pdgDg = new Int_t[ndgCk];
2778 for (Int_t index=1; index<ndg; index++) {
2779 Bool_t found=kFALSE;
2780 for (Int_t jj=0;jj<labelMother[index]->GetSize(); jj++) {
2781 for (Int_t ii=0;ii<labelMother[0]->GetSize(); ii++) {
2782 if (labelMother[0]->At(ii)==labelMother[index]->At(jj) &&
14fe9f43 2783 labelMother[0]->At(ii)!=0 && labelMother[0]->At(ii)!=1 && !found) {
2784 mother = (AliAODMCParticle*)mcArray->At(labelMother[0]->At(ii));
2785 pdgToBeReturned=mother->GetPdgCode();
2786 absLabelMother=labelMother[0]->At(ii);
761712c3 2787 AliDebug(2,Form("FOUND label for the mother of this candidate: %d (PDG=%d)\n",labelMother[0]->At(ii),pdgToBeReturned));
516f546e 2788 //mother->Print();
2789 nDauCand=mother->GetNDaughters();
14fe9f43 2790 found = kTRUE;
516f546e 2791 AliAODMCParticle *partMC = (AliAODMCParticle*)mcArray->At(dgLabels[0]);
2792 pdgDg[0]=partMC->GetPdgCode();
2793 partMC = (AliAODMCParticle*)mcArray->At(dgLabels[index]);
2794 pdgDg[index]=partMC->GetPdgCode();
2795 if (index==1) stringaCheck2.Append(Form("found daughters -> %d(%d)",dgLabels[0],pdgDg[0]));
2796 stringaCheck2.Append(Form(" %d(%d)",dgLabels[index],pdgDg[index]));
14fe9f43 2797 break;
2798 }
2799 }
516f546e 2800 if (found) break;
14fe9f43 2801 }
2802 }
516f546e 2803 stringaCheck2.Prepend(Form("Ecco quanto trovato: %d(%d) with %d daughters; ",absLabelMother,pdgToBeReturned,nDauCand));
2804 printf("%s \n",stringaCheck2.Data());
14fe9f43 2805
2806 delete [] labelMother;
2807
2808 return pdgToBeReturned;
2809
2810}
516f546e 2811
2812void AliAnalysisTaskSELc2V0bachelor::TrackRotation(AliRDHFCutsLctoV0 * cuts, AliAODRecoCascadeHF *part, TString appendthis)
2813{
2814
2815 AliAODRecoCascadeHF *partCopy = new AliAODRecoCascadeHF(*part);
2816
2817 Double_t px[2]={partCopy->PxProng(0),partCopy->PxProng(1)};
2818 Double_t py[2]={partCopy->PyProng(0),partCopy->PyProng(1)};
2819 Double_t pz[2]={partCopy->PzProng(0),partCopy->PzProng(1)};
2820
2821 Double_t pt = partCopy->Pt();
2822 Int_t pdgD=4122;
2823 UInt_t pdgLc2pK0S[2]={2212,310};
2824 Double_t minv2 = partCopy->InvMass2(2,pdgLc2pK0S);
2825 Double_t mass=TMath::Sqrt(minv2);
2826 Double_t rapid = partCopy->Y(pdgD);
2827
2828 TString fillthis="hMassVsPtVsY"+appendthis;
2829 if ( ( ( (cuts->IsSelected(part,AliRDHFCuts::kAll))&(AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) ) {
2830 ((TH3F*)(fOutputPIDBachTR->FindObject(fillthis)))->Fill(mass,pt,rapid);
2831 }
2832
2833 Int_t nRotated=0;
2834 Double_t massRot=0;// calculated later only if candidate is acceptable
2835 // Double_t angleProngXY=TMath::ACos((px[0]*px[1]+py[0]*py[1])/TMath::Sqrt((px[0]*px[0]+py[0]*py[0])*(px[1]*px[1]+py[1]*py[1])));
2836 // Double_t ptOrig=pt;
2837 Double_t rotStep=(fMaxAngleForRot-fMinAngleForRot)/(fNRotations-1); // -1 is to ensure that the last rotation is done with angle=fMaxAngleForRot
2838
2839 for(Int_t irot=0; irot<fNRotations; irot++){
2840 Double_t phirot=fMinAngleForRot+rotStep*irot;
2841 Double_t tmpx=px[0];
2842 Double_t tmpy=py[0];
2843 px[0]=tmpx*TMath::Cos(phirot)-tmpy*TMath::Sin(phirot);
2844 py[0]=tmpx*TMath::Sin(phirot)+tmpy*TMath::Cos(phirot);
2845 partCopy->SetPxPyPzProngs(2,px,py,pz);
2846 pt = partCopy->Pt();
2847 minv2 = partCopy->InvMass2(2,pdgLc2pK0S);
2848 massRot=TMath::Sqrt(minv2);
2849 rapid = partCopy->Y(pdgD);
2850 //if(minv2>fMinMass*fMinMass && minv2<fMaxMass*fMaxMass){
2851 if ( ( ( (cuts->IsSelected(partCopy,AliRDHFCuts::kAll))&(AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) ) {
2852
2853 fillthis="histLcMassByK0S"+appendthis;
2854 ((TH2F*)(fOutputPIDBachTR->FindObject(fillthis)))->Fill(massRot,pt);
2855
2856 fillthis="hMassVsPtVsYRot"+appendthis;
2857 ((TH3F*)(fOutputPIDBachTR->FindObject(fillthis)))->Fill(mass,pt,rapid);
2858 fillthis="hDeltaMass"+appendthis;
2859 ((TH1F*)(fOutputPIDBachTR->FindObject(fillthis)))->Fill(massRot-mass);
2860 //if(fFullAnalysis){
2861 //Double_t pointRot[5]={mass,massRot-mass,ptOrig,pt-ptOrig,angleProngXY};
2862 //fillthis="hDeltaMassFullAnalysis"+appendthis;
2863 //((THnSparse*)(fOutputPIDBachTR->FindObject(fillthis)))->Fill(pointRot);
2864 //}
2865 nRotated++;
2866 //}
2867 }
2868 px[0]=tmpx;
2869 py[0]=tmpy;
2870 }
2871 fillthis="hNormRotated"+appendthis;
2872 ((TH1F*)(fOutputPIDBachTR->FindObject(fillthis)))->Fill(nRotated);
2873
2874 delete partCopy;
2875
2876 return;
2877
2878}