1 /**************************************************************************
2 * Copyright(c) 1998-2008, 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 * appear 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 **************************************************************************/
16 /////////////////////////////////////////////////////////////
18 // AliAnalysisTaskSE for the selection of heavy flavor
19 // decay candidates and creation a stand-alone AOD.
21 // Author: A.Dainese, andrea.dainese@lnl.infn.it
22 /////////////////////////////////////////////////////////////
24 #include <TClonesArray.h>
26 #include "AliAODEvent.h"
27 #include "AliAODVertex.h"
28 #include "AliAODTrack.h"
29 #include "AliAODRecoDecayHF2Prong.h"
30 #include "AliAnalysisVertexingHF.h"
31 #include "AliAnalysisTaskSE.h"
32 #include "AliAnalysisTaskSESelectHF.h"
34 ClassImp(AliAnalysisTaskSESelectHF)
37 //________________________________________________________________________
38 AliAnalysisTaskSESelectHF::AliAnalysisTaskSESelectHF():
44 // Default constructor
47 //________________________________________________________________________
48 AliAnalysisTaskSESelectHF::AliAnalysisTaskSESelectHF(const char *name):
49 AliAnalysisTaskSE(name),
54 // Default constructor
57 //________________________________________________________________________
58 AliAnalysisTaskSESelectHF::~AliAnalysisTaskSESelectHF()
69 //________________________________________________________________________
70 void AliAnalysisTaskSESelectHF::Init()
74 if(fDebug > 1) printf("AnalysisTaskSESelectHF::Init() \n");
76 gROOT->LoadMacro("ConfigVertexingHF.C");
78 fVHF = (AliAnalysisVertexingHF*)gROOT->ProcessLine("ConfigVertexingHF()");
84 //________________________________________________________________________
85 void AliAnalysisTaskSESelectHF::UserCreateOutputObjects()
87 // Create the output container
89 if(fDebug > 1) printf("AnalysisTaskSESelectHF::UserCreateOutputObjects() \n");
91 fVerticesHFTClArr = new TClonesArray("AliAODVertex", 0);
92 fVerticesHFTClArr->SetName("VerticesHF");
93 AddAODBranch("TClonesArray", &fVerticesHFTClArr);
95 fD0toKpiTClArr = new TClonesArray("AliAODRecoDecayHF2Prong", 0);
96 fD0toKpiTClArr->SetName("D0toKpi");
97 AddAODBranch("TClonesArray", &fD0toKpiTClArr);
102 //________________________________________________________________________
103 void AliAnalysisTaskSESelectHF::UserExec(Option_t */*option*/)
105 // Execute analysis for current event:
106 // heavy flavor candidates selection and histograms
108 AliAODEvent *aodIn = dynamic_cast<AliAODEvent*> (InputEvent());
110 // In case there is an AOD handler writing a standard AOD, use the AOD
111 // event in memory rather than the input (ESD) event.
112 if (!aodIn && AODEvent() && IsStandardAOD()) aodIn = dynamic_cast<AliAODEvent*> (AODEvent());
114 // load D0->Kpi candidates
115 TClonesArray *inputArrayD0toKpi =
116 (TClonesArray*)aodIn->GetList()->FindObject("D0toKpi");
117 if(!inputArrayD0toKpi) {
118 printf("AliAnalysisTaskSESelectHF::UserExec: D0toKpi branch not found!\n");
123 //aodIn->GetHeader()->Print();
126 AliAODVertex *vtx1 = (AliAODVertex*)aodIn->GetPrimaryVertex();
129 // make trkIDtoEntry register (temporary)
130 Int_t trkIDtoEntry[100000];
131 for(Int_t it=0;it<aodIn->GetNumberOfTracks();it++) {
132 AliAODTrack *track = aodIn->GetTrack(it);
133 trkIDtoEntry[track->GetID()]=it;
136 Int_t iOutVerticesHF=0,iOutD0toKpi=0;
137 fVerticesHFTClArr->Delete();
138 iOutVerticesHF = fVerticesHFTClArr->GetEntriesFast();
139 TClonesArray &verticesHFRef = *fVerticesHFTClArr;
140 fD0toKpiTClArr->Delete();
141 iOutD0toKpi = fD0toKpiTClArr->GetEntriesFast();
142 TClonesArray &aodD0toKpiRef = *fD0toKpiTClArr;
145 // loop over D0->Kpi candidates
146 Int_t nInD0toKpi = inputArrayD0toKpi->GetEntriesFast();
147 printf("Number of D0->Kpi: %d\n",nInD0toKpi);
149 for (Int_t iD0toKpi = 0; iD0toKpi < nInD0toKpi; iD0toKpi++) {
150 AliAODRecoDecayHF2Prong *dIn = (AliAODRecoDecayHF2Prong*)inputArrayD0toKpi->UncheckedAt(iD0toKpi);
151 Bool_t unsetvtx=kFALSE;
152 if(!dIn->GetOwnPrimaryVtx()) {
153 dIn->SetOwnPrimaryVtx(vtx1); // needed to compute all variables
156 Int_t okD0=0,okD0bar=0;
157 if(dIn->SelectD0(fVHF->GetD0toKpiCuts(),okD0,okD0bar)) {
158 // get daughter AOD tracks
159 AliAODTrack *trk0 = (AliAODTrack*)dIn->GetDaughter(0);
160 AliAODTrack *trk1 = (AliAODTrack*)dIn->GetDaughter(1);
162 trk0=aodIn->GetTrack(trkIDtoEntry[dIn->GetProngID(0)]);
163 trk1=aodIn->GetTrack(trkIDtoEntry[dIn->GetProngID(1)]);
165 printf("pt of positive track: %f\n",trk0->Pt());
166 printf("pt of negative track: %f\n",trk1->Pt());
167 // HERE ONE COULD RECALCULATE THE VERTEX USING THE KF PACKAGE
169 // clone candidate for output AOD
170 AliAODVertex *v = new(verticesHFRef[iOutVerticesHF++])
171 AliAODVertex(*(dIn->GetSecondaryVtx()));
172 AliAODRecoDecayHF2Prong *dOut=new(aodD0toKpiRef[iOutD0toKpi++])
173 AliAODRecoDecayHF2Prong(*dIn);
174 dOut->SetSecondaryVtx(v);
175 dOut->SetOwnPrimaryVtx((AliAODVertex*)((dIn->GetOwnPrimaryVtx())->Clone()));
178 if(unsetvtx) dIn->UnsetOwnPrimaryVtx();
179 } // end loop on D0->Kpi
181 printf("Number of selected D0->Kpi: %d\n",iOutD0toKpi);
187 //________________________________________________________________________
188 void AliAnalysisTaskSESelectHF::Terminate(Option_t */*option*/)
190 // Terminate analysis
192 if(fDebug > 1) printf("AnalysisTaskSESelectHF: Terminate() \n");