3 // Task to skim ESD files.
7 #include "AliEsdSkimTask.h"
8 #include <TClonesArray.h>
11 #include "AliAnalysisManager.h"
12 #include "AliCentrality.h"
13 #include "AliEventplane.h"
14 #include "AliESDEvent.h"
15 #include "AliESDFMD.h"
16 #include "AliESDtrackCuts.h"
17 #include "AliEsdTrackExt.h"
18 #include "AliMultiplicity.h"
20 //_________________________________________________________________________________________________
21 AliEsdSkimTask::AliEsdSkimTask(const char *opt) :
22 AliAnalysisTaskSE(opt), fEvent(0), fTree(0), fCuts(0),
23 fDoZDC(1), fDoV0(1), fDoT0(1), fDoTPCv(1), fDoSPDv(1), fDoPriv(1),
24 fDoEmCs(1), fDoPCs(1), fDoEmT(1), fDoPT(1), fDoTracks(1), fDoFmd(1),
25 fDoMult(1), fDoTof(1), fDoPileup(1), fDoClus(1), fEmcNames(""),
26 fDoMiniTracks(0), fTracks("Tracks"), fPhosClusOnly(0), fDoSaveBytes(1),
34 fBranchNames = "ESD:AliESDHeader.,AliESDRun.";
36 DefineOutput(1, TTree::Class());
39 //_________________________________________________________________________________________________
40 void AliEsdSkimTask::UserExec(Option_t */*opt*/)
44 AliESDEvent *esdin = dynamic_cast<AliESDEvent*>(InputEvent());
48 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
52 TList* objsin = esdin->GetList();
53 TList* objsout = fEvent->GetList();
55 AliESDHeader *header = dynamic_cast<AliESDHeader*>(objsout->FindObject("AliESDHeader"));
57 am->LoadBranch("AliESDHeader.");
58 *header = *esdin->GetHeader();
60 AliESDRun *run = dynamic_cast<AliESDRun*>(objsout->FindObject("AliESDRun"));
62 am->LoadBranch("AliESDRun.");
63 *run = *esdin->GetESDRun();
65 AliCentrality *cent = dynamic_cast<AliCentrality*>(objsout->FindObject("Cent"));
68 AliCentrality *centin = esdin->GetCentrality();
69 cent->SetQuality(centin->GetQuality());
70 cent->SetCentralityV0M(centin->GetCentralityPercentileUnchecked("V0M"));
71 cent->SetCentralityFMD(centin->GetCentralityPercentileUnchecked("FMD"));
72 cent->SetCentralityTRK(centin->GetCentralityPercentileUnchecked("TRK"));
73 cent->SetCentralityTKL(centin->GetCentralityPercentileUnchecked("TKL"));
74 cent->SetCentralityCL0(centin->GetCentralityPercentileUnchecked("CL0"));
75 cent->SetCentralityCL1(centin->GetCentralityPercentileUnchecked("CL1"));
76 cent->SetCentralityV0MvsFMD(centin->GetCentralityPercentileUnchecked("V0MvsFMD"));
77 cent->SetCentralityTKLvsV0M(centin->GetCentralityPercentileUnchecked("TKLvsV0M"));
78 cent->SetCentralityZEMvsZDC(centin->GetCentralityPercentileUnchecked("ZEMvsZDC"));
80 AliEventplane *ep = dynamic_cast<AliEventplane*>(objsout->FindObject("EP"));
83 AliEventplane *epin = esdin->GetEventplane();
87 if (epin->GetQVector()) {
88 ep->SetQVector(new TVector2(*epin->GetQVector()));
89 ep->SetEventplaneQ(epin->GetEventplane("Q"));
90 ep->SetQsub(new TVector2(*epin->GetQsub1()),new TVector2(*epin->GetQsub2()));
91 ep->SetQsubRes(epin->GetQsubRes());
95 AliESDZDC *zdc = dynamic_cast<AliESDZDC*>(objsout->FindObject("AliESDZDC"));
97 am->LoadBranch("AliESDZDC.");
98 *zdc = *esdin->GetESDZDC();
100 AliESDVZERO *v0 = dynamic_cast<AliESDVZERO*>(objsout->FindObject("AliESDVZERO"));
102 am->LoadBranch("AliESDVZERO.");
103 *v0 = *esdin->GetVZEROData();
105 AliESDTZERO *t0 = dynamic_cast<AliESDTZERO*>(objsout->FindObject("AliESDTZERO"));
107 am->LoadBranch("AliESDTZERO.");
108 *t0 = *esdin->GetESDTZERO();
110 AliESDVertex *tpcv = dynamic_cast<AliESDVertex*>(objsout->FindObject("TPCVertex"));
112 am->LoadBranch("TPCVertex.");
113 *tpcv = *esdin->GetPrimaryVertexTPC();
115 AliESDVertex *spdv = dynamic_cast<AliESDVertex*>(objsout->FindObject("SPDVertex"));
117 am->LoadBranch("SPDVertex.");
118 *spdv = *esdin->GetPrimaryVertexSPD();
120 AliESDVertex *priv = dynamic_cast<AliESDVertex*>(objsout->FindObject("PrimaryVertex"));
122 am->LoadBranch("PrimaryVertex.");
123 *priv = *esdin->GetPrimaryVertexTracks();
125 AliESDCaloCells *ecells = dynamic_cast<AliESDCaloCells*>(objsout->FindObject("EMCALCells"));
127 am->LoadBranch("EMCALCells.");
128 *ecells = *esdin->GetEMCALCells();
130 AliESDCaloCells *pcells = dynamic_cast<AliESDCaloCells*>(objsout->FindObject("PHOSCells"));
132 am->LoadBranch("PHOSCells.");
133 *pcells = *esdin->GetPHOSCells();
135 AliESDCaloTrigger *etrig = dynamic_cast<AliESDCaloTrigger*>(objsout->FindObject("EMCALTrigger"));
137 am->LoadBranch("EMCALTrigger.");
138 *etrig = *esdin->GetCaloTrigger("EMCAL");
140 AliESDCaloTrigger *ptrig = dynamic_cast<AliESDCaloTrigger*>(objsout->FindObject("PHOSTrigger"));
142 am->LoadBranch("PHOSTrigger.");
143 *ptrig = *esdin->GetCaloTrigger("PHOS");
145 AliESDFMD *fmd = dynamic_cast<AliESDFMD*>(objsout->FindObject("AliESDFMD"));
147 am->LoadBranch("AliESDFMD.");
149 *fmd = *esdin->GetFMDData();
152 AliMultiplicity *mult = dynamic_cast<AliMultiplicity*>(objsout->FindObject("AliMultiplicity"));
154 am->LoadBranch("AliMultiplicity.");
156 *mult = *esdin->GetMultiplicity();
158 const AliMultiplicity *multin = esdin->GetMultiplicity();;
159 mult->SetFiredChips(0, multin->GetNumberOfFiredChips(0));
160 mult->SetFiredChips(1, multin->GetNumberOfFiredChips(1));
161 for (Int_t i=0; i<6; ++i)
162 mult->SetITSClusters(i,mult->GetNumberOfITSClusters(i));
165 AliTOFHeader *tofh = dynamic_cast<AliTOFHeader*>(objsout->FindObject("AliTOFHeader"));
167 am->LoadBranch("AliTOFHeader.");
168 *tofh = *esdin->GetTOFHeader();
170 TClonesArray *spup = dynamic_cast<TClonesArray*>(objsout->FindObject("SPDPileupVertices"));
172 am->LoadBranch("SPDPileupVertices");
173 Int_t N = esdin->GetNumberOfPileupVerticesSPD();
174 for (Int_t i=0; i<N; ++i) {
175 const AliESDVertex *vtx = esdin->GetPileupVertexSPD(i);
177 fEvent->AddPileupVertexSPD(vtx);
180 TClonesArray *tpup = dynamic_cast<TClonesArray*>(objsout->FindObject("TrkPileupVertices"));
182 am->LoadBranch("TrkPileupVertices");
183 Int_t N = esdin->GetNumberOfPileupVerticesTracks();
184 for (Int_t i=0; i<N; ++i) {
185 const AliESDVertex *vtx = esdin->GetPileupVertexTracks(i);
187 fEvent->AddPileupVertexTracks(vtx);
190 TClonesArray *clus = dynamic_cast<TClonesArray*>(objsout->FindObject("CaloClusters"));
192 am->LoadBranch("CaloClusters");
193 Int_t N = esdin->GetNumberOfCaloClusters();
194 for (Int_t i=0; i<N; ++i) {
195 AliESDCaloCluster *c = esdin->GetCaloCluster(i);
196 if (fPhosClusOnly && c->IsEMCAL())
199 fEvent->AddCaloCluster(c);
202 TObjArray *namearr = fEmcNames.Tokenize(";");
204 for (Int_t i=0; i<namearr->GetEntries(); ++i) {
205 TString cname(namearr->At(i)->GetName());
206 if (cname.Length()<=0)
208 TClonesArray *arrin = dynamic_cast<TClonesArray*>(objsin->FindObject(cname));
210 AliFatal(Form("Can not find input clusters with name %s", cname.Data()));
213 TClonesArray *arrout = dynamic_cast<TClonesArray*>(objsout->FindObject(cname));
215 AliFatal(Form("Can not find output clusters with name %s", cname.Data()));
219 const Int_t N = arrin->GetEntries();
220 for (Int_t iC=0, nC=0; iC<N; ++iC) {
221 AliESDCaloCluster *c = dynamic_cast<AliESDCaloCluster*>(arrin->At(iC));
224 new ((*arrout)[nC++]) AliESDCaloCluster(*c);
230 am->LoadBranch("Tracks");
231 TClonesArray *tracksin = dynamic_cast<TClonesArray*>(objsin->FindObject(fTracks));
233 AliFatal(Form("Can not find tracks with name %s", fTracks.Data()));
236 TClonesArray *tracksout = dynamic_cast<TClonesArray*>(objsout->FindObject("Tracks"));
238 AliFatal(Form("Can not find tracks with name %s", "Tracks"));
241 const Int_t Ntracks = tracksin->GetEntries();
243 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
244 AliESDtrack *track = dynamic_cast<AliESDtrack*>(tracksin->At(iTracks));
248 if (!fCuts->IsSelected(track))
251 AliEsdTrackExt *newtrack = new ((*tracksout)[nacc]) AliEsdTrackExt(*track);
253 newtrack->MakeMiniTrack();
255 newtrack->DeleteParams();
257 newtrack->SetID(nacc);
258 fEvent->AddTrack(track);
262 AliInfo(Form("Selected %d out of %d \n", nacc, Ntracks));
267 //_________________________________________________________________________________________________
268 void AliEsdSkimTask::UserCreateOutputObjects()
270 // Create output objects.
272 fTree = new TTree("esdTree", "Tree with skimmed ESD objects");
273 fEvent = new AliESDEvent;
274 fEvent->AddObject(new AliESDHeader());
275 fEvent->AddObject(new AliESDRun());
277 AliCentrality *cent = new AliCentrality;
278 cent->SetName("Cent");
279 fEvent->AddObject(cent);
282 AliEventplane *ep = new AliEventplane;
284 fEvent->AddObject(ep);
287 fEvent->AddObject(new AliESDZDC());
289 fEvent->AddObject(new AliESDVZERO());
291 fEvent->AddObject(new AliESDTZERO());
293 AliESDVertex *tpcv = new AliESDVertex();
294 tpcv->SetName("TPCVertex");
295 fEvent->AddObject(tpcv);
298 AliESDVertex *spdv = new AliESDVertex();
299 spdv->SetName("SPDVertex");
300 fEvent->AddObject(spdv);
303 AliESDVertex *priv = new AliESDVertex();
304 priv->SetName("PrimaryVertex");
305 fEvent->AddObject(priv);
308 fEvent->AddObject(new AliESDCaloCells("EMCALCells","EMCALCells"));
311 fEvent->AddObject(new AliESDCaloCells("PHOSCells","PHOSCells"));
314 AliESDCaloTrigger *etrig = new AliESDCaloTrigger;
315 etrig->SetName("EMCALTrigger");
316 fEvent->AddObject(etrig);
319 AliESDCaloTrigger *ptrig = new AliESDCaloTrigger;
320 ptrig->SetName("PHOSTrigger");
321 fEvent->AddObject(ptrig);
324 AliESDFMD *fmd = new AliESDFMD;
325 fEvent->AddObject(fmd);
328 fEvent->AddObject(new AliMultiplicity());
331 TClonesArray *arr1 = new TClonesArray("AliESDVertex",0);
332 arr1->SetName("SPDPileupVertices");
333 fEvent->AddObject(arr1);
334 TClonesArray *arr2 = new TClonesArray("AliESDVertex",0);
335 arr2->SetName("TrkPileupVertices");
336 fEvent->AddObject(arr2);
339 fEvent->AddObject(new AliTOFHeader());
342 TClonesArray *arr = new TClonesArray("AliESDCaloCluster",0);
343 arr->SetName("CaloClusters");
344 fEvent->AddObject(arr);
346 TObjArray *namearr = fEmcNames.Tokenize(";");
348 for (Int_t i=0; i<namearr->GetEntries(); ++i) {
349 TString cname(namearr->At(i)->GetName());
350 if (cname.Length()<=0)
352 TClonesArray *arr = new TClonesArray("AliESDCaloCluster",0);
354 fEvent->AddObject(arr);
359 TClonesArray *arr = 0;
361 arr = new TClonesArray("AliEsdTrackExt",0);
362 arr->SetName("Tracks");
364 arr = new TClonesArray("AliESDtrackExt",0);
365 arr->SetName("Tracks");
367 fEvent->AddObject(arr);
369 fEvent->GetStdContent();
370 fEvent->WriteToTree(fTree);
371 fTree->GetUserInfo()->Add(fEvent);
372 TFile *file = OpenFile(1);
373 file->SetCompressionLevel(2);
374 fTree->SetDirectory(file);
375 fTree->SetAutoFlush(-1024*1024*1024);
376 fTree->SetAutoSave(-1024*1024*1024);