ROOT logo
/**
 * @file   LiteRailway.C
 * @author Christian Holm Christensen <cholm@master.hehi.nbi.dk>
 * @date   Tue Oct 16 18:59:59 2012
 * 
 * @brief  Proof-Lite analysis helper
 * 
 * @ingroup pwglf_forward_trains_helper
 * 
 */
#ifndef LITEHELPER_C
#define LITEHELPER_C
#include "ProofRailway.C"
#ifndef __CINT__
# include "ChainBuilder.C"
# include <TUrl.h>
# include <TString.h>
# include <TChain.h>
# include <TDSet.h>
# include <AliAnalysisManager.h>
# include <AliVEventHandler.h>
#else
class TChain;
class TUrl;
#endif

// ===================================================================
/**
 * Handler of analysis in Proof-Lite.  This is triggered by URIs of the 
 * form 
 * 
 * @code 
 * local:///<datadir>[?<options>][#treeName]
 * local:///<collection>[?<options>][#treeName]
 * local:///<file>[?<options>][#treeName]
 * @endcode 
 *
 * where 
 *
 * <dl>
 *   <dt><tt>&lt;datadir&gt;</tt></dt>
 *   <dd>is the base directory holding data files </dd>
 *   <dt><tt>&lt;collection&gt;</tt></dt>
 *   <dd>is an ASCII or XML list of input sources</dd>
 *   <dt><tt>&lt;file&gt;</tt></dt>
 *   <dd>is a single ROOT file</dd>
 *   <dt><tt>&lt;options&gt;</tt></dt>
 *   <dd>A &amp; separated list of options
 *     <dl>
 *       <dt><tt>recursive</tt></dt>
 *       <dd>Scan &lt;datadir&gt; recursively</dd>
 *       <dt><tt>mc</tt></dt>
 *       <dd>Scan also for MC files (<tt>galice.root</tt>, 
 *          <tt>Kinematics.root</tt>, and <tt>TrackRefs.root</tt>) when 
 *          scanning &lt;datadir&gt;</dd>
 *       <dt><tt>pattern=&lt;GLOB&gt;</tt></dt>
 *       <dd>Shell glob pattern that files must check when scanning 
 *         &lt;datadir&gt;</dd>
 *       <dt><tt>workers=N[x]</tt></dt>
 *       <dd>Set the number of workers to use.  If <tt>x</tt> is appended, 
 *         then it's maximum number of workers per slave</dd>
 *       <dt><tt>par[=all]</tt></dt>
 *       <dd>Use PAR files.  If the value <tt>all</tt> is given, then also 
 *         PAR files of STEERBase, ESD, AOD, ANALYSIS, OADB, ANALYSISalice 
 *         are used. </dd>
 *       <dt><tt>mode=[default,rec,sim,train,custom]</tt></dt>
 *       <dd>Set the AliROOT mode.  If not specified <tt>default</tt> 
 *         is assumed.  See also CreateAliROOTPar</dd>
 *      </dl>
 *   </dd>
 * </dl>
 *       
 * @ingroup pwglf_forward_trains_helper
 */
struct LiteRailway : public ProofRailway
{
  /** 
   * Constructor 
   * 
   * @param url     Url 
   * @param verbose Verbosity
   */
  LiteRailway(const TUrl& url, Int_t verbose)
    : ProofRailway(url, verbose), fChain(0)
  {
    fOptions.Add("recursive","Recursive scan");
    fOptions.Add("pattern",  "GLOB", "File name pattern", "*.root");
    fOptions.Remove("dsname");
    fOptions.Remove("storage");
  }
  /** 
   * Copy constructor 
   * 
   * @param o Object to copy from 
   */
  LiteRailway(const LiteRailway& o) 
    : ProofRailway(o), fChain(o.fChain)
  {}
  /** 
   * Assignment operator 
   * 
   * @param o Object to assign from 
   * 
   * @return Reference to this 
   */
  LiteRailway& operator=(const LiteRailway& o) 
  {
    if (&o == this) return *this;
    ProofRailway::operator=(o);
    fChain = o.fChain;
    return *this;
  }
  /** 
   * Destructor 
   */
  virtual ~LiteRailway() {}
  /** 
   * Set-up done before task set-ups 
   * 
   * @return true on success 
   */
  virtual Bool_t PreSetup() 
  {
    fUrl.SetProtocol("lite");
    Bool_t ret = ProofRailway::PreSetup();
    return ret;
  }
  /** 
   * Set-up done after task set-ups
   * 
   * @return true on success
   */
  virtual Bool_t PostSetup()
  {
    // -- Check for local chain --------------------------------------
    TString  pattern   = (fOptions.Has("pattern") ?fOptions.Get("pattern") :"");
    TString  treeName  = fUrl.GetAnchor();
    Bool_t   recursive = fOptions.Has("recursive");
    Bool_t   mc        = fOptions.Has("mc");
    TString  src       = fUrl.GetFile();
    UShort_t type      = ChainBuilder::CheckSource(src, 0);
    if (type == ChainBuilder::kInvalid) {
      Error("LiteRailway", "Cannot generate TChain from %s", src.Data());
      return false;
    }

    // --- Create the chain ------------------------------------------
    pattern.ReplaceAll("@", "#");
    Bool_t chainMC = (mc && AliAnalysisManager::GetAnalysisManager()
		      ->GetMCtruthEventHandler() != 0);
    fChain = ChainBuilder::Create(type, src, treeName, pattern, 
				  chainMC, recursive, fVerbose > 5);
    if (!fChain) { 
      Error("PostSetup", "No chain defined "
	    "(src=%s, treeName=%s, pattern=%s, mc=%s, recursive=%s)", 
	    src.Data(), treeName.Data(), pattern.Data(), 
	    (mc ? "true" : "false"), (recursive ? "true" : "false"));
      return false;
    }

    return ProofRailway::PostSetup();
  }
  /** 
   * Start the analysis 
   * 
   * @param nEvents Number of events to analyse 
   * 
   * @return The return value of AliAnalysisManager::StartAnalysis
   */
  virtual Long64_t Run(Long64_t nEvents=-1) 
  {
    AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager();
    gProof->SetLogLevel(TMath::Max(fVerbose-2,0), 
			/* TProofDebug::kPacketizer| */
			TProofDebug::kLoop|
			/* TProofDebug::kSelector|
			TProofDebug::kOutput|
			TProofDebug::kInput|
			TProofDebug::kGlobal|*/
			TProofDebug::kPackage);
    if (nEvents < 0) nEvents = fChain->GetEntries();
    Long64_t off = fOptions.AsLong("offset", 0);
    if (nEvents > 0 && nEvents < off) {
      Warning("Run", "Number of events %lld < offset (%lld), stopping", 
	      nEvents, off);
      return 0;
    }
    Long64_t ret = mgr->StartAnalysis("proof", fChain, nEvents, off);
    
    if (fVerbose > 2) 
      TProof::Mgr(fUrl.GetUrl())->GetSessionLogs()->Save("*","lite.log");
    return ret;
  }
  /** 
   * Path of output 
   * 
   * @return Path to output - possibly a data set
   */
  virtual TString OutputPath() const 
  {
    AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager();
    if (!mgr) return "";

    AliVEventHandler* outH = mgr->GetOutputEventHandler();
    if (!outH) return "";
    
    TString ret = gSystem->ConcatFileName(gSystem->WorkingDirectory(),
					  outH->GetOutputFileName());
    return ret;
  }

  /** 
   * @return URL help string
   */
  virtual const Char_t* UrlHelp() const 
  {
    return "lite://<datadir_or_list>[?<options>][#<treeName]";
  }
  /** 
   * @return The short description
   */
  virtual const char* Desc() const { return "PROOF-lite"; }
  /** Our chain */
  TChain* fChain;
};
#endif
//
// EOF
//

 LiteRailway.C:1
 LiteRailway.C:2
 LiteRailway.C:3
 LiteRailway.C:4
 LiteRailway.C:5
 LiteRailway.C:6
 LiteRailway.C:7
 LiteRailway.C:8
 LiteRailway.C:9
 LiteRailway.C:10
 LiteRailway.C:11
 LiteRailway.C:12
 LiteRailway.C:13
 LiteRailway.C:14
 LiteRailway.C:15
 LiteRailway.C:16
 LiteRailway.C:17
 LiteRailway.C:18
 LiteRailway.C:19
 LiteRailway.C:20
 LiteRailway.C:21
 LiteRailway.C:22
 LiteRailway.C:23
 LiteRailway.C:24
 LiteRailway.C:25
 LiteRailway.C:26
 LiteRailway.C:27
 LiteRailway.C:28
 LiteRailway.C:29
 LiteRailway.C:30
 LiteRailway.C:31
 LiteRailway.C:32
 LiteRailway.C:33
 LiteRailway.C:34
 LiteRailway.C:35
 LiteRailway.C:36
 LiteRailway.C:37
 LiteRailway.C:38
 LiteRailway.C:39
 LiteRailway.C:40
 LiteRailway.C:41
 LiteRailway.C:42
 LiteRailway.C:43
 LiteRailway.C:44
 LiteRailway.C:45
 LiteRailway.C:46
 LiteRailway.C:47
 LiteRailway.C:48
 LiteRailway.C:49
 LiteRailway.C:50
 LiteRailway.C:51
 LiteRailway.C:52
 LiteRailway.C:53
 LiteRailway.C:54
 LiteRailway.C:55
 LiteRailway.C:56
 LiteRailway.C:57
 LiteRailway.C:58
 LiteRailway.C:59
 LiteRailway.C:60
 LiteRailway.C:61
 LiteRailway.C:62
 LiteRailway.C:63
 LiteRailway.C:64
 LiteRailway.C:65
 LiteRailway.C:66
 LiteRailway.C:67
 LiteRailway.C:68
 LiteRailway.C:69
 LiteRailway.C:70
 LiteRailway.C:71
 LiteRailway.C:72
 LiteRailway.C:73
 LiteRailway.C:74
 LiteRailway.C:75
 LiteRailway.C:76
 LiteRailway.C:77
 LiteRailway.C:78
 LiteRailway.C:79
 LiteRailway.C:80
 LiteRailway.C:81
 LiteRailway.C:82
 LiteRailway.C:83
 LiteRailway.C:84
 LiteRailway.C:85
 LiteRailway.C:86
 LiteRailway.C:87
 LiteRailway.C:88
 LiteRailway.C:89
 LiteRailway.C:90
 LiteRailway.C:91
 LiteRailway.C:92
 LiteRailway.C:93
 LiteRailway.C:94
 LiteRailway.C:95
 LiteRailway.C:96
 LiteRailway.C:97
 LiteRailway.C:98
 LiteRailway.C:99
 LiteRailway.C:100
 LiteRailway.C:101
 LiteRailway.C:102
 LiteRailway.C:103
 LiteRailway.C:104
 LiteRailway.C:105
 LiteRailway.C:106
 LiteRailway.C:107
 LiteRailway.C:108
 LiteRailway.C:109
 LiteRailway.C:110
 LiteRailway.C:111
 LiteRailway.C:112
 LiteRailway.C:113
 LiteRailway.C:114
 LiteRailway.C:115
 LiteRailway.C:116
 LiteRailway.C:117
 LiteRailway.C:118
 LiteRailway.C:119
 LiteRailway.C:120
 LiteRailway.C:121
 LiteRailway.C:122
 LiteRailway.C:123
 LiteRailway.C:124
 LiteRailway.C:125
 LiteRailway.C:126
 LiteRailway.C:127
 LiteRailway.C:128
 LiteRailway.C:129
 LiteRailway.C:130
 LiteRailway.C:131
 LiteRailway.C:132
 LiteRailway.C:133
 LiteRailway.C:134
 LiteRailway.C:135
 LiteRailway.C:136
 LiteRailway.C:137
 LiteRailway.C:138
 LiteRailway.C:139
 LiteRailway.C:140
 LiteRailway.C:141
 LiteRailway.C:142
 LiteRailway.C:143
 LiteRailway.C:144
 LiteRailway.C:145
 LiteRailway.C:146
 LiteRailway.C:147
 LiteRailway.C:148
 LiteRailway.C:149
 LiteRailway.C:150
 LiteRailway.C:151
 LiteRailway.C:152
 LiteRailway.C:153
 LiteRailway.C:154
 LiteRailway.C:155
 LiteRailway.C:156
 LiteRailway.C:157
 LiteRailway.C:158
 LiteRailway.C:159
 LiteRailway.C:160
 LiteRailway.C:161
 LiteRailway.C:162
 LiteRailway.C:163
 LiteRailway.C:164
 LiteRailway.C:165
 LiteRailway.C:166
 LiteRailway.C:167
 LiteRailway.C:168
 LiteRailway.C:169
 LiteRailway.C:170
 LiteRailway.C:171
 LiteRailway.C:172
 LiteRailway.C:173
 LiteRailway.C:174
 LiteRailway.C:175
 LiteRailway.C:176
 LiteRailway.C:177
 LiteRailway.C:178
 LiteRailway.C:179
 LiteRailway.C:180
 LiteRailway.C:181
 LiteRailway.C:182
 LiteRailway.C:183
 LiteRailway.C:184
 LiteRailway.C:185
 LiteRailway.C:186
 LiteRailway.C:187
 LiteRailway.C:188
 LiteRailway.C:189
 LiteRailway.C:190
 LiteRailway.C:191
 LiteRailway.C:192
 LiteRailway.C:193
 LiteRailway.C:194
 LiteRailway.C:195
 LiteRailway.C:196
 LiteRailway.C:197
 LiteRailway.C:198
 LiteRailway.C:199
 LiteRailway.C:200
 LiteRailway.C:201
 LiteRailway.C:202
 LiteRailway.C:203
 LiteRailway.C:204
 LiteRailway.C:205
 LiteRailway.C:206
 LiteRailway.C:207
 LiteRailway.C:208
 LiteRailway.C:209
 LiteRailway.C:210
 LiteRailway.C:211
 LiteRailway.C:212
 LiteRailway.C:213
 LiteRailway.C:214
 LiteRailway.C:215
 LiteRailway.C:216
 LiteRailway.C:217
 LiteRailway.C:218
 LiteRailway.C:219
 LiteRailway.C:220
 LiteRailway.C:221
 LiteRailway.C:222
 LiteRailway.C:223
 LiteRailway.C:224
 LiteRailway.C:225
 LiteRailway.C:226
 LiteRailway.C:227
 LiteRailway.C:228
 LiteRailway.C:229
 LiteRailway.C:230
 LiteRailway.C:231