X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliESDTagCreator.cxx;h=52628d0abc56082d082cae7f2f94ec74c5589a21;hb=8f16115a61ede20ac71354ccf4a126d81c099942;hp=66b28d533e663d6139f3d75159bb6e592d80ae64;hpb=08e1a23e6712d3c7099e24f71bb905b47e76963e;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliESDTagCreator.cxx b/STEER/AliESDTagCreator.cxx index 66b28d533e6..52628d0abc5 100644 --- a/STEER/AliESDTagCreator.cxx +++ b/STEER/AliESDTagCreator.cxx @@ -26,7 +26,12 @@ #include #include #include +#include +#include #include +#include +#include +#include //ROOT-AliEn #include @@ -39,6 +44,7 @@ #include "AliESDEvent.h" #include "AliESDVertex.h" #include "AliLog.h" +#include "AliGRPObject.h" #include "AliESDTagCreator.h" @@ -48,13 +54,21 @@ ClassImp(AliESDTagCreator) //______________________________________________________________________________ AliESDTagCreator::AliESDTagCreator() : - AliTagCreator() { + AliTagCreator(), + fChain(new TChain("esdTree")), fGUIDList(new TList()), + fMD5List(new TList()), fTURLList(new TList()), fBranches(""), + meminfo(new MemInfo_t) { //==============Default constructor for a AliESDTagCreator================ } //______________________________________________________________________________ AliESDTagCreator::~AliESDTagCreator() { //================Default destructor for a AliESDTagCreator=================== + delete fChain; + delete fGUIDList; + delete fMD5List; + delete fTURLList; + delete meminfo; } //______________________________________________________________________________ @@ -63,9 +77,9 @@ Bool_t AliESDTagCreator::ReadGridCollection(TGridResult *fresult) { Int_t nEntries = fresult->GetEntries(); TString alienUrl; - const char *guid; - const char *md5; - const char *turl; + const char* guid; + const char* md5; + const char* turl; Long64_t size = -1; Int_t counter = 0; @@ -77,14 +91,31 @@ Bool_t AliESDTagCreator::ReadGridCollection(TGridResult *fresult) { turl = fresult->GetKey(i,"turl"); if(md5 && !strlen(guid)) md5 = 0; if(guid && !strlen(guid)) guid = 0; - - TFile *f = TFile::Open(alienUrl,"READ"); - CreateTag(f,guid,md5,turl,size,counter); - f->Close(); - delete f; + + fChain->Add(alienUrl); + //fGUIDList->Add(new TObjString(guid)); + //fMD5List->Add(new TObjString(md5)); + //fTURLList->Add(new TObjString(turl)); + + //TFile *f = TFile::Open(alienUrl,"READ"); + //CreateTag(f,guid,md5,turl,size,counter); + //f->Close(); + //delete f; counter += 1; }//grid result loop - + + if (fChain->GetEntries() > 0) { + AliInfo(Form("ESD chain created.......")); + AliInfo(Form("Chain entries: %lld",fChain->GetEntries())); + } else { + AliWarning(Form("No ESD files found !")); + return kFALSE; + } + + // Switch of branches on user request + SwitchOffBranches(); + CreateTag(fChain,"grid"); + return kTRUE; } @@ -109,16 +140,25 @@ Bool_t AliESDTagCreator::ReadLocalCollection(const char *localpath) { fESDFileName = fPath; fESDFileName += "/"; fESDFileName += pattern; - TFile *f = TFile::Open(fESDFileName,"READ"); - CreateTag(f,fESDFileName,counter); - f->Close(); - delete f; + + fChain->Add(fESDFileName); + + //TFile *f = TFile::Open(fESDFileName,"READ"); + //CreateTag(f,fESDFileName,counter); + //f->Close(); + //delete f; counter += 1; }//pattern check }//child directory's entry loop }//parent directory's entry loop + AliInfo(Form("ESD chain created.......")); + AliInfo(Form("Chain entries: %lld",fChain->GetEntries())); + // Switch of branches on user request + SwitchOffBranches(); + CreateTag(fChain,"local"); + return kTRUE; } @@ -137,17 +177,178 @@ Bool_t AliESDTagCreator::ReadCAFCollection(const char *filename) { while(in.good()) { in >> esdfile; if (!esdfile.Contains("root")) continue; // protection - TFile *f = TFile::Open(esdfile,"READ"); - CreateTag(f,esdfile,counter); - f->Close(); - delete f; + + fChain->Add(esdfile); + + //TFile *f = TFile::Open(esdfile,"READ"); + //CreateTag(f,esdfile,counter); + //f->Close(); + //delete f; counter += 1; } + AliInfo(Form("ESD chain created.......")); + AliInfo(Form("Chain entries: %lld",fChain->GetEntries())); + // Switch of branches on user request + SwitchOffBranches(); + CreateTag(fChain,"proof"); + return kTRUE; } +//_____________________________________________________________________________ +void AliESDTagCreator::CreateTag(TChain* chain, const char *type) { + //private method that creates tag files + TString fSession = type; + TString fguid, fmd5, fturl, foldguid; + TString fTempGuid; + + Int_t iRunNumber = 0; + //gSystem->GetMemInfo(meminfo); + //AliInfo(Form("After the tag initialization - Memory used: %d MB",meminfo->fMemUsed)); + //Int_t tempmem = meminfo->fMemUsed; + + AliInfo(Form("Creating the ESD tags.......")); + + Int_t firstEvent = 0,lastEvent = 0; + AliESDEvent *esd = new AliESDEvent(); + esd->ReadFromTree(chain); + // AliESD *esdold = 0x0; + + //gSystem->GetMemInfo(meminfo); + //AliInfo(Form("After the esd initialization - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem)); + //tempmem = meminfo->fMemUsed; + + Int_t iInitRunNumber = -1; + chain->GetEntry(0); + TFile *f = chain->GetFile(); + fTempGuid = f->GetUUID().AsString(); + + TString localFileName = "Run"; localFileName += esd->GetRunNumber(); + localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += chain->GetEntries(); //localFileName += "."; localFileName += Counter; + localFileName += ".ESD.tag.root"; + + TString fileName; + + if(fStorage == 0) { + fileName = localFileName.Data(); + AliInfo(Form("Writing tags to local file: %s",fileName.Data())); + } + else if(fStorage == 1) { + TString alienLocation = "/alien"; + alienLocation += gGrid->Pwd(); + alienLocation += fgridpath.Data(); + alienLocation += "/"; + alienLocation += localFileName; + alienLocation += "?se="; + alienLocation += fSE.Data(); + fileName = alienLocation.Data(); + AliInfo(Form("Writing tags to grid file: %s",fileName.Data())); + } + + TFile* ftag = TFile::Open(fileName, "recreate"); + + AliRunTag *tag = new AliRunTag(); + AliEventTag *evTag = new AliEventTag(); + TTree * ttag = new TTree("T","A Tree with event tags"); + TBranch * btag = ttag->Branch("AliTAG", &tag); + btag->SetCompressionLevel(9); + // Run related information + tag->SetMagneticField(esd->GetMagneticField()); + tag->SetBeamEnergy(esd->GetBeamEnergy()); + tag->SetBeamType(TString(esd->GetBeamType())); + tag->SetActiveTriggerClasses(esd->GetESDRun()->GetActiveTriggerClasses()); + + foldguid = ""; + + for(Int_t iEventNumber = 0; iEventNumber < chain->GetEntries(); iEventNumber++) { + FillEventTag(chain, evTag, iEventNumber, esd); + + if(iEventNumber == 0) iInitRunNumber = esd->GetRunNumber(); + iRunNumber = esd->GetRunNumber(); + if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD - You are trying to merge different runs!!!"); + + TFile *file = chain->GetFile(); + // const TUrl *url = file->GetEndpointUrl(); + fguid = file->GetUUID().AsString(); + + if (foldguid == fguid) { + tag->AddEventTag(*evTag); + } + else { + AliFileTag *nftag = new AliFileTag(); + +// if(fSession == "grid") { +// TString fturltemp = "alien://"; fturltemp += url->GetFile(); +// fturl = fturltemp(0,fturltemp.Index(".root",5,0,TString::kExact)+5); +// } +// else fturl = url->GetFile(); + fturl = file->GetName(); + + if(fSession == "grid") { + nftag->SetMD5(""); + nftag->SetTURL(fturl); + nftag->SetSize(0); + } + else { + nftag->SetPath(fturl); + nftag->SetSize(0); + nftag->SetMD5(""); + nftag->SetTURL(fturl); + } + foldguid = fguid; + + if (tag->GetFileId(fguid) > -1) + AliFatal("Adding a file which is already in the RunTag."); + + tag->AddFileTag(nftag); + } + + tag->SetRunId(iInitRunNumber); +// if(fIsSim) tag->SetDataType(0); +// else tag->SetDataType(1); + +// if(fguid != fTempGuid) { +// fTempGuid = fguid; +// ttag->Fill(); +// tag->Clear(""); +// } + if(iEventNumber+1 == chain->GetEntries()) { + //AliInfo(Form("File: %s",fturl.Data())); + + ttag->Fill(); + tag->Clear(""); + } + }//event loop + lastEvent = chain->GetEntries(); + + //gSystem->GetMemInfo(meminfo); + //AliInfo(Form("After the event and track loop - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem)); + //tempmem = meminfo->fMemUsed; + + //chain->Delete(""); + + //gSystem->GetMemInfo(meminfo); + //AliInfo(Form("After the t->Delete - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem)); + //tempmem = meminfo->fMemUsed; + + ftag->cd(); + tag->Clear(); + ttag->Write(); + ftag->Close(); + + //gSystem->GetMemInfo(meminfo); + //AliInfo(Form("After the file closing - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem)); + //tempmem = meminfo->fMemUsed; + + delete esd; + delete tag; + + //gSystem->GetMemInfo(meminfo); + //AliInfo(Form("After the delete objects - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem)); +} + //_____________________________________________________________________________ void AliESDTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, const char *turl, Long64_t size, Int_t Counter) { //private method that creates tag files @@ -157,258 +358,74 @@ void AliESDTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, ///////////// //muon code// //////////// - Double_t fMUONMASS = 0.105658369; + // Double_t fMUONMASS = 0.105658369; //Variables - Double_t fX,fY,fZ ; - Double_t fThetaX, fThetaY, fPyz, fChisquare; - Double_t fPxRec, fPyRec, fPzRec, fEnergy; - Int_t fCharge; - TLorentzVector fEPvector; - - Float_t fZVertexCut = 10.0; - Float_t fRhoVertexCut = 2.0; - - Float_t fLowPtCut = 1.0; - Float_t fHighPtCut = 3.0; - Float_t fVeryHighPtCut = 10.0; +// Double_t fX,fY,fZ ; +// Double_t fThetaX, fThetaY, fPyz, fChisquare; +// Double_t fPxRec, fPyRec, fPzRec, fEnergy; +// Int_t fCharge; +// TLorentzVector fEPvector; + +// Float_t fLowPtCut = 1.0; +// Float_t fHighPtCut = 3.0; +// Float_t fVeryHighPtCut = 10.0; //////////// - Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05}; +// Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05}; // Creates the tags for all the events in a given ESD file Bool_t fIsSim = kTRUE; - Int_t ntrack; - Int_t nProtons, nKaons, nPions, nMuons, nElectrons; - Int_t nPos, nNeg, nNeutr; - Int_t nK0s, nNeutrons, nPi0s, nGamas; - Int_t nCh1GeV, nCh3GeV, nCh10GeV; - Int_t nMu1GeV, nMu3GeV, nMu10GeV; - Int_t nEl1GeV, nEl3GeV, nEl10GeV; - Float_t maxPt = .0, meanPt = .0, totalP = .0; - Int_t fVertexflag; +// Int_t ntrack; +// Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons, nFWMatchedMuons; +// Int_t nPos, nNeg, nNeutr; +// Int_t nK0s, nNeutrons, nPi0s, nGamas; +// Int_t nCh1GeV, nCh3GeV, nCh10GeV; +// Int_t nMu1GeV, nMu3GeV, nMu10GeV; +// Int_t nEl1GeV, nEl3GeV, nEl10GeV; +// Float_t maxPt = .0, etamaxPt = -999., phimaxPt = -999., meanPt = .0, totalP = .0; +// Int_t fVertexflag; Int_t iRunNumber = 0; - TString fVertexName; +// TString fVertexName; +// TRefArray tmp; AliRunTag *tag = new AliRunTag(); AliEventTag *evTag = new AliEventTag(); - TTree ttag("T","A Tree with event tags"); - TBranch * btag = ttag.Branch("AliTAG", &tag); + TTree * ttag = new TTree("T","A Tree with event tags"); + TBranch * btag = ttag->Branch("AliTAG", &tag); btag->SetCompressionLevel(9); + gSystem->GetMemInfo(meminfo); + AliInfo(Form("After the tag initialization - Memory used: %d MB",meminfo->fMemUsed)); + Int_t tempmem = meminfo->fMemUsed; - AliInfo(Form("Creating the tags.......")); + AliInfo(Form("Creating the ESD tags.......")); Int_t firstEvent = 0,lastEvent = 0; TTree *t = (TTree*) file->Get("esdTree"); AliESDEvent *esd = new AliESDEvent(); esd->ReadFromTree(t); + gSystem->GetMemInfo(meminfo); + AliInfo(Form("After the esd initialization - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem)); + tempmem = meminfo->fMemUsed; + t->GetEntry(0); Int_t iInitRunNumber = esd->GetRunNumber(); + tag->SetMagneticField(esd->GetMagneticField()); + tag->SetBeamEnergy(esd->GetBeamEnergy()); + tag->SetBeamType(TString(esd->GetBeamType())); + tag->SetActiveTriggerClasses(esd->GetESDRun()->GetActiveTriggerClasses()); + + AliFileTag *eftag = new AliFileTag(); + eftag->SetMD5(md5); + eftag->SetTURL(fturl); + eftag->SetSize(size); + tag->AddFileTag(eftag); Int_t iNumberOfEvents = (Int_t)t->GetEntries(); for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) { - ntrack = 0; - nPos = 0; - nNeg = 0; - nNeutr =0; - nK0s = 0; - nNeutrons = 0; - nPi0s = 0; - nGamas = 0; - nProtons = 0; - nKaons = 0; - nPions = 0; - nMuons = 0; - nElectrons = 0; - nCh1GeV = 0; - nCh3GeV = 0; - nCh10GeV = 0; - nMu1GeV = 0; - nMu3GeV = 0; - nMu10GeV = 0; - nEl1GeV = 0; - nEl3GeV = 0; - nEl10GeV = 0; - maxPt = .0; - meanPt = .0; - totalP = .0; - fVertexflag = 1; - - t->GetEntry(iEventNumber); + FillEventTag(t, evTag, iEventNumber, esd); iRunNumber = esd->GetRunNumber(); if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!"); - const AliESDVertex * vertexIn = esd->GetVertex(); - fVertexName = vertexIn->GetName(); - if(fVertexName == "default") fVertexflag = 0; - - for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) { - AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber); - if(esdTrack->GetLabel() != 0) fIsSim = kTRUE; - else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE; - UInt_t status = esdTrack->GetStatus(); - - //select only tracks with ITS refit - if ((status&AliESDtrack::kITSrefit)==0) continue; - //select only tracks with TPC refit - if ((status&AliESDtrack::kTPCrefit)==0) continue; - - //select only tracks with the "combined PID" - if ((status&AliESDtrack::kESDpid)==0) continue; - Double_t p[3]; - esdTrack->GetPxPyPz(p); - Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2)); - Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2)); - totalP += momentum; - meanPt += fPt; - if(fPt > maxPt) maxPt = fPt; - - if(esdTrack->GetSign() > 0) { - nPos++; - if(fPt > fLowPtCut) nCh1GeV++; - if(fPt > fHighPtCut) nCh3GeV++; - if(fPt > fVeryHighPtCut) nCh10GeV++; - } - if(esdTrack->GetSign() < 0) { - nNeg++; - if(fPt > fLowPtCut) nCh1GeV++; - if(fPt > fHighPtCut) nCh3GeV++; - if(fPt > fVeryHighPtCut) nCh10GeV++; - } - if(esdTrack->GetSign() == 0) nNeutr++; - - //PID - Double_t prob[5]; - esdTrack->GetESDpid(prob); - - Double_t rcc = 0.0; - for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i]; - if(rcc == 0.0) continue; - //Bayes' formula - Double_t w[5]; - for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc; - - //protons - if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++; - //kaons - if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++; - //pions - if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++; - //electrons - if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) { - nElectrons++; - if(fPt > fLowPtCut) nEl1GeV++; - if(fPt > fHighPtCut) nEl3GeV++; - if(fPt > fVeryHighPtCut) nEl10GeV++; - } - ntrack++; - }//esd track loop - - ///////////// - //muon code// - //////////// - Int_t nMuonTracks = esd->GetNumberOfMuonTracks(); - // loop over all reconstructed tracks (also first track of combination) - for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) { - AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack); - if (muonTrack == 0x0) continue; - - // Coordinates at vertex - fZ = muonTrack->GetZ(); - fY = muonTrack->GetBendingCoor(); - fX = muonTrack->GetNonBendingCoor(); - - fThetaX = muonTrack->GetThetaX(); - fThetaY = muonTrack->GetThetaY(); - - fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum()); - fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY)); - fPxRec = fPzRec * TMath::Tan(fThetaX); - fPyRec = fPzRec * TMath::Tan(fThetaY); - fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum())); - - //ChiSquare of the track if needed - fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5); - fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec); - fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy); - - // total number of muons inside a vertex cut - if((TMath::Abs(fZ) fLowPtCut) { - nMu1GeV++; - if(fEPvector.Pt() > fHighPtCut) { - nMu3GeV++; - if (fEPvector.Pt() > fVeryHighPtCut) { - nMu10GeV++; - } - } - } - } - }//muon track loop - - // Fill the event tags - if(ntrack != 0) meanPt = meanPt/ntrack; - - evTag->SetEventId(iEventNumber+1); - evTag->SetGUID(fguid); - evTag->SetMD5(fmd5); - evTag->SetTURL(fturl); - evTag->SetSize(size); - evTag->SetVertexX(vertexIn->GetXv()); - evTag->SetVertexY(vertexIn->GetYv()); - evTag->SetVertexZ(vertexIn->GetZv()); - evTag->SetVertexZError(vertexIn->GetZRes()); - evTag->SetVertexFlag(fVertexflag); - - evTag->SetT0VertexZ(esd->GetT0zVertex()); - - evTag->SetTriggerMask(esd->GetTriggerMask()); - evTag->SetTriggerCluster(esd->GetTriggerCluster()); - - evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy()); - evTag->SetZDCProton1Energy(esd->GetZDCP1Energy()); - evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy()); - evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy()); - evTag->SetZDCProton1Energy(esd->GetZDCP2Energy()); - evTag->SetNumOfParticipants(esd->GetZDCParticipants()); - - - evTag->SetNumOfTracks(esd->GetNumberOfTracks()); - evTag->SetNumOfPosTracks(nPos); - evTag->SetNumOfNegTracks(nNeg); - evTag->SetNumOfNeutrTracks(nNeutr); - - evTag->SetNumOfV0s(esd->GetNumberOfV0s()); - evTag->SetNumOfCascades(esd->GetNumberOfCascades()); - evTag->SetNumOfKinks(esd->GetNumberOfKinks()); - evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks()); - - evTag->SetNumOfProtons(nProtons); - evTag->SetNumOfKaons(nKaons); - evTag->SetNumOfPions(nPions); - evTag->SetNumOfMuons(nMuons); - evTag->SetNumOfElectrons(nElectrons); - evTag->SetNumOfPhotons(nGamas); - evTag->SetNumOfPi0s(nPi0s); - evTag->SetNumOfNeutrons(nNeutrons); - evTag->SetNumOfKaon0s(nK0s); - - evTag->SetNumOfChargedAbove1GeV(nCh1GeV); - evTag->SetNumOfChargedAbove3GeV(nCh3GeV); - evTag->SetNumOfChargedAbove10GeV(nCh10GeV); - evTag->SetNumOfMuonsAbove1GeV(nMu1GeV); - evTag->SetNumOfMuonsAbove3GeV(nMu3GeV); - evTag->SetNumOfMuonsAbove10GeV(nMu10GeV); - evTag->SetNumOfElectronsAbove1GeV(nEl1GeV); - evTag->SetNumOfElectronsAbove3GeV(nEl3GeV); - evTag->SetNumOfElectronsAbove10GeV(nEl10GeV); - - evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters()); - evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters()); - - evTag->SetTotalMomentum(totalP); - evTag->SetMeanPt(meanPt); - evTag->SetMaxPt(maxPt); tag->SetRunId(iInitRunNumber); if(fIsSim) tag->SetDataType(0); @@ -417,10 +434,14 @@ void AliESDTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, }//event loop lastEvent = iNumberOfEvents; + gSystem->GetMemInfo(meminfo); + AliInfo(Form("After the event and track loop - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem)); + tempmem = meminfo->fMemUsed; t->Delete(""); - ttag.Fill(); - tag->Clear(); + gSystem->GetMemInfo(meminfo); + AliInfo(Form("After the t->Delete - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem)); + tempmem = meminfo->fMemUsed; TString localFileName = "Run"; localFileName += tag->GetRunId(); localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter; @@ -446,13 +467,21 @@ void AliESDTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, TFile* ftag = TFile::Open(fileName, "recreate"); ftag->cd(); - ttag.Write(); + ttag->Fill(); + tag->Clear(); + ttag->Write(); ftag->Close(); + gSystem->GetMemInfo(meminfo); + AliInfo(Form("After the file closing - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem)); + tempmem = meminfo->fMemUsed; + delete ftag; delete esd; delete tag; + gSystem->GetMemInfo(meminfo); + AliInfo(Form("After the delete objects - Memory used: %d MB - Increase: %d MB",meminfo->fMemUsed,meminfo->fMemUsed - tempmem)); } //_____________________________________________________________________________ @@ -461,45 +490,43 @@ void AliESDTagCreator::CreateTag(TFile* file, const char *filepath, Int_t Counte ///////////// //muon code// //////////// - Double_t fMUONMASS = 0.105658369; + // Double_t fMUONMASS = 0.105658369; //Variables - Double_t fX,fY,fZ ; - Double_t fThetaX, fThetaY, fPyz, fChisquare; - Double_t fPxRec, fPyRec, fPzRec, fEnergy; - Int_t fCharge; - TLorentzVector fEPvector; - - Float_t fZVertexCut = 10.0; - Float_t fRhoVertexCut = 2.0; - - Float_t fLowPtCut = 1.0; - Float_t fHighPtCut = 3.0; - Float_t fVeryHighPtCut = 10.0; +// Double_t fX,fY,fZ ; +// Double_t fThetaX, fThetaY, fPyz, fChisquare; +// Double_t fPxRec, fPyRec, fPzRec, fEnergy; +// Int_t fCharge; +// TLorentzVector fEPvector; + +// Float_t fLowPtCut = 1.0; +// Float_t fHighPtCut = 3.0; +// Float_t fVeryHighPtCut = 10.0; //////////// - Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05}; +// Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05}; // Creates the tags for all the events in a given ESD file - Bool_t fIsSim = kTRUE; - Int_t ntrack; - Int_t nProtons, nKaons, nPions, nMuons, nElectrons; - Int_t nPos, nNeg, nNeutr; - Int_t nK0s, nNeutrons, nPi0s, nGamas; - Int_t nCh1GeV, nCh3GeV, nCh10GeV; - Int_t nMu1GeV, nMu3GeV, nMu10GeV; - Int_t nEl1GeV, nEl3GeV, nEl10GeV; - Float_t maxPt = .0, meanPt = .0, totalP = .0; - Int_t fVertexflag; +// Bool_t fIsSim = kTRUE; +// Int_t ntrack; +// Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons, nFWMatchedMuons; +// Int_t nPos, nNeg, nNeutr; +// Int_t nK0s, nNeutrons, nPi0s, nGamas; +// Int_t nCh1GeV, nCh3GeV, nCh10GeV; +// Int_t nMu1GeV, nMu3GeV, nMu10GeV; +// Int_t nEl1GeV, nEl3GeV, nEl10GeV; +// Float_t maxPt = .0, etamaxPt = -999, phimaxPt = -999., meanPt = .0, totalP = .0; +// Int_t fVertexflag; Int_t iRunNumber = 0; - TString fVertexName; +// TString fVertexName; +// TRefArray tmp; AliRunTag *tag = new AliRunTag(); AliEventTag *evTag = new AliEventTag(); - TTree ttag("T","A Tree with event tags"); - TBranch * btag = ttag.Branch("AliTAG", &tag); + TTree * ttag = new TTree("T","A Tree with event tags"); + TBranch * btag = ttag->Branch("AliTAG", &tag); btag->SetCompressionLevel(9); - AliInfo(Form("Creating the tags.......")); + AliInfo(Form("Creating the ESD tags.......")); Int_t firstEvent = 0,lastEvent = 0; @@ -509,222 +536,34 @@ void AliESDTagCreator::CreateTag(TFile* file, const char *filepath, Int_t Counte t->GetEntry(0); Int_t iInitRunNumber = esd->GetRunNumber(); + tag->SetMagneticField(esd->GetMagneticField()); + tag->SetBeamEnergy(esd->GetBeamEnergy()); + tag->SetBeamType(TString(esd->GetBeamType())); + tag->SetActiveTriggerClasses(esd->GetESDRun()->GetActiveTriggerClasses()); + + AliFileTag *eftag = new AliFileTag(); + eftag->SetPath(filepath); + eftag->SetTURL(Form("local://%s", filepath)); + eftag->SetSize(0); + eftag->SetMD5(""); + tag->AddFileTag(eftag); Int_t iNumberOfEvents = (Int_t)t->GetEntries(); for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) { - ntrack = 0; - nPos = 0; - nNeg = 0; - nNeutr =0; - nK0s = 0; - nNeutrons = 0; - nPi0s = 0; - nGamas = 0; - nProtons = 0; - nKaons = 0; - nPions = 0; - nMuons = 0; - nElectrons = 0; - nCh1GeV = 0; - nCh3GeV = 0; - nCh10GeV = 0; - nMu1GeV = 0; - nMu3GeV = 0; - nMu10GeV = 0; - nEl1GeV = 0; - nEl3GeV = 0; - nEl10GeV = 0; - maxPt = .0; - meanPt = .0; - totalP = .0; - fVertexflag = 1; - - t->GetEntry(iEventNumber); + FillEventTag(t, evTag, iEventNumber, esd); iRunNumber = esd->GetRunNumber(); if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!"); - const AliESDVertex * vertexIn = esd->GetVertex(); - fVertexName = vertexIn->GetName(); - if(fVertexName == "default") fVertexflag = 0; - - for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) { - AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber); - if(esdTrack->GetLabel() != 0) fIsSim = kTRUE; - else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE; - UInt_t status = esdTrack->GetStatus(); - - //select only tracks with ITS refit - if ((status&AliESDtrack::kITSrefit)==0) continue; - //select only tracks with TPC refit - if ((status&AliESDtrack::kTPCrefit)==0) continue; - - //select only tracks with the "combined PID" - if ((status&AliESDtrack::kESDpid)==0) continue; - Double_t p[3]; - esdTrack->GetPxPyPz(p); - Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2)); - Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2)); - totalP += momentum; - meanPt += fPt; - if(fPt > maxPt) maxPt = fPt; - - if(esdTrack->GetSign() > 0) { - nPos++; - if(fPt > fLowPtCut) nCh1GeV++; - if(fPt > fHighPtCut) nCh3GeV++; - if(fPt > fVeryHighPtCut) nCh10GeV++; - } - if(esdTrack->GetSign() < 0) { - nNeg++; - if(fPt > fLowPtCut) nCh1GeV++; - if(fPt > fHighPtCut) nCh3GeV++; - if(fPt > fVeryHighPtCut) nCh10GeV++; - } - if(esdTrack->GetSign() == 0) nNeutr++; - - //PID - Double_t prob[5]; - esdTrack->GetESDpid(prob); - - Double_t rcc = 0.0; - for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i]; - if(rcc == 0.0) continue; - //Bayes' formula - Double_t w[5]; - for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc; - - //protons - if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++; - //kaons - if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++; - //pions - if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++; - //electrons - if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) { - nElectrons++; - if(fPt > fLowPtCut) nEl1GeV++; - if(fPt > fHighPtCut) nEl3GeV++; - if(fPt > fVeryHighPtCut) nEl10GeV++; - } - ntrack++; - }//esd track loop - - ///////////// - //muon code// - //////////// - Int_t nMuonTracks = esd->GetNumberOfMuonTracks(); - // loop over all reconstructed tracks (also first track of combination) - for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) { - AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack); - if (muonTrack == 0x0) continue; - - // Coordinates at vertex - fZ = muonTrack->GetZ(); - fY = muonTrack->GetBendingCoor(); - fX = muonTrack->GetNonBendingCoor(); - - fThetaX = muonTrack->GetThetaX(); - fThetaY = muonTrack->GetThetaY(); - - fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum()); - fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY)); - fPxRec = fPzRec * TMath::Tan(fThetaX); - fPyRec = fPzRec * TMath::Tan(fThetaY); - fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum())); - - //ChiSquare of the track if needed - fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5); - fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec); - fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy); - - // total number of muons inside a vertex cut - if((TMath::Abs(fZ) fLowPtCut) { - nMu1GeV++; - if(fEPvector.Pt() > fHighPtCut) { - nMu3GeV++; - if (fEPvector.Pt() > fVeryHighPtCut) { - nMu10GeV++; - } - } - } - } - }//muon track loop - - // Fill the event tags - if(ntrack != 0) meanPt = meanPt/ntrack; - - evTag->SetEventId(iEventNumber+1); - evTag->SetPath(filepath); - - evTag->SetVertexX(vertexIn->GetXv()); - evTag->SetVertexY(vertexIn->GetYv()); - evTag->SetVertexZ(vertexIn->GetZv()); - evTag->SetVertexZError(vertexIn->GetZRes()); - evTag->SetVertexFlag(fVertexflag); - - evTag->SetT0VertexZ(esd->GetT0zVertex()); - - evTag->SetTriggerMask(esd->GetTriggerMask()); - evTag->SetTriggerCluster(esd->GetTriggerCluster()); - - evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy()); - evTag->SetZDCProton1Energy(esd->GetZDCP1Energy()); - evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy()); - evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy()); - evTag->SetZDCProton1Energy(esd->GetZDCP2Energy()); - evTag->SetNumOfParticipants(esd->GetZDCParticipants()); - - - evTag->SetNumOfTracks(esd->GetNumberOfTracks()); - evTag->SetNumOfPosTracks(nPos); - evTag->SetNumOfNegTracks(nNeg); - evTag->SetNumOfNeutrTracks(nNeutr); - - evTag->SetNumOfV0s(esd->GetNumberOfV0s()); - evTag->SetNumOfCascades(esd->GetNumberOfCascades()); - evTag->SetNumOfKinks(esd->GetNumberOfKinks()); - evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks()); - - evTag->SetNumOfProtons(nProtons); - evTag->SetNumOfKaons(nKaons); - evTag->SetNumOfPions(nPions); - evTag->SetNumOfMuons(nMuons); - evTag->SetNumOfElectrons(nElectrons); - evTag->SetNumOfPhotons(nGamas); - evTag->SetNumOfPi0s(nPi0s); - evTag->SetNumOfNeutrons(nNeutrons); - evTag->SetNumOfKaon0s(nK0s); - - evTag->SetNumOfChargedAbove1GeV(nCh1GeV); - evTag->SetNumOfChargedAbove3GeV(nCh3GeV); - evTag->SetNumOfChargedAbove10GeV(nCh10GeV); - evTag->SetNumOfMuonsAbove1GeV(nMu1GeV); - evTag->SetNumOfMuonsAbove3GeV(nMu3GeV); - evTag->SetNumOfMuonsAbove10GeV(nMu10GeV); - evTag->SetNumOfElectronsAbove1GeV(nEl1GeV); - evTag->SetNumOfElectronsAbove3GeV(nEl3GeV); - evTag->SetNumOfElectronsAbove10GeV(nEl10GeV); - - evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters()); - evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters()); - - evTag->SetTotalMomentum(totalP); - evTag->SetMeanPt(meanPt); - evTag->SetMaxPt(maxPt); + // evTag->SetPath(filepath); tag->SetRunId(iInitRunNumber); - if(fIsSim) tag->SetDataType(0); - else tag->SetDataType(1); +// if(fIsSim) tag->SetDataType(0); +// else tag->SetDataType(1); tag->AddEventTag(*evTag); }//event loop lastEvent = iNumberOfEvents; t->Delete(""); - ttag.Fill(); - tag->Clear(); - TString localFileName = "Run"; localFileName += tag->GetRunId(); localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter; localFileName += ".ESD.tag.root"; @@ -749,7 +588,9 @@ void AliESDTagCreator::CreateTag(TFile* file, const char *filepath, Int_t Counte TFile* ftag = TFile::Open(fileName, "recreate"); ftag->cd(); - ttag.Write(); + ttag->Fill(); + tag->Clear(); + ttag->Write(); ftag->Close(); delete ftag; @@ -759,62 +600,65 @@ void AliESDTagCreator::CreateTag(TFile* file, const char *filepath, Int_t Counte } //_____________________________________________________________________________ -void AliESDTagCreator::CreateESDTags(Int_t fFirstEvent, Int_t fLastEvent) { +void AliESDTagCreator::CreateESDTags(Int_t fFirstEvent, Int_t fLastEvent, AliGRPObject *grpData, ULong_t * qa, Bool_t * es, Int_t qalength, Int_t eslength) { //GRP Float_t lhcLuminosity = 0.0; TString lhcState = "test"; - UInt_t detectorMask = 0; + //UInt_t detectorMask = 0; + Int_t detectorMask = 0; + + detectorMask = grpData->GetDetectorMask(); + time_t startTime = grpData->GetTimeStart(); + TTimeStamp t1(startTime); + time_t endTime = grpData->GetTimeEnd(); + TTimeStamp t2(endTime); + const char* beamtype = grpData->GetBeamType(); + Float_t beamenergy = grpData->GetBeamEnergy(); + ///////////// //muon code// //////////// - Double_t fMUONMASS = 0.105658369; +// Double_t fMUONMASS = 0.105658369; //Variables - Double_t fX,fY,fZ ; - Double_t fThetaX, fThetaY, fPyz, fChisquare; - Double_t fPxRec,fPyRec, fPzRec, fEnergy; - Int_t fCharge; - TLorentzVector fEPvector; - - Float_t fZVertexCut = 10.0; - Float_t fRhoVertexCut = 2.0; - - Float_t fLowPtCut = 1.0; - Float_t fHighPtCut = 3.0; - Float_t fVeryHighPtCut = 10.0; +// Double_t fX,fY,fZ ; +// Double_t fThetaX, fThetaY, fPyz, fChisquare; +// Double_t fPxRec,fPyRec, fPzRec, fEnergy; +// Int_t fCharge; +// TLorentzVector fEPvector; + +// Float_t fLowPtCut = 1.0; +// Float_t fHighPtCut = 3.0; +// Float_t fVeryHighPtCut = 10.0; //////////// - Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05}; +// Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05}; // Creates the tags for all the events in a given ESD file - Int_t ntrack; - Int_t nProtons, nKaons, nPions, nMuons, nElectrons; - Int_t nPos, nNeg, nNeutr; - Int_t nK0s, nNeutrons, nPi0s, nGamas; - Int_t nCh1GeV, nCh3GeV, nCh10GeV; - Int_t nMu1GeV, nMu3GeV, nMu10GeV; - Int_t nEl1GeV, nEl3GeV, nEl10GeV; - Float_t maxPt = .0, meanPt = .0, totalP = .0; - Int_t fVertexflag; +// Int_t ntrack; +// Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons, nFWMatchedMuons; +// Int_t nPos, nNeg, nNeutr; +// Int_t nK0s, nNeutrons, nPi0s, nGamas; +// Int_t nCh1GeV, nCh3GeV, nCh10GeV; +// Int_t nMu1GeV, nMu3GeV, nMu10GeV; +// Int_t nEl1GeV, nEl3GeV, nEl10GeV; +// Float_t maxPt = .0, etamaxPt = -999., phimaxPt = -999., meanPt = .0, totalP = .0; +// Int_t fVertexflag; Int_t iRunNumber = 0; - TString fVertexName("default"); - - AliRunTag *tag = new AliRunTag(); - AliEventTag *evTag = new AliEventTag(); - TTree ttag("T","A Tree with event tags"); - TBranch * btag = ttag.Branch("AliTAG", &tag); - btag->SetCompressionLevel(9); + TString fguid, fmd5, fturl; +// TString fVertexName("default"); +// TRefArray tmp; - AliInfo(Form("Creating the tags.......")); + AliInfo(Form("Creating the ESD tags.......")); - TFile *file = TFile::Open("AliESDs.root"); - if (!file || !file->IsOpen()) { + TFile *esdfile = TFile::Open("AliESDs.root"); + if (!esdfile || !esdfile->IsOpen()) { AliError(Form("opening failed")); - delete file; + delete esdfile; return ; } Int_t lastEvent = 0; - TTree *b = (TTree*) file->Get("esdTree"); + TTree *b = (TTree*) esdfile->Get("esdTree"); AliESDEvent *esd = new AliESDEvent(); esd->ReadFromTree(b); @@ -822,441 +666,620 @@ void AliESDTagCreator::CreateESDTags(Int_t fFirstEvent, Int_t fLastEvent) { Int_t iInitRunNumber = esd->GetRunNumber(); Int_t iNumberOfEvents = (Int_t)b->GetEntries(); - if(fLastEvent != -1) iNumberOfEvents = fLastEvent + 1; + if ((fLastEvent == -1) || ((Int_t) b->GetEntries() < fLastEvent)) + lastEvent = (Int_t)b->GetEntries(); + else lastEvent = fLastEvent; + + char fileName[256]; + sprintf(fileName, "Run%d.Event%d_%d.ESD.tag.root", + iInitRunNumber,fFirstEvent,lastEvent); + AliInfo(Form("writing tags to file %s", fileName)); + AliDebug(1, Form("writing tags to file %s", fileName)); + + TFile* ftag = TFile::Open(fileName, "recreate"); + + AliRunTag *tag = new AliRunTag(); + AliEventTag *evTag = new AliEventTag(); + TTree * ttag = new TTree("T","A Tree with event tags"); + TBranch * btag = ttag->Branch("AliTAG", &tag); + btag->SetCompressionLevel(9); + + if ((fLastEvent != -1) && ((Int_t) b->GetEntries() > fLastEvent)) + iNumberOfEvents = fLastEvent + 1; + + AliFileTag *eftag = new AliFileTag(); + tag->AddFileTag(eftag); + for (Int_t iEventNumber = fFirstEvent; iEventNumber < iNumberOfEvents; iEventNumber++) { - ntrack = 0; - nPos = 0; - nNeg = 0; - nNeutr =0; - nK0s = 0; - nNeutrons = 0; - nPi0s = 0; - nGamas = 0; - nProtons = 0; - nKaons = 0; - nPions = 0; - nMuons = 0; - nElectrons = 0; - nCh1GeV = 0; - nCh3GeV = 0; - nCh10GeV = 0; - nMu1GeV = 0; - nMu3GeV = 0; - nMu10GeV = 0; - nEl1GeV = 0; - nEl3GeV = 0; - nEl10GeV = 0; - maxPt = .0; - meanPt = .0; - totalP = .0; - fVertexflag = 0; - - b->GetEntry(iEventNumber); + FillEventTag(b, evTag, iEventNumber, esd); iRunNumber = esd->GetRunNumber(); if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!"); - const AliESDVertex * vertexIn = esd->GetVertex(); - if (!vertexIn) AliError("ESD has not defined vertex."); - if (vertexIn) fVertexName = vertexIn->GetName(); - if(fVertexName != "default") fVertexflag = 1; - for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) { - AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber); - UInt_t status = esdTrack->GetStatus(); - - //select only tracks with ITS refit - if ((status&AliESDtrack::kITSrefit)==0) continue; - //select only tracks with TPC refit - if ((status&AliESDtrack::kTPCrefit)==0) continue; - - //select only tracks with the "combined PID" - if ((status&AliESDtrack::kESDpid)==0) continue; - Double_t p[3]; - esdTrack->GetPxPyPz(p); - Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2)); - Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2)); - totalP += momentum; - meanPt += fPt; - if(fPt > maxPt) maxPt = fPt; + + if (iEventNumber == fFirstEvent) { + TFile *file = b->GetCurrentFile(); +// const TUrl *url = file->GetEndpointUrl(); + fguid = file->GetUUID().AsString(); + +// if(fStorage == 1) { +// TString fturltemp = "alien://"; fturltemp += url->GetFile(); +// fturl = fturltemp(0,fturltemp.Index(".root",5,0,TString::kExact)+5); +// } +// else fturl = url->GetFile(); + fturl = file->GetName(); - if(esdTrack->GetSign() > 0) { - nPos++; - if(fPt > fLowPtCut) nCh1GeV++; - if(fPt > fHighPtCut) nCh3GeV++; - if(fPt > fVeryHighPtCut) nCh10GeV++; + // evTag->SetGUID(fguid); + ((AliFileTag *) tag->GetFileTag(tag->GetNFiles()-1))->SetGUID(fguid); + if(fStorage == 1) { + ((AliFileTag *) tag->GetFileTag(tag->GetNFiles()-1))->SetMD5(""); + ((AliFileTag *) tag->GetFileTag(tag->GetNFiles()-1))->SetTURL(fturl); + ((AliFileTag *) tag->GetFileTag(tag->GetNFiles()-1))->SetSize(0); } - if(esdTrack->GetSign() < 0) { - nNeg++; - if(fPt > fLowPtCut) nCh1GeV++; - if(fPt > fHighPtCut) nCh3GeV++; - if(fPt > fVeryHighPtCut) nCh10GeV++; - } - if(esdTrack->GetSign() == 0) nNeutr++; - - //PID - Double_t prob[5]; - esdTrack->GetESDpid(prob); - - Double_t rcc = 0.0; - for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i]; - if(rcc == 0.0) continue; - //Bayes' formula - Double_t w[5]; - for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc; - - //protons - if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++; - //kaons - if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++; - //pions - if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++; - //electrons - if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) { - nElectrons++; - if(fPt > fLowPtCut) nEl1GeV++; - if(fPt > fHighPtCut) nEl3GeV++; - if(fPt > fVeryHighPtCut) nEl10GeV++; - } - ntrack++; - }//track loop - - ///////////// - //muon code// - //////////// - Int_t nMuonTracks = esd->GetNumberOfMuonTracks(); - // loop over all reconstructed tracks (also first track of combination) - for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) { - AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack); - if (muonTrack == 0x0) continue; - - // Coordinates at vertex - fZ = muonTrack->GetZ(); - fY = muonTrack->GetBendingCoor(); - fX = muonTrack->GetNonBendingCoor(); - - fThetaX = muonTrack->GetThetaX(); - fThetaY = muonTrack->GetThetaY(); - - fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum()); - fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY)); - fPxRec = fPzRec * TMath::Tan(fThetaX); - fPyRec = fPzRec * TMath::Tan(fThetaY); - fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum())); - - //ChiSquare of the track if needed - fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5); - fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec); - fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy); - - // total number of muons inside a vertex cut - if((TMath::Abs(fZ) fLowPtCut) { - nMu1GeV++; - if(fEPvector.Pt() > fHighPtCut) { - nMu3GeV++; - if (fEPvector.Pt() > fVeryHighPtCut) { - nMu10GeV++; - } - } - } + else { + // evTag->SetPath(fturl); + ((AliFileTag *) tag->GetFileTag(tag->GetNFiles()-1))->SetPath(fturl); + ((AliFileTag *) tag->GetFileTag(tag->GetNFiles()-1))->SetMD5(""); + ((AliFileTag *) tag->GetFileTag(tag->GetNFiles()-1))->SetSize(0); } - }//muon track loop - - // Fill the event tags - if(ntrack != 0) - meanPt = meanPt/ntrack; - - evTag->SetEventId(iEventNumber+1); - if (vertexIn) { - evTag->SetVertexX(vertexIn->GetXv()); - evTag->SetVertexY(vertexIn->GetYv()); - evTag->SetVertexZ(vertexIn->GetZv()); - evTag->SetVertexZError(vertexIn->GetZRes()); - } - evTag->SetVertexFlag(fVertexflag); - - evTag->SetT0VertexZ(esd->GetT0zVertex()); - - evTag->SetTriggerMask(esd->GetTriggerMask()); - evTag->SetTriggerCluster(esd->GetTriggerCluster()); - - evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy()); - evTag->SetZDCProton1Energy(esd->GetZDCP1Energy()); - evTag->SetZDCNeutron2Energy(esd->GetZDCN2Energy()); - evTag->SetZDCProton2Energy(esd->GetZDCP2Energy()); - evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy()); - evTag->SetNumOfParticipants(esd->GetZDCParticipants()); - - - evTag->SetNumOfTracks(esd->GetNumberOfTracks()); - evTag->SetNumOfPosTracks(nPos); - evTag->SetNumOfNegTracks(nNeg); - evTag->SetNumOfNeutrTracks(nNeutr); - - evTag->SetNumOfV0s(esd->GetNumberOfV0s()); - evTag->SetNumOfCascades(esd->GetNumberOfCascades()); - evTag->SetNumOfKinks(esd->GetNumberOfKinks()); - evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks()); - - evTag->SetNumOfProtons(nProtons); - evTag->SetNumOfKaons(nKaons); - evTag->SetNumOfPions(nPions); - evTag->SetNumOfMuons(nMuons); - evTag->SetNumOfElectrons(nElectrons); - evTag->SetNumOfPhotons(nGamas); - evTag->SetNumOfPi0s(nPi0s); - evTag->SetNumOfNeutrons(nNeutrons); - evTag->SetNumOfKaon0s(nK0s); - - evTag->SetNumOfChargedAbove1GeV(nCh1GeV); - evTag->SetNumOfChargedAbove3GeV(nCh3GeV); - evTag->SetNumOfChargedAbove10GeV(nCh10GeV); - evTag->SetNumOfMuonsAbove1GeV(nMu1GeV); - evTag->SetNumOfMuonsAbove3GeV(nMu3GeV); - evTag->SetNumOfMuonsAbove10GeV(nMu10GeV); - evTag->SetNumOfElectronsAbove1GeV(nEl1GeV); - evTag->SetNumOfElectronsAbove3GeV(nEl3GeV); - evTag->SetNumOfElectronsAbove10GeV(nEl10GeV); - - evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters()); - evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters()); - - evTag->SetTotalMomentum(totalP); - evTag->SetMeanPt(meanPt); - evTag->SetMaxPt(maxPt); - - tag->SetLHCTag(lhcLuminosity,lhcState); - tag->SetDetectorTag(detectorMask); - tag->SetRunId(iInitRunNumber); + } + tag->AddEventTag(*evTag); + } + + tag->SetLHCTag(lhcLuminosity,lhcState); + tag->SetDetectorTag(esd->GetESDRun()->GetDetectorsInDAQ(), esd->GetESDRun()->GetDetectorsInReco()); + tag->SetActiveTriggerClasses(esd->GetESDRun()->GetActiveTriggerClasses()); + + // Get magnetic field info + Bool_t ok = kTRUE; + + Float_t l3Current = grpData->GetL3Current((AliGRPObject::Stats)0); + if (l3Current == AliGRPObject::GetInvalidFloat()) { + AliError("GRP/GRP/Data entry: missing value for the L3 current !"); + ok = kFALSE; } - if(fLastEvent == -1) lastEvent = (Int_t)b->GetEntries(); - else lastEvent = fLastEvent; - - ttag.Fill(); + + Char_t l3Polarity = grpData->GetL3Polarity(); + if (l3Polarity == AliGRPObject::GetInvalidChar()) { + AliError("GRP/GRP/Data entry: missing value for the L3 polarity !"); + ok = kFALSE; + } + + // Dipole + Float_t diCurrent = grpData->GetDipoleCurrent((AliGRPObject::Stats)0); + if (diCurrent == AliGRPObject::GetInvalidFloat()) { + AliError("GRP/GRP/Data entry: missing value for the dipole current !"); + ok = kFALSE; + } + + Char_t diPolarity = grpData->GetDipolePolarity(); + if (diPolarity == AliGRPObject::GetInvalidChar()) { + AliError("GRP/GRP/Data entry: missing value for the dipole polarity !"); + ok = kFALSE; + } + + if (ok && grpData->IsPolarityConventionLHC()) { + if ((TMath::Abs(l3Current) > 29000.0) && (l3Polarity == 1)) + tag->SetMagneticField(-0.5); + if ((TMath::Abs(l3Current) > 29000.0) && (l3Polarity == 0)) + tag->SetMagneticField(0.5); + if (TMath::Abs(l3Current) < 2000.0) + tag->SetMagneticField(0.0); + + if ((TMath::Abs(diCurrent) > 5900.0) && (diPolarity == 1)) + tag->SetDipoleField(-0.2); + if ((TMath::Abs(diCurrent) > 5900.0) && (diPolarity == 0)) + tag->SetDipoleField(0.2); + if (TMath::Abs(diCurrent) < 500.0) + tag->SetDipoleField(0.0); + } + + tag->SetRunId(iInitRunNumber); + tag->SetRunStartTime(t1.GetDate()); + tag->SetRunStopTime(t2.GetDate()); + tag->SetBeamEnergy(beamenergy); + tag->SetBeamType(beamtype); + + //QA setting + tag->SetQAArray(qa, qalength) ; + tag->SetEventSpecies(es, eslength) ; + + ftag->cd(); + ttag->Fill(); tag->Clear(); + ttag->Write(); + ftag->Close(); + esdfile->cd(); + delete esdfile; + delete ftag; + delete esd; + delete tag; + delete evTag; +} + +void AliESDTagCreator::CreateESDTagsFullRun(TTree *chain, AliGRPObject *grpData, ULong_t * qa, Bool_t * es, Int_t qalength, Int_t eslength) +{ + //GRP + Float_t lhcLuminosity = 0.0; + TString lhcState = "test"; + //UInt_t detectorMask = 0; + Int_t detectorMask = 0; + + detectorMask = grpData->GetDetectorMask(); + time_t startTime = grpData->GetTimeStart(); + TTimeStamp t1(startTime); + time_t endTime = grpData->GetTimeEnd(); + TTimeStamp t2(endTime); + const char* beamtype = grpData->GetBeamType(); + Float_t beamenergy = grpData->GetBeamEnergy(); + + Int_t iRunNumber = 0; + TString fguid, fmd5, fturl; + TString fturlold; + + AliInfo(Form("Creating the ESD tags.......")); + + AliESDEvent *esd = new AliESDEvent(); + esd->ReadFromTree(chain); + + chain->GetEntry(0); + Int_t iInitRunNumber = esd->GetRunNumber(); + + Int_t iNumberOfEvents = (Int_t)chain->GetEntries(); + Int_t iFirstEvent = 0; char fileName[256]; sprintf(fileName, "Run%d.Event%d_%d.ESD.tag.root", - tag->GetRunId(),fFirstEvent,lastEvent ); + iInitRunNumber,iFirstEvent,iNumberOfEvents); AliInfo(Form("writing tags to file %s", fileName)); AliDebug(1, Form("writing tags to file %s", fileName)); TFile* ftag = TFile::Open(fileName, "recreate"); + + AliRunTag *tag = new AliRunTag(); + AliEventTag *evTag = new AliEventTag(); + TTree * ttag = new TTree("T","A Tree with event tags"); + TBranch * btag = ttag->Branch("AliTAG", &tag); + btag->SetCompressionLevel(9); + +// AliFileTag *eftag = new AliFileTag(); +// tag->AddFileTag(*eftag); + + for (Int_t iEventNumber = iFirstEvent; iEventNumber < iNumberOfEvents; iEventNumber++) { + FillEventTag(chain, evTag, iEventNumber, esd); + + iRunNumber = esd->GetRunNumber(); + if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!"); + + TFile *file = chain->GetCurrentFile(); + // const TUrl *url = file->GetName(); + fguid = file->GetUUID().AsString(); + fturl = file->GetName(); +// if(fStorage == 1) { +// TString fturltemp = "alien://"; fturltemp += url->GetFile(); +// fturl = fturltemp(0,fturltemp.Index(".root",5,0,TString::kExact)+5); +// } +// else fturl = url->GetFile(); + + if (fturl.CompareTo(fturlold)) { + + AliFileTag *eftag = new AliFileTag(); + + //evTag->SetGUID(fguid); + eftag->SetGUID(fguid); + if(fStorage == 1) { + // evTag->SetMD5(""); + // evTag->SetTURL(fturl); + // evTag->SetSize(0); + eftag->SetPath(""); + eftag->SetMD5(""); + eftag->SetTURL(fturl); + eftag->SetSize(0); + } + else { + // evTag->SetPath(fturl); + // evTag->SetTURL(fturl); + eftag->SetPath(fturl); + eftag->SetTURL(fturl); + eftag->SetMD5(""); + eftag->SetSize(0); + } + + tag->AddFileTag(eftag); + + fturlold = fturl; + + } + else { + // cout << "FileTag found " << fturl.Data() << " " << fturlold.Data() << endl; + } + + tag->AddEventTag(*evTag); + } + + tag->SetLHCTag(lhcLuminosity,lhcState); + tag->SetDetectorTag(esd->GetESDRun()->GetDetectorsInDAQ(), esd->GetESDRun()->GetDetectorsInReco()); + tag->SetActiveTriggerClasses(esd->GetESDRun()->GetActiveTriggerClasses()); + + // Get magnetic field info + Bool_t ok = kTRUE; + + Float_t l3Current = grpData->GetL3Current((AliGRPObject::Stats)0); + if (l3Current == AliGRPObject::GetInvalidFloat()) { + AliError("GRP/GRP/Data entry: missing value for the L3 current !"); + ok = kFALSE; + } + + Char_t l3Polarity = grpData->GetL3Polarity(); + if (l3Polarity == AliGRPObject::GetInvalidChar()) { + AliError("GRP/GRP/Data entry: missing value for the L3 polarity !"); + ok = kFALSE; + } + + // Dipole + Float_t diCurrent = grpData->GetDipoleCurrent((AliGRPObject::Stats)0); + if (diCurrent == AliGRPObject::GetInvalidFloat()) { + AliError("GRP/GRP/Data entry: missing value for the dipole current !"); + ok = kFALSE; + } + + Char_t diPolarity = grpData->GetDipolePolarity(); + if (diPolarity == AliGRPObject::GetInvalidChar()) { + AliError("GRP/GRP/Data entry: missing value for the dipole polarity !"); + ok = kFALSE; + } + + if (ok && grpData->IsPolarityConventionLHC()) { + if ((TMath::Abs(l3Current) > 29000.0) && (l3Polarity == 1)) + tag->SetMagneticField(-0.5); + if ((TMath::Abs(l3Current) > 29000.0) && (l3Polarity == 0)) + tag->SetMagneticField(0.5); + if (TMath::Abs(l3Current) < 2000.0) + tag->SetMagneticField(0.0); + + if ((TMath::Abs(diCurrent) > 5900.0) && (diPolarity == 1)) + tag->SetDipoleField(-0.2); + if ((TMath::Abs(diCurrent) > 5900.0) && (diPolarity == 0)) + tag->SetDipoleField(0.2); + if (TMath::Abs(diCurrent) < 500.0) + tag->SetDipoleField(0.0); + } + + tag->SetRunId(iInitRunNumber); + tag->SetRunStartTime(t1.GetDate()); + tag->SetRunStopTime(t2.GetDate()); + tag->SetBeamEnergy(beamenergy); + tag->SetBeamType(beamtype); + + //QA setting + tag->SetQAArray(qa, qalength) ; + tag->SetEventSpecies(es, eslength) ; + ftag->cd(); - ttag.Write(); + ttag->Fill(); + tag->Clear(); + ttag->Write(); ftag->Close(); - file->cd(); + delete ftag; + delete esd; delete tag; delete evTag; } -//__________________________________________________________________________ -/*void AliTagCreator::CreateAODTags(Int_t fFirstEvent, Int_t fLastEvent) { - //creates tag files for AODs - - Float_t fLowPtCut = 1.0; - Float_t fHighPtCut = 3.0; +//_____________________________________________________________________________ +void AliESDTagCreator::SwitchOffBranches() const { + // + // Switch of branches on user request + TObjArray * tokens = fBranches.Tokenize(" "); + Int_t ntok = tokens->GetEntries(); + for (Int_t i = 0; i < ntok; i++) { + TString str = ((TObjString*) tokens->At(i))->GetString(); + fChain->SetBranchStatus(Form("%s%s%s","*", str.Data(), "*"), 0); + AliInfo(Form("Branch %s switched off \n", str.Data())); + } +} + +//_____________________________________________________________________________ +void AliESDTagCreator::FillEventTag(TTree *chain, AliEventTag *evTag, Int_t iEventNumber, AliESDEvent *esd) +{ + // Fill the event specific information in the EventTag + AliESD *esdold = 0x0; + + TString fTempGuid; + + ///////////// + //muon code// + //////////// + Double_t fMUONMASS = 0.105658369; + //Variables + Double_t fX,fY,fZ ; + Double_t fThetaX, fThetaY, fPyz, fChisquare; + Double_t fPxRec, fPyRec, fPzRec, fEnergy; + Int_t fCharge; + TLorentzVector fEPvector; + + Float_t fLowPtCut = 1.0; + Float_t fHighPtCut = 3.0; Float_t fVeryHighPtCut = 10.0; //////////// - Double_t partFrac[10] = {0.01, 0.01, 0.85, 0.10, 0.05, 0., 0., 0., 0., 0.}; + Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05}; // Creates the tags for all the events in a given ESD file + Bool_t fIsSim = kTRUE; Int_t ntrack; - Int_t nProtons, nKaons, nPions, nMuons, nElectrons; + Int_t nProtons, nKaons, nPions, nMuons, nElectrons, nFWMuons, nFWMatchedMuons; Int_t nPos, nNeg, nNeutr; - Int_t nKinks, nV0s, nCascades; - Int_t nK0s, nNeutrons, nPi0s, nGamas; + Int_t nK0s, nLambdas, nNeutrons, nPi0s, nGamas; Int_t nCh1GeV, nCh3GeV, nCh10GeV; Int_t nMu1GeV, nMu3GeV, nMu10GeV; Int_t nEl1GeV, nEl3GeV, nEl10GeV; - Float_t maxPt = .0, meanPt = .0, totalP = .0; + Float_t maxPt = .0, etamaxPt = -999., phimaxPt = -999., meanPt = .0, totalP = .0; + Int_t fVertexflag; + TString fVertexName; - AliRunTag *tag = new AliRunTag(); - TTree ttag("T","A Tree with event tags"); - TBranch * btag = ttag.Branch("AliTAG", &tag); - btag->SetCompressionLevel(9); + TRefArray tmp; - //reading the esd tag file - TChain *oldTagTree = new TChain("T"); - const char * tagPattern = "ESD.tag"; - // Open the working directory - void * dirp = gSystem->OpenDirectory(gSystem->pwd()); - const char * name = 0x0; - // Add all files matching *pattern* to the chain - while((name = gSystem->GetDirEntry(dirp))) { - if (strstr(name,tagPattern)) oldTagTree->Add(name); - }//directory loop - AliInfo(Form("Chained tag files: %d",oldTagTree->GetEntries())); - - //reading the esd tag file - AliRunTag *oldtag = new AliRunTag(); - TString tagFilename; - oldTagTree->SetBranchAddress("AliTAG",&oldtag); - oldTagTree->GetEntry(0); - tag->CopyStandardContent(oldtag); - const TClonesArray *evTagList = oldtag->GetEventTags(); - - AliInfo(Form("Creating the tags.......")); - - TFile *file = TFile::Open("AliAOD.root"); - if (!file || !file->IsOpen()) { - AliError(Form("opening failed")); - delete file; - return ; - } - TTree *aodTree = (TTree*)file->Get("AOD"); - AliAODEvent *aod = (AliAODEvent*)aodTree->GetUserInfo()->FindObject("AliAODEvent"); - TIter next(aod->GetList()); - TObject *el; - - Int_t lastEvent = 0; - if(fLastEvent == -1) lastEvent = (Int_t)aodTree->GetEntries(); - else lastEvent = fLastEvent; - - while((el=(TNamed*)next())) - aodTree->SetBranchAddress(el->GetName(),aod->GetList()->GetObjectRef(el)); - - // loop over events - Int_t nEvents = aodTree->GetEntries(); - for (Int_t iEventNumber = 0; iEventNumber < nEvents; iEventNumber++) { - AliEventTag *evTag = (AliEventTag *)evTagList->At(iEventNumber); - ntrack = 0; - nPos = 0; nNeg = 0; nNeutr =0; - nKinks = 0; nV0s = 0; nCascades = 0; - nK0s = 0; nNeutrons = 0; nPi0s = 0; nGamas = 0; - nProtons = 0; nKaons = 0; nPions = 0; nMuons = 0; nElectrons = 0; - nCh1GeV = 0; nCh3GeV = 0; nCh10GeV = 0; - nMu1GeV = 0; nMu3GeV = 0; nMu10GeV = 0; - nEl1GeV = 0; nEl3GeV = 0; nEl10GeV = 0; - maxPt = .0; meanPt = .0; totalP = .0; - - // read events - aodTree->GetEvent(iEventNumber); + ntrack = 0; nPos = 0; nNeg = 0; nNeutr =0; + nK0s = 0; nLambdas = 0; nNeutrons = 0; nPi0s = 0; + nGamas = 0; nProtons = 0; nKaons = 0; + nPions = 0; nMuons = 0; nElectrons = 0; nFWMuons = 0; nFWMatchedMuons = 0; + nCh1GeV = 0; nCh3GeV = 0; nCh10GeV = 0; + nMu1GeV = 0; nMu3GeV = 0; nMu10GeV = 0; + nEl1GeV = 0; nEl3GeV = 0; nEl10GeV = 0; + maxPt = .0; etamaxPt = -999.; phimaxPt = -999.; meanPt = .0; totalP = .0; + fVertexflag = 1; + + chain->GetEntry(iEventNumber); + esdold = esd->GetAliESDOld(); + if(esdold) esd->CopyFromOldESD(); + +// TFile *file = chain->GetFile(); +// const TUrl *url = file->GetEndpointUrl(); +// fguid = file->GetUUID().AsString(); +// if(fSession == "grid") { +// TString fturltemp = "alien://"; fturltemp += url->GetFile(); +// fturl = fturltemp(0,fturltemp.Index(".root",5,0,TString::kExact)+5); +// } +// else fturl = url->GetFile(); + + const AliESDVertex * vertexIn = esd->GetVertex(); + fVertexName = vertexIn->GetName(); + if(fVertexName == "default") fVertexflag = 0; + + for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) { + AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber); + if(esdTrack->GetLabel() != 0) fIsSim = kTRUE; + else if(esdTrack->GetLabel() == 0) fIsSim = kFALSE; + UInt_t status = esdTrack->GetStatus(); - // set pointers - aod->GetStdContent(); + //select only tracks with ITS refit + if ((status&AliESDtrack::kITSrefit)==0) continue; + //select only tracks with TPC refit + if ((status&AliESDtrack::kTPCrefit)==0) continue; - Int_t nTracks = aod->GetNTracks(); - // loop over vertices - Int_t nVtxs = aod->GetNVertices(); - for (Int_t nVtx = 0; nVtx < nVtxs; nVtx++) { - // print track info - AliAODVertex *vertex = aod->GetVertex(nVtx); - if(vertex->GetType() == 1) nKinks += 1; - if(vertex->GetType() == 2) nV0s += 1; - if(vertex->GetType() == 3) nCascades += 1; + //select only tracks with the "combined PID" + if ((status&AliESDtrack::kESDpid)==0) continue; + Double_t p[3]; + esdTrack->GetPxPyPz(p); + Double_t pt2 = p[0]*p[0]+p[1]*p[1]; + Double_t momentum = TMath::Sqrt(pt2+p[2]*p[2]); + Double_t fPt = TMath::Sqrt(pt2); + totalP += momentum; + meanPt += fPt; + if(fPt > maxPt) { + maxPt = fPt; + phimaxPt = esdTrack->Phi(); + etamaxPt = esdTrack->Eta(); } - for (Int_t nTr = 0; nTr < nTracks; nTr++) { - AliAODTrack *track = aod->GetTrack(nTr); - - Double_t fPt = track->Pt(); - if(fPt > maxPt) maxPt = fPt; - if(track->Charge() > 0) { - nPos++; - if(fPt > fLowPtCut) nCh1GeV++; - if(fPt > fHighPtCut) nCh3GeV++; - if(fPt > fVeryHighPtCut) nCh10GeV++; - } - if(track->Charge() < 0) { - nNeg++; - if(fPt > fLowPtCut) nCh1GeV++; - if(fPt > fHighPtCut) nCh3GeV++; - if(fPt > fVeryHighPtCut) nCh10GeV++; - } - if(track->Charge() == 0) nNeutr++; - - //PID - const Double32_t *prob = track->PID(); - Double_t rcc = 0.0; - for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i]; - if(rcc == 0.0) continue; - //Bayes' formula - Double_t w[10]; - for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc; - - //protons - if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++; - //kaons - if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++; - //pions - if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++; - //muons - if ((w[1]>w[4])&&(w[1]>w[3])&&(w[1]>w[2])&&(w[1]>w[0])) { - nMuons++; - if(fPt > fLowPtCut) nMu1GeV++; - if(fPt > fHighPtCut) nMu3GeV++; - if(fPt > fVeryHighPtCut) nMu10GeV++; - } - //electrons - if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) { - nElectrons++; - if(fPt > fLowPtCut) nEl1GeV++; - if(fPt > fHighPtCut) nEl3GeV++; - if(fPt > fVeryHighPtCut) nEl10GeV++; - } - - totalP += track->P(); - meanPt += fPt; - ntrack++; - }//track loop - // Fill the event tags - if(ntrack != 0) - meanPt = meanPt/ntrack; - - evTag->SetEventId(iEventNumber+1); - - evTag->SetNumOfTracks(nTracks); - evTag->SetNumOfPosTracks(nPos); - evTag->SetNumOfNegTracks(nNeg); - evTag->SetNumOfNeutrTracks(nNeutr); - evTag->SetNumOfV0s(nV0s); - evTag->SetNumOfCascades(nCascades); - evTag->SetNumOfKinks(nKinks); + if(esdTrack->GetSign() > 0) { + nPos++; + if(fPt > fLowPtCut) nCh1GeV++; + if(fPt > fHighPtCut) nCh3GeV++; + if(fPt > fVeryHighPtCut) nCh10GeV++; + } + if(esdTrack->GetSign() < 0) { + nNeg++; + if(fPt > fLowPtCut) nCh1GeV++; + if(fPt > fHighPtCut) nCh3GeV++; + if(fPt > fVeryHighPtCut) nCh10GeV++; + } + if(esdTrack->GetSign() == 0) nNeutr++; - evTag->SetNumOfProtons(nProtons); - evTag->SetNumOfKaons(nKaons); - evTag->SetNumOfPions(nPions); - evTag->SetNumOfMuons(nMuons); - evTag->SetNumOfElectrons(nElectrons); - evTag->SetNumOfPhotons(nGamas); - evTag->SetNumOfPi0s(nPi0s); - evTag->SetNumOfNeutrons(nNeutrons); - evTag->SetNumOfKaon0s(nK0s); + //PID + Double_t prob[5]; + esdTrack->GetESDpid(prob); - evTag->SetNumOfChargedAbove1GeV(nCh1GeV); - evTag->SetNumOfChargedAbove3GeV(nCh3GeV); - evTag->SetNumOfChargedAbove10GeV(nCh10GeV); - evTag->SetNumOfMuonsAbove1GeV(nMu1GeV); - evTag->SetNumOfMuonsAbove3GeV(nMu3GeV); - evTag->SetNumOfMuonsAbove10GeV(nMu10GeV); - evTag->SetNumOfElectronsAbove1GeV(nEl1GeV); - evTag->SetNumOfElectronsAbove3GeV(nEl3GeV); - evTag->SetNumOfElectronsAbove10GeV(nEl10GeV); + Double_t rcc = 0.0; + for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i]; + if(rcc == 0.0) continue; + //Bayes' formula + Double_t w[5]; + for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc; - evTag->SetTotalMomentum(totalP); - evTag->SetMeanPt(meanPt); - evTag->SetMaxPt(maxPt); - tag->AddEventTag(*evTag); - }//event loop - if(fLastEvent == -1) lastEvent = (Int_t)aodTree->GetEntries(); - else lastEvent = fLastEvent; + //protons + if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++; + //kaons + if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++; + //pions + if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++; + //electrons + if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) { + nElectrons++; + if(fPt > fLowPtCut) nEl1GeV++; + if(fPt > fHighPtCut) nEl3GeV++; + if(fPt > fVeryHighPtCut) nEl10GeV++; + } + ntrack++; + } + //esd track loop + + /* muon code */ + Int_t nMuonTracks = esd->GetNumberOfMuonTracks(); + // loop over all reconstructed tracks (also first track of combination) + for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) { + AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack); + if (muonTrack == 0x0) continue; + + // Coordinates at vertex + fZ = muonTrack->GetZ(); + fY = muonTrack->GetBendingCoor(); + fX = muonTrack->GetNonBendingCoor(); + + fThetaX = muonTrack->GetThetaX(); + fThetaY = muonTrack->GetThetaY(); + + fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum()); + fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY)); + fPxRec = fPzRec * TMath::Tan(fThetaX); + fPyRec = fPzRec * TMath::Tan(fThetaY); + fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum())); + + //ChiSquare of the track if needed + fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5); + fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec); + fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy); + + if (muonTrack->GetMatchTrigger()>0) nFWMatchedMuons++; + + nMuons++; + nFWMuons++; + if(fEPvector.Pt() > fLowPtCut) { + nMu1GeV++; + if(fEPvector.Pt() > fHighPtCut) { + nMu3GeV++; + if (fEPvector.Pt() > fVeryHighPtCut) { + nMu10GeV++; + } + } + } + }//muon track loop + + // Fill the event tags + if(ntrack != 0) meanPt = meanPt/ntrack; + + //AliInfo(Form("=====================================")); + //AliInfo(Form("URL: %s - GUID: %s",fturl.Data(),fguid.Data())); + //AliInfo(Form("=====================================")); + + //First physics data + const AliMultiplicity *spdMult = esd->GetMultiplicity(); + evTag->SetNumberOfFiredChipsLayer1(spdMult->GetNumberOfFiredChips(0)); + evTag->SetNumberOfFiredChipsLayer2(spdMult->GetNumberOfFiredChips(1)); + evTag->SetNumberOfSPDTracklets(spdMult->GetNumberOfTracklets()); + + AliESDVZERO *vzeroData = esd->GetVZEROData(); + evTag->SetMTotV0A(vzeroData->GetMTotV0A()); + evTag->SetMTotV0C(vzeroData->GetMTotV0C()); + evTag->SetNbPMV0A(vzeroData->GetNbPMV0A()); + evTag->SetNbPMV0C(vzeroData->GetNbPMV0C()); + + //evTag->SetEventId(iEventNumber+1); + evTag->SetPeriodNumber(esd->GetPeriodNumber()); + evTag->SetOrbitNumber(esd->GetOrbitNumber()); + evTag->SetBunchCrossNumber(esd->GetBunchCrossNumber()); + // evTag->SetGUID(fguid); +// if(fSession == "grid") { +// evTag->SetMD5(""); +// evTag->SetTURL(fturl); +// evTag->SetSize(0); +// } +// else evTag->SetPath(fturl); + + evTag->SetVertexX(vertexIn->GetXv()); + evTag->SetVertexY(vertexIn->GetYv()); + evTag->SetVertexZ(vertexIn->GetZv()); + evTag->SetVertexZError(vertexIn->GetZRes()); + evTag->SetVertexFlag(fVertexflag); + + evTag->SetT0VertexZ(esd->GetT0zVertex()); + + evTag->SetTriggerMask(esd->GetTriggerMask()); + evTag->SetTriggerCluster(esd->GetTriggerCluster()); + + evTag->SetEventType(esd->GetEventType()); + //*T* evTag->SetFiredTriggerClasses(esd->GetFiredTriggerClasses()); + + evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy()); + evTag->SetZDCProton1Energy(esd->GetZDCP1Energy()); + evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1)); + evTag->SetZDCNeutron2Energy(esd->GetZDCN2Energy()); + evTag->SetZDCProton2Energy(esd->GetZDCP2Energy()); + evTag->SetNumOfParticipants(esd->GetZDCParticipants()); + + evTag->SetNumOfTracks(esd->GetNumberOfTracks()); + evTag->SetNumOfPosTracks(nPos); + evTag->SetNumOfNegTracks(nNeg); + evTag->SetNumOfNeutrTracks(nNeutr); + + evTag->SetNumOfV0s(esd->GetNumberOfV0s()); + evTag->SetNumOfCascades(esd->GetNumberOfCascades()); + evTag->SetNumOfKinks(esd->GetNumberOfKinks()); + evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks()); + + evTag->SetNumOfProtons(nProtons); + evTag->SetNumOfKaons(nKaons); + evTag->SetNumOfPions(nPions); + evTag->SetNumOfMuons(nMuons); + evTag->SetNumOfFWMuons(nFWMuons); + evTag->SetNumOfFWMatchedMuons(nFWMatchedMuons); + evTag->SetNumOfElectrons(nElectrons); + evTag->SetNumOfPhotons(nGamas); + evTag->SetNumOfPi0s(nPi0s); + evTag->SetNumOfNeutrons(nNeutrons); + evTag->SetNumOfKaon0s(nK0s); + evTag->SetNumOfLambdas(nLambdas); + + evTag->SetNumOfChargedAbove1GeV(nCh1GeV); + evTag->SetNumOfChargedAbove3GeV(nCh3GeV); + evTag->SetNumOfChargedAbove10GeV(nCh10GeV); + evTag->SetNumOfMuonsAbove1GeV(nMu1GeV); + evTag->SetNumOfMuonsAbove3GeV(nMu3GeV); + evTag->SetNumOfMuonsAbove10GeV(nMu10GeV); + evTag->SetNumOfElectronsAbove1GeV(nEl1GeV); + evTag->SetNumOfElectronsAbove3GeV(nEl3GeV); + evTag->SetNumOfElectronsAbove10GeV(nEl10GeV); + + tmp.Clear(); + evTag->SetNumOfPHOSClusters(esd->GetPHOSClusters(&tmp)); + tmp.Clear(); + evTag->SetNumOfEMCALClusters(esd->GetEMCALClusters(&tmp)); + + evTag->SetTotalMomentum(totalP); + evTag->SetMeanPt(meanPt); + evTag->SetMaxPt(maxPt); + evTag->SetEtaMaxPt(etamaxPt); + evTag->SetPhiMaxPt(phimaxPt); + + evTag->SetPhysicsFlag(kTRUE); + evTag->SetBackgroungFlag(kFALSE); +} - ttag.Fill(); - tag->Clear(); +void AliESDTagCreator::CreateESDRunTagSummary(TTree *chain) +{ + // Merge all tags from a run into a single RunTag + // with only the File tags + AliRunTag *rtag; + chain->SetBranchAddress("AliTAG", &rtag); + + TFile* ftag = TFile::Open("RunTagSummary.tag.root", "recreate"); + + AliRunTag *tag = new AliRunTag(); + TTree * ttag = new TTree("T","A Tree with event tags"); + TBranch * btag = ttag->Branch("AliTAG", &tag); + btag->SetCompressionLevel(9); + + for (int itag=0; itagGetEntries(); itag++) { + chain->GetEntry(itag); + tag->CopyStandardContent(rtag); + + ttag->Fill(); + tag->Clear(); + } - char fileName[256]; - sprintf(fileName, "Run%d.Event%d_%d.AOD.tag.root", - tag->GetRunId(),fFirstEvent,lastEvent ); - AliInfo(Form("writing tags to file %s", fileName)); - AliDebug(1, Form("writing tags to file %s", fileName)); - - TFile* ftag = TFile::Open(fileName, "recreate"); ftag->cd(); - ttag.Write(); + ttag->Write(); ftag->Close(); - file->cd(); - file->Close(); - }*/ + +}