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>
35 #include <TGridResult.h>
38 #include "AliRunTag.h"
39 #include "AliEventTag.h"
41 #include "AliESDEvent.h"
42 #include "AliESDVertex.h"
45 #include "AliESDTagCreator.h"
48 ClassImp(AliESDTagCreator)
51 //______________________________________________________________________________
52 AliESDTagCreator::AliESDTagCreator() :
54 fChain(new TChain("esdTree")), fGUIDList(new TList()),
55 fMD5List(new TList()), fTURLList(new TList()),
56 meminfo(new MemInfo_t) {
57 //==============Default constructor for a AliESDTagCreator================
60 //______________________________________________________________________________
61 AliESDTagCreator::~AliESDTagCreator() {
62 //================Default destructor for a AliESDTagCreator===================
70 //______________________________________________________________________________
71 Bool_t AliESDTagCreator::ReadGridCollection(TGridResult *fresult) {
72 // Reads the entry of the TGridResult and creates the tags
73 Int_t nEntries = fresult->GetEntries();
82 for(Int_t i = 0; i < nEntries; i++) {
83 alienUrl = fresult->GetKey(i,"turl");
84 guid = fresult->GetKey(i,"guid");
85 if(fresult->GetKey(i,"size")) size = atol (fresult->GetKey(i,"size"));
86 md5 = fresult->GetKey(i,"md5");
87 turl = fresult->GetKey(i,"turl");
88 if(md5 && !strlen(guid)) md5 = 0;
89 if(guid && !strlen(guid)) guid = 0;
91 fChain->Add(alienUrl);
92 //fGUIDList->Add(new TObjString(guid));
93 //fMD5List->Add(new TObjString(md5));
94 //fTURLList->Add(new TObjString(turl));
96 //TFile *f = TFile::Open(alienUrl,"READ");
97 //CreateTag(f,guid,md5,turl,size,counter);
103 AliInfo(Form("ESD chain created......."));
104 AliInfo(Form("Chain entries: %d",fChain->GetEntries()));
105 CreateTag(fChain,"grid");
110 //______________________________________________________________________________
111 Bool_t AliESDTagCreator::ReadLocalCollection(const char *localpath) {
112 // Checks the different subdirs of the given local path and in the
113 // case where it finds an AliESDs.root file it creates the tags
115 void *dira = gSystem->OpenDirectory(localpath);
117 const char * dirname = 0x0;
118 const char * filename = 0x0;
119 const char * pattern = "AliESDs.root";
122 while((dirname = gSystem->GetDirEntry(dira))) {
123 sprintf(fPath,"%s/%s",localpath,dirname);
124 void *dirb = gSystem->OpenDirectory(fPath);
125 while((filename = gSystem->GetDirEntry(dirb))) {
126 if(strstr(filename,pattern)) {
127 TString fESDFileName;
128 fESDFileName = fPath;
130 fESDFileName += pattern;
132 fChain->Add(fESDFileName);
134 //TFile *f = TFile::Open(fESDFileName,"READ");
135 //CreateTag(f,fESDFileName,counter);
141 }//child directory's entry loop
142 }//parent directory's entry loop
144 AliInfo(Form("ESD chain created......."));
145 AliInfo(Form("Chain entries: %d",fChain->GetEntries()));
146 CreateTag(fChain,"local");
151 //______________________________________________________________________________
152 Bool_t AliESDTagCreator::ReadCAFCollection(const char *filename) {
153 // Temporary solution for CAF: Takes as an input the ascii file that
154 // lists the ESDs stored in the SE of the CAF and creates the tags.
156 // Open the input stream
162 // Read the input list of files and add them to the chain
165 if (!esdfile.Contains("root")) continue; // protection
167 fChain->Add(esdfile);
169 //TFile *f = TFile::Open(esdfile,"READ");
170 //CreateTag(f,esdfile,counter);
177 AliInfo(Form("ESD chain created......."));
178 AliInfo(Form("Chain entries: %d",fChain->GetEntries()));
179 CreateTag(fChain,"proof");
184 //_____________________________________________________________________________
185 void AliESDTagCreator::CreateTag(TChain* fChain, const char *type) {
186 //private method that creates tag files
187 TString fSession = type;
188 //Int_t iCounter = 0;
189 TString fguid, fmd5, fturl;
190 TString fTempGuid = 0;
195 Double_t fMUONMASS = 0.105658369;
198 Double_t fThetaX, fThetaY, fPyz, fChisquare;
199 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
201 TLorentzVector fEPvector;
203 Float_t fZVertexCut = 10.0;
204 Float_t fRhoVertexCut = 2.0;
206 Float_t fLowPtCut = 1.0;
207 Float_t fHighPtCut = 3.0;
208 Float_t fVeryHighPtCut = 10.0;
211 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
213 // Creates the tags for all the events in a given ESD file
214 Bool_t fIsSim = kTRUE;
216 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
217 Int_t nPos, nNeg, nNeutr;
218 Int_t nK0s, nNeutrons, nPi0s, nGamas;
219 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
220 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
221 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
222 Float_t maxPt = .0, meanPt = .0, totalP = .0;
224 Int_t iRunNumber = 0;
227 AliRunTag *tag = new AliRunTag();
228 AliEventTag *evTag = new AliEventTag();
229 TTree ttag("T","A Tree with event tags");
230 TBranch * btag = ttag.Branch("AliTAG", &tag);
231 btag->SetCompressionLevel(9);
232 //gSystem->GetMemInfo(meminfo);
233 //AliInfo(Form("After the tag initialization - Memory used: %d MB",meminfo->fMemUsed));
234 //Int_t tempmem = meminfo->fMemUsed;
236 AliInfo(Form("Creating the ESD tags......."));
238 Int_t firstEvent = 0,lastEvent = 0;
239 AliESDEvent *esd = new AliESDEvent();
240 esd->ReadFromTree(fChain);
242 //gSystem->GetMemInfo(meminfo);
243 //AliInfo(Form("After the esd initialization - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
244 //tempmem = meminfo->fMemUsed;
246 Int_t iInitRunNumber = -1;
247 for(Int_t iEventNumber = 0; iEventNumber < fChain->GetEntries(); iEventNumber++) {
248 ntrack = 0; nPos = 0; nNeg = 0; nNeutr =0;
249 nK0s = 0; nNeutrons = 0; nPi0s = 0;
250 nGamas = 0; nProtons = 0; nKaons = 0;
251 nPions = 0; nMuons = 0; nElectrons = 0;
252 nCh1GeV = 0; nCh3GeV = 0; nCh10GeV = 0;
253 nMu1GeV = 0; nMu3GeV = 0; nMu10GeV = 0;
254 nEl1GeV = 0; nEl3GeV = 0; nEl10GeV = 0;
255 maxPt = .0; meanPt = .0; totalP = .0;
258 fChain->GetEntry(iEventNumber);
259 TFile *f = fChain->GetFile();
260 const TUrl *url = f->GetEndpointUrl();
261 fguid = f->GetUUID().AsString();
262 if(fSession == "grid") {
263 TString fturltemp = "alien://"; fturltemp += url->GetFile();
264 fturl = fturltemp(0,fturltemp.Index(".root",5,0,TString::kExact)+5);
266 else fturl = url->GetFile();
268 if(iEventNumber == 0) iInitRunNumber = esd->GetRunNumber();
269 iRunNumber = esd->GetRunNumber();
270 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD - You are trying to merge different runs!!!");
272 const AliESDVertex * vertexIn = esd->GetVertex();
273 fVertexName = vertexIn->GetName();
274 if(fVertexName == "default") fVertexflag = 0;
276 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
277 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
278 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
279 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
280 UInt_t status = esdTrack->GetStatus();
282 //select only tracks with ITS refit
283 if ((status&AliESDtrack::kITSrefit)==0) continue;
284 //select only tracks with TPC refit
285 if ((status&AliESDtrack::kTPCrefit)==0) continue;
287 //select only tracks with the "combined PID"
288 if ((status&AliESDtrack::kESDpid)==0) continue;
290 esdTrack->GetPxPyPz(p);
291 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
292 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
295 if(fPt > maxPt) maxPt = fPt;
297 if(esdTrack->GetSign() > 0) {
299 if(fPt > fLowPtCut) nCh1GeV++;
300 if(fPt > fHighPtCut) nCh3GeV++;
301 if(fPt > fVeryHighPtCut) nCh10GeV++;
303 if(esdTrack->GetSign() < 0) {
305 if(fPt > fLowPtCut) nCh1GeV++;
306 if(fPt > fHighPtCut) nCh3GeV++;
307 if(fPt > fVeryHighPtCut) nCh10GeV++;
309 if(esdTrack->GetSign() == 0) nNeutr++;
313 esdTrack->GetESDpid(prob);
316 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
317 if(rcc == 0.0) continue;
320 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
323 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
325 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
327 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
329 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
331 if(fPt > fLowPtCut) nEl1GeV++;
332 if(fPt > fHighPtCut) nEl3GeV++;
333 if(fPt > fVeryHighPtCut) nEl10GeV++;
341 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
342 // loop over all reconstructed tracks (also first track of combination)
343 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
344 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
345 if (muonTrack == 0x0) continue;
347 // Coordinates at vertex
348 fZ = muonTrack->GetZ();
349 fY = muonTrack->GetBendingCoor();
350 fX = muonTrack->GetNonBendingCoor();
352 fThetaX = muonTrack->GetThetaX();
353 fThetaY = muonTrack->GetThetaY();
355 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
356 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
357 fPxRec = fPzRec * TMath::Tan(fThetaX);
358 fPyRec = fPzRec * TMath::Tan(fThetaY);
359 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
361 //ChiSquare of the track if needed
362 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
363 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
364 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
366 // total number of muons inside a vertex cut
367 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
369 if(fEPvector.Pt() > fLowPtCut) {
371 if(fEPvector.Pt() > fHighPtCut) {
373 if (fEPvector.Pt() > fVeryHighPtCut) {
381 // Fill the event tags
382 if(ntrack != 0) meanPt = meanPt/ntrack;
384 AliInfo(Form("====================================="));
385 AliInfo(Form("URL: %s - GUID: %s",fturl.Data(),fguid.Data()));
386 AliInfo(Form("====================================="));
388 evTag->SetEventId(iEventNumber+1);
389 evTag->SetGUID(fguid);
390 if(fSession == "grid") {
392 evTag->SetTURL(fturl);
395 else evTag->SetPath(fturl);
397 evTag->SetVertexX(vertexIn->GetXv());
398 evTag->SetVertexY(vertexIn->GetYv());
399 evTag->SetVertexZ(vertexIn->GetZv());
400 evTag->SetVertexZError(vertexIn->GetZRes());
401 evTag->SetVertexFlag(fVertexflag);
403 evTag->SetT0VertexZ(esd->GetT0zVertex());
405 evTag->SetTriggerMask(esd->GetTriggerMask());
406 evTag->SetTriggerCluster(esd->GetTriggerCluster());
408 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
409 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
410 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy());
411 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
412 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
413 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
416 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
417 evTag->SetNumOfPosTracks(nPos);
418 evTag->SetNumOfNegTracks(nNeg);
419 evTag->SetNumOfNeutrTracks(nNeutr);
421 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
422 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
423 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
424 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
426 evTag->SetNumOfProtons(nProtons);
427 evTag->SetNumOfKaons(nKaons);
428 evTag->SetNumOfPions(nPions);
429 evTag->SetNumOfMuons(nMuons);
430 evTag->SetNumOfElectrons(nElectrons);
431 evTag->SetNumOfPhotons(nGamas);
432 evTag->SetNumOfPi0s(nPi0s);
433 evTag->SetNumOfNeutrons(nNeutrons);
434 evTag->SetNumOfKaon0s(nK0s);
436 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
437 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
438 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
439 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
440 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
441 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
442 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
443 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
444 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
446 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
447 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
449 evTag->SetTotalMomentum(totalP);
450 evTag->SetMeanPt(meanPt);
451 evTag->SetMaxPt(maxPt);
453 tag->SetRunId(iInitRunNumber);
454 if(fIsSim) tag->SetDataType(0);
455 else tag->SetDataType(1);
456 tag->AddEventTag(*evTag);
458 if(fguid != fTempGuid) {
464 lastEvent = fChain->GetEntries();
466 //gSystem->GetMemInfo(meminfo);
467 //AliInfo(Form("After the event and track loop - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
468 //tempmem = meminfo->fMemUsed;
470 //fChain->Delete("");
472 //gSystem->GetMemInfo(meminfo);
473 //AliInfo(Form("After the t->Delete - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
474 //tempmem = meminfo->fMemUsed;
476 TString localFileName = "Run"; localFileName += tag->GetRunId();
477 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; //localFileName += "."; localFileName += Counter;
478 localFileName += ".ESD.tag.root";
483 fileName = localFileName.Data();
484 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
486 else if(fStorage == 1) {
487 TString alienLocation = "/alien";
488 alienLocation += gGrid->Pwd();
489 alienLocation += fgridpath.Data();
490 alienLocation += "/";
491 alienLocation += localFileName;
492 alienLocation += "?se=";
493 alienLocation += fSE.Data();
494 fileName = alienLocation.Data();
495 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
498 TFile* ftag = TFile::Open(fileName, "recreate");
505 //gSystem->GetMemInfo(meminfo);
506 //AliInfo(Form("After the file closing - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
507 //tempmem = meminfo->fMemUsed;
513 //gSystem->GetMemInfo(meminfo);
514 //AliInfo(Form("After the delete objects - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
517 //_____________________________________________________________________________
518 void AliESDTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, const char *turl, Long64_t size, Int_t Counter) {
519 //private method that creates tag files
520 TString fguid = guid;
522 TString fturl = turl;
526 Double_t fMUONMASS = 0.105658369;
529 Double_t fThetaX, fThetaY, fPyz, fChisquare;
530 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
532 TLorentzVector fEPvector;
534 Float_t fZVertexCut = 10.0;
535 Float_t fRhoVertexCut = 2.0;
537 Float_t fLowPtCut = 1.0;
538 Float_t fHighPtCut = 3.0;
539 Float_t fVeryHighPtCut = 10.0;
542 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
544 // Creates the tags for all the events in a given ESD file
545 Bool_t fIsSim = kTRUE;
547 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
548 Int_t nPos, nNeg, nNeutr;
549 Int_t nK0s, nNeutrons, nPi0s, nGamas;
550 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
551 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
552 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
553 Float_t maxPt = .0, meanPt = .0, totalP = .0;
555 Int_t iRunNumber = 0;
558 AliRunTag *tag = new AliRunTag();
559 AliEventTag *evTag = new AliEventTag();
560 TTree ttag("T","A Tree with event tags");
561 TBranch * btag = ttag.Branch("AliTAG", &tag);
562 btag->SetCompressionLevel(9);
563 gSystem->GetMemInfo(meminfo);
564 AliInfo(Form("After the tag initialization - Memory used: %d MB",meminfo->fMemUsed));
565 Int_t tempmem = meminfo->fMemUsed;
567 AliInfo(Form("Creating the ESD tags......."));
569 Int_t firstEvent = 0,lastEvent = 0;
570 TTree *t = (TTree*) file->Get("esdTree");
571 AliESDEvent *esd = new AliESDEvent();
572 esd->ReadFromTree(t);
574 gSystem->GetMemInfo(meminfo);
575 AliInfo(Form("After the esd initialization - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
576 tempmem = meminfo->fMemUsed;
579 Int_t iInitRunNumber = esd->GetRunNumber();
581 Int_t iNumberOfEvents = (Int_t)t->GetEntries();
582 for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
610 t->GetEntry(iEventNumber);
611 iRunNumber = esd->GetRunNumber();
612 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
613 const AliESDVertex * vertexIn = esd->GetVertex();
614 fVertexName = vertexIn->GetName();
615 if(fVertexName == "default") fVertexflag = 0;
617 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
618 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
619 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
620 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
621 UInt_t status = esdTrack->GetStatus();
623 //select only tracks with ITS refit
624 if ((status&AliESDtrack::kITSrefit)==0) continue;
625 //select only tracks with TPC refit
626 if ((status&AliESDtrack::kTPCrefit)==0) continue;
628 //select only tracks with the "combined PID"
629 if ((status&AliESDtrack::kESDpid)==0) continue;
631 esdTrack->GetPxPyPz(p);
632 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
633 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
636 if(fPt > maxPt) maxPt = fPt;
638 if(esdTrack->GetSign() > 0) {
640 if(fPt > fLowPtCut) nCh1GeV++;
641 if(fPt > fHighPtCut) nCh3GeV++;
642 if(fPt > fVeryHighPtCut) nCh10GeV++;
644 if(esdTrack->GetSign() < 0) {
646 if(fPt > fLowPtCut) nCh1GeV++;
647 if(fPt > fHighPtCut) nCh3GeV++;
648 if(fPt > fVeryHighPtCut) nCh10GeV++;
650 if(esdTrack->GetSign() == 0) nNeutr++;
654 esdTrack->GetESDpid(prob);
657 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
658 if(rcc == 0.0) continue;
661 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
664 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
666 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
668 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
670 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
672 if(fPt > fLowPtCut) nEl1GeV++;
673 if(fPt > fHighPtCut) nEl3GeV++;
674 if(fPt > fVeryHighPtCut) nEl10GeV++;
682 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
683 // loop over all reconstructed tracks (also first track of combination)
684 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
685 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
686 if (muonTrack == 0x0) continue;
688 // Coordinates at vertex
689 fZ = muonTrack->GetZ();
690 fY = muonTrack->GetBendingCoor();
691 fX = muonTrack->GetNonBendingCoor();
693 fThetaX = muonTrack->GetThetaX();
694 fThetaY = muonTrack->GetThetaY();
696 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
697 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
698 fPxRec = fPzRec * TMath::Tan(fThetaX);
699 fPyRec = fPzRec * TMath::Tan(fThetaY);
700 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
702 //ChiSquare of the track if needed
703 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
704 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
705 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
707 // total number of muons inside a vertex cut
708 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
710 if(fEPvector.Pt() > fLowPtCut) {
712 if(fEPvector.Pt() > fHighPtCut) {
714 if (fEPvector.Pt() > fVeryHighPtCut) {
722 // Fill the event tags
723 if(ntrack != 0) meanPt = meanPt/ntrack;
725 evTag->SetEventId(iEventNumber+1);
726 evTag->SetGUID(fguid);
728 evTag->SetTURL(fturl);
729 evTag->SetSize(size);
730 evTag->SetVertexX(vertexIn->GetXv());
731 evTag->SetVertexY(vertexIn->GetYv());
732 evTag->SetVertexZ(vertexIn->GetZv());
733 evTag->SetVertexZError(vertexIn->GetZRes());
734 evTag->SetVertexFlag(fVertexflag);
736 evTag->SetT0VertexZ(esd->GetT0zVertex());
738 evTag->SetTriggerMask(esd->GetTriggerMask());
739 evTag->SetTriggerCluster(esd->GetTriggerCluster());
741 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
742 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
743 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy());
744 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
745 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
746 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
749 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
750 evTag->SetNumOfPosTracks(nPos);
751 evTag->SetNumOfNegTracks(nNeg);
752 evTag->SetNumOfNeutrTracks(nNeutr);
754 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
755 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
756 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
757 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
759 evTag->SetNumOfProtons(nProtons);
760 evTag->SetNumOfKaons(nKaons);
761 evTag->SetNumOfPions(nPions);
762 evTag->SetNumOfMuons(nMuons);
763 evTag->SetNumOfElectrons(nElectrons);
764 evTag->SetNumOfPhotons(nGamas);
765 evTag->SetNumOfPi0s(nPi0s);
766 evTag->SetNumOfNeutrons(nNeutrons);
767 evTag->SetNumOfKaon0s(nK0s);
769 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
770 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
771 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
772 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
773 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
774 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
775 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
776 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
777 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
779 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
780 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
782 evTag->SetTotalMomentum(totalP);
783 evTag->SetMeanPt(meanPt);
784 evTag->SetMaxPt(maxPt);
786 tag->SetRunId(iInitRunNumber);
787 if(fIsSim) tag->SetDataType(0);
788 else tag->SetDataType(1);
789 tag->AddEventTag(*evTag);
791 lastEvent = iNumberOfEvents;
793 gSystem->GetMemInfo(meminfo);
794 AliInfo(Form("After the event and track loop - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
795 tempmem = meminfo->fMemUsed;
798 gSystem->GetMemInfo(meminfo);
799 AliInfo(Form("After the t->Delete - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
800 tempmem = meminfo->fMemUsed;
802 TString localFileName = "Run"; localFileName += tag->GetRunId();
803 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter;
804 localFileName += ".ESD.tag.root";
809 fileName = localFileName.Data();
810 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
812 else if(fStorage == 1) {
813 TString alienLocation = "/alien";
814 alienLocation += gGrid->Pwd();
815 alienLocation += fgridpath.Data();
816 alienLocation += "/";
817 alienLocation += localFileName;
818 alienLocation += "?se=";
819 alienLocation += fSE.Data();
820 fileName = alienLocation.Data();
821 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
824 TFile* ftag = TFile::Open(fileName, "recreate");
831 gSystem->GetMemInfo(meminfo);
832 AliInfo(Form("After the file closing - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
833 tempmem = meminfo->fMemUsed;
839 gSystem->GetMemInfo(meminfo);
840 AliInfo(Form("After the delete objects - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
843 //_____________________________________________________________________________
844 void AliESDTagCreator::CreateTag(TFile* file, const char *filepath, Int_t Counter) {
845 //private method that creates tag files
849 Double_t fMUONMASS = 0.105658369;
852 Double_t fThetaX, fThetaY, fPyz, fChisquare;
853 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
855 TLorentzVector fEPvector;
857 Float_t fZVertexCut = 10.0;
858 Float_t fRhoVertexCut = 2.0;
860 Float_t fLowPtCut = 1.0;
861 Float_t fHighPtCut = 3.0;
862 Float_t fVeryHighPtCut = 10.0;
865 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
867 // Creates the tags for all the events in a given ESD file
868 Bool_t fIsSim = kTRUE;
870 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
871 Int_t nPos, nNeg, nNeutr;
872 Int_t nK0s, nNeutrons, nPi0s, nGamas;
873 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
874 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
875 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
876 Float_t maxPt = .0, meanPt = .0, totalP = .0;
878 Int_t iRunNumber = 0;
881 AliRunTag *tag = new AliRunTag();
882 AliEventTag *evTag = new AliEventTag();
883 TTree ttag("T","A Tree with event tags");
884 TBranch * btag = ttag.Branch("AliTAG", &tag);
885 btag->SetCompressionLevel(9);
887 AliInfo(Form("Creating the ESD tags......."));
889 Int_t firstEvent = 0,lastEvent = 0;
891 TTree *t = (TTree*) file->Get("esdTree");
892 AliESDEvent *esd = new AliESDEvent();
893 esd->ReadFromTree(t);
896 Int_t iInitRunNumber = esd->GetRunNumber();
898 Int_t iNumberOfEvents = (Int_t)t->GetEntries();
899 for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
927 t->GetEntry(iEventNumber);
928 iRunNumber = esd->GetRunNumber();
929 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
930 const AliESDVertex * vertexIn = esd->GetVertex();
931 fVertexName = vertexIn->GetName();
932 if(fVertexName == "default") fVertexflag = 0;
934 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
935 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
936 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
937 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
938 UInt_t status = esdTrack->GetStatus();
940 //select only tracks with ITS refit
941 if ((status&AliESDtrack::kITSrefit)==0) continue;
942 //select only tracks with TPC refit
943 if ((status&AliESDtrack::kTPCrefit)==0) continue;
945 //select only tracks with the "combined PID"
946 if ((status&AliESDtrack::kESDpid)==0) continue;
948 esdTrack->GetPxPyPz(p);
949 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
950 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
953 if(fPt > maxPt) maxPt = fPt;
955 if(esdTrack->GetSign() > 0) {
957 if(fPt > fLowPtCut) nCh1GeV++;
958 if(fPt > fHighPtCut) nCh3GeV++;
959 if(fPt > fVeryHighPtCut) nCh10GeV++;
961 if(esdTrack->GetSign() < 0) {
963 if(fPt > fLowPtCut) nCh1GeV++;
964 if(fPt > fHighPtCut) nCh3GeV++;
965 if(fPt > fVeryHighPtCut) nCh10GeV++;
967 if(esdTrack->GetSign() == 0) nNeutr++;
971 esdTrack->GetESDpid(prob);
974 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
975 if(rcc == 0.0) continue;
978 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
981 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
983 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
985 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
987 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
989 if(fPt > fLowPtCut) nEl1GeV++;
990 if(fPt > fHighPtCut) nEl3GeV++;
991 if(fPt > fVeryHighPtCut) nEl10GeV++;
999 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1000 // loop over all reconstructed tracks (also first track of combination)
1001 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
1002 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1003 if (muonTrack == 0x0) continue;
1005 // Coordinates at vertex
1006 fZ = muonTrack->GetZ();
1007 fY = muonTrack->GetBendingCoor();
1008 fX = muonTrack->GetNonBendingCoor();
1010 fThetaX = muonTrack->GetThetaX();
1011 fThetaY = muonTrack->GetThetaY();
1013 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1014 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1015 fPxRec = fPzRec * TMath::Tan(fThetaX);
1016 fPyRec = fPzRec * TMath::Tan(fThetaY);
1017 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1019 //ChiSquare of the track if needed
1020 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1021 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1022 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1024 // total number of muons inside a vertex cut
1025 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
1027 if(fEPvector.Pt() > fLowPtCut) {
1029 if(fEPvector.Pt() > fHighPtCut) {
1031 if (fEPvector.Pt() > fVeryHighPtCut) {
1039 // Fill the event tags
1040 if(ntrack != 0) meanPt = meanPt/ntrack;
1042 evTag->SetEventId(iEventNumber+1);
1043 evTag->SetPath(filepath);
1045 evTag->SetVertexX(vertexIn->GetXv());
1046 evTag->SetVertexY(vertexIn->GetYv());
1047 evTag->SetVertexZ(vertexIn->GetZv());
1048 evTag->SetVertexZError(vertexIn->GetZRes());
1049 evTag->SetVertexFlag(fVertexflag);
1051 evTag->SetT0VertexZ(esd->GetT0zVertex());
1053 evTag->SetTriggerMask(esd->GetTriggerMask());
1054 evTag->SetTriggerCluster(esd->GetTriggerCluster());
1056 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1057 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1058 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy());
1059 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
1060 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
1061 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1064 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1065 evTag->SetNumOfPosTracks(nPos);
1066 evTag->SetNumOfNegTracks(nNeg);
1067 evTag->SetNumOfNeutrTracks(nNeutr);
1069 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1070 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1071 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
1072 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
1074 evTag->SetNumOfProtons(nProtons);
1075 evTag->SetNumOfKaons(nKaons);
1076 evTag->SetNumOfPions(nPions);
1077 evTag->SetNumOfMuons(nMuons);
1078 evTag->SetNumOfElectrons(nElectrons);
1079 evTag->SetNumOfPhotons(nGamas);
1080 evTag->SetNumOfPi0s(nPi0s);
1081 evTag->SetNumOfNeutrons(nNeutrons);
1082 evTag->SetNumOfKaon0s(nK0s);
1084 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1085 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1086 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1087 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1088 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1089 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1090 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1091 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1092 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
1094 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
1095 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
1097 evTag->SetTotalMomentum(totalP);
1098 evTag->SetMeanPt(meanPt);
1099 evTag->SetMaxPt(maxPt);
1101 tag->SetRunId(iInitRunNumber);
1102 if(fIsSim) tag->SetDataType(0);
1103 else tag->SetDataType(1);
1104 tag->AddEventTag(*evTag);
1106 lastEvent = iNumberOfEvents;
1110 TString localFileName = "Run"; localFileName += tag->GetRunId();
1111 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter;
1112 localFileName += ".ESD.tag.root";
1117 fileName = localFileName.Data();
1118 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
1120 else if(fStorage == 1) {
1121 TString alienLocation = "/alien";
1122 alienLocation += gGrid->Pwd();
1123 alienLocation += fgridpath.Data();
1124 alienLocation += "/";
1125 alienLocation += localFileName;
1126 alienLocation += "?se=";
1127 alienLocation += fSE.Data();
1128 fileName = alienLocation.Data();
1129 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
1132 TFile* ftag = TFile::Open(fileName, "recreate");
1145 //_____________________________________________________________________________
1146 void AliESDTagCreator::CreateESDTags(Int_t fFirstEvent, Int_t fLastEvent) {
1148 Float_t lhcLuminosity = 0.0;
1149 TString lhcState = "test";
1150 UInt_t detectorMask = 0;
1155 Double_t fMUONMASS = 0.105658369;
1158 Double_t fThetaX, fThetaY, fPyz, fChisquare;
1159 Double_t fPxRec,fPyRec, fPzRec, fEnergy;
1161 TLorentzVector fEPvector;
1163 Float_t fZVertexCut = 10.0;
1164 Float_t fRhoVertexCut = 2.0;
1166 Float_t fLowPtCut = 1.0;
1167 Float_t fHighPtCut = 3.0;
1168 Float_t fVeryHighPtCut = 10.0;
1171 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
1173 // Creates the tags for all the events in a given ESD file
1175 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
1176 Int_t nPos, nNeg, nNeutr;
1177 Int_t nK0s, nNeutrons, nPi0s, nGamas;
1178 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
1179 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
1180 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
1181 Float_t maxPt = .0, meanPt = .0, totalP = .0;
1183 Int_t iRunNumber = 0;
1184 TString fVertexName("default");
1186 AliRunTag *tag = new AliRunTag();
1187 AliEventTag *evTag = new AliEventTag();
1188 TTree ttag("T","A Tree with event tags");
1189 TBranch * btag = ttag.Branch("AliTAG", &tag);
1190 btag->SetCompressionLevel(9);
1192 AliInfo(Form("Creating the ESD tags......."));
1194 TFile *file = TFile::Open("AliESDs.root");
1195 if (!file || !file->IsOpen()) {
1196 AliError(Form("opening failed"));
1200 Int_t lastEvent = 0;
1201 TTree *b = (TTree*) file->Get("esdTree");
1202 AliESDEvent *esd = new AliESDEvent();
1203 esd->ReadFromTree(b);
1205 b->GetEntry(fFirstEvent);
1206 Int_t iInitRunNumber = esd->GetRunNumber();
1208 Int_t iNumberOfEvents = (Int_t)b->GetEntries();
1209 if(fLastEvent != -1) iNumberOfEvents = fLastEvent + 1;
1210 for (Int_t iEventNumber = fFirstEvent; iEventNumber < iNumberOfEvents; iEventNumber++) {
1238 b->GetEntry(iEventNumber);
1239 iRunNumber = esd->GetRunNumber();
1240 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
1241 const AliESDVertex * vertexIn = esd->GetVertex();
1242 if (!vertexIn) AliError("ESD has not defined vertex.");
1243 if (vertexIn) fVertexName = vertexIn->GetName();
1244 if(fVertexName != "default") fVertexflag = 1;
1245 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
1246 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
1247 UInt_t status = esdTrack->GetStatus();
1249 //select only tracks with ITS refit
1250 if ((status&AliESDtrack::kITSrefit)==0) continue;
1251 //select only tracks with TPC refit
1252 if ((status&AliESDtrack::kTPCrefit)==0) continue;
1254 //select only tracks with the "combined PID"
1255 if ((status&AliESDtrack::kESDpid)==0) continue;
1257 esdTrack->GetPxPyPz(p);
1258 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
1259 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
1262 if(fPt > maxPt) maxPt = fPt;
1264 if(esdTrack->GetSign() > 0) {
1266 if(fPt > fLowPtCut) nCh1GeV++;
1267 if(fPt > fHighPtCut) nCh3GeV++;
1268 if(fPt > fVeryHighPtCut) nCh10GeV++;
1270 if(esdTrack->GetSign() < 0) {
1272 if(fPt > fLowPtCut) nCh1GeV++;
1273 if(fPt > fHighPtCut) nCh3GeV++;
1274 if(fPt > fVeryHighPtCut) nCh10GeV++;
1276 if(esdTrack->GetSign() == 0) nNeutr++;
1280 esdTrack->GetESDpid(prob);
1283 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
1284 if(rcc == 0.0) continue;
1287 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1290 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1292 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1294 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
1296 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1298 if(fPt > fLowPtCut) nEl1GeV++;
1299 if(fPt > fHighPtCut) nEl3GeV++;
1300 if(fPt > fVeryHighPtCut) nEl10GeV++;
1308 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1309 // loop over all reconstructed tracks (also first track of combination)
1310 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
1311 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1312 if (muonTrack == 0x0) continue;
1314 // Coordinates at vertex
1315 fZ = muonTrack->GetZ();
1316 fY = muonTrack->GetBendingCoor();
1317 fX = muonTrack->GetNonBendingCoor();
1319 fThetaX = muonTrack->GetThetaX();
1320 fThetaY = muonTrack->GetThetaY();
1322 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1323 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1324 fPxRec = fPzRec * TMath::Tan(fThetaX);
1325 fPyRec = fPzRec * TMath::Tan(fThetaY);
1326 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1328 //ChiSquare of the track if needed
1329 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1330 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1331 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1333 // total number of muons inside a vertex cut
1334 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
1336 if(fEPvector.Pt() > fLowPtCut) {
1338 if(fEPvector.Pt() > fHighPtCut) {
1340 if (fEPvector.Pt() > fVeryHighPtCut) {
1348 // Fill the event tags
1350 meanPt = meanPt/ntrack;
1352 evTag->SetEventId(iEventNumber+1);
1354 evTag->SetVertexX(vertexIn->GetXv());
1355 evTag->SetVertexY(vertexIn->GetYv());
1356 evTag->SetVertexZ(vertexIn->GetZv());
1357 evTag->SetVertexZError(vertexIn->GetZRes());
1359 evTag->SetVertexFlag(fVertexflag);
1361 evTag->SetT0VertexZ(esd->GetT0zVertex());
1363 evTag->SetTriggerMask(esd->GetTriggerMask());
1364 evTag->SetTriggerCluster(esd->GetTriggerCluster());
1366 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1367 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1368 evTag->SetZDCNeutron2Energy(esd->GetZDCN2Energy());
1369 evTag->SetZDCProton2Energy(esd->GetZDCP2Energy());
1370 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy());
1371 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1374 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1375 evTag->SetNumOfPosTracks(nPos);
1376 evTag->SetNumOfNegTracks(nNeg);
1377 evTag->SetNumOfNeutrTracks(nNeutr);
1379 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1380 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1381 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
1382 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
1384 evTag->SetNumOfProtons(nProtons);
1385 evTag->SetNumOfKaons(nKaons);
1386 evTag->SetNumOfPions(nPions);
1387 evTag->SetNumOfMuons(nMuons);
1388 evTag->SetNumOfElectrons(nElectrons);
1389 evTag->SetNumOfPhotons(nGamas);
1390 evTag->SetNumOfPi0s(nPi0s);
1391 evTag->SetNumOfNeutrons(nNeutrons);
1392 evTag->SetNumOfKaon0s(nK0s);
1394 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1395 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1396 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1397 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1398 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1399 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1400 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1401 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1402 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
1404 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
1405 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
1407 evTag->SetTotalMomentum(totalP);
1408 evTag->SetMeanPt(meanPt);
1409 evTag->SetMaxPt(maxPt);
1411 tag->SetLHCTag(lhcLuminosity,lhcState);
1412 tag->SetDetectorTag(detectorMask);
1414 tag->SetRunId(iInitRunNumber);
1415 tag->AddEventTag(*evTag);
1417 if(fLastEvent == -1) lastEvent = (Int_t)b->GetEntries();
1418 else lastEvent = fLastEvent;
1421 sprintf(fileName, "Run%d.Event%d_%d.ESD.tag.root",
1422 tag->GetRunId(),fFirstEvent,lastEvent );
1423 AliInfo(Form("writing tags to file %s", fileName));
1424 AliDebug(1, Form("writing tags to file %s", fileName));
1426 TFile* ftag = TFile::Open(fileName, "recreate");