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>
34 #include <TRefArray.h>
38 #include <TGridResult.h>
41 #include "AliRunTag.h"
42 #include "AliEventTag.h"
44 #include "AliESDEvent.h"
45 #include "AliESDVertex.h"
47 #include "AliGRPObject.h"
49 #include "AliESDTagCreator.h"
52 ClassImp(AliESDTagCreator)
55 //______________________________________________________________________________
56 AliESDTagCreator::AliESDTagCreator() :
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================
64 //______________________________________________________________________________
65 AliESDTagCreator::~AliESDTagCreator() {
66 //================Default destructor for a AliESDTagCreator===================
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();
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;
95 fChain->Add(alienUrl);
96 //fGUIDList->Add(new TObjString(guid));
97 //fMD5List->Add(new TObjString(md5));
98 //fTURLList->Add(new TObjString(turl));
100 //TFile *f = TFile::Open(alienUrl,"READ");
101 //CreateTag(f,guid,md5,turl,size,counter);
107 if (fChain->GetEntries() > 0) {
108 AliInfo(Form("ESD chain created......."));
109 AliInfo(Form("Chain entries: %d",fChain->GetEntries()));
111 AliWarning(Form("No ESD files found !"));
115 // Switch of branches on user request
117 CreateTag(fChain,"grid");
122 //______________________________________________________________________________
123 Bool_t AliESDTagCreator::ReadLocalCollection(const char *localpath) {
124 // Checks the different subdirs of the given local path and in the
125 // case where it finds an AliESDs.root file it creates the tags
127 void *dira = gSystem->OpenDirectory(localpath);
129 const char * dirname = 0x0;
130 const char * filename = 0x0;
131 const char * pattern = "AliESDs.root";
134 while((dirname = gSystem->GetDirEntry(dira))) {
135 sprintf(fPath,"%s/%s",localpath,dirname);
136 void *dirb = gSystem->OpenDirectory(fPath);
137 while((filename = gSystem->GetDirEntry(dirb))) {
138 if(strstr(filename,pattern)) {
139 TString fESDFileName;
140 fESDFileName = fPath;
142 fESDFileName += pattern;
144 fChain->Add(fESDFileName);
146 //TFile *f = TFile::Open(fESDFileName,"READ");
147 //CreateTag(f,fESDFileName,counter);
153 }//child directory's entry loop
154 }//parent directory's entry loop
156 AliInfo(Form("ESD chain created......."));
157 AliInfo(Form("Chain entries: %d",fChain->GetEntries()));
158 // Switch of branches on user request
160 CreateTag(fChain,"local");
165 //______________________________________________________________________________
166 Bool_t AliESDTagCreator::ReadCAFCollection(const char *filename) {
167 // Temporary solution for CAF: Takes as an input the ascii file that
168 // lists the ESDs stored in the SE of the CAF and creates the tags.
170 // Open the input stream
176 // Read the input list of files and add them to the chain
179 if (!esdfile.Contains("root")) continue; // protection
181 fChain->Add(esdfile);
183 //TFile *f = TFile::Open(esdfile,"READ");
184 //CreateTag(f,esdfile,counter);
191 AliInfo(Form("ESD chain created......."));
192 AliInfo(Form("Chain entries: %d",fChain->GetEntries()));
193 // Switch of branches on user request
195 CreateTag(fChain,"proof");
200 //_____________________________________________________________________________
201 void AliESDTagCreator::CreateTag(TChain* chain, const char *type) {
202 //private method that creates tag files
203 TString fSession = type;
204 TString fguid, fmd5, fturl;
210 Double_t fMUONMASS = 0.105658369;
213 Double_t fThetaX, fThetaY, fPyz, fChisquare;
214 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
216 TLorentzVector fEPvector;
218 Float_t fLowPtCut = 1.0;
219 Float_t fHighPtCut = 3.0;
220 Float_t fVeryHighPtCut = 10.0;
223 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
225 // Creates the tags for all the events in a given ESD file
226 Bool_t fIsSim = kTRUE;
228 Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons, nFWMatchedMuons;
229 Int_t nPos, nNeg, nNeutr;
230 Int_t nK0s, nNeutrons, nPi0s, nGamas;
231 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
232 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
233 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
234 Float_t maxPt = .0, etamaxPt = -999., phimaxPt = -999., meanPt = .0, totalP = .0;
236 Int_t iRunNumber = 0;
239 //gSystem->GetMemInfo(meminfo);
240 //AliInfo(Form("After the tag initialization - Memory used: %d MB",meminfo->fMemUsed));
241 //Int_t tempmem = meminfo->fMemUsed;
243 AliInfo(Form("Creating the ESD tags......."));
245 Int_t firstEvent = 0,lastEvent = 0;
246 AliESDEvent *esd = new AliESDEvent();
247 esd->ReadFromTree(chain);
248 AliESD *esdold = 0x0;
250 //gSystem->GetMemInfo(meminfo);
251 //AliInfo(Form("After the esd initialization - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
252 //tempmem = meminfo->fMemUsed;
254 Int_t iInitRunNumber = -1;
256 TFile *f = chain->GetFile();
257 fTempGuid = f->GetUUID().AsString();
259 TString localFileName = "Run"; localFileName += esd->GetRunNumber();
260 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += chain->GetEntries(); //localFileName += "."; localFileName += Counter;
261 localFileName += ".ESD.tag.root";
267 fileName = localFileName.Data();
268 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
270 else if(fStorage == 1) {
271 TString alienLocation = "/alien";
272 alienLocation += gGrid->Pwd();
273 alienLocation += fgridpath.Data();
274 alienLocation += "/";
275 alienLocation += localFileName;
276 alienLocation += "?se=";
277 alienLocation += fSE.Data();
278 fileName = alienLocation.Data();
279 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
282 TFile* ftag = TFile::Open(fileName, "recreate");
284 AliRunTag *tag = new AliRunTag();
285 AliEventTag *evTag = new AliEventTag();
286 TTree * ttag = new TTree("T","A Tree with event tags");
287 TBranch * btag = ttag->Branch("AliTAG", &tag);
288 btag->SetCompressionLevel(9);
289 // Run related information
290 tag->SetMagneticField(esd->GetMagneticField());
291 tag->SetBeamEnergy(esd->GetBeamEnergy());
292 tag->SetBeamType(TString(esd->GetBeamType()));
294 for(Int_t iEventNumber = 0; iEventNumber < chain->GetEntries(); iEventNumber++) {
295 ntrack = 0; nPos = 0; nNeg = 0; nNeutr =0;
296 nK0s = 0; nNeutrons = 0; nPi0s = 0;
297 nGamas = 0; nProtons = 0; nKaons = 0;
298 nPions = 0; nMuons = 0; nElectrons = 0; nFWMuons = 0; nFWMatchedMuons = 0;
299 nCh1GeV = 0; nCh3GeV = 0; nCh10GeV = 0;
300 nMu1GeV = 0; nMu3GeV = 0; nMu10GeV = 0;
301 nEl1GeV = 0; nEl3GeV = 0; nEl10GeV = 0;
302 maxPt = .0; etamaxPt = -999.; phimaxPt = -999.; meanPt = .0; totalP = .0;
305 chain->GetEntry(iEventNumber);
306 esdold = esd->GetAliESDOld();
307 if(esdold) esd->CopyFromOldESD();
309 TFile *file = chain->GetFile();
310 const TUrl *url = file->GetEndpointUrl();
311 fguid = file->GetUUID().AsString();
312 if(fSession == "grid") {
313 TString fturltemp = "alien://"; fturltemp += url->GetFile();
314 fturl = fturltemp(0,fturltemp.Index(".root",5,0,TString::kExact)+5);
316 else fturl = url->GetFile();
318 if(iEventNumber == 0) iInitRunNumber = esd->GetRunNumber();
319 iRunNumber = esd->GetRunNumber();
320 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD - You are trying to merge different runs!!!");
322 const AliESDVertex * vertexIn = esd->GetVertex();
323 fVertexName = vertexIn->GetName();
324 if(fVertexName == "default") fVertexflag = 0;
326 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
327 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
328 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
329 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
330 UInt_t status = esdTrack->GetStatus();
332 //select only tracks with ITS refit
333 if ((status&AliESDtrack::kITSrefit)==0) continue;
334 //select only tracks with TPC refit
335 if ((status&AliESDtrack::kTPCrefit)==0) continue;
337 //select only tracks with the "combined PID"
338 if ((status&AliESDtrack::kESDpid)==0) continue;
340 esdTrack->GetPxPyPz(p);
341 Double_t pt2 = p[0]*p[0]+p[1]*p[1];
342 Double_t momentum = TMath::Sqrt(pt2+p[2]*p[2]);
343 Double_t fPt = TMath::Sqrt(pt2);
348 phimaxPt = esdTrack->Phi();
349 etamaxPt = esdTrack->Eta();
352 if(esdTrack->GetSign() > 0) {
354 if(fPt > fLowPtCut) nCh1GeV++;
355 if(fPt > fHighPtCut) nCh3GeV++;
356 if(fPt > fVeryHighPtCut) nCh10GeV++;
358 if(esdTrack->GetSign() < 0) {
360 if(fPt > fLowPtCut) nCh1GeV++;
361 if(fPt > fHighPtCut) nCh3GeV++;
362 if(fPt > fVeryHighPtCut) nCh10GeV++;
364 if(esdTrack->GetSign() == 0) nNeutr++;
368 esdTrack->GetESDpid(prob);
371 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
372 if(rcc == 0.0) continue;
375 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
378 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
380 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
382 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
384 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
386 if(fPt > fLowPtCut) nEl1GeV++;
387 if(fPt > fHighPtCut) nEl3GeV++;
388 if(fPt > fVeryHighPtCut) nEl10GeV++;
396 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
397 // loop over all reconstructed tracks (also first track of combination)
398 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
399 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
400 if (muonTrack == 0x0) continue;
402 // Coordinates at vertex
403 fZ = muonTrack->GetZ();
404 fY = muonTrack->GetBendingCoor();
405 fX = muonTrack->GetNonBendingCoor();
407 fThetaX = muonTrack->GetThetaX();
408 fThetaY = muonTrack->GetThetaY();
410 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
411 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
412 fPxRec = fPzRec * TMath::Tan(fThetaX);
413 fPyRec = fPzRec * TMath::Tan(fThetaY);
414 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
416 //ChiSquare of the track if needed
417 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
418 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
419 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
421 if (muonTrack->GetMatchTrigger()>0) nFWMatchedMuons++;
425 if(fEPvector.Pt() > fLowPtCut) {
427 if(fEPvector.Pt() > fHighPtCut) {
429 if (fEPvector.Pt() > fVeryHighPtCut) {
436 // Fill the event tags
437 if(ntrack != 0) meanPt = meanPt/ntrack;
439 //AliInfo(Form("====================================="));
440 //AliInfo(Form("URL: %s - GUID: %s",fturl.Data(),fguid.Data()));
441 //AliInfo(Form("====================================="));
444 const AliMultiplicity *spdMult = esd->GetMultiplicity();
445 evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0));
446 evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1));
447 evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets());
449 AliESDVZERO *vzeroData = esd->GetVZEROData();
450 evTag->SetMTotV0A(vzeroData->GetMTotV0A());
451 evTag->SetMTotV0C(vzeroData->GetMTotV0C());
452 evTag->SetNbPMV0A(vzeroData->GetNbPMV0A());
453 evTag->SetNbPMV0C(vzeroData->GetNbPMV0C());
455 //evTag->SetEventId(iEventNumber+1);
456 evTag->SetPeriodNumber(esd->GetPeriodNumber());
457 evTag->SetOrbitNumber(esd->GetOrbitNumber());
458 evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber());
459 evTag->SetGUID(fguid);
460 if(fSession == "grid") {
462 evTag->SetTURL(fturl);
465 else evTag->SetPath(fturl);
467 evTag->SetVertexX(vertexIn->GetXv());
468 evTag->SetVertexY(vertexIn->GetYv());
469 evTag->SetVertexZ(vertexIn->GetZv());
470 evTag->SetVertexZError(vertexIn->GetZRes());
471 evTag->SetVertexFlag(fVertexflag);
473 evTag->SetT0VertexZ(esd->GetT0zVertex());
475 evTag->SetTriggerMask(esd->GetTriggerMask());
476 evTag->SetTriggerCluster(esd->GetTriggerCluster());
478 evTag->SetEventType(esd->GetEventType());
479 evTag->SetFiredTriggerClasses(esd->GetFiredTriggerClasses());
481 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
482 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
483 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
484 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
485 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
486 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
489 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
490 evTag->SetNumOfPosTracks(nPos);
491 evTag->SetNumOfNegTracks(nNeg);
492 evTag->SetNumOfNeutrTracks(nNeutr);
494 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
495 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
496 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
497 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
499 evTag->SetNumOfProtons(nProtons);
500 evTag->SetNumOfKaons(nKaons);
501 evTag->SetNumOfPions(nPions);
502 evTag->SetNumOfMuons(nMuons);
503 evTag->SetNumOfFWMuons(nFWMuons);
504 evTag->SetNumOfFWMatchedMuons(nFWMatchedMuons);
505 evTag->SetNumOfElectrons(nElectrons);
506 evTag->SetNumOfPhotons(nGamas);
507 evTag->SetNumOfPi0s(nPi0s);
508 evTag->SetNumOfNeutrons(nNeutrons);
509 evTag->SetNumOfKaon0s(nK0s);
511 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
512 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
513 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
514 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
515 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
516 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
517 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
518 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
519 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
522 evTag->SetNumOfPHOSClusters(esd->GetPHOSClusters(&tmp));
524 evTag->SetNumOfEMCALClusters(esd->GetEMCALClusters(&tmp));
526 evTag->SetTotalMomentum(totalP);
527 evTag->SetMeanPt(meanPt);
528 evTag->SetMaxPt(maxPt);
529 evTag->SetEtaMaxPt(etamaxPt);
530 evTag->SetPhiMaxPt(phimaxPt);
532 tag->SetRunId(iInitRunNumber);
533 if(fIsSim) tag->SetDataType(0);
534 else tag->SetDataType(1);
536 if(fguid != fTempGuid) {
541 tag->AddEventTag(*evTag);
542 if(iEventNumber+1 == chain->GetEntries()) {
543 //AliInfo(Form("File: %s",fturl.Data()));
548 lastEvent = chain->GetEntries();
550 //gSystem->GetMemInfo(meminfo);
551 //AliInfo(Form("After the event and track loop - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
552 //tempmem = meminfo->fMemUsed;
556 //gSystem->GetMemInfo(meminfo);
557 //AliInfo(Form("After the t->Delete - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
558 //tempmem = meminfo->fMemUsed;
565 //gSystem->GetMemInfo(meminfo);
566 //AliInfo(Form("After the file closing - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
567 //tempmem = meminfo->fMemUsed;
572 //gSystem->GetMemInfo(meminfo);
573 //AliInfo(Form("After the delete objects - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
576 //_____________________________________________________________________________
577 void AliESDTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, const char *turl, Long64_t size, Int_t Counter) {
578 //private method that creates tag files
579 TString fguid = guid;
581 TString fturl = turl;
585 Double_t fMUONMASS = 0.105658369;
588 Double_t fThetaX, fThetaY, fPyz, fChisquare;
589 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
591 TLorentzVector fEPvector;
593 Float_t fLowPtCut = 1.0;
594 Float_t fHighPtCut = 3.0;
595 Float_t fVeryHighPtCut = 10.0;
598 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
600 // Creates the tags for all the events in a given ESD file
601 Bool_t fIsSim = kTRUE;
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;
611 Int_t iRunNumber = 0;
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;
624 AliInfo(Form("Creating the ESD tags......."));
626 Int_t firstEvent = 0,lastEvent = 0;
627 TTree *t = (TTree*) file->Get("esdTree");
628 AliESDEvent *esd = new AliESDEvent();
629 esd->ReadFromTree(t);
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;
636 Int_t iInitRunNumber = esd->GetRunNumber();
638 Int_t iNumberOfEvents = (Int_t)t->GetEntries();
639 for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
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;
678 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
679 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
680 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
681 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
682 UInt_t status = esdTrack->GetStatus();
684 //select only tracks with ITS refit
685 if ((status&AliESDtrack::kITSrefit)==0) continue;
686 //select only tracks with TPC refit
687 if ((status&AliESDtrack::kTPCrefit)==0) continue;
689 //select only tracks with the "combined PID"
690 if ((status&AliESDtrack::kESDpid)==0) continue;
692 esdTrack->GetPxPyPz(p);
693 Double_t 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);
700 etamaxPt = esdTrack->Eta();
701 phimaxPt = esdTrack->Phi();
705 if(esdTrack->GetSign() > 0) {
707 if(fPt > fLowPtCut) nCh1GeV++;
708 if(fPt > fHighPtCut) nCh3GeV++;
709 if(fPt > fVeryHighPtCut) nCh10GeV++;
711 if(esdTrack->GetSign() < 0) {
713 if(fPt > fLowPtCut) nCh1GeV++;
714 if(fPt > fHighPtCut) nCh3GeV++;
715 if(fPt > fVeryHighPtCut) nCh10GeV++;
717 if(esdTrack->GetSign() == 0) nNeutr++;
721 esdTrack->GetESDpid(prob);
724 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
725 if(rcc == 0.0) continue;
728 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
731 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
733 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
735 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
737 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
739 if(fPt > fLowPtCut) nEl1GeV++;
740 if(fPt > fHighPtCut) nEl3GeV++;
741 if(fPt > fVeryHighPtCut) nEl10GeV++;
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;
755 // Coordinates at vertex
756 fZ = muonTrack->GetZ();
757 fY = muonTrack->GetBendingCoor();
758 fX = muonTrack->GetNonBendingCoor();
760 fThetaX = muonTrack->GetThetaX();
761 fThetaY = muonTrack->GetThetaY();
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()));
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);
774 if (muonTrack->GetMatchTrigger()>0) nFWMatchedMuons++;
778 if(fEPvector.Pt() > fLowPtCut) {
780 if(fEPvector.Pt() > fHighPtCut) {
782 if (fEPvector.Pt() > fVeryHighPtCut) {
789 // Fill the event tags
790 if(ntrack != 0) meanPt = meanPt/ntrack;
793 const AliMultiplicity *spdMult = esd->GetMultiplicity();
794 evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0));
795 evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1));
796 evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets());
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());
804 //evTag->SetEventId(iEventNumber+1);
805 evTag->SetPeriodNumber(esd->GetPeriodNumber());
806 evTag->SetOrbitNumber(esd->GetOrbitNumber());
807 evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber());
809 evTag->SetGUID(fguid);
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);
819 evTag->SetT0VertexZ(esd->GetT0zVertex());
821 evTag->SetTriggerMask(esd->GetTriggerMask());
822 evTag->SetTriggerCluster(esd->GetTriggerCluster());
824 evTag->SetEventType(esd->GetEventType());
825 evTag->SetFiredTriggerClasses(esd->GetFiredTriggerClasses());
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());
835 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
836 evTag->SetNumOfPosTracks(nPos);
837 evTag->SetNumOfNegTracks(nNeg);
838 evTag->SetNumOfNeutrTracks(nNeutr);
840 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
841 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
842 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
843 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
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);
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);
868 evTag->SetNumOfPHOSClusters(esd->GetPHOSClusters(&tmp));
870 evTag->SetNumOfEMCALClusters(esd->GetEMCALClusters(&tmp));
872 evTag->SetTotalMomentum(totalP);
873 evTag->SetMeanPt(meanPt);
874 evTag->SetMaxPt(maxPt);
875 evTag->SetEtaMaxPt(etamaxPt);
876 evTag->SetPhiMaxPt(phimaxPt);
878 tag->SetRunId(iInitRunNumber);
879 if(fIsSim) tag->SetDataType(0);
880 else tag->SetDataType(1);
881 tag->AddEventTag(*evTag);
883 lastEvent = iNumberOfEvents;
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;
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;
894 TString localFileName = "Run"; localFileName += tag->GetRunId();
895 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter;
896 localFileName += ".ESD.tag.root";
901 fileName = localFileName.Data();
902 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
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()));
916 TFile* ftag = TFile::Open(fileName, "recreate");
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;
931 gSystem->GetMemInfo(meminfo);
932 AliInfo(Form("After the delete objects - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem));
935 //_____________________________________________________________________________
936 void AliESDTagCreator::CreateTag(TFile* file, const char *filepath, Int_t Counter) {
937 //private method that creates tag files
941 Double_t fMUONMASS = 0.105658369;
944 Double_t fThetaX, fThetaY, fPyz, fChisquare;
945 Double_t fPxRec, fPyRec, fPzRec, fEnergy;
947 TLorentzVector fEPvector;
949 Float_t fLowPtCut = 1.0;
950 Float_t fHighPtCut = 3.0;
951 Float_t fVeryHighPtCut = 10.0;
954 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
956 // Creates the tags for all the events in a given ESD file
957 Bool_t fIsSim = kTRUE;
959 Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons, nFWMatchedMuons;
960 Int_t nPos, nNeg, nNeutr;
961 Int_t nK0s, nNeutrons, nPi0s, nGamas;
962 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
963 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
964 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
965 Float_t maxPt = .0, etamaxPt = -999, phimaxPt = -999., meanPt = .0, totalP = .0;
967 Int_t iRunNumber = 0;
971 AliRunTag *tag = new AliRunTag();
972 AliEventTag *evTag = new AliEventTag();
973 TTree * ttag = new TTree("T","A Tree with event tags");
974 TBranch * btag = ttag->Branch("AliTAG", &tag);
975 btag->SetCompressionLevel(9);
977 AliInfo(Form("Creating the ESD tags......."));
979 Int_t firstEvent = 0,lastEvent = 0;
981 TTree *t = (TTree*) file->Get("esdTree");
982 AliESDEvent *esd = new AliESDEvent();
983 esd->ReadFromTree(t);
986 Int_t iInitRunNumber = esd->GetRunNumber();
988 Int_t iNumberOfEvents = (Int_t)t->GetEntries();
989 for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
1003 nFWMatchedMuons = 0;
1021 t->GetEntry(iEventNumber);
1022 iRunNumber = esd->GetRunNumber();
1023 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
1024 const AliESDVertex * vertexIn = esd->GetVertex();
1025 fVertexName = vertexIn->GetName();
1026 if(fVertexName == "default") fVertexflag = 0;
1028 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
1029 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
1030 if(esdTrack->GetLabel() != 0) fIsSim = kTRUE;
1031 else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE;
1032 UInt_t status = esdTrack->GetStatus();
1034 //select only tracks with ITS refit
1035 if ((status&AliESDtrack::kITSrefit)==0) continue;
1036 //select only tracks with TPC refit
1037 if ((status&AliESDtrack::kTPCrefit)==0) continue;
1039 //select only tracks with the "combined PID"
1040 if ((status&AliESDtrack::kESDpid)==0) continue;
1042 esdTrack->GetPxPyPz(p);
1043 Double_t pt2 = p[0]*p[0]+p[1]*p[1];
1044 Double_t momentum = TMath::Sqrt(pt2+p[2]*p[2]);
1045 Double_t fPt = TMath::Sqrt(pt2);
1050 etamaxPt = esdTrack->Eta();
1051 phimaxPt = esdTrack->Phi();
1055 if(esdTrack->GetSign() > 0) {
1057 if(fPt > fLowPtCut) nCh1GeV++;
1058 if(fPt > fHighPtCut) nCh3GeV++;
1059 if(fPt > fVeryHighPtCut) nCh10GeV++;
1061 if(esdTrack->GetSign() < 0) {
1063 if(fPt > fLowPtCut) nCh1GeV++;
1064 if(fPt > fHighPtCut) nCh3GeV++;
1065 if(fPt > fVeryHighPtCut) nCh10GeV++;
1067 if(esdTrack->GetSign() == 0) nNeutr++;
1071 esdTrack->GetESDpid(prob);
1074 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
1075 if(rcc == 0.0) continue;
1078 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1081 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1083 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1085 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
1087 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1089 if(fPt > fLowPtCut) nEl1GeV++;
1090 if(fPt > fHighPtCut) nEl3GeV++;
1091 if(fPt > fVeryHighPtCut) nEl10GeV++;
1099 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1100 // loop over all reconstructed tracks (also first track of combination)
1101 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
1102 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1103 if (muonTrack == 0x0) continue;
1105 // Coordinates at vertex
1106 fZ = muonTrack->GetZ();
1107 fY = muonTrack->GetBendingCoor();
1108 fX = muonTrack->GetNonBendingCoor();
1110 fThetaX = muonTrack->GetThetaX();
1111 fThetaY = muonTrack->GetThetaY();
1113 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1114 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1115 fPxRec = fPzRec * TMath::Tan(fThetaX);
1116 fPyRec = fPzRec * TMath::Tan(fThetaY);
1117 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1119 //ChiSquare of the track if needed
1120 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1121 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1122 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1124 if (muonTrack->GetMatchTrigger()>0) nFWMatchedMuons++;
1128 if(fEPvector.Pt() > fLowPtCut) {
1130 if(fEPvector.Pt() > fHighPtCut) {
1132 if (fEPvector.Pt() > fVeryHighPtCut) {
1139 // Fill the event tags
1140 if(ntrack != 0) meanPt = meanPt/ntrack;
1142 //First physics data
1143 const AliMultiplicity *spdMult = esd->GetMultiplicity();
1144 evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0));
1145 evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1));
1146 evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets());
1148 AliESDVZERO *vzeroData = esd->GetVZEROData();
1149 evTag->SetMTotV0A(vzeroData->GetMTotV0A());
1150 evTag->SetMTotV0C(vzeroData->GetMTotV0C());
1151 evTag->SetNbPMV0A(vzeroData->GetNbPMV0A());
1152 evTag->SetNbPMV0C(vzeroData->GetNbPMV0C());
1154 //evTag->SetEventId(iEventNumber+1);
1155 evTag->SetPeriodNumber(esd->GetPeriodNumber());
1156 evTag->SetOrbitNumber(esd->GetOrbitNumber());
1157 evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber());
1158 evTag->SetPath(filepath);
1160 evTag->SetVertexX(vertexIn->GetXv());
1161 evTag->SetVertexY(vertexIn->GetYv());
1162 evTag->SetVertexZ(vertexIn->GetZv());
1163 evTag->SetVertexZError(vertexIn->GetZRes());
1164 evTag->SetVertexFlag(fVertexflag);
1166 evTag->SetT0VertexZ(esd->GetT0zVertex());
1168 evTag->SetTriggerMask(esd->GetTriggerMask());
1169 evTag->SetTriggerCluster(esd->GetTriggerCluster());
1171 evTag->SetEventType(esd->GetEventType());
1172 evTag->SetFiredTriggerClasses(esd->GetFiredTriggerClasses());
1174 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1175 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1176 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
1177 evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy());
1178 evTag->SetZDCProton1Energy(esd->GetZDCP2Energy());
1179 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1182 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1183 evTag->SetNumOfPosTracks(nPos);
1184 evTag->SetNumOfNegTracks(nNeg);
1185 evTag->SetNumOfNeutrTracks(nNeutr);
1187 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1188 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1189 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
1190 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
1192 evTag->SetNumOfProtons(nProtons);
1193 evTag->SetNumOfKaons(nKaons);
1194 evTag->SetNumOfPions(nPions);
1195 evTag->SetNumOfMuons(nMuons);
1196 evTag->SetNumOfFWMuons(nFWMuons);
1197 evTag->SetNumOfFWMatchedMuons(nFWMatchedMuons);
1198 evTag->SetNumOfElectrons(nElectrons);
1199 evTag->SetNumOfPhotons(nGamas);
1200 evTag->SetNumOfPi0s(nPi0s);
1201 evTag->SetNumOfNeutrons(nNeutrons);
1202 evTag->SetNumOfKaon0s(nK0s);
1204 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1205 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1206 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1207 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1208 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1209 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1210 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1211 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1212 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
1215 evTag->SetNumOfPHOSClusters(esd->GetPHOSClusters(&tmp));
1217 evTag->SetNumOfEMCALClusters(esd->GetEMCALClusters(&tmp));
1219 evTag->SetTotalMomentum(totalP);
1220 evTag->SetMeanPt(meanPt);
1221 evTag->SetMaxPt(maxPt);
1222 evTag->SetEtaMaxPt(etamaxPt);
1223 evTag->SetPhiMaxPt(phimaxPt);
1225 tag->SetRunId(iInitRunNumber);
1226 if(fIsSim) tag->SetDataType(0);
1227 else tag->SetDataType(1);
1228 tag->AddEventTag(*evTag);
1230 lastEvent = iNumberOfEvents;
1234 TString localFileName = "Run"; localFileName += tag->GetRunId();
1235 localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter;
1236 localFileName += ".ESD.tag.root";
1241 fileName = localFileName.Data();
1242 AliInfo(Form("Writing tags to local file: %s",fileName.Data()));
1244 else if(fStorage == 1) {
1245 TString alienLocation = "/alien";
1246 alienLocation += gGrid->Pwd();
1247 alienLocation += fgridpath.Data();
1248 alienLocation += "/";
1249 alienLocation += localFileName;
1250 alienLocation += "?se=";
1251 alienLocation += fSE.Data();
1252 fileName = alienLocation.Data();
1253 AliInfo(Form("Writing tags to grid file: %s",fileName.Data()));
1256 TFile* ftag = TFile::Open(fileName, "recreate");
1269 //_____________________________________________________________________________
1270 void AliESDTagCreator::CreateESDTags(Int_t fFirstEvent, Int_t fLastEvent, AliGRPObject *grpData, ULong_t * qa, Bool_t * es, Int_t qalength, Int_t eslength) {
1272 Float_t lhcLuminosity = 0.0;
1273 TString lhcState = "test";
1274 //UInt_t detectorMask = 0;
1275 Int_t detectorMask = 0;
1277 detectorMask = grpData->GetDetectorMask();
1278 time_t startTime = grpData->GetTimeStart();
1279 TTimeStamp t1(startTime);
1280 time_t endTime = grpData->GetTimeEnd();
1281 TTimeStamp t2(endTime);
1282 const char* beamtype = grpData->GetBeamType();
1283 Float_t beamenergy = grpData->GetBeamEnergy();
1289 Double_t fMUONMASS = 0.105658369;
1292 Double_t fThetaX, fThetaY, fPyz, fChisquare;
1293 Double_t fPxRec,fPyRec, fPzRec, fEnergy;
1295 TLorentzVector fEPvector;
1297 Float_t fLowPtCut = 1.0;
1298 Float_t fHighPtCut = 3.0;
1299 Float_t fVeryHighPtCut = 10.0;
1302 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
1304 // Creates the tags for all the events in a given ESD file
1306 Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons, nFWMatchedMuons;
1307 Int_t nPos, nNeg, nNeutr;
1308 Int_t nK0s, nNeutrons, nPi0s, nGamas;
1309 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
1310 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
1311 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
1312 Float_t maxPt = .0, etamaxPt = -999., phimaxPt = -999., meanPt = .0, totalP = .0;
1314 Int_t iRunNumber = 0;
1315 TString fVertexName("default");
1318 AliInfo(Form("Creating the ESD tags......."));
1320 TFile *file = TFile::Open("AliESDs.root");
1321 if (!file || !file->IsOpen()) {
1322 AliError(Form("opening failed"));
1326 Int_t lastEvent = 0;
1327 TTree *b = (TTree*) file->Get("esdTree");
1328 AliESDEvent *esd = new AliESDEvent();
1329 esd->ReadFromTree(b);
1331 b->GetEntry(fFirstEvent);
1332 Int_t iInitRunNumber = esd->GetRunNumber();
1334 Int_t iNumberOfEvents = (Int_t)b->GetEntries();
1335 if ((fLastEvent == -1) || ((Int_t) b->GetEntries() < fLastEvent))
1336 lastEvent = (Int_t)b->GetEntries();
1337 else lastEvent = fLastEvent;
1340 sprintf(fileName, "Run%d.Event%d_%d.ESD.tag.root",
1341 iInitRunNumber,fFirstEvent,lastEvent);
1342 AliInfo(Form("writing tags to file %s", fileName));
1343 AliDebug(1, Form("writing tags to file %s", fileName));
1345 TFile* ftag = TFile::Open(fileName, "recreate");
1347 AliRunTag *tag = new AliRunTag();
1348 AliEventTag *evTag = new AliEventTag();
1349 TTree * ttag = new TTree("T","A Tree with event tags");
1350 TBranch * btag = ttag->Branch("AliTAG", &tag);
1351 btag->SetCompressionLevel(9);
1353 if ((fLastEvent != -1) && ((Int_t) b->GetEntries() > fLastEvent))
1354 iNumberOfEvents = fLastEvent + 1;
1355 for (Int_t iEventNumber = fFirstEvent; iEventNumber < iNumberOfEvents; iEventNumber++) {
1369 nFWMatchedMuons = 0;
1387 b->GetEntry(iEventNumber);
1388 iRunNumber = esd->GetRunNumber();
1389 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
1390 const AliESDVertex * vertexIn = esd->GetVertex();
1391 if (!vertexIn) AliError("ESD has not defined vertex.");
1392 if (vertexIn) fVertexName = vertexIn->GetName();
1393 if(fVertexName != "default") fVertexflag = 1;
1394 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
1395 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
1396 UInt_t status = esdTrack->GetStatus();
1398 //select only tracks with ITS refit
1399 if ((status&AliESDtrack::kITSrefit)==0) continue;
1400 //select only tracks with TPC refit
1401 if ((status&AliESDtrack::kTPCrefit)==0) continue;
1403 //select only tracks with the "combined PID"
1404 if ((status&AliESDtrack::kESDpid)==0) continue;
1406 esdTrack->GetPxPyPz(p);
1407 Double_t pt2 = p[0]*p[0]+p[1]*p[1];
1408 Double_t momentum = TMath::Sqrt(pt2+p[2]*p[2]);
1409 Double_t fPt = TMath::Sqrt(pt2);
1414 phimaxPt = esdTrack->Eta();
1415 etamaxPt = esdTrack->Phi();
1418 if(esdTrack->GetSign() > 0) {
1420 if(fPt > fLowPtCut) nCh1GeV++;
1421 if(fPt > fHighPtCut) nCh3GeV++;
1422 if(fPt > fVeryHighPtCut) nCh10GeV++;
1424 if(esdTrack->GetSign() < 0) {
1426 if(fPt > fLowPtCut) nCh1GeV++;
1427 if(fPt > fHighPtCut) nCh3GeV++;
1428 if(fPt > fVeryHighPtCut) nCh10GeV++;
1430 if(esdTrack->GetSign() == 0) nNeutr++;
1434 esdTrack->GetESDpid(prob);
1437 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
1438 if(rcc == 0.0) continue;
1441 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1444 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1446 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1448 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
1450 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1452 if(fPt > fLowPtCut) nEl1GeV++;
1453 if(fPt > fHighPtCut) nEl3GeV++;
1454 if(fPt > fVeryHighPtCut) nEl10GeV++;
1462 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1463 // loop over all reconstructed tracks (also first track of combination)
1464 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
1465 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1466 if (muonTrack == 0x0) continue;
1468 // Coordinates at vertex
1469 fZ = muonTrack->GetZ();
1470 fY = muonTrack->GetBendingCoor();
1471 fX = muonTrack->GetNonBendingCoor();
1473 fThetaX = muonTrack->GetThetaX();
1474 fThetaY = muonTrack->GetThetaY();
1476 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1477 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1478 fPxRec = fPzRec * TMath::Tan(fThetaX);
1479 fPyRec = fPzRec * TMath::Tan(fThetaY);
1480 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1482 //ChiSquare of the track if needed
1483 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1484 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1485 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1487 if (muonTrack->GetMatchTrigger()>0) nFWMatchedMuons++;
1491 if(fEPvector.Pt() > fLowPtCut) {
1493 if(fEPvector.Pt() > fHighPtCut) {
1495 if (fEPvector.Pt() > fVeryHighPtCut) {
1503 // Fill the event tags
1505 meanPt = meanPt/ntrack;
1507 //First physics data
1508 const AliMultiplicity *spdMult = esd->GetMultiplicity();
1509 evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0));
1510 evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1));
1511 evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets());
1513 AliESDVZERO *vzeroData = esd->GetVZEROData();
1514 evTag->SetMTotV0A(vzeroData->GetMTotV0A());
1515 evTag->SetMTotV0C(vzeroData->GetMTotV0C());
1516 evTag->SetNbPMV0A(vzeroData->GetNbPMV0A());
1517 evTag->SetNbPMV0C(vzeroData->GetNbPMV0C());
1519 //evTag->SetEventId(iEventNumber+1);
1520 evTag->SetPeriodNumber(esd->GetPeriodNumber());
1521 evTag->SetOrbitNumber(esd->GetOrbitNumber());
1522 evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber());
1524 evTag->SetVertexX(vertexIn->GetXv());
1525 evTag->SetVertexY(vertexIn->GetYv());
1526 evTag->SetVertexZ(vertexIn->GetZv());
1527 evTag->SetVertexZError(vertexIn->GetZRes());
1529 evTag->SetVertexFlag(fVertexflag);
1531 evTag->SetT0VertexZ(esd->GetT0zVertex());
1533 evTag->SetTriggerMask(esd->GetTriggerMask());
1534 evTag->SetTriggerCluster(esd->GetTriggerCluster());
1536 evTag->SetEventType(esd->GetEventType());
1537 evTag->SetFiredTriggerClasses(esd->GetFiredTriggerClasses());
1539 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1540 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1541 evTag->SetZDCNeutron2Energy(esd->GetZDCN2Energy());
1542 evTag->SetZDCProton2Energy(esd->GetZDCP2Energy());
1543 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
1544 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1547 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1548 evTag->SetNumOfPosTracks(nPos);
1549 evTag->SetNumOfNegTracks(nNeg);
1550 evTag->SetNumOfNeutrTracks(nNeutr);
1552 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1553 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1554 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
1555 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
1557 evTag->SetNumOfProtons(nProtons);
1558 evTag->SetNumOfKaons(nKaons);
1559 evTag->SetNumOfPions(nPions);
1560 evTag->SetNumOfMuons(nMuons);
1561 evTag->SetNumOfFWMuons(nFWMuons);
1562 evTag->SetNumOfFWMatchedMuons(nFWMatchedMuons);
1563 evTag->SetNumOfElectrons(nElectrons);
1564 evTag->SetNumOfPhotons(nGamas);
1565 evTag->SetNumOfPi0s(nPi0s);
1566 evTag->SetNumOfNeutrons(nNeutrons);
1567 evTag->SetNumOfKaon0s(nK0s);
1569 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1570 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1571 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1572 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1573 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1574 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1575 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1576 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1577 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
1580 evTag->SetNumOfPHOSClusters(esd->GetPHOSClusters(&tmp));
1582 evTag->SetNumOfEMCALClusters(esd->GetEMCALClusters(&tmp));
1584 evTag->SetTotalMomentum(totalP);
1585 evTag->SetMeanPt(meanPt);
1586 evTag->SetMaxPt(maxPt);
1587 evTag->SetEtaMaxPt(etamaxPt);
1588 evTag->SetPhiMaxPt(phimaxPt);
1590 tag->SetLHCTag(lhcLuminosity,lhcState);
1591 tag->SetDetectorTag(detectorMask);
1593 tag->SetRunId(iInitRunNumber);
1594 tag->SetRunStartTime(t1.GetDate());
1595 tag->SetRunStopTime(t2.GetDate());
1596 tag->SetBeamEnergy(beamenergy);
1597 tag->SetBeamType(beamtype);
1600 tag->SetQAArray(qa, qalength) ;
1601 tag->SetEventSpecies(es, eslength) ;
1603 tag->AddEventTag(*evTag);
1619 //_____________________________________________________________________________
1620 void AliESDTagCreator::SwitchOffBranches() const {
1622 // Switch of branches on user request
1623 TObjArray * tokens = fBranches.Tokenize(" ");
1624 Int_t ntok = tokens->GetEntries();
1625 for (Int_t i = 0; i < ntok; i++) {
1626 TString str = ((TObjString*) tokens->At(i))->GetString();
1627 fChain->SetBranchStatus(Form("%s%s%s","*", str.Data(), "*"), 0);
1628 AliInfo(Form("Branch %s switched off \n", str.Data()));