1 /**************************************************************************
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appeuear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
20 // Lc->pK0s analysis code
23 // Output: TTree or THnSparse (mass vs pT vs Centrality)
26 // TTree: very loose cut
27 // THnSparse: One THnSparse is created per cut. One cut is specified by
28 // an array of bits, each bit corresponds to a cut in "Cut" function.
29 // Use "AddCutStream" function to add a cut.
31 //-------------------------------------------------------------------------
33 // Authors: Y.S Watanabe(a)
34 // (a) CNS, the University of Tokyo
35 // Contatcs: wyosuke@cns.s.u-tokyo.ac.jp
36 //-------------------------------------------------------------------------
39 #include <TParticle.h>
40 #include <TParticlePDG.h>
44 #include <THnSparse.h>
45 #include <TLorentzVector.h>
48 #include <TDatabasePDG.h>
49 #include <AliAnalysisDataSlot.h>
50 #include <AliAnalysisDataContainer.h>
52 #include "AliMCEvent.h"
53 #include "AliAnalysisManager.h"
54 #include "AliAODMCHeader.h"
55 #include "AliAODHandler.h"
57 #include "AliExternalTrackParam.h"
58 #include "AliAODVertex.h"
59 #include "AliESDVertex.h"
60 #include "AliAODRecoDecay.h"
61 #include "AliAODRecoDecayHF.h"
62 #include "AliAODRecoCascadeHF.h"
63 #include "AliESDtrack.h"
64 #include "AliAODTrack.h"
66 #include "AliAODcascade.h"
67 #include "AliAODMCParticle.h"
68 #include "AliAnalysisTaskSE.h"
69 #include "AliAnalysisTaskSELc2pK0sfromAODtracks.h"
70 #include "AliPIDResponse.h"
71 #include "AliPIDCombined.h"
72 #include "AliTOFPIDResponse.h"
73 #include "AliAODPidHF.h"
74 #include "AliInputEventHandler.h"
75 #include "AliESDtrackCuts.h"
76 #include "AliNeutralTrackParam.h"
77 #include "AliKFParticle.h"
78 #include "AliKFVertex.h"
79 #include "AliExternalTrackParam.h"
80 #include "AliESDtrack.h"
81 #include "AliCentrality.h"
82 #include "AliVertexerTracks.h"
87 ClassImp(AliAnalysisTaskSELc2pK0sfromAODtracks)
89 //__________________________________________________________________________
90 AliAnalysisTaskSELc2pK0sfromAODtracks::AliAnalysisTaskSELc2pK0sfromAODtracks() :
101 fIsEventSelected(kFALSE),
102 fWriteVariableTree(kFALSE),
112 fCandidateVariables(),
125 fHistoDecayLength(0),
129 // Default Constructor.
133 //___________________________________________________________________________
134 AliAnalysisTaskSELc2pK0sfromAODtracks::AliAnalysisTaskSELc2pK0sfromAODtracks(const Char_t* name,
135 AliRDHFCutsLctopK0sfromAODtracks* prodCuts,
136 AliRDHFCutsLctopK0sfromAODtracks* analCuts,
137 Bool_t writeVariableTree) :
138 AliAnalysisTaskSE(name),
148 fIsEventSelected(kFALSE),
149 fWriteVariableTree(writeVariableTree),
159 fCandidateVariables(),
172 fHistoDecayLength(0),
176 // Constructor. Initialization of Inputs and Outputs
178 Info("AliAnalysisTaskSELc2pK0sfromAODtracks","Calling Constructor");
180 DefineOutput(1,TList::Class()); //conters
181 DefineOutput(2,TList::Class());
182 if(writeVariableTree){
183 DefineOutput(3,TTree::Class()); //My private output
185 DefineOutput(3,TList::Class()); //conters
189 //___________________________________________________________________________
190 AliAnalysisTaskSELc2pK0sfromAODtracks::~AliAnalysisTaskSELc2pK0sfromAODtracks() {
194 Info("~AliAnalysisTaskSELc2pK0sfromAODtracks","Calling Destructor");
222 if (fVariablesTree) {
223 delete fVariablesTree;
229 //_________________________________________________
230 void AliAnalysisTaskSELc2pK0sfromAODtracks::Init() {
236 fIsEventSelected=kFALSE;
238 if (fDebug > 1) AliInfo("Init");
240 fListCuts = new TList();
241 fListCuts->SetOwner();
242 fListCuts->SetName("ListCuts");
243 fListCuts->Add(new AliRDHFCutsLctopK0sfromAODtracks(*fProdCuts));
244 fListCuts->Add(new AliRDHFCutsLctopK0sfromAODtracks(*fAnalCuts));
245 PostData(2,fListCuts);
250 //_________________________________________________
251 void AliAnalysisTaskSELc2pK0sfromAODtracks::UserExec(Option_t *)
258 AliError("NO EVENT FOUND!");
261 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
265 //------------------------------------------------
266 // First check if the event has proper vertex and B
267 //------------------------------------------------
269 fVtx1 = (AliAODVertex*)aodEvent->GetPrimaryVertex();
272 Double_t pos[3],cov[6];
274 fVtx1->GetCovarianceMatrix(cov);
275 fV1 = new AliESDVertex(pos,cov,100.,100,fVtx1->GetName());
277 fBzkG = (Double_t)aodEvent->GetMagneticField();
278 AliKFParticle::SetField(fBzkG);
279 if (TMath::Abs(fBzkG)<0.001) {
285 //------------------------------------------------
286 // Event selection setting
287 //------------------------------------------------
289 fAnalCuts->SetTriggerClass("");
291 if ( !fUseMCInfo && fIspp) {
292 fAnalCuts->SetUsePhysicsSelection(kTRUE);
293 fAnalCuts->SetTriggerClass("");
294 fAnalCuts->SetTriggerMask(AliVEvent::kMB);
297 if ( !fUseMCInfo && fIspA) {
298 fAnalCuts->SetUsePhysicsSelection(kTRUE);
299 fAnalCuts->SetTriggerClass("");
300 fAnalCuts->SetTriggerMask(AliVEvent::kINT7);
302 if ( !fUseMCInfo && fIsAA) {
303 fAnalCuts->SetUsePhysicsSelection(kTRUE);
304 fAnalCuts->SetTriggerClass("");
305 fAnalCuts->SetTriggerMask(AliVEvent::kMB | AliVEvent::kSemiCentral | AliVEvent::kCentral);
308 //------------------------------------------------
310 //------------------------------------------------
311 Bool_t fIsTriggerNotOK = fAnalCuts->IsEventRejectedDueToTrigger();
312 if(!fIsTriggerNotOK) fCEvents->Fill(3);
313 fIsEventSelected = fAnalCuts->IsEventSelected(aodEvent); // better to initialize before CheckEventSelection call
314 if(!fIsEventSelected) {
320 fIsMB=(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected()&AliVEvent::kMB)==(AliVEvent::kMB);
321 fIsSemi=(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected()&AliVEvent::kSemiCentral)==(AliVEvent::kSemiCentral);
322 fIsCent=(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected()&AliVEvent::kCentral)==(AliVEvent::kCentral);
323 fIsINT7=(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected()&AliVEvent::kINT7)==(AliVEvent::kINT7);
324 fIsEMC7=(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected()&AliVEvent::kEMC7)==(AliVEvent::kEMC7);
325 fTriggerCheck = fIsMB+2*fIsSemi+4*fIsCent+8*fIsINT7+16*fIsEMC7;
326 if(fIsMB) fHTrigger->Fill(1);
327 if(fIsSemi) fHTrigger->Fill(2);
328 if(fIsCent) fHTrigger->Fill(3);
329 if(fIsINT7) fHTrigger->Fill(4);
330 if(fIsEMC7) fHTrigger->Fill(5);
331 if(fIsMB|fIsSemi|fIsCent) fHTrigger->Fill(7);
332 if(fIsINT7|fIsEMC7) fHTrigger->Fill(8);
333 if(fIsMB&fIsSemi) fHTrigger->Fill(10);
334 if(fIsMB&fIsCent) fHTrigger->Fill(11);
335 if(fIsINT7&fIsEMC7) fHTrigger->Fill(12);
337 if ( !fUseMCInfo && (fIsAA || fIspA)) {
338 AliCentrality *cent = aodEvent->GetCentrality();
339 fCentrality = cent->GetCentralityPercentile("V0M");
341 fHCentrality->Fill(fCentrality);
343 //------------------------------------------------
344 // Check if the event has v0 candidate
345 //------------------------------------------------
346 //Int_t nv0 = aodEvent->GetNumberOfV0s();
349 //------------------------------------------------
350 // MC analysis setting
351 //------------------------------------------------
352 // TClonesArray *mcArray = 0;
353 // AliAODMCHeader *mcHeader=0;
355 // // MC array need for maching
356 // mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
358 // AliError("Could not find Monte-Carlo in AOD");
361 // fCEvents->Fill(6); // in case of MC events
364 // mcHeader = (AliAODMCHeader*)aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName());
366 // AliError("AliAnalysisTaskSELc2pK0sfromAODtracks::UserExec: MC header branch not found!\n");
369 // fCEvents->Fill(7); // in case of MC events
371 // Double_t zMCVertex = mcHeader->GetVtxZ();
372 // if (TMath::Abs(zMCVertex) > fAnalCuts->GetMaxVtxZ()) {
373 // AliDebug(2,Form("Event rejected: abs(zVtxMC)=%f > fAnalCuts->GetMaxVtxZ()=%f",zMCVertex,fAnalCuts->GetMaxVtxZ()));
376 // fCEvents->Fill(17); // in case of MC events
380 //------------------------------------------------
381 // Main analysis done in this function
382 //------------------------------------------------
383 MakeAnalysis(aodEvent);
387 if(fWriteVariableTree){
388 PostData(3,fVariablesTree);
390 PostData(3,fOutputAll);
393 fIsEventSelected=kFALSE;
399 //________________________________________ terminate ___________________________
400 void AliAnalysisTaskSELc2pK0sfromAODtracks::Terminate(Option_t*)
402 // The Terminate() function is the last function to be called during
403 // a query. It always runs on the client, it can be used to present
404 // the results graphically or save the results to file.
406 //AliInfo("Terminate","");
407 AliAnalysisTaskSE::Terminate();
409 fOutput = dynamic_cast<TList*> (GetOutputData(1));
411 AliError("fOutput not available");
415 if(!fWriteVariableTree){
416 fOutputAll = dynamic_cast<TList*> (GetOutputData(3));
418 AliError("fOutputAll not available");
426 //___________________________________________________________________________
427 void AliAnalysisTaskSELc2pK0sfromAODtracks::UserCreateOutputObjects()
430 // UserCreateOutputObject
432 //AliInfo(Form("CreateOutputObjects of task %s\n", GetName()));
434 //------------------------------------------------
435 // output object setting
436 //------------------------------------------------
437 fOutput = new TList();
439 fOutput->SetName("chist0");
440 DefineGeneralHistograms(); // define general histograms
443 DefineTreeVariables();
444 if (fWriteVariableTree) {
445 PostData(3,fVariablesTree);
447 fOutputAll = new TList();
448 fOutputAll->SetOwner();
449 fOutputAll->SetName("anahisto");
450 DefineAnalysisHistograms(); // define general histograms
451 PostData(3,fOutputAll);
458 //-------------------------------------------------------------------------------
459 void AliAnalysisTaskSELc2pK0sfromAODtracks::MakeAnalysis
461 AliAODEvent *aodEvent
465 // Main Analysis part
468 Int_t nV0s= aodEvent->GetNumberOfV0s();
472 Int_t nTracks= aodEvent->GetNumberOfTracks();
477 //------------------------------------------------
479 //------------------------------------------------
480 for (Int_t iv0 = 0; iv0<nV0s; iv0++) {
481 AliAODv0 *v0 = aodEvent->GetV0(iv0);
483 if(!fProdCuts->SingleV0Cuts(v0,fVtx1)) continue;
485 AliAODTrack *cptrack = (AliAODTrack*)(v0->GetDaughter(0));
486 AliAODTrack *cntrack = (AliAODTrack*)(v0->GetDaughter(1));
488 //------------------------------------------------
490 //------------------------------------------------
491 for (Int_t itrk = 0; itrk<nTracks; itrk++) {
492 AliAODTrack *trk = (AliAODTrack*)aodEvent->GetTrack(itrk);
493 if(trk->GetID()<0) continue;
494 if(!fProdCuts->SingleTrkCuts(trk)) continue;
496 Int_t cpid = cptrack->GetID();
497 Int_t cnid = cntrack->GetID();
498 Int_t lpid = trk->GetID();
499 if((cpid==lpid)||(cnid==lpid)) continue;
501 if(!fProdCuts->SelectWithRoughCuts(v0,trk)) continue;
503 AliAODVertex *secVert = ReconstructSecondaryVertex(v0,trk,aodEvent);
504 if(!secVert) continue;
506 AliAODRecoCascadeHF *lcobj = MakeCascadeHF(v0,trk,aodEvent,secVert);
511 FillROOTObjects(lcobj);
513 lcobj->GetSecondaryVtx()->RemoveDaughters();
514 lcobj->UnsetOwnPrimaryVtx();
515 delete lcobj;lcobj=NULL;
522 ////-------------------------------------------------------------------------------
523 void AliAnalysisTaskSELc2pK0sfromAODtracks::FillROOTObjects(AliAODRecoCascadeHF *lcobj)
526 // Fill histograms or tree depending on fWriteVariableTree
529 AliAODTrack *trk = lcobj->GetBachelor();
530 AliAODv0 *v0 = lcobj->Getv0();
532 fCandidateVariables[ 0] = lcobj->InvMassLctoK0sP();
533 fCandidateVariables[ 1] = lcobj->Px();
534 fCandidateVariables[ 2] = lcobj->Py();
535 fCandidateVariables[ 3] = lcobj->Pz();
536 fCandidateVariables[ 4] = v0->MassK0Short();
537 fCandidateVariables[ 5] = lcobj->PxProng(0);
538 fCandidateVariables[ 6] = lcobj->PyProng(0);
539 fCandidateVariables[ 7] = lcobj->PzProng(0);
540 fCandidateVariables[ 8] = lcobj->PxProng(1);
541 fCandidateVariables[ 9] = lcobj->PyProng(1);
542 fCandidateVariables[10] = lcobj->PzProng(1);
543 fCandidateVariables[11] = fVtx1->GetX();
544 fCandidateVariables[12] = fVtx1->GetY();
545 fCandidateVariables[13] = fVtx1->GetZ();
546 fCandidateVariables[14] = fCentrality;
547 fCandidateVariables[15] = lcobj->DecayLengthXY();
549 Double_t nSigmaTPCpr=-9999.;
550 Double_t nSigmaTOFpr=-9999.;
551 Double_t probProton=-9999.;
552 if(fAnalCuts->GetIsUsePID())
554 fAnalCuts->GetPidHF()->GetnSigmaTPC(trk,4,nSigmaTPCpr);
555 fAnalCuts->GetPidHF()->GetnSigmaTOF(trk,4,nSigmaTOFpr);
556 probProton = fAnalCuts->GetProtonProbabilityTPCTOF(trk);
557 fCandidateVariables[16] = nSigmaTPCpr;
558 fCandidateVariables[17] = nSigmaTOFpr;
559 fCandidateVariables[18] = probProton;
562 if(fWriteVariableTree)
563 fVariablesTree->Fill();
565 for(Int_t ic=0;ic < fAnalCuts->GetNCutsArray(); ic++)
567 fAnalCuts->SetCutsFromArray(ic);
568 if(fAnalCuts->IsSelected(lcobj,AliRDHFCuts::kCandidate))
571 cont[0] = lcobj->InvMassLctoK0sP();
572 cont[1] = lcobj->Pt();
573 cont[2] = fCentrality;
574 fHistoLcK0SpMass[ic]->Fill(cont);
577 fHistoBachPt->Fill(trk->Pt());
578 fHistod0Bach->Fill(lcobj->Getd0Prong(0));
579 fHistod0V0->Fill(lcobj->Getd0Prong(1));
580 fHistod0d0->Fill(lcobj->Getd0Prong(0)*lcobj->Getd0Prong(1));
581 fHistoV0CosPA->Fill(lcobj->CosV0PointingAngle());
582 fHistoProbProton->Fill(probProton);
583 fHistoDecayLength->Fill(lcobj->DecayLengthXY());
584 fHistoK0SMass->Fill(v0->MassK0Short());
589 ////-------------------------------------------------------------------------------
590 void AliAnalysisTaskSELc2pK0sfromAODtracks::DefineTreeVariables()
593 // Define tree variables
596 const char* nameoutput = GetOutputSlot(3)->GetContainer()->GetName();
597 fVariablesTree = new TTree(nameoutput,"Candidates variables tree");
599 fCandidateVariables = new Float_t [nVar];
600 TString * fCandidateVariableNames = new TString[nVar];
602 fCandidateVariableNames[ 0]="InvMassLc2pK0s";
603 fCandidateVariableNames[ 1]="LcPx";
604 fCandidateVariableNames[ 2]="LcPy";
605 fCandidateVariableNames[ 3]="LcPz";
606 fCandidateVariableNames[ 4]="massK0Short";
607 fCandidateVariableNames[ 5]="V0Px";
608 fCandidateVariableNames[ 6]="V0Py";
609 fCandidateVariableNames[ 7]="V0Pz";
610 fCandidateVariableNames[ 8]="BachPx";
611 fCandidateVariableNames[ 9]="BachPy";
612 fCandidateVariableNames[10]="BachPz";
613 fCandidateVariableNames[11]="PrimVertx";
614 fCandidateVariableNames[12]="PrimVerty";
615 fCandidateVariableNames[13]="PrimVertz";
616 fCandidateVariableNames[14]="Centrality";
617 fCandidateVariableNames[15]="DecayLengthXY";
618 fCandidateVariableNames[16]="nSigmaTPCpr";
619 fCandidateVariableNames[17]="nSigmaTOFpr";
620 fCandidateVariableNames[18]="probProton";
622 for (Int_t ivar=0; ivar<nVar; ivar++) {
623 fVariablesTree->Branch(fCandidateVariableNames[ivar].Data(),&fCandidateVariables[ivar],Form("%s/f",fCandidateVariableNames[ivar].Data()));
629 ////__________________________________________________________________________
630 void AliAnalysisTaskSELc2pK0sfromAODtracks::DefineGeneralHistograms() {
632 // This is to define general histograms
635 fCEvents = new TH1F("fCEvents","conter",18,-0.5,17.5);
636 fCEvents->SetStats(kTRUE);
637 fCEvents->GetXaxis()->SetBinLabel(1,"X1");
638 fCEvents->GetXaxis()->SetBinLabel(2,"Analyzed events");
639 fCEvents->GetXaxis()->SetBinLabel(3,"AliAODVertex exists");
640 fCEvents->GetXaxis()->SetBinLabel(4,"TriggerOK");
641 fCEvents->GetXaxis()->SetBinLabel(5,"IsEventSelected");
642 fCEvents->GetXaxis()->SetBinLabel(6,"CascadesHF exists");
643 fCEvents->GetXaxis()->SetBinLabel(7,"MCarray exists");
644 fCEvents->GetXaxis()->SetBinLabel(8,"MCheader exists");
645 fCEvents->GetXaxis()->SetBinLabel(9,"triggerClass!=CINT1");
646 fCEvents->GetXaxis()->SetBinLabel(10,"triggerMask!=kAnyINT");
647 fCEvents->GetXaxis()->SetBinLabel(11,"triggerMask!=kAny");
648 fCEvents->GetXaxis()->SetBinLabel(12,"vtxTitle.Contains(Z)");
649 fCEvents->GetXaxis()->SetBinLabel(13,"vtxTitle.Contains(3D)");
650 fCEvents->GetXaxis()->SetBinLabel(14,"vtxTitle.Doesn'tContain(Z-3D)");
651 fCEvents->GetXaxis()->SetBinLabel(15,Form("zVtx<=%2.0fcm",fAnalCuts->GetMaxVtxZ()));
652 fCEvents->GetXaxis()->SetBinLabel(16,"!IsEventSelected");
653 fCEvents->GetXaxis()->SetBinLabel(17,"triggerMask!=kAnyINT || triggerClass!=CINT1");
654 fCEvents->GetXaxis()->SetBinLabel(18,Form("zVtxMC<=%2.0fcm",fAnalCuts->GetMaxVtxZ()));
655 //fCEvents->GetXaxis()->SetTitle("");
656 fCEvents->GetYaxis()->SetTitle("counts");
658 fHTrigger = new TH1F("fHTrigger","counter",18,-0.5,17.5);
659 fHTrigger->SetStats(kTRUE);
660 fHTrigger->GetXaxis()->SetBinLabel(1,"X1");
661 fHTrigger->GetXaxis()->SetBinLabel(2,"kMB");
662 fHTrigger->GetXaxis()->SetBinLabel(3,"kSemiCentral");
663 fHTrigger->GetXaxis()->SetBinLabel(4,"kCentral");
664 fHTrigger->GetXaxis()->SetBinLabel(5,"kINT7");
665 fHTrigger->GetXaxis()->SetBinLabel(6,"kEMC7");
666 //fHTrigger->GetXaxis()->SetBinLabel(7,"Space");
667 fHTrigger->GetXaxis()->SetBinLabel(8,"kMB|kSemiCentral|kCentral");
668 fHTrigger->GetXaxis()->SetBinLabel(9,"kINT7|kEMC7");
669 fHTrigger->GetXaxis()->SetBinLabel(11,"kMB&kSemiCentral");
670 fHTrigger->GetXaxis()->SetBinLabel(12,"kMB&kCentral");
671 fHTrigger->GetXaxis()->SetBinLabel(13,"kINT7&kEMC7");
673 fHCentrality = new TH1F("fHCentrality","conter",100,0.,100.);
675 fOutput->Add(fCEvents);
676 fOutput->Add(fHTrigger);
677 fOutput->Add(fHCentrality);
681 //__________________________________________________________________________
682 void AliAnalysisTaskSELc2pK0sfromAODtracks::DefineAnalysisHistograms()
685 // Define analyis histograms
688 //------------------------------------------------
690 //------------------------------------------------
691 Int_t bins_base[3]= {80 ,20 ,10};
692 Double_t xmin_base[3]={2.286-0.2,0 ,0.00};
693 Double_t xmax_base[3]={2.286+0.2,20. ,100};
695 for(Int_t i=0;i<fAnalCuts->GetNCutsArray();i++)
697 fHistoLcK0SpMass.push_back(new THnSparseF(Form("fHistoLcK0SpMass_Cut%d",i),Form("Cut%d",i),3,bins_base,xmin_base,xmax_base));
698 fOutputAll->Add(fHistoLcK0SpMass[i]);
701 //------------------------------------------------
702 // checking histograms
703 //------------------------------------------------
704 fHistoBachPt = new TH1F("fHistoBachPt","Bachelor p_{T}",100,0.0,5.0);
705 fOutputAll->Add(fHistoBachPt);
706 fHistod0Bach = new TH1F("fHistod0Bach","Bachelor d_{0}",100,-0.5,0.5);
707 fOutputAll->Add(fHistod0Bach);
708 fHistod0V0 = new TH1F("fHistod0V0","V_{0} d_{0}",100,-0.5,0.5);
709 fOutputAll->Add(fHistod0V0);
710 fHistod0d0 = new TH1F("fHistod0d0","d_{0} d_{0}",100,-0.5,0.5);
711 fOutputAll->Add(fHistod0d0);
712 fHistoV0CosPA=new TH1F("fHistoV0CosPA","V0->Second vertex cospa",100,-1.,1.0);
713 fOutputAll->Add(fHistoV0CosPA);
714 fHistoProbProton=new TH1F("fHistoProbProton","ProbProton",100,0.,1.0);
715 fOutputAll->Add(fHistoProbProton);
716 fHistoDecayLength=new TH1F("fHistoDecayLength","Decay Length",100,-0.1,0.1);
717 fOutputAll->Add(fHistoDecayLength);
718 fHistoK0SMass=new TH1F("fHistoK0SMass","K0S mass",100,0.497-0.05,0.497+0.05);
719 fOutputAll->Add(fHistoK0SMass);
724 //________________________________________________________________________
725 AliAODRecoCascadeHF* AliAnalysisTaskSELc2pK0sfromAODtracks::MakeCascadeHF(AliAODv0 *v0, AliAODTrack *part, AliAODEvent * aod, AliAODVertex *secVert)
728 // Create AliAODRecoCascadeHF object from the argument
732 if(!part) return 0x0;
735 //------------------------------------------------
737 //------------------------------------------------
738 AliAODVertex *primVertexAOD;
739 Bool_t unsetvtx = kFALSE;
741 primVertexAOD = CallPrimaryVertex(v0,part,aod);
743 primVertexAOD = fVtx1;
748 primVertexAOD = fVtx1;
750 if(!primVertexAOD) return 0x0;
751 Double_t posprim[3]; primVertexAOD->GetXYZ(posprim);
753 //------------------------------------------------
754 // DCA between tracks
755 //------------------------------------------------
756 AliESDtrack *esdtrack = new AliESDtrack((AliVTrack*)part);
758 AliNeutralTrackParam *trackV0=NULL;
759 const AliVTrack *trackVV0 = dynamic_cast<const AliVTrack*>(v0);
760 if(trackVV0) trackV0 = new AliNeutralTrackParam(trackVV0);
762 Double_t xdummy, ydummy;
763 Double_t dca = esdtrack->GetDCA(trackV0,fBzkG,xdummy,ydummy);
766 //------------------------------------------------
767 // Propagate all tracks to the secondary vertex and calculate momentum there
768 //------------------------------------------------
770 Double_t d0z0bach[2],covd0z0bach[3];
771 if(sqrt(pow(secVert->GetX(),2)+pow(secVert->GetY(),2))<1.){
772 part->PropagateToDCA(secVert,fBzkG,kVeryBig,d0z0bach,covd0z0bach);
773 trackV0->PropagateToDCA(secVert,fBzkG,kVeryBig);
775 part->PropagateToDCA(primVertexAOD,fBzkG,kVeryBig,d0z0bach,covd0z0bach);
776 trackV0->PropagateToDCA(primVertexAOD,fBzkG,kVeryBig);
778 Double_t momv0_new[3]={-9999,-9999,-9999.};
779 trackV0->GetPxPyPz(momv0_new);
781 Double_t px[2],py[2],pz[2];
782 px[0] = part->Px(); py[0] = part->Py(); pz[0] = part->Pz();
783 px[1] = momv0_new[0]; py[1] = momv0_new[1]; pz[1] = momv0_new[2];
785 //------------------------------------------------
787 //------------------------------------------------
788 Double_t d0[3],d0err[3];
790 part->PropagateToDCA(primVertexAOD,fBzkG,kVeryBig,d0z0bach,covd0z0bach);
792 d0err[0] = TMath::Sqrt(covd0z0bach[0]);
794 Double_t d0z0v0[2],covd0z0v0[3];
795 trackV0->PropagateToDCA(primVertexAOD,fBzkG,kVeryBig,d0z0v0,covd0z0v0);
797 d0err[1] = TMath::Sqrt(covd0z0v0[0]);
799 //------------------------------------------------
800 // Create AliAODRecoCascadeHF
801 //------------------------------------------------
802 Short_t charge = part->Charge();
803 AliAODRecoCascadeHF *theCascade = new AliAODRecoCascadeHF(secVert,charge,px,py,pz,d0,d0err,dca);
806 if(unsetvtx) delete primVertexAOD; primVertexAOD=NULL;
807 if(esdtrack) delete esdtrack;
808 if(trackV0) delete trackV0;
811 theCascade->SetOwnPrimaryVtx(primVertexAOD);
812 UShort_t id[2]={(UShort_t)part->GetID(),(UShort_t)trackV0->GetID()};
813 theCascade->SetProngIDs(2,id);
815 theCascade->GetSecondaryVtx()->AddDaughter(part);
816 theCascade->GetSecondaryVtx()->AddDaughter(v0);
818 if(unsetvtx) delete primVertexAOD; primVertexAOD=NULL;
819 if(esdtrack) delete esdtrack;
820 if(trackV0) delete trackV0;
825 //________________________________________________________________________
826 AliAODVertex* AliAnalysisTaskSELc2pK0sfromAODtracks::CallPrimaryVertex(AliAODv0 *v0, AliAODTrack *trk, AliAODEvent* aod)
829 // Make an array of tracks which should not be used in primary vertex calculation and
830 // Call PrimaryVertex function
833 TObjArray *TrackArray = new TObjArray(3);
835 AliESDtrack *cptrk1 = new AliESDtrack((AliVTrack*)trk);
836 TrackArray->AddAt(cptrk1,0);
838 AliESDtrack *cascptrack = new AliESDtrack((AliVTrack*)v0->GetDaughter(0));
839 TrackArray->AddAt(cascptrack,1);
840 AliESDtrack *cascntrack = new AliESDtrack((AliVTrack*)v0->GetDaughter(1));
841 TrackArray->AddAt(cascntrack,2);
843 AliAODVertex *newvert = PrimaryVertex(TrackArray,aod);
845 for(Int_t i=0;i<3;i++)
847 AliESDtrack *tesd = (AliESDtrack*)TrackArray->UncheckedAt(i);
856 //________________________________________________________________________
857 AliAODVertex* AliAnalysisTaskSELc2pK0sfromAODtracks::PrimaryVertex(const TObjArray *trkArray,
862 //copied from AliAnalysisVertexingHF (except for the following 3 lines)
865 Bool_t fRecoPrimVtxSkippingTrks = kTRUE;
866 Bool_t fRmTrksFromPrimVtx = kFALSE;
868 AliESDVertex *vertexESD = 0;
869 AliAODVertex *vertexAOD = 0;
871 //vertexESD = new AliESDVertex(*fV1);
874 if(!fRecoPrimVtxSkippingTrks && !fRmTrksFromPrimVtx) {
875 // primary vertex from the input event
877 vertexESD = new AliESDVertex(*fV1);
880 // primary vertex specific to this candidate
882 Int_t nTrks = trkArray->GetEntriesFast();
883 AliVertexerTracks *vertexer = new AliVertexerTracks(event->GetMagneticField());
885 if(fRecoPrimVtxSkippingTrks) {
886 // recalculating the vertex
888 if(strstr(fV1->GetTitle(),"VertexerTracksWithConstraint")) {
889 Float_t diamondcovxy[3];
890 event->GetDiamondCovXY(diamondcovxy);
891 Double_t pos[3]={event->GetDiamondX(),event->GetDiamondY(),0.};
892 Double_t cov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,10.*10.};
893 AliESDVertex *diamond = new AliESDVertex(pos,cov,1.,1);
894 vertexer->SetVtxStart(diamond);
895 delete diamond; diamond=NULL;
896 if(strstr(fV1->GetTitle(),"VertexerTracksWithConstraintOnlyFitter"))
897 vertexer->SetOnlyFitter();
900 Int_t nTrksToSkip=0,id;
901 AliExternalTrackParam *t = 0;
902 for(Int_t i=0; i<nTrks; i++) {
903 t = (AliExternalTrackParam*)trkArray->UncheckedAt(i);
904 id = (Int_t)t->GetID();
906 skipped[nTrksToSkip++] = id;
909 // For AOD, skip also tracks without covariance matrix
910 Double_t covtest[21];
911 for(Int_t j=0; j<event->GetNumberOfTracks(); j++) {
912 AliVTrack *vtrack = (AliVTrack*)event->GetTrack(j);
913 if(!vtrack->GetCovarianceXYZPxPyPz(covtest)) {
914 id = (Int_t)vtrack->GetID();
916 skipped[nTrksToSkip++] = id;
919 for(Int_t ijk=nTrksToSkip; ijk<1000; ijk++) skipped[ijk]=-1;
921 vertexer->SetSkipTracks(nTrksToSkip,skipped);
922 vertexESD = (AliESDVertex*)vertexer->FindPrimaryVertex(event);
924 } else if(fRmTrksFromPrimVtx && nTrks>0) {
925 // removing the prongs tracks
927 TObjArray rmArray(nTrks);
928 UShort_t *rmId = new UShort_t[nTrks];
929 AliESDtrack *esdTrack = 0;
931 for(Int_t i=0; i<nTrks; i++) {
932 t = (AliESDtrack*)trkArray->UncheckedAt(i);
933 esdTrack = new AliESDtrack(*t);
934 rmArray.AddLast(esdTrack);
935 if(esdTrack->GetID()>=0) {
936 rmId[i]=(UShort_t)esdTrack->GetID();
941 Float_t diamondxy[2]={static_cast<Float_t>(event->GetDiamondX()),static_cast<Float_t>(event->GetDiamondY())};
942 vertexESD = vertexer->RemoveTracksFromVertex(fV1,&rmArray,rmId,diamondxy);
943 delete [] rmId; rmId=NULL;
948 delete vertexer; vertexer=NULL;
949 if(!vertexESD) return vertexAOD;
950 if(vertexESD->GetNContributors()<=0) {
951 //AliDebug(2,"vertexing failed");
952 delete vertexESD; vertexESD=NULL;
959 // convert to AliAODVertex
960 Double_t pos[3],cov[6],chi2perNDF;
961 vertexESD->GetXYZ(pos); // position
962 vertexESD->GetCovMatrix(cov); //covariance matrix
963 chi2perNDF = vertexESD->GetChi2toNDF();
964 delete vertexESD; vertexESD=NULL;
966 vertexAOD = new AliAODVertex(pos,cov,chi2perNDF);
971 //________________________________________________________________________
972 AliAODVertex* AliAnalysisTaskSELc2pK0sfromAODtracks::ReconstructSecondaryVertex(AliAODv0 *v0, AliAODTrack *part, AliAODEvent * aod)
975 // Reconstruct secondary vertex from trkArray (Copied from AliAnalysisVertexingHF)
977 //------------------------------------------------
979 //------------------------------------------------
980 AliAODVertex *primVertexAOD;
981 Bool_t unsetvtx = kFALSE;
983 primVertexAOD = CallPrimaryVertex(v0,part,aod);
985 primVertexAOD = fVtx1;
990 primVertexAOD = fVtx1;
992 if(!primVertexAOD) return 0x0;
994 //------------------------------------------------
996 //------------------------------------------------
998 Double_t LcPx = part->Px()+v0->Px();
999 Double_t LcPy = part->Py()+v0->Py();
1000 Double_t LcPt = TMath::Sqrt(LcPx*LcPx+LcPy*LcPy);
1002 Double_t d0z0[2],covd0z0[3];
1003 part->PropagateToDCA(primVertexAOD,fBzkG,kVeryBig,d0z0,covd0z0);
1004 Double_t x0 = primVertexAOD->GetX();
1005 Double_t y0 = primVertexAOD->GetY();
1006 Double_t px0 = LcPx/LcPt;
1007 Double_t py0 = LcPy/LcPt;
1010 Double_t x1 = tx[0];
1011 Double_t y1 = tx[1];
1012 part->GetPxPyPz(tx);
1013 Double_t px1 = tx[0];
1014 Double_t py1 = tx[1];
1015 Double_t pt1 = sqrt(px1*px1+py1*py1);
1019 Double_t dx = x0 - x1;
1020 Double_t dy = y0 - y1;
1022 Double_t Delta = -px0*py1+py0*px1;
1023 Double_t a0 = -9999.;
1026 a0 = 1./Delta * (py1 * dx - px1 * dy);
1028 Double_t neovertx = x0 + a0 * px0;
1029 Double_t neoverty = y0 + a0 * py0;
1030 Double_t z0 = primVertexAOD->GetZ();
1031 Double_t neovertz = z0 + TMath::Abs(a0)*part->Pz()/part->Pt();
1033 if(unsetvtx) delete primVertexAOD; primVertexAOD=NULL;
1035 Double_t pos[3],cov[6],chi2perNDF;
1046 AliAODVertex *secVert = new AliAODVertex(pos,cov,chi2perNDF);