1 /**************************************************************************
2 * Author: Panos Christakoglou. *
3 * Contributors are mentioned in the code where appropriate. *
5 * Permission to use, copy, modify and distribute this software and its *
6 * documentation strictly for non-commercial purposes is hereby granted *
7 * without fee, provided that the above copyright notice appears in all *
8 * copies and that both the copyright notice and this permission notice *
9 * appear in the supporting documentation. The authors make no claims *
10 * about the suitability of this software for any purpose. It is *
11 * provided "as is" without express or implied warranty. *
12 **************************************************************************/
16 //-----------------------------------------------------------------
17 // AliESDTagCreator class
18 // This is the class to deal with the tag creation (post process)
19 // Origin: Panos Christakoglou, UOA-CERN, Panos.Christakoglou@cern.ch
20 //-----------------------------------------------------------------
23 #include <Riostream.h>
30 #include <TObjString.h>
31 #include <TLorentzVector.h>
33 #include <TTimeStamp.h>
34 #include <TRefArray.h>
38 #include <TGridResult.h>
41 #include "AliRunTag.h"
42 #include "AliEventTag.h"
44 #include "AliESDEvent.h"
45 #include "AliESDVertex.h"
47 #include "AliGRPObject.h"
49 #include "AliESDTagCreator.h"
52 ClassImp(AliESDTagCreator)
55 //______________________________________________________________________________
56 AliESDTagCreator::AliESDTagCreator() :
58 fChain(new TChain("esdTree")), fGUIDList(new TList()),
59 fMD5List(new TList()), fTURLList(new TList()), fBranches(""),
60 meminfo(new MemInfo_t) {
61 //==============Default constructor for a AliESDTagCreator================
64 //______________________________________________________________________________
65 AliESDTagCreator::~AliESDTagCreator() {
66 //================Default destructor for a AliESDTagCreator===================
74 //______________________________________________________________________________
75 Bool_t AliESDTagCreator::ReadGridCollection(TGridResult *fresult) {
76 // Reads the entry of the TGridResult and creates the tags
77 Int_t nEntries = fresult->GetEntries();
86 for(Int_t i = 0; i < nEntries; i++) {
87 alienUrl = fresult->GetKey(i,"turl");
88 guid = fresult->GetKey(i,"guid");
89 if(fresult->GetKey(i,"size")) size = atol (fresult->GetKey(i,"size"));
90 md5 = fresult->GetKey(i,"md5");
91 turl = fresult->GetKey(i,"turl");
92 if(md5 && !strlen(guid)) md5 = 0;
93 if(guid && !strlen(guid)) guid = 0;
95 fChain->Add(alienUrl);
96 //fGUIDList->Add(new TObjString(guid));
97 //fMD5List->Add(new TObjString(md5));
98 //fTURLList->Add(new TObjString(turl));
100 //TFile *f = TFile::Open(alienUrl,"READ");
101 //CreateTag(f,guid,md5,turl,size,counter);
107 AliInfo(Form("ESD chain created......."));
108 AliInfo(Form("Chain entries: %d",fChain->GetEntries()));
109 // Switch of branches on user request
111 CreateTag(fChain,"grid");
116 //______________________________________________________________________________
117 Bool_t AliESDTagCreator::ReadLocalCollection(const char *localpath) {
118 // Checks the different subdirs of the given local path and in the
119 // case where it finds an AliESDs.root file it creates the tags
121 void *dira = gSystem->OpenDirectory(localpath);
123 const char * dirname = 0x0;
124 const char * filename = 0x0;
125 const char * pattern = "AliESDs.root";
128 while((dirname = gSystem->GetDirEntry(dira))) {
129 sprintf(fPath,"%s/%s",localpath,dirname);
130 void *dirb = gSystem->OpenDirectory(fPath);
131 while((filename = gSystem->GetDirEntry(dirb))) {
132 if(strstr(filename,pattern)) {
133 TString fESDFileName;
134 fESDFileName = fPath;
136 fESDFileName += pattern;
138 fChain->Add(fESDFileName);
140 //TFile *f = TFile::Open(fESDFileName,"READ");
141 //CreateTag(f,fESDFileName,counter);
147 }//child directory's entry loop
148 }//parent directory's entry loop
150 AliInfo(Form("ESD chain created......."));
151 AliInfo(Form("Chain entries: %d",fChain->GetEntries()));
152 // Switch of branches on user request
154 CreateTag(fChain,"local");
159 //______________________________________________________________________________
160 Bool_t AliESDTagCreator::ReadCAFCollection(const char *filename) {
161 // Temporary solution for CAF: Takes as an input the ascii file that
162 // lists the ESDs stored in the SE of the CAF and creates the tags.
164 // Open the input stream
170 // Read the input list of files and add them to the chain
173 if (!esdfile.Contains("root")) continue; // protection
175 fChain->Add(esdfile);
177 //TFile *f = TFile::Open(esdfile,"READ");
178 //CreateTag(f,esdfile,counter);
185 AliInfo(Form("ESD chain created......."));
186 AliInfo(Form("Chain entries: %d",fChain->GetEntries()));
187 // Switch of branches on user request
189 CreateTag(fChain,"proof");
194 //_____________________________________________________________________________
195 void AliESDTagCreator::CreateTag(TChain* chain, const char *type) {
196 //private method that creates tag files
197 TString fSession = type;
198 TString fguid, fmd5, fturl;
199 TString fTempGuid = 0;
204 Double_t fMUONMASS = 0.105658369;
207 Double_t fThetaX, fThetaY, fPyz, fChisquare;
208 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
210 TLorentzVector fEPvector;
212 Float_t fZVertexCut = 10.0;
213 Float_t fRhoVertexCut = 2.0;
215 Float_t fLowPtCut = 1.0;
216 Float_t fHighPtCut = 3.0;
217 Float_t fVeryHighPtCut = 10.0;
220 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
222 // Creates the tags for all the events in a given ESD file
223 Bool_t fIsSim = kTRUE;
225 Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons;
226 Int_t nPos, nNeg, nNeutr;
227 Int_t nK0s, nNeutrons, nPi0s, nGamas;
228 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
229 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
230 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
231 Float_t maxPt = .0, meanPt = .0, totalP = .0;
233 Int_t iRunNumber = 0;
236 //gSystem->GetMemInfo(meminfo);
237 //AliInfo(Form("After the tag initialization - Memory used: %d MB",meminfo->fMemUsed));
238 //Int_t tempmem = meminfo->fMemUsed;
240 AliInfo(Form("Creating the ESD tags......."));
242 Int_t firstEvent = 0,lastEvent = 0;
243 AliESDEvent *esd = new AliESDEvent();
244 esd->ReadFromTree(chain);
245 AliESD *esdold = 0x0;
247 //gSystem->GetMemInfo(meminfo);
248 //AliInfo(Form("After the esd initialization - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
249 //tempmem = meminfo->fMemUsed;
251 Int_t iInitRunNumber = -1;
253 TFile *f = chain->GetFile();
254 fTempGuid = f->GetUUID().AsString();
256 TString localFileName = "Run"; localFileName += esd->GetRunNumber();
257 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += chain->GetEntries(); //localFileName += "."; localFileName += Counter;
258 localFileName += ".ESD.tag.root";
264 fileName = localFileName.Data();
265 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
267 else if(fStorage == 1) {
268 TString alienLocation = "/alien";
269 alienLocation += gGrid->Pwd();
270 alienLocation += fgridpath.Data();
271 alienLocation += "/";
272 alienLocation += localFileName;
273 alienLocation += "?se=";
274 alienLocation += fSE.Data();
275 fileName = alienLocation.Data();
276 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
279 TFile* ftag = TFile::Open(fileName, "recreate");
281 AliRunTag *tag = new AliRunTag();
282 AliEventTag *evTag = new AliEventTag();
283 TTree ttag("T","A Tree with event tags");
284 TBranch * btag = ttag.Branch("AliTAG", &tag);
285 btag->SetCompressionLevel(9);
287 for(Int_t iEventNumber = 0; iEventNumber < chain->GetEntries(); iEventNumber++) {
288 ntrack = 0; nPos = 0; nNeg = 0; nNeutr =0;
289 nK0s = 0; nNeutrons = 0; nPi0s = 0;
290 nGamas = 0; nProtons = 0; nKaons = 0;
291 nPions = 0; nMuons = 0; nElectrons = 0; nFWMuons = 0;
292 nCh1GeV = 0; nCh3GeV = 0; nCh10GeV = 0;
293 nMu1GeV = 0; nMu3GeV = 0; nMu10GeV = 0;
294 nEl1GeV = 0; nEl3GeV = 0; nEl10GeV = 0;
295 maxPt = .0; meanPt = .0; totalP = .0;
298 chain->GetEntry(iEventNumber);
299 esdold = esd->GetAliESDOld();
300 if(esdold) esd->CopyFromOldESD();
302 TFile *file = chain->GetFile();
303 const TUrl *url = file->GetEndpointUrl();
304 fguid = file->GetUUID().AsString();
305 if(fSession == "grid") {
306 TString fturltemp = "alien://"; fturltemp += url->GetFile();
307 fturl = fturltemp(0,fturltemp.Index(".root",5,0,TString::kExact)+5);
309 else fturl = url->GetFile();
311 if(iEventNumber == 0) iInitRunNumber = esd->GetRunNumber();
312 iRunNumber = esd->GetRunNumber();
313 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD - You are trying to merge different runs!!!");
315 const AliESDVertex * vertexIn = esd->GetVertex();
316 fVertexName = vertexIn->GetName();
317 if(fVertexName == "default") fVertexflag = 0;
319 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
320 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
321 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
322 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
323 UInt_t status = esdTrack->GetStatus();
325 //select only tracks with ITS refit
326 if ((status&AliESDtrack::kITSrefit)==0) continue;
327 //select only tracks with TPC refit
328 if ((status&AliESDtrack::kTPCrefit)==0) continue;
330 //select only tracks with the "combined PID"
331 if ((status&AliESDtrack::kESDpid)==0) continue;
333 esdTrack->GetPxPyPz(p);
334 Double_t pt2 = p[0]*p[0]+p[1]*p[1];
335 Double_t momentum = TMath::Sqrt(pt2+p[2]*p[2]);
336 Double_t fPt = TMath::Sqrt(pt2);
339 if(fPt > maxPt) maxPt = fPt;
341 if(esdTrack->GetSign() > 0) {
343 if(fPt > fLowPtCut) nCh1GeV++;
344 if(fPt > fHighPtCut) nCh3GeV++;
345 if(fPt > fVeryHighPtCut) nCh10GeV++;
347 if(esdTrack->GetSign() < 0) {
349 if(fPt > fLowPtCut) nCh1GeV++;
350 if(fPt > fHighPtCut) nCh3GeV++;
351 if(fPt > fVeryHighPtCut) nCh10GeV++;
353 if(esdTrack->GetSign() == 0) nNeutr++;
357 esdTrack->GetESDpid(prob);
360 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
361 if(rcc == 0.0) continue;
364 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
367 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
369 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
371 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
373 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
375 if(fPt > fLowPtCut) nEl1GeV++;
376 if(fPt > fHighPtCut) nEl3GeV++;
377 if(fPt > fVeryHighPtCut) nEl10GeV++;
385 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
386 // loop over all reconstructed tracks (also first track of combination)
387 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
388 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
389 if (muonTrack == 0x0) continue;
391 // Coordinates at vertex
392 fZ = muonTrack->GetZ();
393 fY = muonTrack->GetBendingCoor();
394 fX = muonTrack->GetNonBendingCoor();
396 fThetaX = muonTrack->GetThetaX();
397 fThetaY = muonTrack->GetThetaY();
399 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
400 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
401 fPxRec = fPzRec * TMath::Tan(fThetaX);
402 fPyRec = fPzRec * TMath::Tan(fThetaY);
403 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
405 //ChiSquare of the track if needed
406 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
407 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
408 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
410 // total number of muons inside a vertex cut
411 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
414 if(fEPvector.Pt() > fLowPtCut) {
416 if(fEPvector.Pt() > fHighPtCut) {
418 if (fEPvector.Pt() > fVeryHighPtCut) {
426 // Fill the event tags
427 if(ntrack != 0) meanPt = meanPt/ntrack;
429 //AliInfo(Form("====================================="));
430 //AliInfo(Form("URL: %s - GUID: %s",fturl.Data(),fguid.Data()));
431 //AliInfo(Form("====================================="));
434 const AliMultiplicity *spdMult = esd->GetMultiplicity();
435 evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0));
436 evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1));
437 evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets());
439 AliESDVZERO *vzeroData = esd->GetVZEROData();
440 evTag->SetMTotV0A(vzeroData->GetMTotV0A());
441 evTag->SetMTotV0C(vzeroData->GetMTotV0C());
442 evTag->SetNbPMV0A(vzeroData->GetNbPMV0A());
443 evTag->SetNbPMV0C(vzeroData->GetNbPMV0C());
445 //evTag->SetEventId(iEventNumber+1);
446 evTag->SetPeriodNumber(esd->GetPeriodNumber());
447 evTag->SetOrbitNumber(esd->GetOrbitNumber());
448 evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber());
449 evTag->SetGUID(fguid);
450 if(fSession == "grid") {
452 evTag->SetTURL(fturl);
455 else evTag->SetPath(fturl);
457 evTag->SetVertexX(vertexIn->GetXv());
458 evTag->SetVertexY(vertexIn->GetYv());
459 evTag->SetVertexZ(vertexIn->GetZv());
460 evTag->SetVertexZError(vertexIn->GetZRes());
461 evTag->SetVertexFlag(fVertexflag);
463 evTag->SetT0VertexZ(esd->GetT0zVertex());
465 evTag->SetTriggerMask(esd->GetTriggerMask());
466 evTag->SetTriggerCluster(esd->GetTriggerCluster());
468 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
469 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
470 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
471 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
472 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
473 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
474 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
475 evTag->SetNumOfParticipants2(esd->GetZDCParticipants2());
478 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
479 evTag->SetNumOfPosTracks(nPos);
480 evTag->SetNumOfNegTracks(nNeg);
481 evTag->SetNumOfNeutrTracks(nNeutr);
483 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
484 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
485 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
486 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
488 evTag->SetNumOfProtons(nProtons);
489 evTag->SetNumOfKaons(nKaons);
490 evTag->SetNumOfPions(nPions);
491 evTag->SetNumOfMuons(nMuons);
492 evTag->SetNumOfFWMuons(nFWMuons);
493 evTag->SetNumOfElectrons(nElectrons);
494 evTag->SetNumOfPhotons(nGamas);
495 evTag->SetNumOfPi0s(nPi0s);
496 evTag->SetNumOfNeutrons(nNeutrons);
497 evTag->SetNumOfKaon0s(nK0s);
499 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
500 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
501 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
502 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
503 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
504 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
505 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
506 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
507 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
510 evTag->SetNumOfPHOSClusters(esd->GetPHOSClusters(&tmp));
512 evTag->SetNumOfEMCALClusters(esd->GetEMCALClusters(&tmp));
514 evTag->SetTotalMomentum(totalP);
515 evTag->SetMeanPt(meanPt);
516 evTag->SetMaxPt(maxPt);
518 tag->SetRunId(iInitRunNumber);
519 if(fIsSim) tag->SetDataType(0);
520 else tag->SetDataType(1);
522 if(fguid != fTempGuid) {
527 tag->AddEventTag(*evTag);
528 if(iEventNumber+1 == chain->GetEntries()) {
529 //AliInfo(Form("File: %s",fturl.Data()));
534 lastEvent = chain->GetEntries();
536 //gSystem->GetMemInfo(meminfo);
537 //AliInfo(Form("After the event and track loop - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
538 //tempmem = meminfo->fMemUsed;
542 //gSystem->GetMemInfo(meminfo);
543 //AliInfo(Form("After the t->Delete - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
544 //tempmem = meminfo->fMemUsed;
551 //gSystem->GetMemInfo(meminfo);
552 //AliInfo(Form("After the file closing - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
553 //tempmem = meminfo->fMemUsed;
558 //gSystem->GetMemInfo(meminfo);
559 //AliInfo(Form("After the delete objects - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
562 //_____________________________________________________________________________
563 void AliESDTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, const char *turl, Long64_t size, Int_t Counter) {
564 //private method that creates tag files
565 TString fguid = guid;
567 TString fturl = turl;
571 Double_t fMUONMASS = 0.105658369;
574 Double_t fThetaX, fThetaY, fPyz, fChisquare;
575 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
577 TLorentzVector fEPvector;
579 Float_t fZVertexCut = 10.0;
580 Float_t fRhoVertexCut = 2.0;
582 Float_t fLowPtCut = 1.0;
583 Float_t fHighPtCut = 3.0;
584 Float_t fVeryHighPtCut = 10.0;
587 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
589 // Creates the tags for all the events in a given ESD file
590 Bool_t fIsSim = kTRUE;
592 Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons;
593 Int_t nPos, nNeg, nNeutr;
594 Int_t nK0s, nNeutrons, nPi0s, nGamas;
595 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
596 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
597 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
598 Float_t maxPt = .0, meanPt = .0, totalP = .0;
600 Int_t iRunNumber = 0;
604 AliRunTag *tag = new AliRunTag();
605 AliEventTag *evTag = new AliEventTag();
606 TTree ttag("T","A Tree with event tags");
607 TBranch * btag = ttag.Branch("AliTAG", &tag);
608 btag->SetCompressionLevel(9);
609 gSystem->GetMemInfo(meminfo);
610 AliInfo(Form("After the tag initialization - Memory used: %d MB",meminfo->fMemUsed));
611 Int_t tempmem = meminfo->fMemUsed;
613 AliInfo(Form("Creating the ESD tags......."));
615 Int_t firstEvent = 0,lastEvent = 0;
616 TTree *t = (TTree*) file->Get("esdTree");
617 AliESDEvent *esd = new AliESDEvent();
618 esd->ReadFromTree(t);
620 gSystem->GetMemInfo(meminfo);
621 AliInfo(Form("After the esd initialization - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
622 tempmem = meminfo->fMemUsed;
625 Int_t iInitRunNumber = esd->GetRunNumber();
627 Int_t iNumberOfEvents = (Int_t)t->GetEntries();
628 for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
657 t->GetEntry(iEventNumber);
658 iRunNumber = esd->GetRunNumber();
659 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
660 const AliESDVertex * vertexIn = esd->GetVertex();
661 fVertexName = vertexIn->GetName();
662 if(fVertexName == "default") fVertexflag = 0;
664 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
665 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
666 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
667 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
668 UInt_t status = esdTrack->GetStatus();
670 //select only tracks with ITS refit
671 if ((status&AliESDtrack::kITSrefit)==0) continue;
672 //select only tracks with TPC refit
673 if ((status&AliESDtrack::kTPCrefit)==0) continue;
675 //select only tracks with the "combined PID"
676 if ((status&AliESDtrack::kESDpid)==0) continue;
678 esdTrack->GetPxPyPz(p);
679 Double_t pt2 = p[0]*p[0]+p[1]*p[1];
680 Double_t momentum = TMath::Sqrt(pt2+p[2]*p[2]);
681 Double_t fPt = TMath::Sqrt(pt2);
684 if(fPt > maxPt) maxPt = fPt;
686 if(esdTrack->GetSign() > 0) {
688 if(fPt > fLowPtCut) nCh1GeV++;
689 if(fPt > fHighPtCut) nCh3GeV++;
690 if(fPt > fVeryHighPtCut) nCh10GeV++;
692 if(esdTrack->GetSign() < 0) {
694 if(fPt > fLowPtCut) nCh1GeV++;
695 if(fPt > fHighPtCut) nCh3GeV++;
696 if(fPt > fVeryHighPtCut) nCh10GeV++;
698 if(esdTrack->GetSign() == 0) nNeutr++;
702 esdTrack->GetESDpid(prob);
705 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
706 if(rcc == 0.0) continue;
709 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
712 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
714 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
716 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
718 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
720 if(fPt > fLowPtCut) nEl1GeV++;
721 if(fPt > fHighPtCut) nEl3GeV++;
722 if(fPt > fVeryHighPtCut) nEl10GeV++;
730 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
731 // loop over all reconstructed tracks (also first track of combination)
732 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
733 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
734 if (muonTrack == 0x0) continue;
736 // Coordinates at vertex
737 fZ = muonTrack->GetZ();
738 fY = muonTrack->GetBendingCoor();
739 fX = muonTrack->GetNonBendingCoor();
741 fThetaX = muonTrack->GetThetaX();
742 fThetaY = muonTrack->GetThetaY();
744 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
745 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
746 fPxRec = fPzRec * TMath::Tan(fThetaX);
747 fPyRec = fPzRec * TMath::Tan(fThetaY);
748 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
750 //ChiSquare of the track if needed
751 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
752 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
753 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
755 // total number of muons inside a vertex cut
756 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
759 if(fEPvector.Pt() > fLowPtCut) {
761 if(fEPvector.Pt() > fHighPtCut) {
763 if (fEPvector.Pt() > fVeryHighPtCut) {
771 // Fill the event tags
772 if(ntrack != 0) meanPt = meanPt/ntrack;
775 const AliMultiplicity *spdMult = esd->GetMultiplicity();
776 evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0));
777 evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1));
778 evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets());
780 AliESDVZERO *vzeroData = esd->GetVZEROData();
781 evTag->SetMTotV0A(vzeroData->GetMTotV0A());
782 evTag->SetMTotV0C(vzeroData->GetMTotV0C());
783 evTag->SetNbPMV0A(vzeroData->GetNbPMV0A());
784 evTag->SetNbPMV0C(vzeroData->GetNbPMV0C());
786 //evTag->SetEventId(iEventNumber+1);
787 evTag->SetPeriodNumber(esd->GetPeriodNumber());
788 evTag->SetOrbitNumber(esd->GetOrbitNumber());
789 evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber());
791 evTag->SetGUID(fguid);
793 evTag->SetTURL(fturl);
794 evTag->SetSize(size);
795 evTag->SetVertexX(vertexIn->GetXv());
796 evTag->SetVertexY(vertexIn->GetYv());
797 evTag->SetVertexZ(vertexIn->GetZv());
798 evTag->SetVertexZError(vertexIn->GetZRes());
799 evTag->SetVertexFlag(fVertexflag);
801 evTag->SetT0VertexZ(esd->GetT0zVertex());
803 evTag->SetTriggerMask(esd->GetTriggerMask());
804 evTag->SetTriggerCluster(esd->GetTriggerCluster());
806 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
807 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
808 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
809 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
810 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
811 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
814 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
815 evTag->SetNumOfPosTracks(nPos);
816 evTag->SetNumOfNegTracks(nNeg);
817 evTag->SetNumOfNeutrTracks(nNeutr);
819 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
820 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
821 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
822 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
824 evTag->SetNumOfProtons(nProtons);
825 evTag->SetNumOfKaons(nKaons);
826 evTag->SetNumOfPions(nPions);
827 evTag->SetNumOfMuons(nMuons);
828 evTag->SetNumOfFWMuons(nFWMuons);
829 evTag->SetNumOfElectrons(nElectrons);
830 evTag->SetNumOfPhotons(nGamas);
831 evTag->SetNumOfPi0s(nPi0s);
832 evTag->SetNumOfNeutrons(nNeutrons);
833 evTag->SetNumOfKaon0s(nK0s);
835 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
836 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
837 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
838 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
839 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
840 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
841 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
842 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
843 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
846 evTag->SetNumOfPHOSClusters(esd->GetPHOSClusters(&tmp));
848 evTag->SetNumOfEMCALClusters(esd->GetEMCALClusters(&tmp));
850 evTag->SetTotalMomentum(totalP);
851 evTag->SetMeanPt(meanPt);
852 evTag->SetMaxPt(maxPt);
854 tag->SetRunId(iInitRunNumber);
855 if(fIsSim) tag->SetDataType(0);
856 else tag->SetDataType(1);
857 tag->AddEventTag(*evTag);
859 lastEvent = iNumberOfEvents;
861 gSystem->GetMemInfo(meminfo);
862 AliInfo(Form("After the event and track loop - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
863 tempmem = meminfo->fMemUsed;
866 gSystem->GetMemInfo(meminfo);
867 AliInfo(Form("After the t->Delete - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
868 tempmem = meminfo->fMemUsed;
870 TString localFileName = "Run"; localFileName += tag->GetRunId();
871 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter;
872 localFileName += ".ESD.tag.root";
877 fileName = localFileName.Data();
878 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
880 else if(fStorage == 1) {
881 TString alienLocation = "/alien";
882 alienLocation += gGrid->Pwd();
883 alienLocation += fgridpath.Data();
884 alienLocation += "/";
885 alienLocation += localFileName;
886 alienLocation += "?se=";
887 alienLocation += fSE.Data();
888 fileName = alienLocation.Data();
889 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
892 TFile* ftag = TFile::Open(fileName, "recreate");
899 gSystem->GetMemInfo(meminfo);
900 AliInfo(Form("After the file closing - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
901 tempmem = meminfo->fMemUsed;
907 gSystem->GetMemInfo(meminfo);
908 AliInfo(Form("After the delete objects - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
911 //_____________________________________________________________________________
912 void AliESDTagCreator::CreateTag(TFile* file, const char *filepath, Int_t Counter) {
913 //private method that creates tag files
917 Double_t fMUONMASS = 0.105658369;
920 Double_t fThetaX, fThetaY, fPyz, fChisquare;
921 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
923 TLorentzVector fEPvector;
925 Float_t fZVertexCut = 10.0;
926 Float_t fRhoVertexCut = 2.0;
928 Float_t fLowPtCut = 1.0;
929 Float_t fHighPtCut = 3.0;
930 Float_t fVeryHighPtCut = 10.0;
933 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
935 // Creates the tags for all the events in a given ESD file
936 Bool_t fIsSim = kTRUE;
938 Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons;
939 Int_t nPos, nNeg, nNeutr;
940 Int_t nK0s, nNeutrons, nPi0s, nGamas;
941 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
942 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
943 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
944 Float_t maxPt = .0, meanPt = .0, totalP = .0;
946 Int_t iRunNumber = 0;
950 AliRunTag *tag = new AliRunTag();
951 AliEventTag *evTag = new AliEventTag();
952 TTree ttag("T","A Tree with event tags");
953 TBranch * btag = ttag.Branch("AliTAG", &tag);
954 btag->SetCompressionLevel(9);
956 AliInfo(Form("Creating the ESD tags......."));
958 Int_t firstEvent = 0,lastEvent = 0;
960 TTree *t = (TTree*) file->Get("esdTree");
961 AliESDEvent *esd = new AliESDEvent();
962 esd->ReadFromTree(t);
965 Int_t iInitRunNumber = esd->GetRunNumber();
967 Int_t iNumberOfEvents = (Int_t)t->GetEntries();
968 for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
997 t->GetEntry(iEventNumber);
998 iRunNumber = esd->GetRunNumber();
999 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
1000 const AliESDVertex * vertexIn = esd->GetVertex();
1001 fVertexName = vertexIn->GetName();
1002 if(fVertexName == "default") fVertexflag = 0;
1004 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
1005 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
1006 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
1007 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
1008 UInt_t status = esdTrack->GetStatus();
1010 //select only tracks with ITS refit
1011 if ((status&AliESDtrack::kITSrefit)==0) continue;
1012 //select only tracks with TPC refit
1013 if ((status&AliESDtrack::kTPCrefit)==0) continue;
1015 //select only tracks with the "combined PID"
1016 if ((status&AliESDtrack::kESDpid)==0) continue;
1018 esdTrack->GetPxPyPz(p);
1019 Double_t pt2 = p[0]*p[0]+p[1]*p[1];
1020 Double_t momentum = TMath::Sqrt(pt2+p[2]*p[2]);
1021 Double_t fPt = TMath::Sqrt(pt2);
1024 if(fPt > maxPt) maxPt = fPt;
1026 if(esdTrack->GetSign() > 0) {
1028 if(fPt > fLowPtCut) nCh1GeV++;
1029 if(fPt > fHighPtCut) nCh3GeV++;
1030 if(fPt > fVeryHighPtCut) nCh10GeV++;
1032 if(esdTrack->GetSign() < 0) {
1034 if(fPt > fLowPtCut) nCh1GeV++;
1035 if(fPt > fHighPtCut) nCh3GeV++;
1036 if(fPt > fVeryHighPtCut) nCh10GeV++;
1038 if(esdTrack->GetSign() == 0) nNeutr++;
1042 esdTrack->GetESDpid(prob);
1045 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
1046 if(rcc == 0.0) continue;
1049 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1052 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1054 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1056 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
1058 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1060 if(fPt > fLowPtCut) nEl1GeV++;
1061 if(fPt > fHighPtCut) nEl3GeV++;
1062 if(fPt > fVeryHighPtCut) nEl10GeV++;
1070 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1071 // loop over all reconstructed tracks (also first track of combination)
1072 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
1073 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1074 if (muonTrack == 0x0) continue;
1076 // Coordinates at vertex
1077 fZ = muonTrack->GetZ();
1078 fY = muonTrack->GetBendingCoor();
1079 fX = muonTrack->GetNonBendingCoor();
1081 fThetaX = muonTrack->GetThetaX();
1082 fThetaY = muonTrack->GetThetaY();
1084 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1085 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1086 fPxRec = fPzRec * TMath::Tan(fThetaX);
1087 fPyRec = fPzRec * TMath::Tan(fThetaY);
1088 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1090 //ChiSquare of the track if needed
1091 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1092 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1093 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1095 // total number of muons inside a vertex cut
1096 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
1099 if(fEPvector.Pt() > fLowPtCut) {
1101 if(fEPvector.Pt() > fHighPtCut) {
1103 if (fEPvector.Pt() > fVeryHighPtCut) {
1111 // Fill the event tags
1112 if(ntrack != 0) meanPt = meanPt/ntrack;
1114 //First physics data
1115 const AliMultiplicity *spdMult = esd->GetMultiplicity();
1116 evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0));
1117 evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1));
1118 evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets());
1120 AliESDVZERO *vzeroData = esd->GetVZEROData();
1121 evTag->SetMTotV0A(vzeroData->GetMTotV0A());
1122 evTag->SetMTotV0C(vzeroData->GetMTotV0C());
1123 evTag->SetNbPMV0A(vzeroData->GetNbPMV0A());
1124 evTag->SetNbPMV0C(vzeroData->GetNbPMV0C());
1126 //evTag->SetEventId(iEventNumber+1);
1127 evTag->SetPeriodNumber(esd->GetPeriodNumber());
1128 evTag->SetOrbitNumber(esd->GetOrbitNumber());
1129 evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber());
1130 evTag->SetPath(filepath);
1132 evTag->SetVertexX(vertexIn->GetXv());
1133 evTag->SetVertexY(vertexIn->GetYv());
1134 evTag->SetVertexZ(vertexIn->GetZv());
1135 evTag->SetVertexZError(vertexIn->GetZRes());
1136 evTag->SetVertexFlag(fVertexflag);
1138 evTag->SetT0VertexZ(esd->GetT0zVertex());
1140 evTag->SetTriggerMask(esd->GetTriggerMask());
1141 evTag->SetTriggerCluster(esd->GetTriggerCluster());
1143 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1144 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1145 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
1146 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
1147 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
1148 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1151 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1152 evTag->SetNumOfPosTracks(nPos);
1153 evTag->SetNumOfNegTracks(nNeg);
1154 evTag->SetNumOfNeutrTracks(nNeutr);
1156 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1157 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1158 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
1159 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
1161 evTag->SetNumOfProtons(nProtons);
1162 evTag->SetNumOfKaons(nKaons);
1163 evTag->SetNumOfPions(nPions);
1164 evTag->SetNumOfMuons(nMuons);
1165 evTag->SetNumOfFWMuons(nFWMuons);
1166 evTag->SetNumOfElectrons(nElectrons);
1167 evTag->SetNumOfPhotons(nGamas);
1168 evTag->SetNumOfPi0s(nPi0s);
1169 evTag->SetNumOfNeutrons(nNeutrons);
1170 evTag->SetNumOfKaon0s(nK0s);
1172 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1173 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1174 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1175 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1176 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1177 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1178 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1179 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1180 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
1183 evTag->SetNumOfPHOSClusters(esd->GetPHOSClusters(&tmp));
1185 evTag->SetNumOfEMCALClusters(esd->GetEMCALClusters(&tmp));
1187 evTag->SetTotalMomentum(totalP);
1188 evTag->SetMeanPt(meanPt);
1189 evTag->SetMaxPt(maxPt);
1191 tag->SetRunId(iInitRunNumber);
1192 if(fIsSim) tag->SetDataType(0);
1193 else tag->SetDataType(1);
1194 tag->AddEventTag(*evTag);
1196 lastEvent = iNumberOfEvents;
1200 TString localFileName = "Run"; localFileName += tag->GetRunId();
1201 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter;
1202 localFileName += ".ESD.tag.root";
1207 fileName = localFileName.Data();
1208 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
1210 else if(fStorage == 1) {
1211 TString alienLocation = "/alien";
1212 alienLocation += gGrid->Pwd();
1213 alienLocation += fgridpath.Data();
1214 alienLocation += "/";
1215 alienLocation += localFileName;
1216 alienLocation += "?se=";
1217 alienLocation += fSE.Data();
1218 fileName = alienLocation.Data();
1219 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
1222 TFile* ftag = TFile::Open(fileName, "recreate");
1235 //_____________________________________________________________________________
1236 void AliESDTagCreator::CreateESDTags(Int_t fFirstEvent, Int_t fLastEvent, AliGRPObject *grpData, ULong_t * qa, Bool_t * es, Int_t qalength, Int_t eslength) {
1238 Float_t lhcLuminosity = 0.0;
1239 TString lhcState = "test";
1240 //UInt_t detectorMask = 0;
1241 Int_t detectorMask = 0;
1243 detectorMask = grpData->GetDetectorMask();
1244 time_t startTime = grpData->GetTimeStart();
1245 TTimeStamp *t1 = new TTimeStamp(startTime);
1246 time_t endTime = grpData->GetTimeEnd();
1247 TTimeStamp *t2 = new TTimeStamp(endTime);
1248 const char* beamtype = grpData->GetBeamType();
1249 Float_t beamenergy = grpData->GetBeamEnergy();
1255 Double_t fMUONMASS = 0.105658369;
1258 Double_t fThetaX, fThetaY, fPyz, fChisquare;
1259 Double_t fPxRec,fPyRec, fPzRec, fEnergy;
1261 TLorentzVector fEPvector;
1263 Float_t fZVertexCut = 10.0;
1264 Float_t fRhoVertexCut = 2.0;
1266 Float_t fLowPtCut = 1.0;
1267 Float_t fHighPtCut = 3.0;
1268 Float_t fVeryHighPtCut = 10.0;
1271 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
1273 // Creates the tags for all the events in a given ESD file
1275 Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons;
1276 Int_t nPos, nNeg, nNeutr;
1277 Int_t nK0s, nNeutrons, nPi0s, nGamas;
1278 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
1279 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
1280 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
1281 Float_t maxPt = .0, meanPt = .0, totalP = .0;
1283 Int_t iRunNumber = 0;
1284 TString fVertexName("default");
1287 AliInfo(Form("Creating the ESD tags......."));
1289 TFile *file = TFile::Open("AliESDs.root");
1290 if (!file || !file->IsOpen()) {
1291 AliError(Form("opening failed"));
1295 Int_t lastEvent = 0;
1296 TTree *b = (TTree*) file->Get("esdTree");
1297 AliESDEvent *esd = new AliESDEvent();
1298 esd->ReadFromTree(b);
1300 b->GetEntry(fFirstEvent);
1301 Int_t iInitRunNumber = esd->GetRunNumber();
1303 Int_t iNumberOfEvents = (Int_t)b->GetEntries();
1304 if(fLastEvent == -1) lastEvent = (Int_t)b->GetEntries();
1305 else lastEvent = fLastEvent;
1308 sprintf(fileName, "Run%d.Event%d_%d.ESD.tag.root",
1309 iInitRunNumber,fFirstEvent,lastEvent);
1310 AliInfo(Form("writing tags to file %s", fileName));
1311 AliDebug(1, Form("writing tags to file %s", fileName));
1313 TFile* ftag = TFile::Open(fileName, "recreate");
1315 AliRunTag *tag = new AliRunTag();
1316 AliEventTag *evTag = new AliEventTag();
1317 TTree ttag("T","A Tree with event tags");
1318 TBranch * btag = ttag.Branch("AliTAG", &tag);
1319 btag->SetCompressionLevel(9);
1321 if(fLastEvent != -1) iNumberOfEvents = fLastEvent + 1;
1322 for (Int_t iEventNumber = fFirstEvent; iEventNumber < iNumberOfEvents; iEventNumber++) {
1351 b->GetEntry(iEventNumber);
1352 iRunNumber = esd->GetRunNumber();
1353 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
1354 const AliESDVertex * vertexIn = esd->GetVertex();
1355 if (!vertexIn) AliError("ESD has not defined vertex.");
1356 if (vertexIn) fVertexName = vertexIn->GetName();
1357 if(fVertexName != "default") fVertexflag = 1;
1358 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
1359 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
1360 UInt_t status = esdTrack->GetStatus();
1362 //select only tracks with ITS refit
1363 if ((status&AliESDtrack::kITSrefit)==0) continue;
1364 //select only tracks with TPC refit
1365 if ((status&AliESDtrack::kTPCrefit)==0) continue;
1367 //select only tracks with the "combined PID"
1368 if ((status&AliESDtrack::kESDpid)==0) continue;
1370 esdTrack->GetPxPyPz(p);
1371 Double_t pt2 = p[0]*p[0]+p[1]*p[1];
1372 Double_t momentum = TMath::Sqrt(pt2+p[2]*p[2]);
1373 Double_t fPt = TMath::Sqrt(pt2);
1376 if(fPt > maxPt) maxPt = fPt;
1378 if(esdTrack->GetSign() > 0) {
1380 if(fPt > fLowPtCut) nCh1GeV++;
1381 if(fPt > fHighPtCut) nCh3GeV++;
1382 if(fPt > fVeryHighPtCut) nCh10GeV++;
1384 if(esdTrack->GetSign() < 0) {
1386 if(fPt > fLowPtCut) nCh1GeV++;
1387 if(fPt > fHighPtCut) nCh3GeV++;
1388 if(fPt > fVeryHighPtCut) nCh10GeV++;
1390 if(esdTrack->GetSign() == 0) nNeutr++;
1394 esdTrack->GetESDpid(prob);
1397 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
1398 if(rcc == 0.0) continue;
1401 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1404 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1406 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1408 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
1410 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1412 if(fPt > fLowPtCut) nEl1GeV++;
1413 if(fPt > fHighPtCut) nEl3GeV++;
1414 if(fPt > fVeryHighPtCut) nEl10GeV++;
1422 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1423 // loop over all reconstructed tracks (also first track of combination)
1424 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
1425 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1426 if (muonTrack == 0x0) continue;
1428 // Coordinates at vertex
1429 fZ = muonTrack->GetZ();
1430 fY = muonTrack->GetBendingCoor();
1431 fX = muonTrack->GetNonBendingCoor();
1433 fThetaX = muonTrack->GetThetaX();
1434 fThetaY = muonTrack->GetThetaY();
1436 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1437 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1438 fPxRec = fPzRec * TMath::Tan(fThetaX);
1439 fPyRec = fPzRec * TMath::Tan(fThetaY);
1440 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1442 //ChiSquare of the track if needed
1443 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1444 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1445 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1447 // total number of muons inside a vertex cut
1448 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
1451 if(fEPvector.Pt() > fLowPtCut) {
1453 if(fEPvector.Pt() > fHighPtCut) {
1455 if (fEPvector.Pt() > fVeryHighPtCut) {
1464 // Fill the event tags
1466 meanPt = meanPt/ntrack;
1468 //First physics data
1469 const AliMultiplicity *spdMult = esd->GetMultiplicity();
1470 evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0));
1471 evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1));
1472 evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets());
1474 AliESDVZERO *vzeroData = esd->GetVZEROData();
1475 evTag->SetMTotV0A(vzeroData->GetMTotV0A());
1476 evTag->SetMTotV0C(vzeroData->GetMTotV0C());
1477 evTag->SetNbPMV0A(vzeroData->GetNbPMV0A());
1478 evTag->SetNbPMV0C(vzeroData->GetNbPMV0C());
1480 //evTag->SetEventId(iEventNumber+1);
1481 evTag->SetPeriodNumber(esd->GetPeriodNumber());
1482 evTag->SetOrbitNumber(esd->GetOrbitNumber());
1483 evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber());
1485 evTag->SetVertexX(vertexIn->GetXv());
1486 evTag->SetVertexY(vertexIn->GetYv());
1487 evTag->SetVertexZ(vertexIn->GetZv());
1488 evTag->SetVertexZError(vertexIn->GetZRes());
1490 evTag->SetVertexFlag(fVertexflag);
1492 evTag->SetT0VertexZ(esd->GetT0zVertex());
1494 evTag->SetTriggerMask(esd->GetTriggerMask());
1495 evTag->SetTriggerCluster(esd->GetTriggerCluster());
1497 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1498 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1499 evTag->SetZDCNeutron2Energy(esd->GetZDCN2Energy());
1500 evTag->SetZDCProton2Energy(esd->GetZDCP2Energy());
1501 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
1502 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1505 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1506 evTag->SetNumOfPosTracks(nPos);
1507 evTag->SetNumOfNegTracks(nNeg);
1508 evTag->SetNumOfNeutrTracks(nNeutr);
1510 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1511 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1512 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
1513 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
1515 evTag->SetNumOfProtons(nProtons);
1516 evTag->SetNumOfKaons(nKaons);
1517 evTag->SetNumOfPions(nPions);
1518 evTag->SetNumOfMuons(nMuons);
1519 evTag->SetNumOfFWMuons(nFWMuons);
1520 evTag->SetNumOfElectrons(nElectrons);
1521 evTag->SetNumOfPhotons(nGamas);
1522 evTag->SetNumOfPi0s(nPi0s);
1523 evTag->SetNumOfNeutrons(nNeutrons);
1524 evTag->SetNumOfKaon0s(nK0s);
1526 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1527 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1528 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1529 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1530 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1531 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1532 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1533 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1534 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
1537 evTag->SetNumOfPHOSClusters(esd->GetPHOSClusters(&tmp));
1539 evTag->SetNumOfEMCALClusters(esd->GetEMCALClusters(&tmp));
1541 evTag->SetTotalMomentum(totalP);
1542 evTag->SetMeanPt(meanPt);
1543 evTag->SetMaxPt(maxPt);
1545 tag->SetLHCTag(lhcLuminosity,lhcState);
1546 tag->SetDetectorTag(detectorMask);
1548 tag->SetRunId(iInitRunNumber);
1549 tag->SetRunStartTime(t1->GetDate());
1550 tag->SetRunStopTime(t2->GetDate());
1551 tag->SetBeamEnergy(beamenergy);
1552 tag->SetBeamType(beamtype);
1555 tag->SetQAArray(qa, qalength) ;
1556 tag->SetEventSpecies(es, eslength) ;
1558 tag->AddEventTag(*evTag);
1571 //_____________________________________________________________________________
1572 void AliESDTagCreator::SwitchOffBranches() const {
1574 // Switch of branches on user request
1575 TObjArray * tokens = fBranches.Tokenize(" ");
1576 Int_t ntok = tokens->GetEntries();
1577 for (Int_t i = 0; i < ntok; i++) {
1578 TString str = ((TObjString*) tokens->At(i))->GetString();
1579 fChain->SetBranchStatus(Form("%s%s%s","*", str.Data(), "*"), 0);
1580 AliInfo(Form("Branch %s switched off \n", str.Data()));