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 // AliTagCreator 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>
29 #include <TLorentzVector.h>
33 #include <TGridResult.h>
36 #include "AliRunTag.h"
37 #include "AliEventTag.h"
39 #include "AliESDVertex.h"
43 #include "AliTagCreator.h"
46 ClassImp(AliTagCreator)
49 //______________________________________________________________________________
50 AliTagCreator::AliTagCreator() :
52 fSE("ALICE::CERN::se"),
56 //==============Default constructor for a AliTagCreator==================
59 //______________________________________________________________________________
60 AliTagCreator::~AliTagCreator() {
61 //================Default destructor for a AliTagCreator=======================
64 //______________________________________________________________________________
65 void AliTagCreator::SetStorage(Int_t storage) {
66 // Sets correctly the storage: 0 for local, 1 for GRID
69 AliInfo(Form("Tags will be stored locally...."));
71 AliInfo(Form("Tags will be stored in the grid...."));
72 if((fStorage != 0)&&(fStorage != 1))
74 AliInfo(Form("Storage was not properly set!!!"));
80 //______________________________________________________________________________
81 Bool_t AliTagCreator::ReadGridCollection(TGridResult *fresult) {
82 // Reads the entry of the TGridResult and creates the tags
83 Int_t nEntries = fresult->GetEntries();
92 for(Int_t i = 0; i < nEntries; i++) {
93 alienUrl = fresult->GetKey(i,"turl");
94 guid = fresult->GetKey(i,"guid");
95 if(fresult->GetKey(i,"size")) size = atol (fresult->GetKey(i,"size"));
96 md5 = fresult->GetKey(i,"md5");
97 turl = fresult->GetKey(i,"turl");
98 if(md5 && !strlen(guid)) md5 = 0;
99 if(guid && !strlen(guid)) guid = 0;
101 TFile *f = TFile::Open(alienUrl,"READ");
102 CreateTag(f,guid,md5,turl,size,counter);
111 //______________________________________________________________________________
112 Bool_t AliTagCreator::ReadLocalCollection(const char *localpath) {
113 // Checks the different subdirs of the given local path and in the
114 // case where it finds an AliESDs.root file it creates the tags
116 void *dira = gSystem->OpenDirectory(localpath);
118 const char * dirname = 0x0;
119 const char * filename = 0x0;
120 const char * pattern = "AliESDs.root";
123 while((dirname = gSystem->GetDirEntry(dira))) {
124 sprintf(fPath,"%s/%s",localpath,dirname);
125 void *dirb = gSystem->OpenDirectory(fPath);
126 while((filename = gSystem->GetDirEntry(dirb))) {
127 if(strstr(filename,pattern)) {
128 TString fESDFileName;
129 fESDFileName = fPath;
131 fESDFileName += pattern;
132 TFile *f = TFile::Open(fESDFileName,"READ");
133 CreateTag(f,fESDFileName,counter);
139 }//child directory's entry loop
140 }//parent directory's entry loop
145 //______________________________________________________________________________
146 Bool_t AliTagCreator::ReadCAFCollection(const char *filename) {
147 // Temporary solution for CAF: Takes as an input the ascii file that
148 // lists the ESDs stored in the SE of the CAF and creates the tags.
150 // Open the input stream
156 // Read the input list of files and add them to the chain
159 if (!esdfile.Contains("root")) continue; // protection
160 TFile *f = TFile::Open(esdfile,"READ");
161 CreateTag(f,esdfile,counter);
172 //__________________________________________________________________________
173 Bool_t AliTagCreator::MergeTags() {
174 //Merges the tags and stores the merged tag file
175 //locally if fStorage=0 or in the grid if fStorage=1
176 AliInfo(Form("Merging tags....."));
177 TChain *fgChain = new TChain("T");
180 const char * tagPattern = "tag";
181 // Open the working directory
182 void * dirp = gSystem->OpenDirectory(gSystem->pwd());
183 const char * name = 0x0;
184 // Add all files matching *pattern* to the chain
185 while((name = gSystem->GetDirEntry(dirp))) {
186 if (strstr(name,tagPattern)) fgChain->Add(name);
188 AliInfo(Form("Chained tag files: %d",fgChain->GetEntries()));
191 else if(fStorage == 1) {
192 TString alienLocation = gGrid->Pwd();
193 alienLocation += fgridpath.Data();
194 alienLocation += "/";
196 TGridResult *tagresult = gGrid->Query(alienLocation,"*tag.root","","");
197 Int_t nEntries = tagresult->GetEntries();
198 for(Int_t i = 0; i < nEntries; i++) {
199 TString alienUrl = tagresult->GetKey(i,"turl");
200 fgChain->Add(alienUrl);
202 AliInfo(Form("Chained tag files: %d",fgChain->GetEntries()));
205 AliRunTag *tag = new AliRunTag;
206 fgChain->SetBranchAddress("AliTAG",&tag);
207 fgChain->GetEntry(0);
208 TString localFileName = "Run"; localFileName += tag->GetRunId();
209 localFileName += ".Merged"; localFileName += ".ESD.tag.root";
211 TString filename = 0x0;
214 filename = localFileName.Data();
215 AliInfo(Form("Writing merged tags to local file: %s",filename.Data()));
217 else if(fStorage == 1) {
218 TString alienFileName = "/alien";
219 alienFileName += gGrid->Pwd();
220 alienFileName += fgridpath.Data();
221 alienFileName += "/";
222 alienFileName += localFileName;
223 alienFileName += "?se=";
224 alienFileName += fSE.Data();
225 filename = alienFileName.Data();
226 AliInfo(Form("Writing merged tags to grid file: %s",filename.Data()));
229 fgChain->Merge(filename);
234 //__________________________________________________________________________
235 Bool_t AliTagCreator::MergeTags(TGridResult *result) {
236 //Merges the tags that are listed in the TGridResult
237 AliInfo(Form("Merging tags....."));
238 TChain *fgChain = new TChain("T");
240 Int_t nEntries = result->GetEntries();
243 for(Int_t i = 0; i < nEntries; i++) {
244 alienUrl = result->GetKey(i,"turl");
245 fgChain->Add(alienUrl);
247 AliInfo(Form("Chained tag files: %d",fgChain->GetEntries()));
248 AliRunTag *tag = new AliRunTag;
249 fgChain->SetBranchAddress("AliTAG",&tag);
250 fgChain->GetEntry(0);
252 TString localFileName = "Run"; localFileName += tag->GetRunId();
253 localFileName += ".Merged"; localFileName += ".ESD.tag.root";
255 TString filename = 0x0;
258 filename = localFileName.Data();
259 AliInfo(Form("Writing merged tags to local file: %s",filename.Data()));
261 else if(fStorage == 1) {
262 TString alienFileName = "/alien";
263 alienFileName += gGrid->Pwd();
264 alienFileName += fgridpath.Data();
265 alienFileName += "/";
266 alienFileName += localFileName;
267 alienFileName += "?se=";
268 alienFileName += fSE.Data();
269 filename = alienFileName.Data();
270 AliInfo(Form("Writing merged tags to grid file: %s",filename.Data()));
273 fgChain->Merge(filename);
278 //_____________________________________________________________________________
279 void AliTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, const char *turl, Long64_t size, Int_t Counter) {
280 //private method that creates tag files
281 TString fguid = guid;
283 TString fturl = turl;
287 Double_t fMUONMASS = 0.105658369;
290 Double_t fThetaX, fThetaY, fPyz, fChisquare;
291 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
293 TLorentzVector fEPvector;
295 Float_t fZVertexCut = 10.0;
296 Float_t fRhoVertexCut = 2.0;
298 Float_t fLowPtCut = 1.0;
299 Float_t fHighPtCut = 3.0;
300 Float_t fVeryHighPtCut = 10.0;
303 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
305 // Creates the tags for all the events in a given ESD file
306 Bool_t fIsSim = kTRUE;
308 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
309 Int_t nPos, nNeg, nNeutr;
310 Int_t nK0s, nNeutrons, nPi0s, nGamas;
311 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
312 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
313 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
314 Float_t maxPt = .0, meanPt = .0, totalP = .0;
316 Int_t iRunNumber = 0;
319 AliRunTag *tag = new AliRunTag();
320 AliEventTag *evTag = new AliEventTag();
321 TTree ttag("T","A Tree with event tags");
322 TBranch * btag = ttag.Branch("AliTAG", &tag);
323 btag->SetCompressionLevel(9);
325 AliInfo(Form("Creating the tags......."));
327 Int_t firstEvent = 0,lastEvent = 0;
328 TTree *t = (TTree*) file->Get("esdTree");
329 TBranch * b = t->GetBranch("ESD");
334 Int_t iInitRunNumber = esd->GetRunNumber();
336 Int_t iNumberOfEvents = (Int_t)b->GetEntries();
337 for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
365 b->GetEntry(iEventNumber);
366 iRunNumber = esd->GetRunNumber();
367 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
368 const AliESDVertex * vertexIn = esd->GetVertex();
369 fVertexName = vertexIn->GetName();
370 if(fVertexName == "default") fVertexflag = 0;
372 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
373 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
374 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
375 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
376 UInt_t status = esdTrack->GetStatus();
378 //select only tracks with ITS refit
379 if ((status&AliESDtrack::kITSrefit)==0) continue;
380 //select only tracks with TPC refit
381 if ((status&AliESDtrack::kTPCrefit)==0) continue;
383 //select only tracks with the "combined PID"
384 if ((status&AliESDtrack::kESDpid)==0) continue;
386 esdTrack->GetPxPyPz(p);
387 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
388 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
391 if(fPt > maxPt) maxPt = fPt;
393 if(esdTrack->GetSign() > 0) {
395 if(fPt > fLowPtCut) nCh1GeV++;
396 if(fPt > fHighPtCut) nCh3GeV++;
397 if(fPt > fVeryHighPtCut) nCh10GeV++;
399 if(esdTrack->GetSign() < 0) {
401 if(fPt > fLowPtCut) nCh1GeV++;
402 if(fPt > fHighPtCut) nCh3GeV++;
403 if(fPt > fVeryHighPtCut) nCh10GeV++;
405 if(esdTrack->GetSign() == 0) nNeutr++;
409 esdTrack->GetESDpid(prob);
412 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
413 if(rcc == 0.0) continue;
416 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
419 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
421 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
423 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
425 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
427 if(fPt > fLowPtCut) nEl1GeV++;
428 if(fPt > fHighPtCut) nEl3GeV++;
429 if(fPt > fVeryHighPtCut) nEl10GeV++;
437 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
438 // loop over all reconstructed tracks (also first track of combination)
439 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
440 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
441 if (muonTrack == 0x0) continue;
443 // Coordinates at vertex
444 fZ = muonTrack->GetZ();
445 fY = muonTrack->GetBendingCoor();
446 fX = muonTrack->GetNonBendingCoor();
448 fThetaX = muonTrack->GetThetaX();
449 fThetaY = muonTrack->GetThetaY();
451 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
452 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
453 fPxRec = fPzRec * TMath::Tan(fThetaX);
454 fPyRec = fPzRec * TMath::Tan(fThetaY);
455 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
457 //ChiSquare of the track if needed
458 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
459 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
460 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
462 // total number of muons inside a vertex cut
463 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
465 if(fEPvector.Pt() > fLowPtCut) {
467 if(fEPvector.Pt() > fHighPtCut) {
469 if (fEPvector.Pt() > fVeryHighPtCut) {
477 // Fill the event tags
478 if(ntrack != 0) meanPt = meanPt/ntrack;
480 evTag->SetEventId(iEventNumber+1);
481 evTag->SetGUID(fguid);
483 evTag->SetTURL(fturl);
484 evTag->SetSize(size);
485 evTag->SetVertexX(vertexIn->GetXv());
486 evTag->SetVertexY(vertexIn->GetYv());
487 evTag->SetVertexZ(vertexIn->GetZv());
488 evTag->SetVertexZError(vertexIn->GetZRes());
489 evTag->SetVertexFlag(fVertexflag);
491 evTag->SetT0VertexZ(esd->GetT0zVertex());
493 evTag->SetTriggerMask(esd->GetTriggerMask());
494 evTag->SetTriggerCluster(esd->GetTriggerCluster());
496 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
497 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
498 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy());
499 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
500 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
501 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
504 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
505 evTag->SetNumOfPosTracks(nPos);
506 evTag->SetNumOfNegTracks(nNeg);
507 evTag->SetNumOfNeutrTracks(nNeutr);
509 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
510 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
511 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
512 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
514 evTag->SetNumOfProtons(nProtons);
515 evTag->SetNumOfKaons(nKaons);
516 evTag->SetNumOfPions(nPions);
517 evTag->SetNumOfMuons(nMuons);
518 evTag->SetNumOfElectrons(nElectrons);
519 evTag->SetNumOfPhotons(nGamas);
520 evTag->SetNumOfPi0s(nPi0s);
521 evTag->SetNumOfNeutrons(nNeutrons);
522 evTag->SetNumOfKaon0s(nK0s);
524 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
525 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
526 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
527 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
528 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
529 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
530 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
531 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
532 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
534 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
535 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
537 evTag->SetTotalMomentum(totalP);
538 evTag->SetMeanPt(meanPt);
539 evTag->SetMaxPt(maxPt);
541 tag->SetRunId(iInitRunNumber);
542 if(fIsSim) tag->SetDataType(0);
543 else tag->SetDataType(1);
544 tag->AddEventTag(*evTag);
546 lastEvent = iNumberOfEvents;
553 TString localFileName = "Run"; localFileName += tag->GetRunId();
554 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter;
555 localFileName += ".ESD.tag.root";
560 fileName = localFileName.Data();
561 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
563 else if(fStorage == 1) {
564 TString alienLocation = "/alien";
565 alienLocation += gGrid->Pwd();
566 alienLocation += fgridpath.Data();
567 alienLocation += "/";
568 alienLocation += localFileName;
569 alienLocation += "?se=";
570 alienLocation += fSE.Data();
571 fileName = alienLocation.Data();
572 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
575 TFile* ftag = TFile::Open(fileName, "recreate");
586 //_____________________________________________________________________________
587 void AliTagCreator::CreateTag(TFile* file, const char *filepath, Int_t Counter) {
588 //private method that creates tag files
592 Double_t fMUONMASS = 0.105658369;
595 Double_t fThetaX, fThetaY, fPyz, fChisquare;
596 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
598 TLorentzVector fEPvector;
600 Float_t fZVertexCut = 10.0;
601 Float_t fRhoVertexCut = 2.0;
603 Float_t fLowPtCut = 1.0;
604 Float_t fHighPtCut = 3.0;
605 Float_t fVeryHighPtCut = 10.0;
608 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
610 // Creates the tags for all the events in a given ESD file
611 Bool_t fIsSim = kTRUE;
613 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
614 Int_t nPos, nNeg, nNeutr;
615 Int_t nK0s, nNeutrons, nPi0s, nGamas;
616 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
617 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
618 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
619 Float_t maxPt = .0, meanPt = .0, totalP = .0;
621 Int_t iRunNumber = 0;
624 AliRunTag *tag = new AliRunTag();
625 AliEventTag *evTag = new AliEventTag();
626 TTree ttag("T","A Tree with event tags");
627 TBranch * btag = ttag.Branch("AliTAG", &tag);
628 btag->SetCompressionLevel(9);
630 AliInfo(Form("Creating the tags......."));
632 Int_t firstEvent = 0,lastEvent = 0;
634 TTree *t = (TTree*) file->Get("esdTree");
635 TBranch * b = t->GetBranch("ESD");
640 Int_t iInitRunNumber = esd->GetRunNumber();
642 Int_t iNumberOfEvents = (Int_t)b->GetEntries();
643 for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
671 b->GetEntry(iEventNumber);
672 iRunNumber = esd->GetRunNumber();
673 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
674 const AliESDVertex * vertexIn = esd->GetVertex();
675 fVertexName = vertexIn->GetName();
676 if(fVertexName == "default") fVertexflag = 0;
678 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
679 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
680 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
681 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
682 UInt_t status = esdTrack->GetStatus();
684 //select only tracks with ITS refit
685 if ((status&AliESDtrack::kITSrefit)==0) continue;
686 //select only tracks with TPC refit
687 if ((status&AliESDtrack::kTPCrefit)==0) continue;
689 //select only tracks with the "combined PID"
690 if ((status&AliESDtrack::kESDpid)==0) continue;
692 esdTrack->GetPxPyPz(p);
693 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
694 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
697 if(fPt > maxPt) maxPt = fPt;
699 if(esdTrack->GetSign() > 0) {
701 if(fPt > fLowPtCut) nCh1GeV++;
702 if(fPt > fHighPtCut) nCh3GeV++;
703 if(fPt > fVeryHighPtCut) nCh10GeV++;
705 if(esdTrack->GetSign() < 0) {
707 if(fPt > fLowPtCut) nCh1GeV++;
708 if(fPt > fHighPtCut) nCh3GeV++;
709 if(fPt > fVeryHighPtCut) nCh10GeV++;
711 if(esdTrack->GetSign() == 0) nNeutr++;
715 esdTrack->GetESDpid(prob);
718 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
719 if(rcc == 0.0) continue;
722 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
725 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
727 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
729 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
731 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
733 if(fPt > fLowPtCut) nEl1GeV++;
734 if(fPt > fHighPtCut) nEl3GeV++;
735 if(fPt > fVeryHighPtCut) nEl10GeV++;
743 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
744 // loop over all reconstructed tracks (also first track of combination)
745 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
746 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
747 if (muonTrack == 0x0) continue;
749 // Coordinates at vertex
750 fZ = muonTrack->GetZ();
751 fY = muonTrack->GetBendingCoor();
752 fX = muonTrack->GetNonBendingCoor();
754 fThetaX = muonTrack->GetThetaX();
755 fThetaY = muonTrack->GetThetaY();
757 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
758 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
759 fPxRec = fPzRec * TMath::Tan(fThetaX);
760 fPyRec = fPzRec * TMath::Tan(fThetaY);
761 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
763 //ChiSquare of the track if needed
764 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
765 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
766 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
768 // total number of muons inside a vertex cut
769 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
771 if(fEPvector.Pt() > fLowPtCut) {
773 if(fEPvector.Pt() > fHighPtCut) {
775 if (fEPvector.Pt() > fVeryHighPtCut) {
783 // Fill the event tags
784 if(ntrack != 0) meanPt = meanPt/ntrack;
786 evTag->SetEventId(iEventNumber+1);
787 evTag->SetPath(filepath);
789 evTag->SetVertexX(vertexIn->GetXv());
790 evTag->SetVertexY(vertexIn->GetYv());
791 evTag->SetVertexZ(vertexIn->GetZv());
792 evTag->SetVertexZError(vertexIn->GetZRes());
793 evTag->SetVertexFlag(fVertexflag);
795 evTag->SetT0VertexZ(esd->GetT0zVertex());
797 evTag->SetTriggerMask(esd->GetTriggerMask());
798 evTag->SetTriggerCluster(esd->GetTriggerCluster());
800 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
801 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
802 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy());
803 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
804 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
805 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
808 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
809 evTag->SetNumOfPosTracks(nPos);
810 evTag->SetNumOfNegTracks(nNeg);
811 evTag->SetNumOfNeutrTracks(nNeutr);
813 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
814 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
815 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
816 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
818 evTag->SetNumOfProtons(nProtons);
819 evTag->SetNumOfKaons(nKaons);
820 evTag->SetNumOfPions(nPions);
821 evTag->SetNumOfMuons(nMuons);
822 evTag->SetNumOfElectrons(nElectrons);
823 evTag->SetNumOfPhotons(nGamas);
824 evTag->SetNumOfPi0s(nPi0s);
825 evTag->SetNumOfNeutrons(nNeutrons);
826 evTag->SetNumOfKaon0s(nK0s);
828 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
829 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
830 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
831 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
832 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
833 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
834 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
835 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
836 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
838 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
839 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
841 evTag->SetTotalMomentum(totalP);
842 evTag->SetMeanPt(meanPt);
843 evTag->SetMaxPt(maxPt);
845 tag->SetRunId(iInitRunNumber);
846 if(fIsSim) tag->SetDataType(0);
847 else tag->SetDataType(1);
848 tag->AddEventTag(*evTag);
850 lastEvent = iNumberOfEvents;
857 TString localFileName = "Run"; localFileName += tag->GetRunId();
858 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter;
859 localFileName += ".ESD.tag.root";
864 fileName = localFileName.Data();
865 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
867 else if(fStorage == 1) {
868 TString alienLocation = "/alien";
869 alienLocation += gGrid->Pwd();
870 alienLocation += fgridpath.Data();
871 alienLocation += "/";
872 alienLocation += localFileName;
873 alienLocation += "?se=";
874 alienLocation += fSE.Data();
875 fileName = alienLocation.Data();
876 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
879 TFile* ftag = TFile::Open(fileName, "recreate");