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 "AliESDEvent.h"
40 #include "AliESDVertex.h"
43 #include "AliAODEvent.h"
44 #include "AliAODVertex.h"
45 #include "AliAODTrack.h"
47 #include "AliTagCreator.h"
50 ClassImp(AliTagCreator)
53 //______________________________________________________________________________
54 AliTagCreator::AliTagCreator() :
56 fSE("ALICE::CERN::se"),
60 //==============Default constructor for a AliTagCreator==================
63 //______________________________________________________________________________
64 AliTagCreator::~AliTagCreator() {
65 //================Default destructor for a AliTagCreator=======================
68 //______________________________________________________________________________
69 void AliTagCreator::SetStorage(Int_t storage) {
70 // Sets correctly the storage: 0 for local, 1 for GRID
73 AliInfo(Form("Tags will be stored locally...."));
75 AliInfo(Form("Tags will be stored in the grid...."));
76 if((fStorage != 0)&&(fStorage != 1))
78 AliInfo(Form("Storage was not properly set!!!"));
84 //______________________________________________________________________________
85 Bool_t AliTagCreator::ReadGridCollection(TGridResult *fresult) {
86 // Reads the entry of the TGridResult and creates the tags
87 Int_t nEntries = fresult->GetEntries();
96 for(Int_t i = 0; i < nEntries; i++) {
97 alienUrl = fresult->GetKey(i,"turl");
98 guid = fresult->GetKey(i,"guid");
99 if(fresult->GetKey(i,"size")) size = atol (fresult->GetKey(i,"size"));
100 md5 = fresult->GetKey(i,"md5");
101 turl = fresult->GetKey(i,"turl");
102 if(md5 && !strlen(guid)) md5 = 0;
103 if(guid && !strlen(guid)) guid = 0;
105 TFile *f = TFile::Open(alienUrl,"READ");
106 CreateTag(f,guid,md5,turl,size,counter);
115 //______________________________________________________________________________
116 Bool_t AliTagCreator::ReadLocalCollection(const char *localpath) {
117 // Checks the different subdirs of the given local path and in the
118 // case where it finds an AliESDs.root file it creates the tags
120 void *dira = gSystem->OpenDirectory(localpath);
122 const char * dirname = 0x0;
123 const char * filename = 0x0;
124 const char * pattern = "AliESDs.root";
127 while((dirname = gSystem->GetDirEntry(dira))) {
128 sprintf(fPath,"%s/%s",localpath,dirname);
129 void *dirb = gSystem->OpenDirectory(fPath);
130 while((filename = gSystem->GetDirEntry(dirb))) {
131 if(strstr(filename,pattern)) {
132 TString fESDFileName;
133 fESDFileName = fPath;
135 fESDFileName += pattern;
136 TFile *f = TFile::Open(fESDFileName,"READ");
137 CreateTag(f,fESDFileName,counter);
143 }//child directory's entry loop
144 }//parent directory's entry loop
149 //______________________________________________________________________________
150 Bool_t AliTagCreator::ReadCAFCollection(const char *filename) {
151 // Temporary solution for CAF: Takes as an input the ascii file that
152 // lists the ESDs stored in the SE of the CAF and creates the tags.
154 // Open the input stream
160 // Read the input list of files and add them to the chain
163 if (!esdfile.Contains("root")) continue; // protection
164 TFile *f = TFile::Open(esdfile,"READ");
165 CreateTag(f,esdfile,counter);
176 //__________________________________________________________________________
177 Bool_t AliTagCreator::MergeTags() {
178 //Merges the tags and stores the merged tag file
179 //locally if fStorage=0 or in the grid if fStorage=1
180 AliInfo(Form("Merging tags....."));
181 TChain *fgChain = new TChain("T");
184 const char * tagPattern = "tag";
185 // Open the working directory
186 void * dirp = gSystem->OpenDirectory(gSystem->pwd());
187 const char * name = 0x0;
188 // Add all files matching *pattern* to the chain
189 while((name = gSystem->GetDirEntry(dirp))) {
190 if (strstr(name,tagPattern)) fgChain->Add(name);
192 AliInfo(Form("Chained tag files: %d",fgChain->GetEntries()));
195 else if(fStorage == 1) {
196 TString alienLocation = gGrid->Pwd();
197 alienLocation += fgridpath.Data();
198 alienLocation += "/";
200 TGridResult *tagresult = gGrid->Query(alienLocation,"*tag.root","","");
201 Int_t nEntries = tagresult->GetEntries();
202 for(Int_t i = 0; i < nEntries; i++) {
203 TString alienUrl = tagresult->GetKey(i,"turl");
204 fgChain->Add(alienUrl);
206 AliInfo(Form("Chained tag files: %d",fgChain->GetEntries()));
209 AliRunTag *tag = new AliRunTag;
210 fgChain->SetBranchAddress("AliTAG",&tag);
211 fgChain->GetEntry(0);
212 TString localFileName = "Run"; localFileName += tag->GetRunId();
213 localFileName += ".Merged"; localFileName += ".ESD.tag.root";
215 TString filename = 0x0;
218 filename = localFileName.Data();
219 AliInfo(Form("Writing merged tags to local file: %s",filename.Data()));
221 else if(fStorage == 1) {
222 TString alienFileName = "/alien";
223 alienFileName += gGrid->Pwd();
224 alienFileName += fgridpath.Data();
225 alienFileName += "/";
226 alienFileName += localFileName;
227 alienFileName += "?se=";
228 alienFileName += fSE.Data();
229 filename = alienFileName.Data();
230 AliInfo(Form("Writing merged tags to grid file: %s",filename.Data()));
233 fgChain->Merge(filename);
238 //__________________________________________________________________________
239 Bool_t AliTagCreator::MergeTags(TGridResult *result) {
240 //Merges the tags that are listed in the TGridResult
241 AliInfo(Form("Merging tags....."));
242 TChain *fgChain = new TChain("T");
244 Int_t nEntries = result->GetEntries();
247 for(Int_t i = 0; i < nEntries; i++) {
248 alienUrl = result->GetKey(i,"turl");
249 fgChain->Add(alienUrl);
251 AliInfo(Form("Chained tag files: %d",fgChain->GetEntries()));
252 AliRunTag *tag = new AliRunTag;
253 fgChain->SetBranchAddress("AliTAG",&tag);
254 fgChain->GetEntry(0);
256 TString localFileName = "Run"; localFileName += tag->GetRunId();
257 localFileName += ".Merged"; localFileName += ".ESD.tag.root";
259 TString filename = 0x0;
262 filename = localFileName.Data();
263 AliInfo(Form("Writing merged tags to local file: %s",filename.Data()));
265 else if(fStorage == 1) {
266 TString alienFileName = "/alien";
267 alienFileName += gGrid->Pwd();
268 alienFileName += fgridpath.Data();
269 alienFileName += "/";
270 alienFileName += localFileName;
271 alienFileName += "?se=";
272 alienFileName += fSE.Data();
273 filename = alienFileName.Data();
274 AliInfo(Form("Writing merged tags to grid file: %s",filename.Data()));
277 fgChain->Merge(filename);
282 //_____________________________________________________________________________
283 void AliTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, const char *turl, Long64_t size, Int_t Counter) {
284 //private method that creates tag files
285 TString fguid = guid;
287 TString fturl = turl;
291 Double_t fMUONMASS = 0.105658369;
294 Double_t fThetaX, fThetaY, fPyz, fChisquare;
295 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
297 TLorentzVector fEPvector;
299 Float_t fZVertexCut = 10.0;
300 Float_t fRhoVertexCut = 2.0;
302 Float_t fLowPtCut = 1.0;
303 Float_t fHighPtCut = 3.0;
304 Float_t fVeryHighPtCut = 10.0;
307 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
309 // Creates the tags for all the events in a given ESD file
310 Bool_t fIsSim = kTRUE;
312 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
313 Int_t nPos, nNeg, nNeutr;
314 Int_t nK0s, nNeutrons, nPi0s, nGamas;
315 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
316 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
317 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
318 Float_t maxPt = .0, meanPt = .0, totalP = .0;
320 Int_t iRunNumber = 0;
323 AliRunTag *tag = new AliRunTag();
324 AliEventTag *evTag = new AliEventTag();
325 TTree ttag("T","A Tree with event tags");
326 TBranch * btag = ttag.Branch("AliTAG", &tag);
327 btag->SetCompressionLevel(9);
329 AliInfo(Form("Creating the tags......."));
331 Int_t firstEvent = 0,lastEvent = 0;
332 TTree *t = (TTree*) file->Get("esdTree");
333 AliESDEvent *esd = new AliESDEvent();
334 esd->ReadFromTree(t);
337 Int_t iInitRunNumber = esd->GetRunNumber();
339 Int_t iNumberOfEvents = (Int_t)t->GetEntries();
340 for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
368 t->GetEntry(iEventNumber);
369 iRunNumber = esd->GetRunNumber();
370 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
371 const AliESDVertex * vertexIn = esd->GetVertex();
372 fVertexName = vertexIn->GetName();
373 if(fVertexName == "default") fVertexflag = 0;
375 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
376 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
377 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
378 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
379 UInt_t status = esdTrack->GetStatus();
381 //select only tracks with ITS refit
382 if ((status&AliESDtrack::kITSrefit)==0) continue;
383 //select only tracks with TPC refit
384 if ((status&AliESDtrack::kTPCrefit)==0) continue;
386 //select only tracks with the "combined PID"
387 if ((status&AliESDtrack::kESDpid)==0) continue;
389 esdTrack->GetPxPyPz(p);
390 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
391 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
394 if(fPt > maxPt) maxPt = fPt;
396 if(esdTrack->GetSign() > 0) {
398 if(fPt > fLowPtCut) nCh1GeV++;
399 if(fPt > fHighPtCut) nCh3GeV++;
400 if(fPt > fVeryHighPtCut) nCh10GeV++;
402 if(esdTrack->GetSign() < 0) {
404 if(fPt > fLowPtCut) nCh1GeV++;
405 if(fPt > fHighPtCut) nCh3GeV++;
406 if(fPt > fVeryHighPtCut) nCh10GeV++;
408 if(esdTrack->GetSign() == 0) nNeutr++;
412 esdTrack->GetESDpid(prob);
415 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
416 if(rcc == 0.0) continue;
419 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
422 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
424 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
426 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
428 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
430 if(fPt > fLowPtCut) nEl1GeV++;
431 if(fPt > fHighPtCut) nEl3GeV++;
432 if(fPt > fVeryHighPtCut) nEl10GeV++;
440 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
441 // loop over all reconstructed tracks (also first track of combination)
442 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
443 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
444 if (muonTrack == 0x0) continue;
446 // Coordinates at vertex
447 fZ = muonTrack->GetZ();
448 fY = muonTrack->GetBendingCoor();
449 fX = muonTrack->GetNonBendingCoor();
451 fThetaX = muonTrack->GetThetaX();
452 fThetaY = muonTrack->GetThetaY();
454 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
455 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
456 fPxRec = fPzRec * TMath::Tan(fThetaX);
457 fPyRec = fPzRec * TMath::Tan(fThetaY);
458 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
460 //ChiSquare of the track if needed
461 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
462 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
463 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
465 // total number of muons inside a vertex cut
466 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
468 if(fEPvector.Pt() > fLowPtCut) {
470 if(fEPvector.Pt() > fHighPtCut) {
472 if (fEPvector.Pt() > fVeryHighPtCut) {
480 // Fill the event tags
481 if(ntrack != 0) meanPt = meanPt/ntrack;
483 evTag->SetEventId(iEventNumber+1);
484 evTag->SetGUID(fguid);
486 evTag->SetTURL(fturl);
487 evTag->SetSize(size);
488 evTag->SetVertexX(vertexIn->GetXv());
489 evTag->SetVertexY(vertexIn->GetYv());
490 evTag->SetVertexZ(vertexIn->GetZv());
491 evTag->SetVertexZError(vertexIn->GetZRes());
492 evTag->SetVertexFlag(fVertexflag);
494 evTag->SetT0VertexZ(esd->GetT0zVertex());
496 evTag->SetTriggerMask(esd->GetTriggerMask());
497 evTag->SetTriggerCluster(esd->GetTriggerCluster());
499 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
500 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
501 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy());
502 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
503 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
504 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
507 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
508 evTag->SetNumOfPosTracks(nPos);
509 evTag->SetNumOfNegTracks(nNeg);
510 evTag->SetNumOfNeutrTracks(nNeutr);
512 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
513 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
514 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
515 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
517 evTag->SetNumOfProtons(nProtons);
518 evTag->SetNumOfKaons(nKaons);
519 evTag->SetNumOfPions(nPions);
520 evTag->SetNumOfMuons(nMuons);
521 evTag->SetNumOfElectrons(nElectrons);
522 evTag->SetNumOfPhotons(nGamas);
523 evTag->SetNumOfPi0s(nPi0s);
524 evTag->SetNumOfNeutrons(nNeutrons);
525 evTag->SetNumOfKaon0s(nK0s);
527 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
528 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
529 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
530 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
531 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
532 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
533 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
534 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
535 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
537 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
538 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
540 evTag->SetTotalMomentum(totalP);
541 evTag->SetMeanPt(meanPt);
542 evTag->SetMaxPt(maxPt);
544 tag->SetRunId(iInitRunNumber);
545 if(fIsSim) tag->SetDataType(0);
546 else tag->SetDataType(1);
547 tag->AddEventTag(*evTag);
549 lastEvent = iNumberOfEvents;
556 TString localFileName = "Run"; localFileName += tag->GetRunId();
557 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter;
558 localFileName += ".ESD.tag.root";
563 fileName = localFileName.Data();
564 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
566 else if(fStorage == 1) {
567 TString alienLocation = "/alien";
568 alienLocation += gGrid->Pwd();
569 alienLocation += fgridpath.Data();
570 alienLocation += "/";
571 alienLocation += localFileName;
572 alienLocation += "?se=";
573 alienLocation += fSE.Data();
574 fileName = alienLocation.Data();
575 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
578 TFile* ftag = TFile::Open(fileName, "recreate");
589 //_____________________________________________________________________________
590 void AliTagCreator::CreateTag(TFile* file, const char *filepath, Int_t Counter) {
591 //private method that creates tag files
595 Double_t fMUONMASS = 0.105658369;
598 Double_t fThetaX, fThetaY, fPyz, fChisquare;
599 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
601 TLorentzVector fEPvector;
603 Float_t fZVertexCut = 10.0;
604 Float_t fRhoVertexCut = 2.0;
606 Float_t fLowPtCut = 1.0;
607 Float_t fHighPtCut = 3.0;
608 Float_t fVeryHighPtCut = 10.0;
611 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
613 // Creates the tags for all the events in a given ESD file
614 Bool_t fIsSim = kTRUE;
616 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
617 Int_t nPos, nNeg, nNeutr;
618 Int_t nK0s, nNeutrons, nPi0s, nGamas;
619 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
620 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
621 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
622 Float_t maxPt = .0, meanPt = .0, totalP = .0;
624 Int_t iRunNumber = 0;
627 AliRunTag *tag = new AliRunTag();
628 AliEventTag *evTag = new AliEventTag();
629 TTree ttag("T","A Tree with event tags");
630 TBranch * btag = ttag.Branch("AliTAG", &tag);
631 btag->SetCompressionLevel(9);
633 AliInfo(Form("Creating the tags......."));
635 Int_t firstEvent = 0,lastEvent = 0;
637 TTree *t = (TTree*) file->Get("esdTree");
638 AliESDEvent *esd = new AliESDEvent();
639 esd->ReadFromTree(t);
642 Int_t iInitRunNumber = esd->GetRunNumber();
644 Int_t iNumberOfEvents = (Int_t)t->GetEntries();
645 for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
673 t->GetEntry(iEventNumber);
674 iRunNumber = esd->GetRunNumber();
675 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
676 const AliESDVertex * vertexIn = esd->GetVertex();
677 fVertexName = vertexIn->GetName();
678 if(fVertexName == "default") fVertexflag = 0;
680 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
681 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
682 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
683 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
684 UInt_t status = esdTrack->GetStatus();
686 //select only tracks with ITS refit
687 if ((status&AliESDtrack::kITSrefit)==0) continue;
688 //select only tracks with TPC refit
689 if ((status&AliESDtrack::kTPCrefit)==0) continue;
691 //select only tracks with the "combined PID"
692 if ((status&AliESDtrack::kESDpid)==0) continue;
694 esdTrack->GetPxPyPz(p);
695 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
696 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
699 if(fPt > maxPt) maxPt = fPt;
701 if(esdTrack->GetSign() > 0) {
703 if(fPt > fLowPtCut) nCh1GeV++;
704 if(fPt > fHighPtCut) nCh3GeV++;
705 if(fPt > fVeryHighPtCut) nCh10GeV++;
707 if(esdTrack->GetSign() < 0) {
709 if(fPt > fLowPtCut) nCh1GeV++;
710 if(fPt > fHighPtCut) nCh3GeV++;
711 if(fPt > fVeryHighPtCut) nCh10GeV++;
713 if(esdTrack->GetSign() == 0) nNeutr++;
717 esdTrack->GetESDpid(prob);
720 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
721 if(rcc == 0.0) continue;
724 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
727 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
729 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
731 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
733 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
735 if(fPt > fLowPtCut) nEl1GeV++;
736 if(fPt > fHighPtCut) nEl3GeV++;
737 if(fPt > fVeryHighPtCut) nEl10GeV++;
745 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
746 // loop over all reconstructed tracks (also first track of combination)
747 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
748 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
749 if (muonTrack == 0x0) continue;
751 // Coordinates at vertex
752 fZ = muonTrack->GetZ();
753 fY = muonTrack->GetBendingCoor();
754 fX = muonTrack->GetNonBendingCoor();
756 fThetaX = muonTrack->GetThetaX();
757 fThetaY = muonTrack->GetThetaY();
759 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
760 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
761 fPxRec = fPzRec * TMath::Tan(fThetaX);
762 fPyRec = fPzRec * TMath::Tan(fThetaY);
763 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
765 //ChiSquare of the track if needed
766 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
767 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
768 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
770 // total number of muons inside a vertex cut
771 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
773 if(fEPvector.Pt() > fLowPtCut) {
775 if(fEPvector.Pt() > fHighPtCut) {
777 if (fEPvector.Pt() > fVeryHighPtCut) {
785 // Fill the event tags
786 if(ntrack != 0) meanPt = meanPt/ntrack;
788 evTag->SetEventId(iEventNumber+1);
789 evTag->SetPath(filepath);
791 evTag->SetVertexX(vertexIn->GetXv());
792 evTag->SetVertexY(vertexIn->GetYv());
793 evTag->SetVertexZ(vertexIn->GetZv());
794 evTag->SetVertexZError(vertexIn->GetZRes());
795 evTag->SetVertexFlag(fVertexflag);
797 evTag->SetT0VertexZ(esd->GetT0zVertex());
799 evTag->SetTriggerMask(esd->GetTriggerMask());
800 evTag->SetTriggerCluster(esd->GetTriggerCluster());
802 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
803 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
804 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy());
805 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
806 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
807 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
810 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
811 evTag->SetNumOfPosTracks(nPos);
812 evTag->SetNumOfNegTracks(nNeg);
813 evTag->SetNumOfNeutrTracks(nNeutr);
815 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
816 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
817 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
818 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
820 evTag->SetNumOfProtons(nProtons);
821 evTag->SetNumOfKaons(nKaons);
822 evTag->SetNumOfPions(nPions);
823 evTag->SetNumOfMuons(nMuons);
824 evTag->SetNumOfElectrons(nElectrons);
825 evTag->SetNumOfPhotons(nGamas);
826 evTag->SetNumOfPi0s(nPi0s);
827 evTag->SetNumOfNeutrons(nNeutrons);
828 evTag->SetNumOfKaon0s(nK0s);
830 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
831 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
832 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
833 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
834 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
835 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
836 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
837 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
838 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
840 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
841 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
843 evTag->SetTotalMomentum(totalP);
844 evTag->SetMeanPt(meanPt);
845 evTag->SetMaxPt(maxPt);
847 tag->SetRunId(iInitRunNumber);
848 if(fIsSim) tag->SetDataType(0);
849 else tag->SetDataType(1);
850 tag->AddEventTag(*evTag);
852 lastEvent = iNumberOfEvents;
859 TString localFileName = "Run"; localFileName += tag->GetRunId();
860 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter;
861 localFileName += ".ESD.tag.root";
866 fileName = localFileName.Data();
867 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
869 else if(fStorage == 1) {
870 TString alienLocation = "/alien";
871 alienLocation += gGrid->Pwd();
872 alienLocation += fgridpath.Data();
873 alienLocation += "/";
874 alienLocation += localFileName;
875 alienLocation += "?se=";
876 alienLocation += fSE.Data();
877 fileName = alienLocation.Data();
878 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
881 TFile* ftag = TFile::Open(fileName, "recreate");
892 //_____________________________________________________________________________
893 void AliTagCreator::CreateESDTags(Int_t fFirstEvent, Int_t fLastEvent) {
895 Float_t lhcLuminosity = 0.0;
896 TString lhcState = "test";
897 UInt_t detectorMask = 0;
902 Double_t fMUONMASS = 0.105658369;
905 Double_t fThetaX, fThetaY, fPyz, fChisquare;
906 Double_t fPxRec,fPyRec, fPzRec, fEnergy;
908 TLorentzVector fEPvector;
910 Float_t fZVertexCut = 10.0;
911 Float_t fRhoVertexCut = 2.0;
913 Float_t fLowPtCut = 1.0;
914 Float_t fHighPtCut = 3.0;
915 Float_t fVeryHighPtCut = 10.0;
918 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
920 // Creates the tags for all the events in a given ESD file
922 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
923 Int_t nPos, nNeg, nNeutr;
924 Int_t nK0s, nNeutrons, nPi0s, nGamas;
925 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
926 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
927 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
928 Float_t maxPt = .0, meanPt = .0, totalP = .0;
930 Int_t iRunNumber = 0;
931 TString fVertexName("default");
933 AliRunTag *tag = new AliRunTag();
934 AliEventTag *evTag = new AliEventTag();
935 TTree ttag("T","A Tree with event tags");
936 TBranch * btag = ttag.Branch("AliTAG", &tag);
937 btag->SetCompressionLevel(9);
939 AliInfo(Form("Creating the tags......."));
941 TFile *file = TFile::Open("AliESDs.root");
942 if (!file || !file->IsOpen()) {
943 AliError(Form("opening failed"));
948 TTree *b = (TTree*) file->Get("esdTree");
949 AliESDEvent *esd = new AliESDEvent();
950 esd->ReadFromTree(b);
952 b->GetEntry(fFirstEvent);
953 Int_t iInitRunNumber = esd->GetRunNumber();
955 Int_t iNumberOfEvents = (Int_t)b->GetEntries();
956 if(fLastEvent != -1) iNumberOfEvents = fLastEvent + 1;
957 for (Int_t iEventNumber = fFirstEvent; iEventNumber < iNumberOfEvents; iEventNumber++) {
985 b->GetEntry(iEventNumber);
986 iRunNumber = esd->GetRunNumber();
987 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
988 const AliESDVertex * vertexIn = esd->GetVertex();
989 if (!vertexIn) AliError("ESD has not defined vertex.");
990 if (vertexIn) fVertexName = vertexIn->GetName();
991 if(fVertexName != "default") fVertexflag = 1;
992 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
993 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
994 UInt_t status = esdTrack->GetStatus();
996 //select only tracks with ITS refit
997 if ((status&AliESDtrack::kITSrefit)==0) continue;
998 //select only tracks with TPC refit
999 if ((status&AliESDtrack::kTPCrefit)==0) continue;
1001 //select only tracks with the "combined PID"
1002 if ((status&AliESDtrack::kESDpid)==0) continue;
1004 esdTrack->GetPxPyPz(p);
1005 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
1006 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
1009 if(fPt > maxPt) maxPt = fPt;
1011 if(esdTrack->GetSign() > 0) {
1013 if(fPt > fLowPtCut) nCh1GeV++;
1014 if(fPt > fHighPtCut) nCh3GeV++;
1015 if(fPt > fVeryHighPtCut) nCh10GeV++;
1017 if(esdTrack->GetSign() < 0) {
1019 if(fPt > fLowPtCut) nCh1GeV++;
1020 if(fPt > fHighPtCut) nCh3GeV++;
1021 if(fPt > fVeryHighPtCut) nCh10GeV++;
1023 if(esdTrack->GetSign() == 0) nNeutr++;
1027 esdTrack->GetESDpid(prob);
1030 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
1031 if(rcc == 0.0) continue;
1034 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1037 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1039 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1041 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
1043 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1045 if(fPt > fLowPtCut) nEl1GeV++;
1046 if(fPt > fHighPtCut) nEl3GeV++;
1047 if(fPt > fVeryHighPtCut) nEl10GeV++;
1055 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1056 // loop over all reconstructed tracks (also first track of combination)
1057 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
1058 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1059 if (muonTrack == 0x0) continue;
1061 // Coordinates at vertex
1062 fZ = muonTrack->GetZ();
1063 fY = muonTrack->GetBendingCoor();
1064 fX = muonTrack->GetNonBendingCoor();
1066 fThetaX = muonTrack->GetThetaX();
1067 fThetaY = muonTrack->GetThetaY();
1069 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1070 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1071 fPxRec = fPzRec * TMath::Tan(fThetaX);
1072 fPyRec = fPzRec * TMath::Tan(fThetaY);
1073 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1075 //ChiSquare of the track if needed
1076 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1077 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1078 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1080 // total number of muons inside a vertex cut
1081 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
1083 if(fEPvector.Pt() > fLowPtCut) {
1085 if(fEPvector.Pt() > fHighPtCut) {
1087 if (fEPvector.Pt() > fVeryHighPtCut) {
1095 // Fill the event tags
1097 meanPt = meanPt/ntrack;
1099 evTag->SetEventId(iEventNumber+1);
1101 evTag->SetVertexX(vertexIn->GetXv());
1102 evTag->SetVertexY(vertexIn->GetYv());
1103 evTag->SetVertexZ(vertexIn->GetZv());
1104 evTag->SetVertexZError(vertexIn->GetZRes());
1106 evTag->SetVertexFlag(fVertexflag);
1108 evTag->SetT0VertexZ(esd->GetT0zVertex());
1110 evTag->SetTriggerMask(esd->GetTriggerMask());
1111 evTag->SetTriggerCluster(esd->GetTriggerCluster());
1113 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1114 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1115 evTag->SetZDCNeutron2Energy(esd->GetZDCN2Energy());
1116 evTag->SetZDCProton2Energy(esd->GetZDCP2Energy());
1117 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy());
1118 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1121 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1122 evTag->SetNumOfPosTracks(nPos);
1123 evTag->SetNumOfNegTracks(nNeg);
1124 evTag->SetNumOfNeutrTracks(nNeutr);
1126 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1127 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1128 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
1129 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
1131 evTag->SetNumOfProtons(nProtons);
1132 evTag->SetNumOfKaons(nKaons);
1133 evTag->SetNumOfPions(nPions);
1134 evTag->SetNumOfMuons(nMuons);
1135 evTag->SetNumOfElectrons(nElectrons);
1136 evTag->SetNumOfPhotons(nGamas);
1137 evTag->SetNumOfPi0s(nPi0s);
1138 evTag->SetNumOfNeutrons(nNeutrons);
1139 evTag->SetNumOfKaon0s(nK0s);
1141 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1142 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1143 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1144 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1145 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1146 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1147 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1148 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1149 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
1151 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
1152 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
1154 evTag->SetTotalMomentum(totalP);
1155 evTag->SetMeanPt(meanPt);
1156 evTag->SetMaxPt(maxPt);
1158 tag->SetLHCTag(lhcLuminosity,lhcState);
1159 tag->SetDetectorTag(detectorMask);
1161 tag->SetRunId(iInitRunNumber);
1162 tag->AddEventTag(*evTag);
1164 if(fLastEvent == -1) lastEvent = (Int_t)b->GetEntries();
1165 else lastEvent = fLastEvent;
1171 sprintf(fileName, "Run%d.Event%d_%d.ESD.tag.root",
1172 tag->GetRunId(),fFirstEvent,lastEvent );
1173 AliInfo(Form("writing tags to file %s", fileName));
1174 AliDebug(1, Form("writing tags to file %s", fileName));
1176 TFile* ftag = TFile::Open(fileName, "recreate");
1185 //__________________________________________________________________________
1186 void AliTagCreator::CreateAODTags(Int_t fFirstEvent, Int_t fLastEvent) {
1187 //creates tag files for AODs
1189 Float_t fLowPtCut = 1.0;
1190 Float_t fHighPtCut = 3.0;
1191 Float_t fVeryHighPtCut = 10.0;
1194 Double_t partFrac[10] = {0.01, 0.01, 0.85, 0.10, 0.05, 0., 0., 0., 0., 0.};
1196 // Creates the tags for all the events in a given ESD file
1198 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
1199 Int_t nPos, nNeg, nNeutr;
1200 Int_t nKinks, nV0s, nCascades;
1201 Int_t nK0s, nNeutrons, nPi0s, nGamas;
1202 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
1203 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
1204 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
1205 Float_t maxPt = .0, meanPt = .0, totalP = .0;
1207 AliRunTag *tag = new AliRunTag();
1208 TTree ttag("T","A Tree with event tags");
1209 TBranch * btag = ttag.Branch("AliTAG", &tag);
1210 btag->SetCompressionLevel(9);
1212 //reading the esd tag file
1213 TChain *oldTagTree = new TChain("T");
1214 const char * tagPattern = "ESD.tag";
1215 // Open the working directory
1216 void * dirp = gSystem->OpenDirectory(gSystem->pwd());
1217 const char * name = 0x0;
1218 // Add all files matching *pattern* to the chain
1219 while((name = gSystem->GetDirEntry(dirp))) {
1220 if (strstr(name,tagPattern)) oldTagTree->Add(name);
1222 AliInfo(Form("Chained tag files: %d",oldTagTree->GetEntries()));
1224 //reading the esd tag file
1225 AliRunTag *oldtag = new AliRunTag();
1226 TString tagFilename;
1227 oldTagTree->SetBranchAddress("AliTAG",&oldtag);
1228 oldTagTree->GetEntry(0);
1229 tag->CopyStandardContent(oldtag);
1230 const TClonesArray *evTagList = oldtag->GetEventTags();
1232 AliInfo(Form("Creating the tags......."));
1234 TFile *file = TFile::Open("AliAOD.root");
1235 if (!file || !file->IsOpen()) {
1236 AliError(Form("opening failed"));
1240 TTree *aodTree = (TTree*)file->Get("AOD");
1241 AliAODEvent *aod = (AliAODEvent*)aodTree->GetUserInfo()->FindObject("AliAODEvent");
1242 TIter next(aod->GetList());
1245 Int_t lastEvent = 0;
1246 if(fLastEvent == -1) lastEvent = (Int_t)aodTree->GetEntries();
1247 else lastEvent = fLastEvent;
1249 while((el=(TNamed*)next()))
1250 aodTree->SetBranchAddress(el->GetName(),aod->GetList()->GetObjectRef(el));
1253 Int_t nEvents = aodTree->GetEntries();
1254 for (Int_t iEventNumber = 0; iEventNumber < nEvents; iEventNumber++) {
1255 AliEventTag *evTag = (AliEventTag *)evTagList->At(iEventNumber);
1257 nPos = 0; nNeg = 0; nNeutr =0;
1258 nKinks = 0; nV0s = 0; nCascades = 0;
1259 nK0s = 0; nNeutrons = 0; nPi0s = 0; nGamas = 0;
1260 nProtons = 0; nKaons = 0; nPions = 0; nMuons = 0; nElectrons = 0;
1261 nCh1GeV = 0; nCh3GeV = 0; nCh10GeV = 0;
1262 nMu1GeV = 0; nMu3GeV = 0; nMu10GeV = 0;
1263 nEl1GeV = 0; nEl3GeV = 0; nEl10GeV = 0;
1264 maxPt = .0; meanPt = .0; totalP = .0;
1267 aodTree->GetEvent(iEventNumber);
1270 aod->GetStdContent();
1272 Int_t nTracks = aod->GetNTracks();
1273 // loop over vertices
1274 Int_t nVtxs = aod->GetNVertices();
1275 for (Int_t nVtx = 0; nVtx < nVtxs; nVtx++) {
1277 AliAODVertex *vertex = aod->GetVertex(nVtx);
1278 if(vertex->GetType() == 1) nKinks += 1;
1279 if(vertex->GetType() == 2) nV0s += 1;
1280 if(vertex->GetType() == 3) nCascades += 1;
1282 for (Int_t nTr = 0; nTr < nTracks; nTr++) {
1283 AliAODTrack *track = aod->GetTrack(nTr);
1285 Double_t fPt = track->Pt();
1286 if(fPt > maxPt) maxPt = fPt;
1287 if(track->Charge() > 0) {
1289 if(fPt > fLowPtCut) nCh1GeV++;
1290 if(fPt > fHighPtCut) nCh3GeV++;
1291 if(fPt > fVeryHighPtCut) nCh10GeV++;
1293 if(track->Charge() < 0) {
1295 if(fPt > fLowPtCut) nCh1GeV++;
1296 if(fPt > fHighPtCut) nCh3GeV++;
1297 if(fPt > fVeryHighPtCut) nCh10GeV++;
1299 if(track->Charge() == 0) nNeutr++;
1302 const Double32_t *prob = track->PID();
1304 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
1305 if(rcc == 0.0) continue;
1308 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1311 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1313 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1315 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
1317 if ((w[1]>w[4])&&(w[1]>w[3])&&(w[1]>w[2])&&(w[1]>w[0])) {
1319 if(fPt > fLowPtCut) nMu1GeV++;
1320 if(fPt > fHighPtCut) nMu3GeV++;
1321 if(fPt > fVeryHighPtCut) nMu10GeV++;
1324 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1326 if(fPt > fLowPtCut) nEl1GeV++;
1327 if(fPt > fHighPtCut) nEl3GeV++;
1328 if(fPt > fVeryHighPtCut) nEl10GeV++;
1331 totalP += track->P();
1335 // Fill the event tags
1337 meanPt = meanPt/ntrack;
1339 evTag->SetEventId(iEventNumber+1);
1341 evTag->SetNumOfTracks(nTracks);
1342 evTag->SetNumOfPosTracks(nPos);
1343 evTag->SetNumOfNegTracks(nNeg);
1344 evTag->SetNumOfNeutrTracks(nNeutr);
1346 evTag->SetNumOfV0s(nV0s);
1347 evTag->SetNumOfCascades(nCascades);
1348 evTag->SetNumOfKinks(nKinks);
1350 evTag->SetNumOfProtons(nProtons);
1351 evTag->SetNumOfKaons(nKaons);
1352 evTag->SetNumOfPions(nPions);
1353 evTag->SetNumOfMuons(nMuons);
1354 evTag->SetNumOfElectrons(nElectrons);
1355 evTag->SetNumOfPhotons(nGamas);
1356 evTag->SetNumOfPi0s(nPi0s);
1357 evTag->SetNumOfNeutrons(nNeutrons);
1358 evTag->SetNumOfKaon0s(nK0s);
1360 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1361 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1362 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1363 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1364 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1365 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1366 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1367 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1368 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
1370 evTag->SetTotalMomentum(totalP);
1371 evTag->SetMeanPt(meanPt);
1372 evTag->SetMaxPt(maxPt);
1373 tag->AddEventTag(*evTag);
1375 if(fLastEvent == -1) lastEvent = (Int_t)aodTree->GetEntries();
1376 else lastEvent = fLastEvent;
1382 sprintf(fileName, "Run%d.Event%d_%d.AOD.tag.root",
1383 tag->GetRunId(),fFirstEvent,lastEvent );
1384 AliInfo(Form("writing tags to file %s", fileName));
1385 AliDebug(1, Form("writing tags to file %s", fileName));
1387 TFile* ftag = TFile::Open(fileName, "recreate");