1 /**************************************************************************
2 * Author: Panos Christakoglou. *
3 * Contributors are mentioned in the code where appropriate. *
5 * Permission to use, copy, modify and distribute this software and its *
6 * documentation strictly for non-commercial purposes is hereby granted *
7 * without fee, provided that the above copyright notice appears in all *
8 * copies and that both the copyright notice and this permission notice *
9 * appear in the supporting documentation. The authors make no claims *
10 * about the suitability of this software for any purpose. It is *
11 * provided "as is" without express or implied warranty. *
12 **************************************************************************/
16 //-----------------------------------------------------------------
17 // AliESDTagCreator class
18 // This is the class to deal with the tag creation (post process)
19 // Origin: Panos Christakoglou, UOA-CERN, Panos.Christakoglou@cern.ch
20 //-----------------------------------------------------------------
23 #include <Riostream.h>
30 #include <TObjString.h>
31 #include <TLorentzVector.h>
33 #include <TTimeStamp.h>
37 #include <TGridResult.h>
40 #include "AliRunTag.h"
41 #include "AliEventTag.h"
43 #include "AliESDEvent.h"
44 #include "AliESDVertex.h"
46 #include "AliGRPObject.h"
48 #include "AliESDTagCreator.h"
51 ClassImp(AliESDTagCreator)
54 //______________________________________________________________________________
55 AliESDTagCreator::AliESDTagCreator() :
57 fChain(new TChain("esdTree")), fGUIDList(new TList()),
58 fMD5List(new TList()), fTURLList(new TList()), fBranches(""),
59 meminfo(new MemInfo_t) {
60 //==============Default constructor for a AliESDTagCreator================
63 //______________________________________________________________________________
64 AliESDTagCreator::~AliESDTagCreator() {
65 //================Default destructor for a AliESDTagCreator===================
73 //______________________________________________________________________________
74 Bool_t AliESDTagCreator::ReadGridCollection(TGridResult *fresult) {
75 // Reads the entry of the TGridResult and creates the tags
76 Int_t nEntries = fresult->GetEntries();
85 for(Int_t i = 0; i < nEntries; i++) {
86 alienUrl = fresult->GetKey(i,"turl");
87 guid = fresult->GetKey(i,"guid");
88 if(fresult->GetKey(i,"size")) size = atol (fresult->GetKey(i,"size"));
89 md5 = fresult->GetKey(i,"md5");
90 turl = fresult->GetKey(i,"turl");
91 if(md5 && !strlen(guid)) md5 = 0;
92 if(guid && !strlen(guid)) guid = 0;
94 fChain->Add(alienUrl);
95 //fGUIDList->Add(new TObjString(guid));
96 //fMD5List->Add(new TObjString(md5));
97 //fTURLList->Add(new TObjString(turl));
99 //TFile *f = TFile::Open(alienUrl,"READ");
100 //CreateTag(f,guid,md5,turl,size,counter);
106 AliInfo(Form("ESD chain created......."));
107 AliInfo(Form("Chain entries: %d",fChain->GetEntries()));
108 // Switch of branches on user request
110 CreateTag(fChain,"grid");
115 //______________________________________________________________________________
116 Bool_t AliESDTagCreator::ReadLocalCollection(const char *localpath) {
117 // Checks the different subdirs of the given local path and in the
118 // case where it finds an AliESDs.root file it creates the tags
120 void *dira = gSystem->OpenDirectory(localpath);
122 const char * dirname = 0x0;
123 const char * filename = 0x0;
124 const char * pattern = "AliESDs.root";
127 while((dirname = gSystem->GetDirEntry(dira))) {
128 sprintf(fPath,"%s/%s",localpath,dirname);
129 void *dirb = gSystem->OpenDirectory(fPath);
130 while((filename = gSystem->GetDirEntry(dirb))) {
131 if(strstr(filename,pattern)) {
132 TString fESDFileName;
133 fESDFileName = fPath;
135 fESDFileName += pattern;
137 fChain->Add(fESDFileName);
139 //TFile *f = TFile::Open(fESDFileName,"READ");
140 //CreateTag(f,fESDFileName,counter);
146 }//child directory's entry loop
147 }//parent directory's entry loop
149 AliInfo(Form("ESD chain created......."));
150 AliInfo(Form("Chain entries: %d",fChain->GetEntries()));
151 // Switch of branches on user request
153 CreateTag(fChain,"local");
158 //______________________________________________________________________________
159 Bool_t AliESDTagCreator::ReadCAFCollection(const char *filename) {
160 // Temporary solution for CAF: Takes as an input the ascii file that
161 // lists the ESDs stored in the SE of the CAF and creates the tags.
163 // Open the input stream
169 // Read the input list of files and add them to the chain
172 if (!esdfile.Contains("root")) continue; // protection
174 fChain->Add(esdfile);
176 //TFile *f = TFile::Open(esdfile,"READ");
177 //CreateTag(f,esdfile,counter);
184 AliInfo(Form("ESD chain created......."));
185 AliInfo(Form("Chain entries: %d",fChain->GetEntries()));
186 // Switch of branches on user request
188 CreateTag(fChain,"proof");
193 //_____________________________________________________________________________
194 void AliESDTagCreator::CreateTag(TChain* chain, const char *type) {
195 //private method that creates tag files
196 TString fSession = type;
197 TString fguid, fmd5, fturl;
198 TString fTempGuid = 0;
203 Double_t fMUONMASS = 0.105658369;
206 Double_t fThetaX, fThetaY, fPyz, fChisquare;
207 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
209 TLorentzVector fEPvector;
211 Float_t fZVertexCut = 10.0;
212 Float_t fRhoVertexCut = 2.0;
214 Float_t fLowPtCut = 1.0;
215 Float_t fHighPtCut = 3.0;
216 Float_t fVeryHighPtCut = 10.0;
219 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
221 // Creates the tags for all the events in a given ESD file
222 Bool_t fIsSim = kTRUE;
224 Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons;
225 Int_t nPos, nNeg, nNeutr;
226 Int_t nK0s, nNeutrons, nPi0s, nGamas;
227 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
228 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
229 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
230 Float_t maxPt = .0, meanPt = .0, totalP = .0;
232 Int_t iRunNumber = 0;
235 //gSystem->GetMemInfo(meminfo);
236 //AliInfo(Form("After the tag initialization - Memory used: %d MB",meminfo->fMemUsed));
237 //Int_t tempmem = meminfo->fMemUsed;
239 AliInfo(Form("Creating the ESD tags......."));
241 Int_t firstEvent = 0,lastEvent = 0;
242 AliESDEvent *esd = new AliESDEvent();
243 esd->ReadFromTree(chain);
244 AliESD *esdold = 0x0;
246 //gSystem->GetMemInfo(meminfo);
247 //AliInfo(Form("After the esd initialization - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
248 //tempmem = meminfo->fMemUsed;
250 Int_t iInitRunNumber = -1;
252 TFile *f = chain->GetFile();
253 fTempGuid = f->GetUUID().AsString();
255 TString localFileName = "Run"; localFileName += esd->GetRunNumber();
256 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += chain->GetEntries(); //localFileName += "."; localFileName += Counter;
257 localFileName += ".ESD.tag.root";
262 fileName = localFileName.Data();
263 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
265 else if(fStorage == 1) {
266 TString alienLocation = "/alien";
267 alienLocation += gGrid->Pwd();
268 alienLocation += fgridpath.Data();
269 alienLocation += "/";
270 alienLocation += localFileName;
271 alienLocation += "?se=";
272 alienLocation += fSE.Data();
273 fileName = alienLocation.Data();
274 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
277 TFile* ftag = TFile::Open(fileName, "recreate");
279 AliRunTag *tag = new AliRunTag();
280 AliEventTag *evTag = new AliEventTag();
281 TTree ttag("T","A Tree with event tags");
282 TBranch * btag = ttag.Branch("AliTAG", &tag);
283 btag->SetCompressionLevel(9);
285 for(Int_t iEventNumber = 0; iEventNumber < chain->GetEntries(); iEventNumber++) {
286 ntrack = 0; nPos = 0; nNeg = 0; nNeutr =0;
287 nK0s = 0; nNeutrons = 0; nPi0s = 0;
288 nGamas = 0; nProtons = 0; nKaons = 0;
289 nPions = 0; nMuons = 0; nElectrons = 0; nFWMuons = 0;
290 nCh1GeV = 0; nCh3GeV = 0; nCh10GeV = 0;
291 nMu1GeV = 0; nMu3GeV = 0; nMu10GeV = 0;
292 nEl1GeV = 0; nEl3GeV = 0; nEl10GeV = 0;
293 maxPt = .0; meanPt = .0; totalP = .0;
296 chain->GetEntry(iEventNumber);
297 esdold = esd->GetAliESDOld();
298 if(esdold) esd->CopyFromOldESD();
300 TFile *file = chain->GetFile();
301 const TUrl *url = file->GetEndpointUrl();
302 fguid = file->GetUUID().AsString();
303 if(fSession == "grid") {
304 TString fturltemp = "alien://"; fturltemp += url->GetFile();
305 fturl = fturltemp(0,fturltemp.Index(".root",5,0,TString::kExact)+5);
307 else fturl = url->GetFile();
309 if(iEventNumber == 0) iInitRunNumber = esd->GetRunNumber();
310 iRunNumber = esd->GetRunNumber();
311 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD - You are trying to merge different runs!!!");
313 const AliESDVertex * vertexIn = esd->GetVertex();
314 fVertexName = vertexIn->GetName();
315 if(fVertexName == "default") fVertexflag = 0;
317 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
318 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
319 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
320 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
321 UInt_t status = esdTrack->GetStatus();
323 //select only tracks with ITS refit
324 if ((status&AliESDtrack::kITSrefit)==0) continue;
325 //select only tracks with TPC refit
326 if ((status&AliESDtrack::kTPCrefit)==0) continue;
328 //select only tracks with the "combined PID"
329 if ((status&AliESDtrack::kESDpid)==0) continue;
331 esdTrack->GetPxPyPz(p);
332 Double_t pt2 = p[0]*p[0]+p[1]*p[1];
333 Double_t momentum = TMath::Sqrt(pt2+p[2]*p[2]);
334 Double_t fPt = TMath::Sqrt(pt2);
337 if(fPt > maxPt) maxPt = fPt;
339 if(esdTrack->GetSign() > 0) {
341 if(fPt > fLowPtCut) nCh1GeV++;
342 if(fPt > fHighPtCut) nCh3GeV++;
343 if(fPt > fVeryHighPtCut) nCh10GeV++;
345 if(esdTrack->GetSign() < 0) {
347 if(fPt > fLowPtCut) nCh1GeV++;
348 if(fPt > fHighPtCut) nCh3GeV++;
349 if(fPt > fVeryHighPtCut) nCh10GeV++;
351 if(esdTrack->GetSign() == 0) nNeutr++;
355 esdTrack->GetESDpid(prob);
358 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
359 if(rcc == 0.0) continue;
362 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
365 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
367 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
369 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
371 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
373 if(fPt > fLowPtCut) nEl1GeV++;
374 if(fPt > fHighPtCut) nEl3GeV++;
375 if(fPt > fVeryHighPtCut) nEl10GeV++;
383 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
384 // loop over all reconstructed tracks (also first track of combination)
385 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
386 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
387 if (muonTrack == 0x0) continue;
389 // Coordinates at vertex
390 fZ = muonTrack->GetZ();
391 fY = muonTrack->GetBendingCoor();
392 fX = muonTrack->GetNonBendingCoor();
394 fThetaX = muonTrack->GetThetaX();
395 fThetaY = muonTrack->GetThetaY();
397 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
398 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
399 fPxRec = fPzRec * TMath::Tan(fThetaX);
400 fPyRec = fPzRec * TMath::Tan(fThetaY);
401 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
403 //ChiSquare of the track if needed
404 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
405 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
406 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
408 // total number of muons inside a vertex cut
409 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
412 if(fEPvector.Pt() > fLowPtCut) {
414 if(fEPvector.Pt() > fHighPtCut) {
416 if (fEPvector.Pt() > fVeryHighPtCut) {
424 // Fill the event tags
425 if(ntrack != 0) meanPt = meanPt/ntrack;
427 //AliInfo(Form("====================================="));
428 //AliInfo(Form("URL: %s - GUID: %s",fturl.Data(),fguid.Data()));
429 //AliInfo(Form("====================================="));
432 const AliMultiplicity *spdMult = esd->GetMultiplicity();
433 evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0));
434 evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1));
435 evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets());
437 AliESDVZERO *vzeroData = esd->GetVZEROData();
438 evTag->SetMTotV0A(vzeroData->GetMTotV0A());
439 evTag->SetMTotV0C(vzeroData->GetMTotV0C());
440 evTag->SetNbPMV0A(vzeroData->GetNbPMV0A());
441 evTag->SetNbPMV0C(vzeroData->GetNbPMV0C());
443 //evTag->SetEventId(iEventNumber+1);
444 evTag->SetPeriodNumber(esd->GetPeriodNumber());
445 evTag->SetOrbitNumber(esd->GetOrbitNumber());
446 evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber());
447 evTag->SetGUID(fguid);
448 if(fSession == "grid") {
450 evTag->SetTURL(fturl);
453 else evTag->SetPath(fturl);
455 evTag->SetVertexX(vertexIn->GetXv());
456 evTag->SetVertexY(vertexIn->GetYv());
457 evTag->SetVertexZ(vertexIn->GetZv());
458 evTag->SetVertexZError(vertexIn->GetZRes());
459 evTag->SetVertexFlag(fVertexflag);
461 evTag->SetT0VertexZ(esd->GetT0zVertex());
463 evTag->SetTriggerMask(esd->GetTriggerMask());
464 evTag->SetTriggerCluster(esd->GetTriggerCluster());
466 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
467 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
468 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
469 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
470 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
471 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
472 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
473 evTag->SetNumOfParticipants2(esd->GetZDCParticipants2());
476 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
477 evTag->SetNumOfPosTracks(nPos);
478 evTag->SetNumOfNegTracks(nNeg);
479 evTag->SetNumOfNeutrTracks(nNeutr);
481 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
482 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
483 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
484 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
486 evTag->SetNumOfProtons(nProtons);
487 evTag->SetNumOfKaons(nKaons);
488 evTag->SetNumOfPions(nPions);
489 evTag->SetNumOfMuons(nMuons);
490 evTag->SetNumOfFWMuons(nFWMuons);
491 evTag->SetNumOfElectrons(nElectrons);
492 evTag->SetNumOfPhotons(nGamas);
493 evTag->SetNumOfPi0s(nPi0s);
494 evTag->SetNumOfNeutrons(nNeutrons);
495 evTag->SetNumOfKaon0s(nK0s);
497 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
498 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
499 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
500 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
501 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
502 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
503 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
504 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
505 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
507 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
508 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
510 evTag->SetTotalMomentum(totalP);
511 evTag->SetMeanPt(meanPt);
512 evTag->SetMaxPt(maxPt);
514 tag->SetRunId(iInitRunNumber);
515 if(fIsSim) tag->SetDataType(0);
516 else tag->SetDataType(1);
518 if(fguid != fTempGuid) {
523 tag->AddEventTag(*evTag);
524 if(iEventNumber+1 == chain->GetEntries()) {
525 //AliInfo(Form("File: %s",fturl.Data()));
530 lastEvent = chain->GetEntries();
532 //gSystem->GetMemInfo(meminfo);
533 //AliInfo(Form("After the event and track loop - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
534 //tempmem = meminfo->fMemUsed;
538 //gSystem->GetMemInfo(meminfo);
539 //AliInfo(Form("After the t->Delete - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
540 //tempmem = meminfo->fMemUsed;
547 //gSystem->GetMemInfo(meminfo);
548 //AliInfo(Form("After the file closing - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
549 //tempmem = meminfo->fMemUsed;
554 //gSystem->GetMemInfo(meminfo);
555 //AliInfo(Form("After the delete objects - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
558 //_____________________________________________________________________________
559 void AliESDTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, const char *turl, Long64_t size, Int_t Counter) {
560 //private method that creates tag files
561 TString fguid = guid;
563 TString fturl = turl;
567 Double_t fMUONMASS = 0.105658369;
570 Double_t fThetaX, fThetaY, fPyz, fChisquare;
571 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
573 TLorentzVector fEPvector;
575 Float_t fZVertexCut = 10.0;
576 Float_t fRhoVertexCut = 2.0;
578 Float_t fLowPtCut = 1.0;
579 Float_t fHighPtCut = 3.0;
580 Float_t fVeryHighPtCut = 10.0;
583 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
585 // Creates the tags for all the events in a given ESD file
586 Bool_t fIsSim = kTRUE;
588 Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons;
589 Int_t nPos, nNeg, nNeutr;
590 Int_t nK0s, nNeutrons, nPi0s, nGamas;
591 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
592 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
593 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
594 Float_t maxPt = .0, meanPt = .0, totalP = .0;
596 Int_t iRunNumber = 0;
599 AliRunTag *tag = new AliRunTag();
600 AliEventTag *evTag = new AliEventTag();
601 TTree ttag("T","A Tree with event tags");
602 TBranch * btag = ttag.Branch("AliTAG", &tag);
603 btag->SetCompressionLevel(9);
604 gSystem->GetMemInfo(meminfo);
605 AliInfo(Form("After the tag initialization - Memory used: %d MB",meminfo->fMemUsed));
606 Int_t tempmem = meminfo->fMemUsed;
608 AliInfo(Form("Creating the ESD tags......."));
610 Int_t firstEvent = 0,lastEvent = 0;
611 TTree *t = (TTree*) file->Get("esdTree");
612 AliESDEvent *esd = new AliESDEvent();
613 esd->ReadFromTree(t);
615 gSystem->GetMemInfo(meminfo);
616 AliInfo(Form("After the esd initialization - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
617 tempmem = meminfo->fMemUsed;
620 Int_t iInitRunNumber = esd->GetRunNumber();
622 Int_t iNumberOfEvents = (Int_t)t->GetEntries();
623 for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
652 t->GetEntry(iEventNumber);
653 iRunNumber = esd->GetRunNumber();
654 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
655 const AliESDVertex * vertexIn = esd->GetVertex();
656 fVertexName = vertexIn->GetName();
657 if(fVertexName == "default") fVertexflag = 0;
659 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
660 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
661 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
662 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
663 UInt_t status = esdTrack->GetStatus();
665 //select only tracks with ITS refit
666 if ((status&AliESDtrack::kITSrefit)==0) continue;
667 //select only tracks with TPC refit
668 if ((status&AliESDtrack::kTPCrefit)==0) continue;
670 //select only tracks with the "combined PID"
671 if ((status&AliESDtrack::kESDpid)==0) continue;
673 esdTrack->GetPxPyPz(p);
674 Double_t pt2 = p[0]*p[0]+p[1]*p[1];
675 Double_t momentum = TMath::Sqrt(pt2+p[2]*p[2]);
676 Double_t fPt = TMath::Sqrt(pt2);
679 if(fPt > maxPt) maxPt = fPt;
681 if(esdTrack->GetSign() > 0) {
683 if(fPt > fLowPtCut) nCh1GeV++;
684 if(fPt > fHighPtCut) nCh3GeV++;
685 if(fPt > fVeryHighPtCut) nCh10GeV++;
687 if(esdTrack->GetSign() < 0) {
689 if(fPt > fLowPtCut) nCh1GeV++;
690 if(fPt > fHighPtCut) nCh3GeV++;
691 if(fPt > fVeryHighPtCut) nCh10GeV++;
693 if(esdTrack->GetSign() == 0) nNeutr++;
697 esdTrack->GetESDpid(prob);
700 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
701 if(rcc == 0.0) continue;
704 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
707 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
709 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
711 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
713 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
715 if(fPt > fLowPtCut) nEl1GeV++;
716 if(fPt > fHighPtCut) nEl3GeV++;
717 if(fPt > fVeryHighPtCut) nEl10GeV++;
725 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
726 // loop over all reconstructed tracks (also first track of combination)
727 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
728 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
729 if (muonTrack == 0x0) continue;
731 // Coordinates at vertex
732 fZ = muonTrack->GetZ();
733 fY = muonTrack->GetBendingCoor();
734 fX = muonTrack->GetNonBendingCoor();
736 fThetaX = muonTrack->GetThetaX();
737 fThetaY = muonTrack->GetThetaY();
739 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
740 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
741 fPxRec = fPzRec * TMath::Tan(fThetaX);
742 fPyRec = fPzRec * TMath::Tan(fThetaY);
743 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
745 //ChiSquare of the track if needed
746 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
747 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
748 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
750 // total number of muons inside a vertex cut
751 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
754 if(fEPvector.Pt() > fLowPtCut) {
756 if(fEPvector.Pt() > fHighPtCut) {
758 if (fEPvector.Pt() > fVeryHighPtCut) {
766 // Fill the event tags
767 if(ntrack != 0) meanPt = meanPt/ntrack;
770 const AliMultiplicity *spdMult = esd->GetMultiplicity();
771 evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0));
772 evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1));
773 evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets());
775 AliESDVZERO *vzeroData = esd->GetVZEROData();
776 evTag->SetMTotV0A(vzeroData->GetMTotV0A());
777 evTag->SetMTotV0C(vzeroData->GetMTotV0C());
778 evTag->SetNbPMV0A(vzeroData->GetNbPMV0A());
779 evTag->SetNbPMV0C(vzeroData->GetNbPMV0C());
781 //evTag->SetEventId(iEventNumber+1);
782 evTag->SetPeriodNumber(esd->GetPeriodNumber());
783 evTag->SetOrbitNumber(esd->GetOrbitNumber());
784 evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber());
786 evTag->SetGUID(fguid);
788 evTag->SetTURL(fturl);
789 evTag->SetSize(size);
790 evTag->SetVertexX(vertexIn->GetXv());
791 evTag->SetVertexY(vertexIn->GetYv());
792 evTag->SetVertexZ(vertexIn->GetZv());
793 evTag->SetVertexZError(vertexIn->GetZRes());
794 evTag->SetVertexFlag(fVertexflag);
796 evTag->SetT0VertexZ(esd->GetT0zVertex());
798 evTag->SetTriggerMask(esd->GetTriggerMask());
799 evTag->SetTriggerCluster(esd->GetTriggerCluster());
801 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
802 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
803 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
804 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
805 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
806 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
809 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
810 evTag->SetNumOfPosTracks(nPos);
811 evTag->SetNumOfNegTracks(nNeg);
812 evTag->SetNumOfNeutrTracks(nNeutr);
814 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
815 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
816 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
817 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
819 evTag->SetNumOfProtons(nProtons);
820 evTag->SetNumOfKaons(nKaons);
821 evTag->SetNumOfPions(nPions);
822 evTag->SetNumOfMuons(nMuons);
823 evTag->SetNumOfFWMuons(nFWMuons);
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;
854 gSystem->GetMemInfo(meminfo);
855 AliInfo(Form("After the event and track loop - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
856 tempmem = meminfo->fMemUsed;
859 gSystem->GetMemInfo(meminfo);
860 AliInfo(Form("After the t->Delete - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
861 tempmem = meminfo->fMemUsed;
863 TString localFileName = "Run"; localFileName += tag->GetRunId();
864 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter;
865 localFileName += ".ESD.tag.root";
870 fileName = localFileName.Data();
871 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
873 else if(fStorage == 1) {
874 TString alienLocation = "/alien";
875 alienLocation += gGrid->Pwd();
876 alienLocation += fgridpath.Data();
877 alienLocation += "/";
878 alienLocation += localFileName;
879 alienLocation += "?se=";
880 alienLocation += fSE.Data();
881 fileName = alienLocation.Data();
882 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
885 TFile* ftag = TFile::Open(fileName, "recreate");
892 gSystem->GetMemInfo(meminfo);
893 AliInfo(Form("After the file closing - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
894 tempmem = meminfo->fMemUsed;
900 gSystem->GetMemInfo(meminfo);
901 AliInfo(Form("After the delete objects - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
904 //_____________________________________________________________________________
905 void AliESDTagCreator::CreateTag(TFile* file, const char *filepath, Int_t Counter) {
906 //private method that creates tag files
910 Double_t fMUONMASS = 0.105658369;
913 Double_t fThetaX, fThetaY, fPyz, fChisquare;
914 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
916 TLorentzVector fEPvector;
918 Float_t fZVertexCut = 10.0;
919 Float_t fRhoVertexCut = 2.0;
921 Float_t fLowPtCut = 1.0;
922 Float_t fHighPtCut = 3.0;
923 Float_t fVeryHighPtCut = 10.0;
926 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
928 // Creates the tags for all the events in a given ESD file
929 Bool_t fIsSim = kTRUE;
931 Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons;
932 Int_t nPos, nNeg, nNeutr;
933 Int_t nK0s, nNeutrons, nPi0s, nGamas;
934 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
935 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
936 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
937 Float_t maxPt = .0, meanPt = .0, totalP = .0;
939 Int_t iRunNumber = 0;
942 AliRunTag *tag = new AliRunTag();
943 AliEventTag *evTag = new AliEventTag();
944 TTree ttag("T","A Tree with event tags");
945 TBranch * btag = ttag.Branch("AliTAG", &tag);
946 btag->SetCompressionLevel(9);
948 AliInfo(Form("Creating the ESD tags......."));
950 Int_t firstEvent = 0,lastEvent = 0;
952 TTree *t = (TTree*) file->Get("esdTree");
953 AliESDEvent *esd = new AliESDEvent();
954 esd->ReadFromTree(t);
957 Int_t iInitRunNumber = esd->GetRunNumber();
959 Int_t iNumberOfEvents = (Int_t)t->GetEntries();
960 for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
989 t->GetEntry(iEventNumber);
990 iRunNumber = esd->GetRunNumber();
991 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
992 const AliESDVertex * vertexIn = esd->GetVertex();
993 fVertexName = vertexIn->GetName();
994 if(fVertexName == "default") fVertexflag = 0;
996 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
997 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
998 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
999 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
1000 UInt_t status = esdTrack->GetStatus();
1002 //select only tracks with ITS refit
1003 if ((status&AliESDtrack::kITSrefit)==0) continue;
1004 //select only tracks with TPC refit
1005 if ((status&AliESDtrack::kTPCrefit)==0) continue;
1007 //select only tracks with the "combined PID"
1008 if ((status&AliESDtrack::kESDpid)==0) continue;
1010 esdTrack->GetPxPyPz(p);
1011 Double_t pt2 = p[0]*p[0]+p[1]*p[1];
1012 Double_t momentum = TMath::Sqrt(pt2+p[2]*p[2]);
1013 Double_t fPt = TMath::Sqrt(pt2);
1016 if(fPt > maxPt) maxPt = fPt;
1018 if(esdTrack->GetSign() > 0) {
1020 if(fPt > fLowPtCut) nCh1GeV++;
1021 if(fPt > fHighPtCut) nCh3GeV++;
1022 if(fPt > fVeryHighPtCut) nCh10GeV++;
1024 if(esdTrack->GetSign() < 0) {
1026 if(fPt > fLowPtCut) nCh1GeV++;
1027 if(fPt > fHighPtCut) nCh3GeV++;
1028 if(fPt > fVeryHighPtCut) nCh10GeV++;
1030 if(esdTrack->GetSign() == 0) nNeutr++;
1034 esdTrack->GetESDpid(prob);
1037 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
1038 if(rcc == 0.0) continue;
1041 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1044 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1046 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1048 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
1050 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1052 if(fPt > fLowPtCut) nEl1GeV++;
1053 if(fPt > fHighPtCut) nEl3GeV++;
1054 if(fPt > fVeryHighPtCut) nEl10GeV++;
1062 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1063 // loop over all reconstructed tracks (also first track of combination)
1064 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
1065 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1066 if (muonTrack == 0x0) continue;
1068 // Coordinates at vertex
1069 fZ = muonTrack->GetZ();
1070 fY = muonTrack->GetBendingCoor();
1071 fX = muonTrack->GetNonBendingCoor();
1073 fThetaX = muonTrack->GetThetaX();
1074 fThetaY = muonTrack->GetThetaY();
1076 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1077 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1078 fPxRec = fPzRec * TMath::Tan(fThetaX);
1079 fPyRec = fPzRec * TMath::Tan(fThetaY);
1080 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1082 //ChiSquare of the track if needed
1083 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1084 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1085 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1087 // total number of muons inside a vertex cut
1088 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
1091 if(fEPvector.Pt() > fLowPtCut) {
1093 if(fEPvector.Pt() > fHighPtCut) {
1095 if (fEPvector.Pt() > fVeryHighPtCut) {
1103 // Fill the event tags
1104 if(ntrack != 0) meanPt = meanPt/ntrack;
1106 //First physics data
1107 const AliMultiplicity *spdMult = esd->GetMultiplicity();
1108 evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0));
1109 evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1));
1110 evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets());
1112 AliESDVZERO *vzeroData = esd->GetVZEROData();
1113 evTag->SetMTotV0A(vzeroData->GetMTotV0A());
1114 evTag->SetMTotV0C(vzeroData->GetMTotV0C());
1115 evTag->SetNbPMV0A(vzeroData->GetNbPMV0A());
1116 evTag->SetNbPMV0C(vzeroData->GetNbPMV0C());
1118 //evTag->SetEventId(iEventNumber+1);
1119 evTag->SetPeriodNumber(esd->GetPeriodNumber());
1120 evTag->SetOrbitNumber(esd->GetOrbitNumber());
1121 evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber());
1122 evTag->SetPath(filepath);
1124 evTag->SetVertexX(vertexIn->GetXv());
1125 evTag->SetVertexY(vertexIn->GetYv());
1126 evTag->SetVertexZ(vertexIn->GetZv());
1127 evTag->SetVertexZError(vertexIn->GetZRes());
1128 evTag->SetVertexFlag(fVertexflag);
1130 evTag->SetT0VertexZ(esd->GetT0zVertex());
1132 evTag->SetTriggerMask(esd->GetTriggerMask());
1133 evTag->SetTriggerCluster(esd->GetTriggerCluster());
1135 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1136 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1137 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
1138 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
1139 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
1140 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1143 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1144 evTag->SetNumOfPosTracks(nPos);
1145 evTag->SetNumOfNegTracks(nNeg);
1146 evTag->SetNumOfNeutrTracks(nNeutr);
1148 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1149 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1150 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
1151 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
1153 evTag->SetNumOfProtons(nProtons);
1154 evTag->SetNumOfKaons(nKaons);
1155 evTag->SetNumOfPions(nPions);
1156 evTag->SetNumOfMuons(nMuons);
1157 evTag->SetNumOfFWMuons(nFWMuons);
1158 evTag->SetNumOfElectrons(nElectrons);
1159 evTag->SetNumOfPhotons(nGamas);
1160 evTag->SetNumOfPi0s(nPi0s);
1161 evTag->SetNumOfNeutrons(nNeutrons);
1162 evTag->SetNumOfKaon0s(nK0s);
1164 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1165 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1166 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1167 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1168 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1169 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1170 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1171 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1172 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
1174 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
1175 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
1177 evTag->SetTotalMomentum(totalP);
1178 evTag->SetMeanPt(meanPt);
1179 evTag->SetMaxPt(maxPt);
1181 tag->SetRunId(iInitRunNumber);
1182 if(fIsSim) tag->SetDataType(0);
1183 else tag->SetDataType(1);
1184 tag->AddEventTag(*evTag);
1186 lastEvent = iNumberOfEvents;
1190 TString localFileName = "Run"; localFileName += tag->GetRunId();
1191 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter;
1192 localFileName += ".ESD.tag.root";
1197 fileName = localFileName.Data();
1198 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
1200 else if(fStorage == 1) {
1201 TString alienLocation = "/alien";
1202 alienLocation += gGrid->Pwd();
1203 alienLocation += fgridpath.Data();
1204 alienLocation += "/";
1205 alienLocation += localFileName;
1206 alienLocation += "?se=";
1207 alienLocation += fSE.Data();
1208 fileName = alienLocation.Data();
1209 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
1212 TFile* ftag = TFile::Open(fileName, "recreate");
1225 //_____________________________________________________________________________
1226 void AliESDTagCreator::CreateESDTags(Int_t fFirstEvent, Int_t fLastEvent, AliGRPObject *grpData, ULong_t * qa, Bool_t * es, Int_t qalength, Int_t eslength) {
1228 Float_t lhcLuminosity = 0.0;
1229 TString lhcState = "test";
1230 //UInt_t detectorMask = 0;
1231 Int_t detectorMask = 0;
1233 detectorMask = grpData->GetDetectorMask();
1234 time_t startTime = grpData->GetTimeStart();
1235 TTimeStamp *t1 = new TTimeStamp(startTime);
1236 time_t endTime = grpData->GetTimeEnd();
1237 TTimeStamp *t2 = new TTimeStamp(endTime);
1238 const char* beamtype = grpData->GetBeamType();
1239 Float_t beamenergy = grpData->GetBeamEnergy();
1245 Double_t fMUONMASS = 0.105658369;
1248 Double_t fThetaX, fThetaY, fPyz, fChisquare;
1249 Double_t fPxRec,fPyRec, fPzRec, fEnergy;
1251 TLorentzVector fEPvector;
1253 Float_t fZVertexCut = 10.0;
1254 Float_t fRhoVertexCut = 2.0;
1256 Float_t fLowPtCut = 1.0;
1257 Float_t fHighPtCut = 3.0;
1258 Float_t fVeryHighPtCut = 10.0;
1261 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
1263 // Creates the tags for all the events in a given ESD file
1265 Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons;
1266 Int_t nPos, nNeg, nNeutr;
1267 Int_t nK0s, nNeutrons, nPi0s, nGamas;
1268 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
1269 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
1270 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
1271 Float_t maxPt = .0, meanPt = .0, totalP = .0;
1273 Int_t iRunNumber = 0;
1274 TString fVertexName("default");
1276 AliInfo(Form("Creating the ESD tags......."));
1278 TFile *file = TFile::Open("AliESDs.root");
1279 if (!file || !file->IsOpen()) {
1280 AliError(Form("opening failed"));
1284 Int_t lastEvent = 0;
1285 TTree *b = (TTree*) file->Get("esdTree");
1286 AliESDEvent *esd = new AliESDEvent();
1287 esd->ReadFromTree(b);
1289 b->GetEntry(fFirstEvent);
1290 Int_t iInitRunNumber = esd->GetRunNumber();
1292 Int_t iNumberOfEvents = (Int_t)b->GetEntries();
1293 if(fLastEvent == -1) lastEvent = (Int_t)b->GetEntries();
1294 else lastEvent = fLastEvent;
1297 sprintf(fileName, "Run%d.Event%d_%d.ESD.tag.root",
1298 iInitRunNumber,fFirstEvent,lastEvent);
1299 AliInfo(Form("writing tags to file %s", fileName));
1300 AliDebug(1, Form("writing tags to file %s", fileName));
1302 TFile* ftag = TFile::Open(fileName, "recreate");
1304 AliRunTag *tag = new AliRunTag();
1305 AliEventTag *evTag = new AliEventTag();
1306 TTree ttag("T","A Tree with event tags");
1307 TBranch * btag = ttag.Branch("AliTAG", &tag);
1308 btag->SetCompressionLevel(9);
1310 if(fLastEvent != -1) iNumberOfEvents = fLastEvent + 1;
1311 for (Int_t iEventNumber = fFirstEvent; iEventNumber < iNumberOfEvents; iEventNumber++) {
1340 b->GetEntry(iEventNumber);
1341 iRunNumber = esd->GetRunNumber();
1342 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
1343 const AliESDVertex * vertexIn = esd->GetVertex();
1344 if (!vertexIn) AliError("ESD has not defined vertex.");
1345 if (vertexIn) fVertexName = vertexIn->GetName();
1346 if(fVertexName != "default") fVertexflag = 1;
1347 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
1348 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
1349 UInt_t status = esdTrack->GetStatus();
1351 //select only tracks with ITS refit
1352 if ((status&AliESDtrack::kITSrefit)==0) continue;
1353 //select only tracks with TPC refit
1354 if ((status&AliESDtrack::kTPCrefit)==0) continue;
1356 //select only tracks with the "combined PID"
1357 if ((status&AliESDtrack::kESDpid)==0) continue;
1359 esdTrack->GetPxPyPz(p);
1360 Double_t pt2 = p[0]*p[0]+p[1]*p[1];
1361 Double_t momentum = TMath::Sqrt(pt2+p[2]*p[2]);
1362 Double_t fPt = TMath::Sqrt(pt2);
1365 if(fPt > maxPt) maxPt = fPt;
1367 if(esdTrack->GetSign() > 0) {
1369 if(fPt > fLowPtCut) nCh1GeV++;
1370 if(fPt > fHighPtCut) nCh3GeV++;
1371 if(fPt > fVeryHighPtCut) nCh10GeV++;
1373 if(esdTrack->GetSign() < 0) {
1375 if(fPt > fLowPtCut) nCh1GeV++;
1376 if(fPt > fHighPtCut) nCh3GeV++;
1377 if(fPt > fVeryHighPtCut) nCh10GeV++;
1379 if(esdTrack->GetSign() == 0) nNeutr++;
1383 esdTrack->GetESDpid(prob);
1386 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
1387 if(rcc == 0.0) continue;
1390 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1393 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1395 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1397 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
1399 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1401 if(fPt > fLowPtCut) nEl1GeV++;
1402 if(fPt > fHighPtCut) nEl3GeV++;
1403 if(fPt > fVeryHighPtCut) nEl10GeV++;
1411 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1412 // loop over all reconstructed tracks (also first track of combination)
1413 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
1414 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1415 if (muonTrack == 0x0) continue;
1417 // Coordinates at vertex
1418 fZ = muonTrack->GetZ();
1419 fY = muonTrack->GetBendingCoor();
1420 fX = muonTrack->GetNonBendingCoor();
1422 fThetaX = muonTrack->GetThetaX();
1423 fThetaY = muonTrack->GetThetaY();
1425 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1426 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1427 fPxRec = fPzRec * TMath::Tan(fThetaX);
1428 fPyRec = fPzRec * TMath::Tan(fThetaY);
1429 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1431 //ChiSquare of the track if needed
1432 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1433 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1434 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1436 // total number of muons inside a vertex cut
1437 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
1440 if(fEPvector.Pt() > fLowPtCut) {
1442 if(fEPvector.Pt() > fHighPtCut) {
1444 if (fEPvector.Pt() > fVeryHighPtCut) {
1453 // Fill the event tags
1455 meanPt = meanPt/ntrack;
1457 //First physics data
1458 const AliMultiplicity *spdMult = esd->GetMultiplicity();
1459 evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0));
1460 evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1));
1461 evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets());
1463 AliESDVZERO *vzeroData = esd->GetVZEROData();
1464 evTag->SetMTotV0A(vzeroData->GetMTotV0A());
1465 evTag->SetMTotV0C(vzeroData->GetMTotV0C());
1466 evTag->SetNbPMV0A(vzeroData->GetNbPMV0A());
1467 evTag->SetNbPMV0C(vzeroData->GetNbPMV0C());
1469 //evTag->SetEventId(iEventNumber+1);
1470 evTag->SetPeriodNumber(esd->GetPeriodNumber());
1471 evTag->SetOrbitNumber(esd->GetOrbitNumber());
1472 evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber());
1474 evTag->SetVertexX(vertexIn->GetXv());
1475 evTag->SetVertexY(vertexIn->GetYv());
1476 evTag->SetVertexZ(vertexIn->GetZv());
1477 evTag->SetVertexZError(vertexIn->GetZRes());
1479 evTag->SetVertexFlag(fVertexflag);
1481 evTag->SetT0VertexZ(esd->GetT0zVertex());
1483 evTag->SetTriggerMask(esd->GetTriggerMask());
1484 evTag->SetTriggerCluster(esd->GetTriggerCluster());
1486 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1487 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1488 evTag->SetZDCNeutron2Energy(esd->GetZDCN2Energy());
1489 evTag->SetZDCProton2Energy(esd->GetZDCP2Energy());
1490 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
1491 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1494 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1495 evTag->SetNumOfPosTracks(nPos);
1496 evTag->SetNumOfNegTracks(nNeg);
1497 evTag->SetNumOfNeutrTracks(nNeutr);
1499 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1500 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1501 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
1502 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
1504 evTag->SetNumOfProtons(nProtons);
1505 evTag->SetNumOfKaons(nKaons);
1506 evTag->SetNumOfPions(nPions);
1507 evTag->SetNumOfMuons(nMuons);
1508 evTag->SetNumOfFWMuons(nFWMuons);
1509 evTag->SetNumOfElectrons(nElectrons);
1510 evTag->SetNumOfPhotons(nGamas);
1511 evTag->SetNumOfPi0s(nPi0s);
1512 evTag->SetNumOfNeutrons(nNeutrons);
1513 evTag->SetNumOfKaon0s(nK0s);
1515 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1516 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1517 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1518 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1519 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1520 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1521 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1522 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1523 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
1525 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
1526 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
1528 evTag->SetTotalMomentum(totalP);
1529 evTag->SetMeanPt(meanPt);
1530 evTag->SetMaxPt(maxPt);
1532 tag->SetLHCTag(lhcLuminosity,lhcState);
1533 tag->SetDetectorTag(detectorMask);
1535 tag->SetRunId(iInitRunNumber);
1536 tag->SetRunStartTime(t1->GetDate());
1537 tag->SetRunStopTime(t2->GetDate());
1538 tag->SetBeamEnergy(beamenergy);
1539 tag->SetBeamType(beamtype);
1542 tag->SetQA(qa, qalength) ;
1543 tag->SetEventSpecies(es, eslength) ;
1545 tag->AddEventTag(*evTag);
1558 //_____________________________________________________________________________
1559 void AliESDTagCreator::SwitchOffBranches() const {
1561 // Switch of branches on user request
1562 TObjArray * tokens = fBranches.Tokenize(" ");
1563 Int_t ntok = tokens->GetEntries();
1564 for (Int_t i = 0; i < ntok; i++) {
1565 TString str = ((TObjString*) tokens->At(i))->GetString();
1566 fChain->SetBranchStatus(Form("%s%s%s","*", str.Data(), "*"), 0);
1567 AliInfo(Form("Branch %s switched off \n", str.Data()));