ROOT logo
/**
 * @file   LiteHelper.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 "ProofHelper.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 LiteHelper : public ProofHelper
{
  /** 
   * Constructor 
   * 
   * @param url     Url 
   * @param verbose Verbosity
   */
  LiteHelper(const TUrl& url, Int_t verbose)
    : ProofHelper(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 
   */
  LiteHelper(const LiteHelper& o) 
    : ProofHelper(o), fChain(o.fChain)
  {}
  /** 
   * Assignment operator 
   * 
   * @param o Object to assign from 
   * 
   * @return Reference to this 
   */
  LiteHelper& operator=(const LiteHelper& o) 
  {
    if (&o == this) return *this;
    ProofHelper::operator=(o);
    fChain = o.fChain;
    return *this;
  }
  /** 
   * Destructor 
   */
  virtual ~LiteHelper() {}
  /** 
   * Set-up done before task set-ups 
   * 
   * @return true on success 
   */
  virtual Bool_t PreSetup() 
  {
    fUrl.SetProtocol("lite");
    Bool_t ret = ProofHelper::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("LiteHelper", "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 ProofHelper::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
//

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