3 * @author Christian Holm Christensen <cholm@master.hehi.nbi.dk>
4 * @date Tue Oct 16 18:59:59 2012
6 * @brief Proof-Lite analysis helper
8 * @ingroup pwglf_forward_trains_helper
13 #include "ProofHelper.C"
15 # include "ChainBuilder.C"
20 # include <AliAnalysisManager.h>
21 # include <AliVEventHandler.h>
27 // ===================================================================
29 * Handler of analysis in Proof-Lite. This is triggered by URIs of the
33 * local:///<datadir>[?<options>][#treeName]
34 * local:///<collection>[?<options>][#treeName]
35 * local:///<file>[?<options>][#treeName]
41 * <dt><tt><datadir></tt></dt>
42 * <dd>is the base directory holding data files </dd>
43 * <dt><tt><collection></tt></dt>
44 * <dd>is an ASCII or XML list of input sources</dd>
45 * <dt><tt><file></tt></dt>
46 * <dd>is a single ROOT file</dd>
47 * <dt><tt><options></tt></dt>
48 * <dd>A & separated list of options
50 * <dt><tt>recursive</tt></dt>
51 * <dd>Scan <datadir> recursively</dd>
52 * <dt><tt>mc</tt></dt>
53 * <dd>Scan also for MC files (<tt>galice.root</tt>,
54 * <tt>Kinematics.root</tt>, and <tt>TrackRefs.root</tt>) when
55 * scanning <datadir></dd>
56 * <dt><tt>pattern=<GLOB></tt></dt>
57 * <dd>Shell glob pattern that files must check when scanning
58 * <datadir></dd>
59 * <dt><tt>workers=N[x]</tt></dt>
60 * <dd>Set the number of workers to use. If <tt>x</tt> is appended,
61 * then it's maximum number of workers per slave</dd>
62 * <dt><tt>par[=all]</tt></dt>
63 * <dd>Use PAR files. If the value <tt>all</tt> is given, then also
64 * PAR files of STEERBase, ESD, AOD, ANALYSIS, OADB, ANALYSISalice
66 * <dt><tt>mode=[default,rec,sim,train,custom]</tt></dt>
67 * <dd>Set the AliROOT mode. If not specified <tt>default</tt>
68 * is assumed. See also CreateAliROOTPar</dd>
73 * @ingroup pwglf_forward_trains_helper
75 struct LiteHelper : public ProofHelper
81 * @param verbose Verbosity
83 LiteHelper(const TUrl& url, Int_t verbose)
84 : ProofHelper(url, verbose), fChain(0)
86 fOptions.Add("recursive","Recursive scan");
87 fOptions.Add("pattern", "GLOB", "File name pattern", "*.root");
88 fOptions.Remove("dsname");
89 fOptions.Remove("storage");
94 * @param o Object to copy from
96 LiteHelper(const LiteHelper& o)
97 : ProofHelper(o), fChain(o.fChain)
100 * Assignment operator
102 * @param o Object to assign from
104 * @return Reference to this
106 LiteHelper& operator=(const LiteHelper& o)
108 if (&o == this) return *this;
109 ProofHelper::operator=(o);
116 virtual ~LiteHelper() {}
118 * Set-up done before task set-ups
120 * @return true on success
122 virtual Bool_t PreSetup()
124 fUrl.SetProtocol("lite");
125 Bool_t ret = ProofHelper::PreSetup();
129 * Set-up done after task set-ups
131 * @return true on success
133 virtual Bool_t PostSetup()
135 // -- Check for local chain --------------------------------------
136 TString pattern = (fOptions.Has("pattern") ?fOptions.Get("pattern") :"");
137 TString treeName = fUrl.GetAnchor();
138 Bool_t recursive = fOptions.Has("recursive");
139 Bool_t mc = fOptions.Has("mc");
140 TString src = fUrl.GetFile();
141 UShort_t type = ChainBuilder::CheckSource(src, 0);
142 if (type == ChainBuilder::kInvalid) {
143 Error("LiteHelper", "Cannot generate TChain from %s", src.Data());
147 // --- Create the chain ------------------------------------------
148 pattern.ReplaceAll("@", "#");
149 Bool_t chainMC = (mc && AliAnalysisManager::GetAnalysisManager()
150 ->GetMCtruthEventHandler() != 0);
151 fChain = ChainBuilder::Create(type, src, treeName, pattern,
152 chainMC, recursive, fVerbose > 5);
154 Error("PostSetup", "No chain defined "
155 "(src=%s, treeName=%s, pattern=%s, mc=%s, recursive=%s)",
156 src.Data(), treeName.Data(), pattern.Data(),
157 (mc ? "true" : "false"), (recursive ? "true" : "false"));
161 return ProofHelper::PostSetup();
166 * @param nEvents Number of events to analyse
168 * @return The return value of AliAnalysisManager::StartAnalysis
170 virtual Long64_t Run(Long64_t nEvents=-1)
172 AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager();
173 gProof->SetLogLevel(TMath::Max(fVerbose-2,0),
174 /* TProofDebug::kPacketizer| */
176 /* TProofDebug::kSelector|
177 TProofDebug::kOutput|
179 TProofDebug::kGlobal|*/
180 TProofDebug::kPackage);
181 if (nEvents < 0) nEvents = fChain->GetEntries();
182 Long64_t off = fOptions.AsLong("offset", 0);
183 if (nEvents > 0 && nEvents < off) {
184 Warning("Run", "Number of events %lld < offset (%lld), stopping",
188 Long64_t ret = mgr->StartAnalysis("proof", fChain, nEvents, off);
191 TProof::Mgr(fUrl.GetUrl())->GetSessionLogs()->Save("*","lite.log");
197 * @return Path to output - possibly a data set
199 virtual TString OutputPath() const
201 AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager();
204 AliVEventHandler* outH = mgr->GetOutputEventHandler();
205 if (!outH) return "";
207 TString ret = gSystem->ConcatFileName(gSystem->WorkingDirectory(),
208 outH->GetOutputFileName());
213 * @return URL help string
215 virtual const Char_t* UrlHelp() const
217 return "lite://<datadir_or_list>[?<options>][#<treeName]";
220 * @return The short description
222 virtual const char* Desc() const { return "PROOF-lite"; }