]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliESDTagCreator.cxx
150e21f9b910335b6d1f619ba18cb8af0cd63a8b
[u/mrichter/AliRoot.git] / STEER / AliESDTagCreator.cxx
1 /**************************************************************************
2  * Author: Panos Christakoglou.                                           *
3  * Contributors are mentioned in the code where appropriate.              *
4  *                                                                        *
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  **************************************************************************/
13
14 /* $Id$ */
15
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 //-----------------------------------------------------------------
21
22 //ROOT
23 #include <Riostream.h>
24 #include <TFile.h>
25 #include <TString.h>
26 #include <TTree.h>
27 #include <TSystem.h>
28 #include <TChain.h>
29 #include <TList.h>
30 #include <TObjString.h>
31 #include <TLorentzVector.h>
32 #include <TMap.h>
33 #include <TTimeStamp.h>
34 #include <TRefArray.h>
35
36 //ROOT-AliEn
37 #include <TGrid.h>
38 #include <TGridResult.h>
39
40 //AliRoot
41 #include "AliRunTag.h"
42 #include "AliEventTag.h"
43 #include "AliESD.h"
44 #include "AliESDEvent.h"
45 #include "AliESDVertex.h"
46 #include "AliLog.h"
47 #include "AliGRPObject.h"
48
49 #include "AliESDTagCreator.h"
50
51
52 ClassImp(AliESDTagCreator)
53
54
55 //______________________________________________________________________________
56   AliESDTagCreator::AliESDTagCreator() :
57     AliTagCreator(),
58     fChain(new TChain("esdTree")), fGUIDList(new TList()), 
59     fMD5List(new TList()), fTURLList(new TList()), fBranches(""), 
60     meminfo(new MemInfo_t) {
61   //==============Default constructor for a AliESDTagCreator================
62 }
63
64 //______________________________________________________________________________
65 AliESDTagCreator::~AliESDTagCreator() {
66 //================Default destructor for a AliESDTagCreator===================
67   delete fChain;
68   delete fGUIDList;
69   delete fMD5List;
70   delete fTURLList;
71   delete meminfo;
72 }
73
74 //______________________________________________________________________________
75 Bool_t AliESDTagCreator::ReadGridCollection(TGridResult *fresult) {
76   // Reads the entry of the TGridResult and creates the tags
77   Int_t nEntries = fresult->GetEntries();
78
79   TString alienUrl;
80   const char* guid;
81   const char* md5;
82   const char* turl;
83   Long64_t size = -1;
84
85   Int_t counter = 0;
86   for(Int_t i = 0; i < nEntries; i++) {
87     alienUrl = fresult->GetKey(i,"turl");
88     guid = fresult->GetKey(i,"guid");
89     if(fresult->GetKey(i,"size")) size = atol (fresult->GetKey(i,"size"));
90     md5 = fresult->GetKey(i,"md5");
91     turl = fresult->GetKey(i,"turl");
92     if(md5 && !strlen(guid)) md5 = 0;
93     if(guid && !strlen(guid)) guid = 0;
94     
95     fChain->Add(alienUrl);
96     //fGUIDList->Add(new TObjString(guid));
97     //fMD5List->Add(new TObjString(md5));
98     //fTURLList->Add(new TObjString(turl));
99     
100     //TFile *f = TFile::Open(alienUrl,"READ");
101     //CreateTag(f,guid,md5,turl,size,counter);
102     //f->Close();
103     //delete f;  
104     counter += 1;
105   }//grid result loop
106   
107   AliInfo(Form("ESD chain created......."));    
108   AliInfo(Form("Chain entries: %d",fChain->GetEntries()));      
109   // Switch of branches on user request
110   SwitchOffBranches();
111   CreateTag(fChain,"grid");
112   
113   return kTRUE;
114 }
115
116 //______________________________________________________________________________
117 Bool_t AliESDTagCreator::ReadLocalCollection(const char *localpath) {
118   // Checks the different subdirs of the given local path and in the
119   // case where it finds an AliESDs.root file it creates the tags
120   
121   void *dira =  gSystem->OpenDirectory(localpath);
122   Char_t fPath[256];
123   const char * dirname = 0x0;
124   const char * filename = 0x0;
125   const char * pattern = "AliESDs.root"; 
126
127   Int_t counter = 0;
128   while((dirname = gSystem->GetDirEntry(dira))) {
129     sprintf(fPath,"%s/%s",localpath,dirname);
130     void *dirb =  gSystem->OpenDirectory(fPath);
131     while((filename = gSystem->GetDirEntry(dirb))) {
132       if(strstr(filename,pattern)) {
133         TString fESDFileName;
134         fESDFileName = fPath;
135         fESDFileName += "/";
136         fESDFileName += pattern;
137
138         fChain->Add(fESDFileName);
139
140         //TFile *f = TFile::Open(fESDFileName,"READ");
141         //CreateTag(f,fESDFileName,counter);
142         //f->Close();
143         //delete f;      
144         
145         counter += 1;
146       }//pattern check
147     }//child directory's entry loop
148   }//parent directory's entry loop
149
150   AliInfo(Form("ESD chain created......."));    
151   AliInfo(Form("Chain entries: %d",fChain->GetEntries()));      
152   // Switch of branches on user request
153   SwitchOffBranches();
154   CreateTag(fChain,"local");
155
156   return kTRUE;
157 }
158
159 //______________________________________________________________________________
160 Bool_t AliESDTagCreator::ReadCAFCollection(const char *filename) {
161   // Temporary solution for CAF: Takes as an input the ascii file that
162   // lists the ESDs stored in the SE of the CAF and creates the tags.
163
164   // Open the input stream
165   ifstream in;
166   in.open(filename);
167
168   Int_t counter = 0;
169   TString esdfile;
170   // Read the input list of files and add them to the chain
171   while(in.good()) {
172     in >> esdfile;
173     if (!esdfile.Contains("root")) continue; // protection
174
175     fChain->Add(esdfile);
176   
177     //TFile *f = TFile::Open(esdfile,"READ");
178     //CreateTag(f,esdfile,counter);
179     //f->Close();
180     //delete f;  
181     
182     counter += 1;
183   }
184
185   AliInfo(Form("ESD chain created......."));    
186   AliInfo(Form("Chain entries: %d",fChain->GetEntries()));      
187   // Switch of branches on user request
188   SwitchOffBranches();
189   CreateTag(fChain,"proof");
190
191   return kTRUE;
192 }
193
194 //_____________________________________________________________________________
195 void AliESDTagCreator::CreateTag(TChain* chain, const char *type) {
196   //private method that creates tag files
197   TString fSession = type;
198   TString fguid, fmd5, fturl;
199   TString fTempGuid;
200
201   /////////////
202   //muon code//
203   ////////////
204   Double_t fMUONMASS = 0.105658369;
205   //Variables
206   Double_t fX,fY,fZ ;
207   Double_t fThetaX, fThetaY, fPyz, fChisquare;
208   Double_t fPxRec, fPyRec, fPzRec, fEnergy;
209   Int_t fCharge;
210   TLorentzVector fEPvector;
211
212   Float_t fZVertexCut    = 40.0; 
213   Float_t fRhoVertexCut  = 600.0; 
214
215   Float_t fLowPtCut      =  1.0;
216   Float_t fHighPtCut     =  3.0;
217   Float_t fVeryHighPtCut = 10.0;
218   ////////////
219
220   Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
221
222   // Creates the tags for all the events in a given ESD file
223   Bool_t fIsSim = kTRUE;
224   Int_t ntrack;
225   Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons, nFWMatchedMuons;
226   Int_t nPos, nNeg, nNeutr;
227   Int_t nK0s, nNeutrons, nPi0s, nGamas;
228   Int_t nCh1GeV, nCh3GeV, nCh10GeV;
229   Int_t nMu1GeV, nMu3GeV, nMu10GeV;
230   Int_t nEl1GeV, nEl3GeV, nEl10GeV;
231   Float_t maxPt = .0, etamaxPt = -999., phimaxPt = -999., meanPt = .0, totalP = .0;
232   Int_t fVertexflag;
233   Int_t iRunNumber = 0;
234   TString fVertexName;
235
236   //gSystem->GetMemInfo(meminfo);
237   //AliInfo(Form("After the tag initialization - Memory used: %d MB",meminfo->fMemUsed));
238   //Int_t tempmem = meminfo->fMemUsed;
239   
240   AliInfo(Form("Creating the ESD tags......."));        
241   
242   Int_t firstEvent = 0,lastEvent = 0;
243   AliESDEvent *esd = new AliESDEvent();
244   esd->ReadFromTree(chain);
245   AliESD *esdold = 0x0;
246   
247   //gSystem->GetMemInfo(meminfo);
248   //AliInfo(Form("After the esd initialization - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
249   //tempmem = meminfo->fMemUsed;
250   
251   Int_t iInitRunNumber = -1;
252   chain->GetEntry(0);
253   TFile *f = chain->GetFile();
254   fTempGuid = f->GetUUID().AsString();
255
256   TString localFileName = "Run"; localFileName += esd->GetRunNumber(); 
257   localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += chain->GetEntries(); //localFileName += "."; localFileName += Counter;
258   localFileName += ".ESD.tag.root";
259
260   TString fileName;
261   TRefArray tmp;
262  
263   if(fStorage == 0) {
264     fileName = localFileName.Data();      
265     AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
266   }
267   else if(fStorage == 1) {
268     TString alienLocation = "/alien";
269     alienLocation += gGrid->Pwd();
270     alienLocation += fgridpath.Data();
271     alienLocation += "/";
272     alienLocation +=  localFileName;
273     alienLocation += "?se=";
274     alienLocation += fSE.Data();
275     fileName = alienLocation.Data();
276     AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
277   }
278
279   TFile* ftag = TFile::Open(fileName, "recreate");
280
281   AliRunTag *tag = new AliRunTag();
282   AliEventTag *evTag = new AliEventTag();
283   TTree * ttag = new TTree("T","A Tree with event tags");
284   TBranch * btag = ttag->Branch("AliTAG", &tag);
285   btag->SetCompressionLevel(9);
286   // Run related information
287   tag->SetMagneticField(esd->GetMagneticField());
288   tag->SetBeamEnergy(esd->GetBeamEnergy());
289   tag->SetBeamType(TString(esd->GetBeamType()));
290   
291   for(Int_t iEventNumber = 0; iEventNumber < chain->GetEntries(); iEventNumber++) {
292     ntrack = 0; nPos = 0; nNeg = 0; nNeutr =0;
293     nK0s = 0; nNeutrons = 0; nPi0s = 0;
294     nGamas = 0; nProtons = 0; nKaons = 0;
295     nPions = 0; nMuons = 0; nElectrons = 0; nFWMuons = 0; nFWMatchedMuons = 0;    
296     nCh1GeV = 0; nCh3GeV = 0; nCh10GeV = 0;
297     nMu1GeV = 0; nMu3GeV = 0; nMu10GeV = 0;
298     nEl1GeV = 0; nEl3GeV = 0; nEl10GeV = 0;
299     maxPt = .0; etamaxPt = -999.; phimaxPt = -999.; meanPt = .0; totalP = .0;
300     fVertexflag = 1;
301     
302     chain->GetEntry(iEventNumber);    
303     esdold = esd->GetAliESDOld();
304     if(esdold) esd->CopyFromOldESD();
305
306     TFile *file = chain->GetFile();
307     const TUrl *url = file->GetEndpointUrl();
308     fguid = file->GetUUID().AsString();
309     if(fSession == "grid") {
310       TString fturltemp = "alien://"; fturltemp += url->GetFile();
311       fturl = fturltemp(0,fturltemp.Index(".root",5,0,TString::kExact)+5);
312     }
313     else fturl = url->GetFile();
314
315     if(iEventNumber == 0) iInitRunNumber = esd->GetRunNumber();
316     iRunNumber = esd->GetRunNumber();
317     if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD - You are trying to merge different runs!!!");
318
319     const AliESDVertex * vertexIn = esd->GetVertex();
320     fVertexName = vertexIn->GetName();
321     if(fVertexName == "default") fVertexflag = 0;
322
323     for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
324       AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
325       if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
326       else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
327       UInt_t status = esdTrack->GetStatus();
328       
329       //select only tracks with ITS refit
330       if ((status&AliESDtrack::kITSrefit)==0) continue;
331       //select only tracks with TPC refit
332       if ((status&AliESDtrack::kTPCrefit)==0) continue;
333       
334       //select only tracks with the "combined PID"
335       if ((status&AliESDtrack::kESDpid)==0) continue;
336       Double_t p[3];
337       esdTrack->GetPxPyPz(p);
338       Double_t pt2 = p[0]*p[0]+p[1]*p[1];
339       Double_t momentum = TMath::Sqrt(pt2+p[2]*p[2]);
340       Double_t fPt = TMath::Sqrt(pt2);
341       totalP += momentum;
342       meanPt += fPt;
343       if(fPt > maxPt) {
344           maxPt = fPt;
345           phimaxPt = esdTrack->Phi();
346           etamaxPt = esdTrack->Eta();
347       }
348       
349       if(esdTrack->GetSign() > 0) {
350         nPos++;
351         if(fPt > fLowPtCut) nCh1GeV++;
352         if(fPt > fHighPtCut) nCh3GeV++;
353         if(fPt > fVeryHighPtCut) nCh10GeV++;
354       }
355       if(esdTrack->GetSign() < 0) {
356         nNeg++;
357         if(fPt > fLowPtCut) nCh1GeV++;
358         if(fPt > fHighPtCut) nCh3GeV++;
359         if(fPt > fVeryHighPtCut) nCh10GeV++;
360       }
361       if(esdTrack->GetSign() == 0) nNeutr++;
362       
363       //PID
364       Double_t prob[5];
365       esdTrack->GetESDpid(prob);
366       
367       Double_t rcc = 0.0;
368       for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
369       if(rcc == 0.0) continue;
370       //Bayes' formula
371       Double_t w[5];
372       for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
373       
374       //protons
375       if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
376       //kaons
377       if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
378       //pions
379       if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++; 
380       //electrons
381       if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
382         nElectrons++;
383         if(fPt > fLowPtCut) nEl1GeV++;
384         if(fPt > fHighPtCut) nEl3GeV++;
385         if(fPt > fVeryHighPtCut) nEl10GeV++;
386       }   
387       ntrack++;
388     }//esd track loop
389     
390     /////////////
391     //muon code//
392     ////////////
393     Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
394     // loop over all reconstructed tracks (also first track of combination)
395     for (Int_t iTrack = 0; iTrack <  nMuonTracks;  iTrack++) {
396       AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
397       if (muonTrack == 0x0) continue;
398       
399       // Coordinates at vertex
400       fZ = muonTrack->GetZ(); 
401       fY = muonTrack->GetBendingCoor();
402       fX = muonTrack->GetNonBendingCoor(); 
403       
404       fThetaX = muonTrack->GetThetaX();
405       fThetaY = muonTrack->GetThetaY();
406       
407       fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
408       fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
409       fPxRec = fPzRec * TMath::Tan(fThetaX);
410       fPyRec = fPzRec * TMath::Tan(fThetaY);
411       fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
412       
413       //ChiSquare of the track if needed
414       fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
415       fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
416       fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
417       
418       if (muonTrack->GetMatchTrigger()>0) nFWMatchedMuons++;
419       
420       nMuons++;
421       nFWMuons++;
422       if(fEPvector.Pt() > fLowPtCut) {
423         nMu1GeV++; 
424         if(fEPvector.Pt() > fHighPtCut) {
425           nMu3GeV++; 
426           if (fEPvector.Pt() > fVeryHighPtCut) {
427             nMu10GeV++;
428           }
429         }
430       }
431     }//muon track loop
432     
433     // Fill the event tags 
434     if(ntrack != 0) meanPt = meanPt/ntrack;
435     
436     //AliInfo(Form("====================================="));
437     //AliInfo(Form("URL: %s - GUID: %s",fturl.Data(),fguid.Data()));
438     //AliInfo(Form("====================================="));
439
440     //First physics data
441     const AliMultiplicity *spdMult = esd->GetMultiplicity();
442     evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0));
443     evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1));
444     evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets());
445
446     AliESDVZERO *vzeroData = esd->GetVZEROData();
447     evTag->SetMTotV0A(vzeroData->GetMTotV0A());
448     evTag->SetMTotV0C(vzeroData->GetMTotV0C());
449     evTag->SetNbPMV0A(vzeroData->GetNbPMV0A());
450     evTag->SetNbPMV0C(vzeroData->GetNbPMV0C());
451
452     //evTag->SetEventId(iEventNumber+1);
453     evTag->SetPeriodNumber(esd->GetPeriodNumber());
454     evTag->SetOrbitNumber(esd->GetOrbitNumber());
455     evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber());
456     evTag->SetGUID(fguid);
457     if(fSession == "grid") {
458       evTag->SetMD5("");
459       evTag->SetTURL(fturl);
460       evTag->SetSize(0);
461     }
462     else evTag->SetPath(fturl);
463     
464     evTag->SetVertexX(vertexIn->GetXv());
465     evTag->SetVertexY(vertexIn->GetYv());
466     evTag->SetVertexZ(vertexIn->GetZv());
467     evTag->SetVertexZError(vertexIn->GetZRes());
468     evTag->SetVertexFlag(fVertexflag);
469     
470     evTag->SetT0VertexZ(esd->GetT0zVertex());
471     
472     evTag->SetTriggerMask(esd->GetTriggerMask());
473     evTag->SetTriggerCluster(esd->GetTriggerCluster());
474     
475     evTag->SetEventType(esd->GetEventType());
476     evTag->SetFiredTriggerClasses(esd->GetFiredTriggerClasses());
477
478     evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
479     evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
480     evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
481     evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
482     evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
483     evTag->SetNumOfParticipants(esd->GetZDCParticipants());
484     
485     
486     evTag->SetNumOfTracks(esd->GetNumberOfTracks());
487     evTag->SetNumOfPosTracks(nPos);
488     evTag->SetNumOfNegTracks(nNeg);
489     evTag->SetNumOfNeutrTracks(nNeutr);
490     
491     evTag->SetNumOfV0s(esd->GetNumberOfV0s());
492     evTag->SetNumOfCascades(esd->GetNumberOfCascades());
493     evTag->SetNumOfKinks(esd->GetNumberOfKinks());
494     evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
495     
496     evTag->SetNumOfProtons(nProtons);
497     evTag->SetNumOfKaons(nKaons);
498     evTag->SetNumOfPions(nPions);
499     evTag->SetNumOfMuons(nMuons);
500     evTag->SetNumOfFWMuons(nFWMuons);
501     evTag->SetNumOfFWMatchedMuons(nFWMatchedMuons);
502     evTag->SetNumOfElectrons(nElectrons);
503     evTag->SetNumOfPhotons(nGamas);
504     evTag->SetNumOfPi0s(nPi0s);
505     evTag->SetNumOfNeutrons(nNeutrons);
506     evTag->SetNumOfKaon0s(nK0s);
507     
508     evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
509     evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
510     evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
511     evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
512     evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
513     evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
514     evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
515     evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
516     evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
517     
518     tmp.Clear();
519     evTag->SetNumOfPHOSClusters(esd->GetPHOSClusters(&tmp));
520     tmp.Clear();
521     evTag->SetNumOfEMCALClusters(esd->GetEMCALClusters(&tmp));
522     
523     evTag->SetTotalMomentum(totalP);
524     evTag->SetMeanPt(meanPt);
525     evTag->SetMaxPt(maxPt);
526     evTag->SetEtaMaxPt(etamaxPt);
527     evTag->SetPhiMaxPt(phimaxPt);
528     
529     tag->SetRunId(iInitRunNumber);
530     if(fIsSim) tag->SetDataType(0);
531     else tag->SetDataType(1);
532
533     if(fguid != fTempGuid) {
534       fTempGuid = fguid;
535       ttag->Fill();
536       tag->Clear("");
537     }
538     tag->AddEventTag(*evTag);
539     if(iEventNumber+1 == chain->GetEntries()) {
540       //AliInfo(Form("File: %s",fturl.Data()));
541       ttag->Fill();
542       tag->Clear("");
543     }      
544   }//event loop
545   lastEvent = chain->GetEntries();
546   
547   //gSystem->GetMemInfo(meminfo);
548   //AliInfo(Form("After the event and track loop - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
549   //tempmem = meminfo->fMemUsed;
550
551   //chain->Delete("");
552   
553   //gSystem->GetMemInfo(meminfo);
554   //AliInfo(Form("After the t->Delete - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
555   //tempmem = meminfo->fMemUsed;
556
557   ftag->cd();
558   tag->Clear();
559   ttag->Write();
560   ftag->Close();
561
562   //gSystem->GetMemInfo(meminfo);
563   //AliInfo(Form("After the file closing - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
564   //tempmem = meminfo->fMemUsed;
565
566   delete esd;
567   delete tag;
568
569   //gSystem->GetMemInfo(meminfo);
570   //AliInfo(Form("After the delete objects - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
571 }
572
573 //_____________________________________________________________________________
574 void AliESDTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, const char *turl, Long64_t size, Int_t Counter) {
575   //private method that creates tag files
576   TString fguid = guid;
577   TString fmd5 = md5;
578   TString fturl = turl;
579   /////////////
580   //muon code//
581   ////////////
582   Double_t fMUONMASS = 0.105658369;
583   //Variables
584   Double_t fX,fY,fZ ;
585   Double_t fThetaX, fThetaY, fPyz, fChisquare;
586   Double_t fPxRec, fPyRec, fPzRec, fEnergy;
587   Int_t fCharge;
588   TLorentzVector fEPvector;
589
590   Float_t fZVertexCut = 40.0; 
591   Float_t fRhoVertexCut = 600.0; 
592
593   Float_t fLowPtCut = 1.0;
594   Float_t fHighPtCut = 3.0;
595   Float_t fVeryHighPtCut = 10.0;
596   ////////////
597
598   Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
599
600   // Creates the tags for all the events in a given ESD file
601   Bool_t fIsSim = kTRUE;
602   Int_t ntrack;
603   Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons, nFWMatchedMuons;
604   Int_t nPos, nNeg, nNeutr;
605   Int_t nK0s, nNeutrons, nPi0s, nGamas;
606   Int_t nCh1GeV, nCh3GeV, nCh10GeV;
607   Int_t nMu1GeV, nMu3GeV, nMu10GeV;
608   Int_t nEl1GeV, nEl3GeV, nEl10GeV;
609   Float_t maxPt = .0, etamaxPt = -999., phimaxPt = -999., meanPt = .0, totalP = .0;
610   Int_t fVertexflag;
611   Int_t iRunNumber = 0;
612   TString fVertexName;
613   TRefArray tmp;
614
615   AliRunTag *tag = new AliRunTag();
616   AliEventTag *evTag = new AliEventTag();
617   TTree * ttag = new TTree("T","A Tree with event tags");
618   TBranch * btag = ttag->Branch("AliTAG", &tag);
619   btag->SetCompressionLevel(9);
620   gSystem->GetMemInfo(meminfo);
621   AliInfo(Form("After the tag initialization - Memory used: %d MB",meminfo->fMemUsed));
622   Int_t tempmem = meminfo->fMemUsed;
623   
624   AliInfo(Form("Creating the ESD tags......."));        
625   
626   Int_t firstEvent = 0,lastEvent = 0;
627   TTree *t = (TTree*) file->Get("esdTree");
628   AliESDEvent *esd = new AliESDEvent();
629   esd->ReadFromTree(t);
630   
631   gSystem->GetMemInfo(meminfo);
632   AliInfo(Form("After the esd initialization - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
633   tempmem = meminfo->fMemUsed;
634
635   t->GetEntry(0);
636   Int_t iInitRunNumber = esd->GetRunNumber();
637
638   Int_t iNumberOfEvents = (Int_t)t->GetEntries();
639   for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
640     ntrack = 0;
641     nPos = 0;
642     nNeg = 0;
643     nNeutr =0;
644     nK0s = 0;
645     nNeutrons = 0;
646     nPi0s = 0;
647     nGamas = 0;
648     nProtons = 0;
649     nKaons = 0;
650     nPions = 0;
651     nMuons = 0;
652     nFWMuons = 0;
653     nFWMatchedMuons = 0;
654     nElectrons = 0;       
655     nCh1GeV = 0;
656     nCh3GeV = 0;
657     nCh10GeV = 0;
658     nMu1GeV = 0;
659     nMu3GeV = 0;
660     nMu10GeV = 0;
661     nEl1GeV = 0;
662     nEl3GeV = 0;
663     nEl10GeV = 0;
664     maxPt = .0;
665     etamaxPt = -999.;
666     phimaxPt = -999.;
667     meanPt = .0;
668     totalP = .0;
669     fVertexflag = 1;
670     
671     t->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;
677
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();
683       
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;
688       
689       //select only tracks with the "combined PID"
690       if ((status&AliESDtrack::kESDpid)==0) continue;
691       Double_t p[3];
692       esdTrack->GetPxPyPz(p);
693       Double_t pt2 = p[0]*p[0]+p[1]*p[1];
694       Double_t momentum = TMath::Sqrt(pt2+p[2]*p[2]);
695       Double_t fPt = TMath::Sqrt(pt2);
696       totalP += momentum;
697       meanPt += fPt;
698       if(fPt > maxPt) {
699           maxPt = fPt;
700           etamaxPt = esdTrack->Eta();
701           phimaxPt = esdTrack->Phi();
702       }
703       
704               
705       if(esdTrack->GetSign() > 0) {
706         nPos++;
707         if(fPt > fLowPtCut) nCh1GeV++;
708         if(fPt > fHighPtCut) nCh3GeV++;
709         if(fPt > fVeryHighPtCut) nCh10GeV++;
710       }
711       if(esdTrack->GetSign() < 0) {
712         nNeg++;
713         if(fPt > fLowPtCut) nCh1GeV++;
714         if(fPt > fHighPtCut) nCh3GeV++;
715         if(fPt > fVeryHighPtCut) nCh10GeV++;
716       }
717       if(esdTrack->GetSign() == 0) nNeutr++;
718       
719       //PID
720       Double_t prob[5];
721       esdTrack->GetESDpid(prob);
722       
723       Double_t rcc = 0.0;
724       for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
725       if(rcc == 0.0) continue;
726       //Bayes' formula
727       Double_t w[5];
728       for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
729       
730       //protons
731       if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
732       //kaons
733       if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
734       //pions
735       if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++; 
736       //electrons
737       if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
738         nElectrons++;
739         if(fPt > fLowPtCut) nEl1GeV++;
740         if(fPt > fHighPtCut) nEl3GeV++;
741         if(fPt > fVeryHighPtCut) nEl10GeV++;
742       }   
743       ntrack++;
744     }//esd track loop
745     
746     /////////////
747     //muon code//
748     ////////////
749     Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
750     // loop over all reconstructed tracks (also first track of combination)
751     for (Int_t iTrack = 0; iTrack <  nMuonTracks;  iTrack++) {
752       AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
753       if (muonTrack == 0x0) continue;
754       
755       // Coordinates at vertex
756       fZ = muonTrack->GetZ(); 
757       fY = muonTrack->GetBendingCoor();
758       fX = muonTrack->GetNonBendingCoor(); 
759       
760       fThetaX = muonTrack->GetThetaX();
761       fThetaY = muonTrack->GetThetaY();
762       
763       fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
764       fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
765       fPxRec = fPzRec * TMath::Tan(fThetaX);
766       fPyRec = fPzRec * TMath::Tan(fThetaY);
767       fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
768       
769       //ChiSquare of the track if needed
770       fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
771       fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
772       fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
773       
774       if (muonTrack->GetMatchTrigger()>0) nFWMatchedMuons++;
775       
776       nMuons++;
777       nFWMuons++;
778       if(fEPvector.Pt() > fLowPtCut) {
779         nMu1GeV++; 
780         if(fEPvector.Pt() > fHighPtCut) {
781           nMu3GeV++; 
782           if (fEPvector.Pt() > fVeryHighPtCut) {
783             nMu10GeV++;
784           }
785         }
786       }
787     }//muon track loop
788     
789     // Fill the event tags 
790     if(ntrack != 0) meanPt = meanPt/ntrack;
791     
792     //First physics data
793     const AliMultiplicity *spdMult = esd->GetMultiplicity();
794     evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0));
795     evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1));
796     evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets());
797
798     AliESDVZERO *vzeroData = esd->GetVZEROData();
799     evTag->SetMTotV0A(vzeroData->GetMTotV0A());
800     evTag->SetMTotV0C(vzeroData->GetMTotV0C());
801     evTag->SetNbPMV0A(vzeroData->GetNbPMV0A());
802     evTag->SetNbPMV0C(vzeroData->GetNbPMV0C());
803
804     //evTag->SetEventId(iEventNumber+1);
805     evTag->SetPeriodNumber(esd->GetPeriodNumber());
806     evTag->SetOrbitNumber(esd->GetOrbitNumber());
807     evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber());
808
809     evTag->SetGUID(fguid);
810     evTag->SetMD5(fmd5);
811     evTag->SetTURL(fturl);
812     evTag->SetSize(size);
813     evTag->SetVertexX(vertexIn->GetXv());
814     evTag->SetVertexY(vertexIn->GetYv());
815     evTag->SetVertexZ(vertexIn->GetZv());
816     evTag->SetVertexZError(vertexIn->GetZRes());
817     evTag->SetVertexFlag(fVertexflag);
818     
819     evTag->SetT0VertexZ(esd->GetT0zVertex());
820     
821     evTag->SetTriggerMask(esd->GetTriggerMask());
822     evTag->SetTriggerCluster(esd->GetTriggerCluster());
823     
824     evTag->SetEventType(esd->GetEventType());
825     evTag->SetFiredTriggerClasses(esd->GetFiredTriggerClasses());
826
827     evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
828     evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
829     evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
830     evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
831     evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
832     evTag->SetNumOfParticipants(esd->GetZDCParticipants());
833     
834     
835     evTag->SetNumOfTracks(esd->GetNumberOfTracks());
836     evTag->SetNumOfPosTracks(nPos);
837     evTag->SetNumOfNegTracks(nNeg);
838     evTag->SetNumOfNeutrTracks(nNeutr);
839     
840     evTag->SetNumOfV0s(esd->GetNumberOfV0s());
841     evTag->SetNumOfCascades(esd->GetNumberOfCascades());
842     evTag->SetNumOfKinks(esd->GetNumberOfKinks());
843     evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
844     
845     evTag->SetNumOfProtons(nProtons);
846     evTag->SetNumOfKaons(nKaons);
847     evTag->SetNumOfPions(nPions);
848     evTag->SetNumOfMuons(nMuons);
849     evTag->SetNumOfFWMuons(nFWMuons);
850     evTag->SetNumOfFWMatchedMuons(nFWMatchedMuons);
851     evTag->SetNumOfElectrons(nElectrons);
852     evTag->SetNumOfPhotons(nGamas);
853     evTag->SetNumOfPi0s(nPi0s);
854     evTag->SetNumOfNeutrons(nNeutrons);
855     evTag->SetNumOfKaon0s(nK0s);
856     
857     evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
858     evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
859     evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
860     evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
861     evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
862     evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
863     evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
864     evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
865     evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
866     
867     tmp.Clear();
868     evTag->SetNumOfPHOSClusters(esd->GetPHOSClusters(&tmp));
869     tmp.Clear();
870     evTag->SetNumOfEMCALClusters(esd->GetEMCALClusters(&tmp));
871     
872     evTag->SetTotalMomentum(totalP);
873     evTag->SetMeanPt(meanPt);
874     evTag->SetMaxPt(maxPt);
875     evTag->SetEtaMaxPt(etamaxPt);
876     evTag->SetPhiMaxPt(phimaxPt);
877     
878     tag->SetRunId(iInitRunNumber);
879     if(fIsSim) tag->SetDataType(0);
880     else tag->SetDataType(1);
881     tag->AddEventTag(*evTag);
882   }//event loop
883   lastEvent = iNumberOfEvents;
884   
885   gSystem->GetMemInfo(meminfo);
886   AliInfo(Form("After the event and track loop - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
887   tempmem = meminfo->fMemUsed;
888   t->Delete("");
889   
890   gSystem->GetMemInfo(meminfo);
891   AliInfo(Form("After the t->Delete - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
892   tempmem = meminfo->fMemUsed;
893
894   TString localFileName = "Run"; localFileName += tag->GetRunId(); 
895   localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter;
896   localFileName += ".ESD.tag.root";
897
898   TString fileName;
899   
900   if(fStorage == 0) {
901     fileName = localFileName.Data();      
902     AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
903   }
904   else if(fStorage == 1) {
905     TString alienLocation = "/alien";
906     alienLocation += gGrid->Pwd();
907     alienLocation += fgridpath.Data();
908     alienLocation += "/";
909     alienLocation +=  localFileName;
910     alienLocation += "?se=";
911     alienLocation += fSE.Data();
912     fileName = alienLocation.Data();
913     AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
914   }
915
916   TFile* ftag = TFile::Open(fileName, "recreate");
917   ftag->cd();
918   ttag->Fill();
919   tag->Clear();
920   ttag->Write();
921   ftag->Close();
922
923   gSystem->GetMemInfo(meminfo);
924   AliInfo(Form("After the file closing - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
925   tempmem = meminfo->fMemUsed;
926
927   delete ftag;
928   delete esd;
929
930   delete tag;
931   gSystem->GetMemInfo(meminfo);
932   AliInfo(Form("After the delete objects - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
933 }
934
935 //_____________________________________________________________________________
936 void AliESDTagCreator::CreateTag(TFile* file, const char *filepath, Int_t Counter) {
937   //private method that creates tag files
938   /////////////
939   //muon code//
940   ////////////
941   Double_t fMUONMASS = 0.105658369;
942   //Variables
943   Double_t fX,fY,fZ ;
944   Double_t fThetaX, fThetaY, fPyz, fChisquare;
945   Double_t fPxRec, fPyRec, fPzRec, fEnergy;
946   Int_t fCharge;
947   TLorentzVector fEPvector;
948
949   Float_t fZVertexCut = 40.0; 
950   Float_t fRhoVertexCut = 600.0; 
951
952   Float_t fLowPtCut = 1.0;
953   Float_t fHighPtCut = 3.0;
954   Float_t fVeryHighPtCut = 10.0;
955   ////////////
956
957   Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
958
959   // Creates the tags for all the events in a given ESD file
960   Bool_t fIsSim = kTRUE;
961   Int_t ntrack;
962   Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons, nFWMatchedMuons;
963   Int_t nPos, nNeg, nNeutr;
964   Int_t nK0s, nNeutrons, nPi0s, nGamas;
965   Int_t nCh1GeV, nCh3GeV, nCh10GeV;
966   Int_t nMu1GeV, nMu3GeV, nMu10GeV;
967   Int_t nEl1GeV, nEl3GeV, nEl10GeV;
968   Float_t maxPt = .0, etamaxPt = -999, phimaxPt = -999., meanPt = .0, totalP = .0;
969   Int_t fVertexflag;
970   Int_t iRunNumber = 0;
971   TString fVertexName;
972   TRefArray tmp;
973
974   AliRunTag *tag = new AliRunTag();
975   AliEventTag *evTag = new AliEventTag();
976   TTree * ttag = new TTree("T","A Tree with event tags");
977   TBranch * btag = ttag->Branch("AliTAG", &tag);
978   btag->SetCompressionLevel(9);
979   
980   AliInfo(Form("Creating the ESD tags......."));        
981   
982   Int_t firstEvent = 0,lastEvent = 0;
983   
984   TTree *t = (TTree*) file->Get("esdTree");
985   AliESDEvent *esd = new AliESDEvent();
986   esd->ReadFromTree(t);
987   
988   t->GetEntry(0);
989   Int_t iInitRunNumber = esd->GetRunNumber();
990
991   Int_t iNumberOfEvents = (Int_t)t->GetEntries();
992   for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
993     ntrack = 0;
994     nPos = 0;
995     nNeg = 0;
996     nNeutr =0;
997     nK0s = 0;
998     nNeutrons = 0;
999     nPi0s = 0;
1000     nGamas = 0;
1001     nProtons = 0;
1002     nKaons = 0;
1003     nPions = 0;
1004     nMuons = 0;
1005     nFWMuons = 0;
1006     nFWMatchedMuons = 0;
1007     nElectrons = 0;       
1008     nCh1GeV = 0;
1009     nCh3GeV = 0;
1010     nCh10GeV = 0;
1011     nMu1GeV = 0;
1012     nMu3GeV = 0;
1013     nMu10GeV = 0;
1014     nEl1GeV = 0;
1015     nEl3GeV = 0;
1016     nEl10GeV = 0;
1017     maxPt = .0;
1018     etamaxPt = -999.;
1019     phimaxPt = -999.;
1020     meanPt = .0;
1021     totalP = .0;
1022     fVertexflag = 1;
1023     
1024     t->GetEntry(iEventNumber);
1025     iRunNumber = esd->GetRunNumber();
1026     if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
1027     const AliESDVertex * vertexIn = esd->GetVertex();
1028     fVertexName = vertexIn->GetName();
1029     if(fVertexName == "default") fVertexflag = 0;
1030
1031     for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
1032       AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
1033       if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
1034       else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
1035       UInt_t status = esdTrack->GetStatus();
1036       
1037       //select only tracks with ITS refit
1038       if ((status&AliESDtrack::kITSrefit)==0) continue;
1039       //select only tracks with TPC refit
1040       if ((status&AliESDtrack::kTPCrefit)==0) continue;
1041       
1042       //select only tracks with the "combined PID"
1043       if ((status&AliESDtrack::kESDpid)==0) continue;
1044       Double_t p[3];
1045       esdTrack->GetPxPyPz(p);
1046       Double_t pt2 = p[0]*p[0]+p[1]*p[1];
1047       Double_t momentum = TMath::Sqrt(pt2+p[2]*p[2]);
1048       Double_t fPt = TMath::Sqrt(pt2);
1049       totalP += momentum;
1050       meanPt += fPt;
1051       if(fPt > maxPt) {
1052           maxPt = fPt;
1053           etamaxPt = esdTrack->Eta();
1054           phimaxPt = esdTrack->Phi();
1055       }
1056       
1057       
1058       if(esdTrack->GetSign() > 0) {
1059         nPos++;
1060         if(fPt > fLowPtCut) nCh1GeV++;
1061         if(fPt > fHighPtCut) nCh3GeV++;
1062         if(fPt > fVeryHighPtCut) nCh10GeV++;
1063       }
1064       if(esdTrack->GetSign() < 0) {
1065         nNeg++;
1066         if(fPt > fLowPtCut) nCh1GeV++;
1067         if(fPt > fHighPtCut) nCh3GeV++;
1068         if(fPt > fVeryHighPtCut) nCh10GeV++;
1069       }
1070       if(esdTrack->GetSign() == 0) nNeutr++;
1071       
1072       //PID
1073       Double_t prob[5];
1074       esdTrack->GetESDpid(prob);
1075       
1076       Double_t rcc = 0.0;
1077       for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
1078       if(rcc == 0.0) continue;
1079       //Bayes' formula
1080       Double_t w[5];
1081       for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1082       
1083       //protons
1084       if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1085       //kaons
1086       if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1087       //pions
1088       if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++; 
1089       //electrons
1090       if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1091         nElectrons++;
1092         if(fPt > fLowPtCut) nEl1GeV++;
1093         if(fPt > fHighPtCut) nEl3GeV++;
1094         if(fPt > fVeryHighPtCut) nEl10GeV++;
1095       }   
1096       ntrack++;
1097     }//esd track loop
1098     
1099     /////////////
1100     //muon code//
1101     ////////////
1102     Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1103     // loop over all reconstructed tracks (also first track of combination)
1104     for (Int_t iTrack = 0; iTrack <  nMuonTracks;  iTrack++) {
1105       AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1106       if (muonTrack == 0x0) continue;
1107       
1108       // Coordinates at vertex
1109       fZ = muonTrack->GetZ(); 
1110       fY = muonTrack->GetBendingCoor();
1111       fX = muonTrack->GetNonBendingCoor(); 
1112       
1113       fThetaX = muonTrack->GetThetaX();
1114       fThetaY = muonTrack->GetThetaY();
1115       
1116       fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1117       fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1118       fPxRec = fPzRec * TMath::Tan(fThetaX);
1119       fPyRec = fPzRec * TMath::Tan(fThetaY);
1120       fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1121       
1122       //ChiSquare of the track if needed
1123       fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1124       fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1125       fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1126       
1127       if (muonTrack->GetMatchTrigger()>0) nFWMatchedMuons++;
1128
1129       nMuons++;
1130       nFWMuons++;
1131       if(fEPvector.Pt() > fLowPtCut) {
1132         nMu1GeV++; 
1133         if(fEPvector.Pt() > fHighPtCut) {
1134           nMu3GeV++; 
1135           if (fEPvector.Pt() > fVeryHighPtCut) {
1136             nMu10GeV++;
1137           }
1138         }
1139       }
1140     }//muon track loop
1141     
1142     // Fill the event tags 
1143     if(ntrack != 0) meanPt = meanPt/ntrack;
1144     
1145     //First physics data
1146     const AliMultiplicity *spdMult = esd->GetMultiplicity();
1147     evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0));
1148     evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1));
1149     evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets());
1150
1151     AliESDVZERO *vzeroData = esd->GetVZEROData();
1152     evTag->SetMTotV0A(vzeroData->GetMTotV0A());
1153     evTag->SetMTotV0C(vzeroData->GetMTotV0C());
1154     evTag->SetNbPMV0A(vzeroData->GetNbPMV0A());
1155     evTag->SetNbPMV0C(vzeroData->GetNbPMV0C());
1156
1157     //evTag->SetEventId(iEventNumber+1);
1158     evTag->SetPeriodNumber(esd->GetPeriodNumber());
1159     evTag->SetOrbitNumber(esd->GetOrbitNumber());
1160     evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber());
1161     evTag->SetPath(filepath);
1162  
1163     evTag->SetVertexX(vertexIn->GetXv());
1164     evTag->SetVertexY(vertexIn->GetYv());
1165     evTag->SetVertexZ(vertexIn->GetZv());
1166     evTag->SetVertexZError(vertexIn->GetZRes());
1167     evTag->SetVertexFlag(fVertexflag);
1168     
1169     evTag->SetT0VertexZ(esd->GetT0zVertex());
1170     
1171     evTag->SetTriggerMask(esd->GetTriggerMask());
1172     evTag->SetTriggerCluster(esd->GetTriggerCluster());
1173     
1174     evTag->SetEventType(esd->GetEventType());
1175     evTag->SetFiredTriggerClasses(esd->GetFiredTriggerClasses());
1176
1177     evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1178     evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1179     evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
1180     evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
1181     evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
1182     evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1183     
1184     
1185     evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1186     evTag->SetNumOfPosTracks(nPos);
1187     evTag->SetNumOfNegTracks(nNeg);
1188     evTag->SetNumOfNeutrTracks(nNeutr);
1189     
1190     evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1191     evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1192     evTag->SetNumOfKinks(esd->GetNumberOfKinks());
1193     evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
1194     
1195     evTag->SetNumOfProtons(nProtons);
1196     evTag->SetNumOfKaons(nKaons);
1197     evTag->SetNumOfPions(nPions);
1198     evTag->SetNumOfMuons(nMuons);
1199     evTag->SetNumOfFWMuons(nFWMuons);
1200     evTag->SetNumOfFWMatchedMuons(nFWMatchedMuons);
1201     evTag->SetNumOfElectrons(nElectrons);
1202     evTag->SetNumOfPhotons(nGamas);
1203     evTag->SetNumOfPi0s(nPi0s);
1204     evTag->SetNumOfNeutrons(nNeutrons);
1205     evTag->SetNumOfKaon0s(nK0s);
1206     
1207     evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1208     evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1209     evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1210     evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1211     evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1212     evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1213     evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1214     evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1215     evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
1216     
1217     tmp.Clear();
1218     evTag->SetNumOfPHOSClusters(esd->GetPHOSClusters(&tmp));
1219     tmp.Clear();
1220     evTag->SetNumOfEMCALClusters(esd->GetEMCALClusters(&tmp));
1221     
1222     evTag->SetTotalMomentum(totalP);
1223     evTag->SetMeanPt(meanPt);
1224     evTag->SetMaxPt(maxPt);
1225     evTag->SetEtaMaxPt(etamaxPt);
1226     evTag->SetPhiMaxPt(phimaxPt);
1227     
1228     tag->SetRunId(iInitRunNumber);
1229     if(fIsSim) tag->SetDataType(0);
1230     else tag->SetDataType(1);
1231     tag->AddEventTag(*evTag);
1232   }//event loop
1233   lastEvent = iNumberOfEvents;
1234   
1235   t->Delete("");
1236   
1237   TString localFileName = "Run"; localFileName += tag->GetRunId(); 
1238   localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter;
1239   localFileName += ".ESD.tag.root";
1240
1241   TString fileName;
1242   
1243   if(fStorage == 0) {
1244     fileName = localFileName.Data();      
1245     AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
1246   }
1247   else if(fStorage == 1) {
1248     TString alienLocation = "/alien";
1249     alienLocation += gGrid->Pwd();
1250     alienLocation += fgridpath.Data();
1251     alienLocation += "/";
1252     alienLocation +=  localFileName;
1253     alienLocation += "?se=";
1254     alienLocation += fSE.Data();
1255     fileName = alienLocation.Data();
1256     AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
1257   }
1258
1259   TFile* ftag = TFile::Open(fileName, "recreate");
1260   ftag->cd();
1261   ttag->Fill();
1262   tag->Clear();
1263   ttag->Write();
1264   ftag->Close();
1265
1266   delete ftag;
1267   delete esd;
1268
1269   delete tag;
1270 }
1271
1272 //_____________________________________________________________________________
1273 void AliESDTagCreator::CreateESDTags(Int_t fFirstEvent, Int_t fLastEvent, AliGRPObject *grpData, ULong_t * qa, Bool_t * es, Int_t qalength, Int_t eslength) {
1274   //GRP
1275   Float_t lhcLuminosity = 0.0;
1276   TString lhcState = "test";
1277   //UInt_t detectorMask = 0;
1278   Int_t detectorMask = 0;
1279
1280   detectorMask = grpData->GetDetectorMask();
1281   time_t startTime = grpData->GetTimeStart();
1282   TTimeStamp *t1 = new TTimeStamp(startTime);
1283   time_t endTime = grpData->GetTimeEnd();
1284   TTimeStamp *t2 = new TTimeStamp(endTime);
1285   const char* beamtype = grpData->GetBeamType();
1286   Float_t beamenergy = grpData->GetBeamEnergy();
1287
1288
1289   /////////////
1290   //muon code//
1291   ////////////
1292   Double_t fMUONMASS = 0.105658369;
1293   //Variables
1294   Double_t fX,fY,fZ ;
1295   Double_t fThetaX, fThetaY, fPyz, fChisquare;
1296   Double_t fPxRec,fPyRec, fPzRec, fEnergy;
1297   Int_t fCharge;
1298   TLorentzVector fEPvector;
1299
1300   Float_t fZVertexCut = 40.0; 
1301   Float_t fRhoVertexCut = 600.0; 
1302
1303   Float_t fLowPtCut = 1.0;
1304   Float_t fHighPtCut = 3.0;
1305   Float_t fVeryHighPtCut = 10.0;
1306   ////////////
1307
1308   Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
1309
1310   // Creates the tags for all the events in a given ESD file
1311   Int_t ntrack;
1312   Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons, nFWMatchedMuons;
1313   Int_t nPos, nNeg, nNeutr;
1314   Int_t nK0s, nNeutrons, nPi0s, nGamas;
1315   Int_t nCh1GeV, nCh3GeV, nCh10GeV;
1316   Int_t nMu1GeV, nMu3GeV, nMu10GeV;
1317   Int_t nEl1GeV, nEl3GeV, nEl10GeV;
1318   Float_t maxPt = .0, etamaxPt = -999., phimaxPt = -999., meanPt = .0, totalP = .0;
1319   Int_t fVertexflag;
1320   Int_t iRunNumber = 0;
1321   TString fVertexName("default");
1322   TRefArray tmp;
1323   
1324   AliInfo(Form("Creating the ESD tags......."));        
1325
1326   TFile *file = TFile::Open("AliESDs.root");
1327   if (!file || !file->IsOpen()) {
1328     AliError(Form("opening failed"));
1329     delete file;
1330     return ;
1331   }  
1332   Int_t lastEvent = 0;
1333   TTree *b = (TTree*) file->Get("esdTree");
1334   AliESDEvent *esd = new AliESDEvent();
1335   esd->ReadFromTree(b);
1336
1337   b->GetEntry(fFirstEvent);
1338   Int_t iInitRunNumber = esd->GetRunNumber();
1339   
1340   Int_t iNumberOfEvents = (Int_t)b->GetEntries();
1341   if ((fLastEvent == -1) || ((Int_t) b->GetEntries() < fLastEvent))
1342     lastEvent = (Int_t)b->GetEntries();
1343   else lastEvent = fLastEvent;
1344
1345   char fileName[256];
1346   sprintf(fileName, "Run%d.Event%d_%d.ESD.tag.root", 
1347           iInitRunNumber,fFirstEvent,lastEvent);
1348   AliInfo(Form("writing tags to file %s", fileName));
1349   AliDebug(1, Form("writing tags to file %s", fileName));
1350  
1351   TFile* ftag = TFile::Open(fileName, "recreate");
1352  
1353   AliRunTag *tag = new AliRunTag();
1354   AliEventTag *evTag = new AliEventTag();
1355   TTree * ttag = new TTree("T","A Tree with event tags");
1356   TBranch * btag = ttag->Branch("AliTAG", &tag);
1357   btag->SetCompressionLevel(9);
1358
1359   if ((fLastEvent != -1) && ((Int_t) b->GetEntries() > fLastEvent)) 
1360     iNumberOfEvents = fLastEvent + 1;
1361   for (Int_t iEventNumber = fFirstEvent; iEventNumber < iNumberOfEvents; iEventNumber++) {
1362     ntrack = 0;
1363     nPos = 0;
1364     nNeg = 0;
1365     nNeutr =0;
1366     nK0s = 0;
1367     nNeutrons = 0;
1368     nPi0s = 0;
1369     nGamas = 0;
1370     nProtons = 0;
1371     nKaons = 0;
1372     nPions = 0;
1373     nMuons = 0;
1374     nFWMuons = 0;
1375     nFWMatchedMuons = 0;
1376     nElectrons = 0;       
1377     nCh1GeV = 0;
1378     nCh3GeV = 0;
1379     nCh10GeV = 0;
1380     nMu1GeV = 0;
1381     nMu3GeV = 0;
1382     nMu10GeV = 0;
1383     nEl1GeV = 0;
1384     nEl3GeV = 0;
1385     nEl10GeV = 0;
1386     maxPt = .0;
1387     etamaxPt = -999.;
1388     phimaxPt = -999.;
1389     meanPt = .0;
1390     totalP = .0;
1391     fVertexflag = 0;
1392
1393     b->GetEntry(iEventNumber);
1394     iRunNumber = esd->GetRunNumber();
1395     if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
1396     const AliESDVertex * vertexIn = esd->GetVertex();
1397     if (!vertexIn) AliError("ESD has not defined vertex.");
1398     if (vertexIn) fVertexName = vertexIn->GetName();
1399     if(fVertexName != "default") fVertexflag = 1;
1400     for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
1401       AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
1402       UInt_t status = esdTrack->GetStatus();
1403       
1404       //select only tracks with ITS refit
1405       if ((status&AliESDtrack::kITSrefit)==0) continue;
1406       //select only tracks with TPC refit
1407       if ((status&AliESDtrack::kTPCrefit)==0) continue;
1408       
1409       //select only tracks with the "combined PID"
1410       if ((status&AliESDtrack::kESDpid)==0) continue;
1411       Double_t p[3];
1412       esdTrack->GetPxPyPz(p);
1413       Double_t pt2 = p[0]*p[0]+p[1]*p[1];
1414       Double_t momentum = TMath::Sqrt(pt2+p[2]*p[2]);
1415       Double_t fPt = TMath::Sqrt(pt2);
1416       totalP += momentum;
1417       meanPt += fPt;
1418       if(fPt > maxPt) {
1419           maxPt = fPt;
1420           phimaxPt = esdTrack->Eta();
1421           etamaxPt = esdTrack->Phi();
1422       }
1423       
1424       if(esdTrack->GetSign() > 0) {
1425         nPos++;
1426         if(fPt > fLowPtCut) nCh1GeV++;
1427         if(fPt > fHighPtCut) nCh3GeV++;
1428         if(fPt > fVeryHighPtCut) nCh10GeV++;
1429       }
1430       if(esdTrack->GetSign() < 0) {
1431         nNeg++;
1432         if(fPt > fLowPtCut) nCh1GeV++;
1433         if(fPt > fHighPtCut) nCh3GeV++;
1434         if(fPt > fVeryHighPtCut) nCh10GeV++;
1435       }
1436       if(esdTrack->GetSign() == 0) nNeutr++;
1437       
1438       //PID
1439       Double_t prob[5];
1440       esdTrack->GetESDpid(prob);
1441       
1442       Double_t rcc = 0.0;
1443       for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
1444       if(rcc == 0.0) continue;
1445       //Bayes' formula
1446       Double_t w[5];
1447       for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1448       
1449       //protons
1450       if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1451       //kaons
1452       if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1453       //pions
1454       if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++; 
1455       //electrons
1456       if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1457         nElectrons++;
1458         if(fPt > fLowPtCut) nEl1GeV++;
1459         if(fPt > fHighPtCut) nEl3GeV++;
1460         if(fPt > fVeryHighPtCut) nEl10GeV++;
1461       }   
1462       ntrack++;
1463     }//track loop
1464     
1465     /////////////
1466     //muon code//
1467     ////////////
1468     Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1469     // loop over all reconstructed tracks (also first track of combination)
1470     for (Int_t iTrack = 0; iTrack <  nMuonTracks;  iTrack++) {
1471       AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1472       if (muonTrack == 0x0) continue;
1473       
1474       // Coordinates at vertex
1475       fZ = muonTrack->GetZ(); 
1476       fY = muonTrack->GetBendingCoor();
1477       fX = muonTrack->GetNonBendingCoor(); 
1478       
1479       fThetaX = muonTrack->GetThetaX();
1480       fThetaY = muonTrack->GetThetaY();
1481       
1482       fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1483       fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1484       fPxRec = fPzRec * TMath::Tan(fThetaX);
1485       fPyRec = fPzRec * TMath::Tan(fThetaY);
1486       fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1487       
1488       //ChiSquare of the track if needed
1489       fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1490       fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1491       fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1492       
1493       if (muonTrack->GetMatchTrigger()>0) nFWMatchedMuons++;
1494
1495       nMuons++;
1496       nFWMuons++;
1497       if(fEPvector.Pt() > fLowPtCut) {
1498         nMu1GeV++; 
1499         if(fEPvector.Pt() > fHighPtCut) {
1500           nMu3GeV++; 
1501           if (fEPvector.Pt() > fVeryHighPtCut) {
1502             nMu10GeV++;
1503           }
1504         }
1505       }
1506     }//muon track loop
1507
1508     
1509     // Fill the event tags 
1510     if(ntrack != 0)
1511       meanPt = meanPt/ntrack;
1512
1513     //First physics data
1514     const AliMultiplicity *spdMult = esd->GetMultiplicity();
1515     evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0));
1516     evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1));
1517     evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets());
1518
1519     AliESDVZERO *vzeroData = esd->GetVZEROData();
1520     evTag->SetMTotV0A(vzeroData->GetMTotV0A());
1521     evTag->SetMTotV0C(vzeroData->GetMTotV0C());
1522     evTag->SetNbPMV0A(vzeroData->GetNbPMV0A());
1523     evTag->SetNbPMV0C(vzeroData->GetNbPMV0C());
1524
1525     //evTag->SetEventId(iEventNumber+1);
1526     evTag->SetPeriodNumber(esd->GetPeriodNumber());
1527     evTag->SetOrbitNumber(esd->GetOrbitNumber());
1528     evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber());
1529     if (vertexIn) {
1530       evTag->SetVertexX(vertexIn->GetXv());
1531       evTag->SetVertexY(vertexIn->GetYv());
1532       evTag->SetVertexZ(vertexIn->GetZv());
1533       evTag->SetVertexZError(vertexIn->GetZRes());
1534     }  
1535     evTag->SetVertexFlag(fVertexflag);
1536
1537     evTag->SetT0VertexZ(esd->GetT0zVertex());
1538     
1539     evTag->SetTriggerMask(esd->GetTriggerMask());
1540     evTag->SetTriggerCluster(esd->GetTriggerCluster());
1541     
1542     evTag->SetEventType(esd->GetEventType());
1543     evTag->SetFiredTriggerClasses(esd->GetFiredTriggerClasses());
1544
1545     evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1546     evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1547     evTag->SetZDCNeutron2Energy(esd->GetZDCN2Energy());
1548     evTag->SetZDCProton2Energy(esd->GetZDCP2Energy());
1549     evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
1550     evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1551     
1552     
1553     evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1554     evTag->SetNumOfPosTracks(nPos);
1555     evTag->SetNumOfNegTracks(nNeg);
1556     evTag->SetNumOfNeutrTracks(nNeutr);
1557     
1558     evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1559     evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1560     evTag->SetNumOfKinks(esd->GetNumberOfKinks());
1561     evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
1562     
1563     evTag->SetNumOfProtons(nProtons);
1564     evTag->SetNumOfKaons(nKaons);
1565     evTag->SetNumOfPions(nPions);
1566     evTag->SetNumOfMuons(nMuons);
1567     evTag->SetNumOfFWMuons(nFWMuons);
1568     evTag->SetNumOfFWMatchedMuons(nFWMatchedMuons);
1569     evTag->SetNumOfElectrons(nElectrons);
1570     evTag->SetNumOfPhotons(nGamas);
1571     evTag->SetNumOfPi0s(nPi0s);
1572     evTag->SetNumOfNeutrons(nNeutrons);
1573     evTag->SetNumOfKaon0s(nK0s);
1574     
1575     evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1576     evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1577     evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1578     evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1579     evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1580     evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1581     evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1582     evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1583     evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
1584     
1585     tmp.Clear();
1586     evTag->SetNumOfPHOSClusters(esd->GetPHOSClusters(&tmp));
1587     tmp.Clear();
1588     evTag->SetNumOfEMCALClusters(esd->GetEMCALClusters(&tmp));
1589     
1590     evTag->SetTotalMomentum(totalP);
1591     evTag->SetMeanPt(meanPt);
1592     evTag->SetMaxPt(maxPt);
1593     evTag->SetEtaMaxPt(etamaxPt);
1594     evTag->SetPhiMaxPt(phimaxPt);
1595     
1596     tag->SetLHCTag(lhcLuminosity,lhcState);
1597     tag->SetDetectorTag(detectorMask);
1598
1599     tag->SetRunId(iInitRunNumber);
1600     tag->SetRunStartTime(t1->GetDate());
1601     tag->SetRunStopTime(t2->GetDate());
1602     tag->SetBeamEnergy(beamenergy);
1603     tag->SetBeamType(beamtype);
1604     
1605     //QA setting 
1606     tag->SetQAArray(qa, qalength) ; 
1607     tag->SetEventSpecies(es, eslength) ;
1608
1609     tag->AddEventTag(*evTag);
1610   }
1611         
1612   ftag->cd();
1613   ttag->Fill();
1614   tag->Clear();
1615   ttag->Write();
1616   ftag->Close();
1617   file->cd();
1618   delete file;
1619   delete esd;
1620   delete tag;
1621   delete evTag;
1622 }
1623
1624 //_____________________________________________________________________________
1625 void AliESDTagCreator::SwitchOffBranches() const {
1626   //
1627   // Switch of branches on user request
1628   TObjArray * tokens = fBranches.Tokenize(" ");
1629   Int_t ntok = tokens->GetEntries();
1630   for (Int_t i = 0; i < ntok; i++)  {
1631     TString str = ((TObjString*) tokens->At(i))->GetString();
1632     fChain->SetBranchStatus(Form("%s%s%s","*", str.Data(), "*"), 0);
1633     AliInfo(Form("Branch %s switched off \n", str.Data()));
1634   }
1635 }