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>
37 #include <TGridResult.h>
40 #include "AliRunTag.h"
41 #include "AliEventTag.h"
43 #include "AliESDEvent.h"
44 #include "AliESDVertex.h"
46 #include "AliGRPObject.h"
48 #include "AliESDTagCreator.h"
51 ClassImp(AliESDTagCreator)
54 //______________________________________________________________________________
55 AliESDTagCreator::AliESDTagCreator() :
57 fChain(new TChain("esdTree")), fGUIDList(new TList()),
58 fMD5List(new TList()), fTURLList(new TList()), fBranches(""),
59 meminfo(new MemInfo_t) {
60 //==============Default constructor for a AliESDTagCreator================
63 //______________________________________________________________________________
64 AliESDTagCreator::~AliESDTagCreator() {
65 //================Default destructor for a AliESDTagCreator===================
73 //______________________________________________________________________________
74 Bool_t AliESDTagCreator::ReadGridCollection(TGridResult *fresult) {
75 // Reads the entry of the TGridResult and creates the tags
76 Int_t nEntries = fresult->GetEntries();
85 for(Int_t i = 0; i < nEntries; i++) {
86 alienUrl = fresult->GetKey(i,"turl");
87 guid = fresult->GetKey(i,"guid");
88 if(fresult->GetKey(i,"size")) size = atol (fresult->GetKey(i,"size"));
89 md5 = fresult->GetKey(i,"md5");
90 turl = fresult->GetKey(i,"turl");
91 if(md5 && !strlen(guid)) md5 = 0;
92 if(guid && !strlen(guid)) guid = 0;
94 fChain->Add(alienUrl);
95 //fGUIDList->Add(new TObjString(guid));
96 //fMD5List->Add(new TObjString(md5));
97 //fTURLList->Add(new TObjString(turl));
99 //TFile *f = TFile::Open(alienUrl,"READ");
100 //CreateTag(f,guid,md5,turl,size,counter);
106 AliInfo(Form("ESD chain created......."));
107 AliInfo(Form("Chain entries: %d",fChain->GetEntries()));
108 // Switch of branches on user request
110 CreateTag(fChain,"grid");
115 //______________________________________________________________________________
116 Bool_t AliESDTagCreator::ReadLocalCollection(const char *localpath) {
117 // Checks the different subdirs of the given local path and in the
118 // case where it finds an AliESDs.root file it creates the tags
120 void *dira = gSystem->OpenDirectory(localpath);
122 const char * dirname = 0x0;
123 const char * filename = 0x0;
124 const char * pattern = "AliESDs.root";
127 while((dirname = gSystem->GetDirEntry(dira))) {
128 sprintf(fPath,"%s/%s",localpath,dirname);
129 void *dirb = gSystem->OpenDirectory(fPath);
130 while((filename = gSystem->GetDirEntry(dirb))) {
131 if(strstr(filename,pattern)) {
132 TString fESDFileName;
133 fESDFileName = fPath;
135 fESDFileName += pattern;
137 fChain->Add(fESDFileName);
139 //TFile *f = TFile::Open(fESDFileName,"READ");
140 //CreateTag(f,fESDFileName,counter);
146 }//child directory's entry loop
147 }//parent directory's entry loop
149 AliInfo(Form("ESD chain created......."));
150 AliInfo(Form("Chain entries: %d",fChain->GetEntries()));
151 // Switch of branches on user request
153 CreateTag(fChain,"local");
158 //______________________________________________________________________________
159 Bool_t AliESDTagCreator::ReadCAFCollection(const char *filename) {
160 // Temporary solution for CAF: Takes as an input the ascii file that
161 // lists the ESDs stored in the SE of the CAF and creates the tags.
163 // Open the input stream
169 // Read the input list of files and add them to the chain
172 if (!esdfile.Contains("root")) continue; // protection
174 fChain->Add(esdfile);
176 //TFile *f = TFile::Open(esdfile,"READ");
177 //CreateTag(f,esdfile,counter);
184 AliInfo(Form("ESD chain created......."));
185 AliInfo(Form("Chain entries: %d",fChain->GetEntries()));
186 // Switch of branches on user request
188 CreateTag(fChain,"proof");
193 //_____________________________________________________________________________
194 void AliESDTagCreator::CreateTag(TChain* chain, const char *type) {
195 //private method that creates tag files
196 TString fSession = type;
197 TString fguid, fmd5, fturl;
198 TString fTempGuid = 0;
203 Double_t fMUONMASS = 0.105658369;
206 Double_t fThetaX, fThetaY, fPyz, fChisquare;
207 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
209 TLorentzVector fEPvector;
211 Float_t fZVertexCut = 10.0;
212 Float_t fRhoVertexCut = 2.0;
214 Float_t fLowPtCut = 1.0;
215 Float_t fHighPtCut = 3.0;
216 Float_t fVeryHighPtCut = 10.0;
219 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
221 // Creates the tags for all the events in a given ESD file
222 Bool_t fIsSim = kTRUE;
224 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
225 Int_t nPos, nNeg, nNeutr;
226 Int_t nK0s, nNeutrons, nPi0s, nGamas;
227 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
228 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
229 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
230 Float_t maxPt = .0, meanPt = .0, totalP = .0;
232 Int_t iRunNumber = 0;
235 //gSystem->GetMemInfo(meminfo);
236 //AliInfo(Form("After the tag initialization - Memory used: %d MB",meminfo->fMemUsed));
237 //Int_t tempmem = meminfo->fMemUsed;
239 AliInfo(Form("Creating the ESD tags......."));
241 Int_t firstEvent = 0,lastEvent = 0;
242 AliESDEvent *esd = new AliESDEvent();
243 esd->ReadFromTree(chain);
244 AliESD *esdold = 0x0;
246 //gSystem->GetMemInfo(meminfo);
247 //AliInfo(Form("After the esd initialization - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
248 //tempmem = meminfo->fMemUsed;
250 Int_t iInitRunNumber = -1;
252 TFile *f = chain->GetFile();
253 fTempGuid = f->GetUUID().AsString();
255 TString localFileName = "Run"; localFileName += esd->GetRunNumber();
256 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += chain->GetEntries(); //localFileName += "."; localFileName += Counter;
257 localFileName += ".ESD.tag.root";
262 fileName = localFileName.Data();
263 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
265 else if(fStorage == 1) {
266 TString alienLocation = "/alien";
267 alienLocation += gGrid->Pwd();
268 alienLocation += fgridpath.Data();
269 alienLocation += "/";
270 alienLocation += localFileName;
271 alienLocation += "?se=";
272 alienLocation += fSE.Data();
273 fileName = alienLocation.Data();
274 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
277 TFile* ftag = TFile::Open(fileName, "recreate");
279 AliRunTag *tag = new AliRunTag();
280 AliEventTag *evTag = new AliEventTag();
281 TTree ttag("T","A Tree with event tags");
282 TBranch * btag = ttag.Branch("AliTAG", &tag);
283 btag->SetCompressionLevel(9);
285 for(Int_t iEventNumber = 0; iEventNumber < chain->GetEntries(); iEventNumber++) {
286 ntrack = 0; nPos = 0; nNeg = 0; nNeutr =0;
287 nK0s = 0; nNeutrons = 0; nPi0s = 0;
288 nGamas = 0; nProtons = 0; nKaons = 0;
289 nPions = 0; nMuons = 0; nElectrons = 0;
290 nCh1GeV = 0; nCh3GeV = 0; nCh10GeV = 0;
291 nMu1GeV = 0; nMu3GeV = 0; nMu10GeV = 0;
292 nEl1GeV = 0; nEl3GeV = 0; nEl10GeV = 0;
293 maxPt = .0; meanPt = .0; totalP = .0;
296 chain->GetEntry(iEventNumber);
297 esdold = esd->GetAliESDOld();
298 if(esdold) esd->CopyFromOldESD();
300 TFile *file = chain->GetFile();
301 const TUrl *url = file->GetEndpointUrl();
302 fguid = file->GetUUID().AsString();
303 if(fSession == "grid") {
304 TString fturltemp = "alien://"; fturltemp += url->GetFile();
305 fturl = fturltemp(0,fturltemp.Index(".root",5,0,TString::kExact)+5);
307 else fturl = url->GetFile();
309 if(iEventNumber == 0) iInitRunNumber = esd->GetRunNumber();
310 iRunNumber = esd->GetRunNumber();
311 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD - You are trying to merge different runs!!!");
313 const AliESDVertex * vertexIn = esd->GetVertex();
314 fVertexName = vertexIn->GetName();
315 if(fVertexName == "default") fVertexflag = 0;
317 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
318 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
319 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
320 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
321 UInt_t status = esdTrack->GetStatus();
323 //select only tracks with ITS refit
324 if ((status&AliESDtrack::kITSrefit)==0) continue;
325 //select only tracks with TPC refit
326 if ((status&AliESDtrack::kTPCrefit)==0) continue;
328 //select only tracks with the "combined PID"
329 if ((status&AliESDtrack::kESDpid)==0) continue;
331 esdTrack->GetPxPyPz(p);
332 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
333 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
336 if(fPt > maxPt) maxPt = fPt;
338 if(esdTrack->GetSign() > 0) {
340 if(fPt > fLowPtCut) nCh1GeV++;
341 if(fPt > fHighPtCut) nCh3GeV++;
342 if(fPt > fVeryHighPtCut) nCh10GeV++;
344 if(esdTrack->GetSign() < 0) {
346 if(fPt > fLowPtCut) nCh1GeV++;
347 if(fPt > fHighPtCut) nCh3GeV++;
348 if(fPt > fVeryHighPtCut) nCh10GeV++;
350 if(esdTrack->GetSign() == 0) nNeutr++;
354 esdTrack->GetESDpid(prob);
357 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
358 if(rcc == 0.0) continue;
361 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
364 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
366 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
368 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
370 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
372 if(fPt > fLowPtCut) nEl1GeV++;
373 if(fPt > fHighPtCut) nEl3GeV++;
374 if(fPt > fVeryHighPtCut) nEl10GeV++;
382 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
383 // loop over all reconstructed tracks (also first track of combination)
384 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
385 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
386 if (muonTrack == 0x0) continue;
388 // Coordinates at vertex
389 fZ = muonTrack->GetZ();
390 fY = muonTrack->GetBendingCoor();
391 fX = muonTrack->GetNonBendingCoor();
393 fThetaX = muonTrack->GetThetaX();
394 fThetaY = muonTrack->GetThetaY();
396 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
397 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
398 fPxRec = fPzRec * TMath::Tan(fThetaX);
399 fPyRec = fPzRec * TMath::Tan(fThetaY);
400 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
402 //ChiSquare of the track if needed
403 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
404 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
405 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
407 // total number of muons inside a vertex cut
408 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
410 if(fEPvector.Pt() > fLowPtCut) {
412 if(fEPvector.Pt() > fHighPtCut) {
414 if (fEPvector.Pt() > fVeryHighPtCut) {
422 // Fill the event tags
423 if(ntrack != 0) meanPt = meanPt/ntrack;
425 //AliInfo(Form("====================================="));
426 //AliInfo(Form("URL: %s - GUID: %s",fturl.Data(),fguid.Data()));
427 //AliInfo(Form("====================================="));
429 evTag->SetEventId(iEventNumber+1);
430 evTag->SetGUID(fguid);
431 if(fSession == "grid") {
433 evTag->SetTURL(fturl);
436 else evTag->SetPath(fturl);
438 evTag->SetVertexX(vertexIn->GetXv());
439 evTag->SetVertexY(vertexIn->GetYv());
440 evTag->SetVertexZ(vertexIn->GetZv());
441 evTag->SetVertexZError(vertexIn->GetZRes());
442 evTag->SetVertexFlag(fVertexflag);
444 evTag->SetT0VertexZ(esd->GetT0zVertex());
446 evTag->SetTriggerMask(esd->GetTriggerMask());
447 evTag->SetTriggerCluster(esd->GetTriggerCluster());
449 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
450 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
451 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
452 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
453 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
454 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
455 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
456 evTag->SetNumOfParticipants2(esd->GetZDCParticipants2());
459 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
460 evTag->SetNumOfPosTracks(nPos);
461 evTag->SetNumOfNegTracks(nNeg);
462 evTag->SetNumOfNeutrTracks(nNeutr);
464 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
465 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
466 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
467 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
469 evTag->SetNumOfProtons(nProtons);
470 evTag->SetNumOfKaons(nKaons);
471 evTag->SetNumOfPions(nPions);
472 evTag->SetNumOfMuons(nMuons);
473 evTag->SetNumOfElectrons(nElectrons);
474 evTag->SetNumOfPhotons(nGamas);
475 evTag->SetNumOfPi0s(nPi0s);
476 evTag->SetNumOfNeutrons(nNeutrons);
477 evTag->SetNumOfKaon0s(nK0s);
479 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
480 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
481 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
482 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
483 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
484 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
485 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
486 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
487 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
489 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
490 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
492 evTag->SetTotalMomentum(totalP);
493 evTag->SetMeanPt(meanPt);
494 evTag->SetMaxPt(maxPt);
496 tag->SetRunId(iInitRunNumber);
497 if(fIsSim) tag->SetDataType(0);
498 else tag->SetDataType(1);
500 if(fguid != fTempGuid) {
505 tag->AddEventTag(*evTag);
506 if(iEventNumber+1 == chain->GetEntries()) {
507 //AliInfo(Form("File: %s",fturl.Data()));
512 lastEvent = chain->GetEntries();
514 //gSystem->GetMemInfo(meminfo);
515 //AliInfo(Form("After the event and track loop - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
516 //tempmem = meminfo->fMemUsed;
520 //gSystem->GetMemInfo(meminfo);
521 //AliInfo(Form("After the t->Delete - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
522 //tempmem = meminfo->fMemUsed;
529 //gSystem->GetMemInfo(meminfo);
530 //AliInfo(Form("After the file closing - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
531 //tempmem = meminfo->fMemUsed;
536 //gSystem->GetMemInfo(meminfo);
537 //AliInfo(Form("After the delete objects - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
540 //_____________________________________________________________________________
541 void AliESDTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, const char *turl, Long64_t size, Int_t Counter) {
542 //private method that creates tag files
543 TString fguid = guid;
545 TString fturl = turl;
549 Double_t fMUONMASS = 0.105658369;
552 Double_t fThetaX, fThetaY, fPyz, fChisquare;
553 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
555 TLorentzVector fEPvector;
557 Float_t fZVertexCut = 10.0;
558 Float_t fRhoVertexCut = 2.0;
560 Float_t fLowPtCut = 1.0;
561 Float_t fHighPtCut = 3.0;
562 Float_t fVeryHighPtCut = 10.0;
565 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
567 // Creates the tags for all the events in a given ESD file
568 Bool_t fIsSim = kTRUE;
570 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
571 Int_t nPos, nNeg, nNeutr;
572 Int_t nK0s, nNeutrons, nPi0s, nGamas;
573 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
574 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
575 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
576 Float_t maxPt = .0, meanPt = .0, totalP = .0;
578 Int_t iRunNumber = 0;
581 AliRunTag *tag = new AliRunTag();
582 AliEventTag *evTag = new AliEventTag();
583 TTree ttag("T","A Tree with event tags");
584 TBranch * btag = ttag.Branch("AliTAG", &tag);
585 btag->SetCompressionLevel(9);
586 gSystem->GetMemInfo(meminfo);
587 AliInfo(Form("After the tag initialization - Memory used: %d MB",meminfo->fMemUsed));
588 Int_t tempmem = meminfo->fMemUsed;
590 AliInfo(Form("Creating the ESD tags......."));
592 Int_t firstEvent = 0,lastEvent = 0;
593 TTree *t = (TTree*) file->Get("esdTree");
594 AliESDEvent *esd = new AliESDEvent();
595 esd->ReadFromTree(t);
597 gSystem->GetMemInfo(meminfo);
598 AliInfo(Form("After the esd initialization - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
599 tempmem = meminfo->fMemUsed;
602 Int_t iInitRunNumber = esd->GetRunNumber();
604 Int_t iNumberOfEvents = (Int_t)t->GetEntries();
605 for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
633 t->GetEntry(iEventNumber);
634 iRunNumber = esd->GetRunNumber();
635 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
636 const AliESDVertex * vertexIn = esd->GetVertex();
637 fVertexName = vertexIn->GetName();
638 if(fVertexName == "default") fVertexflag = 0;
640 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
641 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
642 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
643 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
644 UInt_t status = esdTrack->GetStatus();
646 //select only tracks with ITS refit
647 if ((status&AliESDtrack::kITSrefit)==0) continue;
648 //select only tracks with TPC refit
649 if ((status&AliESDtrack::kTPCrefit)==0) continue;
651 //select only tracks with the "combined PID"
652 if ((status&AliESDtrack::kESDpid)==0) continue;
654 esdTrack->GetPxPyPz(p);
655 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
656 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
659 if(fPt > maxPt) maxPt = fPt;
661 if(esdTrack->GetSign() > 0) {
663 if(fPt > fLowPtCut) nCh1GeV++;
664 if(fPt > fHighPtCut) nCh3GeV++;
665 if(fPt > fVeryHighPtCut) nCh10GeV++;
667 if(esdTrack->GetSign() < 0) {
669 if(fPt > fLowPtCut) nCh1GeV++;
670 if(fPt > fHighPtCut) nCh3GeV++;
671 if(fPt > fVeryHighPtCut) nCh10GeV++;
673 if(esdTrack->GetSign() == 0) nNeutr++;
677 esdTrack->GetESDpid(prob);
680 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
681 if(rcc == 0.0) continue;
684 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
687 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
689 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
691 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
693 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
695 if(fPt > fLowPtCut) nEl1GeV++;
696 if(fPt > fHighPtCut) nEl3GeV++;
697 if(fPt > fVeryHighPtCut) nEl10GeV++;
705 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
706 // loop over all reconstructed tracks (also first track of combination)
707 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
708 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
709 if (muonTrack == 0x0) continue;
711 // Coordinates at vertex
712 fZ = muonTrack->GetZ();
713 fY = muonTrack->GetBendingCoor();
714 fX = muonTrack->GetNonBendingCoor();
716 fThetaX = muonTrack->GetThetaX();
717 fThetaY = muonTrack->GetThetaY();
719 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
720 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
721 fPxRec = fPzRec * TMath::Tan(fThetaX);
722 fPyRec = fPzRec * TMath::Tan(fThetaY);
723 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
725 //ChiSquare of the track if needed
726 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
727 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
728 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
730 // total number of muons inside a vertex cut
731 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
733 if(fEPvector.Pt() > fLowPtCut) {
735 if(fEPvector.Pt() > fHighPtCut) {
737 if (fEPvector.Pt() > fVeryHighPtCut) {
745 // Fill the event tags
746 if(ntrack != 0) meanPt = meanPt/ntrack;
748 evTag->SetEventId(iEventNumber+1);
749 evTag->SetGUID(fguid);
751 evTag->SetTURL(fturl);
752 evTag->SetSize(size);
753 evTag->SetVertexX(vertexIn->GetXv());
754 evTag->SetVertexY(vertexIn->GetYv());
755 evTag->SetVertexZ(vertexIn->GetZv());
756 evTag->SetVertexZError(vertexIn->GetZRes());
757 evTag->SetVertexFlag(fVertexflag);
759 evTag->SetT0VertexZ(esd->GetT0zVertex());
761 evTag->SetTriggerMask(esd->GetTriggerMask());
762 evTag->SetTriggerCluster(esd->GetTriggerCluster());
764 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
765 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
766 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
767 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
768 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
769 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
772 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
773 evTag->SetNumOfPosTracks(nPos);
774 evTag->SetNumOfNegTracks(nNeg);
775 evTag->SetNumOfNeutrTracks(nNeutr);
777 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
778 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
779 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
780 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
782 evTag->SetNumOfProtons(nProtons);
783 evTag->SetNumOfKaons(nKaons);
784 evTag->SetNumOfPions(nPions);
785 evTag->SetNumOfMuons(nMuons);
786 evTag->SetNumOfElectrons(nElectrons);
787 evTag->SetNumOfPhotons(nGamas);
788 evTag->SetNumOfPi0s(nPi0s);
789 evTag->SetNumOfNeutrons(nNeutrons);
790 evTag->SetNumOfKaon0s(nK0s);
792 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
793 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
794 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
795 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
796 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
797 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
798 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
799 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
800 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
802 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
803 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
805 evTag->SetTotalMomentum(totalP);
806 evTag->SetMeanPt(meanPt);
807 evTag->SetMaxPt(maxPt);
809 tag->SetRunId(iInitRunNumber);
810 if(fIsSim) tag->SetDataType(0);
811 else tag->SetDataType(1);
812 tag->AddEventTag(*evTag);
814 lastEvent = iNumberOfEvents;
816 gSystem->GetMemInfo(meminfo);
817 AliInfo(Form("After the event and track loop - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
818 tempmem = meminfo->fMemUsed;
821 gSystem->GetMemInfo(meminfo);
822 AliInfo(Form("After the t->Delete - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
823 tempmem = meminfo->fMemUsed;
825 TString localFileName = "Run"; localFileName += tag->GetRunId();
826 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter;
827 localFileName += ".ESD.tag.root";
832 fileName = localFileName.Data();
833 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
835 else if(fStorage == 1) {
836 TString alienLocation = "/alien";
837 alienLocation += gGrid->Pwd();
838 alienLocation += fgridpath.Data();
839 alienLocation += "/";
840 alienLocation += localFileName;
841 alienLocation += "?se=";
842 alienLocation += fSE.Data();
843 fileName = alienLocation.Data();
844 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
847 TFile* ftag = TFile::Open(fileName, "recreate");
854 gSystem->GetMemInfo(meminfo);
855 AliInfo(Form("After the file closing - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
856 tempmem = meminfo->fMemUsed;
862 gSystem->GetMemInfo(meminfo);
863 AliInfo(Form("After the delete objects - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
866 //_____________________________________________________________________________
867 void AliESDTagCreator::CreateTag(TFile* file, const char *filepath, Int_t Counter) {
868 //private method that creates tag files
872 Double_t fMUONMASS = 0.105658369;
875 Double_t fThetaX, fThetaY, fPyz, fChisquare;
876 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
878 TLorentzVector fEPvector;
880 Float_t fZVertexCut = 10.0;
881 Float_t fRhoVertexCut = 2.0;
883 Float_t fLowPtCut = 1.0;
884 Float_t fHighPtCut = 3.0;
885 Float_t fVeryHighPtCut = 10.0;
888 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
890 // Creates the tags for all the events in a given ESD file
891 Bool_t fIsSim = kTRUE;
893 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
894 Int_t nPos, nNeg, nNeutr;
895 Int_t nK0s, nNeutrons, nPi0s, nGamas;
896 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
897 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
898 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
899 Float_t maxPt = .0, meanPt = .0, totalP = .0;
901 Int_t iRunNumber = 0;
904 AliRunTag *tag = new AliRunTag();
905 AliEventTag *evTag = new AliEventTag();
906 TTree ttag("T","A Tree with event tags");
907 TBranch * btag = ttag.Branch("AliTAG", &tag);
908 btag->SetCompressionLevel(9);
910 AliInfo(Form("Creating the ESD tags......."));
912 Int_t firstEvent = 0,lastEvent = 0;
914 TTree *t = (TTree*) file->Get("esdTree");
915 AliESDEvent *esd = new AliESDEvent();
916 esd->ReadFromTree(t);
919 Int_t iInitRunNumber = esd->GetRunNumber();
921 Int_t iNumberOfEvents = (Int_t)t->GetEntries();
922 for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
950 t->GetEntry(iEventNumber);
951 iRunNumber = esd->GetRunNumber();
952 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
953 const AliESDVertex * vertexIn = esd->GetVertex();
954 fVertexName = vertexIn->GetName();
955 if(fVertexName == "default") fVertexflag = 0;
957 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
958 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
959 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
960 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
961 UInt_t status = esdTrack->GetStatus();
963 //select only tracks with ITS refit
964 if ((status&AliESDtrack::kITSrefit)==0) continue;
965 //select only tracks with TPC refit
966 if ((status&AliESDtrack::kTPCrefit)==0) continue;
968 //select only tracks with the "combined PID"
969 if ((status&AliESDtrack::kESDpid)==0) continue;
971 esdTrack->GetPxPyPz(p);
972 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
973 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
976 if(fPt > maxPt) maxPt = fPt;
978 if(esdTrack->GetSign() > 0) {
980 if(fPt > fLowPtCut) nCh1GeV++;
981 if(fPt > fHighPtCut) nCh3GeV++;
982 if(fPt > fVeryHighPtCut) nCh10GeV++;
984 if(esdTrack->GetSign() < 0) {
986 if(fPt > fLowPtCut) nCh1GeV++;
987 if(fPt > fHighPtCut) nCh3GeV++;
988 if(fPt > fVeryHighPtCut) nCh10GeV++;
990 if(esdTrack->GetSign() == 0) nNeutr++;
994 esdTrack->GetESDpid(prob);
997 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
998 if(rcc == 0.0) continue;
1001 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1004 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1006 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1008 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
1010 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1012 if(fPt > fLowPtCut) nEl1GeV++;
1013 if(fPt > fHighPtCut) nEl3GeV++;
1014 if(fPt > fVeryHighPtCut) nEl10GeV++;
1022 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1023 // loop over all reconstructed tracks (also first track of combination)
1024 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
1025 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1026 if (muonTrack == 0x0) continue;
1028 // Coordinates at vertex
1029 fZ = muonTrack->GetZ();
1030 fY = muonTrack->GetBendingCoor();
1031 fX = muonTrack->GetNonBendingCoor();
1033 fThetaX = muonTrack->GetThetaX();
1034 fThetaY = muonTrack->GetThetaY();
1036 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1037 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1038 fPxRec = fPzRec * TMath::Tan(fThetaX);
1039 fPyRec = fPzRec * TMath::Tan(fThetaY);
1040 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1042 //ChiSquare of the track if needed
1043 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1044 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1045 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1047 // total number of muons inside a vertex cut
1048 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
1050 if(fEPvector.Pt() > fLowPtCut) {
1052 if(fEPvector.Pt() > fHighPtCut) {
1054 if (fEPvector.Pt() > fVeryHighPtCut) {
1062 // Fill the event tags
1063 if(ntrack != 0) meanPt = meanPt/ntrack;
1065 evTag->SetEventId(iEventNumber+1);
1066 evTag->SetPath(filepath);
1068 evTag->SetVertexX(vertexIn->GetXv());
1069 evTag->SetVertexY(vertexIn->GetYv());
1070 evTag->SetVertexZ(vertexIn->GetZv());
1071 evTag->SetVertexZError(vertexIn->GetZRes());
1072 evTag->SetVertexFlag(fVertexflag);
1074 evTag->SetT0VertexZ(esd->GetT0zVertex());
1076 evTag->SetTriggerMask(esd->GetTriggerMask());
1077 evTag->SetTriggerCluster(esd->GetTriggerCluster());
1079 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1080 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1081 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
1082 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
1083 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
1084 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1087 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1088 evTag->SetNumOfPosTracks(nPos);
1089 evTag->SetNumOfNegTracks(nNeg);
1090 evTag->SetNumOfNeutrTracks(nNeutr);
1092 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1093 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1094 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
1095 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
1097 evTag->SetNumOfProtons(nProtons);
1098 evTag->SetNumOfKaons(nKaons);
1099 evTag->SetNumOfPions(nPions);
1100 evTag->SetNumOfMuons(nMuons);
1101 evTag->SetNumOfElectrons(nElectrons);
1102 evTag->SetNumOfPhotons(nGamas);
1103 evTag->SetNumOfPi0s(nPi0s);
1104 evTag->SetNumOfNeutrons(nNeutrons);
1105 evTag->SetNumOfKaon0s(nK0s);
1107 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1108 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1109 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1110 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1111 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1112 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1113 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1114 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1115 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
1117 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
1118 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
1120 evTag->SetTotalMomentum(totalP);
1121 evTag->SetMeanPt(meanPt);
1122 evTag->SetMaxPt(maxPt);
1124 tag->SetRunId(iInitRunNumber);
1125 if(fIsSim) tag->SetDataType(0);
1126 else tag->SetDataType(1);
1127 tag->AddEventTag(*evTag);
1129 lastEvent = iNumberOfEvents;
1133 TString localFileName = "Run"; localFileName += tag->GetRunId();
1134 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter;
1135 localFileName += ".ESD.tag.root";
1140 fileName = localFileName.Data();
1141 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
1143 else if(fStorage == 1) {
1144 TString alienLocation = "/alien";
1145 alienLocation += gGrid->Pwd();
1146 alienLocation += fgridpath.Data();
1147 alienLocation += "/";
1148 alienLocation += localFileName;
1149 alienLocation += "?se=";
1150 alienLocation += fSE.Data();
1151 fileName = alienLocation.Data();
1152 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
1155 TFile* ftag = TFile::Open(fileName, "recreate");
1168 //_____________________________________________________________________________
1169 void AliESDTagCreator::CreateESDTags(Int_t fFirstEvent, Int_t fLastEvent, AliGRPObject *grpData) {
1171 Float_t lhcLuminosity = 0.0;
1172 TString lhcState = "test";
1173 //UInt_t detectorMask = 0;
1174 Int_t detectorMask = 0;
1176 detectorMask = grpData->GetDetectorMask();
1177 time_t startTime = grpData->GetTimeStart();
1178 TTimeStamp *t1 = new TTimeStamp(startTime);
1179 time_t endTime = grpData->GetTimeEnd();
1180 TTimeStamp *t2 = new TTimeStamp(endTime);
1181 const char* beamtype = grpData->GetBeamType();
1182 Float_t beamenergy = grpData->GetBeamEnergy();
1188 Double_t fMUONMASS = 0.105658369;
1191 Double_t fThetaX, fThetaY, fPyz, fChisquare;
1192 Double_t fPxRec,fPyRec, fPzRec, fEnergy;
1194 TLorentzVector fEPvector;
1196 Float_t fZVertexCut = 10.0;
1197 Float_t fRhoVertexCut = 2.0;
1199 Float_t fLowPtCut = 1.0;
1200 Float_t fHighPtCut = 3.0;
1201 Float_t fVeryHighPtCut = 10.0;
1204 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
1206 // Creates the tags for all the events in a given ESD file
1208 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
1209 Int_t nPos, nNeg, nNeutr;
1210 Int_t nK0s, nNeutrons, nPi0s, nGamas;
1211 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
1212 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
1213 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
1214 Float_t maxPt = .0, meanPt = .0, totalP = .0;
1216 Int_t iRunNumber = 0;
1217 TString fVertexName("default");
1219 AliInfo(Form("Creating the ESD tags......."));
1221 TFile *file = TFile::Open("AliESDs.root");
1222 if (!file || !file->IsOpen()) {
1223 AliError(Form("opening failed"));
1227 Int_t lastEvent = 0;
1228 TTree *b = (TTree*) file->Get("esdTree");
1229 AliESDEvent *esd = new AliESDEvent();
1230 esd->ReadFromTree(b);
1232 b->GetEntry(fFirstEvent);
1233 Int_t iInitRunNumber = esd->GetRunNumber();
1235 Int_t iNumberOfEvents = (Int_t)b->GetEntries();
1236 if(fLastEvent == -1) lastEvent = (Int_t)b->GetEntries();
1237 else lastEvent = fLastEvent;
1240 sprintf(fileName, "Run%d.Event%d_%d.ESD.tag.root",
1241 iInitRunNumber,fFirstEvent,lastEvent);
1242 AliInfo(Form("writing tags to file %s", fileName));
1243 AliDebug(1, Form("writing tags to file %s", fileName));
1245 TFile* ftag = TFile::Open(fileName, "recreate");
1247 AliRunTag *tag = new AliRunTag();
1248 AliEventTag *evTag = new AliEventTag();
1249 TTree ttag("T","A Tree with event tags");
1250 TBranch * btag = ttag.Branch("AliTAG", &tag);
1251 btag->SetCompressionLevel(9);
1253 if(fLastEvent != -1) iNumberOfEvents = fLastEvent + 1;
1254 for (Int_t iEventNumber = fFirstEvent; iEventNumber < iNumberOfEvents; iEventNumber++) {
1282 b->GetEntry(iEventNumber);
1283 iRunNumber = esd->GetRunNumber();
1284 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
1285 const AliESDVertex * vertexIn = esd->GetVertex();
1286 if (!vertexIn) AliError("ESD has not defined vertex.");
1287 if (vertexIn) fVertexName = vertexIn->GetName();
1288 if(fVertexName != "default") fVertexflag = 1;
1289 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
1290 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
1291 UInt_t status = esdTrack->GetStatus();
1293 //select only tracks with ITS refit
1294 if ((status&AliESDtrack::kITSrefit)==0) continue;
1295 //select only tracks with TPC refit
1296 if ((status&AliESDtrack::kTPCrefit)==0) continue;
1298 //select only tracks with the "combined PID"
1299 if ((status&AliESDtrack::kESDpid)==0) continue;
1301 esdTrack->GetPxPyPz(p);
1302 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
1303 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
1306 if(fPt > maxPt) maxPt = fPt;
1308 if(esdTrack->GetSign() > 0) {
1310 if(fPt > fLowPtCut) nCh1GeV++;
1311 if(fPt > fHighPtCut) nCh3GeV++;
1312 if(fPt > fVeryHighPtCut) nCh10GeV++;
1314 if(esdTrack->GetSign() < 0) {
1316 if(fPt > fLowPtCut) nCh1GeV++;
1317 if(fPt > fHighPtCut) nCh3GeV++;
1318 if(fPt > fVeryHighPtCut) nCh10GeV++;
1320 if(esdTrack->GetSign() == 0) nNeutr++;
1324 esdTrack->GetESDpid(prob);
1327 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
1328 if(rcc == 0.0) continue;
1331 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1334 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1336 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1338 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
1340 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1342 if(fPt > fLowPtCut) nEl1GeV++;
1343 if(fPt > fHighPtCut) nEl3GeV++;
1344 if(fPt > fVeryHighPtCut) nEl10GeV++;
1352 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1353 // loop over all reconstructed tracks (also first track of combination)
1354 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
1355 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1356 if (muonTrack == 0x0) continue;
1358 // Coordinates at vertex
1359 fZ = muonTrack->GetZ();
1360 fY = muonTrack->GetBendingCoor();
1361 fX = muonTrack->GetNonBendingCoor();
1363 fThetaX = muonTrack->GetThetaX();
1364 fThetaY = muonTrack->GetThetaY();
1366 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1367 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1368 fPxRec = fPzRec * TMath::Tan(fThetaX);
1369 fPyRec = fPzRec * TMath::Tan(fThetaY);
1370 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1372 //ChiSquare of the track if needed
1373 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1374 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1375 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1377 // total number of muons inside a vertex cut
1378 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
1380 if(fEPvector.Pt() > fLowPtCut) {
1382 if(fEPvector.Pt() > fHighPtCut) {
1384 if (fEPvector.Pt() > fVeryHighPtCut) {
1392 // Fill the event tags
1394 meanPt = meanPt/ntrack;
1396 evTag->SetEventId(iEventNumber+1);
1398 evTag->SetVertexX(vertexIn->GetXv());
1399 evTag->SetVertexY(vertexIn->GetYv());
1400 evTag->SetVertexZ(vertexIn->GetZv());
1401 evTag->SetVertexZError(vertexIn->GetZRes());
1403 evTag->SetVertexFlag(fVertexflag);
1405 evTag->SetT0VertexZ(esd->GetT0zVertex());
1407 evTag->SetTriggerMask(esd->GetTriggerMask());
1408 evTag->SetTriggerCluster(esd->GetTriggerCluster());
1410 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1411 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1412 evTag->SetZDCNeutron2Energy(esd->GetZDCN2Energy());
1413 evTag->SetZDCProton2Energy(esd->GetZDCP2Energy());
1414 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
1415 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1418 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1419 evTag->SetNumOfPosTracks(nPos);
1420 evTag->SetNumOfNegTracks(nNeg);
1421 evTag->SetNumOfNeutrTracks(nNeutr);
1423 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1424 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1425 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
1426 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
1428 evTag->SetNumOfProtons(nProtons);
1429 evTag->SetNumOfKaons(nKaons);
1430 evTag->SetNumOfPions(nPions);
1431 evTag->SetNumOfMuons(nMuons);
1432 evTag->SetNumOfElectrons(nElectrons);
1433 evTag->SetNumOfPhotons(nGamas);
1434 evTag->SetNumOfPi0s(nPi0s);
1435 evTag->SetNumOfNeutrons(nNeutrons);
1436 evTag->SetNumOfKaon0s(nK0s);
1438 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1439 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1440 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1441 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1442 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1443 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1444 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1445 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1446 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
1448 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
1449 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
1451 evTag->SetTotalMomentum(totalP);
1452 evTag->SetMeanPt(meanPt);
1453 evTag->SetMaxPt(maxPt);
1455 tag->SetLHCTag(lhcLuminosity,lhcState);
1456 tag->SetDetectorTag(detectorMask);
1458 tag->SetRunId(iInitRunNumber);
1459 tag->SetRunStartTime(t1->GetDate());
1460 tag->SetRunStopTime(t2->GetDate());
1461 tag->SetBeamEnergy(beamenergy);
1462 tag->SetBeamType(beamtype);
1464 tag->AddEventTag(*evTag);
1477 //_____________________________________________________________________________
1478 void AliESDTagCreator::SwitchOffBranches() const {
1480 // Switch of branches on user request
1481 TObjArray * tokens = fBranches.Tokenize(" ");
1482 Int_t ntok = tokens->GetEntries();
1483 for (Int_t i = 0; i < ntok; i++) {
1484 TString str = ((TObjString*) tokens->At(i))->GetString();
1485 fChain->SetBranchStatus(Form("%s%s%s","*", str.Data(), "*"), 0);
1486 AliInfo(Form("Branch %s switched off \n", str.Data()));