+++ /dev/null
-/* $Id: $ */\r
-//--------------------------------------------------\r
-// Example macro to do multi-platform JETAN/FASTJET analysis\r
-// Can be executed with Root and AliRoot\r
-//\r
-// Configured by options and definitions set in the lines below and\r
-// additional external configuration files and environement variables.\r
-//\r
-// Author: K. Read\r
-//\r
-//-------------------------------------------------\r
-enum anaModes {mLocal, mLocalCAF, mPROOF, mGRID, mPLUGIN};\r
-//mLocal = 0: Analyze locally files in your computer\r
-//mLocalCAF = 1: Analyze locally CAF files\r
-//mPROOF = 2: Analyze CAF files with PROOF\r
-//mGRID = 3: Analyze files on GRID\r
-//mPLUGIN = 4: Analyze files on GRID with AliEn plugin\r
-\r
-//---------------------------------------------------------------------------\r
-//Settings to read locally several files, only for "mLocal" mode\r
-//The different values are default, they can be set with environmental \r
-//variables: INDIR, PATTERN, NFILES, respectively\r
-//char * kInDir = "/afs/cern.ch/user/k/kread/public/data/"; \r
-char * kInDir = "/user/data/files";\r
-char * kPattern = ""; // Data are in files kInDir/kPattern+i\r
-Int_t kFile = 1; // Number of files\r
-//---------------------------------------------------------------------------\r
-//Collection file for grid analysis\r
-char * kXML = "collection.xml";\r
-//---------------------------------------------------------------------------\r
-//Data directory for PROOF analysis\r
-char * kmydataset = "/COMMON/COMMON/LHC09a4_run8101X";\r
-//char * kmydataset = "/PWG4/mcosenti/LHC08d10_ppElectronB_Jets#esdTree";\r
-//---------------------------------------------------------------------------\r
-//Scale histograms from file. Change to kTRUE when xsection file exists\r
-//Put name of file containing xsection \r
-//Put number of events per ESD file\r
-//This is an specific case for normalization of Pythia files.\r
-Bool_t kGetXSectionFromFileAndScale = kTRUE;\r
-const char * kXSFileName = "pyxsec.root";\r
-const Int_t kNumberOfEventsPerFile = 200; \r
-//---------------------------------------------------------------------------\r
-\r
-Bool_t kMC = kTRUE; //With real data kMC = kFALSE\r
-TString kInputData = "ESD";//ESD, AOD, MC\r
-TString kTreeName = "esdTree";\r
-//const Bool_t kMergeAODs = kTRUE; //uncomment for AOD merging\r
-const Bool_t kMergeAODs = kFALSE; //uncomment for no AOD merging\r
-const Bool_t kUsePAR = kTRUE; //set to kFALSE for libraries\r
-const Bool_t kDoJetTask = kTRUE; //set to kFALSE to skip JETAN task\r
-Int_t sevent = 0;\r
-\r
-Int_t mode = mLocal;\r
-char sconfig1[1024] = "ConfigPWG4AODtoAOD"; //"ConfigAnalysis";\r
-char sconfig2[1024] = "ConfigJetAnalysisFastJet.C";//"ConfigAnalysis";\r
-char sconfig3[1024] = "ConfigAnalysisElectron"; //"ConfigAnalysis";\r
-\r
-//Initialize the cross section and ntrials values. Do not modify.\r
-Double_t xsection = 0;\r
-Float_t ntrials = 0;\r
-\r
-void anaJete()\r
-{\r
- // Main\r
-\r
- //Process environmental variables from command line:\r
- ProcessEnvironment(); \r
- printf("Final Variables: kInputData %s, kMC %d, mode %d, config2 %s, config3 %s, sevent %d\n",kInputData.Data(),kMC,mode,sconfig2,sconfig3,sevent);\r
-\r
- if(!kMC) {\r
- kGetXSectionFromFileAndScale = kFALSE;\r
- }\r
-\r
- //--------------------------------------------------------------------\r
- // Load analysis libraries\r
- // Look at the method below, \r
- // change whatever you need for your analysis case\r
- // ------------------------------------------------------------------\r
- LoadLibraries(mode) ;\r
- \r
- //-------------------------------------------------------------------------------------------------\r
- //Create chain from ESD and from cross sections files, look below for options.\r
- //------------------------------------------------------------------------------------------------- \r
- if(kInputData == "ESD") kTreeName = "esdTree" ;\r
- else if(kInputData == "AOD") kTreeName = "aodTree" ;\r
- else if (kInputData == "MC") kTreeName = "TE" ;\r
- else {\r
- cout<<"Wrong data type "<<kInputData<<endl;\r
- break;\r
- }\r
-\r
- TChain * chain = new TChain(kTreeName) ;\r
- TChain * chainxs = new TChain("Xsection") ;\r
-\r
- if (mode==mLocal || mode==mLocalCAF || mode == mGRID) {\r
- CreateChain(mode, chain, chainxs); \r
- cout<<"Chain created"<<endl;\r
- }\r
-\r
- if( chain || mode==mPROOF || mode==mPLUGIN ){\r
- AliLog::SetGlobalLogLevel(AliLog::kError);//Minimum prints on screen\r
- \r
- //--------------------------------------\r
- // Make the analysis manager\r
- //-------------------------------------\r
- AliAnalysisManager *mgr = new AliAnalysisManager("Jet Manager", "Jet Manager");\r
-\r
- if( mode == mPLUGIN ){\r
- // Create and configure the alien handler plugin\r
- if (!AliAnalysisGrid::CreateToken()) return NULL;\r
- AliAnalysisAlien *plugin = new AliAnalysisAlien();\r
- plugin->SetRunMode("submit");\r
- //Uncomment the following 3 lines to permit auto xml creation\r
- //plugin->SetGridDataDir("/alice/sim/PDC_08b/LHC08d10/"); //dummy\r
- //plugin->SetDataPattern("AliESDs.root"); //dummy\r
- //plugin->AddRunNumber(30010); //dummy\r
- plugin->AddDataFile("mycollect.xml");\r
- plugin->SetGridWorkingDir("work3");\r
- plugin->SetAdditionalLibs("anaJet.C ConfigJetAnalysisFastJet.C ConfigAnalysisElectron.C ANALYSIS.par ANALYSISalice.par AOD.par EMCALUtils.par ESD.par PHOSUtils.par STEERBase.par JETAN.par FASTJETAN.par");\r
- plugin->SetJDLName("anaJet.jdl");\r
- plugin->SetExecutable("anaJet.sh");\r
- plugin->SetOutputFiles("histos.root");\r
- AliAnalysisGrid *alienHandler = plugin;\r
- if (!alienHandler) return;\r
-\r
- // Connect plug-in to the analysis manager\r
- mgr->SetGridHandler(alienHandler);\r
- }\r
-\r
- // MC handler\r
- if( (kMC && (kInputData == "ESD")) || kInputData == "MC"){\r
- AliMCEventHandler* mcHandler = new AliMCEventHandler();\r
- mcHandler->SetReadTR(kFALSE);//Do not search TrackRef file\r
- mgr->SetMCtruthEventHandler(mcHandler);\r
- if( kInputData == "MC") mgr->SetInputEventHandler(NULL);\r
- }\r
-\r
- // AOD output handler\r
- AliAODHandler* aodoutHandler = new AliAODHandler();\r
- aodoutHandler->SetOutputFileName("aodoutput.root");\r
- if(kMergeAODs)aodoutHandler->SetCreateNonStandardAOD();\r
- mgr->SetOutputEventHandler(aodoutHandler);\r
-\r
- //input\r
- if(kInputData == "ESD"){\r
- // ESD handler\r
- AliESDInputHandler *esdHandler = new AliESDInputHandler();\r
- mgr->SetInputEventHandler(esdHandler);\r
- }\r
- if(kInputData == "AOD"){\r
- // AOD handler\r
- AliAODInputHandler *aodHandler = new AliAODInputHandler();\r
- mgr->SetInputEventHandler(aodHandler);\r
- if(kMergeAODs){\r
- char path[1024];\r
- sprintf(path,"AliAOD.root");\r
- if(gSystem->Getenv("SIMPATH"))\r
- sprintf(path,"%s/AliAOD.root",gSystem->Getenv("SIMPATH"));\r
- cout<<"Config: Second input file: "<<path<<endl;\r
- aodHandler->SetMergeEvents(kTRUE);\r
- aodHandler->AddFriend(path);\r
- cout<<"Config: Starting event for second input file: "<<sevent<<endl;\r
- aodHandler->SetMergeOffset(sevent);\r
- }\r
- }\r
-\r
- mgr->SetDebugLevel(3); // For debugging, do not uncomment if you want no messages.\r
-\r
-\r
- const Bool_t kDoESDFilter = kTRUE; //need this for JETAN with input ESDs\r
- //const Bool_t kDoESDFilter = kFALSE;\r
- if(kInputData == "ESD" && kDoESDFilter){\r
- printf("Applying ESD filter cuts appropriate for jet analysis\n");\r
- //\r
- // Set of cuts\r
- // \r
- // standard\r
- AliESDtrackCuts* esdTrackCutsL = new AliESDtrackCuts("AliESDtrackCuts", "Loose");\r
- //esdTrackCutsL->SetMinNClustersTPC(50);\r
- //esdTrackCutsL->SetMaxChi2PerClusterTPC(3.5);\r
- //esdTrackCutsL->SetRequireTPCRefit(kTRUE);\r
- //esdTrackCutsL->SetMaxDCAToVertexXY(2.4);\r
- //esdTrackCutsL->SetMaxDCAToVertexZ(3.2);\r
- //esdTrackCutsL->SetDCAToVertex2D(kTRUE);\r
- //esdTrackCutsL->SetRequireSigmaToVertex(kFALSE);\r
- //esdTrackCutsL->SetAcceptKinkDaughters(kFALSE);\r
- //\r
- // hard\r
- AliESDtrackCuts* esdTrackCutsH = new AliESDtrackCuts("AliESDtrackCuts", "Hard");\r
- esdTrackCutsH->SetMinNClustersTPC(100);\r
- esdTrackCutsH->SetMaxChi2PerClusterTPC(2.0);\r
- esdTrackCutsH->SetRequireTPCRefit(kTRUE);\r
- esdTrackCutsH->SetMaxDCAToVertexXY(2.4);\r
- esdTrackCutsH->SetMaxDCAToVertexZ(3.2);\r
- esdTrackCutsH->SetDCAToVertex2D(kTRUE);\r
- esdTrackCutsH->SetRequireSigmaToVertex(kFALSE);\r
- esdTrackCutsH->SetAcceptKinkDaughters(kFALSE);\r
- //\r
- AliAnalysisFilter* trackFilter = new AliAnalysisFilter("trackFilter");\r
- trackFilter->AddCuts(esdTrackCutsL);\r
- // trackFilter->AddCuts(esdTrackCutsH);\r
- //\r
- AliAnalysisTaskESDfilter *esdfilter = new AliAnalysisTaskESDfilter("ESD Filter");\r
- esdfilter->SetTrackFilter(trackFilter);\r
- esdfilter->SetDebugLevel(10);\r
- mgr->AddTask(esdfilter);\r
- }\r
-\r
-\r
- //-------------------------------------------------------------------------\r
- //Define task, put here any other task that you want to use.\r
- //-------------------------------------------------------------------------\r
-\r
- //\r
- // Jet analysis\r
- //\r
- if( kDoJetTask ){\r
- AliAnalysisTaskJets *jetana = new AliAnalysisTaskJets("JetAnalysis",chain);\r
- jetana->SetDebugLevel(2);\r
- jetana->SetConfigFile(sconfig2); //Default ConfigJetAnalysisFastJet\r
- //Uncommenting the following line produces too many AddAtAndExpand warnings for now.\r
- if(kMergeAODs)jetana->ReadAODFromOutput(); //Uncomment when AOD merging\r
- mgr->AddTask(jetana);\r
- }\r
-\r
- //\r
- // electron analysis\r
- //\r
- AliAnalysisTaskParticleCorrelation * taskpwg4 = new AliAnalysisTaskParticleCorrelation ("Particle");\r
- taskpwg4->SetConfigFileName("ConfigAnalysisElectron"); //Default name is ConfigAnalysisElectron\r
- mgr->AddTask(taskpwg4);\r
- \r
- // Create containers for input/output\r
- AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer();\r
- AliAnalysisDataContainer *coutput1 = mgr->GetCommonOutputContainer();\r
- AliAnalysisDataContainer *coutput2 = mgr->CreateContainer("histos", TList::Class(),\r
- AliAnalysisManager::kOutputContainer, "histos.root");\r
-\r
-\r
- if(kInputData == "ESD" && kDoESDFilter){\r
- mgr->ConnectInput (esdfilter, 0, cinput1 );\r
- mgr->ConnectOutput (esdfilter, 0, coutput1 );\r
- }\r
-\r
- if( kDoJetTask ){\r
- mgr->ConnectInput (jetana, 0, cinput1 );\r
- mgr->ConnectOutput (jetana, 0, coutput1 );\r
- mgr->ConnectOutput (jetana, 1, coutput2 );\r
- }\r
-\r
- mgr->ConnectInput (taskpwg4, 0, cinput1 );\r
- mgr->ConnectOutput (taskpwg4, 0, coutput1 );\r
- mgr->ConnectOutput (taskpwg4, 1, coutput2 );\r
- \r
-\r
- //------------------------ \r
- //Scaling task\r
- //-----------------------\r
- cout<<">>> Scaling Task"<<endl;\r
- Int_t nfiles = chain->GetListOfFiles()->GetEntriesFast();//chainxs->GetEntries();\r
- Int_t nevents = chain->GetEntries();\r
- cout<<"Get? "<<kGetXSectionFromFileAndScale<<" nfiles "<<nfiles<<" nevents "<<nevents<<endl;\r
- if(kGetXSectionFromFileAndScale && nfiles > 0){\r
- cout<<"Init AnaScale"<<endl;\r
- AliAnaScale * scale = new AliAnaScale("scale") ;\r
- cout<<"Summed xsection "<<xsection<<" Summed ntrials "<<ntrials<<" total events "<<nevents<<endl;\r
- //Calculate the average\r
- xsection/=nfiles;\r
- ntrials/=nfiles;\r
- cout<<"Average xsection "<<xsection<<" Average ntrials "<<ntrials<<" total events "<<nevents<<endl;\r
- Double_t scaleFactor = xsection/ntrials/nevents ;\r
- cout<<"Scale factor "<<scaleFactor<<endl;\r
- scale->Set(scaleFactor) ;\r
- scale->MakeSumw2(kTRUE);//If you want histograms with error bars set to kTRUE\r
- scale->SetDebugLevel(2);\r
- mgr->AddTask(scale);\r
- \r
- AliAnalysisDataContainer *coutput3 = mgr->CreateContainer("histosscaled", \r
- TList::Class(), AliAnalysisManager::kOutputContainer, "histosscaled.root");\r
- mgr->ConnectInput (scale, 0, coutput2);\r
- mgr->ConnectOutput (scale, 0, coutput3 );\r
- }\r
- \r
- //-----------------------\r
- // Run the analysis\r
- //----------------------- \r
- TString smode = "";\r
- if (mode==mLocal || mode == mLocalCAF) \r
- smode = "local";\r
- else if (mode==mPROOF) \r
- smode = "proof";\r
- else if (mode==mGRID) \r
- smode = "local";\r
- else if (mode==mPLUGIN) \r
- smode = "grid";\r
- \r
- //mgr->ResetAnalysis();\r
- mgr->InitAnalysis();\r
- mgr->PrintStatus();\r
- if (mode==mPROOF)\r
- mgr->StartAnalysis(smode.Data(),kmydataset,1500,0);\r
- else if (mode==mPLUGIN)\r
- mgr->StartAnalysis(smode.Data());\r
- else\r
- mgr->StartAnalysis(smode.Data(),chain);\r
-\r
- cout <<" Analysis ended sucessfully "<< endl ;\r
-\r
- }\r
- else cout << "Chain was not produced ! "<<endl;\r
- \r
-}\r
-\r
-void LoadLibraries(const anaModes mode) {\r
- \r
- \r
- //----------------------------------------------------------\r
- // >>>>>>>>>>> Local mode <<<<<<<<<<<<<< \r
- //----------------------------------------------------------\r
- if (mode==mLocal || mode == mLocalCAF || mode == mGRID || mode == mPLUGIN) {\r
-\r
- //--------------------------------------\r
- // Load the needed libraries most of them already loaded by aliroot\r
- //--------------------------------------\r
- gSystem->Load("libTree.so");\r
- gSystem->Load("libGeom.so");\r
- gSystem->Load("libVMC.so");\r
- gSystem->Load("libXMLIO.so");\r
- if( kDoJetTask ){\r
- gSystem->Load("libCGAL");\r
- gSystem->Load("libfastjet");\r
- gSystem->Load("libSISConePlugin");\r
- }\r
-\r
- if(kUsePAR){\r
- //--------------------------------------------------------\r
- //If you want to use root and par files from aliroot\r
- //-------------------------------------------------------- \r
- SetupPar("STEERBase");\r
- SetupPar("ESD");\r
- SetupPar("AOD");\r
- SetupPar("ANALYSIS");\r
- SetupPar("ANALYSISalice");\r
- SetupPar("PHOSUtils");\r
- SetupPar("EMCALUtils");\r
- if( kDoJetTask ){\r
- cerr<<"Now Loading JETAN"<<endl;\r
- SetupPar("JETAN");\r
- cerr<<"Done Loading JETAN"<<endl;\r
- cerr<<"Now Loading FASTJETAN"<<endl;\r
- SetupPar("FASTJETAN");\r
- cerr<<"Done Loading FASTJETAN"<<endl;\r
- }\r
- SetupPar("PWG4PartCorrBase");\r
- SetupPar("PWG4PartCorrDep");\r
- }\r
- else{\r
- //--------------------------------------------------------\r
- // If you want to use already compiled libraries \r
- // in the aliroot distribution\r
- //--------------------------------------------------------\r
- gSystem->Load("libSTEERBase");\r
- gSystem->Load("libESD");\r
- gSystem->Load("libAOD");\r
- gSystem->Load("libANALYSIS");\r
- gSystem->Load("libANALYSISalice");\r
- gSystem->Load("libPHOSUtils");\r
- gSystem->Load("libEMCALUtils");\r
- if( kDoJetTask ){\r
- gSystem->Load("libJETAN");\r
- gSystem->Load("libFASTJETAN");\r
- }\r
- gSystem->Load("libPWG4PartCorrBase");\r
- gSystem->Load("libPWG4PartCorrDep");\r
- }\r
-\r
- \r
- }\r
-\r
- //---------------------------------------------------------\r
- // <<<<<<<<<< PROOF mode >>>>>>>>>>>>\r
- //---------------------------------------------------------\r
- else if (mode==mPROOF) {\r
- //\r
- // Connect to proof\r
- // Put appropriate username here\r
- // char* myproofname = "alicecaf";\r
- char* myproofname = "kread@localhost";\r
-\r
- //TProof::Reset("proof://kread@lxb6046.cern.ch");\r
- //TProof::Reset("proof://myproofname);\r
- //TProof::Reset("myproofname",kTRUE);\r
- gEnv->SetValue("XSec.GSI.DelegProxy","2"); \r
- //TProof::Mgr(myproofname)->ShowROOTVersions();\r
- //TProof::Mgr(myproofname)->SetROOTVersion("v5-24-00");\r
- TProof::Open(myproofname);\r
-\r
- // gProof->ClearPackages();\r
- // gProof->SetLogLevel(5);\r
- // gProof->ClearPackage("STEERBase");\r
- // gProof->ClearPackage("ESD");\r
- // gProof->ClearPackage("AOD");\r
- // gProof->ClearPackage("ANALYSIS");\r
- // gProof->ClearPackage("ANALYSISalice");\r
- // gProof->ClearPackage("PHOSUtils");\r
- // gProof->ClearPackage("EMCALUtils");\r
- // if( kDoJetTask ){\r
- // gProof->ClearPackage("JETAN");\r
- // gProof->ClearPackage("FASTJETAN");\r
- // }\r
- // gProof->ClearPackage("PWG4PartCorrBase");\r
- // gProof->ClearPackage("PWG4PartCorrDep");\r
- // gProof->ShowEnabledPackages();\r
-\r
- // Enable the STEERBase Package\r
- gProof->UploadPackage("STEERBase.par");\r
- gProof->EnablePackage("STEERBase");\r
- // Enable the ESD Package\r
- gProof->UploadPackage("ESD.par");\r
- gProof->EnablePackage("ESD");\r
- // Enable the AOD Package\r
- gProof->UploadPackage("AOD.par");\r
- gProof->EnablePackage("AOD");\r
- // Enable the Analysis Package\r
- gProof->UploadPackage("ANALYSIS.par");\r
- gProof->EnablePackage("ANALYSIS");\r
- // Enable the Analysis Package\r
- gProof->UploadPackage("ANALYSISalice.par");\r
- gProof->EnablePackage("ANALYSISalice");\r
- // Enable the PHOSUtils Package\r
- gProof->UploadPackage("PHOSUtils.par");\r
- gProof->EnablePackage("PHOSUtils");\r
- // Enable the EMCALUtils Package\r
- gProof->UploadPackage("EMCALUtils.par");\r
- gProof->EnablePackage("EMCALUtils");\r
- if( kDoJetTask ){\r
- // Enable JETAN analysis\r
- gProof->UploadPackage("JETAN.par");\r
- gProof->EnablePackage("JETAN");\r
- // Enable FASTJETAN analysis\r
- gProof->UploadPackage("FASTJETAN.par");\r
- gProof->EnablePackage("FASTJETAN");\r
- }\r
- // Enable the PWG4PartCorrBase Package\r
- gProof->UploadPackage("PWG4PartCorrBase.par");\r
- gProof->EnablePackage("PWG4PartCorrBase");\r
- // Enable the PWG4PartCorrDep Package\r
- gProof->UploadPackage("PWG4PartCorrDep.par");\r
- gProof->EnablePackage("PWG4PartCorrDep");\r
-\r
- gProof->ShowEnabledPackages();\r
- } \r
- \r
-}\r
-\r
-void SetupPar(char* pararchivename)\r
-{\r
- //Load par files, create analysis libraries\r
- //For testing, if par file already decompressed and modified\r
- //classes then do not decompress.\r
- \r
- TString cdir(Form("%s", gSystem->WorkingDirectory() )) ; \r
- TString parpar(Form("%s.par", pararchivename)) ; \r
- if ( gSystem->AccessPathName(pararchivename) ) { \r
- TString processline = Form(".! tar xvzf %s",parpar.Data()) ;\r
- gROOT->ProcessLine(processline.Data());\r
- }\r
- \r
- TString ocwd = gSystem->WorkingDirectory();\r
- gSystem->ChangeDirectory(pararchivename);\r
- \r
- // check for BUILD.sh and execute\r
- if (!gSystem->AccessPathName("PROOF-INF/BUILD.sh")) {\r
- printf("*******************************\n");\r
- printf("*** Building PAR archive ***\n");\r
- cout<<pararchivename<<endl;\r
- printf("*******************************\n");\r
- \r
- if (gSystem->Exec("PROOF-INF/BUILD.sh")) {\r
- Error("runProcess","Cannot Build the PAR Archive! - Abort!");\r
- return -1;\r
- }\r
- }\r
- // check for SETUP.C and execute\r
- if (!gSystem->AccessPathName("PROOF-INF/SETUP.C")) {\r
- printf("*******************************\n");\r
- printf("*** Setup PAR archive ***\n");\r
- cout<<pararchivename<<endl;\r
- printf("*******************************\n");\r
- gROOT->Macro("PROOF-INF/SETUP.C");\r
- }\r
- \r
- gSystem->ChangeDirectory(ocwd.Data());\r
- printf("Current dir: %s\n", ocwd.Data());\r
-}\r
-\r
-\r
-\r
-void CreateChain(const anaModes mode, TChain * chain, TChain * chainxs){\r
- //Fills chain with data\r
-\r
- TString datafile="";\r
- if(kInputData == "ESD") datafile = "AliESDs.root" ;\r
- else if(kInputData == "AOD") datafile = "AliAOD.root" ;\r
- else if(kInputData == "MC") datafile = "galice.root" ;\r
-\r
- if(kInputData == "AOD") kXSFileName = "pyxsec_hists.root";\r
-\r
- char * kGener = gSystem->Getenv("GENER");\r
- if(kGener) {\r
- cout<<"GENER "<<kGener<<endl;\r
- if(!strcmp(kGener,"PYTHIA")) kXSFileName = "pyxsec.root";\r
- else if(!strcmp(kGener,"HERWIG")) kXSFileName = "hexsec.root";\r
- else cout<<" UNKNOWN GENER, use default: "<<kXSFileName<<endl;\r
- }\r
- else cout<<" GENER not set, use default xs file name: "<<kXSFileName<<endl;\r
-\r
-\r
- TString ocwd = gSystem->WorkingDirectory();\r
- \r
- //-----------------------------------------------------------\r
- //Analysis of CAF data locally\r
- //-----------------------------------------------------------\r
- if(mode == mLocalCAF){\r
- // Read the input list of files and add them to the chain\r
- TString line;\r
- ifstream in;\r
- in.open("ESDlist.txt");\r
- while (in.good()) {\r
- in >> line;\r
- if (line.Length() == 0) continue;\r
- // cout << " line = " << line << endl;\r
- chain->Add(line);\r
- }\r
- }\r
- \r
- //---------------------------------------\r
- //Local files analysis\r
- //---------------------------------------\r
- else if(mode == mLocal){\r
- //If you want to add several ESD files sitting in a common directory INDIR\r
- //Specify as environmental variables the directory (INDIR), the number of files \r
- //to analyze (NFILES) and the pattern name of the directories with files (PATTERN)\r
-\r
- if(gSystem->Getenv("INDIR")) \r
- kInDir = gSystem->Getenv("INDIR") ; \r
- else cout<<"INDIR not set, use default: "<<kInDir<<endl; \r
- \r
- if(gSystem->Getenv("PATTERN")) \r
- kPattern = gSystem->Getenv("PATTERN") ; \r
- else cout<<"PATTERN not set, use default: "<<kPattern<<endl;\r
- \r
- if(gSystem->Getenv("NFILES"))\r
- kFile = atoi(gSystem->Getenv("NFILES")) ;\r
- else cout<<"NFILES not set, use default: "<<kFile<<endl;\r
- \r
- //Check if env variables are set and are correct\r
- if ( kInDir && kFile) {\r
- printf("Get %d files from directory %s\n",kFile,kInDir);\r
- if ( ! gSystem->cd(kInDir) ) {//check if ESDs directory exist\r
- printf("%s does not exist\n", kInDir) ;\r
- return ;\r
- }\r
-\r
- //if(gSystem->Getenv("XSFILE")) \r
- //kXSFileName = gSystem->Getenv("XSFILE") ; \r
- //else cout<<" XS file name not set, use default: "<<kXSFileName<<endl; \r
-\r
- cout<<"INDIR : "<<kInDir<<endl;\r
- cout<<"NFILES : "<<kFile<<endl;\r
- cout<<"PATTERN: " <<kPattern<<endl;\r
- cout<<"XSFILE : "<<kXSFileName<<endl;\r
- \r
-\r
- //Loop on ESD files, add them to chain\r
- Int_t event =0;\r
- Int_t skipped=0 ; \r
- char file[120] ;\r
- char filexs[120] ;\r
- \r
- for (event = 0 ; event < kFile ; event++) {\r
- sprintf(file, "%s/%s%d/%s", kInDir,kPattern,event,datafile.Data()) ; \r
- sprintf(filexs, "%s/%s%d/%s", kInDir,kPattern,event,kXSFileName) ; \r
- TFile * dataFile = 0 ; \r
- //Check if file exists and add it, if not skip it\r
- if ( dataFile = TFile::Open(file)) {\r
- if ( dataFile->Get(kTreeName) ) { \r
- Int_t nEventsPerFile = ((TTree*) dataFile->Get(kTreeName)) ->GetEntries();\r
- printf("++++ Adding %s, with %d events \n", file, nEventsPerFile) ;\r
- chain->AddFile(file);\r
- if(kGetXSectionFromFileAndScale) GetXsection(nEventsPerFile, filexs); \r
- }\r
- }\r
- else { \r
- printf("---- Skipping %s\n", file) ;\r
- skipped++ ;\r
- }\r
- }\r
- printf("number of entries # %lld, skipped %d\n", chain->GetEntries(), skipped*100) ; \r
- }\r
- else {\r
- TString input = "AliESDs.root" ;\r
- cout<<">>>>>> No list added, take a single file <<<<<<<<< "<<input<<endl;\r
- chain->AddFile(input);\r
- }\r
- \r
- }// local files analysis\r
- \r
- //------------------------------\r
- //GRID xml files\r
- //-----------------------------\r
- else if(mode == mGRID){\r
- //Get colection file. It is specified by the environmental\r
- //variable XML\r
-\r
- if(gSystem->Getenv("XML") )\r
- kXML = gSystem->Getenv("XML");\r
- else\r
- sprintf(kXML, "collection.xml") ; \r
- \r
- if (!TFile::Open(kXML)) {\r
- printf("No collection file with name -- %s -- was found\n",kXML);\r
- return ;\r
- }\r
- else cout<<"XML file "<<kXML<<endl;\r
-\r
- //Load necessary libraries and connect to the GRID\r
- gSystem->Load("libNetx.so") ; \r
- gSystem->Load("libRAliEn.so"); \r
- TGrid::Connect("alien://") ;\r
-\r
- //Feed Grid with collection file\r
- //TGridCollection * collection = (TGridCollection*)gROOT->ProcessLine(Form("TAlienCollection::Open(\"%s\", 0)", kXML));\r
- TGridCollection * collection = (TGridCollection*) TAlienCollection::Open(kXML);\r
- if (! collection) {\r
- AliError(Form("%s not found", kXML)) ; \r
- return kFALSE ; \r
- }\r
- TGridResult* result = collection->GetGridResult("",0 ,0);\r
- \r
- // Makes the ESD chain \r
- printf("*** Getting the Chain ***\n");\r
- Int_t nEventsPerFile = 0;\r
- for (Int_t index = 0; index < result->GetEntries(); index++) {\r
- TString alienURL = result->GetKey(index, "turl") ; \r
- cout << "================== " << alienURL << endl ; \r
- chain->Add(alienURL) ; \r
-\r
- if(kGetXSectionFromFileAndScale){\r
- //Get the number of events per file.\r
- //Do it only once, no need to open all the files.\r
- if(index == 0) {\r
- TFile * df = TFile::Open(alienURL);\r
- nEventsPerFile = ((TTree*) df->Get(kTreeName)) ->GetEntries();\r
- df->Close();\r
- } \r
- alienURL.ReplaceAll(datafile,kXSFileName);\r
- GetXsection(nEventsPerFile, alienURL);//chainxs->Add(alienURL) ; \r
- }\r
- }\r
- }// xml analysis\r
-\r
- gSystem->ChangeDirectory(ocwd.Data());\r
-}\r
-\r
-//________________________________________________\r
-void GetXsection(Int_t nEventsPerFile, TString filexs)\r
-{\r
- // Get the cross section from the corresponding file in the directory\r
- // where the data sits.\r
- // The xsection and ntrials global variables are updated per each file.\r
- // The average of these cuantities should be calculated after.\r
-\r
- TFile *fxs = TFile::Open(filexs);\r
- if(kInputData =="AOD") { //needs improvement, in case of train with ESDs, reading output AODs for example this is wrong.\r
- TList *l = (TList*) fxs->Get("cFilterList");\r
- TH1F * hxs = l->FindObject("h1Xsec") ;\r
- TH1F * htrial = l->FindObject("h1Trials") ;\r
- if(htrial->GetEntries()!=hxs->GetEntries() || htrial->GetEntries()==0){\r
- cout<<"Careful!!! Entries in histo for cross section "<<hxs->GetEntries()<< ", for trials "<<htrial->GetEntries()<<endl;\r
- continue;\r
- } \r
- xsection += hxs->GetBinContent(1);\r
- ntrials += htrial->GetBinContent(1)/nEventsPerFile;\r
- cout << "Chain: xsection " <<hxs->GetBinContent(1)<<" ntrials "<<htrial->GetBinContent(1)<<endl; \r
- cout << "nEventsPerFile = " << nEventsPerFile <<endl; \r
- cout << "Accumulating ntrials/event = " << ntrials << endl;\r
- }\r
- else {\r
- Double_t xs = 0;\r
- UInt_t ntr = 0;\r
- TTree * xstree = (TTree*)fxs->Get("Xsection");\r
- xstree->SetBranchAddress("xsection",&xs);\r
- xstree->SetBranchAddress("ntrials",&ntr);\r
- xstree->GetEntry(0);\r
- cout << "Chain: xsection " <<xs<<" ntrials "<<ntr<<endl;\r
- xsection += xs ;\r
- ntrials += (float) ntr/nEventsPerFile;\r
- cout << "Latest values read are ntr = " << ntr << " and nEventsPerFile = " << nEventsPerFile <<endl; \r
- cout << "Accumulating ntrials/event = " << ntrials <<endl;\r
- } \r
-}\r
-\r
-void ProcessEnvironment(){\r
-\r
- if (gSystem->Getenv("anaInputData"))\r
- kInputData = gSystem->Getenv("anaInputData");\r
-\r
- if (gSystem->Getenv("anakMC"))\r
- kMC = atoi(gSystem->Getenv("anakMC"));\r
-\r
- if (gSystem->Getenv("MODE"))\r
- mode = atoi(gSystem->Getenv("MODE"));\r
-\r
- if (gSystem->Getenv("CONFIG1"))\r
- sprintf(sconfig1,gSystem->Getenv("CONFIG1"));\r
-\r
- if (gSystem->Getenv("CONFIG2"))\r
- sprintf(sconfig2,gSystem->Getenv("CONFIG2"));\r
-\r
- if (gSystem->Getenv("CONFIG3"))\r
- sprintf(sconfig3,gSystem->Getenv("CONFIG3"));\r
-\r
- if (gSystem->Getenv("SEVENT"))\r
- sevent = atoi (gSystem->Getenv("SEVENT"));\r
- \r
- printf("Process: Variables: kInputData %s, kMC %d, mode %d, config2 %s, config3 %s, sevent %d\n",kInputData.Data(),kMC,mode,sconfig2,sconfig3,sevent);\r
-\r
-}\r