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