#include <Riostream.h>
#include <TFile.h>
#include <TString.h>
#include <TTree.h>
#include <TSystem.h>
#include <TChain.h>
#include <TLorentzVector.h>
#include <TGrid.h>
#include <TGridResult.h>
#include "AliRunTag.h"
#include "AliEventTag.h"
#include "AliLog.h"
#include "AliTagCreator.h"
using std::ifstream;
ClassImp(AliTagCreator)
AliTagCreator::AliTagCreator() :
TObject(),
fSE("ALICE::CERN::se"),
fgridpath(""),
fStorage(0)
{
}
AliTagCreator::~AliTagCreator() {
}
void AliTagCreator::SetStorage(Int_t storage) {
fStorage = storage;
if(fStorage == 0)
AliInfo(Form("Tags will be stored locally...."));
if(fStorage == 1)
AliInfo(Form("Tags will be stored in the grid...."));
if((fStorage != 0)&&(fStorage != 1))
{
AliInfo(Form("Storage was not properly set!!!"));
abort();
}
}
Bool_t AliTagCreator::MergeTags(const char *type) {
AliInfo(Form("Merging tags....."));
TChain *fgChain = new TChain("T");
TString tagPattern = type; tagPattern += ".tag.root";
if(fStorage == 0) {
void * dirp = gSystem->OpenDirectory(gSystem->pwd());
const char * name = 0x0;
while((name = gSystem->GetDirEntry(dirp))) {
if (strstr(name,tagPattern)) fgChain->Add(name);
}
AliInfo(Form("Chained tag files: %lld",fgChain->GetEntries()));
}
else if(fStorage == 1) {
TString alienLocation = gGrid->Pwd();
alienLocation += fgridpath.Data();
alienLocation += "/";
TString queryPattern = "*."; queryPattern += tagPattern;
TGridResult *tagresult = gGrid->Query(alienLocation,queryPattern.Data(),"","");
Int_t nEntries = tagresult->GetEntries();
for(Int_t i = 0; i < nEntries; i++) {
TString alienUrl = tagresult->GetKey(i,"turl");
fgChain->Add(alienUrl);
}
AliInfo(Form("Chained tag files: %lld",fgChain->GetEntries()));
}
AliRunTag *tag = new AliRunTag;
fgChain->SetBranchAddress("AliTAG",&tag);
fgChain->GetEntry(0);
TString localFileName = "Run"; localFileName += tag->GetRunId();
localFileName += ".Merged."; localFileName += tagPattern.Data();
TString filename;
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()));
}
fgChain->Merge(filename);
gSystem->Exec("rm Run*.Event*");
return kTRUE;
}
Bool_t AliTagCreator::MergeTags(const char *type, const char *inflist) {
AliInfo(Form("Merging tags....."));
TChain *fgChain = new TChain("T");
TString tagPattern = type; tagPattern += ".tag.root";
if (fStorage == 0) {
ifstream *istr = new ifstream(inflist);
char fname[200];
while (!(istr->eof())) {
(*istr) >> fname;
if (strstr(fname, tagPattern)) fgChain->Add(fname);
}
AliInfo(Form("Chained tag files: %lld",fgChain->GetEntries()));
}
AliRunTag *tag = new AliRunTag;
fgChain->SetBranchAddress("AliTAG",&tag);
fgChain->GetEntry(0);
TString localFileName = "Run"; localFileName += tag->GetRunId();
localFileName += ".Merged."; localFileName += tagPattern.Data();
TString filename;
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()));
}
fgChain->Merge(filename);
gSystem->Exec("rm Run*.Event*");
return kTRUE;
}
Bool_t AliTagCreator::MergeTags(const char *type, TGridResult *result) {
AliInfo(Form("Merging tags....."));
TChain *fgChain = new TChain("T");
TString tagPattern = "."; tagPattern += type; tagPattern += ".tag.root";
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: %lld",fgChain->GetEntries()));
AliRunTag *tag = new AliRunTag;
fgChain->SetBranchAddress("AliTAG",&tag);
fgChain->GetEntry(0);
TString localFileName = "Run"; localFileName += tag->GetRunId();
localFileName += ".Merged"; localFileName += tagPattern.Data();
TString filename;
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()));
}
fgChain->Merge(filename);
return kTRUE;
}
Bool_t AliTagCreator::MergeTagsForRun(const char* type) {
AliInfo(Form("Merging tags....."));
TChain *fgChain = new TChain("T");
TString tagPattern = type; tagPattern += ".tag.root";
if(fStorage == 0) {
void * dirp = gSystem->OpenDirectory(gSystem->pwd());
const char * name = 0x0;
while((name = gSystem->GetDirEntry(dirp))) {
if (strstr(name,tagPattern)) fgChain->Add(name);
}
AliInfo(Form("Chained tag files: %lld",fgChain->GetEntries()));
}
else if(fStorage == 1) {
TString alienLocation = gGrid->Pwd();
alienLocation += fgridpath.Data();
alienLocation += "/";
TString queryPattern = "*."; queryPattern += tagPattern;
TGridResult *tagresult = gGrid->Query(alienLocation,queryPattern.Data(),"","");
Int_t nEntries = tagresult->GetEntries();
for(Int_t i = 0; i < nEntries; i++) {
TString alienUrl = tagresult->GetKey(i,"turl");
fgChain->Add(alienUrl);
}
AliInfo(Form("Chained tag files: %lld",fgChain->GetEntries()));
}
AliRunTag *tag = new AliRunTag;
fgChain->SetBranchAddress("AliTAG",&tag);
fgChain->GetEntry(0);
TString localFileName = "Run"; localFileName += tag->GetRunId();
localFileName += ".Merged."; localFileName += tagPattern.Data();
TString filename;
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()));
}
MergeToSingleRunTag(fgChain, filename);
gSystem->Exec("rm Run*.Event*");
return kTRUE;
}
Bool_t AliTagCreator::MergeTagsForRun(const char* type, TGridResult *result) {
AliInfo(Form("Merging tags....."));
TChain *fgChain = new TChain("T");
TString tagPattern = "."; tagPattern += type; tagPattern += ".tag.root";
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: %lld",fgChain->GetEntries()));
AliRunTag *tag = new AliRunTag;
fgChain->SetBranchAddress("AliTAG",&tag);
fgChain->GetEntry(0);
TString localFileName = "Run"; localFileName += tag->GetRunId();
localFileName += ".Merged"; localFileName += tagPattern.Data();
TString filename;
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()));
}
MergeToSingleRunTag(fgChain, filename);
return kTRUE;
}
Bool_t AliTagCreator::MergeTagsForRun(const char* type, const char *inflist) {
AliInfo(Form("Merging tags....."));
TChain *fgChain = new TChain("T");
TString tagPattern = type; tagPattern += ".tag.root";
if (fStorage == 0) {
ifstream *istr = new ifstream(inflist);
char fname[200];
while (!(istr->eof())) {
(*istr) >> fname;
if (strstr(fname, tagPattern)) fgChain->Add(fname);
}
AliInfo(Form("Chained tag files: %lld",fgChain->GetEntries()));
}
AliRunTag *tag = new AliRunTag;
fgChain->SetBranchAddress("AliTAG",&tag);
fgChain->GetEntry(0);
TString localFileName = "Run"; localFileName += tag->GetRunId();
localFileName += ".Merged."; localFileName += tagPattern.Data();
TString filename;
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()));
}
MergeToSingleRunTag(fgChain, filename);
gSystem->Exec("rm Run*.Event*");
return kTRUE;
}
Bool_t AliTagCreator::MergeToSingleRunTag(TChain *chain, const char *filename)
{
TFile* ftag = TFile::Open(filename, "recreate");
AliRunTag *tag = new AliRunTag;
TTree * ttag = new TTree("T","A Tree with event tags");
TBranch * btag = ttag->Branch("AliTAG", &tag, 1000000);
btag->SetCompressionLevel(9);
ttag->AutoSave("10000");
AliRunTag *rtag = new AliRunTag();
chain->SetBranchAddress("AliTAG", &rtag);
AliFileTag *evt;
if (chain->GetEntries()) {
chain->GetEntry(0);
tag->CopyStandardContent(rtag);
tag->Clear();
int runno = rtag->GetRunId();
for (int iter=0; iter<chain->GetEntries(); iter++) {
chain->GetEntry(iter);
if (runno != rtag->GetRunId()) {
AliInfo(Form("Run tag ID %i is different from the Run ID for the merged run: %i\n", rtag->GetRunId(), runno));
continue;
}
for (int iev=0; iev<rtag->GetNFiles(); iev++) {
evt = (AliFileTag *) rtag->GetFileTag(iev);
tag->AddFileTag(new AliFileTag(*evt));
}
}
}
else {
AliInfo("Found no tag files to merge.");
return kFALSE;
}
ttag->Fill();
ftag->cd();
tag->Clear();
ttag->Write();
ftag->Close();
return kTRUE;
}