1 /*************************************************************************
4 * Task for Jet Chemistry Analysis in PWG4 Jet Task Force Train *
5 * Analysis of K0s, Lambda and Antilambda with and without Jetevents *
7 *************************************************************************/
9 /**************************************************************************
10 * Copyright(c) 1998-2012, ALICE Experiment at CERN, All rights reserved. *
12 * Author: The ALICE Off-line Project. *
13 * Contributors are mentioned in the code where appropriate. *
15 * Permission to use, copy, modify and distribute this software and its *
16 * documentation strictly for non-commercial purposes is hereby grante *
18 * without fee, provided that the above copyright notice appears in all *
19 * copies and that both the copyright notice and this permission notice *
20 * appear in the supporting documentation. The authors make no claims *
21 * about the suitability of this software for any purpose. It is *
22 * provided "as is" without express or implied warranty. *
23 **************************************************************************/
41 #include "THnSparse.h"
44 #include "AliAnalysisHelperJetTasks.h"
45 #include "TDatabasePDG.h"
47 #include "AliAnalysisManager.h"
48 #include "AliAODHandler.h"
49 #include "AliAODInputHandler.h"
50 #include "AliESDEvent.h"
51 #include "AliGenPythiaEventHeader.h"
52 #include "AliGenHijingEventHeader.h"
53 #include "AliGenEventHeader.h"
54 #include "TLorentzVector.h"
55 #include "AliAODEvent.h"
56 #include "AliAODJet.h"
58 #include "AliAODTrack.h"
59 #include "AliCentrality.h"
60 #include "AliAnalysisTaskSE.h"
61 #include "AliESDtrack.h"
62 #include "AliESDtrackCuts.h"
63 #include "AliESDEvent.h"
64 #include "AliESDInputHandler.h"
66 #include "AliPIDResponse.h"
67 #include "AliAODPid.h"
68 #include "AliExternalTrackParam.h"
69 #include "AliAnalysisTaskJetChem.h"
70 #include "AliPhysicsSelection.h"
71 #include "AliBackgroundSelection.h"
72 #include "AliInputEventHandler.h"
73 #include "AliAODMCHeader.h"
74 #include "AliAODPid.h"
75 #include "AliVEvent.h"
76 #include "AliAODMCParticle.h"
80 ClassImp(AliAnalysisTaskJetChem)
82 //____________________________________________________________________________
83 AliAnalysisTaskJetChem::AliAnalysisTaskJetChem()
84 : AliAnalysisTaskFragmentationFunction()
97 ,fCutV0cosPointAngle(0)
98 ,fCutChi2PosDaughter(0)
99 ,fCutChi2NegDaughter(0)
106 ,fCutDcaV0Daughters(0)
107 ,fCutDcaPosToPrimVertex(0)
108 ,fCutDcaNegToPrimVertex(0)
118 ,fFFHistosRecCutsK0Evt(0)
119 ,fFFHistosIMK0AllEvt(0)
121 ,fFFHistosIMK0Cone(0)
125 ,fFFHistosIMLaAllEvt(0)
127 ,fFFHistosIMLaCone(0)
131 ,fListFeeddownLaCand(0)
132 ,fListFeeddownALaCand(0)
138 ,fListMCgenK0sCone(0)
140 ,fListMCgenALaCone(0)
141 ,IsArmenterosSelected(0)
142 ,fFFHistosIMALaAllEvt(0)
143 ,fFFHistosIMALaJet(0)
144 ,fFFHistosIMALaCone(0)
160 ,fFFIMLaNBinsJetPt(0)
201 ,fh2ProperLifetimeK0sVsPtBeforeCut(0)
202 ,fh2ProperLifetimeK0sVsPtAfterCut(0)
204 ,fh1DcaV0Daughters(0)
205 ,fh1DcaPosToPrimVertex(0)
206 ,fh1DcaNegToPrimVertex(0)
207 ,fh2ArmenterosBeforeCuts(0)
208 ,fh2ArmenterosAfterCuts(0)
211 ,fh1PosDaughterCharge(0)
212 ,fh1NegDaughterCharge(0)
219 ,fh3InvMassEtaTrackPtK0s(0)
220 ,fh3InvMassEtaTrackPtLa(0)
221 ,fh3InvMassEtaTrackPtALa(0)
227 ,fh2MCEtagenK0Cone(0)
228 ,fh2MCEtagenLaCone(0)
229 ,fh2MCEtagenALaCone(0)
230 ,fh1FFIMK0ConeSmear(0)
231 ,fh1FFIMLaConeSmear(0)
232 ,fh1FFIMALaConeSmear(0)
236 ,fh3MCrecK0ConeSmear(0)
237 ,fh3MCrecLaConeSmear(0)
238 ,fh3MCrecALaConeSmear(0)
244 ,fh3IMK0MedianCone(0)
245 ,fh3IMLaMedianCone(0)
246 ,fh3IMALaMedianCone(0)
249 ,fh1MCMultiplicityPrimary(0)
250 ,fh1MCMultiplicityTracks(0)
253 ,fh3FeedDownLaCone(0)
254 ,fh3FeedDownALaCone(0)
255 ,fh1MCProdRadiusK0s(0)
256 ,fh1MCProdRadiusLambda(0)
257 ,fh1MCProdRadiusAntiLambda(0)
261 ,fh1MCPtAntiLambda(0)
269 ,fh1MCRapAntiLambda(0)
273 ,fh1MCEtaAntiLambda(0)
276 // default constructor
279 //__________________________________________________________________________________________
280 AliAnalysisTaskJetChem::AliAnalysisTaskJetChem(const char *name)
281 : AliAnalysisTaskFragmentationFunction(name)
294 ,fCutV0cosPointAngle(0)
295 ,fCutChi2PosDaughter(0)
296 ,fCutChi2NegDaughter(0)
303 ,fCutDcaV0Daughters(0)
304 ,fCutDcaPosToPrimVertex(0)
305 ,fCutDcaNegToPrimVertex(0)
315 ,fFFHistosRecCutsK0Evt(0)
316 ,fFFHistosIMK0AllEvt(0)
318 ,fFFHistosIMK0Cone(0)
322 ,fFFHistosIMLaAllEvt(0)
324 ,fFFHistosIMLaCone(0)
328 ,fListFeeddownLaCand(0)
329 ,fListFeeddownALaCand(0)
335 ,fListMCgenK0sCone(0)
337 ,fListMCgenALaCone(0)
338 ,IsArmenterosSelected(0)
339 ,fFFHistosIMALaAllEvt(0)
340 ,fFFHistosIMALaJet(0)
341 ,fFFHistosIMALaCone(0)
357 ,fFFIMLaNBinsJetPt(0)
398 ,fh2ProperLifetimeK0sVsPtBeforeCut(0)
399 ,fh2ProperLifetimeK0sVsPtAfterCut(0)
401 ,fh1DcaV0Daughters(0)
402 ,fh1DcaPosToPrimVertex(0)
403 ,fh1DcaNegToPrimVertex(0)
404 ,fh2ArmenterosBeforeCuts(0)
405 ,fh2ArmenterosAfterCuts(0)
408 ,fh1PosDaughterCharge(0)
409 ,fh1NegDaughterCharge(0)
416 ,fh3InvMassEtaTrackPtK0s(0)
417 ,fh3InvMassEtaTrackPtLa(0)
418 ,fh3InvMassEtaTrackPtALa(0)
424 ,fh2MCEtagenK0Cone(0)
425 ,fh2MCEtagenLaCone(0)
426 ,fh2MCEtagenALaCone(0)
427 ,fh1FFIMK0ConeSmear(0)
428 ,fh1FFIMLaConeSmear(0)
429 ,fh1FFIMALaConeSmear(0)
433 ,fh3MCrecK0ConeSmear(0)
434 ,fh3MCrecLaConeSmear(0)
435 ,fh3MCrecALaConeSmear(0)
441 ,fh3IMK0MedianCone(0)
442 ,fh3IMLaMedianCone(0)
443 ,fh3IMALaMedianCone(0)
446 ,fh1MCMultiplicityPrimary(0)
447 ,fh1MCMultiplicityTracks(0)
450 ,fh3FeedDownLaCone(0)
451 ,fh3FeedDownALaCone(0)
452 ,fh1MCProdRadiusK0s(0)
453 ,fh1MCProdRadiusLambda(0)
454 ,fh1MCProdRadiusAntiLambda(0)
458 ,fh1MCPtAntiLambda(0)
466 ,fh1MCRapAntiLambda(0)
470 ,fh1MCEtaAntiLambda(0)
476 DefineOutput(1,TList::Class());
479 //__________________________________________________________________________________________________________________________
480 AliAnalysisTaskJetChem::AliAnalysisTaskJetChem(const AliAnalysisTaskJetChem ©)
481 : AliAnalysisTaskFragmentationFunction()
483 ,fAnalysisMC(copy.fAnalysisMC)
484 ,fDeltaVertexZ(copy.fDeltaVertexZ)
485 ,fCutjetEta(copy.fCutjetEta)
486 ,fCuttrackNegNcls(copy.fCuttrackNegNcls)
487 ,fCuttrackPosNcls(copy.fCuttrackPosNcls)
488 ,fCutPostrackRap(copy.fCutPostrackRap)
489 ,fCutNegtrackRap(copy.fCutNegtrackRap)
490 ,fCutRap(copy.fCutRap)
491 ,fCutPostrackEta(copy.fCutPostrackEta)
492 ,fCutNegtrackEta(copy.fCutNegtrackEta)
493 ,fCutEta(copy.fCutEta)
494 ,fCutV0cosPointAngle(copy.fCutV0cosPointAngle)
495 ,fCutChi2PosDaughter(copy.fCutChi2PosDaughter)
496 ,fCutChi2NegDaughter(copy.fCutChi2NegDaughter)
497 ,fKinkDaughters(copy.fKinkDaughters)
498 ,fRequireTPCRefit(copy.fRequireTPCRefit)
499 ,fCutArmenteros(copy.fCutArmenteros)
500 ,fCutV0DecayMin(copy.fCutV0DecayMin)
501 ,fCutV0DecayMax(copy.fCutV0DecayMax)
502 ,fCutV0totMom(copy.fCutV0totMom)
503 ,fCutDcaV0Daughters(copy.fCutDcaV0Daughters)
504 ,fCutDcaPosToPrimVertex(copy.fCutDcaPosToPrimVertex)
505 ,fCutDcaNegToPrimVertex(copy.fCutDcaNegToPrimVertex)
506 ,fCutV0RadiusMin(copy.fCutV0RadiusMin)
507 ,fCutV0RadiusMax(copy.fCutV0RadiusMax)
508 ,fCutBetheBloch(copy.fCutBetheBloch)
509 ,fCutRatio(copy.fCutRatio)
510 ,fK0Type(copy.fK0Type)
511 ,fFilterMaskK0(copy.fFilterMaskK0)
512 ,fListK0s(copy.fListK0s)
513 ,fPIDResponse(copy.fPIDResponse)
514 ,fV0QAK0(copy.fV0QAK0)
515 ,fFFHistosRecCutsK0Evt(copy.fFFHistosRecCutsK0Evt)
516 ,fFFHistosIMK0AllEvt(copy.fFFHistosIMK0AllEvt)
517 ,fFFHistosIMK0Jet(copy.fFFHistosIMK0Jet)
518 ,fFFHistosIMK0Cone(copy.fFFHistosIMK0Cone)
519 ,fLaType(copy.fLaType)
520 ,fFilterMaskLa(copy.fFilterMaskLa)
521 ,fListLa(copy.fListLa)
522 ,fFFHistosIMLaAllEvt(copy.fFFHistosIMLaAllEvt)
523 ,fFFHistosIMLaJet(copy.fFFHistosIMLaJet)
524 ,fFFHistosIMLaCone(copy.fFFHistosIMLaCone)
525 ,fALaType(copy.fALaType)
526 ,fFilterMaskALa(copy.fFilterMaskALa)
527 ,fListALa(copy.fListALa)
528 ,fListFeeddownLaCand(copy.fListFeeddownLaCand)
529 ,fListFeeddownALaCand(copy.fListFeeddownALaCand)
530 ,jetConeFDLalist(copy.jetConeFDLalist)
531 ,jetConeFDALalist(copy.jetConeFDALalist)
532 ,fListMCgenK0s(copy.fListMCgenK0s)
533 ,fListMCgenLa(copy.fListMCgenLa)
534 ,fListMCgenALa(copy.fListMCgenALa)
535 ,fListMCgenK0sCone(copy.fListMCgenK0sCone)
536 ,fListMCgenLaCone(copy.fListMCgenLaCone)
537 ,fListMCgenALaCone(copy.fListMCgenALaCone)
538 ,IsArmenterosSelected(copy.IsArmenterosSelected)
539 ,fFFHistosIMALaAllEvt(copy.fFFHistosIMALaAllEvt)
540 ,fFFHistosIMALaJet(copy.fFFHistosIMALaJet)
541 ,fFFHistosIMALaCone(copy.fFFHistosIMALaCone)
542 ,fFFIMNBinsJetPt(copy.fFFIMNBinsJetPt)
543 ,fFFIMJetPtMin(copy.fFFIMJetPtMin)
544 ,fFFIMJetPtMax(copy.fFFIMJetPtMax)
545 ,fFFIMNBinsInvM(copy.fFFIMNBinsInvM)
546 ,fFFIMInvMMin(copy.fFFIMInvMMin)
547 ,fFFIMInvMMax(copy.fFFIMInvMMax)
548 ,fFFIMNBinsPt(copy.fFFIMNBinsPt)
549 ,fFFIMPtMin(copy.fFFIMPtMin)
550 ,fFFIMPtMax(copy.fFFIMPtMax)
551 ,fFFIMNBinsXi(copy.fFFIMNBinsXi)
552 ,fFFIMXiMin(copy.fFFIMXiMin)
553 ,fFFIMXiMax(copy.fFFIMXiMax)
554 ,fFFIMNBinsZ(copy.fFFIMNBinsZ)
555 ,fFFIMZMin(copy.fFFIMZMin)
556 ,fFFIMZMax(copy.fFFIMZMax)
557 ,fFFIMLaNBinsJetPt(copy.fFFIMLaNBinsJetPt)
558 ,fFFIMLaJetPtMin(copy.fFFIMLaJetPtMin)
559 ,fFFIMLaJetPtMax(copy.fFFIMLaJetPtMax)
560 ,fFFIMLaNBinsInvM(copy.fFFIMLaNBinsInvM)
561 ,fFFIMLaInvMMin(copy.fFFIMLaInvMMin)
562 ,fFFIMLaInvMMax(copy.fFFIMLaInvMMax)
563 ,fFFIMLaNBinsPt(copy.fFFIMLaNBinsPt)
564 ,fFFIMLaPtMin(copy.fFFIMLaPtMin)
565 ,fFFIMLaPtMax(copy.fFFIMLaPtMax)
566 ,fFFIMLaNBinsXi(copy.fFFIMLaNBinsXi)
567 ,fFFIMLaXiMin(copy.fFFIMLaXiMin)
568 ,fFFIMLaXiMax(copy.fFFIMLaXiMax)
569 ,fFFIMLaNBinsZ(copy.fFFIMLaNBinsZ)
570 ,fFFIMLaZMin(copy.fFFIMLaZMin)
571 ,fFFIMLaZMax(copy.fFFIMLaZMax)
572 ,fh1EvtAllCent(copy.fh1EvtAllCent)
574 ,fh1K0Mult(copy.fh1K0Mult)
575 ,fh1dPhiJetK0(copy.fh1dPhiJetK0)
576 ,fh1LaMult(copy.fh1LaMult)
577 ,fh1dPhiJetLa(copy.fh1dPhiJetLa)
578 ,fh1ALaMult(copy.fh1ALaMult)
579 ,fh1dPhiJetALa(copy.fh1dPhiJetALa)
580 ,fh1JetEta(copy.fh1JetEta)
581 ,fh1JetPhi(copy.fh1JetPhi)
582 ,fh2JetEtaPhi(copy.fh2JetEtaPhi)
583 ,fh1V0JetPt(copy.fh1V0JetPt)
584 ,fh2FFJetTrackEta(copy.fh2FFJetTrackEta)
585 ,fh1trackPosNCls(copy.fh1trackPosNCls)
586 ,fh1trackNegNCls(copy.fh1trackNegNCls)
587 ,fh1trackPosRap(copy.fh1trackPosRap)
588 ,fh1trackNegRap(copy.fh1trackNegRap)
589 ,fh1V0Rap(copy.fh1V0Rap)
590 ,fh1trackPosEta(copy.fh1trackPosEta)
591 ,fh1trackNegEta(copy.fh1trackNegEta)
592 ,fh1V0Eta(copy.fh1V0Eta)
593 ,fh1V0totMom(copy.fh1V0totMom)
594 ,fh1CosPointAngle(copy.fh1CosPointAngle)
595 ,fh1Chi2Pos(copy.fh1Chi2Pos)
596 ,fh1Chi2Neg(copy.fh1Chi2Neg)
597 ,fh1DecayLengthV0(copy.fh1DecayLengthV0)
598 ,fh2ProperLifetimeK0sVsPtBeforeCut(copy.fh2ProperLifetimeK0sVsPtBeforeCut)
599 ,fh2ProperLifetimeK0sVsPtAfterCut(copy.fh2ProperLifetimeK0sVsPtAfterCut)
600 ,fh1V0Radius(copy.fh1V0Radius)
601 ,fh1DcaV0Daughters(copy.fh1DcaV0Daughters)
602 ,fh1DcaPosToPrimVertex(copy.fh1DcaPosToPrimVertex)
603 ,fh1DcaNegToPrimVertex(copy.fh1DcaNegToPrimVertex)
604 ,fh2ArmenterosBeforeCuts(copy.fh2ArmenterosBeforeCuts)
605 ,fh2ArmenterosAfterCuts(copy.fh2ArmenterosAfterCuts)
606 ,fh2BBLaPos(copy.fh2BBLaPos)
607 ,fh2BBLaNeg(copy.fh2BBLaPos)
608 ,fh1PosDaughterCharge(copy.fh1PosDaughterCharge)
609 ,fh1NegDaughterCharge(copy.fh1NegDaughterCharge)
610 ,fh1PtMCK0s(copy.fh1PtMCK0s)
611 ,fh1PtMCLa(copy.fh1PtMCLa)
612 ,fh1PtMCALa(copy.fh1PtMCALa)
613 ,fh1EtaK0s(copy.fh1EtaK0s)
614 ,fh1EtaLa(copy.fh1EtaLa)
615 ,fh1EtaALa(copy.fh1EtaALa)
616 ,fh3InvMassEtaTrackPtK0s(copy.fh3InvMassEtaTrackPtK0s)
617 ,fh3InvMassEtaTrackPtLa(copy.fh3InvMassEtaTrackPtLa)
618 ,fh3InvMassEtaTrackPtALa(copy.fh3InvMassEtaTrackPtALa)
619 ,fh1TrackMultCone(copy.fh1TrackMultCone)
620 ,fh2TrackMultCone(copy.fh2TrackMultCone)
621 ,fh2MCgenK0Cone(copy.fh2MCgenK0Cone)
622 ,fh2MCgenLaCone(copy.fh2MCgenLaCone)
623 ,fh2MCgenALaCone(copy.fh2MCgenALaCone)
624 ,fh2MCEtagenK0Cone(copy.fh2MCEtagenK0Cone)
625 ,fh2MCEtagenLaCone(copy.fh2MCEtagenLaCone)
626 ,fh2MCEtagenALaCone(copy.fh2MCEtagenALaCone)
627 ,fh1FFIMK0ConeSmear(copy.fh1FFIMK0ConeSmear)
628 ,fh1FFIMLaConeSmear(copy.fh1FFIMLaConeSmear)
629 ,fh1FFIMALaConeSmear(copy.fh1FFIMALaConeSmear)
630 ,fh3MCrecK0Cone(copy.fh3MCrecK0Cone)
631 ,fh3MCrecLaCone(copy.fh3MCrecLaCone)
632 ,fh3MCrecALaCone(copy.fh3MCrecALaCone)
633 ,fh3MCrecK0ConeSmear(copy.fh3MCrecK0ConeSmear)
634 ,fh3MCrecLaConeSmear(copy.fh3MCrecLaConeSmear)
635 ,fh3MCrecALaConeSmear(copy.fh3MCrecALaConeSmear)
636 ,fh3SecContinCone(copy.fh3SecContinCone)
637 ,fh3StrContinCone(copy.fh3StrContinCone)
638 ,fh3IMK0PerpCone(copy.fh3IMK0PerpCone)
639 ,fh3IMLaPerpCone(copy.fh3IMLaPerpCone)
640 ,fh3IMALaPerpCone(copy.fh3IMALaPerpCone)
641 ,fh3IMK0MedianCone(copy.fh3IMK0MedianCone)
642 ,fh3IMLaMedianCone(copy.fh3IMLaMedianCone)
643 ,fh3IMALaMedianCone(copy.fh3IMALaMedianCone)
644 ,fh1MedianEta(copy.fh1MedianEta)
645 ,fh1JetPtMedian(copy.fh1JetPtMedian)
646 ,fh1MCMultiplicityPrimary(copy.fh1MCMultiplicityPrimary)
647 ,fh1MCMultiplicityTracks(copy.fh1MCMultiplicityTracks)
648 ,fh3FeedDownLa(copy.fh3FeedDownLa)
649 ,fh3FeedDownALa(copy.fh3FeedDownALa)
650 ,fh3FeedDownLaCone(copy.fh3FeedDownLaCone)
651 ,fh3FeedDownALaCone(copy.fh3FeedDownALaCone)
652 ,fh1MCProdRadiusK0s(copy.fh1MCProdRadiusK0s)
653 ,fh1MCProdRadiusLambda(copy.fh1MCProdRadiusLambda)
654 ,fh1MCProdRadiusAntiLambda(copy.fh1MCProdRadiusAntiLambda)
655 ,fh1MCPtV0s(copy.fh1MCPtV0s)
656 ,fh1MCPtK0s(copy.fh1MCPtK0s)
657 ,fh1MCPtLambda(copy.fh1MCPtLambda)
658 ,fh1MCPtAntiLambda(copy.fh1MCPtAntiLambda)
659 ,fh1MCXiPt(copy.fh1MCXiPt)
660 ,fh1MCXibarPt(copy.fh1MCXibarPt)
661 ,fh2MCEtaVsPtK0s(copy.fh2MCEtaVsPtK0s)
662 ,fh2MCEtaVsPtLa(copy.fh2MCEtaVsPtLa)
663 ,fh2MCEtaVsPtALa(copy.fh2MCEtaVsPtALa)
664 ,fh1MCRapK0s(copy.fh1MCRapK0s)
665 ,fh1MCRapLambda(copy.fh1MCRapLambda)
666 ,fh1MCRapAntiLambda(copy.fh1MCRapAntiLambda)
667 ,fh1MCEtaAllK0s(copy.fh1MCEtaAllK0s)
668 ,fh1MCEtaK0s(copy.fh1MCEtaK0s)
669 ,fh1MCEtaLambda(copy.fh1MCEtaLambda)
670 ,fh1MCEtaAntiLambda(copy.fh1MCEtaAntiLambda)
677 // _________________________________________________________________________________________________________________________________
678 AliAnalysisTaskJetChem& AliAnalysisTaskJetChem::operator=(const AliAnalysisTaskJetChem& o)
683 AliAnalysisTaskFragmentationFunction::operator=(o);
685 fAnalysisMC = o.fAnalysisMC;
686 fDeltaVertexZ = o.fDeltaVertexZ;
687 fCutjetEta = o.fCutjetEta;
688 fCuttrackNegNcls = o.fCuttrackNegNcls;
689 fCuttrackPosNcls = o.fCuttrackPosNcls;
690 fCutPostrackRap = o.fCutPostrackRap;
691 fCutNegtrackRap = o.fCutNegtrackRap;
693 fCutPostrackEta = o.fCutPostrackEta;
694 fCutNegtrackEta = o.fCutNegtrackEta;
696 fCutV0cosPointAngle = o.fCutV0cosPointAngle;
697 fCutChi2PosDaughter = o.fCutChi2PosDaughter;
698 fCutChi2NegDaughter = o.fCutChi2NegDaughter;
699 fKinkDaughters = o.fKinkDaughters;
700 fRequireTPCRefit = o.fRequireTPCRefit;
701 fCutArmenteros = o.fCutArmenteros;
702 fCutV0DecayMin = o.fCutV0DecayMin;
703 fCutV0DecayMax = o.fCutV0DecayMax;
704 fCutV0totMom = o.fCutV0totMom;
705 fCutDcaV0Daughters = o.fCutDcaV0Daughters;
706 fCutDcaPosToPrimVertex = o.fCutDcaPosToPrimVertex;
707 fCutDcaNegToPrimVertex = o.fCutDcaNegToPrimVertex;
708 fCutV0RadiusMin = o.fCutV0RadiusMin;
709 fCutV0RadiusMax = o.fCutV0RadiusMax;
710 fCutBetheBloch = o.fCutBetheBloch;
711 fCutRatio = o.fCutRatio;
713 fFilterMaskK0 = o.fFilterMaskK0;
714 fListK0s = o.fListK0s;
715 fPIDResponse = o.fPIDResponse;
717 fFFHistosRecCutsK0Evt = o.fFFHistosRecCutsK0Evt;
718 fFFHistosIMK0AllEvt = o.fFFHistosIMK0AllEvt;
719 fFFHistosIMK0Jet = o.fFFHistosIMK0Jet;
720 fFFHistosIMK0Cone = o.fFFHistosIMK0Cone;
722 fFilterMaskLa = o.fFilterMaskLa;
724 fFFHistosIMLaAllEvt = o.fFFHistosIMLaAllEvt;
725 fFFHistosIMLaJet = o.fFFHistosIMLaJet;
726 fFFHistosIMLaCone = o.fFFHistosIMLaCone;
727 fALaType = o.fALaType;
728 fFilterMaskALa = o.fFilterMaskALa;
729 fListFeeddownLaCand = o.fListFeeddownLaCand;
730 fListFeeddownALaCand = o.fListFeeddownALaCand;
731 jetConeFDLalist = o.jetConeFDLalist;
732 jetConeFDALalist = o.jetConeFDALalist;
733 fListMCgenK0s = o.fListMCgenK0s;
734 fListMCgenLa = o.fListMCgenLa;
735 fListMCgenALa = o.fListMCgenALa;
736 fListMCgenK0sCone = o.fListMCgenK0sCone;
737 fListMCgenLaCone = o.fListMCgenLaCone;
738 fListMCgenALaCone = o.fListMCgenALaCone;
739 IsArmenterosSelected = o.IsArmenterosSelected;
740 fFFHistosIMALaAllEvt = o.fFFHistosIMALaAllEvt;
741 fFFHistosIMALaJet = o.fFFHistosIMALaJet;
742 fFFHistosIMALaCone = o.fFFHistosIMALaCone;
743 fFFIMNBinsJetPt = o.fFFIMNBinsJetPt;
744 fFFIMJetPtMin = o.fFFIMJetPtMin;
745 fFFIMJetPtMax = o.fFFIMJetPtMax;
746 fFFIMNBinsPt = o.fFFIMNBinsPt;
747 fFFIMPtMin = o.fFFIMPtMin;
748 fFFIMPtMax = o.fFFIMPtMax;
749 fFFIMNBinsXi = o.fFFIMNBinsXi;
750 fFFIMXiMin = o.fFFIMXiMin;
751 fFFIMXiMax = o.fFFIMXiMax;
752 fFFIMNBinsZ = o.fFFIMNBinsZ;
753 fFFIMZMin = o.fFFIMZMin;
754 fFFIMZMax = o.fFFIMZMax;
755 fFFIMLaNBinsJetPt = o.fFFIMLaNBinsJetPt;
756 fFFIMLaJetPtMin = o.fFFIMLaJetPtMin;
757 fFFIMLaJetPtMax = o.fFFIMLaJetPtMax;
758 fFFIMLaNBinsPt = o.fFFIMLaNBinsPt;
759 fFFIMLaPtMin = o.fFFIMLaPtMin;
760 fFFIMLaPtMax = o.fFFIMLaPtMax;
761 fFFIMLaNBinsXi = o.fFFIMLaNBinsXi;
762 fFFIMLaXiMin = o.fFFIMLaXiMin;
763 fFFIMLaXiMax = o.fFFIMLaXiMax;
764 fFFIMLaNBinsZ = o.fFFIMLaNBinsZ;
765 fFFIMLaZMin = o.fFFIMLaZMin;
766 fFFIMLaZMax = o.fFFIMLaZMax;
767 fh1EvtAllCent = o.fh1EvtAllCent;
769 fh1K0Mult = o.fh1K0Mult;
770 fh1dPhiJetK0 = o.fh1dPhiJetK0;
771 fh1LaMult = o.fh1LaMult;
772 fh1dPhiJetLa = o.fh1dPhiJetLa;
773 fh1ALaMult = o.fh1ALaMult;
774 fh1dPhiJetALa = o.fh1dPhiJetALa;
775 fh1JetEta = o.fh1JetEta;
776 fh1JetPhi = o.fh1JetPhi;
777 fh2JetEtaPhi = o.fh2JetEtaPhi;
778 fh1V0JetPt = o.fh1V0JetPt;
779 fh2FFJetTrackEta = o.fh2FFJetTrackEta;
780 fh1trackPosNCls = o.fh1trackPosNCls;
781 fh1trackNegNCls = o.fh1trackNegNCls;
782 fh1trackPosRap = o.fh1trackPosRap;
783 fh1trackNegRap = o.fh1trackNegRap;
784 fh1V0Rap = o.fh1V0Rap;
785 fh1trackPosEta = o.fh1trackPosEta;
786 fh1trackNegEta = o.fh1trackNegEta;
787 fh1V0Eta = o.fh1V0Eta;
788 fh1V0totMom = o.fh1V0totMom;
789 fh1CosPointAngle = o.fh1CosPointAngle;
790 fh1Chi2Pos = o.fh1Chi2Pos;
791 fh1Chi2Neg = o.fh1Chi2Neg;
792 fh1DecayLengthV0 = o.fh1DecayLengthV0;
793 fh2ProperLifetimeK0sVsPtBeforeCut = o.fh2ProperLifetimeK0sVsPtBeforeCut;
794 fh2ProperLifetimeK0sVsPtAfterCut= o.fh2ProperLifetimeK0sVsPtAfterCut;
795 fh1V0Radius = o.fh1V0Radius;
796 fh1DcaV0Daughters = o.fh1DcaV0Daughters;
797 fh1DcaPosToPrimVertex = o.fh1DcaPosToPrimVertex;
798 fh1DcaNegToPrimVertex = o.fh1DcaNegToPrimVertex;
799 fh2ArmenterosBeforeCuts = o.fh2ArmenterosBeforeCuts;
800 fh2ArmenterosAfterCuts = o.fh2ArmenterosAfterCuts;
801 fh2BBLaPos = o.fh2BBLaPos;
802 fh2BBLaNeg = o.fh2BBLaPos;
803 fh1PosDaughterCharge = o.fh1PosDaughterCharge;
804 fh1NegDaughterCharge = o.fh1NegDaughterCharge;
805 fh1PtMCK0s = o.fh1PtMCK0s;
806 fh1PtMCLa = o.fh1PtMCLa;
807 fh1PtMCALa = o.fh1PtMCALa;
808 fh1EtaK0s = o.fh1EtaK0s;
809 fh1EtaLa = o.fh1EtaLa;
810 fh1EtaALa = o.fh1EtaALa;
811 fh3InvMassEtaTrackPtK0s = o.fh3InvMassEtaTrackPtK0s;
812 fh3InvMassEtaTrackPtLa = o.fh3InvMassEtaTrackPtLa;
813 fh3InvMassEtaTrackPtALa = o.fh3InvMassEtaTrackPtALa;
814 fh1TrackMultCone = o.fh1TrackMultCone;
815 fh2TrackMultCone = o.fh2TrackMultCone;
816 fh2MCgenK0Cone = o.fh2MCgenK0Cone;
817 fh2MCgenLaCone = o.fh2MCgenLaCone;
818 fh2MCgenALaCone = o.fh2MCgenALaCone;
819 fh2MCEtagenK0Cone = o.fh2MCEtagenK0Cone;
820 fh2MCEtagenLaCone = o.fh2MCEtagenLaCone;
821 fh2MCEtagenALaCone = o.fh2MCEtagenALaCone;
822 fh1FFIMK0ConeSmear = o.fh1FFIMK0ConeSmear;
823 fh1FFIMLaConeSmear = o.fh1FFIMLaConeSmear;
824 fh1FFIMALaConeSmear = o.fh1FFIMALaConeSmear;
825 fh3MCrecK0Cone = o.fh3MCrecK0Cone;
826 fh3MCrecLaCone = o.fh3MCrecLaCone;
827 fh3MCrecALaCone = o.fh3MCrecALaCone;
828 fh3MCrecK0ConeSmear = o.fh3MCrecK0ConeSmear;
829 fh3MCrecLaConeSmear = o.fh3MCrecLaConeSmear;
830 fh3MCrecALaConeSmear = o.fh3MCrecALaConeSmear;
831 fh3SecContinCone = o.fh3SecContinCone;
832 fh3StrContinCone = o.fh3StrContinCone;
833 fh3IMK0PerpCone = o.fh3IMK0PerpCone;
834 fh3IMLaPerpCone = o.fh3IMLaPerpCone;
835 fh3IMALaPerpCone = o.fh3IMALaPerpCone;
836 fh3IMK0MedianCone = o.fh3IMK0MedianCone;
837 fh3IMLaMedianCone = o.fh3IMLaMedianCone;
838 fh3IMALaMedianCone = o.fh3IMALaMedianCone;
839 fh1MedianEta = o.fh1MedianEta;
840 fh1JetPtMedian = o.fh1JetPtMedian;
841 fh1MCMultiplicityPrimary = o.fh1MCMultiplicityPrimary;
842 fh1MCMultiplicityTracks = o.fh1MCMultiplicityTracks;
843 fh3FeedDownLa = o.fh3FeedDownLa;
844 fh3FeedDownALa = o.fh3FeedDownALa;
845 fh3FeedDownLaCone = o.fh3FeedDownLaCone;
846 fh3FeedDownALaCone = o.fh3FeedDownALaCone;
847 fh1MCProdRadiusK0s = o.fh1MCProdRadiusK0s;
848 fh1MCProdRadiusLambda = o.fh1MCProdRadiusLambda;
849 fh1MCProdRadiusAntiLambda = o.fh1MCProdRadiusAntiLambda;
850 fh1MCPtV0s = o.fh1MCPtV0s;
851 fh1MCPtK0s = o.fh1MCPtK0s;
852 fh1MCPtLambda = o.fh1MCPtLambda;
853 fh1MCPtAntiLambda = o.fh1MCPtAntiLambda;
854 fh1MCXiPt = o.fh1MCXiPt;
855 fh1MCXibarPt = o.fh1MCXibarPt;
856 fh2MCEtaVsPtK0s = o.fh2MCEtaVsPtK0s;
857 fh2MCEtaVsPtLa = o.fh2MCEtaVsPtLa;
858 fh2MCEtaVsPtALa = o.fh2MCEtaVsPtALa;
859 fh1MCRapK0s = o.fh1MCRapK0s;
860 fh1MCRapLambda = o.fh1MCRapLambda;
861 fh1MCRapAntiLambda = o.fh1MCRapAntiLambda;
862 fh1MCEtaAllK0s = o.fh1MCEtaAllK0s;
863 fh1MCEtaK0s = o.fh1MCEtaK0s;
864 fh1MCEtaLambda = o.fh1MCEtaLambda;
865 fh1MCEtaAntiLambda = o.fh1MCEtaAntiLambda;
871 //_______________________________________________
872 AliAnalysisTaskJetChem::~AliAnalysisTaskJetChem()
877 if(fListK0s) delete fListK0s;
878 if(fListLa) delete fListLa;
879 if(fListALa) delete fListALa;
880 if(fListFeeddownLaCand) delete fListFeeddownLaCand;
881 if(fListFeeddownALaCand) delete fListFeeddownALaCand;
882 if(jetConeFDLalist) delete jetConeFDLalist;
883 if(jetConeFDALalist) delete jetConeFDALalist;
884 if(fListMCgenK0s) delete fListMCgenK0s;
885 if(fListMCgenLa) delete fListMCgenLa;
886 if(fListMCgenALa) delete fListMCgenALa;
890 //________________________________________________________________________________________________________________________________
891 AliAnalysisTaskJetChem::AliFragFuncHistosInvMass::AliFragFuncHistosInvMass(const char* name,
892 Int_t nJetPt, Float_t jetPtMin, Float_t jetPtMax,
893 Int_t nInvMass, Float_t invMassMin, Float_t invMassMax,
894 Int_t nPt, Float_t ptMin, Float_t ptMax,
895 Int_t nXi, Float_t xiMin, Float_t xiMax,
896 Int_t nZ , Float_t zMin , Float_t zMax )
901 ,fNBinsInvMass(nInvMass)
902 ,fInvMassMin(invMassMin)
903 ,fInvMassMax(invMassMax)
919 // default constructor
923 //______________________________________________________________________________________________________________
924 AliAnalysisTaskJetChem::AliFragFuncHistosInvMass::AliFragFuncHistosInvMass(const AliFragFuncHistosInvMass& copy)
926 ,fNBinsJetPt(copy.fNBinsJetPt)
927 ,fJetPtMin(copy.fJetPtMin)
928 ,fJetPtMax(copy.fJetPtMax)
929 ,fNBinsInvMass(copy.fNBinsInvMass)
930 ,fInvMassMin(copy.fInvMassMin)
931 ,fInvMassMax(copy.fInvMassMax)
932 ,fNBinsPt(copy.fNBinsPt)
936 ,fNBinsXi(copy.fNBinsXi)
939 ,fNBinsZ(copy.fNBinsZ)
942 ,fh3TrackPt(copy.fh3TrackPt)
945 ,fh1JetPt(copy.fh1JetPt)
946 ,fNameFF(copy.fNameFF)
951 //______________________________________________________________________________________________________________________________________________________________________
952 AliAnalysisTaskJetChem::AliFragFuncHistosInvMass& AliAnalysisTaskJetChem::AliFragFuncHistosInvMass::operator=(const AliAnalysisTaskJetChem::AliFragFuncHistosInvMass& o)
957 TObject::operator=(o);
958 fNBinsJetPt = o.fNBinsJetPt;
959 fJetPtMin = o.fJetPtMin;
960 fJetPtMax = o.fJetPtMax;
961 fNBinsInvMass = o.fNBinsInvMass;
962 fInvMassMin = o.fInvMassMin;
963 fInvMassMax = o.fInvMassMax;
964 fNBinsPt = o.fNBinsPt;
967 fNBinsXi = o.fNBinsXi;
973 fh3TrackPt = o.fh3TrackPt;
976 fh1JetPt = o.fh1JetPt;
983 //___________________________________________________________________________
984 AliAnalysisTaskJetChem::AliFragFuncHistosInvMass::~AliFragFuncHistosInvMass()
988 if(fh1JetPt) delete fh1JetPt;
989 if(fh3TrackPt) delete fh3TrackPt;
990 if(fh3Xi) delete fh3Xi;
991 if(fh3Z) delete fh3Z;
994 //_________________________________________________________________
995 void AliAnalysisTaskJetChem::AliFragFuncHistosInvMass::DefineHistos()
999 fh1JetPt = new TH1F(Form("fh1FFJetPtIM%s", fNameFF.Data()),"",fNBinsJetPt,fJetPtMin,fJetPtMax);
1000 fh3TrackPt = new TH3F(Form("fh3FFTrackPtIM%s",fNameFF.Data()),"",fNBinsJetPt, fJetPtMin, fJetPtMax, fNBinsInvMass, fInvMassMin, fInvMassMax, fNBinsPt, fPtMin, fPtMax);
1001 fh3Xi = new TH3F(Form("fh3FFXiIM%s", fNameFF.Data()),"", fNBinsJetPt, fJetPtMin, fJetPtMax, fNBinsInvMass, fInvMassMin, fInvMassMax, fNBinsXi, fXiMin, fXiMax);
1002 fh3Z = new TH3F(Form("fh3FFZIM%s", fNameFF.Data()),"", fNBinsJetPt, fJetPtMin, fJetPtMax, fNBinsInvMass, fInvMassMin, fInvMassMax, fNBinsZ, fZMin, fZMax);
1004 AliAnalysisTaskFragmentationFunction::SetProperties(fh1JetPt, "p_{t} (GeV/c)", "entries");
1005 AliAnalysisTaskJetChem::SetProperties(fh3TrackPt,"jet p_{t} (GeV/c)","inv Mass (GeV/c^2)","p_{t} (GeV/c)");
1006 AliAnalysisTaskJetChem::SetProperties(fh3Xi,"jet p_{t} (GeV/c)","inv Mass (GeV/c^2)","#xi");
1007 AliAnalysisTaskJetChem::SetProperties(fh3Z,"jet p_{t} (GeV/c)","inv Mass (GeV/c^2)","z");
1010 //________________________________________________________________________________________________________________________________
1011 void AliAnalysisTaskJetChem::AliFragFuncHistosInvMass::FillFF(Float_t trackPt, Float_t invM, Float_t jetPt, Bool_t incrementJetPt)
1015 if(incrementJetPt) fh1JetPt->Fill(jetPt);
1016 fh3TrackPt->Fill(jetPt,invM,trackPt);//Fill(x,y,z)
1019 if(jetPt>0) z = trackPt / jetPt;
1021 if(z>0) xi = TMath::Log(1/z);
1023 fh3Xi->Fill(jetPt,invM,xi);
1024 fh3Z->Fill(jetPt,invM,z);
1027 //___________________________________________________________________________________
1028 void AliAnalysisTaskJetChem::AliFragFuncHistosInvMass::AddToOutput(TList* list) const
1030 // add histos to list
1032 list->Add(fh1JetPt);
1033 list->Add(fh3TrackPt);
1039 //____________________________________________________
1040 void AliAnalysisTaskJetChem::UserCreateOutputObjects()
1042 // create output objects
1044 if(fDebug > 1) Printf("AliAnalysisTaskJetChem::UserCreateOutputObjects()");
1046 // create list of tracks and jets
1048 fTracksRecCuts = new TList();
1049 fTracksRecCuts->SetOwner(kFALSE); //objects in TList wont be deleted when TList is deleted
1050 fJetsRecCuts = new TList();
1051 fJetsRecCuts->SetOwner(kFALSE);
1052 fBckgJetsRec = new TList();
1053 fBckgJetsRec->SetOwner(kFALSE);
1054 fListK0s = new TList();
1055 fListK0s->SetOwner(kFALSE);
1056 fListLa = new TList();
1057 fListLa->SetOwner(kFALSE);
1058 fListALa = new TList();
1059 fListALa->SetOwner(kFALSE);
1060 fListFeeddownLaCand = new TList(); //feeddown Lambda candidates
1061 fListFeeddownLaCand->SetOwner(kFALSE);
1062 fListFeeddownALaCand = new TList(); //feeddown Antilambda candidates
1063 fListFeeddownALaCand->SetOwner(kFALSE);
1064 jetConeFDLalist = new TList();
1065 jetConeFDLalist->SetOwner(kFALSE); //feeddown Lambda candidates in jet cone
1066 jetConeFDALalist = new TList();
1067 jetConeFDALalist->SetOwner(kFALSE); //feeddown Antilambda candidates in jet cone
1068 fListMCgenK0s = new TList(); //MC generated K0s
1069 fListMCgenK0s->SetOwner(kFALSE);
1070 fListMCgenLa = new TList(); //MC generated Lambdas
1071 fListMCgenLa->SetOwner(kFALSE);
1072 fListMCgenALa = new TList(); //MC generated Antilambdas
1073 fListMCgenALa->SetOwner(kFALSE);
1076 // Create histograms / output container
1078 fCommonHistList = new TList();
1079 fCommonHistList->SetOwner();
1081 Bool_t oldStatus = TH1::AddDirectoryStatus();
1082 TH1::AddDirectory(kFALSE);//By default (fAddDirectory = kTRUE), histograms are automatically added to the list of objects in memory
1084 // histograms inherited from AliAnalysisTaskFragmentationFunction
1086 fh1EvtSelection = new TH1F("fh1EvtSelection", "Event Selection", 6, -0.5, 5.5);
1087 fh1EvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
1088 fh1EvtSelection->GetXaxis()->SetBinLabel(2,"event trigger selection: rejected");
1089 fh1EvtSelection->GetXaxis()->SetBinLabel(3,"event class: rejected");
1090 fh1EvtSelection->GetXaxis()->SetBinLabel(4,"vertex Ncontr: rejected");
1091 fh1EvtSelection->GetXaxis()->SetBinLabel(5,"vertex z: rejected");
1092 fh1EvtSelection->GetXaxis()->SetBinLabel(6,"vertex type: rejected");
1095 fh1EvtCent = new TH1F("fh1EvtCent","centrality",100,0.,100.);
1096 fh1VertexNContributors = new TH1F("fh1VertexNContributors", "Vertex N contributors", 11,-.5, 10.5);
1097 fh1VertexZ = new TH1F("fh1VertexZ", "Vertex z distribution", 30, -15., 15.);
1098 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
1099 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
1100 fh1Trials = new TH1F("fh1Trials","trials from pyxsec.root",1,0,1);
1101 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
1102 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",350,-.5,349.5);
1103 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",350,-.5,349.5);
1104 fh1nRecJetsCuts = new TH1F("fh1nRecJetsCuts","reconstructed jets per event",100,-0.5,99.5);
1106 // histograms JetChem task
1108 fh1EvtAllCent = new TH1F("fh1EvtAllCent","before centrality selection",100,0.,100.);
1109 fh1Evt = new TH1F("fh1Evt", "All events runned over", 3, 0.,1.);
1110 fh1EvtMult = new TH1F("fh1EvtMult","multiplicity",240,0.,240.);
1111 fh1K0Mult = new TH1F("fh1K0Mult","K0 multiplicity",100,0.,100.);//500. all
1112 fh1dPhiJetK0 = new TH1F("fh1dPhiJetK0","",640,-1,5.4);
1113 fh1LaMult = new TH1F("fh1LaMult","La multiplicity",100,0.,100.);
1114 fh1dPhiJetLa = new TH1F("fh1dPhiJetLa","",640,-1,5.4);
1115 fh1ALaMult = new TH1F("fh1ALaMult","ALa multiplicity",100,0.,100.);
1116 fh1dPhiJetALa = new TH1F("fh1dPhiJetALa","",640,-1,5.4);
1117 fh1JetEta = new TH1F("fh1JetEta","#eta distribution of all jets",400,-2.,2.);
1118 fh1JetPhi = new TH1F("fh1JetPhi","#phi distribution of all jets",630,0.,6.3);
1119 fh2JetEtaPhi = new TH2F("fh2JetEtaPhi","#eta and #phi distribution of all jets",400,-2.,2.,630,0.,6.3);
1120 fh1V0JetPt = new TH1F("fh1V0JetPt","#p_{T} distribution of all jets containing v0s",200,0.,200.);
1121 fh2FFJetTrackEta = new TH2F("fh2FFJetTrackEta","charged track eta distr. in jet cone",200,-1.,1.,40,0.,200.);
1122 fh1trackPosNCls = new TH1F("fh1trackPosNCls","NTPC clusters positive daughters",250,0.,250.);
1123 fh1trackNegNCls = new TH1F("fh1trackNegNCls","NTPC clusters negative daughters",250,0.,250.);
1124 fh1trackPosEta = new TH1F("fh1trackPosEta","eta positive daughters",100,-2.,2.);
1125 fh1trackNegEta = new TH1F("fh1trackNegEta","eta negative daughters",100,-2.,2.);
1126 fh1V0Eta = new TH1F("fh1V0Eta","V0 eta",60,-1.5,1.5);
1127 fh1V0totMom = new TH1F("fh1V0totMom","V0 tot mom",240,0.,20.);
1128 fh1CosPointAngle = new TH1F("fh1CosPointAngle", "Cosine of V0's pointing angle",100,0.99,1.0);
1129 fh1Chi2Pos = new TH1F("fh1Chi2Pos", "V0s chi2",100,0.,5.);
1130 fh1Chi2Neg = new TH1F("fh1Chi2Neg", "V0s chi2",100,0.,5.);
1131 fh1DecayLengthV0 = new TH1F("fh1DecayLengthV0", "V0s decay Length;decay length(cm)",1200,0.,120.);
1132 fh2ProperLifetimeK0sVsPtBeforeCut = new TH2F("fh2ProperLifetimeK0sVsPtBeforeCut"," K0s ProperLifetime vs Pt; p_{T} (GeV/#it{c})",150,0.,15.,250,0.,250.);
1133 fh2ProperLifetimeK0sVsPtAfterCut = new TH2F("fh2ProperLifetimeK0sVsPtAfterCut"," K0s ProperLifetime vs Pt; p_{T} (GeV/#it{c})",150,0.,15.,250,0.,250.);
1134 fh1V0Radius = new TH1F("fh1V0Radius", "V0s Radius;Radius(cm)",200,0.,40.);
1135 fh1DcaV0Daughters = new TH1F("fh1DcaV0Daughters", "DCA between daughters;dca(cm)",200,0.,2.);
1136 fh1DcaPosToPrimVertex = new TH1F("fh1DcaPosToPrimVertex", "Positive V0 daughter;dca(cm)",100,0.,10.);
1137 fh1DcaNegToPrimVertex = new TH1F("fh1DcaNegToPrimVertex", "Negative V0 daughter;dca(cm)",100,0.,10.);
1138 fh2ArmenterosBeforeCuts = new TH2F("fh2ArmenterosBeforeCuts","Armenteros Podolanski Plot for K0s Candidates;#alpha;(p^{arm})_{T}/(GeV/#it{c})",200,-1.2,1.2,350,0.,0.35);
1139 fh2ArmenterosAfterCuts = new TH2F("fh2ArmenterosAfterCuts","Armenteros Podolanski Plot for K0s Candidates;#alpha;(p^{arm})_{T}/(GeV/#it{c});",200,-1.2,1.2,350,0.,0.35);
1140 fh2BBLaPos = new TH2F("fh2BBLaPos","PID of the positive daughter of La candidates; P (GeV); -dE/dx (keV/cm ?)",100,0,10,200,0,200);
1141 fh2BBLaNeg = new TH2F("fh2BBLaNeg","PID of the negative daughter of La candidates; P (GeV); -dE/dx (keV/cm ?)",100,0,10,200,0,200);
1142 fh1PosDaughterCharge = new TH1F("fh1PosDaughterCharge","charge of V0 positive daughters; V0 daughters",3,-2.,2.);
1143 fh1NegDaughterCharge = new TH1F("fh1NegDaughterCharge","charge of V0 negative daughters; V0 daughters",3,-2.,2.);
1144 fh1PtMCK0s = new TH1F("fh1PtMCK0s","Pt of MC rec K0s; #it{p}_{T} (GeV/#it{c})",200,0.,20.);
1145 fh1PtMCLa = new TH1F("fh1PtMCLa","Pt of MC rec La; #it{p}_{T} (GeV/#it{c})",200,0.,20.);
1146 fh1PtMCALa = new TH1F("fh1PtMCALa","Pt of MC rec ALa; #it{p}_{T} (GeV/#it{c})",200,0.,20.);
1147 fh1EtaK0s = new TH1F("fh1EtaK0s","K^{0}_{s} entries ;#eta",200,-1.,1.);
1148 fh1EtaLa = new TH1F("fh1EtaLa","#Lambda entries ;#eta",200,-1.,1.);
1149 fh1EtaALa = new TH1F("fh1EtaALa","#bar{#Lambda} entries ;#eta",200,-1.,1.);
1150 fh3InvMassEtaTrackPtK0s = new TH3F("fh3InvMassEtaTrackPtK0s","#eta; invMass (GeV/{#it{c}}^{2}); #it{p}_{T} (GeV/#it{c})", 200, -1., 1., 400, 0.3, 0.7, 140, 0., 14.);
1151 fh3InvMassEtaTrackPtLa = new TH3F("fh3InvMassEtaTrackPtLa", "#eta; invMass (GeV/{#it{c}}^{2}; #it{p}_{T} (GeV/#it{c}))", 200, -1., 1., 200, 1.05, 1.25, 140, 0., 14.);
1152 fh3InvMassEtaTrackPtALa = new TH3F("fh3InvMassEtaTrackPtALa","#eta; invMass (GeV/#it{c}^{2}); #it{p}_{T} (GeV/#it{c})", 200, -1., 1., 200, 1.05, 1.25, 140, 0., 14.);
1153 fh3IMK0PerpCone = new TH3F("fh3IMK0PerpCone","{K_{0}}^{s} content in perpendicular cone",19,5.,100.,400,0.3,0.7, 200,0.,20.);
1154 fh3IMLaPerpCone = new TH3F("fh3IMLaPerpCone","#Lambda content in perpendicular cone",19,5.,100., 200,1.05,1.25, 200,0.,20.);
1155 fh3IMALaPerpCone = new TH3F("fh3IMALaPerpCone","#Antilambda content in perpendicular cone",19,5.,100.,200,1.05,1.25, 200,0.,20.);
1156 fh3IMK0MedianCone = new TH3F("fh3IMK0MedianCone","{K_{0}}^{s} content in median cluster cone",19,5.,100.,400,0.3,0.7, 200,0.,20.);
1157 fh3IMLaMedianCone = new TH3F("fh3IMLaMedianCone","#Lambda content in median cluster cone",19,5.,100., 200,1.05,1.25, 200,0.,20.);
1158 fh3IMALaMedianCone = new TH3F("fh3IMALaMedianCone","#Antilambda content in median cluster cone",19,5.,100., 200,1.05,1.25, 200,0.,20.);
1159 fh1MedianEta = new TH1F("fh1MedianEta","Median cluster axis ;#eta",200,-1.,1.);
1160 fh1JetPtMedian = new TH1F("fh1JetPtMedian","Median cluster jet it{p}_{T} ;#GeV/it{c}",19,5.,100.);
1162 fh1TrackMultCone = new TH1F("fh1TrackMultCone","track multiplicity in jet cone; number of tracks",200,0.,500.);
1164 fh2TrackMultCone = new TH2F("fh2TrackMultCone","track multiplicity in jet cone vs. jet momentum; number of tracks; jet it{p}_{T} (GeV/it{c})",200,0.,200.,19,5.,100.);
1166 fFFHistosRecCuts = new AliFragFuncHistos("RecCuts", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax,
1167 fFFNBinsPt, fFFPtMin, fFFPtMax,
1168 fFFNBinsXi, fFFXiMin, fFFXiMax,
1169 fFFNBinsZ , fFFZMin , fFFZMax);
1171 fV0QAK0 = new AliFragFuncQATrackHistos("V0QAK0",fQATrackNBinsPt, fQATrackPtMin, fQATrackPtMax,
1172 fQATrackNBinsEta, fQATrackEtaMin, fQATrackEtaMax,
1173 fQATrackNBinsPhi, fQATrackPhiMin, fQATrackPhiMax,
1174 fQATrackHighPtThreshold);
1176 fFFHistosRecCutsK0Evt = new AliFragFuncHistos("RecCutsK0Evt", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax,
1177 fFFNBinsPt, fFFPtMin, fFFPtMax,
1178 fFFNBinsXi, fFFXiMin, fFFXiMax,
1179 fFFNBinsZ , fFFZMin , fFFZMax);
1182 fFFHistosIMK0AllEvt = new AliFragFuncHistosInvMass("K0AllEvt", fFFIMNBinsJetPt, fFFIMJetPtMin, fFFIMJetPtMax,
1183 fFFIMNBinsInvM,fFFIMInvMMin,fFFIMInvMMax,
1184 fFFIMNBinsPt, fFFIMPtMin, fFFIMPtMax,
1185 fFFIMNBinsXi, fFFIMXiMin, fFFIMXiMax,
1186 fFFIMNBinsZ , fFFIMZMin , fFFIMZMax);
1188 fFFHistosIMK0Jet = new AliFragFuncHistosInvMass("K0Jet", fFFIMNBinsJetPt, fFFIMJetPtMin, fFFIMJetPtMax,
1189 fFFIMNBinsInvM,fFFIMInvMMin,fFFIMInvMMax,
1190 fFFIMNBinsPt, fFFIMPtMin, fFFIMPtMax,
1191 fFFIMNBinsXi, fFFIMXiMin, fFFIMXiMax,
1192 fFFIMNBinsZ , fFFIMZMin , fFFIMZMax);
1194 fFFHistosIMK0Cone = new AliFragFuncHistosInvMass("K0Cone", fFFIMNBinsJetPt, fFFIMJetPtMin, fFFIMJetPtMax,
1195 fFFIMNBinsInvM,fFFIMInvMMin,fFFIMInvMMax,
1196 fFFIMNBinsPt, fFFIMPtMin, fFFIMPtMax,
1197 fFFIMNBinsXi, fFFIMXiMin, fFFIMXiMax,
1198 fFFIMNBinsZ , fFFIMZMin , fFFIMZMax);
1200 fFFHistosIMLaAllEvt = new AliFragFuncHistosInvMass("LaAllEvt", fFFIMLaNBinsJetPt, fFFIMLaJetPtMin, fFFIMLaJetPtMax,
1201 fFFIMLaNBinsInvM,fFFIMLaInvMMin,fFFIMLaInvMMax,
1202 fFFIMLaNBinsPt, fFFIMLaPtMin, fFFIMLaPtMax,
1203 fFFIMLaNBinsXi, fFFIMLaXiMin, fFFIMLaXiMax,
1204 fFFIMLaNBinsZ , fFFIMLaZMin , fFFIMLaZMax);
1206 fFFHistosIMLaJet = new AliFragFuncHistosInvMass("LaJet", fFFIMLaNBinsJetPt, fFFIMLaJetPtMin, fFFIMLaJetPtMax,
1207 fFFIMLaNBinsInvM,fFFIMLaInvMMin,fFFIMLaInvMMax,
1208 fFFIMLaNBinsPt, fFFIMLaPtMin, fFFIMLaPtMax,
1209 fFFIMLaNBinsXi, fFFIMLaXiMin, fFFIMLaXiMax,
1210 fFFIMLaNBinsZ , fFFIMLaZMin , fFFIMLaZMax);
1213 fFFHistosIMLaCone = new AliFragFuncHistosInvMass("LaCone", fFFIMLaNBinsJetPt, fFFIMLaJetPtMin, fFFIMLaJetPtMax,
1214 fFFIMLaNBinsInvM,fFFIMLaInvMMin,fFFIMLaInvMMax,
1215 fFFIMLaNBinsPt, fFFIMLaPtMin, fFFIMLaPtMax,
1216 fFFIMLaNBinsXi, fFFIMLaXiMin, fFFIMLaXiMax,
1217 fFFIMLaNBinsZ , fFFIMLaZMin , fFFIMLaZMax);
1220 fFFHistosIMALaAllEvt = new AliFragFuncHistosInvMass("ALaAllEvt", fFFIMLaNBinsJetPt, fFFIMLaJetPtMin, fFFIMLaJetPtMax,
1221 fFFIMLaNBinsInvM,fFFIMLaInvMMin,fFFIMLaInvMMax,
1222 fFFIMLaNBinsPt, fFFIMLaPtMin, fFFIMLaPtMax,
1223 fFFIMLaNBinsXi, fFFIMLaXiMin, fFFIMLaXiMax,
1224 fFFIMLaNBinsZ , fFFIMLaZMin , fFFIMLaZMax);
1226 fFFHistosIMALaJet = new AliFragFuncHistosInvMass("ALaJet", fFFIMLaNBinsJetPt, fFFIMLaJetPtMin, fFFIMLaJetPtMax,
1227 fFFIMLaNBinsInvM,fFFIMLaInvMMin,fFFIMLaInvMMax,
1228 fFFIMLaNBinsPt, fFFIMLaPtMin, fFFIMLaPtMax,
1229 fFFIMLaNBinsXi, fFFIMLaXiMin, fFFIMLaXiMax,
1230 fFFIMLaNBinsZ , fFFIMLaZMin , fFFIMLaZMax);
1232 fFFHistosIMALaCone = new AliFragFuncHistosInvMass("ALaCone", fFFIMLaNBinsJetPt, fFFIMLaJetPtMin, fFFIMLaJetPtMax,
1233 fFFIMLaNBinsInvM,fFFIMLaInvMMin,fFFIMLaInvMMax,
1234 fFFIMLaNBinsPt, fFFIMLaPtMin, fFFIMLaPtMax,
1235 fFFIMLaNBinsXi, fFFIMLaXiMin, fFFIMLaXiMax,
1236 fFFIMLaNBinsZ , fFFIMLaZMin , fFFIMLaZMax);
1242 fh2MCgenK0Cone = new TH2F("fh2MCgenK0Cone", "MC gen {K^{0}}^{s} #it{p}_{T} in cone around rec jet axis versus jet #it{p}_{T}; jet #it{p}_{T}",19,5.,100.,200,0.,20.);
1243 fh2MCgenLaCone = new TH2F("fh2MCgenLaCone", "MC gen #Lambda #it{p}_{T} in cone around rec jet axis versus jet #it{p}_{T} ; jet #it{p}_{T}",19,5.,100.,200,0.,20.);
1244 fh2MCgenALaCone = new TH2F("fh2MCgenALaCone", "MC gen #Antilambda #it{p}_{T} in cone around rec jet axis versus jet #it{p}_{T}; jet #it{p}_{T}",19,5.,100.,200,0.,20.);
1246 fh2MCgenK0Cone->GetYaxis()->SetTitle("MC gen K^{0}}^{s} #it{p}_{T}");
1247 fh2MCgenLaCone->GetYaxis()->SetTitle("MC gen #Lambda #it{p}_{T}");
1248 fh2MCgenALaCone->GetYaxis()->SetTitle("MC gen #Antilambda #it{p}_{T}");
1250 fh2MCEtagenK0Cone = new TH2F("fh2MCEtagenK0Cone","MC gen {K^{0}}^{s} #it{p}_{T} #eta distribution in jet cone;#eta",19,5.,100.,200,-1.,1.);
1251 fh2MCEtagenLaCone = new TH2F("fh2MCEtagenLaCone","MC gen #Lambda #it{p}_{T} #eta distribution in jet cone;#eta",19,5.,100.,200,-1.,1.);
1252 fh2MCEtagenALaCone = new TH2F("fh2MCEtagenALaCone","MC gen #Antilambda #it{p}_{T} #eta distribution in jet cone;#eta",19,5.,100.,200,-1.,1.);
1253 fh1FFIMK0ConeSmear = new TH1F("fh1FFIMK0ConeSmear","Smeared jet pt study for K0s-in-cone-jets; smeared jet #it{p}_{T}", 19,5.,100.);
1254 fh1FFIMLaConeSmear = new TH1F("fh1FFIMLaConeSmear","Smeared jet pt study for La-in-cone-jets; smeared jet #it{p}_{T}", 19,5.,100.);
1255 fh1FFIMALaConeSmear = new TH1F("fh1FFIMALaConeSmear","Smeared jet pt study for ALa-in-cone-jets; smeared jet #it{p}_{T}", 19,5.,100.);
1257 fh3MCrecK0Cone = new TH3F("fh3MCrecK0Cone", "MC rec {K^{0}}^{s} #it{p}_{T} in cone around jet axis matching MC gen particle; jet #it{p}_{T}; inv mass (GeV/#it{c}^{2};#it{p}_{T}",19,5.,100., 400,0.3,0.7, 200,0.,20.);
1258 fh3MCrecLaCone = new TH3F("fh3MCrecLaCone", "MC rec {#Lambda #it{p}_{T} in cone around jet axis matching MC gen particle; jet #it{p}_{T}; inv mass (GeV/#it{c}^{2});#it{p}_{T}",19,5.,100., 200,1.05,1.25, 200,0.,20.);
1259 fh3MCrecALaCone = new TH3F("fh3MCrecALaCone", "MC rec {#Antilambda #it{p}_{T} in cone around jet axis matching MC gen particle; jet #it{p}_{T}; inv mass (GeV/#it{c}^{2});#it{p}_{T}",19,5.,100.,200,1.05,1.25, 200,0.,20.);
1260 fh3MCrecK0ConeSmear = new TH3F("fh3MCrecK0ConeSmear", "MC rec {K^{0}}^{s} #it{p}_{T} in cone around jet axis matching MC gen particle, with jet p_{T} smeared; jet #it{p}_{T}; inv mass (GeV/#it{c}^{2};#it{p}_{T}",19,5.,100., 400,0.3,0.7, 200,0.,20.);
1261 fh3MCrecLaConeSmear = new TH3F("fh3MCrecLaConeSmear", "MC rec {#Lambda #it{p}_{T} in cone around jet axis matching MC gen particle, with jet p_{T} smeared; jet #it{p}_{T}; inv mass (GeV/#it{c}^{2});#it{p}_{T}",19,5.,100., 200,1.05,1.25, 200,0.,20.);
1262 fh3MCrecALaConeSmear = new TH3F("fh3MCrecALaConeSmear", "MC rec {#Antilambda #it{p}_{T} in cone around jet axis matching MC gen particle, with jet p_{T} smeared; jet #it{p}_{T}; inv mass (GeV/#it{c}^{2});#it{p}_{T}",19,5.,100.,200,1.05,1.25, 200,0.,20.);
1263 fh3SecContinCone = new TH3F("fh3SecContinCone","secondary contamination of jet cones; jet #it{p}_{T}; track #it{p}_{T}, #eta",19,5.,100.,200,0.,20.,200,-1.,1.);
1264 fh3StrContinCone = new TH3F("fh3StrContinCone","strange particle contamination of jet cones; jet #it{p}_{T}; track #it{p}_{T}, #eta",19,5.,100.,200,0.,20.,200,-1.,1.);
1266 fh1MCMultiplicityPrimary = new TH1F("fh1MCMultiplicityPrimary", "MC Primary Particles;NPrimary;Count", 201, -0.5, 200.5);
1267 fh1MCMultiplicityTracks = new TH1F("h1MCMultiplicityTracks", "MC Tracks;Ntracks;Count", 201, -0.5, 200.5);
1268 fh3FeedDownLa = new TH3F("fh3FeedDownLa","#Lambda stemming from feeddown from Xi(0/-)", 19, 5., 100., 200, 1.05, 1.25, 200,0.,20.);
1269 fh3FeedDownALa = new TH3F("fh3FeedDownALa","#bar#Lambda stemming from feeddown from Xibar(0/+)", 19, 5., 100., 200, 1.05, 1.25, 200, 0., 20.);
1270 fh3FeedDownLaCone = new TH3F("fh3FeedDownLaCone","#Lambda stemming from feeddown from Xi(0/-) in jet cone", 19, 5., 100., 200, 1.05, 1.25, 200,0.,20.);
1271 fh3FeedDownALaCone = new TH3F("fh3FeedDownALaCone","#bar#Lambda stemming from feeddown from Xibar(0/+) in jet cone", 19, 5., 100., 200, 1.05, 1.25, 200, 0., 20.);
1272 fh1MCProdRadiusK0s = new TH1F("fh1MCProdRadiusK0s","MC gen. MC K0s prod radius",200,0.,200.);
1273 fh1MCProdRadiusLambda = new TH1F("fh1MCProdRadiusLambda","MC gen. MC La prod radius",200,0.,200.);
1274 fh1MCProdRadiusAntiLambda = new TH1F("fh1MCProdRadiusAntiLambda","MC gen. MC ALa prod radius",200,0.,200.);
1276 // Pt and inv mass distributions
1278 fh1MCPtV0s = new TH1F("fh1MCPtV0s", "MC gen. V^{0} in rap range;#it{p}_{T} (GeV/#it{c})",200,0,20.);// 0.1 GeV/c steps
1279 fh1MCPtK0s = new TH1F("fh1MCPtK0s", "MC gen. K^{0}_{s} in eta range;#it{p}_{T} (GeV/#it{c})",200,0.,20.);
1280 fh1MCPtLambda = new TH1F("fh1MCPtLambda", "MC gen. #Lambda in rap range;#it{p}_{T} (GeV/#it{c})",200,0.,20.);
1281 fh1MCPtAntiLambda = new TH1F("fh1MCPtAntiLambda", "MC gen. #AntiLambda in rap range;#it{p}_{T} (GeV/#it{c})",200,0.,20.);
1282 fh1MCXiPt = new TH1F("fh1MCXiPt", "MC gen. #Xi^{-/o};#it{p}_{T} (GeV/#it{c})",200,0.,20.);
1283 fh1MCXibarPt = new TH1F("fh1MCXibarPt", "MC gen. #bar{#Xi}^{+/o};#it{p}_{T} (GeV/#it{c})",200,0.,20.);
1284 fh2MCEtaVsPtK0s = new TH2F("fh2MCEtaVsPtK0s","MC gen. K^{0}_{s} #eta; #it{p}_{T}",200,0.,20.,200,-1.,1.);
1285 fh2MCEtaVsPtLa = new TH2F("fh2MCEtaVsPtLa","MC gen. #Lambda #eta; #it{p}_{T}",200,0.,20.,200,-1.,1.);
1286 fh2MCEtaVsPtALa = new TH2F("fh2MCEtaVsPtALa","MC gen. #bar{#Lambda} #eta; #it{p}_{T}",200,0.,20.,200,-1.,1.);
1289 fh1MCRapK0s = new TH1F("fh1MCRapK0s", "MC gen. K0s;rap with cut",200,-10,10);
1290 fh1MCRapLambda = new TH1F("fh1MCRapLambda", "MC gen. #Lambda;rap",200,-10,10);
1291 fh1MCRapAntiLambda = new TH1F("fh1MCRapAntiLambda", "MC gen. #bar{#Lambda};rap",200,-10,10);
1292 fh1MCEtaAllK0s = new TH1F("fh1MCEtaAllK0s", "MC gen. K0s;#eta",200,-1.,1.);
1293 fh1MCEtaK0s = new TH1F("fh1MCEtaK0s", "MC gen. K0s;#eta with cut",200,-1.,1.);
1294 fh1MCEtaLambda = new TH1F("fh1MCEtaLambda", "MC gen. #Lambda;#eta",200,-1.,1.);
1295 fh1MCEtaAntiLambda = new TH1F("fh1MCEtaAntiLambda", "MC gen. #bar{#Lambda};#eta",200,-1.,1.);
1297 fV0QAK0->DefineHistos();
1298 fFFHistosRecCuts->DefineHistos();
1299 fFFHistosRecCutsK0Evt->DefineHistos();
1300 fFFHistosIMK0AllEvt->DefineHistos();
1301 fFFHistosIMK0Jet->DefineHistos();
1302 fFFHistosIMK0Cone->DefineHistos();
1303 fFFHistosIMLaAllEvt->DefineHistos();
1304 fFFHistosIMLaJet->DefineHistos();
1305 fFFHistosIMLaCone->DefineHistos();
1306 fFFHistosIMALaAllEvt->DefineHistos();
1307 fFFHistosIMALaJet->DefineHistos();
1308 fFFHistosIMALaCone->DefineHistos();
1311 const Int_t saveLevel = 5;
1314 fCommonHistList->Add(fh1EvtAllCent);
1315 fCommonHistList->Add(fh1Evt);
1316 fCommonHistList->Add(fh1EvtSelection);
1317 fCommonHistList->Add(fh1EvtCent);
1318 fCommonHistList->Add(fh1VertexNContributors);
1319 fCommonHistList->Add(fh1VertexZ);
1320 fCommonHistList->Add(fh1Xsec);
1321 fCommonHistList->Add(fh1Trials);
1322 fCommonHistList->Add(fh1PtHard);
1323 fCommonHistList->Add(fh1PtHardTrials);
1324 fCommonHistList->Add(fh1nRecJetsCuts);
1325 fCommonHistList->Add(fh1EvtMult);
1326 fCommonHistList->Add(fh1K0Mult);
1327 fCommonHistList->Add(fh1dPhiJetK0);
1328 fCommonHistList->Add(fh1LaMult);
1329 fCommonHistList->Add(fh1dPhiJetLa);
1330 fCommonHistList->Add(fh1ALaMult);
1331 fCommonHistList->Add(fh1dPhiJetALa);
1332 fCommonHistList->Add(fh1JetEta);
1333 fCommonHistList->Add(fh1JetPhi);
1334 fCommonHistList->Add(fh2JetEtaPhi);
1335 fCommonHistList->Add(fh1V0JetPt);
1336 fCommonHistList->Add(fh2FFJetTrackEta);
1337 fCommonHistList->Add(fh1trackPosNCls);
1338 fCommonHistList->Add(fh1trackNegNCls);
1339 fCommonHistList->Add(fh1trackPosEta);
1340 fCommonHistList->Add(fh1trackNegEta);
1341 fCommonHistList->Add(fh1V0Eta);
1342 fCommonHistList->Add(fh1V0totMom);
1343 fCommonHistList->Add(fh1CosPointAngle);
1344 fCommonHistList->Add(fh1Chi2Pos);
1345 fCommonHistList->Add(fh1Chi2Neg);
1346 fCommonHistList->Add(fh1DecayLengthV0);
1347 fCommonHistList->Add(fh2ProperLifetimeK0sVsPtBeforeCut);
1348 fCommonHistList->Add(fh2ProperLifetimeK0sVsPtAfterCut);
1349 fCommonHistList->Add(fh1V0Radius);
1350 fCommonHistList->Add(fh1DcaV0Daughters);
1351 fCommonHistList->Add(fh1DcaPosToPrimVertex);
1352 fCommonHistList->Add(fh1DcaNegToPrimVertex);
1353 fCommonHistList->Add(fh2ArmenterosBeforeCuts);
1354 fCommonHistList->Add(fh2ArmenterosAfterCuts);
1355 fCommonHistList->Add(fh2BBLaPos);
1356 fCommonHistList->Add(fh2BBLaNeg);
1357 fCommonHistList->Add(fh1PosDaughterCharge);
1358 fCommonHistList->Add(fh1NegDaughterCharge);
1359 fCommonHistList->Add(fh1PtMCK0s);
1360 fCommonHistList->Add(fh1PtMCLa);
1361 fCommonHistList->Add(fh1PtMCALa);
1362 fCommonHistList->Add(fh1EtaK0s);
1363 fCommonHistList->Add(fh1EtaLa);
1364 fCommonHistList->Add(fh1EtaALa);
1365 fCommonHistList->Add(fh3InvMassEtaTrackPtK0s);
1366 fCommonHistList->Add(fh3InvMassEtaTrackPtLa);
1367 fCommonHistList->Add(fh3InvMassEtaTrackPtALa);
1368 fCommonHistList->Add(fh1TrackMultCone);
1369 fCommonHistList->Add(fh2TrackMultCone);
1370 fCommonHistList->Add(fh2MCgenK0Cone);
1371 fCommonHistList->Add(fh2MCgenLaCone);
1372 fCommonHistList->Add(fh2MCgenALaCone);
1373 fCommonHistList->Add(fh2MCEtagenK0Cone);
1374 fCommonHistList->Add(fh2MCEtagenLaCone);
1375 fCommonHistList->Add(fh2MCEtagenALaCone);
1376 fCommonHistList->Add(fh1FFIMK0ConeSmear);
1377 fCommonHistList->Add(fh1FFIMLaConeSmear);
1378 fCommonHistList->Add(fh1FFIMALaConeSmear);
1379 fCommonHistList->Add(fh3MCrecK0Cone);
1380 fCommonHistList->Add(fh3MCrecLaCone);
1381 fCommonHistList->Add(fh3MCrecALaCone);
1382 fCommonHistList->Add(fh3MCrecK0ConeSmear);
1383 fCommonHistList->Add(fh3MCrecLaConeSmear);
1384 fCommonHistList->Add(fh3MCrecALaConeSmear);
1385 fCommonHistList->Add(fh3SecContinCone);
1386 fCommonHistList->Add(fh3StrContinCone);
1387 fCommonHistList->Add(fh3IMK0PerpCone);
1388 fCommonHistList->Add(fh3IMLaPerpCone);
1389 fCommonHistList->Add(fh3IMALaPerpCone);
1390 fCommonHistList->Add(fh3IMK0MedianCone);
1391 fCommonHistList->Add(fh3IMLaMedianCone);
1392 fCommonHistList->Add(fh3IMALaMedianCone);
1393 fCommonHistList->Add(fh1MedianEta);
1394 fCommonHistList->Add(fh1JetPtMedian);
1395 fCommonHistList->Add(fh1MCMultiplicityPrimary);
1396 fCommonHistList->Add(fh1MCMultiplicityTracks);
1397 fCommonHistList->Add(fh3FeedDownLa);
1398 fCommonHistList->Add(fh3FeedDownALa);
1399 fCommonHistList->Add(fh3FeedDownLaCone);
1400 fCommonHistList->Add(fh3FeedDownALaCone);
1401 fCommonHistList->Add(fh1MCProdRadiusK0s);
1402 fCommonHistList->Add(fh1MCProdRadiusLambda);
1403 fCommonHistList->Add(fh1MCProdRadiusAntiLambda);
1404 fCommonHistList->Add(fh1MCPtV0s);
1405 fCommonHistList->Add(fh1MCPtK0s);
1406 fCommonHistList->Add(fh1MCPtLambda);
1407 fCommonHistList->Add(fh1MCPtAntiLambda);
1408 fCommonHistList->Add(fh1MCXiPt);
1409 fCommonHistList->Add(fh1MCXibarPt);
1410 fCommonHistList->Add(fh2MCEtaVsPtK0s);
1411 fCommonHistList->Add(fh2MCEtaVsPtLa);
1412 fCommonHistList->Add(fh2MCEtaVsPtALa);
1413 fCommonHistList->Add(fh1MCRapK0s);
1414 fCommonHistList->Add(fh1MCRapLambda);
1415 fCommonHistList->Add(fh1MCRapAntiLambda);
1416 fCommonHistList->Add(fh1MCEtaAllK0s);
1417 fCommonHistList->Add(fh1MCEtaK0s);
1418 fCommonHistList->Add(fh1MCEtaLambda);
1419 fCommonHistList->Add(fh1MCEtaAntiLambda);
1423 fV0QAK0->AddToOutput(fCommonHistList);
1424 fFFHistosRecCuts->AddToOutput(fCommonHistList);
1425 fFFHistosRecCutsK0Evt->AddToOutput(fCommonHistList);
1426 fFFHistosIMK0AllEvt->AddToOutput(fCommonHistList);
1427 fFFHistosIMK0Jet->AddToOutput(fCommonHistList);
1428 fFFHistosIMK0Cone->AddToOutput(fCommonHistList);
1429 fFFHistosIMLaAllEvt->AddToOutput(fCommonHistList);
1430 fFFHistosIMLaJet->AddToOutput(fCommonHistList);
1431 fFFHistosIMLaCone->AddToOutput(fCommonHistList);
1432 fFFHistosIMALaAllEvt->AddToOutput(fCommonHistList);
1433 fFFHistosIMALaJet->AddToOutput(fCommonHistList);
1434 fFFHistosIMALaCone->AddToOutput(fCommonHistList);
1439 // =========== Switch on Sumw2 for all histos ===========
1440 for (Int_t i=0; i<fCommonHistList->GetEntries(); ++i){
1442 TH1 *h1 = dynamic_cast<TH1*>(fCommonHistList->At(i));
1444 if (h1) h1->Sumw2();//The error per bin will be computed as sqrt(sum of squares of weight) for each bin
1446 THnSparse *hnSparse = dynamic_cast<THnSparse*>(fCommonHistList->At(i));
1447 if(hnSparse) hnSparse->Sumw2();
1451 TH1::AddDirectory(oldStatus);
1452 PostData(1, fCommonHistList);
1455 //_______________________________________________
1456 void AliAnalysisTaskJetChem::UserExec(Option_t *)
1459 // Called for each event
1461 if(fDebug > 1) Printf("AliAnalysisTaskJetChem::UserExec()");
1463 if(fDebug > 1) Printf("Analysis event #%5d", (Int_t) fEntry);
1465 // Trigger selection
1466 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
1467 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
1470 //for AliPIDResponse:
1471 //AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
1472 //AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
1473 fPIDResponse = inputHandler->GetPIDResponse();
1475 if (!fPIDResponse){if(fDebug > 1) Printf("AliAnalysisTaskJetChem::UserExec(): fPIDResponse does not exist!"); return;}
1477 //std::cout<<"inputHandler->IsEventSelected(): "<<inputHandler->IsEventSelected()<<std::endl;
1478 //std::cout<<"fEvtSelectionMask: "<<fEvtSelectionMask<<std::endl;
1480 if(!(inputHandler->IsEventSelected() & fEvtSelectionMask)){
1481 //std::cout<<"########event rejected!!############"<<std::endl;
1482 fh1EvtSelection->Fill(1.);
1483 if (fDebug > 1 ) Printf(" Trigger Selection: event REJECTED ... ");
1484 PostData(1, fCommonHistList);
1488 fESD = dynamic_cast<AliESDEvent*>(InputEvent());//casting of pointers for inherited class, only for ESDs
1490 if(fDebug>3) Printf("%s:%d ESDEvent not found in the input", (char*)__FILE__,__LINE__);
1493 fMCEvent = MCEvent();
1495 if(fDebug>3) Printf("%s:%d MCEvent not found in the input", (char*)__FILE__,__LINE__);
1498 // get AOD event from input/output
1499 TObject* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
1500 if( handler && handler->InheritsFrom("AliAODInputHandler") ) {
1501 fAOD = ((AliAODInputHandler*)handler)->GetEvent();
1502 if(fUseAODInputJets) fAODJets = fAOD;
1503 if (fDebug > 1) Printf("%s:%d AOD event from input", (char*)__FILE__,__LINE__);
1506 handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
1507 if( handler && handler->InheritsFrom("AliAODHandler") ) {
1508 fAOD = ((AliAODHandler*)handler)->GetAOD();
1510 if (fDebug > 1) Printf("%s:%d AOD event from output", (char*)__FILE__,__LINE__);
1514 if(!fAODJets && !fUseAODInputJets){ // case we have AOD in input & output and want jets from output
1515 TObject* outHandler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
1516 if( outHandler && outHandler->InheritsFrom("AliAODHandler") ){
1517 fAODJets = ((AliAODHandler*)outHandler)->GetAOD();
1518 if (fDebug > 1) Printf("%s:%d jets from output AOD", (char*)__FILE__,__LINE__);
1522 if(fNonStdFile.Length()!=0){
1523 // case we have an AOD extension - fetch the jets from the extended output
1525 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
1526 fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);
1528 if(fDebug>1)Printf("AODExtension not found for %s",fNonStdFile.Data());
1533 Printf("%s:%d AODEvent not found", (char*)__FILE__,__LINE__);
1537 Printf("%s:%d AODEvent with jet branch not found", (char*)__FILE__,__LINE__);
1541 //primary vertex position:
1542 AliAODVertex *myPrimaryVertex = NULL;
1543 myPrimaryVertex = (AliAODVertex*)fAOD->GetPrimaryVertex();
1544 if (!myPrimaryVertex) return;
1545 fh1Evt->Fill(1.);//fill in every event that was accessed with InputHandler
1547 // event selection *****************************************
1549 // *** vertex cut ***
1550 AliAODVertex* primVtx = fAOD->GetPrimaryVertex();
1551 Int_t nTracksPrim = primVtx->GetNContributors();
1552 fh1VertexNContributors->Fill(nTracksPrim);
1554 if (fDebug > 1) Printf("%s:%d primary vertex selection: %d", (char*)__FILE__,__LINE__,nTracksPrim);
1556 if(nTracksPrim <= 2){
1557 if (fDebug > 1) Printf("%s:%d primary vertex selection: event REJECTED...",(char*)__FILE__,__LINE__);
1558 fh1EvtSelection->Fill(3.);
1559 PostData(1, fCommonHistList);
1563 fh1VertexZ->Fill(primVtx->GetZ());
1565 if(TMath::Abs(primVtx->GetZ())>fMaxVertexZ){
1566 if (fDebug > 1) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ());
1567 fh1EvtSelection->Fill(4.);
1568 PostData(1, fCommonHistList);
1572 // accepts only events that have same "primary" and SPD vertex, special issue of LHC11h PbPb data
1574 //fAOD: pointer to global primary vertex
1576 const AliAODVertex* spdVtx = fAOD->GetPrimaryVertexSPD();
1578 if (TMath::Abs(spdVtx->GetZ() - primVtx->GetZ())>fDeltaVertexZ) { if (fDebug > 1) Printf("deltaZVertex: event REJECTED..."); return;}
1581 //check for vertex radius to be smaller than 1 cm, (that was first applied by Vit Kucera in his analysis)
1583 Double_t vtxX = primVtx->GetX();
1584 Double_t vtxY = primVtx->GetY();
1586 if(TMath::Sqrt(vtxX*vtxX + vtxY*vtxY)>=1){
1587 if (fDebug > 1) Printf("%s:%d primary vertex r = %f: event REJECTED...",(char*)__FILE__,__LINE__,TMath::Sqrt(vtxX*vtxX + vtxY*vtxY));
1592 TString primVtxName(primVtx->GetName());
1594 if(primVtxName.CompareTo("TPCVertex",TString::kIgnoreCase) == 1){
1595 if (fDebug > 1) Printf("%s:%d primary vertex selection: TPC vertex, event REJECTED...",(char*)__FILE__,__LINE__);
1596 fh1EvtSelection->Fill(5.);
1597 PostData(1, fCommonHistList);
1601 Bool_t selectedHelper = AliAnalysisHelperJetTasks::Selected();
1602 if(!selectedHelper){
1603 fh1EvtSelection->Fill(6.);
1604 PostData(1, fCommonHistList);
1608 // event selection *****************************************
1610 Double_t centPercent = -1;
1614 if(handler && handler->InheritsFrom("AliAODInputHandler")){
1616 centPercent = fAOD->GetHeader()->GetCentrality();
1618 //std::cout<<"centPercent: "<<centPercent<<std::endl;
1620 fh1EvtAllCent->Fill(centPercent);
1622 if(centPercent>10) cl = 2; //standard PWG-JE binning
1623 if(centPercent>30) cl = 3;
1624 if(centPercent>50) cl = 4;
1628 if(centPercent < 0) cl = -1;
1629 if(centPercent >= 0) cl = 1;
1630 if(centPercent > 10) cl = 2; //standard PWG-JE binning
1631 if(centPercent > 30) cl = 3;
1632 if(centPercent > 50) cl = 4;
1633 if(centPercent > 80) cl = 5; //takes centralities higher than my upper edge of 80%, not to be used
1638 cl = AliAnalysisHelperJetTasks::EventClass();
1640 if(fESD) centPercent = fESD->GetCentrality()->GetCentralityPercentile("V0M"); //ESD JetServices Task has the centrality binning 0-10,10-30,30-50,50-80
1641 fh1EvtAllCent->Fill(centPercent);
1644 if(cl!=fEventClass){ // event not in selected event class, reject event#########################################
1646 if (fDebug > 1) Printf("%s:%d event not in selected event class: event REJECTED ...",(char*)__FILE__,__LINE__);
1647 fh1EvtSelection->Fill(2.);
1648 PostData(1, fCommonHistList);
1651 }//end if fEventClass > 0
1654 if (fDebug > 1) Printf("%s:%d event ACCEPTED ...",(char*)__FILE__,__LINE__);
1657 //Printf("Analysis event #%5d", (Int_t) fEntry);
1659 fh1EvtSelection->Fill(0.);
1660 fh1EvtCent->Fill(centPercent);
1662 //___ get MC information __________________________________________________________________
1665 Double_t ptHard = 0.; //parton energy bins -> energy of particle
1666 Double_t nTrials = 1; // trials for MC trigger weight for real data
1669 AliGenEventHeader* genHeader = fMCEvent->GenEventHeader();
1670 AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);//check usage of Pythia (pp) or Hijing (PbPb)
1671 AliGenHijingEventHeader* hijingGenHeader = 0x0;
1673 if(pythiaGenHeader){
1674 if(fDebug>3) Printf("%s:%d pythiaGenHeader found", (char*)__FILE__,__LINE__);
1675 nTrials = pythiaGenHeader->Trials();
1676 ptHard = pythiaGenHeader->GetPtHard();
1678 fh1PtHard->Fill(ptHard);
1679 fh1PtHardTrials->Fill(ptHard,nTrials);
1682 } else { // no pythia, hijing?
1684 if(fDebug>3) Printf("%s:%d no pythiaGenHeader found", (char*)__FILE__,__LINE__);
1686 hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(genHeader);
1687 if(!hijingGenHeader){
1688 if(fDebug>3) Printf("%s:%d no pythiaGenHeader or hjingGenHeader found", (char*)__FILE__,__LINE__);
1690 if(fDebug>3) Printf("%s:%d hijingGenHeader found", (char*)__FILE__,__LINE__);
1694 fh1Trials->Fill("#sum{ntrials}",fAvgTrials);
1697 //____ fetch jets _______________________________________________________________
1699 Int_t nJCuts = GetListOfJets(fJetsRecCuts, kJetsRecAcceptance);//fetch list with jets
1701 Int_t nRecJetsCuts = 0; //number of reconstructed jets after jet cuts
1702 if(nJCuts>=0) nRecJetsCuts = fJetsRecCuts->GetEntries();
1703 if(fDebug>2)Printf("%s:%d Selected Rec jets after cuts: %d %d",(char*)__FILE__,__LINE__,nJCuts,nRecJetsCuts);
1704 if(nRecJetsCuts != nJCuts) Printf("%s:%d Mismatch selected Rec jets after cuts: %d %d",(char*)__FILE__,__LINE__,nJCuts,nRecJetsCuts);
1705 fh1nRecJetsCuts->Fill(nRecJetsCuts);
1708 //____ fetch background clusters ___________________________________________________
1709 if(fBranchRecBckgClusters.Length() != 0){
1711 Int_t nBJ = GetListOfBckgJets(fBckgJetsRec, kJetsRec);
1712 Int_t nRecBckgJets = 0;
1713 if(nBJ>=0) nRecBckgJets = fBckgJetsRec->GetEntries();
1714 if(fDebug>2)Printf("%s:%d Selected Rec background jets: %d %d",(char*)__FILE__,__LINE__,nBJ,nRecBckgJets);
1715 if(nBJ != nRecBckgJets) Printf("%s:%d Mismatch Selected Rec background jets: %d %d",(char*)__FILE__,__LINE__,nBJ,nRecBckgJets);
1719 //____ fetch reconstructed particles __________________________________________________________
1721 Int_t nTCuts = GetListOfTracks(fTracksRecCuts, kTrackAODCuts);//all tracks of event
1722 if(fDebug>2)Printf("%s:%d selected reconstructed tracks after cuts: %d %d",(char*)__FILE__,__LINE__,nTCuts,fTracksRecCuts->GetEntries());
1723 if(fTracksRecCuts->GetEntries() != nTCuts)
1724 Printf("%s:%d Mismatch selected reconstructed tracks after cuts: %d %d",(char*)__FILE__,__LINE__,nTCuts,fTracksRecCuts->GetEntries());
1725 fh1EvtMult->Fill(fTracksRecCuts->GetEntries());
1727 Int_t nK0s = GetListOfV0s(fListK0s,fK0Type,kK0,myPrimaryVertex,fAOD);//all V0s in event with K0s assumption
1729 if(fDebug>5){std::cout<<"fK0Type: "<<fK0Type<<" kK0: "<<kK0<<" myPrimaryVertex: "<<myPrimaryVertex<<" fAOD: "<<fAOD<<std::endl;}
1731 //std::cout<< "nK0s: "<<nK0s<<std::endl;
1733 if(fDebug>2)Printf("%s:%d Selected V0s after cuts: %d %d",(char*)__FILE__,__LINE__,nK0s,fListK0s->GetEntries());
1734 if(nK0s != fListK0s->GetEntries()) Printf("%s:%d Mismatch selected K0s: %d %d",(char*)__FILE__,__LINE__,nK0s,fListK0s->GetEntries());
1735 fh1K0Mult->Fill(fListK0s->GetEntries());
1738 Int_t nLa = GetListOfV0s(fListLa,fLaType,kLambda,myPrimaryVertex,fAOD);//all V0s in event with Lambda particle assumption
1739 if(fDebug>2)Printf("%s:%d Selected Rec tracks after cuts: %d %d",(char*)__FILE__,__LINE__,nLa,fListLa->GetEntries());
1740 if(nLa != fListLa->GetEntries()) Printf("%s:%d Mismatch selected La: %d %d",(char*)__FILE__,__LINE__,nLa,fListLa->GetEntries());
1741 fh1LaMult->Fill(fListLa->GetEntries());
1743 Int_t nALa = GetListOfV0s(fListALa,fALaType,kAntiLambda,myPrimaryVertex,fAOD);//all V0s in event with Antilambda particle assumption
1744 if(fDebug>2)Printf("%s:%d Selected Rec tracks after cuts: %d %d",(char*)__FILE__,__LINE__,nALa,fListALa->GetEntries());
1745 if(nALa != fListALa->GetEntries()) Printf("%s:%d Mismatch selected ALa: %d %d",(char*)__FILE__,__LINE__,nALa,fListALa->GetEntries());
1746 fh1ALaMult->Fill(fListALa->GetEntries());
1750 //fetch MC gen particles_______________________________________________________
1752 if(fAnalysisMC){ // here
1754 //fill feeddown histo for associated particles
1756 // Access MC generated particles, fill TLists and histograms :
1758 Int_t nMCgenK0s = GetListOfMCParticles(fListMCgenK0s,kK0,fAOD); //fill TList with MC generated primary true K0s (list to fill, particletype, mc aod event)
1759 if(nMCgenK0s != fListMCgenK0s->GetEntries()) Printf("%s:%d Mismatch selected MCgenK0s: %d %d",(char*)__FILE__,__LINE__,nMCgenK0s,fListMCgenK0s->GetEntries());
1762 for(Int_t it=0; it<fListMCgenK0s->GetSize(); ++it){ // loop MC generated K0s, filling histograms
1764 AliAODMCParticle* mcp0 = dynamic_cast<AliAODMCParticle*>(fListMCgenK0s->At(it));
1769 Double_t fRapCurrentPart = MyRapidity(mcp0->E(),mcp0->Pz());
1770 Double_t fEtaCurrentPart = mcp0->Eta();
1771 Double_t fPtCurrentPart = mcp0->Pt();
1773 fh1MCEtaK0s->Fill(fEtaCurrentPart);
1774 fh1MCRapK0s->Fill(fRapCurrentPart);
1775 fh1MCPtK0s->Fill(fPtCurrentPart);
1777 fh2MCEtaVsPtK0s->Fill(fPtCurrentPart,fEtaCurrentPart); //eta cut, physical primary selection and decay mode considered
1782 Int_t nMCgenLa = GetListOfMCParticles(fListMCgenLa,kLambda,fAOD); //fill TList with MC generated primary true Lambdas (list to fill, particletype, mc aod event)
1783 if(nMCgenLa != fListMCgenLa->GetEntries()) Printf("%s:%d Mismatch selected MCgenLa: %d %d",(char*)__FILE__,__LINE__,nMCgenLa,fListMCgenLa->GetEntries());
1786 for(Int_t it=0; it<fListMCgenLa->GetSize(); ++it){ // loop MC generated La, filling histograms
1788 AliAODMCParticle* mcp0 = dynamic_cast<AliAODMCParticle*>(fListMCgenLa->At(it));
1793 Double_t fRapCurrentPart = MyRapidity(mcp0->E(),mcp0->Pz());
1794 Double_t fEtaCurrentPart = mcp0->Eta();
1795 Double_t fPtCurrentPart = mcp0->Pt();
1797 fh1MCEtaLambda->Fill(fEtaCurrentPart);
1798 fh1MCRapLambda->Fill(fRapCurrentPart);
1799 fh1MCPtLambda->Fill(fPtCurrentPart);
1800 fh2MCEtaVsPtLa->Fill(fPtCurrentPart,fEtaCurrentPart); //eta cut, physical primary selection and decay mode considered
1805 Int_t nMCgenALa = GetListOfMCParticles(fListMCgenALa,kAntiLambda,fAOD); //fill TList with MC generated primary true Antilambdas (list to fill, particletype, mc aod event)
1806 if(nMCgenALa != fListMCgenALa->GetEntries()) Printf("%s:%d Mismatch selected MCgenALa: %d %d",(char*)__FILE__,__LINE__,nMCgenALa,fListMCgenALa->GetEntries());
1809 for(Int_t it=0; it<fListMCgenALa->GetSize(); ++it){ // loop MC generated ALa, filling histograms
1811 AliAODMCParticle* mcp0 = dynamic_cast<AliAODMCParticle*>(fListMCgenALa->At(it));
1814 //MC gen Antilambdas
1816 Double_t fRapCurrentPart = MyRapidity(mcp0->E(),mcp0->Pz());
1817 Double_t fEtaCurrentPart = mcp0->Eta();
1818 Double_t fPtCurrentPart = mcp0->Pt();
1820 fh1MCEtaAntiLambda->Fill(fEtaCurrentPart);
1821 fh1MCRapAntiLambda->Fill(fRapCurrentPart);
1822 fh1MCPtAntiLambda->Fill(fPtCurrentPart);
1823 fh2MCEtaVsPtALa->Fill(fPtCurrentPart,fEtaCurrentPart); //eta cut, physical primary selection and decay mode considered
1829 //loop over MC feeddown candidates in TList
1834 } //end MCAnalysis part for gen particles
1837 // ___ V0 QA + K0s + La + ALa pt spectra all events _______________________________________________
1839 Double_t lPrimaryVtxPosition[3];
1840 Double_t lV0Position[3];
1841 lPrimaryVtxPosition[0] = primVtx->GetX();
1842 lPrimaryVtxPosition[1] = primVtx->GetY();
1843 lPrimaryVtxPosition[2] = primVtx->GetZ();
1845 //------------------------------------------
1847 for(Int_t it=0; it<fListK0s->GetSize(); ++it){ // loop all K0s
1849 AliAODv0* v0 = dynamic_cast<AliAODv0*>(fListK0s->At(it));
1852 // VO's main characteristics to check the reconstruction cuts
1854 Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
1857 Double_t fV0Radius = -999;
1858 Double_t fDcaV0Daughters = v0->DcaV0Daughters();
1859 Double_t fDcaPosToPrimVertex = v0->DcaPosToPrimVertex();//IP of positive charged daughter
1860 Double_t fDcaNegToPrimVertex = v0->DcaNegToPrimVertex();//IP of negative charged daughter
1861 Int_t negDaughterpdg = 0;
1862 Int_t posDaughterpdg = 0;
1863 Int_t motherType = 0;
1866 Bool_t fPhysicalPrimary = kFALSE;//don't use IsPhysicalPrimary() anymore for MC analysis, use instead 2D distance from primary to secondary vertex
1867 Int_t MCv0PdgCode = 0;
1869 AliAODTrack *trackPos = (AliAODTrack *) (v0->GetSecondaryVtx()->GetDaughter(0));
1870 AliAODTrack *trackNeg = (AliAODTrack *) (v0->GetSecondaryVtx()->GetDaughter(1));
1872 Double_t PosEta = trackPos->AliAODTrack::Eta();//daughter track charge is sometimes wrong here, account for that!!!
1873 Double_t NegEta = trackNeg->AliAODTrack::Eta();
1875 //Double_t trackPosNcls = trackPos->GetTPCNcls();//Get number of clusters for positive charged tracks
1876 //Double_t trackNegNcls = trackNeg->GetTPCNcls();//Get number of clusters for negative charged tracks
1878 CalculateInvMass(v0, kK0, invMK0s, trackPt); //function to calculate invMass with TLorentzVector class
1880 Double_t jetPt = fFFIMJetPtMin; // assign pro forma jet energy
1881 //Double_t fRap = v0->RapK0Short();
1882 Double_t fEta = v0->PseudoRapV0();
1884 Double_t fV0cosPointAngle = v0->CosPointingAngle(lPrimaryVtxPosition);
1886 lV0Position[0]= v0->DecayVertexV0X();
1887 lV0Position[1]= v0->DecayVertexV0Y();
1888 lV0Position[2]= v0->DecayVertexV0Z();
1892 fV0mom[0]=v0->MomV0X();
1893 fV0mom[1]=v0->MomV0Y();
1894 fV0mom[2]=v0->MomV0Z();
1895 Double_t fV0TotalMomentum = TMath::Sqrt(fV0mom[0]*fV0mom[0]+fV0mom[1]*fV0mom[1]+fV0mom[2]*fV0mom[2]);
1896 Double_t fV0DecayLength = v0->DecayLengthV0(lPrimaryVtxPosition);
1897 fV0Radius = TMath::Sqrt(lV0Position[0]*lV0Position[0]+lV0Position[1]*lV0Position[1]);
1899 fV0QAK0->FillTrackQA(v0->Eta(), TVector2::Phi_0_2pi(v0->Phi()), v0->Pt());
1900 fFFHistosIMK0AllEvt->FillFF(trackPt, invMK0s, jetPt, incrementJetPt);
1901 //fh1trackPosNCls->Fill(trackPosNcls);
1902 //fh1trackNegNCls->Fill(trackNegNcls);
1903 fh1EtaK0s->Fill(fEta);
1905 TList *listmc = fAOD->GetList();
1906 Bool_t mclabelcheck = MCLabelCheck(v0, kK0, trackNeg, trackPos, listmc, negDaughterpdg, posDaughterpdg, motherType, v0Label, MCPt, fPhysicalPrimary, MCv0PdgCode);
1907 //if(fPhysicalPrimary == kFALSE)continue;
1908 //std::cout<<"mclabelcheck: "<<mclabelcheck<<std::endl;
1909 //std::cout<<"IsPhysicalPrimary: "<<fPhysicalPrimary<<std::endl;
1911 if(mclabelcheck == kFALSE)continue;
1912 fh3InvMassEtaTrackPtK0s->Fill(fEta,invMK0s,trackPt);//includes also feeddown particles
1913 fh1PtMCK0s->Fill(MCPt);
1917 fh1V0Eta->Fill(fEta);
1918 fh1V0totMom->Fill(fV0TotalMomentum);
1919 fh1CosPointAngle->Fill(fV0cosPointAngle);
1920 fh1DecayLengthV0->Fill(fV0DecayLength);
1921 fh1V0Radius->Fill(fV0Radius);
1922 fh1DcaV0Daughters->Fill(fDcaV0Daughters);
1923 fh1DcaPosToPrimVertex->Fill(fDcaPosToPrimVertex);
1924 fh1DcaNegToPrimVertex->Fill(fDcaNegToPrimVertex);
1925 fh1trackPosEta->Fill(PosEta);
1926 fh1trackNegEta->Fill(NegEta);
1930 // __La pt spectra all events _______________________________________________
1933 for(Int_t it=0; it<fListLa->GetSize(); ++it){ // loop all La
1935 AliAODv0* v0 = dynamic_cast<AliAODv0*>(fListLa->At(it));
1938 // VO's main characteristics to check the reconstruction cuts
1939 Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
1942 Double_t fV0Radius = -999;
1943 Double_t fDcaV0Daughters = v0->DcaV0Daughters();
1944 Double_t fDcaPosToPrimVertex = v0->DcaPosToPrimVertex();//IP of positive charged daughter
1945 Double_t fDcaNegToPrimVertex = v0->DcaNegToPrimVertex();//IP of negative charged daughter
1946 Int_t negDaughterpdg = 0;
1947 Int_t posDaughterpdg = 0;
1948 Int_t motherType = 0;
1951 Bool_t fPhysicalPrimary = kFALSE;
1952 Int_t MCv0PdgCode = 0;
1953 AliAODTrack *trackPos = (AliAODTrack *) (v0->GetSecondaryVtx()->GetDaughter(0));
1954 AliAODTrack *trackNeg = (AliAODTrack *) (v0->GetSecondaryVtx()->GetDaughter(1));
1956 //Double_t trackPosNcls = trackPos->GetTPCNcls();//Get number of clusters for positive charged tracks
1957 //Double_t trackNegNcls = trackNeg->GetTPCNcls();//Get number of clusters for negative charged tracks
1959 Double_t PosEta = trackPos->AliAODTrack::Eta();//daughter track charge is sometimes wrong here, account for that!!!
1960 Double_t NegEta = trackNeg->AliAODTrack::Eta();
1962 CalculateInvMass(v0, kLambda, invMLa, trackPt);//function to calculate invMass with TLorentzVector class
1965 Double_t jetPt = fFFIMJetPtMin; // assign pro forma jet energy
1966 // Double_t fRap = v0->Y(3122);
1967 Double_t fEta = v0->PseudoRapV0();
1971 fV0mom[0]=v0->MomV0X();
1972 fV0mom[1]=v0->MomV0Y();
1973 fV0mom[2]=v0->MomV0Z();
1974 Double_t fV0TotalMomentum = TMath::Sqrt(fV0mom[0]*fV0mom[0]+fV0mom[1]*fV0mom[1]+fV0mom[2]*fV0mom[2]);
1975 Double_t fV0DecayLength = v0->DecayLengthV0(lPrimaryVtxPosition);
1976 Double_t fV0cosPointAngle = v0->CosPointingAngle(lPrimaryVtxPosition);
1977 lV0Position[0]= v0->DecayVertexV0X();
1978 lV0Position[1]= v0->DecayVertexV0Y();
1979 lV0Position[2]= v0->DecayVertexV0Z();
1981 fV0Radius = TMath::Sqrt(lV0Position[0]*lV0Position[0]+lV0Position[1]*lV0Position[1]);
1983 fFFHistosIMLaAllEvt->FillFF(trackPt, invMLa, jetPt, incrementJetPt);
1984 //fh1trackPosNCls->Fill(trackPosNcls);
1985 //fh1trackNegNCls->Fill(trackNegNcls);
1986 fh1EtaLa->Fill(fEta);
1988 TList* listmc = fAOD->GetList();
1989 Bool_t mclabelcheck = MCLabelCheck(v0, kLambda, trackNeg, trackPos, listmc, negDaughterpdg, posDaughterpdg, motherType, v0Label, MCPt, fPhysicalPrimary, MCv0PdgCode);
1990 if(mclabelcheck == kFALSE)continue;
1991 //if(fPhysicalPrimary == kFALSE)continue;
1992 fh3InvMassEtaTrackPtLa->Fill(fEta,invMLa,trackPt);
1993 fh1PtMCLa->Fill(MCPt);
1995 fh1V0Eta->Fill(fEta);
1996 fh1V0totMom->Fill(fV0TotalMomentum);
1997 fh1CosPointAngle->Fill(fV0cosPointAngle);
1998 fh1DecayLengthV0->Fill(fV0DecayLength);
1999 fh1V0Radius->Fill(fV0Radius);
2000 fh1DcaV0Daughters->Fill(fDcaV0Daughters);
2001 fh1DcaPosToPrimVertex->Fill(fDcaPosToPrimVertex);
2002 fh1DcaNegToPrimVertex->Fill(fDcaNegToPrimVertex);
2003 fh1trackPosEta->Fill(PosEta);
2004 fh1trackNegEta->Fill(NegEta);
2007 // __ALa pt spectra all events _______________________________________________
2009 for(Int_t it=0; it<fListALa->GetSize(); ++it){ // loop all ALa
2011 AliAODv0* v0 = dynamic_cast<AliAODv0*>(fListALa->At(it));
2015 //VO's main characteristics to check the reconstruction cuts
2016 Double_t invMALa =0;
2018 Double_t fV0Radius = -999;
2019 Double_t fDcaV0Daughters = v0->DcaV0Daughters();
2020 Double_t fDcaPosToPrimVertex = v0->DcaPosToPrimVertex();//IP of positive charged daughter
2021 Double_t fDcaNegToPrimVertex = v0->DcaNegToPrimVertex();//IP of negative charged daughter
2022 Int_t negDaughterpdg = 0;
2023 Int_t posDaughterpdg = 0;
2024 Int_t motherType = 0;
2027 Bool_t fPhysicalPrimary = kFALSE;
2028 Int_t MCv0PdgCode = 0;
2030 AliAODTrack *trackPos = (AliAODTrack *) (v0->GetSecondaryVtx()->GetDaughter(0));
2031 AliAODTrack *trackNeg = (AliAODTrack *) (v0->GetSecondaryVtx()->GetDaughter(1));
2033 Double_t PosEta = trackPos->AliAODTrack::Eta();//daughter track charge is sometimes wrong here, account for that!!!
2034 Double_t NegEta = trackNeg->AliAODTrack::Eta();
2036 //Double_t trackPosNcls = trackPos->GetTPCNcls();//Get number of clusters for positive charged tracks //not used anymore by Strangeness PAG group
2037 //Double_t trackNegNcls = trackNeg->GetTPCNcls();//Get number of clusters for negative charged tracks
2039 CalculateInvMass(v0, kAntiLambda, invMALa, trackPt); //function to calculate invMass with TLorentzVector class
2041 Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
2042 Double_t jetPt = fFFIMJetPtMin; // assign pro forma jet energy
2043 // Double_t fRap = v0->Y(-3122);
2044 Double_t fEta = v0->PseudoRapV0();
2048 fV0mom[0]=v0->MomV0X();
2049 fV0mom[1]=v0->MomV0Y();
2050 fV0mom[2]=v0->MomV0Z();
2051 Double_t fV0TotalMomentum = TMath::Sqrt(fV0mom[0]*fV0mom[0]+fV0mom[1]*fV0mom[1]+fV0mom[2]*fV0mom[2]);
2053 Double_t fV0cosPointAngle = v0->CosPointingAngle(lPrimaryVtxPosition);
2054 lV0Position[0]= v0->DecayVertexV0X();
2055 lV0Position[1]= v0->DecayVertexV0Y();
2056 lV0Position[2]= v0->DecayVertexV0Z();
2057 Double_t fV0DecayLength = v0->DecayLengthV0(lPrimaryVtxPosition);
2058 fV0Radius = TMath::Sqrt(lV0Position[0]*lV0Position[0]+lV0Position[1]*lV0Position[1]);
2060 fFFHistosIMALaAllEvt->FillFF(trackPt, invMALa, jetPt, incrementJetPt);
2061 //fh1trackPosNCls->Fill(trackPosNcls);
2062 //fh1trackNegNCls->Fill(trackNegNcls);
2063 fh1EtaALa->Fill(fEta);
2065 TList* listmc = fAOD->GetList();
2066 Bool_t mclabelcheck = MCLabelCheck(v0, kAntiLambda, trackNeg, trackPos, listmc, negDaughterpdg, posDaughterpdg, motherType, v0Label, MCPt, fPhysicalPrimary, MCv0PdgCode);
2067 if(mclabelcheck == kFALSE)continue;
2068 //if(fPhysicalPrimary == kFALSE)continue;
2069 fh3InvMassEtaTrackPtALa->Fill(fEta,invMALa,trackPt);
2070 fh1PtMCALa->Fill(MCPt);
2072 fh1V0Eta->Fill(fEta);
2073 fh1V0totMom->Fill(fV0TotalMomentum);
2074 fh1CosPointAngle->Fill(fV0cosPointAngle);
2075 fh1DecayLengthV0->Fill(fV0DecayLength);
2076 fh1V0Radius->Fill(fV0Radius);
2077 fh1DcaV0Daughters->Fill(fDcaV0Daughters);
2078 fh1DcaPosToPrimVertex->Fill(fDcaPosToPrimVertex);
2079 fh1DcaNegToPrimVertex->Fill(fDcaNegToPrimVertex);
2080 fh1trackPosEta->Fill(PosEta);
2081 fh1trackNegEta->Fill(NegEta);
2084 //_____no jets events______________________________________________________________________________________________________________________________________
2086 if(nRecJetsCuts == 0){
2088 // std::cout<<"################## found event without any jet!!!!!###################"<<std::endl;
2095 //____ fill all jet related histos ________________________________________________________________________________________________________________________
2096 //##########################jet loop########################################################################################################################
2098 //fill jet histos in general
2099 for(Int_t ij=0; ij<nRecJetsCuts; ++ij){ // ij is an index running over the list of the reconstructed jets after cuts, all jets in event
2101 AliAODJet* jet = (AliAODJet*) (fJetsRecCuts->At(ij));
2103 Double_t jetPt = jet->Pt();
2104 Double_t jetEta = jet->Eta();
2105 Double_t jetPhi = jet->Phi();
2107 //if(ij==0){ // loop over leading jets for ij = 0, for ij>= 0 look into all jets
2109 if(ij>=0){//all jets in event
2111 TList* jettracklist = new TList();
2112 Double_t sumPt = 0.;
2113 Bool_t isBadJet = kFALSE;
2114 Int_t njetTracks = 0;
2116 if(GetFFRadius()<=0){
2117 GetJetTracksTrackrefs(jettracklist, jet, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);// list of jet tracks from trackrefs
2119 GetJetTracksPointing(fTracksRecCuts, jettracklist, jet, GetFFRadius(), sumPt, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet); // fill list of tracks in cone around jet axis with cone Radius (= 0.4 standard)
2122 if(GetFFMinNTracks()>0 && jettracklist->GetSize() <= GetFFMinNTracks()) isBadJet = kTRUE; // reject jets with less tracks than fFFMinNTracks
2123 if(isBadJet) continue; // rejects jets in which no track has a track pt higher than 5 GeV/c (see AddTask macro)
2126 Float_t fJetAreaMin = 0.6*TMath::Pi()*GetFFRadius()*GetFFRadius(); // minimum jet area cut
2128 //std::cout<<"GetFFRadius(): "<<GetFFRadius()<<std::endl;
2129 //std::cout<<"jet->EffectiveAreaCharged()"<<jet->EffectiveAreaCharged()<<std::endl;
2130 //std::cout<<"fJetAreaMin: "<<fJetAreaMin<<std::endl;
2132 if (jet->EffectiveAreaCharged() < fJetAreaMin)continue;// cut on jet area
2135 fh1JetEta->Fill(jetEta);
2136 fh1JetPhi->Fill(jetPhi);
2137 fh2JetEtaPhi->Fill(jetEta,jetPhi);
2139 // printf("pT = %f, eta = %f, phi = %f, leadtr pt = %f\n, ",jetPt,jetEta,jetphi,leadtrack);
2141 for(Int_t it=0; it<jettracklist->GetSize(); ++it){//loop over all particles in jet
2143 AliVParticle* trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));//all tracks in jet cone
2144 if(!trackVP)continue;
2146 Float_t trackPt = trackVP->Pt();//transversal momentum of jet particle
2147 Float_t trackEta = trackVP->Eta();
2149 Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
2151 fFFHistosRecCuts->FillFF(trackPt, jetPt, incrementJetPt);//histo with tracks/jets after cut selection, for all events
2152 if(nK0s>0) fFFHistosRecCutsK0Evt->FillFF(trackPt, jetPt, incrementJetPt);//only for K0s events
2153 fh2FFJetTrackEta->Fill(trackEta,jetPt);
2158 njetTracks = jettracklist->GetSize();
2160 //____________________________________________________________________________________________________________________
2161 //strangeness constribution to jet cone
2165 TList *list = fAOD->GetList();
2166 AliAODMCHeader *mcHeadr=(AliAODMCHeader*)list->FindObject(AliAODMCHeader::StdBranchName());
2167 if(!mcHeadr)continue;
2169 Double_t mcXv=0., mcYv=0., mcZv=0.;//MC primary vertex position
2171 mcXv=mcHeadr->GetVtxX(); mcYv=mcHeadr->GetVtxY(); mcZv=mcHeadr->GetVtxZ(); // position of the MC primary vertex
2173 for(Int_t it=0; it<jettracklist->GetSize(); ++it){//loop over all tracks in the jet
2175 AliVParticle* trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));//track in jet cone
2176 if(!trackVP)continue;
2177 AliAODTrack *tr = dynamic_cast<AliAODTrack*> (trackVP); //fetch one jet track from the TList
2180 //get MC label information
2181 TList *mclist = fAOD->GetList();
2183 //fetch the MC stack
2184 TClonesArray* stackMC = (TClonesArray*)mclist->FindObject(AliAODMCParticle::StdBranchName()); //get MCAOD branch in data
2185 if (!stackMC) {Printf("ERROR: stack not available");}
2189 Int_t trackLabel = TMath::Abs(tr->GetLabel()); //fetch jet track label in MC stack
2191 AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(stackMC->At(trackLabel)); //fetch MC gen. particle for rec. jet track
2193 if(!part)continue; //skip non-existing objects
2196 //Bool_t IsPhysicalPrimary = part->IsPhysicalPrimary();//not recommended to check, better use distance between primary vertex and secondary vertex
2198 Float_t fDistPrimaryMax = 0.01;
2199 // Get the distance between production point of the MC mother particle and the primary vertex
2201 Double_t dx = mcXv-part->Xv();//mc primary vertex - mc gen. v0 vertex
2202 Double_t dy = mcYv-part->Yv();
2203 Double_t dz = mcZv-part->Zv();
2205 Float_t fDistPrimary = TMath::Sqrt(dx*dx + dy*dy + dz*dz);
2206 Bool_t fPhysicalPrimary = (fDistPrimary < fDistPrimaryMax);
2208 // std::cout<<"fDistPrimary"<<fDistPrimary<<std::endl;
2209 // std::cout<<"fPhysicalPrimary"<<fPhysicalPrimary<<std::endl;
2211 if(!fPhysicalPrimary)continue;//rejects Kstar and other strong decaying particles from Secondary Contamination
2213 Bool_t isFromStrange = kFALSE;// flag to check whether particle has strange mother
2215 Int_t iMother = part->GetMother(); //get mother MC gen. particle label
2218 AliAODMCParticle *partM = dynamic_cast<AliAODMCParticle*>(stackMC->At(iMother)); //fetch mother of MC gen. particle
2219 if(!partM) continue;
2221 Int_t codeM = TMath::Abs(partM->GetPdgCode()); //mothers pdg code
2223 Int_t mfl = Int_t (codeM/ TMath::Power(10, Int_t(TMath::Log10(codeM)))); //asks for first number of mothers pdg code (strange particles always start with 3..)
2225 if (mfl == 3 && codeM != 3) isFromStrange = kTRUE;
2228 if(isFromStrange == kTRUE){
2230 Double_t trackPt = part->Pt();
2231 Double_t trackEta = part->Eta();
2232 fh3StrContinCone->Fill(jetPt, trackPt, trackEta);//MC gen. particle parameters, but rec. jet pt
2234 }//isFromStrange is kTRUE
2236 }//end loop over jet tracks
2241 fh1TrackMultCone->Fill(njetTracks);
2242 fh2TrackMultCone->Fill(njetTracks,jetPt);
2246 // fQAJetHistosRecCutsLeading->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt() );
2248 for(Int_t it=0; it<fListK0s->GetSize(); ++it){ // loop all K0s
2250 AliAODv0* v0 = dynamic_cast<AliAODv0*>(fListK0s->At(it));
2251 if(!v0) continue;//rejection of events with no V0 vertex
2255 TVector3 v0MomVect(v0Mom);
2257 Double_t dPhiJetK0 = (jet->MomentumVector()->Vect()).DeltaPhi(v0MomVect);
2258 Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
2260 if(incrementJetPt){fh1V0JetPt->Fill(jetPt);}
2262 Double_t invMK0s =0;
2264 CalculateInvMass(v0, kK0, invMK0s, trackPt); //function to calculate invMass with TLorentzVector class
2266 fFFHistosIMK0Jet->FillFF(trackPt, invMK0s, jetPt, incrementJetPt);
2268 if(dPhiJetK0<fh1dPhiJetK0->GetXaxis()->GetXmin()) dPhiJetK0 += 2*TMath::Pi();
2269 fh1dPhiJetK0->Fill(dPhiJetK0);
2273 if(fListK0s->GetSize() == 0){ // no K0: increment jet pt spectrum
2275 Bool_t incrementJetPt = kTRUE;
2276 fFFHistosIMK0Jet->FillFF(-1, -1, jetPt, incrementJetPt);
2279 //____fetch reconstructed K0s in cone around jet axis:_______________________________________________________________________________
2281 TList* jetConeK0list = new TList();
2283 Double_t sumPtK0 = 0.;
2285 Bool_t isBadJetK0 = kFALSE; // dummy, do not use
2288 GetTracksInCone(fListK0s, jetConeK0list, jet, GetFFRadius(), sumPtK0, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJetK0); //reconstructed K0s in cone around jet axis
2290 if(fDebug>2)Printf("%s:%d nK0s total: %d, in jet cone: %d,FFRadius %f ",(char*)__FILE__,__LINE__,nK0s,jetConeK0list->GetEntries(),GetFFRadius());
2293 for(Int_t it=0; it<jetConeK0list->GetSize(); ++it){ // loop for K0s in jet cone
2295 AliAODv0* v0 = dynamic_cast<AliAODv0*>(jetConeK0list->At(it));
2298 Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
2299 Double_t invMK0s =0;
2302 CalculateInvMass(v0, kK0, invMK0s, trackPt); //function to calculate invMass with TLorentzVector class
2305 Double_t jetPtSmear = -1;
2306 SmearJetPt(jetPt,cl,GetFFRadius(),GetFFMinLTrackPt(),jetPtSmear);
2307 if(incrementJetPt == kTRUE){fh1FFIMK0ConeSmear->Fill(jetPtSmear);} //fill TH1F for normalization purposes
2310 fFFHistosIMK0Cone->FillFF(trackPt, invMK0s, jetPt, incrementJetPt);
2314 if(jetConeK0list->GetSize() == 0){ // no K0: increment jet pt spectrum
2316 Bool_t incrementJetPt = kTRUE;
2317 fFFHistosIMK0Cone->FillFF(-1, -1, jetPt, incrementJetPt);
2319 Double_t jetPtSmear = -1;
2320 SmearJetPt(jetPt,cl,GetFFRadius(),GetFFMinLTrackPt(),jetPtSmear);
2321 if(incrementJetPt == kTRUE){fh1FFIMK0ConeSmear->Fill(jetPtSmear);} //fill TH1F for normalization purposes
2325 //fetch particles in perpendicular cone to estimate UE event contribution to particle spectrum
2326 //these perpendicular cone particle spectra serve to subtract the particles in jet cones, that are stemming from the Underlying event, on a statistical basis
2327 //for normalization the common jet pT spectrum is used: fh1FFIMK0Cone, fh1FFIMLaCone and fh1FFIMALaCone
2329 //____fetch reconstructed K0s in cone perpendicular to jet axis:_______________________________________________________________________________
2331 TList* jetPerpConeK0list = new TList();
2333 Double_t sumPerpPtK0 = 0.;
2335 GetTracksInPerpCone(fListK0s, jetPerpConeK0list, jet, GetFFRadius(), sumPerpPtK0); //reconstructed K0s in cone around jet axis
2337 if(fDebug>2)Printf("%s:%d nK0s total: %d, in perp jet cone: %d,FFRadius %f ",(char*)__FILE__,__LINE__,nK0s,jetPerpConeK0list->GetEntries(),GetFFRadius());
2339 for(Int_t it=0; it<jetPerpConeK0list->GetSize(); ++it){ // loop for K0s in perpendicular cone
2341 AliAODv0* v0 = dynamic_cast<AliAODv0*>(jetPerpConeK0list->At(it));
2344 Double_t invMPerpK0s =0;
2347 CalculateInvMass(v0, kK0, invMPerpK0s, trackPt); //function to calculate invMass with TLorentzVector class
2349 fh3IMK0PerpCone->Fill(jetPt, invMPerpK0s, trackPt); //(x,y,z) //pay attention, this histogram contains the V0 content of both (+/- 90 degrees) perp. cones!!
2353 if(jetPerpConeK0list->GetSize() == 0){ // no K0s in jet cone
2355 fh3IMK0PerpCone->Fill(jetPt, -1, -1);
2358 if(ij==0){//median cluster only once for event
2360 AliAODJet* medianCluster = GetMedianCluster();
2363 // ____ rec K0s in median cluster___________________________________________________________________________________________________________
2365 TList* jetMedianConeK0list = new TList();
2366 TList* jetMedianConeLalist = new TList();
2367 TList* jetMedianConeALalist = new TList();
2370 Double_t medianEta = medianCluster->Eta();
2372 if(TMath::Abs(medianEta)<=fCutjetEta){
2374 fh1MedianEta->Fill(medianEta);
2375 fh1JetPtMedian->Fill(jetPt); //for normalisation by total number of median cluster jets
2377 Double_t sumMedianPtK0 = 0.;
2379 Bool_t isBadJetK0Median = kFALSE; // dummy, do not use
2381 GetTracksInCone(fListK0s, jetMedianConeK0list, medianCluster, GetFFRadius(), sumMedianPtK0, 0., 0., isBadJetK0Median); //reconstructed K0s in median cone around jet axis
2382 //GetTracksInCone(fListK0s, jetConeK0list, jet, GetFFRadius(), sumPtK0, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJetK0); //original use of function
2384 //cut parameters from Fragmentation Function task:
2385 //Float_t fFFMinLTrackPt; // reject jets with leading track with pt smaller than this value, use GetFFMinLTrackPt()
2386 //Float_t fFFMaxTrackPt; // reject jetscontaining any track with pt larger than this value, use GetFFMaxTrackPt()
2388 for(Int_t it=0; it<jetMedianConeK0list->GetSize(); ++it){ // loop for K0s in median cone
2390 AliAODv0* v0 = dynamic_cast<AliAODv0*>(jetMedianConeK0list->At(it));
2393 Double_t invMMedianK0s =0;
2396 CalculateInvMass(v0, kK0, invMMedianK0s, trackPt); //function to calculate invMass with TLorentzVector class
2398 fh3IMK0MedianCone->Fill(jetPt, invMMedianK0s, trackPt); //(x,y,z)
2402 if(jetMedianConeK0list->GetSize() == 0){ // no K0s in median cluster cone
2404 fh3IMK0MedianCone->Fill(jetPt, -1, -1);
2407 //__________________________________________________________________________________________________________________________________________
2408 // ____ rec Lambdas in median cluster___________________________________________________________________________________________________________
2410 Double_t sumMedianPtLa = 0.;
2411 Bool_t isBadJetLaMedian = kFALSE; // dummy, do not use
2413 GetTracksInCone(fListLa, jetMedianConeLalist, medianCluster, GetFFRadius(), sumMedianPtLa, 0, 0, isBadJetLaMedian); //reconstructed Lambdas in median cone around jet axis
2415 //cut parameters from Fragmentation Function task:
2416 //Float_t fFFMinLTrackPt; // reject jets with leading track with pt smaller than this value, use GetFFMinLTrackPt()
2417 //Float_t fFFMaxTrackPt; // reject jets containing any track with pt larger than this value, use GetFFMaxTrackPt()
2419 for(Int_t it=0; it<jetMedianConeLalist->GetSize(); ++it){ // loop for Lambdas in perpendicular cone
2421 AliAODv0* v0 = dynamic_cast<AliAODv0*>(jetMedianConeLalist->At(it));
2424 Double_t invMMedianLa =0;
2427 CalculateInvMass(v0, kLambda, invMMedianLa, trackPt); //function to calculate invMass with TLorentzVector class
2429 fh3IMLaMedianCone->Fill(jetPt, invMMedianLa, trackPt); //(x,y,z)
2432 if(jetMedianConeLalist->GetSize() == 0){ // no Lambdas in median cluster cone
2434 fh3IMLaMedianCone->Fill(jetPt, -1, -1);
2438 // ____ rec Antilambdas in median cluster___________________________________________________________________________________________________________
2441 Double_t sumMedianPtALa = 0.;
2443 Bool_t isBadJetALaMedian = kFALSE; // dummy, do not use
2445 GetTracksInCone(fListALa, jetMedianConeALalist, medianCluster, GetFFRadius(), sumMedianPtALa, 0, 0, isBadJetALaMedian); //reconstructed Antilambdas in median cone around jet axis
2448 //cut parameters from Fragmentation Function task:
2449 //Float_t fFFMinLTrackPt; // reject jets with leading track with pt smaller than this value, use GetFFMinLTrackPt()
2450 //Float_t fFFMaxTrackPt; // reject jets containing any track with pt larger than this value, use GetFFMaxTrackPt()
2452 for(Int_t it=0; it<jetMedianConeALalist->GetSize(); ++it){ // loop for Antilambdas in median cluster cone
2454 AliAODv0* v0 = dynamic_cast<AliAODv0*>(jetMedianConeALalist->At(it));
2457 Double_t invMMedianALa =0;
2460 CalculateInvMass(v0, kAntiLambda, invMMedianALa, trackPt); //function to calculate invMass with TLorentzVector class
2462 fh3IMALaMedianCone->Fill(jetPt, invMMedianALa, trackPt); //(x,y,z)
2465 if(jetMedianConeALalist->GetSize() == 0){ // no Antilambdas in median cluster cone
2467 fh3IMALaMedianCone->Fill(jetPt, -1, -1);
2469 }//median cluster eta cut
2471 delete jetMedianConeK0list;
2472 delete jetMedianConeLalist;
2473 delete jetMedianConeALalist;
2475 }//if mediancluster is existing
2477 //_________________________________________________________________________________________________________________________________________
2479 //____fetch reconstructed Lambdas in cone perpendicular to jet axis:__________________________________________________________________________
2481 TList* jetPerpConeLalist = new TList();
2483 Double_t sumPerpPtLa = 0.;
2485 GetTracksInPerpCone(fListLa, jetPerpConeLalist, jet, GetFFRadius(), sumPerpPtLa); //reconstructed Lambdas in cone around jet axis //pay attention, this histogram contains the V0 content of both (+/- 90 degrees) perp. cones!!
2487 if(fDebug>2)Printf("%s:%d nLa total: %d, in perp jet cone: %d,FFRadius %f ",(char*)__FILE__,__LINE__,nLa,jetPerpConeLalist->GetEntries(),GetFFRadius());
2489 for(Int_t it=0; it<jetPerpConeLalist->GetSize(); ++it){ // loop for Lambdas in perpendicular cone
2491 AliAODv0* v0 = dynamic_cast<AliAODv0*>(jetPerpConeLalist->At(it));
2494 Double_t invMPerpLa =0;
2497 CalculateInvMass(v0, kLambda, invMPerpLa, trackPt); //function to calculate invMass with TLorentzVector class
2499 fh3IMLaPerpCone->Fill(jetPt, invMPerpLa, trackPt);
2503 if(jetPerpConeLalist->GetSize() == 0){ // no Lambdas in jet
2505 fh3IMLaPerpCone->Fill(jetPt, -1, -1);
2510 //____fetch reconstructed Antilambdas in cone perpendicular to jet axis:___________________________________________________________________
2512 TList* jetPerpConeALalist = new TList();
2514 Double_t sumPerpPtALa = 0.;
2516 GetTracksInPerpCone(fListALa, jetPerpConeALalist, jet, GetFFRadius(), sumPerpPtALa); //reconstructed Antilambdas in cone around jet axis //pay attention, this histogram contains the V0 content of both (+/- 90 degrees) perp. cones!!
2518 if(fDebug>2)Printf("%s:%d nALa total: %d, in perp jet cone: %d,FFRadius %f ",(char*)__FILE__,__LINE__,nALa,jetPerpConeALalist->GetEntries(),GetFFRadius());
2520 for(Int_t it=0; it<jetPerpConeALalist->GetSize(); ++it){ // loop for ALa in perpendicular cone
2522 AliAODv0* v0 = dynamic_cast<AliAODv0*>(jetPerpConeALalist->At(it));
2525 Double_t invMPerpALa =0;
2528 CalculateInvMass(v0, kAntiLambda, invMPerpALa, trackPt); //function to calculate invMass with TLorentzVector class
2530 fh3IMALaPerpCone->Fill(jetPt, invMPerpALa, trackPt);
2535 if(jetPerpConeALalist->GetSize() == 0){ // no Antilambda
2537 fh3IMALaPerpCone->Fill(jetPt, -1, -1);
2542 //__________________________________________________________________________________________________________________________________________
2546 //fill feeddown candidates from TList
2547 //std::cout<<"fListFeeddownLaCand entries: "<<fListFeeddownLaCand->GetSize()<<std::endl;
2549 Double_t sumPtFDLa = 0.;
2550 Bool_t isBadJetFDLa = kFALSE; // dummy, do not use
2552 GetTracksInCone(fListFeeddownLaCand, jetConeFDLalist, jet, GetFFRadius(), sumPtFDLa, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJetFDLa);
2554 Double_t sumPtFDALa = 0.;
2555 Bool_t isBadJetFDALa = kFALSE; // dummy, do not use
2557 GetTracksInCone(fListFeeddownALaCand, jetConeFDALalist, jet, GetFFRadius(), sumPtFDALa, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJetFDALa);
2559 //_________________________________________________________________
2560 for(Int_t it=0; it<fListFeeddownLaCand->GetSize(); ++it){
2562 AliAODv0* mcfd = dynamic_cast<AliAODv0*>(fListFeeddownLaCand->At(it));
2565 Double_t invMLaFDcand = 0;
2566 Double_t trackPt = 0;//pt of ass. particle, not used for the histos
2568 CalculateInvMass(mcfd, kLambda, invMLaFDcand, trackPt);
2570 //Get MC gen. Lambda transverse momentum
2571 TClonesArray *st = 0x0;
2574 TList *lt = fAOD->GetList();
2577 st = (TClonesArray*)lt->FindObject(AliAODMCParticle::StdBranchName()); //get MCAOD branch in data
2580 AliAODTrack *daughtertrack = (AliAODTrack *) (mcfd->GetSecondaryVtx()->GetDaughter(0));//fetch the first of the two daughter tracks
2581 Int_t AssLabel = TMath::Abs(daughtertrack->GetLabel());
2583 AliAODMCParticle *mcDaughterPart =(AliAODMCParticle*)st->UncheckedAt(AssLabel);
2585 Int_t v0lab = mcDaughterPart->GetMother();
2587 // Int_t v0lab= TMath::Abs(mcfd->GetLabel());//GetLabel doesn't work for AliAODv0 class!!! Only for AliAODtrack
2589 if((!v0lab) || (v0lab<0) || (v0lab > st->GetEntriesFast()))continue;//validity checks
2591 AliAODMCParticle *mcp=(AliAODMCParticle*)st->UncheckedAt(v0lab);
2593 Double_t genLaPt = mcp->Pt();
2595 //std::cout<<"Incl FD, genLaPt:"<<genLaPt<<std::endl;
2597 fh3FeedDownLa->Fill(5., invMLaFDcand, genLaPt);
2599 }//end loop over feeddown candidates for Lambda particles in jet cone
2600 //fetch MC truth in jet cones, denominator of rec. efficiency in jet cones
2601 //_________________________________________________________________
2602 for(Int_t it=0; it<jetConeFDLalist->GetSize(); ++it){
2604 AliAODv0* mcfd = dynamic_cast<AliAODv0*>(jetConeFDLalist->At(it));
2607 //std::cout<<"Cone, recLaPt:"<<mcfd->Pt()<<std::endl;
2609 Double_t invMLaFDcand = 0;
2610 Double_t trackPt = mcfd->Pt();//pt of ass. particle, not used for the histos
2612 CalculateInvMass(mcfd, kLambda, invMLaFDcand, trackPt);
2614 //Get MC gen. Lambda transverse momentum
2615 TClonesArray *st = 0x0;
2617 TList *lt = fAOD->GetList();
2620 st = (TClonesArray*)lt->FindObject(AliAODMCParticle::StdBranchName());
2622 AliAODTrack *daughtertrack = (AliAODTrack *) (mcfd->GetSecondaryVtx()->GetDaughter(0));//fetch the first of the two daughter tracks
2623 Int_t AssLabel = TMath::Abs(daughtertrack->GetLabel());
2625 AliAODMCParticle *mcDaughterPart =(AliAODMCParticle*)st->UncheckedAt(AssLabel);
2627 Int_t v0lab = mcDaughterPart->GetMother();
2629 //std::cout<<"v0lab: "<<v0lab<<std::endl;
2631 if((!v0lab) || (v0lab<0) || (v0lab > st->GetEntriesFast()))continue;//validity checks
2633 AliAODMCParticle *mcp=(AliAODMCParticle*)st->UncheckedAt(v0lab);
2635 Double_t genLaPt = mcp->Pt();
2638 //std::cout<<"Cone FD, genLaPt:"<<genLaPt<<std::endl;
2640 fh3FeedDownLaCone->Fill(jetPt, invMLaFDcand, genLaPt);
2642 }//end loop over feeddown candidates for Lambda particles in jet cone
2644 //_________________________________________________________________
2645 for(Int_t it=0; it<fListFeeddownALaCand->GetSize(); ++it){
2647 AliAODv0* mcfd = dynamic_cast<AliAODv0*>(fListFeeddownALaCand->At(it));
2650 Double_t invMALaFDcand = 0;
2651 Double_t trackPt = 0;//pt of ass. particle, not used for the histos
2653 CalculateInvMass(mcfd, kAntiLambda, invMALaFDcand, trackPt);
2655 //Get MC gen. Antilambda transverse momentum
2656 TClonesArray *st = 0x0;
2658 TList *lt = fAOD->GetList();
2661 st = (TClonesArray*)lt->FindObject(AliAODMCParticle::StdBranchName());
2663 AliAODTrack *daughtertrack = (AliAODTrack *) (mcfd->GetSecondaryVtx()->GetDaughter(0));//fetch the first of the two daughter tracks
2664 Int_t AssLabel = TMath::Abs(daughtertrack->GetLabel());
2666 AliAODMCParticle *mcDaughterPart =(AliAODMCParticle*)st->UncheckedAt(AssLabel);
2668 Int_t v0lab = mcDaughterPart->GetMother();
2671 if((!v0lab) || (v0lab<0) || (v0lab > st->GetEntriesFast()))continue;//validity checks
2673 AliAODMCParticle *mcp=(AliAODMCParticle*)st->UncheckedAt(v0lab);
2675 Double_t genALaPt = mcp->Pt();
2677 fh3FeedDownALa->Fill(5., invMALaFDcand, genALaPt);
2679 }//end loop over feeddown candidates for Antilambda particles
2681 //_________________________________________________________________
2682 //feeddown for Antilambdas from Xi(bar)+ and Xi(bar)0 in jet cone:
2684 for(Int_t it=0; it<jetConeFDALalist->GetSize(); ++it){
2686 AliAODv0* mcfd = dynamic_cast<AliAODv0*>(jetConeFDALalist->At(it));
2689 Double_t invMALaFDcand = 0;
2690 Double_t trackPt = 0;//pt of ass. particle, not used for the histos
2692 CalculateInvMass(mcfd, kAntiLambda, invMALaFDcand, trackPt);
2694 //Get MC gen. Antilambda transverse momentum
2695 TClonesArray *st = 0x0;
2697 TList *lt = fAOD->GetList();
2700 st = (TClonesArray*)lt->FindObject(AliAODMCParticle::StdBranchName());
2702 AliAODTrack *daughtertrack = (AliAODTrack *) (mcfd->GetSecondaryVtx()->GetDaughter(0));//fetch the first of the two daughter tracks
2703 Int_t AssLabel = TMath::Abs(daughtertrack->GetLabel());
2705 AliAODMCParticle *mcDaughterPart =(AliAODMCParticle*)st->UncheckedAt(AssLabel);
2707 Int_t v0lab = mcDaughterPart->GetMother();
2709 if((!v0lab) || (v0lab<0) || (v0lab > st->GetEntriesFast()))continue;//validity checks
2711 AliAODMCParticle *mcp=(AliAODMCParticle*)st->UncheckedAt(v0lab);
2713 Double_t genALaPt = mcp->Pt();
2715 fh3FeedDownALaCone->Fill(jetPt, invMALaFDcand, genALaPt);
2717 }//end loop over feeddown candidates for Antilambda particles in jet cone
2721 //____fetch MC generated K0s in cone around jet axis__(note: particles can stem from fragmentation but also from underlying event)________
2723 Double_t sumPtMCgenK0s = 0.;
2724 Bool_t isBadJetMCgenK0s = kFALSE; // dummy, do not use
2727 fListMCgenK0sCone = new TList(); //MC generated K0s in (only geometrical) jet cone (these are MC gen K0s falling geometrically into jet cone (R = 0.4) around jet axis, that was found by anti-kt jet finder, particles can stem from fragmentation but also from underlying event!!)
2729 //first: sampling MC gen K0s
2731 GetTracksInCone(fListMCgenK0s, fListMCgenK0sCone, jet, GetFFRadius(), sumPtMCgenK0s, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJetMCgenK0s); //MC generated K0s in cone around jet axis
2733 if(fDebug>2)Printf("%s:%d nMCgenK0s in jet cone: %d,FFRadius %f ",(char*)__FILE__,__LINE__,fListMCgenK0sCone->GetEntries(),GetFFRadius());
2736 for(Int_t it=0; it<fListMCgenK0sCone->GetSize(); ++it){ // loop MC generated K0s in cone around jet axis
2738 AliAODMCParticle* mcp0 = dynamic_cast<AliAODMCParticle*>(fListMCgenK0sCone->At(it));
2741 //Double_t fRapMCgenK0s = MyRapidity(mcp0->E(),mcp0->Pz());//get rec. particle in cone information
2742 Double_t fEtaMCgenK0s = mcp0->Eta();
2743 Double_t fPtMCgenK0s = mcp0->Pt();
2745 fh2MCgenK0Cone->Fill(jetPt,fPtMCgenK0s);
2746 fh2MCEtagenK0Cone->Fill(jetPt,fEtaMCgenK0s);
2750 //check whether the reconstructed K0s in jet cone are stemming from MC gen K0s (on MCgenK0s list):__________________________________________________
2752 for(Int_t ic=0; ic<jetConeK0list->GetSize(); ++ic){ //loop over all reconstructed K0s in jet cone
2754 //for(Int_t ic=0; ic<fListK0s->GetSize(); ++ic){ //loop over all reconstructed K0s -> previous definition of reconstruction efficiency, not sure what is the better one to choose
2756 Int_t negDaughterpdg;
2757 Int_t posDaughterpdg;
2760 Double_t fPtMCrecK0Match;
2761 Double_t invMK0Match;
2765 Bool_t fPhysicalPrimary = -1;
2766 Int_t MCv0PDGCode =0;
2767 Double_t jetPtSmear = -1;
2769 AliAODv0* v0c = dynamic_cast<AliAODv0*>(jetConeK0list->At(ic));//pointer to reconstructed K0s inside jet cone (cone is placed around reconstructed jet axis)
2771 //AliAODv0* v0c = dynamic_cast<AliAODv0*>(fListK0s->At(ic));//pointer to reconstructed K0s
2774 Bool_t daughtercheck = DaughterTrackCheck(v0c, nnum, pnum);//check daughter tracks have proper sign
2775 if(daughtercheck == kFALSE)continue;
2777 const AliAODTrack *trackMCNeg=(AliAODTrack *)(v0c->GetDaughter(nnum));
2778 const AliAODTrack *trackMCPos=(AliAODTrack *)(v0c->GetDaughter(pnum));
2780 TList *listmc = fAOD->GetList();
2782 Bool_t mclabelcheck = MCLabelCheck(v0c, kK0, trackMCNeg, trackMCPos, listmc, negDaughterpdg, posDaughterpdg, motherType, v0Label, MCPt, fPhysicalPrimary, MCv0PDGCode);
2784 if(mclabelcheck == kFALSE)continue;
2785 if(fPhysicalPrimary == kFALSE)continue; //requirements for rec. V0 associated to MC true primary particle
2787 for(Int_t it=0; it<fListMCgenK0s->GetSize(); ++it){ // loop over MC generated K0s in event, check whether associated MC particle is part of it
2789 //for(Int_t it=0; it<fListMCgenK0sCone->GetSize(); ++it){//belongs to previous definition of rec. eff. of V0s within jet cone
2791 //Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
2792 //AliAODMCParticle* mcp0 = dynamic_cast<AliAODMCParticle*>(fListMCgenK0sCone->At(it));
2793 AliAODMCParticle* mcp0 = dynamic_cast<AliAODMCParticle*>(fListMCgenK0s->At(it));
2796 Bool_t particleMatching = IsParticleMatching(mcp0, v0Label);
2798 if(particleMatching == kFALSE)continue; //if reconstructed V0 particle doesn't match to the associated MC particle go to next stack entry
2799 CalculateInvMass(v0c, kK0, invMK0Match, fPtMCrecK0Match);
2801 Double_t fPtMCgenK0s = mcp0->Pt();
2803 fh3MCrecK0Cone->Fill(jetPt,invMK0Match,fPtMCgenK0s); //fill matching rec. K0s in 3D histogram
2805 SmearJetPt(jetPt,cl,GetFFRadius(),GetFFMinLTrackPt(),jetPtSmear); //jetPt, cent, jetRadius, ptmintrack, &jetPtSmear
2807 fh3MCrecK0ConeSmear->Fill(jetPtSmear,invMK0Match,fPtMCgenK0s); //fill matching rec. K0s in 3D histogram, jet pT smeared according to deltaptjet distribution width
2810 } // end MCgenK0s / MCgenK0sCone loop
2813 //check the K0s daughters contamination of the jet tracks:
2815 TClonesArray *stackMC = 0x0;
2817 for(Int_t it=0; it<jettracklist->GetSize(); ++it){//loop over all particles in the jet
2819 AliVParticle* trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));//all tracks in jet cone
2820 if(!trackVP)continue;
2821 AliAODTrack *tr = dynamic_cast<AliAODTrack*> (trackVP); //fetch one jet track from the TList
2824 //get MC label information
2825 TList *mclist = fAOD->GetList(); //fetch the MC stack
2826 if(!mclist)continue;
2828 stackMC = (TClonesArray*)mclist->FindObject(AliAODMCParticle::StdBranchName()); //get MCAOD branch in data
2829 if (!stackMC) {Printf("ERROR: stack not available");}
2832 Int_t particleLabel = TMath::Abs(tr->GetLabel()); //fetch jet track label in MC stack
2834 //v0c is pointer to K0s candidate, is fetched already above, here it is just checked again whether daughters are properly ordered by their charge
2836 Bool_t daughterchecks = DaughterTrackCheck(v0c, nnum, pnum);
2838 if(daughterchecks == kFALSE)continue; //make sure that daughters are properly ordered
2840 const AliAODTrack *trackNeg=(AliAODTrack *)(v0c->GetDaughter(nnum)); //fetch v0 daughters of reconstructed K0s
2841 const AliAODTrack *trackPos=(AliAODTrack *)(v0c->GetDaughter(pnum));
2843 if(!trackNeg)continue;
2844 if(!trackPos)continue;
2846 Int_t negAssLabel = TMath::Abs(trackNeg->GetLabel()); //negative (reconstructed) charged track label in MC stack
2847 Int_t posAssLabel = TMath::Abs(trackPos->GetLabel()); //positive (reconstructed) charged track label in MC stack
2850 if(particleLabel == posAssLabel){ //check whether jet track and each of the rec. K0s daughters have same MC stack label -> are identical
2851 AliAODMCParticle* mctrackPos = dynamic_cast<AliAODMCParticle*>(stackMC->At(posAssLabel));
2852 if(!mctrackPos) continue;
2853 Double_t trackPosPt = mctrackPos->Pt();
2854 Double_t trackPosEta = mctrackPos->Eta();
2855 fh3SecContinCone->Fill(jetPt, trackPosPt, trackPosEta);} //if it's the case, fill jet pt, daughter track pt and track eta in histo
2857 if(particleLabel == negAssLabel){
2858 AliAODMCParticle* mctrackNeg = dynamic_cast<AliAODMCParticle*>(stackMC->At(negAssLabel));
2859 if(!mctrackNeg) continue;
2860 Double_t trackNegPt = mctrackNeg->Pt();
2861 Double_t trackNegEta = mctrackNeg->Eta();
2862 fh3SecContinCone->Fill(jetPt, trackNegPt, trackNegEta);} //if it's the case, fill jet pt, daughter track pt and track eta in histo
2870 } //end rec-K0-in-cone loop
2872 //________________________________________________________________________________________________________________________________________________________
2874 delete fListMCgenK0sCone;
2879 delete jetConeK0list;
2880 delete jetPerpConeK0list;
2881 delete jetPerpConeLalist;
2882 delete jetPerpConeALalist;
2885 //---------------La--------------------------------------------------------------------------------------------------------------------------------------------
2887 // fQAJetHistosRecCutsLeading->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt() );
2889 for(Int_t it=0; it<fListLa->GetSize(); ++it){ // loop all La
2891 AliAODv0* v0 = dynamic_cast<AliAODv0*>(fListLa->At(it));
2896 TVector3 v0MomVect(v0Mom);
2898 Double_t dPhiJetLa = (jet->MomentumVector()->Vect()).DeltaPhi(v0MomVect);
2903 CalculateInvMass(v0, kLambda, invMLa, trackPt); //function to calculate invMass with TLorentzVector class
2904 Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
2906 //if(incrementJetPt){fh1V0JetPt->Fill(jetPt);}
2908 fFFHistosIMLaJet->FillFF(trackPt, invMLa, jetPt, incrementJetPt);
2910 if(dPhiJetLa<fh1dPhiJetLa->GetXaxis()->GetXmin()) dPhiJetLa += 2*TMath::Pi();
2911 fh1dPhiJetLa->Fill(dPhiJetLa);
2914 if(fListLa->GetSize() == 0){ // no La: increment jet pt spectrum
2916 Bool_t incrementJetPt = kTRUE;
2917 fFFHistosIMLaJet->FillFF(-1, -1, jetPt, incrementJetPt);
2921 // ____fetch rec. Lambdas in cone around jet axis_______________________________________________________________________________________
2923 TList* jetConeLalist = new TList();
2924 Double_t sumPtLa = 0.;
2925 Bool_t isBadJetLa = kFALSE; // dummy, do not use
2927 GetTracksInCone(fListLa, jetConeLalist, jet, GetFFRadius(), sumPtLa, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJetLa);//method inherited from FF
2929 if(fDebug>2)Printf("%s:%d nLa total: %d, in jet cone: %d,FFRadius %f ",(char*)__FILE__,__LINE__,nLa,jetConeLalist->GetEntries(),GetFFRadius());
2931 for(Int_t it=0; it<jetConeLalist->GetSize(); ++it){ // loop La in jet cone
2933 AliAODv0* v0 = dynamic_cast<AliAODv0*>(jetConeLalist->At(it));
2938 CalculateInvMass(v0, kLambda, invMLa, trackPt); //function to calculate invMass with TLorentzVector class
2940 Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
2943 Double_t jetPtSmear = -1;
2944 SmearJetPt(jetPt,cl,GetFFRadius(),GetFFMinLTrackPt(),jetPtSmear);
2945 if(incrementJetPt == kTRUE){fh1FFIMLaConeSmear->Fill(jetPtSmear);} //fill TH1F for normalization purposes
2948 fFFHistosIMLaCone->FillFF(trackPt, invMLa, jetPt, incrementJetPt);
2951 if(jetConeLalist->GetSize() == 0){ // no La: increment jet pt spectrum
2953 Bool_t incrementJetPt = kTRUE;
2954 fFFHistosIMLaCone->FillFF(-1, -1, jetPt, incrementJetPt);
2957 Double_t jetPtSmear;
2958 SmearJetPt(jetPt,cl,GetFFRadius(),GetFFMinLTrackPt(),jetPtSmear);
2959 if(incrementJetPt == kTRUE)fh1FFIMLaConeSmear->Fill(jetPtSmear);}
2965 //____fetch MC generated Lambdas in cone around jet axis__(particles can stem from fragmentation but also from underlying event)_____________
2967 Double_t sumPtMCgenLa = 0.;
2968 Bool_t isBadJetMCgenLa = kFALSE; // dummy, do not use
2970 //sampling MC gen. Lambdas in cone around reconstructed jet axis
2971 fListMCgenLaCone = new TList();
2973 GetTracksInCone(fListMCgenLa, fListMCgenLaCone, jet, GetFFRadius(), sumPtMCgenLa, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJetMCgenLa);//fetch MC generated Lambdas in cone of resolution parameter R around jet axis
2975 if(fDebug>2)Printf("%s:%d nMCgenLa in jet cone: %d,FFRadius %f ",(char*)__FILE__,__LINE__,fListMCgenLaCone->GetEntries(),GetFFRadius());
2977 for(Int_t it=0; it<fListMCgenLaCone->GetSize(); ++it){ // loop MC generated La in cone around jet axis
2979 AliAODMCParticle* mcp0 = dynamic_cast<AliAODMCParticle*>(fListMCgenLaCone->At(it));
2982 //Double_t fRapMCgenLa = MyRapidity(mcp0->E(),mcp0->Pz());
2983 Double_t fEtaMCgenLa = mcp0->Eta();
2984 Double_t fPtMCgenLa = mcp0->Pt();
2986 fh2MCgenLaCone->Fill(jetPt,fPtMCgenLa);
2987 fh2MCEtagenLaCone->Fill(jetPt,fEtaMCgenLa);
2991 //check whether the reconstructed La are stemming from MC gen La on fListMCgenLa List:__________________________________________________
2993 for(Int_t ic=0; ic<jetConeLalist->GetSize(); ++ic){//loop over all reconstructed La within jet cone, new definition
2995 //for(Int_t ic=0; ic<fListLa->GetSize(); ++ic){//old definition
2997 Int_t negDaughterpdg;
2998 Int_t posDaughterpdg;
3001 Double_t fPtMCrecLaMatch;
3002 Double_t invMLaMatch;
3006 Bool_t fPhysicalPrimary = -1;
3007 Int_t MCv0PDGCode =0;
3008 Double_t jetPtSmear = -1;
3010 AliAODv0* v0c = dynamic_cast<AliAODv0*>(jetConeLalist->At(ic));//new definition
3012 //AliAODv0* v0c = dynamic_cast<AliAODv0*>(fListLa->At(ic));//old definition
3015 Bool_t daughtercheck = DaughterTrackCheck(v0c, nnum, pnum);
3016 if(daughtercheck == kFALSE)continue;
3018 const AliAODTrack *trackMCNeg=(AliAODTrack *)(v0c->GetDaughter(nnum));
3019 const AliAODTrack *trackMCPos=(AliAODTrack *)(v0c->GetDaughter(pnum));
3021 TList *listmc = fAOD->GetList();
3023 Bool_t mclabelcheck = MCLabelCheck(v0c, kLambda, trackMCNeg, trackMCPos, listmc, negDaughterpdg, posDaughterpdg, motherType, v0Label, MCPt, fPhysicalPrimary, MCv0PDGCode);
3025 if(mclabelcheck == kFALSE)continue;
3026 if(fPhysicalPrimary == kFALSE)continue;
3028 for(Int_t it=0; it<fListMCgenLa->GetSize(); ++it){//new definition // loop over MC generated K0s in cone around jet axis
3030 // for(Int_t it=0; it<fListMCgenLaCone->GetSize(); ++it){//old definition // loop over MC generated La in cone around jet axis
3032 //Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
3034 AliAODMCParticle* mcp0 = dynamic_cast<AliAODMCParticle*>(fListMCgenLa->At(it));//new definition
3035 //AliAODMCParticle* mcp0 = dynamic_cast<AliAODMCParticle*>(fListMCgenLaCone->At(it));//old definition
3039 Bool_t particleMatching = IsParticleMatching(mcp0, v0Label);
3042 if(particleMatching == kFALSE)continue; //particle doesn't match on any associated MC gen particle in cone around rec jet axis
3044 CalculateInvMass(v0c, kLambda, invMLaMatch, fPtMCrecLaMatch);
3046 Double_t fPtMCgenLa = mcp0->Pt();
3048 fh3MCrecLaCone->Fill(jetPt,invMLaMatch,fPtMCgenLa); //fill matching rec. K0s 3D histogram
3050 SmearJetPt(jetPt,cl,GetFFRadius(),GetFFMinLTrackPt(),jetPtSmear);
3052 fh3MCrecLaConeSmear->Fill(jetPtSmear,invMLaMatch,fPtMCgenLa); //fill matching rec. Lambdas in 3D histogram, jet pT smeared according to deltaptjet distribution width
3055 } // end MCgenLa loop
3057 //check the Lambda daughters contamination of the jet tracks://///////////////////////////////////////////////////////////////////////////////////////////
3059 TClonesArray *stackMC = 0x0;
3061 for(Int_t it=0; it<jettracklist->GetSize(); ++it){//loop over all particles in the jet
3063 AliVParticle* trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));//all tracks in jet cone
3064 if(!trackVP)continue;
3065 AliAODTrack *tr = dynamic_cast<AliAODTrack*> (trackVP); //fetch one jet track from the TList
3068 //get MC label information
3069 TList *mclist = fAOD->GetList(); //fetch the MC stack
3071 stackMC = (TClonesArray*)mclist->FindObject(AliAODMCParticle::StdBranchName()); //get MCAOD branch in data
3072 if (!stackMC) {Printf("ERROR: stack not available");}
3075 Int_t particleLabel = TMath::Abs(tr->GetLabel()); //fetch jet track label in MC stack
3077 Bool_t daughterchecks = DaughterTrackCheck(v0c, nnum, pnum);
3079 if(daughterchecks == kFALSE)continue; //make sure that daughters are properly ordered
3081 const AliAODTrack *trackNeg=(AliAODTrack *)(v0c->GetDaughter(nnum)); //fetch v0 daughters of reconstructed K0s
3082 const AliAODTrack *trackPos=(AliAODTrack *)(v0c->GetDaughter(pnum));
3084 Int_t negAssLabel = TMath::Abs(trackNeg->GetLabel()); //negative (reconstructed) charged track label in MC stack
3085 Int_t posAssLabel = TMath::Abs(trackPos->GetLabel()); //positive (reconstructed) charged track label in MC stack
3088 if(particleLabel == posAssLabel){ //check whether jet track and each of the rec. K0s daughters have same MC stack label -> are identical
3090 AliAODMCParticle* mctrackPos = dynamic_cast<AliAODMCParticle*>(stackMC->At(posAssLabel));
3091 if(!mctrackPos) continue;
3093 Double_t trackPosPt = trackPos->Pt();
3094 Double_t trackPosEta = trackPos->Eta();
3095 fh3SecContinCone->Fill(jetPt, trackPosPt, trackPosEta);} //if it's the case, fill jet pt, daughter track pt and track eta in histo
3097 if(particleLabel == negAssLabel){
3099 AliAODMCParticle* mctrackNeg = dynamic_cast<AliAODMCParticle*>(stackMC->At(negAssLabel));
3100 if(!mctrackNeg) continue;
3102 Double_t trackNegPt = trackNeg->Pt();
3103 Double_t trackNegEta = trackNeg->Eta();
3104 fh3SecContinCone->Fill(jetPt, trackNegPt, trackNegEta);} //if it's the case, fill jet pt, daughter track pt and track eta in histo
3110 } //end rec-La-in-cone loop
3111 //________________________________________________________________________________________________________________________________________________________
3113 delete fListMCgenLaCone;
3117 delete jetConeLalist;
3121 //---------------ALa-----------
3124 // fQAJetHistosRecCutsLeading->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt() );
3126 for(Int_t it=0; it<fListALa->GetSize(); ++it){ // loop all ALa
3128 AliAODv0* v0 = dynamic_cast<AliAODv0*>(fListALa->At(it));
3133 TVector3 v0MomVect(v0Mom);
3135 Double_t dPhiJetALa = (jet->MomentumVector()->Vect()).DeltaPhi(v0MomVect);
3137 Double_t invMALa =0;
3140 CalculateInvMass(v0, kAntiLambda, invMALa, trackPt); //function to calculate invMass with TLorentzVector class
3141 Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
3143 //if(incrementJetPt){fh1V0JetPt->Fill(jetPt);}
3145 fFFHistosIMALaJet->FillFF(trackPt, invMALa, jetPt, incrementJetPt);
3147 if(dPhiJetALa<fh1dPhiJetALa->GetXaxis()->GetXmin()) dPhiJetALa += 2*TMath::Pi();
3148 fh1dPhiJetALa->Fill(dPhiJetALa);
3151 if(fListALa->GetSize() == 0){ // no ALa: increment jet pt spectrum
3153 Bool_t incrementJetPt = kTRUE;
3154 fFFHistosIMALaJet->FillFF(-1, -1, jetPt, incrementJetPt);
3158 // ____fetch rec. Antilambdas in cone around jet axis_______________________________________________________________________________________
3160 TList* jetConeALalist = new TList();
3161 Double_t sumPtALa = 0.;
3162 Bool_t isBadJetALa = kFALSE; // dummy, do not use
3164 GetTracksInCone(fListALa, jetConeALalist, jet, GetFFRadius(), sumPtALa, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJetALa);//method inherited from FF
3166 if(fDebug>2)Printf("%s:%d nALa total: %d, in jet cone: %d,FFRadius %f ",(char*)__FILE__,__LINE__,nALa,jetConeALalist->GetEntries(),GetFFRadius());
3168 for(Int_t it=0; it<jetConeALalist->GetSize(); ++it){ // loop ALa in jet cone
3170 AliAODv0* v0 = dynamic_cast<AliAODv0*>(jetConeALalist->At(it));
3172 Double_t invMALa =0;
3175 CalculateInvMass(v0, kAntiLambda, invMALa, trackPt); //function to calculate invMass with TLorentzVector class
3177 Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
3179 if(fAnalysisMC){ //jet pt smearing study for Antilambdas
3180 Double_t jetPtSmear = -1;
3181 SmearJetPt(jetPt,cl,GetFFRadius(),GetFFMinLTrackPt(),jetPtSmear);
3182 if(incrementJetPt == kTRUE){fh1FFIMALaConeSmear->Fill(jetPtSmear);} //fill TH1F for normalization purposes
3185 fFFHistosIMALaCone->FillFF(trackPt, invMALa, jetPt, incrementJetPt);
3188 if(jetConeALalist->GetSize() == 0){ // no ALa: increment jet pt spectrum
3190 Bool_t incrementJetPt = kTRUE;
3191 fFFHistosIMALaCone->FillFF(-1, -1, jetPt, incrementJetPt);
3194 Double_t jetPtSmear;
3195 SmearJetPt(jetPt,cl,GetFFRadius(),GetFFMinLTrackPt(),jetPtSmear);
3196 if(incrementJetPt == kTRUE)fh1FFIMALaConeSmear->Fill(jetPtSmear);}
3202 //____fetch MC generated Antilambdas in cone around jet axis__(particles can stem from fragmentation but also from underlying event)_____________
3204 Double_t sumPtMCgenALa = 0.;
3205 Bool_t isBadJetMCgenALa = kFALSE; // dummy, do not use
3207 //sampling MC gen Antilambdas in cone around reconstructed jet axis
3208 fListMCgenALaCone = new TList();
3210 GetTracksInCone(fListMCgenALa, fListMCgenALaCone, jet, GetFFRadius(), sumPtMCgenALa, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJetMCgenALa);//MC generated K0s in cone around jet axis
3212 if(fDebug>2)Printf("%s:%d nMCgenALa in jet cone: %d,FFRadius %f ",(char*)__FILE__,__LINE__,fListMCgenALaCone->GetEntries(),GetFFRadius());
3214 for(Int_t it=0; it<fListMCgenALaCone->GetSize(); ++it){ // loop MC generated La in cone around jet axis
3216 AliAODMCParticle* mcp0 = dynamic_cast<AliAODMCParticle*>(fListMCgenALaCone->At(it));
3219 //Double_t fRapMCgenALa = MyRapidity(mcp0->E(),mcp0->Pz());
3220 Double_t fEtaMCgenALa = mcp0->Eta();
3221 Double_t fPtMCgenALa = mcp0->Pt();
3223 fh2MCgenALaCone->Fill(jetPt,fPtMCgenALa);
3224 fh2MCEtagenALaCone->Fill(jetPt,fEtaMCgenALa);
3228 //check whether the reconstructed ALa are stemming from MC gen ALa on MCgenALa List:__________________________________________________
3230 for(Int_t ic=0; ic<jetConeALalist->GetSize(); ++ic){//loop over all reconstructed ALa
3232 Int_t negDaughterpdg;
3233 Int_t posDaughterpdg;
3236 Double_t fPtMCrecALaMatch;
3237 Double_t invMALaMatch;
3241 Bool_t fPhysicalPrimary = -1;
3242 Int_t MCv0PDGCode =0;
3243 Double_t jetPtSmear = -1;
3245 AliAODv0* v0c = dynamic_cast<AliAODv0*>(jetConeALalist->At(ic));
3248 Bool_t daughtercheck = DaughterTrackCheck(v0c, nnum, pnum);
3249 if(daughtercheck == kFALSE)continue;
3251 const AliAODTrack *trackMCNeg=(AliAODTrack *)(v0c->GetDaughter(nnum));
3252 const AliAODTrack *trackMCPos=(AliAODTrack *)(v0c->GetDaughter(pnum));
3254 TList *listmc = fAOD->GetList();
3255 if(!listmc)continue;
3257 Bool_t mclabelcheck = MCLabelCheck(v0c, kAntiLambda, trackMCNeg, trackMCPos, listmc, negDaughterpdg, posDaughterpdg, motherType, v0Label, MCPt, fPhysicalPrimary, MCv0PDGCode);
3259 if(mclabelcheck == kFALSE)continue;
3260 if(fPhysicalPrimary == kFALSE)continue;
3262 for(Int_t it=0; it<fListMCgenALa->GetSize(); ++it){ // loop over MC generated Antilambdas in cone around jet axis
3264 //Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
3266 AliAODMCParticle* mcp0 = dynamic_cast<AliAODMCParticle*>(fListMCgenALa->At(it));
3269 Bool_t particleMatching = IsParticleMatching(mcp0, v0Label);
3271 if(particleMatching == kFALSE)continue; //particle doesn't match on any associated MC gen particle in cone around rec jet axis
3273 CalculateInvMass(v0c, kAntiLambda, invMALaMatch, fPtMCrecALaMatch);
3275 Double_t fPtMCgenALa = mcp0->Pt();
3277 fh3MCrecALaCone->Fill(jetPt,invMALaMatch,fPtMCgenALa); //fill matching rec. K0s 3D histogram
3279 SmearJetPt(jetPt,cl,GetFFRadius(),GetFFMinLTrackPt(),jetPtSmear);
3281 fh3MCrecALaConeSmear->Fill(jetPtSmear,invMALaMatch,fPtMCgenALa);
3284 } // end MCgenALa loop
3288 //check the Antilambda daughters contamination of the jet tracks:
3290 TClonesArray *stackMC = 0x0;
3292 for(Int_t it=0; it<jettracklist->GetSize(); ++it){//loop over all particles in the jet
3294 AliVParticle* trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));//all tracks in jet cone
3295 if(!trackVP)continue;
3296 AliAODTrack *tr = dynamic_cast<AliAODTrack*> (trackVP); //fetch one jet track from the TList
3299 //get MC label information
3300 TList *mclist = fAOD->GetList(); //fetch the MC stack
3301 if(!mclist)continue;
3303 stackMC = (TClonesArray*)mclist->FindObject(AliAODMCParticle::StdBranchName()); //get MCAOD branch in data
3304 if (!stackMC) {Printf("ERROR: stack not available");}
3307 Int_t particleLabel = TMath::Abs(tr->GetLabel()); //fetch jet track label in MC stack
3309 Bool_t daughterchecks = DaughterTrackCheck(v0c, nnum, pnum);
3311 if(daughterchecks == kFALSE)continue; //make sure that daughters are properly ordered
3313 const AliAODTrack *trackNeg=(AliAODTrack *)(v0c->GetDaughter(nnum)); //fetch v0 daughters of reconstructed K0s
3314 const AliAODTrack *trackPos=(AliAODTrack *)(v0c->GetDaughter(pnum));
3315 if(!trackPos)continue;
3316 if(!trackNeg)continue;
3318 Int_t negAssLabel = TMath::Abs(trackNeg->GetLabel()); //negative (reconstructed) charged track label in MC stack
3319 Int_t posAssLabel = TMath::Abs(trackPos->GetLabel()); //positive (reconstructed) charged track label in MC stack
3321 if(!negAssLabel)continue;
3322 if(!posAssLabel)continue;
3324 if(particleLabel == posAssLabel){ //check whether jet track and each of the rec. K0s daughters have same MC stack label -> are identical
3325 AliAODMCParticle* mctrackPos = dynamic_cast<AliAODMCParticle*>(stackMC->At(posAssLabel));
3326 if(!mctrackPos) continue;
3328 Double_t trackPosPt = trackPos->Pt();
3329 Double_t trackPosEta = trackPos->Eta();
3330 if(!trackPosPt)continue;
3331 if(!trackPosEta)continue;
3333 fh3SecContinCone->Fill(jetPt, trackPosPt, trackPosEta);} //if it's the case, fill jet pt, daughter track pt and track eta in histo
3335 if(particleLabel == negAssLabel){
3337 AliAODMCParticle* mctrackNeg = dynamic_cast<AliAODMCParticle*>(stackMC->At(negAssLabel));
3338 if(!mctrackNeg) continue;
3340 Double_t trackNegPt = trackNeg->Pt();
3341 Double_t trackNegEta = trackNeg->Eta();
3343 if(!trackNegPt)continue;
3344 if(!trackNegEta)continue;
3346 fh3SecContinCone->Fill(jetPt, trackNegPt, trackNegEta);} //if it's the case, fill jet pt, daughter track pt and track eta in histo
3350 } //end rec-ALa-in-cone loop
3351 //________________________________________________________________________________________________________________________________________________________
3353 delete fListMCgenALaCone;
3357 delete jetConeALalist;
3358 delete jettracklist; //had been initialised at jet loop beginning
3360 }//end of if 'leading' or 'all jet' requirement
3366 fTracksRecCuts->Clear();
3367 fJetsRecCuts->Clear();
3368 fBckgJetsRec->Clear();
3372 fListFeeddownLaCand->Clear();
3373 fListFeeddownALaCand->Clear();
3374 jetConeFDLalist->Clear();
3375 jetConeFDALalist->Clear();
3376 fListMCgenK0s->Clear();
3377 fListMCgenLa->Clear();
3378 fListMCgenALa->Clear();
3381 PostData(1, fCommonHistList);
3384 // ____________________________________________________________________________________________
3385 void AliAnalysisTaskJetChem::SetProperties(TH3F* h,const char* x, const char* y, const char* z)
3387 //Set properties of histos (x,y and z title)
3392 h->GetXaxis()->SetTitleColor(1);
3393 h->GetYaxis()->SetTitleColor(1);
3394 h->GetZaxis()->SetTitleColor(1);
3398 //________________________________________________________________________________________________________________________________________
3399 Bool_t AliAnalysisTaskJetChem::AcceptBetheBloch(AliAODv0 *v0, AliPIDResponse *PIDResponse, const Int_t particletype) //dont use for MC Analysis
3405 const AliAODTrack *ntracktest=(AliAODTrack *)v0->GetDaughter(nnum);
3406 if(ntracktest->Charge() > 0){nnum = 0; pnum = 1;}
3408 const AliAODTrack *trackNeg=(AliAODTrack *)(v0->GetDaughter(nnum));
3409 const AliAODTrack *trackPos=(AliAODTrack *)(v0->GetDaughter(pnum));
3411 //Check if both tracks are available
3412 if (!trackPos || !trackNeg) {
3413 Printf("strange analysis::UserExec:: Error:Could not retrieve one of the daughter tracks\n");
3417 //remove like sign V0s
3418 if ( trackPos->Charge() == trackNeg->Charge() ){
3419 //if(fDebug>1) Printf("%s:%d found like-sign V0", (char*)__FILE__,__LINE__);
3424 Double_t nsig_p = 0; //number of sigmas that positive daughter track has got in TPC pid information
3425 Double_t nsig_n = 0;
3427 const AliAODPid *pid_p=trackPos->GetDetPid(); // returns fDetPID, more detailed or detector specific pid information
3428 const AliAODPid *pid_n=trackNeg->GetDetPid();
3430 if(!pid_p)return kFALSE;
3431 if(!pid_n)return kFALSE;
3435 if(particletype == 1) //PID cut on positive charged Lambda daughters (only those with pt < 1 GeV/c)
3438 nsig_p=PIDResponse->NumberOfSigmasTPC(trackPos,AliPID::kProton);
3439 Double_t protonPt = trackPos->Pt();
3440 if ((TMath::Abs(nsig_p) >= fCutBetheBloch) && (fCutBetheBloch >0) && (protonPt < 1)) return kFALSE;
3449 if(particletype == 2)
3451 nsig_n=PIDResponse->NumberOfSigmasTPC(trackNeg,AliPID::kProton);
3452 Double_t antiprotonPt = trackNeg->Pt();
3453 if ((TMath::Abs(nsig_n) >= fCutBetheBloch) && (fCutBetheBloch >0) && (antiprotonPt < 1)) return kFALSE;
3461 //___________________________________________________________________
3462 Bool_t AliAnalysisTaskJetChem::IsK0InvMass(const Double_t mass) const
3464 // K0 mass ? Use FF histo limits
3466 if(fFFIMInvMMin <= mass && mass < fFFIMInvMMax) return kTRUE;
3470 //___________________________________________________________________
3471 Bool_t AliAnalysisTaskJetChem::IsLaInvMass(const Double_t mass) const
3473 // La mass ? Use FF histo limits
3476 if(fFFIMLaInvMMin <= mass && mass < fFFIMLaInvMMax) return kTRUE;
3481 //_____________________________________________________________________________________
3482 Int_t AliAnalysisTaskJetChem::GetListOfV0s(TList *list, const Int_t type, const Int_t particletype, AliAODVertex* primVertex, AliAODEvent* aod)
3484 // fill list of V0s selected according to type
3487 if(fDebug>1) Printf("%s:%d no input list", (char*)__FILE__,__LINE__);
3492 if(fDebug>5){std::cout<<"AliAnalysisTaskJetChem::GetListOfV0s(): type: "<<type<<" particletype: "<<particletype<<"aod: "<<aod<<std::endl;
3493 if(type==kTrackUndef){std::cout<<"AliAnalysisTaskJetChem::GetListOfV0s(): kTrackUndef!! "<<std::endl;}
3497 if(type==kTrackUndef) return 0;
3499 if(!primVertex) return 0;
3501 Double_t lPrimaryVtxPosition[3];
3502 Double_t lV0Position[3];
3503 lPrimaryVtxPosition[0] = primVertex->GetX();
3504 lPrimaryVtxPosition[1] = primVertex->GetY();
3505 lPrimaryVtxPosition[2] = primVertex->GetZ();
3507 if(fDebug>5){ std::cout<<"AliAnalysisTaskJetChem::GetListOfV0s(): aod->GetNumberOfV0s: "<<aod->GetNumberOfV0s()<<std::endl; }
3510 for(int i=0; i<aod->GetNumberOfV0s(); i++){ // loop over V0s
3513 AliAODv0* v0 = aod->GetV0(i);
3517 std::cout << std::endl
3518 << "Warning in AliAnalysisTaskJetChem::GetListOfV0s:" << std::endl
3519 << "v0 = " << v0 << std::endl;
3523 Bool_t isOnFly = v0->GetOnFlyStatus();
3525 if(!isOnFly && (type == kOnFly || type == kOnFlyPID || type == kOnFlydEdx || type == kOnFlyPrim)) continue;
3526 if( isOnFly && (type == kOffl || type == kOfflPID || type == kOffldEdx || type == kOfflPrim)) continue;
3528 Int_t motherType = -1;
3529 //Double_t v0CalcMass = 0; //mass of MC v0
3530 Double_t MCPt = 0; //pt of MC v0
3532 Double_t pp[3]={0,0,0}; //3-momentum positive charged track
3533 Double_t pm[3]={0,0,0}; //3-momentum negative charged track
3534 Double_t v0mom[3]={0,0,0};
3545 Bool_t daughtercheck = DaughterTrackCheck(v0, nnum, pnum);
3547 if(daughtercheck == kFALSE)continue;
3549 const AliAODTrack *trackNeg=(AliAODTrack *)(v0->GetDaughter(nnum));
3550 const AliAODTrack *trackPos=(AliAODTrack *)(v0->GetDaughter(pnum));
3553 ///////////////////////////////////////////////////////////////////////////////////
3555 //calculate InvMass for every V0 particle assumption (Kaon=1,Lambda=2,Antilambda=3)
3556 switch(particletype){
3558 CalculateInvMass(v0, kK0, invM, trackPt); //function to calculate invMass with TLorentzVector class
3562 CalculateInvMass(v0, kLambda, invM, trackPt);
3566 CalculateInvMass(v0, kAntiLambda, invM, trackPt);
3570 std::cout<<"***NO VALID PARTICLETYPE***"<<std::endl;
3575 /////////////////////////////////////////////////////////////
3576 //V0 and track Cuts:
3579 if(fDebug>6){if(!(IsK0InvMass(invMK0s)) && !(IsLaInvMass(invMLa)) && !(IsLaInvMass(invMALa))){std::cout<<"AliAnalysisTaskJetChem::GetListOfV0s: invM not in selected mass window "<<std::endl;}}
3581 if(!(IsK0InvMass(invMK0s)) && !(IsLaInvMass(invMLa)) && !(IsLaInvMass(invMALa)))continue;
3583 // Double_t PosEta = trackPos->AliAODTrack::Eta();//daughter track charge is sometimes wrong here, account for that!!!
3584 // Double_t NegEta = trackNeg->AliAODTrack::Eta();
3586 Double_t PosEta = trackPos->Eta();//daughter track charge is sometimes wrong here, account for that!!!
3587 Double_t NegEta = trackNeg->Eta();
3589 Double_t PosCharge = trackPos->Charge();
3590 Double_t NegCharge = trackNeg->Charge();
3592 if((trackPos->Charge() == 1) && (trackNeg->Charge() == -1)) //Fill daughters charge into histo to check if they are symmetric distributed
3593 { fh1PosDaughterCharge->Fill(PosCharge);
3594 fh1NegDaughterCharge->Fill(NegCharge);
3597 //DistOverTotMom_in_2D___________
3599 Float_t fMassK0s = TDatabasePDG::Instance()->GetParticle(kK0Short)->Mass();
3600 Float_t fMassLambda = TDatabasePDG::Instance()->GetParticle(kLambda0)->Mass();
3603 AliAODVertex* primVtx = fAOD->GetPrimaryVertex(); // get the primary vertex
3604 Double_t dPrimVtxPos[3]; // primary vertex position {x,y,z}
3605 primVtx->GetXYZ(dPrimVtxPos);
3607 Float_t fPtV0 = TMath::Sqrt(v0->Pt2V0()); // transverse momentum of V0
3608 Double_t dSecVtxPos[3]; // V0 vertex position {x,y,z}
3609 v0->GetSecondaryVtx(dSecVtxPos);
3610 Double_t dDecayPath[3];
3611 for (Int_t iPos = 0; iPos < 3; iPos++)
3612 dDecayPath[iPos] = dSecVtxPos[iPos]-dPrimVtxPos[iPos]; // vector of the V0 path
3613 Float_t fDecLen2D = TMath::Sqrt(dDecayPath[0]*dDecayPath[0]+dDecayPath[1]*dDecayPath[1]); //transverse path length R
3614 Float_t fROverPt = fDecLen2D/fPtV0; // R/pT
3616 Float_t fMROverPtK0s = fMassK0s*fROverPt; // m*R/pT
3617 Float_t fMROverPtLambda = fMassLambda*fROverPt; // m*R/pT
3619 //___________________
3620 Double_t fRap = -999;//init values
3621 Double_t fEta = -999;
3622 Double_t fV0cosPointAngle = -999;
3623 Double_t fV0DecayLength = v0->DecayLengthV0(lPrimaryVtxPosition);
3627 fV0mom[0]=v0->MomV0X();
3628 fV0mom[1]=v0->MomV0Y();
3629 fV0mom[2]=v0->MomV0Z();
3631 Double_t fV0TotalMomentum = TMath::Sqrt(fV0mom[0]*fV0mom[0]+fV0mom[1]*fV0mom[1]+fV0mom[2]*fV0mom[2]);
3632 // const Double_t K0sPDGmass = 0.497614;
3633 // const Double_t LambdaPDGmass = 1.115683;
3635 const Double_t K0sPDGmass = TDatabasePDG::Instance()->GetParticle(kK0Short)->Mass();
3636 const Double_t LambdaPDGmass = TDatabasePDG::Instance()->GetParticle(kLambda0)->Mass();
3638 Double_t fDistOverTotMomK0s = 0;
3639 Double_t fDistOverTotMomLa = 0;
3641 //calculate proper lifetime of particles in 3D (not recommended anymore)
3643 if(particletype == kK0){
3645 fDistOverTotMomK0s = fV0DecayLength * K0sPDGmass;
3646 fDistOverTotMomK0s /= (fV0TotalMomentum+1e-10);
3649 if((particletype == kLambda)||(particletype == kAntiLambda)){
3651 fDistOverTotMomLa = fV0DecayLength * LambdaPDGmass;
3652 fDistOverTotMomLa /= (fV0TotalMomentum+1e-10);
3655 //TPC cluster (not used anymore) and TPCRefit cuts
3657 //Double_t trackPosNcls = trackPos->GetTPCNcls();//Get number of clusters for positive charged tracks
3658 //Double_t trackNegNcls = trackNeg->GetTPCNcls();//Get number of clusters for negative charged tracks
3660 if(fRequireTPCRefit==kTRUE){//if kTRUE: accept only if daughter track is refitted in TPC!!
3661 Bool_t isPosTPCRefit = (trackPos->AliAODTrack::IsOn(AliESDtrack::kTPCrefit));
3662 Bool_t isNegTPCRefit = (trackNeg->AliAODTrack::IsOn(AliESDtrack::kTPCrefit));
3663 if (!isPosTPCRefit)continue;
3664 if (!isNegTPCRefit)continue;
3667 if(fKinkDaughters==kFALSE){//if kFALSE: no acceptance of kink daughters
3668 AliAODVertex* ProdVtxDaughtersPos = (AliAODVertex*) (trackPos->AliAODTrack::GetProdVertex());
3669 Char_t isAcceptKinkDaughtersPos = ProdVtxDaughtersPos->GetType();
3670 if(isAcceptKinkDaughtersPos==AliAODVertex::kKink)continue;
3672 AliAODVertex* ProdVtxDaughtersNeg = (AliAODVertex*) (trackNeg->AliAODTrack::GetProdVertex());
3673 Char_t isAcceptKinkDaughtersNeg = ProdVtxDaughtersNeg->GetType();
3674 if(isAcceptKinkDaughtersNeg==AliAODVertex::kKink)continue;
3678 Double_t fV0Radius = -999;
3679 Double_t fDcaV0Daughters = v0->DcaV0Daughters();
3680 Double_t fDcaPosToPrimVertex = v0->DcaPosToPrimVertex();//IP of positive charged daughter
3681 Double_t fDcaNegToPrimVertex = v0->DcaNegToPrimVertex();//IP of negative charged daughter
3682 Double_t avDecayLengthK0s = 2.6844;
3683 Double_t avDecayLengthLa = 7.89;
3685 //Float_t fCTauK0s = 2.6844; // [cm] c tau of K0S
3686 //Float_t fCTauLambda = 7.89; // [cm] c tau of Lambda and Antilambda
3688 fV0cosPointAngle = v0->CosPointingAngle(lPrimaryVtxPosition);
3689 lV0Position[0]= v0->DecayVertexV0X();
3690 lV0Position[1]= v0->DecayVertexV0Y();
3691 lV0Position[2]= v0->DecayVertexV0Z();
3693 fV0Radius = TMath::Sqrt(lV0Position[0]*lV0Position[0]+lV0Position[1]*lV0Position[1]);
3695 if(particletype == kK0) {fRap = v0->RapK0Short();
3696 fEta = v0->PseudoRapV0();}
3697 if(particletype == kLambda) {fRap = v0->RapLambda();
3698 fEta = v0->PseudoRapV0();}
3699 if(particletype == kAntiLambda) {fRap = v0->Y(-3122);
3700 fEta = v0->PseudoRapV0();}
3703 //cut on 3D DistOverTotMom: (not used anymore)
3704 //if((particletype == kLambda)||(particletype == kAntiLambda)){if(fDistOverTotMomLa >= (fCutV0DecayMax * avDecayLengthLa)) continue;}
3706 //cut on K0s applied below after all other cuts for histo fill purposes..
3708 //cut on 2D DistOverTransMom: (recommended from Iouri)
3709 if((particletype == kLambda)||(particletype == kAntiLambda)){if(fMROverPtLambda > (fCutV0DecayMax * avDecayLengthLa))continue;}//fCutV0DecayMax set to 5 in AddTask macro
3711 //Armenteros Podolanski Plot for K0s:////////////////////////////
3713 Double_t ArmenterosAlpha=-999;
3714 Double_t ArmenterosPt=-999;
3720 if(particletype == kK0){
3722 pp[0]=v0->MomPosX();
3723 pp[1]=v0->MomPosY();
3724 pp[2]=v0->MomPosZ();
3726 pm[0]=v0->MomNegX();
3727 pm[1]=v0->MomNegY();
3728 pm[2]=v0->MomNegZ();
3731 v0mom[0]=v0->MomV0X();
3732 v0mom[1]=v0->MomV0Y();
3733 v0mom[2]=v0->MomV0Z();
3735 TVector3 v0Pos(pp[0],pp[1],pp[2]);
3736 TVector3 v0Neg(pm[0],pm[1],pm[2]);
3737 TVector3 v0totMom(v0mom[0], v0mom[1], v0mom[2]); //vector for tot v0 momentum
3739 PosPt = v0Pos.Perp(v0totMom); //longitudinal momentum of positive charged daughter track
3740 PosPl = v0Pos.Dot(v0totMom)/v0totMom.Mag(); //transversal momentum of positive charged daughter track
3742 NegPt = v0Neg.Perp(v0totMom); //longitudinal momentum of negative charged daughter track
3743 NegPl = v0Neg.Dot(v0totMom)/v0totMom.Mag(); //transversal momentum of nergative charged daughter track
3745 ArmenterosAlpha = 1.-2./(1+(PosPl/NegPl));
3746 ArmenterosPt= v0->PtArmV0();
3750 if(particletype == kK0){//only cut on K0s histos
3751 if(IsArmenterosSelected == 1){// Armenteros Cut to reject Lambdas contamination in K0s inv. massspectrum
3752 fh2ArmenterosBeforeCuts->Fill(ArmenterosAlpha,ArmenterosPt);
3756 //some more cuts on v0s and daughter tracks:
3759 if((TMath::Abs(PosEta)>fCutPostrackEta) || (TMath::Abs(NegEta)>fCutNegtrackEta))continue; //Daughters pseudorapidity cut
3760 if (fV0cosPointAngle < fCutV0cosPointAngle) continue; //cospointangle cut
3762 //if(TMath::Abs(fRap) > fCutRap)continue; //V0 Rapidity Cut
3763 if(TMath::Abs(fEta) > fCutEta) continue; //V0 Eta Cut
3764 if (fDcaV0Daughters > fCutDcaV0Daughters)continue;
3765 if ((fDcaPosToPrimVertex < fCutDcaPosToPrimVertex) || (fDcaNegToPrimVertex < fCutDcaNegToPrimVertex))continue;
3766 if ((fV0Radius < fCutV0RadiusMin) || (fV0Radius > fCutV0RadiusMax))continue;
3768 const AliAODPid *pid_p1=trackPos->GetDetPid();
3769 const AliAODPid *pid_n1=trackNeg->GetDetPid();
3772 if(particletype == kLambda){
3773 // if(AcceptBetheBloch(v0, fPIDResponse, 1) == kFALSE){std::cout<<"******PID cut rejects Lambda!!!************"<<std::endl;}
3774 if(AcceptBetheBloch(v0, fPIDResponse, 1) == kFALSE)continue;
3775 fh2BBLaPos->Fill(pid_p1->GetTPCmomentum(),pid_p1->GetTPCsignal());//positive lambda daughter
3776 fh2BBLaNeg->Fill(pid_n1->GetTPCmomentum(),pid_n1->GetTPCsignal());//negative lambda daughter
3778 //Double_t phi = v0->Phi();
3779 //Double_t massLa = v0->MassLambda();
3781 //printf("La: i = %d, m = %f, pT = %f, eta = %f, phi = %f\n, ",i,massLa,trackPt,fEta,phi);
3785 if(particletype == kAntiLambda){
3787 if(AcceptBetheBloch(v0, fPIDResponse, 2) == kFALSE)continue;
3788 fh2BBLaPos->Fill(pid_p1->GetTPCmomentum(),pid_p1->GetTPCsignal());//positive antilambda daughter
3789 fh2BBLaNeg->Fill(pid_n1->GetTPCmomentum(),pid_n1->GetTPCsignal());//negative antilambda daughter
3794 //Armenteros cut on K0s:
3795 if(particletype == kK0){
3796 if(IsArmenterosSelected == 1){// Armenteros Cut to reject Lambdas contamination in K0s inv. massspectrum
3798 if((ArmenterosPt<=(TMath::Abs(fCutArmenteros*ArmenterosAlpha))) && (fCutArmenteros!=-999))continue; //Cuts out Lambda contamination in K0s histos
3799 fh2ArmenterosAfterCuts->Fill(ArmenterosAlpha,ArmenterosPt);
3803 //not used anymore in 3D, z component of total momentum has bad resolution, cut instead in 2D and use pT
3804 //Proper Lifetime Cut: DecayLength3D * PDGmass / |p_tot| < 3*2.68cm (ctau(betagamma=1)) ; |p|/mass = beta*gamma
3805 //////////////////////////////////////////////
3808 //cut on 2D DistOverTransMom
3809 if(particletype == kK0){//the cut on Lambdas you can find above
3811 fh2ProperLifetimeK0sVsPtBeforeCut->Fill(trackPt,fMROverPtK0s); //fill these histos after all other cuts
3812 if(fMROverPtK0s > (fCutV0DecayMax * avDecayLengthK0s))continue;
3813 fh2ProperLifetimeK0sVsPtAfterCut->Fill(trackPt,fMROverPtK0s);
3815 //Double_t phi = v0->Phi();
3816 // Double_t massK0s = v0->MassK0Short();
3817 //printf("K0S: i = %d, m = %f, pT = %f, eta = %f, phi = %f\n",i,invMK0s,trackPt,fEta,phi);
3819 //test std::cout<<" Index accepted K0s candidate in list of V0s in event: "<<i<<" m: "<<invMK0s<<" pT: "<<trackPt<<" eta: "<<fEta<<" phi: "<<v0->Phi()<<std::endl;
3822 //MC Associated V0 particles: (reconstructed particles associated with MC truth (MC truth: true primary MC generated particle))
3825 if(fAnalysisMC){// begin MC part
3827 Int_t negDaughterpdg = 0;
3828 Int_t posDaughterpdg = 0;
3830 Bool_t fPhysicalPrimary = -1; //v0 physical primary check
3831 Int_t MCv0PdgCode = 0;
3832 Bool_t mclabelcheck = kFALSE;
3834 TList *listmc = aod->GetList(); //AliAODEvent* is inherited from AliVEvent*, listmc is pointer to reconstructed event in MC list, member of AliAODEvent
3836 if(!listmc)continue;
3838 if((particletype == kLambda) || (particletype == kAntiLambda)){// at this point the v0 candidates already survived all V0 cuts, for the MC analysis they still have to survive the association checks in the following block
3840 //feeddown-correction for Lambda/Antilambda particles
3841 //feedddown comes mainly from charged and neutral Xi particles
3842 //feeddown from Sigma decays so quickly that it's not possible to distinguish from primary Lambdas with detector
3843 //feeddown for K0s from phi decays is neglectible
3844 //TH2F* fh2FeedDownMatrix = 0x0; //histo for feeddown already decleared above
3847 //first for all Lambda and Antilambda candidates____________________________________________________________________
3849 if(particletype == kLambda){
3851 mclabelcheck = MCLabelCheck(v0, kLambda, trackNeg, trackPos, listmc, negDaughterpdg, posDaughterpdg, motherType, v0Label, MCPt, fPhysicalPrimary, MCv0PdgCode);
3854 if((motherType == 3312)||(motherType == 3322)){//mother of v0 is neutral or negative Xi
3856 fListFeeddownLaCand->Add(v0); //fill TList with ass. particles, stemming from feeddown from Xi(bar) decays
3860 if(particletype == kAntiLambda){
3861 mclabelcheck = MCLabelCheck(v0, kAntiLambda, trackNeg, trackPos, listmc, negDaughterpdg, posDaughterpdg, motherType, v0Label, MCPt, fPhysicalPrimary, MCv0PdgCode);
3863 if((motherType == -3312)||(motherType == -3322)){
3864 fListFeeddownALaCand->Add(v0); //fill TList with ass. particles, stemming from feeddown from Xi(bar) decays
3869 //_only true primary particles survive the following checks_______________________________________________________________________________________________
3871 if(particletype == kK0){
3872 mclabelcheck = MCLabelCheck(v0, kK0, trackNeg, trackPos, listmc, negDaughterpdg, posDaughterpdg, motherType, v0Label, MCPt, fPhysicalPrimary, MCv0PdgCode);
3873 if(mclabelcheck == kFALSE)continue;
3875 if(particletype == kLambda){
3876 mclabelcheck = MCLabelCheck(v0, kLambda, trackNeg, trackPos, listmc, negDaughterpdg, posDaughterpdg, motherType, v0Label, MCPt, fPhysicalPrimary, MCv0PdgCode);
3877 if(mclabelcheck == kFALSE)continue;
3879 if(particletype == kAntiLambda){
3880 mclabelcheck = MCLabelCheck(v0, kAntiLambda, trackNeg, trackPos, listmc, negDaughterpdg, posDaughterpdg, motherType, v0Label, MCPt, fPhysicalPrimary, MCv0PdgCode);
3881 if(mclabelcheck == kFALSE)continue;
3884 if(fPhysicalPrimary != 1)continue; //V0 candidate (K0s, Lambda or Antilambda) must be physical primary, this means there is no mother particle existing
3893 Int_t nPart=list->GetSize();
3896 } // end GetListOfV0s()
3898 // -------------------------------------------------------------------------------------------------------
3900 void AliAnalysisTaskJetChem::CalculateInvMass(AliAODv0* v0vtx, const Int_t particletype, Double_t& invM, Double_t& trackPt){
3910 Double_t pp[3]={0,0,0}; //3-momentum positive charged track
3911 Double_t pm[3]={0,0,0}; //3-momentum negative charged track
3913 const Double_t massPi = 0.13957018; //better use PDG code at this point
3914 const Double_t massP = 0.93827203;
3919 TLorentzVector vector; //lorentzvector V0 particle
3920 TLorentzVector fourmom1;//lorentzvector positive daughter
3921 TLorentzVector fourmom2;//lorentzvector negative daughter
3923 //--------------------------------------------------------------
3925 AliAODTrack *trackPos = (AliAODTrack *) (v0vtx->GetSecondaryVtx()->GetDaughter(0));//index 0 defined as positive charged track in AliESDFilter
3927 if( trackPos->Charge() == 1 ){
3929 pp[0]=v0vtx->MomPosX();
3930 pp[1]=v0vtx->MomPosY();
3931 pp[2]=v0vtx->MomPosZ();
3933 pm[0]=v0vtx->MomNegX();
3934 pm[1]=v0vtx->MomNegY();
3935 pm[2]=v0vtx->MomNegZ();
3938 if( trackPos->Charge() == -1 ){
3940 pm[0]=v0vtx->MomPosX();
3941 pm[1]=v0vtx->MomPosY();
3942 pm[2]=v0vtx->MomPosZ();
3944 pp[0]=v0vtx->MomNegX();
3945 pp[1]=v0vtx->MomNegY();
3946 pp[2]=v0vtx->MomNegZ();
3949 if (particletype == kK0){ // case K0s
3950 mass1 = massPi;//positive particle
3951 mass2 = massPi;//negative particle
3952 } else if (particletype == kLambda){ // case Lambda
3953 mass1 = massP;//positive particle
3954 mass2 = massPi;//negative particle
3955 } else if (particletype == kAntiLambda){ //case AntiLambda
3956 mass1 = massPi;//positive particle
3957 mass2 = massP; //negative particle
3960 fourmom1.SetXYZM(pp[0],pp[1],pp[2],mass1);//positive track
3961 fourmom2.SetXYZM(pm[0],pm[1],pm[2],mass2);//negative track
3962 vector=fourmom1 + fourmom2;
3965 trackPt = vector.Pt();
3967 /*// don't apply AliAODv0 methods to get the inv. mass for the OnFly finder, since the daughter labels are sometimes switched!!!! For Offline V0 finder no problem
3969 if(particletype == kK0){
3970 std::cout << "invMK0s: " << invM <<std::endl;
3971 std::cout << "v0vtx->MassK0Short(): " << v0vtx->MassK0Short() << std::endl;
3972 std::cout << " " <<std::endl;
3973 //invM = v0vtx->MassK0Short();
3976 if(particletype == kLambda){
3977 std::cout << "invMLambda: " << invM <<std::endl;
3978 std::cout << "v0vtx->MassMassLambda(): " << v0vtx->MassLambda() << std::endl;
3979 std::cout << " " <<std::endl;
3980 //invM = v0vtx->MassLambda();
3983 if(particletype == kAntiLambda){
3984 std::cout << "invMAntiLambda: " << invM <<std::endl;
3985 std::cout << "v0vtx->MassAntiLambda(): " << v0vtx->MassAntiLambda() << std::endl;
3986 std::cout << " " <<std::endl;
3987 //invM = v0vtx->MassAntiLambda();
3995 //_____________________________________________________________________________________
3996 Int_t AliAnalysisTaskJetChem::GetListOfMCParticles(TList *outputlist, const Int_t particletype, AliAODEvent *mcaodevent) //(list to fill here e.g. fListMCgenK0s, particle species to search for)
3999 outputlist->Clear();
4001 TClonesArray *stack = 0x0;
4002 Double_t mcXv=0., mcYv=0., mcZv=0.;//MC vertex position
4005 // get MC generated particles
4007 Int_t fPdgcodeCurrentPart = 0; //pdg code current particle
4008 Double_t fRapCurrentPart = 0; //get rapidity
4009 Double_t fPtCurrentPart = 0; //get transverse momentum
4010 Double_t fEtaCurrentPart = 0; //get pseudorapidity
4012 //variable for check: physical primary particle
4013 //Bool_t IsPhysicalPrimary = -1;
4014 //Int_t index = 0; //check number of injected particles
4015 //****************************
4016 // Start loop over MC particles
4018 TList *lst = mcaodevent->GetList();
4021 if(fDebug>1) Printf("%s:%d no input list", (char*)__FILE__,__LINE__);
4025 stack = (TClonesArray*)lst->FindObject(AliAODMCParticle::StdBranchName());
4027 Printf("ERROR: stack not available");
4031 AliAODMCHeader *mcHdr=(AliAODMCHeader*)lst->FindObject(AliAODMCHeader::StdBranchName());
4032 if(!mcHdr)return -1;
4034 mcXv=mcHdr->GetVtxX(); mcYv=mcHdr->GetVtxY(); mcZv=mcHdr->GetVtxZ(); // position of the MC primary vertex
4037 ntrk=stack->GetEntriesFast();
4039 //if(TMath::Abs(mcZv)>10)return; //i also cut at the reconstructed particles - here i also want to cut for a second time on z vertex (?) -> could be possible bias because of resolution effects on edges of acceptance, also the case for pseudorapidity...
4042 for (Int_t iMc = 0; iMc < ntrk; iMc++) { //loop over mc generated particles
4045 AliAODMCParticle *p0=(AliAODMCParticle*)stack->UncheckedAt(iMc);
4047 //Printf("ERROR: particle with label %d not found in stack (mc loop)", iMc);
4050 fPdgcodeCurrentPart = p0->GetPdgCode();
4052 // Keep only K0s, Lambda and AntiLambda, Xi and Phi:
4053 //if ( (fPdgcodeCurrentPart != 310 ) && (fPdgcodeCurrentPart != 3122 ) && (fPdgcodeCurrentPart != -3122 ) && (fPdgcodeCurrentPart != 3312 ) && (fPdgcodeCurrentPart != -3312) && (fPdgcodeCurrentPart != -333) ) continue;
4057 //Rejection of Pythia injected particles with David Chinellatos method - not the latest method, better Method with TString from MC generator in IsInjected() function below!
4059 /* if( (p0->GetStatus()==21) ||
4060 ((p0->GetPdgCode() == 443) &&
4061 (p0->GetMother() == -1) &&
4062 (p0->GetDaughter(0) == (iMc))) ){ index++; }
4064 if(p0->GetStatus()==21){std::cout<< "hello !!!!" <<std::endl;}
4066 std::cout<< "MC particle status: " << p0->GetStatus() <<std::endl;
4070 //if(index>=1){std::cout<< "MC particle status: " << p0->GetStatus() <<std::endl;}//if first injected MC particle was found, the Status is printed out for this and every following MC particle
4073 //injected particles could be from GenBox (single high pt tracks) or jet related tracks, both generated from PYTHIA MC generator
4075 //Check: MC particle mother
4077 //for feed-down checks
4078 /* //MC gen particles
4079 Int_t iMother = p0->GetMother(); //Motherparticle of V0 candidate (e.g. phi particle,..)
4081 AliAODMCParticle *partM = (AliAODMCParticle*)stack->UncheckedAt(iMother);
4083 if(partM) codeM = TMath::Abs(partM->GetPdgCode());
4086 3312 Xi- -3312 Xibar+
4087 3322 Xi0 -3322 Xibar0
4090 if((codeM == 3312)||(codeM == 3322))// feeddown for Lambda coming from Xi- and Xi0
4096 /* //Check: MC gen. particle decays via 2-pion decay? -> only to be done for the rec. particles !! (-> branching ratio ~ 70 % for K0s -> pi+ pi-)
4098 Int_t daughter0Label = p0->GetDaughter(0);
4099 AliAODMCParticle *mcDaughter0 = (AliAODMCParticle *)stack->UncheckedAt(daughter0Label);
4100 if(daughter0Label >= 0)
4101 {daughter0Type = mcDaughter0->GetPdgCode();}
4103 Int_t daughter1Label = p0->GetDaughter(1);
4104 AliAODMCParticle *mcDaughter1 = (AliAODMCParticle *)stack->UncheckedAt(daughter1Label);
4106 if(daughter1Label >= 1)
4107 {daughter1Type = mcDaughter1->GetPdgCode();} //requirement that daughters are pions is only done for the reconstructed V0s in GetListofV0s() below
4112 // Keep only K0s, Lambda and AntiLambda:
4113 if ( (fPdgcodeCurrentPart != 310 ) && (fPdgcodeCurrentPart != 3122 ) && (fPdgcodeCurrentPart != -3122 )) continue;
4114 // Check: Is physical primary
4116 //do not use anymore: //IsPhysicalPrimary = p0->IsPhysicalPrimary();
4117 //if(!IsPhysicalPrimary)continue;
4119 Float_t fDistPrimaryMax = 0.01; // [cm] max distance of production point to the primary vertex (criterion for choice of MC particles considered as primary)
4121 // Get the distance between production point of the MC mother particle and the primary vertex
4123 Double_t dx = mcXv-p0->Xv();//mc primary vertex - mc gen. v0 vertex
4124 Double_t dy = mcYv-p0->Yv();
4125 Double_t dz = mcZv-p0->Zv();
4127 Double_t fDistPrimary = TMath::Sqrt(dx*dx + dy*dy + dz*dz);
4128 Bool_t fPhysicalPrimary = (fDistPrimary < fDistPrimaryMax);
4130 if(!fPhysicalPrimary)continue;
4132 //if(fPhysicalPrimary){std::cout<<"hello**********************"<<std::endl;}
4134 /* std::cout<<"dx: "<<dx<<std::endl;
4135 std::cout<<"dy: "<<dy<<std::endl;
4136 std::cout<<"dz: "<<dz<<std::endl;
4138 std::cout<<"start: "<<std::endl;
4139 std::cout<<"mcXv: "<<mcXv<<std::endl;
4140 std::cout<<"mcYv: "<<mcYv<<std::endl;
4141 std::cout<<"mcZv: "<<mcZv<<std::endl;
4143 std::cout<<"p0->Xv(): "<<p0->Xv()<<std::endl;
4144 std::cout<<"p0->Yv(): "<<p0->Yv()<<std::endl;
4145 std::cout<<"p0->Zv(): "<<p0->Zv()<<std::endl;
4146 std::cout<<" "<<std::endl;
4147 std::cout<<"fDistPrimary"<<fDistPrimary<<std::endl;
4148 std::cout<<"fPhysicalPrimary"<<fPhysicalPrimary<<std::endl;
4151 //Is close enough to primary vertex to be considered as primary-like?
4153 fRapCurrentPart = MyRapidity(p0->E(),p0->Pz());
4154 fEtaCurrentPart = p0->Eta();
4155 fPtCurrentPart = p0->Pt();
4157 if (TMath::Abs(fEtaCurrentPart) < fCutEta){
4158 // if (TMath::Abs(fRapCurrentPart) > fCutRap)continue; //rap cut for crosschecks
4160 if(particletype == kK0){ //MC gen. K0s
4161 if (fPdgcodeCurrentPart==310){
4162 outputlist->Add(p0);
4166 if(particletype == kLambda){ //MC gen. Lambdas
4167 if (fPdgcodeCurrentPart==3122) {
4168 outputlist->Add(p0);
4172 if(particletype == kAntiLambda){
4173 if (fPdgcodeCurrentPart==-3122) { //MC gen. Antilambdas
4174 outputlist->Add(p0);
4179 }//end loop over MC generated particle
4181 Int_t nMCPart=outputlist->GetSize();
4188 //---------------------------------------------------------------------------
4190 Bool_t AliAnalysisTaskJetChem::FillFeeddownMatrix(TList* fListFeeddownCand, Int_t particletype)
4193 // Define Feeddown matrix
4194 Double_t lFeedDownMatrix [100][100];
4195 // FeedDownMatrix [Lambda Bin][Xi Bin];
4197 //Initialize entries of matrix:
4198 for(Int_t ilb = 0; ilb<100; ilb++){
4199 for(Int_t ixb = 0; ixb<100; ixb++){
4200 lFeedDownMatrix[ilb][ixb]=0; //first lambda bins, xi bins
4205 //----------------------------------------------------------------------------
4207 Double_t AliAnalysisTaskJetChem::MyRapidity(Double_t rE, Double_t rPz) const
4209 // Local calculation for rapidity
4210 return 0.5*TMath::Log((rE+rPz)/(rE-rPz+1.e-13));
4212 //----------------------------------------------------------------------------
4214 // ________________________________________________________________________________________________________________________//function to get the MC gen. jet particles
4216 void AliAnalysisTaskJetChem::GetTracksInCone(TList* inputlist, TList* outputlist, const AliAODJet* jet,
4217 const Double_t radius, Double_t& sumPt, const Double_t minPt, const Double_t maxPt, Bool_t& isBadPt)
4219 // fill list of tracks in cone around jet axis
4222 Bool_t isBadMaxPt = kFALSE;
4223 Bool_t isBadMinPt = kTRUE;
4227 jet->PxPyPz(jetMom);
4228 TVector3 jet3mom(jetMom);
4230 //if(jetets < jetetscutr)continue;
4232 for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){
4234 AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack));
4236 Double_t trackMom[3];
4237 track->PxPyPz(trackMom);
4238 TVector3 track3mom(trackMom);
4240 Double_t dR = jet3mom.DeltaR(track3mom);
4244 outputlist->Add(track);
4246 sumPt += track->Pt();
4248 if(maxPt>0 && track->Pt()>maxPt) isBadMaxPt = kTRUE; // reject jets containing any track with pt larger than this value, use GetFFMaxTrackPt()
4249 if(minPt>0 && track->Pt()>minPt) isBadMinPt = kFALSE; // reject jets with leading track with pt smaller than this value, use GetFFMinLTrackPt()
4255 if(minPt>0 && isBadMinPt) isBadPt = kTRUE; //either the jet is bad because of too small leading track pt.. (probability to be purely combinatorial jet is too high to accept it)
4256 if(maxPt>0 && isBadMaxPt) isBadPt = kTRUE; //..or because of leading track with too high pt (could be fake track)
4262 //____________________________________________________________________________________________________________________
4265 void AliAnalysisTaskJetChem::GetTracksInPerpCone(TList* inputlist, TList* outputlist, const AliAODJet* jet,
4266 const Double_t radius, Double_t& sumPerpPt)
4268 // fill list of tracks in two cones around jet axis rotated in phi +/- 90 degrees
4270 Double_t jetMom[3]; //array for entries in TVector3
4271 Double_t perpjetplusMom[3]; //array for entries in TVector3
4272 Double_t perpjetnegMom[3];
4276 jet->PxPyPz(jetMom); //get 3D jet momentum
4277 Double_t jetPerpPt = jet->Pt(); //original jet pt, invariant under rotations
4278 Double_t jetPhi = jet->Phi(); //original jet phi
4280 Double_t jetPerpposPhi = jetPhi + ((TMath::Pi())*0.5);//get new perp. jet axis phi clockwise
4281 Double_t jetPerpnegPhi = jetPhi - ((TMath::Pi())*0.5);//get new perp. jet axis phi counterclockwise
4283 TVector3 jet3mom(jetMom); //3-Vector for original rec. jet axis
4285 //Double_t phitest = jet3mom.Phi();
4287 perpjetplusMom[0]=(TMath::Cos(jetPerpposPhi)*jetPerpPt); //x coordinate (sidewards - when looking in beam direction)
4288 perpjetplusMom[1]=(TMath::Sin(jetPerpposPhi)*jetPerpPt); //y coordinate (upwards - when looking in beam direction)
4289 perpjetplusMom[2]=jetMom[2]; //z coordinate (along beam axis), invariant under azimuthal rotation
4291 perpjetnegMom[0]=(TMath::Cos(jetPerpnegPhi)*jetPerpPt); //x coordinate (sidewards - when looking in beam direction)
4292 perpjetnegMom[1]=(TMath::Sin(jetPerpnegPhi)*jetPerpPt); //y coordinate (upwards - when looking in beam direction)
4293 perpjetnegMom[2]=jetMom[2]; //z coordinate (along beam axis), invariant under azimuthal rotation
4296 TVector3 perpjetplus3mom(perpjetplusMom); //3-Vector for new perp. jet axis, clockwise rotated
4297 TVector3 perpjetneg3mom(perpjetnegMom); //3-Vector for new perp. jet axis, counterclockwise rotated
4299 //for crosscheck TVector3 rotation method
4301 //Double_t jetMomplusTest[3];
4302 //Double_t jetMomminusTest[3];
4304 //jet3mom.RotateZ(TMath::Pi()*0.5);//rotate original jet axis around +90 degrees in phi
4306 //perpjetminus3momTest = jet3mom.RotateZ((-1)*TMath::Pi()*0.5);
4308 // jet3mom.RotateZ(TMath::Pi()*0.5);
4309 // jet3mom.RotateZ((-1)*TMath::Pi()*0.5);
4311 //jetMomplusTest[0] = jet3mom.X(); //fetching perp. axis coordinates
4312 //jetMomplusTest[1] = jet3mom.Y();
4313 //jetMomplusTest[2] = jet3mom.Z();
4315 //TVector3 perpjetplus3momTest(jetMomplusTest); //new TVector3 for +90deg rotated jet axis with rotation method from ROOT
4316 //TVector3 perpjetminus3momTest(jetMomminusTest); //new TVector3 for -90deg rotated jet axis with rotation method from ROOT
4319 for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){ //collect V0 content in perp cone, rotated clockwise
4321 AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack)); //inputlist is fListK0s, all reconstructed K0s in event
4322 if(!track){std::cout<<"K0s track not found!!!"<<std::endl; continue;}
4324 Double_t trackMom[3];//3-mom of V0 particle
4325 track->PxPyPz(trackMom);
4326 TVector3 track3mom(trackMom);
4328 Double_t dR = perpjetplus3mom.DeltaR(track3mom);
4332 outputlist->Add(track); // output list is jetPerpConeK0list
4334 sumPerpPt += track->Pt();
4341 for (Int_t itrack=0; itrack<inputlist->GetSize(); itrack++){//collect V0 content in perp cone, rotated counterclockwise
4343 AliVParticle* track = dynamic_cast<AliVParticle*>(inputlist->At(itrack)); //inputlist is fListK0s, all reconstructed K0s in event
4344 if(!track){std::cout<<"K0s track not found!!!"<<std::endl; continue;}
4346 Double_t trackMom[3];//3-mom of V0 particle
4347 track->PxPyPz(trackMom);
4348 TVector3 track3mom(trackMom);
4350 Double_t dR = perpjetneg3mom.DeltaR(track3mom);
4354 outputlist->Add(track); // output list is jetPerpConeK0list
4356 sumPerpPt += track->Pt();
4362 // pay attention: this list contains the double amount of V0s, found in both cones
4363 // before using it, devide spectra by 2!!!
4364 sumPerpPt = sumPerpPt*0.5; //correct to do this?
4372 // _______________________________________________________________________________________________________________________________________________________
4374 Bool_t AliAnalysisTaskJetChem::MCLabelCheck(AliAODv0* v0, Int_t particletype,const AliAODTrack* trackNeg, const AliAODTrack* trackPos, TList *listmc, Int_t& negDaughterpdg, Int_t& posDaughterpdg, Int_t& motherType, Int_t& v0Label, Double_t& MCPt, Bool_t& fPhysicalPrimary, Int_t& MCv0PDGCode){
4376 TClonesArray *stackmc = 0x0;
4377 stackmc = (TClonesArray*)listmc->FindObject(AliAODMCParticle::StdBranchName()); //get MCAOD branch in data
4380 Printf("ERROR: stack not available");
4385 Int_t negAssLabel = TMath::Abs(trackNeg->GetLabel()); //negative (reconstructed) charged track label in MC stack
4386 Int_t posAssLabel = TMath::Abs(trackPos->GetLabel()); //positive (reconstructed) charged track label in MC stack
4388 //injected particle checks
4394 AliAODMCHeader *header=(AliAODMCHeader*)listmc->FindObject(AliAODMCHeader::StdBranchName());
4395 if(!header)return kFALSE;
4397 mcXv=header->GetVtxX(); mcYv=header->GetVtxY(); mcZv=header->GetVtxZ();
4399 Int_t trackinjected = IsTrackInjected(v0, header, stackmc); //requires AliAODTrack instead of AliVTrack
4401 if(trackinjected == 0){std::cout<<"HIJING track injected!!: "<<trackinjected<<std::endl;}
4405 if(negAssLabel>=0 && negAssLabel < stackmc->GetEntriesFast() && posAssLabel>=0 && posAssLabel < stackmc->GetEntriesFast()){//safety check if label has valid value of stack
4407 AliAODMCParticle *mcNegPart =(AliAODMCParticle*)stackmc->UncheckedAt(negAssLabel);//fetch the, with one MC truth track associated (reconstructed), negative charged track
4408 v0Label = mcNegPart->GetMother();// mother of negative charged particle is v0, get v0 label here
4409 negDaughterpdg = mcNegPart->GetPdgCode();
4410 AliAODMCParticle *mcPosPart =(AliAODMCParticle*)stackmc->UncheckedAt(posAssLabel);//fetch the, with one MC truth track associated (reconstructed), positive charged track
4411 Int_t v0PosLabel = mcPosPart->GetMother(); //get mother label of positive charged track label
4412 posDaughterpdg = mcPosPart->GetPdgCode();
4414 if(v0Label >= 0 && v0Label < stackmc->GetEntriesFast() && v0Label == v0PosLabel){//first v0 mc label check, then: check if both daughters are stemming from same particle
4416 AliAODMCParticle *mcv0 = (AliAODMCParticle *)stackmc->UncheckedAt(v0Label); //fetch MC ass. particle to v0 (mother of the both charged daughter tracks)
4418 //do not use anymore:
4419 //fPhysicalPrimary = mcv0->IsPhysicalPrimary();
4422 Float_t fDistPrimaryMax = 0.01; // [cm] max distance of production point to the primary vertex (criterion for choice of MC particles considered as primary)
4424 // Get the distance between production point of the MC mother particle and the primary vertex
4426 Double_t dx = mcXv-mcv0->Xv();//mc primary vertex - mc particle production vertex
4427 Double_t dy = mcYv-mcv0->Yv();
4428 Double_t dz = mcZv-mcv0->Zv();
4430 Float_t fDistPrimary = TMath::Sqrt(dx*dx + dy*dy + dz*dz);
4431 fPhysicalPrimary = kFALSE;//init
4433 fPhysicalPrimary = (fDistPrimary < fDistPrimaryMax);
4435 //if(fPhysicalPrimary == kTRUE){std::cout<<"hello*********!!!!!!!!!!!!! "<<std::endl;}
4436 //if(fPhysicalPrimary == kFALSE)return kFALSE;
4438 MCv0PDGCode = mcv0->GetPdgCode();
4440 //std::cout<<"MCv0PDGCode: "<<MCv0PDGCode<<std::endl;
4442 MCPt = mcv0->Pt();//for MC data, always use MC gen. pt for any pt distributions, also for the spectra, used for normalisation
4443 //for feed-down checks later
4445 Int_t motherLabel = mcv0->GetMother(); //get mother particle label of v0 particle
4446 // std::cout<<"motherLabel: "<<motherLabel<<std::endl;
4448 if(motherLabel >= 0 && v0Label < stackmc->GetEntriesFast()) //do safety check for mother label
4450 AliAODMCParticle *mcMother = (AliAODMCParticle *)stackmc->UncheckedAt(motherLabel); //get mother particle
4451 motherType = mcMother->GetPdgCode(); //get PDG code of mother
4454 Double_t XibarPt = 0.;
4456 if(particletype == kLambda){
4457 if((motherType == 3312)||(motherType == 3322)){ //if v0 mother is Xi0 or Xi- fill MC gen. pt in FD La histogram
4458 XiPt = mcMother->Pt();
4459 fh1MCXiPt->Fill(XiPt);
4462 if(particletype == kAntiLambda){
4463 if((motherType == -3312)||(motherType == -3322)){ //if v0 mother is Xibar0 or Xibar+ fill MC gen. pt in FD ALa histogram
4464 XibarPt = mcMother->Pt();
4465 fh1MCXibarPt->Fill(XibarPt);
4471 //pdg code checks etc..
4473 if(particletype == kK0){
4475 if(TMath::Abs(posDaughterpdg) != 211){return kFALSE;}//one or both of the daughters are not a pion
4476 if(TMath::Abs(negDaughterpdg) != 211){return kFALSE;}
4478 if(MCv0PDGCode != 310) {return kFALSE;}
4481 if(particletype == kLambda){
4482 if(MCv0PDGCode != 3122)return kFALSE;//if particle is not Antilambda, v0 is rejected
4483 if(posDaughterpdg != 2212)return kFALSE;
4484 if(negDaughterpdg != -211)return kFALSE; //pdg code check for Lambda daughters
4486 //{if((motherType == 3312)||(motherType == 3322)){continue;}//if Xi0 and Xi- is motherparticle of Lambda, particle is rejected, pay attention, most possible Xi-, Xi0 and Omega- are not distributed physically and are much more abundant than expected by physics //}
4489 if(particletype == kAntiLambda){
4490 if(MCv0PDGCode != -3122)return kFALSE;
4491 if(posDaughterpdg != 211)return kFALSE;
4492 if(negDaughterpdg !=-2212)return kFALSE; //pdg code check for Antilambda daughters
4495 //{if((motherType == -3312)||(motherType == -3322)){continue;}//if bar{Xi0} and Xi+ is motherparticle of Antilambda, particle is rejected
4499 return kTRUE; //check was successful
4500 }//end mc v0 label check
4501 }// end of stack label check
4506 return kFALSE; //check wasn't successful
4508 //________________________________________________________________________________________________________________________________________________________
4511 Bool_t AliAnalysisTaskJetChem::IsParticleMatching(const AliAODMCParticle* mcp0, const Int_t v0Label){
4513 const Int_t mcp0label = mcp0->GetLabel();
4515 if(v0Label == mcp0label)return kTRUE;
4520 //_______________________________________________________________________________________________________________________________________________________
4522 Bool_t AliAnalysisTaskJetChem::DaughterTrackCheck(AliAODv0* v0, Int_t& nnum, Int_t& pnum){
4525 if(v0->GetNDaughters() != 2) return kFALSE;//case v0 has more or less than 2 daughters, avoids seg. break at some AOD files //reason?
4528 // safety check of input parameters
4531 if(fDebug > 1){std::cout << std::endl
4532 << "Warning in AliAnalysisTaskJetChem::DaughterTrackCheck:" << std::endl
4533 << "v0 = " << v0 << std::endl;}
4539 //Daughters track check: its Luke Hanrattys method to check daughters charge
4545 AliAODTrack *ntracktest =(AliAODTrack*)(v0->GetDaughter(nnum));
4547 if(ntracktest == NULL)
4549 if(fDebug > 1){std::cout << std::endl
4550 << "Warning in AliAnalysisTaskJetChem::DaughterTrackCheck:" << std::endl
4551 << "ntracktest = " << ntracktest << std::endl;}
4556 if(ntracktest->Charge() > 0)
4562 const AliAODTrack *trackNeg=(AliAODTrack *)(v0->GetDaughter(nnum));
4563 const AliAODTrack *trackPos=(AliAODTrack *)(v0->GetDaughter(pnum));
4565 //Check if both tracks are available
4566 if (!trackPos || !trackNeg) {
4567 if(fDebug > 1) Printf("strange analysis::UserExec:: Error:Could not retrieve one of the daughter tracks\n");
4572 //remove like sign V0s
4573 if ( trackPos->Charge() == trackNeg->Charge() ){
4574 //if(fDebug>1) Printf("%s:%d found like-sign V0", (char*)__FILE__,__LINE__);
4582 //_______________________________________________________________________________________________________________________________________________________
4584 Int_t AliAnalysisTaskJetChem::IsTrackInjected(AliAODv0 *v0, AliAODMCHeader *header, TClonesArray *arrayMC){//info in TString should be available from 2011 data productions on..
4586 if(!v0){std::cout << " !part " << std::endl;return 1;}
4587 if(!header){std::cout << " !header " << std::endl;return 1;}
4588 if(!arrayMC){std::cout << " !arrayMC " << std::endl;return 1;}
4590 Int_t lab=v0->GetLabel();
4591 if(lab<0) {return 1;}
4592 TString bbb = GetGenerator(lab,header);
4595 // std::cout << " TString bbb: " << bbb << std::endl;
4597 // std::cout << " FIRST CALL " << bbb << std::endl;
4599 while(bbb.IsWhitespace()){
4600 AliAODMCParticle *mcpart= (AliAODMCParticle*)arrayMC->At(lab);
4601 if(!mcpart){return 1;}
4602 Int_t mother = mcpart->GetMother();
4604 bbb = GetGenerator(mother,header);
4605 std::cout << "Testing " << bbb << " " << std::endl;
4608 std::cout << " FINAL CALL " << bbb << std::endl;
4610 //std::transform(bbb.begin(), bbb.end(), bbb.begin(), ::tolower); //convert TString bbb into lower case, to avoid that TString could be written in lower or upper case
4612 if(bbb.Contains("ijing")){std::cout << " particle is injected!! " << std::endl; return 0;}//if TString returns something with "ijing" return this method with 0 -> select out all HIJING particles, all others return with "1"
4618 //______________________________________________________________________
4619 TString AliAnalysisTaskJetChem::GetGenerator(Int_t label, AliAODMCHeader* header){
4621 TList *lh=header->GetCocktailHeaders();
4622 Int_t nh=lh->GetEntries();
4623 for(Int_t i=0;i<nh;i++){
4624 AliGenEventHeader* gh=(AliGenEventHeader*)lh->At(i);
4625 TString genname=gh->GetName();
4626 Int_t npart=gh->NProduced();
4627 if(label>=nsumpart && label<(nsumpart+npart)) return genname;
4634 //_________________________________________________________________________________________________________________________________________
4635 Double_t AliAnalysisTaskJetChem::SmearJetPt(Double_t jetPt, Int_t /*cent*/, Double_t /*jetRadius*/, Double_t /*ptmintrack*/, Double_t& jetPtSmear){
4637 static TF1 fsmear("f1","[0]*exp(-1*(x-[1])*(x-[1])/(2*[2]*[2]))",-100.,100.); //smearing according to gaussian function in between +/- 10 GeV/c
4641 /* if(cent>10) cl = 2;
4646 fsmear.SetParameters(1,0,11.19);//for 2010 PbPb jets, R=0.4, ptmintrack = 0.15 GeV/c, cent 00-10%, delta-pt width estimated via single track embedding
4647 //fsmear->SetParameters(1,0,3.28);//for 2010 PbPb jets, R=0.4, ptmintrack = 0.15 GeV/c, cent 50-60%, delta-pt width estimated via single track embedding
4649 //fsmear->SetParameters(1,0,4.472208);// for 2010 PbPb jets, R=0.2, ptmintrack = 0.15 GeV/c, cent 00-10%
4651 /* //delta-pt width for anti-kt jet finder:
4654 if((cl == 1)&&(jetRadius == 0.4)&&(ptmintrack == 0.15)){
4655 fsmear->SetParameters(1,0,10.178069);//(max.,mean,sigma) of gaussian, needs to be adjusted for every combination of jet cone size, centrality and min. pt constituents cut
4657 if((cl == 2)&&(jetRadius == 0.4)&&(ptmintrack == 0.15)){
4658 fsmear->SetParameters(1,0,8.536195);
4660 if((cl == 3)&&(jetRadius == 0.4)&&(ptmintrack == 0.15)){
4661 fsmear->SetParameters(1,0,?);
4663 if((cl == 4)&&(jetRadius == 0.4)&&(ptmintrack == 0.15)){
4664 fsmear->SetParameters(1,0,5.229839);
4668 if((cl == 1)&&(jetRadius == 0.3)&&(ptmintrack == 0.15)){
4669 fsmear->SetParameters(1,0,7.145967);
4671 if((cl == 2)&&(jetRadius == 0.3)&&(ptmintrack == 0.15)){
4672 fsmear->SetParameters(1,0,5.844796);
4674 if((cl == 3)&&(jetRadius == 0.3)&&(ptmintrack == 0.15)){
4675 fsmear->SetParameters(1,0,?);
4677 if((cl == 4)&&(jetRadius == 0.3)&&(ptmintrack == 0.15)){
4678 fsmear->SetParameters(1,0,3.630751);
4682 if((cl == 1)&&(jetRadius == 0.2)&&(ptmintrack == 0.15)){
4683 fsmear->SetParameters(1,0,4.472208);
4685 if((cl == 2)&&(jetRadius == 0.2)&&(ptmintrack == 0.15)){
4686 fsmear->SetParameters(1,0,3.543938);
4688 if((cl == 3)&&(jetRadius == 0.2)&&(ptmintrack == 0.15)){
4689 fsmear->SetParameters(1,0,?);
4691 if((cl == 4)&&(jetRadius == 0.2)&&(ptmintrack == 0.15)){
4692 fsmear->SetParameters(1,0,1.037476);
4697 Double_t r = fsmear.GetRandom();
4698 jetPtSmear = jetPt + r;
4700 // std::cout<<"jetPt: "<<jetPt<<std::endl;
4701 // std::cout<<"jetPtSmear: "<<jetPtSmear<<std::endl;
4702 // std::cout<<"r: "<<r<<std::endl;
4709 // _______________________________________________________________________________________________________________________
4710 AliAODJet* AliAnalysisTaskJetChem::GetMedianCluster()
4712 // fill tracks from bckgCluster branch,
4713 // using cluster with median density (odd number of clusters)
4714 // or picking randomly one of the two closest to median (even number)
4716 Int_t nBckgClusters = fBckgJetsRec->GetEntries(); // not 'recCuts': use all clusters in full eta range
4718 if(nBckgClusters<3) return 0; // need at least 3 clusters (skipping 2 highest)
4720 Double_t* bgrDensity = new Double_t[nBckgClusters];
4721 Int_t* indices = new Int_t[nBckgClusters];
4723 for(Int_t ij=0; ij<nBckgClusters; ++ij){
4725 AliAODJet* bgrCluster = (AliAODJet*)(fBckgJetsRec->At(ij));
4726 Double_t clusterPt = bgrCluster->Pt();
4727 Double_t area = bgrCluster->EffectiveAreaCharged();
4729 Double_t density = 0;
4730 if(area>0) density = clusterPt/area;
4732 bgrDensity[ij] = density;
4736 TMath::Sort(nBckgClusters, bgrDensity, indices);
4738 // get median cluster
4740 AliAODJet* medianCluster = 0;
4741 Double_t medianDensity = 0;
4743 if(TMath::Odd(nBckgClusters)){
4745 //Int_t medianIndex = indices[(Int_t) (0.5*(nBckgClusters-1))];
4746 Int_t medianIndex = indices[(Int_t) (0.5*(nBckgClusters+1))];
4748 medianCluster = (AliAODJet*)(fBckgJetsRec->At(medianIndex));
4750 Double_t clusterPt = medianCluster->Pt();
4751 Double_t area = medianCluster->EffectiveAreaCharged();
4753 if(area>0) medianDensity = clusterPt/area;
4757 //Int_t medianIndex1 = indices[(Int_t) (0.5*nBckgClusters-1)];
4758 //Int_t medianIndex2 = indices[(Int_t) (0.5*nBckgClusters)];
4760 Int_t medianIndex1 = indices[(Int_t) (0.5*nBckgClusters)];
4761 Int_t medianIndex2 = indices[(Int_t) (0.5*nBckgClusters+1)];
4763 AliAODJet* medianCluster1 = (AliAODJet*)(fBckgJetsRec->At(medianIndex1));
4764 AliAODJet* medianCluster2 = (AliAODJet*)(fBckgJetsRec->At(medianIndex2));
4766 Double_t density1 = 0;
4767 Double_t clusterPt1 = medianCluster1->Pt();
4768 Double_t area1 = medianCluster1->EffectiveAreaCharged();
4769 if(area1>0) density1 = clusterPt1/area1;
4771 Double_t density2 = 0;
4772 Double_t clusterPt2 = medianCluster2->Pt();
4773 Double_t area2 = medianCluster2->EffectiveAreaCharged();
4774 if(area2>0) density2 = clusterPt2/area2;
4776 medianDensity = 0.5*(density1+density2);
4778 medianCluster = ( (gRandom->Rndm()>0.5) ? medianCluster1 : medianCluster2 ); // select one randomly to avoid adding areas
4781 delete[] bgrDensity;
4784 return medianCluster;