/** * @file MakeFMDMCTrackTrain.C * @author Christian Holm Christensen <cholm@nbi.dk> * @date Fri Jun 1 13:54:47 2012 * * @brief * * @ingroup pwglf_forward_trains_specific */ #include "TrainSetup.C" // #include "ParUtilities.C" //==================================================================== /** * Analysis train to make Forward and Central MC corrections * * * @ingroup pwglf_forward_mc * @ingroup pwglf_forward_trains_specific */ class MakeFMDMCTrackTrain : public TrainSetup { public: /** * Constructor. Date and time must be specified when running this * in Termiante mode on Grid * * @param name Name of train (free form) */ MakeFMDMCTrackTrain(const char* name) : TrainSetup(name) { fOptions.Add("use-tuple", "Whether to make an NTuple of hits"); fOptions.Add("max-strips", "NUMBER", "Max strips/cluster", 2); fOptions.Set("type", "ESD"); } protected: /** * Create the tasks * * @param mgr Analysis manager */ void CreateTasks(AliAnalysisManager* mgr) { // --- Output file name ------------------------------------------ AliAnalysisManager::SetCommonFileName("forward_mctracks.root"); // --- Load libraries/pars --------------------------------------- fRailway->LoadLibrary("PWGLFforward2"); // fRailway->LoadLibrary("Proof"); // fRailway->LoadLibrary("Gui"); // Sigh! CDB depends on GUI! // fRailway->LoadLibrary("CDB"); // fRailway->LoadLibrary("RAWDatabase"); // fRailway->LoadLibrary("STEER"); // fRailway->LoadLibrary("FMDbase"); // fRailway->LoadLibrary("FMDsim"); // fRailway->LoadLibrary("PWGLFforwardhit"); // --- Set load path --------------------------------------------- gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/PWGLF/FORWARD/analysis2", gROOT->GetMacroPath())); // --- Check if this is MC --------------------------------------- if (!mgr->GetMCtruthEventHandler()) Fatal("CreateTasks", "No MC truth handler"); Bool_t useTuple = fOptions.AsBool("use-tuple"); UShort_t maxStrips = fOptions.AsInt("max-strips"); Int_t verbose = fOptions.AsInt("verbose"); TString args = TString::Format("%d,%d,%d", useTuple, maxStrips, verbose); if (!CoupleCar("AddTaskFMDMCTracks.C", args)) Fatal("CreateTasks", "Couldn't add our task"); } //__________________________________________________________________ /** * Create physics selection , and add to manager * * @param mc Whether this is for MC * @param mgr Manager */ void CreatePhysicsSelection(Bool_t mc, AliAnalysisManager* mgr) { TrainSetup::CreatePhysicsSelection(mc, mgr); // --- Get input event handler ----------------------------------- AliInputEventHandler* ih = dynamic_cast<AliInputEventHandler*>(mgr->GetInputEventHandler()); if (!ih) Fatal("CreatePhysicsSelection", "Couldn't get input handler (%p)", ih); // --- Get Physics selection ------------------------------------- AliPhysicsSelection* ps = dynamic_cast<AliPhysicsSelection*>(ih->GetEventSelection()); if (!ps) Fatal("CreatePhysicsSelection", "Couldn't get PhysicsSelection (%p)", ps); // --- Ignore trigger class when selecting events. This means --- // --- that we get offline+(A,C,E) events too -------------------- // ps->SetSkipTriggerClassSelection(true); } //__________________________________________________________________ /** * @return 0 - AOD disabled */ virtual AliVEventHandler* CreateOutputHandler(UShort_t) { return 0; } /** * Do not the centrality selection */ // void CreateCentralitySelection(Bool_t) {} //__________________________________________________________________ const char* ClassName() const { return "MakeFMDMCTrackTrain"; } /** * Overloaded to create new dNdeta.C and dndeta.sh in the output * directory * * @param asShellScript */ void SaveSetup(Bool_t asShellScript) { TrainSetup::SaveSetup(asShellScript); SaveSummarize(); SaveAnalyseNTuple(); SaveReFit(); if (!fRailway || fRailway->Mode() != Railway::kGrid) return; SaveDownloadTrees(); } /** * Write a ROOT script to draw summary * */ void SaveSummarize() { std::ofstream f("Summarize.C"); if (!f) { Error("SaveSummarize", "Failed to open Summarize.C script"); return; } f << "// Generated by " << ClassName() << "\n" << "// WHAT is a bit mask of\n" << "// 0x001 Event inspector\n" << "// 0x002 Track inspector\n" << "// 0x004 Energy loss fits\n" << "// 0x100 Landscape\n" << "// 0x200 Pause\n" << "//\n" << "void Summarize(const char* filename=\"forward_mctracks.root\",\n" << " UShort_t what=0x10F)\n" << "{\n" << " const char* fwd=\"$ALICE_ROOT/PWGLF/FORWARD/analysis2\";\n" << " gROOT->LoadMacro(Form(\"%s/scripts/SummaryMCTrackDrawer.C+g\",fwd));\n" << " SummaryMCTrackDrawer smd;\n" << " smd.Run(filename,what);\n" << "}\n" << "// EOF" << std::endl; f.close(); } /** * Make a ROOT Script to download the generated AODs * */ void SaveDownloadTrees() { std::ofstream f("DownloadTrees.C"); if (!f) { Error("SaveDownloadTrees", "Failed to open DownloadTrees.C"); return; } f << "// Generated by " << ClassName() << "\n" << "void DownloadTrees(Bool_t force=false)\n" << "{\n" << " if (!TGrid::Connect(\"alien://\")) {\n" << " Error(\"DownloadTrees\",\"Failed to connect to AliEn\");\n" << " return;\n" << " }\n\n" << " TString dir(\"" << fRailway->OutputPath() << "\");\n" << " TString pat(\"*/forward_tuple.root\");\n" << " TGridResult* r = gGrid->Query(dir,pat);\n" << " if (!r) {\n" << " Error(\"DownloadTrees\",\"No result from query\");\n" << " return;\n" << " }\n\n" << " Int_t n = r->GetEntries();\n" << " Printf(\"=== Got a total of %d AOD files\",n);\n" << " for (Int_t i = 0; i < n; i++) {\n" << " TString path(r->GetKey(i, \"turl\"));\n" << " TString dir(gSystem->DirName(path));\n" << " TString sub(gSystem->BaseName(dir));\n" << " TString subsub(gSystem->BaseName(gSystem->DirName(dir)));\n" << " TString out = TString::Format(\"forward_tree_%s_%s.root\",\n" << " subsub.Data(),sub.Data());\n" << " if (!gSystem->AccessPathName(out.Data()) && !force) {\n" << " Printf(\"=== Already have %s\",out.Data());\n" << " continue;\n" << " }\n" << " Printf(\"=== Getting %s %s (%3d/%3d)\",\n" << " subsub.Data(),sub.Data(),i,n);\n" << " if (!TFile::Cp(path, out)) {\n" << " Warning(\"DownloadTrees\",\"Failed to copy %s -> %s\",\n" << " path.Data(), out.Data());\n" << " continue;\n" << " }\n" << " }\n" << "}\n" << "// EOF\n" << std::endl; f.close(); } /** * Make a ROOT Script to download the generated AODs * */ void SaveAnalyseNTuple() { std::ofstream f("AnalyseNTuple.C"); if (!f) { Error("SaveAnalyseNTuple", "Failed to open AnalyseNTuple.C"); return; } f << "// Generated by " << ClassName() << "\n" << "// Process with bare ROOT in ProofLite\n" << "void AnalyseNTuple(Bool_t proof=true,\n" << " Long64_t max=-1,\n" << " const char* opt=\"\")\n" << "{\n" << " const char* fwd=\"$ALICE_ROOT/PWGLF/FORWARD/analysis2\";\n" << " gSystem->AddIncludePath(\"-I${ALICE_ROOT}/include\");\n" << " gROOT->Macro(Form(\"%s/scripts/LoadLibs.C\",fwd));\n" << " gROOT->LoadMacro(Form(\"%s/scripts/TupleSelector.C+%s\",\n" << " fwd, opt));\n" << " if (proof) TupleSelector::Proof(maxEvents, opt);\n" << " else TupleSelector::Run(maxEvents);\n" << "}\n" << "// EOF" << std::endl; f.close(); } void SaveReFit() { std::ofstream f("ReFit.C"); if (!f) { Error("SaveRerun", "Failed to open ReFit.C script"); return; } f << std::boolalpha << "// Generated by " << ClassName() << "\n" << "// If force=true, then force set parameters\n" << "//\n" << "void ReFit(Bool_t force=false,\n" << " const char* filename=\"forward_mctracks.root\")\n" << "{\n" << " const char* fwd=\"$ALICE_ROOT/PWGLF/FORWARD/analysis2\";\n" << " gROOT->LoadMacro(Form(\"%s/corrs/RerunTrackELoss.C\",fwd));\n" << " RerunTrackELoss(force,filename);\n" << "}\n" << "// EOF" << std::endl; f.close(); } void PostShellCode(std::ostream& f) { f << " echo \"=== Summarizing results ...\"\n" << " aliroot -l -b -q ${prefix}Summarize.C\n" << std::endl; } }; // // EOF //