X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliTagCreator.cxx;h=381db46c3dbf26bb83790f6785e02aff74f7ebcb;hb=49f4392152117cc52724a92467be458627f82a70;hp=70076140b72e0a29107814478bd266f50d518da9;hpb=2bdb9d38918cdc022d8b48167795a0c8fa61b48a;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliTagCreator.cxx b/STEER/AliTagCreator.cxx index 70076140b72..381db46c3db 100644 --- a/STEER/AliTagCreator.cxx +++ b/STEER/AliTagCreator.cxx @@ -20,6 +20,7 @@ //----------------------------------------------------------------- //ROOT +#include #include #include #include @@ -46,23 +47,22 @@ ClassImp(AliTagCreator) //______________________________________________________________________________ -AliTagCreator::AliTagCreator() //local mode + AliTagCreator::AliTagCreator() : + TObject(), + fSE("ALICE::CERN::se01"), + fgridpath(""), + fStorage(0) { //==============Default constructor for a AliTagCreator================== - fgridpath = ""; - fSE = ""; - fStorage = 0; } //______________________________________________________________________________ -AliTagCreator::~AliTagCreator() -{ +AliTagCreator::~AliTagCreator() { //================Default destructor for a AliTagCreator======================= } //______________________________________________________________________________ -void AliTagCreator::SetStorage(Int_t storage) -{ +void AliTagCreator::SetStorage(Int_t storage) { // Sets correctly the storage: 0 for local, 1 for GRID fStorage = storage; if(fStorage == 0) @@ -78,8 +78,7 @@ void AliTagCreator::SetStorage(Int_t storage) //______________________________________________________________________________ -Bool_t AliTagCreator::ReadESDCollection(TGridResult *fresult) -{ +Bool_t AliTagCreator::ReadGridCollection(TGridResult *fresult) { // Reads the entry of the TGridResult and creates the tags Int_t nEntries = fresult->GetEntries(); @@ -90,32 +89,88 @@ Bool_t AliTagCreator::ReadESDCollection(TGridResult *fresult) Long64_t size = -1; Int_t counter = 0; - for(Int_t i = 0; i < nEntries; i++) - { - alienUrl = fresult->GetKey(i,"turl"); - guid = fresult->GetKey(i,"guid"); - if(fresult->GetKey(i,"size")) - size = atol (fresult->GetKey(i,"size")); - md5 = fresult->GetKey(i,"md5"); - 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; - counter += 1; - }//grid result loop + for(Int_t i = 0; i < nEntries; i++) { + alienUrl = fresult->GetKey(i,"turl"); + guid = fresult->GetKey(i,"guid"); + if(fresult->GetKey(i,"size")) size = atol (fresult->GetKey(i,"size")); + md5 = fresult->GetKey(i,"md5"); + 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; + counter += 1; + }//grid result loop + + return kTRUE; +} + +//______________________________________________________________________________ +Bool_t AliTagCreator::ReadLocalCollection(const char *localpath) { + // Checks the different subdirs of the given local path and in the + // case where it finds an AliESDs.root file it creates the tags + + void *dira = gSystem->OpenDirectory(localpath); + Char_t fPath[256]; + const char * dirname = 0x0; + const char * filename = 0x0; + const char * pattern = "AliESDs.root"; + + Int_t counter = 0; + while((dirname = gSystem->GetDirEntry(dira))) { + sprintf(fPath,"%s/%s",localpath,dirname); + void *dirb = gSystem->OpenDirectory(fPath); + while((filename = gSystem->GetDirEntry(dirb))) { + if(strstr(filename,pattern)) { + TString fESDFileName; + fESDFileName = fPath; + fESDFileName += "/"; + fESDFileName += pattern; + 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 return kTRUE; } +//______________________________________________________________________________ +Bool_t AliTagCreator::ReadCAFCollection(const char *filename) { + // Temporary solution for CAF: Takes as an input the ascii file that + // lists the ESDs stored in the SE of the CAF and creates the tags. + + // Open the input stream + ifstream in; + in.open(filename); + + Int_t counter = 0; + TString esdfile; + // Read the input list of files and add them to the chain + 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; + + counter += 1; + } + + return kTRUE; +} + + //__________________________________________________________________________ -Bool_t AliTagCreator::MergeTags() -{ +Bool_t AliTagCreator::MergeTags() { //Merges the tags and stores the merged tag file //locally if fStorage=0 or in the grid if fStorage=1 AliInfo(Form("Merging tags.....")); @@ -128,8 +183,7 @@ Bool_t AliTagCreator::MergeTags() const char * name = 0x0; // Add all files matching *pattern* to the chain while((name = gSystem->GetDirEntry(dirp))) { - if (strstr(name,tagPattern)) - fgChain->Add(name); + if (strstr(name,tagPattern)) fgChain->Add(name); }//directory loop AliInfo(Form("Chained tag files: %d",fgChain->GetEntries())); }//local mode @@ -149,7 +203,6 @@ Bool_t AliTagCreator::MergeTags() }//grid mode AliRunTag *tag = new AliRunTag; - AliEventTag *evTag = new AliEventTag; fgChain->SetBranchAddress("AliTAG",&tag); //Defining new tag objects @@ -159,12 +212,7 @@ Bool_t AliTagCreator::MergeTags() btag->SetCompressionLevel(9); for(Int_t iTagFiles = 0; iTagFiles < fgChain->GetEntries(); iTagFiles++) { fgChain->GetEntry(iTagFiles); - newTag->SetRunId(tag->GetRunId()); - const TClonesArray *tagList = tag->GetEventTags(); - for(Int_t j = 0; j < tagList->GetEntries(); j++) { - evTag = (AliEventTag *) tagList->At(j); - newTag->AddEventTag(*evTag); - } + newTag = tag; ttag.Fill(); newTag->Clear(); }//tag file loop @@ -172,21 +220,80 @@ Bool_t AliTagCreator::MergeTags() TString localFileName = "Run"; localFileName += tag->GetRunId(); localFileName += ".Merged"; localFileName += ".ESD.tag.root"; - TString alienFileName = "/alien"; - alienFileName += gGrid->Pwd(); - alienFileName += fgridpath.Data(); - alienFileName += "/"; - alienFileName += localFileName; - alienFileName += "?se="; - alienFileName += fSE.Data(); + TString filename = 0x0; + + if(fStorage == 0) { + filename = localFileName.Data(); + AliInfo(Form("Writing merged tags to local file: %s",filename.Data())); + } + else if(fStorage == 1) { + TString alienFileName = "/alien"; + alienFileName += gGrid->Pwd(); + alienFileName += fgridpath.Data(); + alienFileName += "/"; + alienFileName += localFileName; + alienFileName += "?se="; + alienFileName += fSE.Data(); + filename = alienFileName.Data(); + AliInfo(Form("Writing merged tags to grid file: %s",filename.Data())); + } + + TFile* ftag = TFile::Open(filename, "recreate"); + ftag->cd(); + ttag.Write(); + ftag->Close(); + delete newTag; + + return kTRUE; +} + +//__________________________________________________________________________ +Bool_t AliTagCreator::MergeTags(TGridResult *result) { + //Merges the tags that are listed in the TGridResult + AliInfo(Form("Merging tags.....")); + TChain *fgChain = new TChain("T"); + + Int_t nEntries = result->GetEntries(); + + TString alienUrl; + for(Int_t i = 0; i < nEntries; i++) { + alienUrl = result->GetKey(i,"turl"); + fgChain->Add(alienUrl); + } + AliInfo(Form("Chained tag files: %d",fgChain->GetEntries())); + AliRunTag *tag = new AliRunTag; + fgChain->SetBranchAddress("AliTAG",&tag); + + //Defining new tag objects + AliRunTag *newTag = new AliRunTag(); + TTree ttag("T","A Tree with event tags"); + TBranch * btag = ttag.Branch("AliTAG", &newTag); + btag->SetCompressionLevel(9); + for(Int_t iTagFiles = 0; iTagFiles < fgChain->GetEntries(); iTagFiles++) { + fgChain->GetEntry(iTagFiles); + newTag = tag; + ttag.Fill(); + newTag->Clear(); + }//tag file loop + + TString localFileName = "Run"; localFileName += tag->GetRunId(); + localFileName += ".Merged"; localFileName += ".ESD.tag.root"; + TString filename = 0x0; if(fStorage == 0) { filename = localFileName.Data(); AliInfo(Form("Writing merged tags to local file: %s",filename.Data())); } - if(fStorage == 1) { + else if(fStorage == 1) { + TString alienFileName = "/alien"; + alienFileName += gGrid->Pwd(); + alienFileName += fgridpath.Data(); + alienFileName += "/"; + alienFileName += localFileName; + alienFileName += "?se="; + alienFileName += fSE.Data(); filename = alienFileName.Data(); AliInfo(Form("Writing merged tags to grid file: %s",filename.Data())); } @@ -196,38 +303,40 @@ Bool_t AliTagCreator::MergeTags() ttag.Write(); ftag->Close(); - delete tag; - delete evTag; delete newTag; return kTRUE; } //_____________________________________________________________________________ -void AliTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, const char *turl, Long64_t size, Int_t Counter) -{ +void AliTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, const char *turl, Long64_t size, Int_t Counter) { + //private method that creates tag files + TString fguid = guid; + TString fmd5 = md5; + TString fturl = turl; ///////////// //muon code// //////////// - Double_t MUON_MASS = 0.105658369; + Double_t fMUONMASS = 0.105658369; //Variables - Double_t X,Y,Z ; - Double_t ThetaX, ThetaY, Pyz,Chisquare; - Double_t PxRec,PyRec, PzRec, Energy; - Int_t Charge; - TLorentzVector EPvector; - - Float_t ZVertexCut = 10.0; - Float_t RhoVertexCut = 2.0; - - Float_t LowPtCut = 1.0; - Float_t HighPtCut = 3.0; - Float_t VeryHighPtCut = 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 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 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; @@ -236,6 +345,9 @@ void AliTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, co Int_t nMu1GeV, nMu3GeV, nMu10GeV; Int_t nEl1GeV, nEl3GeV, nEl10GeV; Float_t maxPt = .0, meanPt = .0, totalP = .0; + Int_t fVertexflag; + Int_t iRunNumber = 0; + TString fVertexName; AliRunTag *tag = new AliRunTag(); AliEventTag *evTag = new AliEventTag(); @@ -251,9 +363,10 @@ void AliTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, co AliESD *esd = 0; b->SetAddress(&esd); - tag->SetRunId(esd->GetRunNumber()); - - Int_t iNumberOfEvents = b->GetEntries(); + b->GetEntry(0); + Int_t iInitRunNumber = esd->GetRunNumber(); + + Int_t iNumberOfEvents = (Int_t)b->GetEntries(); for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) { ntrack = 0; nPos = 0; @@ -280,12 +393,19 @@ void AliTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, co maxPt = .0; meanPt = .0; totalP = .0; + fVertexflag = 1; b->GetEntry(iEventNumber); + 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 @@ -305,15 +425,15 @@ void AliTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, co if(esdTrack->GetSign() > 0) { nPos++; - if(fPt > LowPtCut) nCh1GeV++; - if(fPt > HighPtCut) nCh3GeV++; - if(fPt > VeryHighPtCut) nCh10GeV++; + if(fPt > fLowPtCut) nCh1GeV++; + if(fPt > fHighPtCut) nCh3GeV++; + if(fPt > fVeryHighPtCut) nCh10GeV++; } if(esdTrack->GetSign() < 0) { nNeg++; - if(fPt > LowPtCut) nCh1GeV++; - if(fPt > HighPtCut) nCh3GeV++; - if(fPt > VeryHighPtCut) nCh10GeV++; + if(fPt > fLowPtCut) nCh1GeV++; + if(fPt > fHighPtCut) nCh3GeV++; + if(fPt > fVeryHighPtCut) nCh10GeV++; } if(esdTrack->GetSign() == 0) nNeutr++; @@ -337,9 +457,9 @@ void AliTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, co //electrons if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) { nElectrons++; - if(fPt > LowPtCut) nEl1GeV++; - if(fPt > HighPtCut) nEl3GeV++; - if(fPt > VeryHighPtCut) nEl10GeV++; + if(fPt > fLowPtCut) nEl1GeV++; + if(fPt > fHighPtCut) nEl3GeV++; + if(fPt > fVeryHighPtCut) nEl10GeV++; } ntrack++; }//esd track loop @@ -354,32 +474,32 @@ void AliTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, co if (muonTrack == 0x0) continue; // Coordinates at vertex - Z = muonTrack->GetZ(); - Y = muonTrack->GetBendingCoor(); - X = muonTrack->GetNonBendingCoor(); + fZ = muonTrack->GetZ(); + fY = muonTrack->GetBendingCoor(); + fX = muonTrack->GetNonBendingCoor(); - ThetaX = muonTrack->GetThetaX(); - ThetaY = muonTrack->GetThetaY(); + fThetaX = muonTrack->GetThetaX(); + fThetaY = muonTrack->GetThetaY(); - Pyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum()); - PzRec = - Pyz / TMath::Sqrt(1.0 + TMath::Tan(ThetaY)*TMath::Tan(ThetaY)); - PxRec = PzRec * TMath::Tan(ThetaX); - PyRec = PzRec * TMath::Tan(ThetaY); - Charge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum())); + 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 - Chisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5); - Energy = TMath::Sqrt(MUON_MASS * MUON_MASS + PxRec * PxRec + PyRec * PyRec + PzRec * PzRec); - EPvector.SetPxPyPzE(PxRec, PyRec, PzRec, Energy); + 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(Z) LowPtCut) { + if(fEPvector.Pt() > fLowPtCut) { nMu1GeV++; - if(EPvector.Pt() > HighPtCut) { + if(fEPvector.Pt() > fHighPtCut) { nMu3GeV++; - if (EPvector.Pt() > VeryHighPtCut) { + if (fEPvector.Pt() > fVeryHighPtCut) { nMu10GeV++; } } @@ -388,25 +508,29 @@ void AliTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, co }//muon track loop // Fill the event tags - if(ntrack != 0) - meanPt = meanPt/ntrack; + if(ntrack != 0) meanPt = meanPt/ntrack; evTag->SetEventId(iEventNumber+1); - evTag->SetGUID(guid); - evTag->SetMD5(md5); - evTag->SetTURL(turl); + 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->SetTrigger(esd->GetTrigger()); + evTag->SetTriggerMask(esd->GetTriggerMask()); + evTag->SetTriggerCluster(esd->GetTriggerCluster()); - evTag->SetZDCNeutronEnergy(esd->GetZDCNEnergy()); - evTag->SetZDCProtonEnergy(esd->GetZDCPEnergy()); + evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy()); + evTag->SetZDCProton1Energy(esd->GetZDCP1Energy()); evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy()); + evTag->SetZDCNeutron1Energy(esd->GetZDCN2Energy()); + evTag->SetZDCProton1Energy(esd->GetZDCP2Energy()); evTag->SetNumOfParticipants(esd->GetZDCParticipants()); @@ -440,13 +564,16 @@ void AliTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, co evTag->SetNumOfElectronsAbove3GeV(nEl3GeV); evTag->SetNumOfElectronsAbove10GeV(nEl10GeV); - evTag->SetNumOfPHOSTracks(esd->GetNumberOfPHOSParticles()); - evTag->SetNumOfEMCALTracks(esd->GetNumberOfEMCALParticles()); + 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); + else tag->SetDataType(1); tag->AddEventTag(*evTag); }//event loop lastEvent = iNumberOfEvents; @@ -460,26 +587,23 @@ void AliTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, co localFileName += ".Event"; localFileName += firstEvent; localFileName += "_"; localFileName += lastEvent; localFileName += "."; localFileName += Counter; localFileName += ".ESD.tag.root"; - TString alienLocation = "/alien"; - alienLocation += gGrid->Pwd(); - alienLocation += fgridpath.Data(); - alienLocation += "/"; - alienLocation += localFileName; - alienLocation += "?se="; - alienLocation += fSE.Data(); - TString fileName; - if(fStorage == 0) - { - fileName = localFileName.Data(); - AliInfo(Form("Writing tags to local file: %s",fileName.Data())); - } - if(fStorage == 1) - { - fileName = alienLocation.Data(); - AliInfo(Form("Writing tags to grid file: %s",fileName.Data())); - } + 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"); ftag->cd(); @@ -490,6 +614,308 @@ void AliTagCreator::CreateTag(TFile* file, const char *guid, const char *md5, co delete esd; delete tag; - delete evTag; } +//_____________________________________________________________________________ +void AliTagCreator::CreateTag(TFile* file, const char *filepath, Int_t Counter) { + //private method that creates tag files + ///////////// + //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 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 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 iRunNumber = 0; + TString fVertexName; + + 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); + + AliInfo(Form("Creating the tags.......")); + + Int_t firstEvent = 0,lastEvent = 0; + + TTree *t = (TTree*) file->Get("esdTree"); + TBranch * b = t->GetBranch("ESD"); + AliESD *esd = 0; + b->SetAddress(&esd); + + b->GetEntry(0); + Int_t iInitRunNumber = esd->GetRunNumber(); + + Int_t iNumberOfEvents = (Int_t)b->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; + + b->GetEntry(iEventNumber); + 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); + + tag->SetRunId(iInitRunNumber); + 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"; + + 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"); + ftag->cd(); + ttag.Write(); + ftag->Close(); + + delete ftag; + delete esd; + + delete tag; +}