3 // Task to skim ESD files.
7 #include "AliEsdSkimTask.h"
8 #include <TClonesArray.h>
11 #include "AliAnalysisManager.h"
12 #include "AliCentrality.h"
13 #include "AliESDEvent.h"
14 #include "AliESDFMD.h"
15 #include "AliESDMuonTrack.h"
16 #include "AliESDtrackCuts.h"
17 #include "AliESDtrackCuts.h"
18 #include "AliEsdTrackExt.h"
19 #include "AliEventplane.h"
20 #include "AliInputEventHandler.h"
21 #include "AliMultiplicity.h"
22 #include "AliPicoTrack.h"
23 #include "AliVEventHandler.h"
25 //_________________________________________________________________________________________________
26 AliEsdSkimTask::AliEsdSkimTask(const char *opt) :
27 AliAnalysisTaskSE(opt), fEvent(0), fTree(0), fCuts(0),
28 fDoZDC(1), fDoV0(1), fDoT0(1), fDoTPCv(1), fDoSPDv(1), fDoPriv(1),
29 fDoEmCs(1), fDoPCs(0), fDoEmT(1), fDoPT(0), fDoTracks(0), fDoFmd(1),
30 fDoMult(1), fDoTof(0), fDoPileup(1), fDoClus(0), fDoMuonTracks(0), fEmcNames(""),
31 fDoMiniTracks(0), fTracks("Tracks"), fPhosClusOnly(0), fEmcalClusOnly(0),
32 fDoSaveBytes(0), fDoCent(1), fDoRP(1), fRemoveCP(0), fResetCov(1),
33 fDoPicoTracks(0), fCheckCond(0)
40 fBranchNames = "ESD:AliESDHeader.,AliESDRun.";
42 DefineOutput(1, TTree::Class());
45 //_________________________________________________________________________________________________
46 void AliEsdSkimTask::UserExec(Option_t */*opt*/)
50 AliESDEvent *esdin = dynamic_cast<AliESDEvent*>(InputEvent());
54 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
56 fEvent->ResetStdContent();
58 TList* objsin = esdin->GetList();
59 TList* objsout = fEvent->GetList();
62 Int_t mult = AliESDtrackCuts::GetReferenceMultiplicity(esdin, AliESDtrackCuts::kTrackletsITSTPC, 0.8);
67 AliESDHeader *header = dynamic_cast<AliESDHeader*>(objsout->FindObject("AliESDHeader"));
69 am->LoadBranch("AliESDHeader.");
71 *header = *esdin->GetHeader();
73 AliESDHeader *hin = esdin->GetHeader();
74 header->SetTriggerMask(hin->GetTriggerMask());
75 header->SetOrbitNumber(hin->GetOrbitNumber());
76 header->SetTimeStamp(hin->GetTimeStamp());
77 header->SetEventType(hin->GetEventType());
78 header->SetEventSpecie(hin->GetEventSpecie());
79 header->SetEventNumberInFile(hin->GetEventNumberInFile());
80 header->SetBunchCrossNumber(hin->GetBunchCrossNumber());
81 header->SetPeriodNumber(hin->GetPeriodNumber());
82 header->SetTriggerCluster(hin->GetTriggerCluster());
83 header->SetL0TriggerInputs(hin->GetL0TriggerInputs());
84 header->SetL1TriggerInputs(hin->GetL1TriggerInputs());
85 header->SetL2TriggerInputs(hin->GetL2TriggerInputs());
86 for (Int_t i=0;i<24;++i) {
87 const char *name = hin->GetTriggerInputName(i,0);
89 header->SetActiveTriggerInputs(name,i);
91 for (Int_t i=0;i<24;++i) {
92 const char *name = hin->GetTriggerInputName(i,1);
94 header->SetActiveTriggerInputs(name,i+24);
96 for (Int_t i=0;i<12;++i) {
97 const char *name = hin->GetTriggerInputName(i,2);
99 header->SetActiveTriggerInputs(name,i+48);
102 header->SetUniqueID(((AliInputEventHandler*)(am->GetInputEventHandler()))->IsEventSelected());
103 if (am->GetInputEventHandler()) {
104 TTree *tree = am->GetInputEventHandler()->GetTree();
106 TFile *cfile = tree->GetCurrentFile();
108 TString cname(cfile->GetName());
109 header->SetTitle(cname);
114 AliESDRun *run = dynamic_cast<AliESDRun*>(objsout->FindObject("AliESDRun"));
116 am->LoadBranch("AliESDRun.");
117 *run = *esdin->GetESDRun();
119 AliCentrality *cent = dynamic_cast<AliCentrality*>(objsout->FindObject("Centrality"));
122 AliCentrality *centin = esdin->GetCentrality();
123 cent->SetQuality(centin->GetQuality());
124 cent->SetCentralityV0M(centin->GetCentralityPercentileUnchecked("V0M"));
125 cent->SetCentralityFMD(centin->GetCentralityPercentileUnchecked("FMD"));
126 cent->SetCentralityTRK(centin->GetCentralityPercentileUnchecked("TRK"));
127 cent->SetCentralityTKL(centin->GetCentralityPercentileUnchecked("TKL"));
128 cent->SetCentralityCL0(centin->GetCentralityPercentileUnchecked("CL0"));
129 cent->SetCentralityCL1(centin->GetCentralityPercentileUnchecked("CL1"));
130 cent->SetCentralityV0MvsFMD(centin->GetCentralityPercentileUnchecked("V0MvsFMD"));
131 cent->SetCentralityTKLvsV0M(centin->GetCentralityPercentileUnchecked("TKLvsV0M"));
132 cent->SetCentralityZEMvsZDC(centin->GetCentralityPercentileUnchecked("ZEMvsZDC"));
134 AliEventplane *ep = dynamic_cast<AliEventplane*>(objsout->FindObject("Eventplane"));
137 AliEventplane *epin = esdin->GetEventplane();
141 if (epin->GetQVector()) {
142 ep->SetQVector(new TVector2(*epin->GetQVector()));
143 ep->SetEventplaneQ(epin->GetEventplane("Q"));
144 ep->SetQsub(new TVector2(*epin->GetQsub1()),new TVector2(*epin->GetQsub2()));
145 ep->SetQsubRes(epin->GetQsubRes());
150 AliESDZDC *zdc = dynamic_cast<AliESDZDC*>(objsout->FindObject("AliESDZDC"));
152 am->LoadBranch("AliESDZDC.");
153 *zdc = *esdin->GetESDZDC();
157 AliESDVZERO *v0 = dynamic_cast<AliESDVZERO*>(objsout->FindObject("AliESDVZERO"));
159 am->LoadBranch("AliESDVZERO.");
160 *v0 = *esdin->GetVZEROData();
164 AliESDTZERO *t0 = dynamic_cast<AliESDTZERO*>(objsout->FindObject("AliESDTZERO"));
166 am->LoadBranch("AliESDTZERO.");
167 *t0 = *esdin->GetESDTZERO();
171 AliESDVertex *tpcv = dynamic_cast<AliESDVertex*>(objsout->FindObject("TPCVertex"));
173 am->LoadBranch("TPCVertex.");
174 *tpcv = *esdin->GetPrimaryVertexTPC();
178 AliESDVertex *spdv = dynamic_cast<AliESDVertex*>(objsout->FindObject("SPDVertex"));
180 am->LoadBranch("SPDVertex.");
181 *spdv = *esdin->GetPrimaryVertexSPD();
185 AliESDVertex *priv = dynamic_cast<AliESDVertex*>(objsout->FindObject("PrimaryVertex"));
187 am->LoadBranch("PrimaryVertex.");
188 *priv = *esdin->GetPrimaryVertexTracks();
192 AliESDCaloCells *ecells = dynamic_cast<AliESDCaloCells*>(objsout->FindObject("EMCALCells"));
194 am->LoadBranch("EMCALCells.");
195 *ecells = *esdin->GetEMCALCells();
199 AliESDCaloCells *pcells = dynamic_cast<AliESDCaloCells*>(objsout->FindObject("PHOSCells"));
201 am->LoadBranch("PHOSCells.");
202 *pcells = *esdin->GetPHOSCells();
206 AliESDCaloTrigger *etrig = dynamic_cast<AliESDCaloTrigger*>(objsout->FindObject("EMCALTrigger"));
208 am->LoadBranch("EMCALTrigger.");
209 *etrig = *esdin->GetCaloTrigger("EMCAL");
213 AliESDCaloTrigger *ptrig = dynamic_cast<AliESDCaloTrigger*>(objsout->FindObject("PHOSTrigger"));
215 am->LoadBranch("PHOSTrigger.");
216 *ptrig = *esdin->GetCaloTrigger("PHOS");
220 AliESDFMD *fmd = dynamic_cast<AliESDFMD*>(objsout->FindObject("AliESDFMD"));
222 am->LoadBranch("AliESDFMD.");
224 *fmd = *esdin->GetFMDData();
229 AliMultiplicity *mult = dynamic_cast<AliMultiplicity*>(objsout->FindObject("AliMultiplicity"));
231 am->LoadBranch("AliMultiplicity.");
233 *mult = *esdin->GetMultiplicity();
235 const AliMultiplicity *multin = esdin->GetMultiplicity();;
236 mult->SetFiredChips(0, multin->GetNumberOfFiredChips(0));
237 mult->SetFiredChips(1, multin->GetNumberOfFiredChips(1));
238 for (Int_t i=0; i<6; ++i)
239 mult->SetITSClusters(i,multin->GetNumberOfITSClusters(i));
244 AliTOFHeader *tofh = dynamic_cast<AliTOFHeader*>(objsout->FindObject("AliTOFHeader"));
246 am->LoadBranch("AliTOFHeader.");
247 *tofh = *esdin->GetTOFHeader();
251 TClonesArray *spup = dynamic_cast<TClonesArray*>(objsout->FindObject("SPDPileupVertices"));
253 am->LoadBranch("SPDPileupVertices");
254 Int_t N = esdin->GetNumberOfPileupVerticesSPD();
255 for (Int_t i=0; i<N; ++i) {
256 const AliESDVertex *vtx = esdin->GetPileupVertexSPD(i);
258 fEvent->AddPileupVertexSPD(vtx);
261 TClonesArray *tpup = dynamic_cast<TClonesArray*>(objsout->FindObject("TrkPileupVertices"));
263 am->LoadBranch("TrkPileupVertices");
264 Int_t N = esdin->GetNumberOfPileupVerticesTracks();
265 for (Int_t i=0; i<N; ++i) {
266 const AliESDVertex *vtx = esdin->GetPileupVertexTracks(i);
268 fEvent->AddPileupVertexTracks(vtx);
273 TClonesArray *clus = dynamic_cast<TClonesArray*>(objsout->FindObject("CaloClusters"));
275 am->LoadBranch("CaloClusters");
276 Int_t N = esdin->GetNumberOfCaloClusters();
277 for (Int_t i=0; i<N; ++i) {
278 AliESDCaloCluster *c = esdin->GetCaloCluster(i);
281 if (fPhosClusOnly && c->IsEMCAL())
283 if (fEmcalClusOnly && c->IsPHOS())
285 fEvent->AddCaloCluster(c);
289 TObjArray *namearr = fEmcNames.Tokenize(";");
291 for (Int_t i=0; i<namearr->GetEntries(); ++i) {
292 TString cname(namearr->At(i)->GetName());
293 if (cname.Length()<=0)
295 TClonesArray *arrin = dynamic_cast<TClonesArray*>(objsin->FindObject(cname));
297 AliFatal(Form("Can not find input clusters with name %s", cname.Data()));
300 TClonesArray *arrout = dynamic_cast<TClonesArray*>(objsout->FindObject(cname));
302 AliFatal(Form("Can not find output clusters with name %s", cname.Data()));
307 if (cname.Contains("FEE"))
309 const Int_t N = arrin->GetEntries();
310 for (Int_t iC=0, nC=0; iC<N; ++iC) {
311 AliESDCaloCluster *c = dynamic_cast<AliESDCaloCluster*>(arrin->At(iC));
316 AliESDCaloCluster *newCluster = new ((*arrout)[nC]) AliESDCaloCluster(*c);
317 newCluster->SetID(nC);
324 if (fTracks == "Tracks")
325 am->LoadBranch("Tracks");
326 TClonesArray *tracksin = dynamic_cast<TClonesArray*>(objsin->FindObject(fTracks));
328 AliFatal(Form("Can not find tracks with name %s", fTracks.Data()));
331 TString trkoutname("Tracks");
333 trkoutname = "PicoTracks";
334 TClonesArray *tracksout = 0;
335 tracksout = dynamic_cast<TClonesArray*>(objsout->FindObject(trkoutname));
337 AliFatal(Form("Can not find tracks with name %s", trkoutname.Data()));
341 TString classname(tracksin->GetClass()->GetName());
342 if (classname == "AliPicoTrack") {
343 if (!fDoPicoTracks) {
344 AliFatal(Form("Need to enable fDoPicoTracks when reading AliPicoTracks"));
347 const Int_t Ntracks = tracksin->GetEntries();
348 for (Int_t iTracks = 0, nacc = 0; iTracks < Ntracks; ++iTracks) {
349 AliPicoTrack *track = dynamic_cast<AliPicoTrack*>(tracksin->At(iTracks));
352 new ((*tracksout)[nacc]) AliPicoTrack(*track);
356 const Int_t Ntracks = tracksin->GetEntries();
357 for (Int_t iTracks = 0, nacc = 0; iTracks < Ntracks; ++iTracks) {
358 AliESDtrack *track = dynamic_cast<AliESDtrack*>(tracksin->At(iTracks));
362 if (!fCuts->IsSelected(track))
366 AliEsdTrackExt newtrack(*track);
369 if (newtrack.IsEMCAL()) {
370 etaemc = newtrack.GetEmcEta();
371 phiemc = newtrack.GetEmcPhi();
373 new ((*tracksout)[nacc]) AliPicoTrack(newtrack.Pt(), newtrack.Eta(), newtrack.Phi(),
374 newtrack.Charge(), newtrack.GetLabel(),
375 etaemc, phiemc, newtrack.IsEMCAL());
378 AliEsdTrackExt *newtrack = new ((*tracksout)[nacc]) AliEsdTrackExt(*track);
380 newtrack->MakeMiniTrack(0,fRemoveCP);
381 newtrack->ResetCovariance(fResetCov);
383 newtrack->DeleteParams();
385 newtrack->SetID(nacc);
392 TClonesArray *muons = dynamic_cast<TClonesArray*>(objsout->FindObject("MuonTracks"));
394 am->LoadBranch("MuonTracks");
395 Int_t N = esdin->GetNumberOfMuonTracks();
396 for (Int_t i=0; i<N; ++i) {
397 const AliESDMuonTrack *mt = esdin->GetMuonTrack(i);
398 new ((*muons)[i]) AliESDMuonTrack(*mt);
405 //_________________________________________________________________________________________________
406 void AliEsdSkimTask::UserCreateOutputObjects()
408 // Create output objects.
410 TFile *file = OpenFile(1);
411 fTree = new TTree("esdTree", "Tree with skimmed ESD objects");
412 file->SetCompressionLevel(5);
413 fTree->SetDirectory(file);
414 fTree->SetAutoFlush(-10*1024*1024);
416 fEvent = new AliESDEvent;
417 fEvent->CreateStdContent();
419 AliCentrality *cent = new AliCentrality;
420 fEvent->AddObject(cent);
423 AliEventplane *ep = new AliEventplane;
424 fEvent->AddObject(ep);
426 TObjArray *namearr = fEmcNames.Tokenize(";");
428 for (Int_t i=0; i<namearr->GetEntries(); ++i) {
429 TString cname(namearr->At(i)->GetName());
430 if (cname.Length()<=0)
432 TClonesArray *arr = new TClonesArray("AliESDCaloCluster",0);
434 fEvent->AddObject(arr);
440 TClonesArray *arr = new TClonesArray("AliPicoTrack",0);
441 arr->SetName("PicoTracks");
442 fEvent->AddObject(arr);
444 TObject *obj = fEvent->GetList()->FindObject("Tracks");
445 fEvent->GetList()->Remove(obj);
446 TClonesArray *arr = new TClonesArray("AliEsdTrackExt",0);
447 arr->SetName("Tracks");
448 fEvent->AddObject(arr);
451 fEvent->GetStdContent();
452 fEvent->WriteToTree(fTree);
453 fTree->GetUserInfo()->Add(fEvent);