ROOT logo
/**
 * @file   AAFPluginRailway.C
 * @author Christian Holm Christensen <cholm@master.hehi.nbi.dk>
 * @date   Tue Oct 16 19:01:45 2012
 * 
 * @brief  AAF (using AliAnalysisAlien) analysis helper
 * 
 * @ingroup pwglf_forward_trains_helper
 * 
 */
#ifndef AAFPLUGINHELPER_C
#define AAFPLUGINHELPER_C
#include "PluginRailway.C"
#ifndef __CINT__
# include <TUrl.h>
# include <TString.h>
# include <AliAnalysisManager.h>
# include <AliAnalysisAlien.h>
#else
class TUrl;
class AliAnalysisAlien;
#endif

// ===================================================================
/**
 * Handle analysis on an Alice Analysis Facility (AAF)
 * 
 * This helper is triggered by a URL of the form 
 *
 * @code
 * proof://[<user>@]<host>[:<port>]/<dsname>[?<options>][#<treename>]
 * @endcode 
 * where &lt;host&gt; is a known AAF (e.g., <tt>alice-caf.cern.ch</tt>),
 * and the &lt;options&gt; contains <tt>plugin</tt>
 * <dl>
 *   <dt>&lt;user&gt;</dt>
 *   <dd>Optional user name</dd>
 *   <dt>&lt;host&gt;</dt>
 *   <dd>PROOF cluster master host</dd>
 *   <dt>&lt;port&gt;</dt>
 *   <dd>Optional PROOF cluster port on master host</dd>
 *   <dt>&lt;dsname&gt;</dt>
 *   <dd>Data set name</dd>
 *   <dt>&lt;treename&gt;</dt>
 *   <dd>Optional tree name in data set, often <tt>esdTree</tt> or
 *   <tt>aodTree</tt></dd>
 *   <dt>&lt;options&gt;</dt>
 *   <dd>List of options separated by an &amp;
 *     <dl>
 *       <dt><tt>dsname</tt>[=&lt;output dataset&gt;]</dt>
 *       <dd>Register tree output (e.g., AOD) as a new data set on the
 *         PROOF cluster. If &lt;output dataset&gt; is not specified, take
 *         the name of the train.</dd>
 *       <dt><tt>storage=&lt;url&gt;</tt></dt>
 *       <dd>Specify a non-default storage location for special output
 *         (e.g., AOD trees).  &lt;url&gt; should be a valid XRootd 
 *         server URI accessible to the slaves - e.g., 
 *         <tt>root://lxplus.cern.ch:10930//tmp</tt>.</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>
 *       <dt><tt>par</tt></dt>
 *       <dd> Use PAR files</dd>
 *       <dt><tt>workers=</tt><i>N</i><tt>[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>
 *     </dl>
 *   </dd>
 * </dl>  
 *
 * @ingroup pwglf_forward_trains_helper
 */
struct AAFPluginRailway : public PluginRailway
{
  /** 
   * Constructor 
   * 
   * @param url  Url 
   * @param verbose Verbosity level
   */
  AAFPluginRailway(const TUrl& url, Int_t verbose)
    : PluginRailway(url, verbose)
  {
    fOptions.Add("workers", "N[x]", "Number of workers to use", 0);
    fOptions.Add("dsname",  "NAME", "Make output dataset", "");
    fOptions.Add("wrapper", "CMD", "Wrapper command", "");
    fOptions.Add("clear",   "Clear all packages");
    fOptions.Add("reset",   "soft|hard", "Reset cluster", "hard");

  }
  /** 
   * Destructor
   */
  virtual ~AAFPluginRailway() {}
  /** 
   * Called before setting up 
   * 
   * @return true on success 
   */
  virtual Bool_t PreSetup()
  {
    // --- Handle software options -----------------------------------
    TString root = fOptions.Get("root");
    fHandler->SetRootVersionForProof(Form("VO_ALICE@ROOT::%s", root.Data()));
    fHandler->SetProofCluster(fUrl.GetHost());
    fHandler->SetProofDataSet(fUrl.GetFile());

    // --- Handle worker options -------------------------------------
    if (fOptions.Has("workers")) {
      TString nwork = fOptions.Get("workers");
      if (nwork.EndsWith("x")) 
	fHandler->SetNproofWorkersPerSlave(nwork.Atoi());
      else 
	fHandler->SetNproofWorkers(nwork.Atoi());
    }
    
    // --- Check if we're using a wrapper ----------------------------
    if (fOptions.Has("wrapper")) { 
      TString wrapper = fOptions.Get("wrapper");
      if (wrapper.IsNull()) 
	// In case of no argument, use GDB 
	// Just run and backtrace 
	wrapper = "/usr/bin/gdb --batch -ex run -ex bt --args";
      Info("ProofRailway::PreSetup", "Using wrapper command: %s", 
	   wrapper.Data());
      TProof::AddEnvVar("PROOF_WRAPPERCMD", wrapper);
    }
    
    // --- Check if we need to clear packages ------------------------
    fHandler->SetClearPackages(fOptions.Has("clear"));

    // --- Check if we need to reset first ---------------------------
    if (fOptions.Has("reset")) { 
      TString reset = fOptions.Get("reset");
      Bool_t  hard  = (reset.IsNull() || 
		       reset.EqualTo("hard", TString::kIgnoreCase));
      Info("AAFPluginRailway::PreSetup", "Will do a %s reset of %s", 
	   hard ? "hard" : "soft", fUrl.GetHost());
      fHandler->SetProofReset(hard ? 2 : 1);
    }
    
    return PluginRailway::PreSetup();
  }
  /** 
   * Set-up done after the task set-ups 
   *
   * @return true on success 
   */
  virtual Bool_t PostSetup() 
  {
    if (!PluginRailway::PostSetup()) return false;
    if (fOptions.Has("dsname")) 
      OutputUtilities::RegisterDataset(fOptions.Get("dsname"));

    return true;
  };
  /** 
   * Get the mode identifier 
   * 
   * @return Always kProof
   */
  virtual UShort_t Mode() const { return kProof; }
  /**
   * Get the mode string used for AliAnalysisManager::StartAnalysis
   */
  virtual const char* ModeString() const { return "proof"; }
  /** 
   * 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();
    
    TString dsName(fUrl.GetFile());
    if (fUrl.GetAnchor() && fUrl.GetAnchor()[0] != '\0') 
      dsName.Append(Form("#%s", fUrl.GetAnchor()));
    return mgr->StartAnalysis(fUrl.GetProtocol(), dsName, nEvents);
  }
  /** 
   * @return URI help string 
   */
  virtual const Char_t* UrlHelp() const 
  {
    return "proof://<host>/<dataset>?plugin[&<options>][#<treename>]";
  }
  /**
   * @return Short description
   */
  virtual const char* Desc() const { return "CAF w/plugin"; }
};
#endif
//
// EOF
//
 AAFPluginRailway.C:1
 AAFPluginRailway.C:2
 AAFPluginRailway.C:3
 AAFPluginRailway.C:4
 AAFPluginRailway.C:5
 AAFPluginRailway.C:6
 AAFPluginRailway.C:7
 AAFPluginRailway.C:8
 AAFPluginRailway.C:9
 AAFPluginRailway.C:10
 AAFPluginRailway.C:11
 AAFPluginRailway.C:12
 AAFPluginRailway.C:13
 AAFPluginRailway.C:14
 AAFPluginRailway.C:15
 AAFPluginRailway.C:16
 AAFPluginRailway.C:17
 AAFPluginRailway.C:18
 AAFPluginRailway.C:19
 AAFPluginRailway.C:20
 AAFPluginRailway.C:21
 AAFPluginRailway.C:22
 AAFPluginRailway.C:23
 AAFPluginRailway.C:24
 AAFPluginRailway.C:25
 AAFPluginRailway.C:26
 AAFPluginRailway.C:27
 AAFPluginRailway.C:28
 AAFPluginRailway.C:29
 AAFPluginRailway.C:30
 AAFPluginRailway.C:31
 AAFPluginRailway.C:32
 AAFPluginRailway.C:33
 AAFPluginRailway.C:34
 AAFPluginRailway.C:35
 AAFPluginRailway.C:36
 AAFPluginRailway.C:37
 AAFPluginRailway.C:38
 AAFPluginRailway.C:39
 AAFPluginRailway.C:40
 AAFPluginRailway.C:41
 AAFPluginRailway.C:42
 AAFPluginRailway.C:43
 AAFPluginRailway.C:44
 AAFPluginRailway.C:45
 AAFPluginRailway.C:46
 AAFPluginRailway.C:47
 AAFPluginRailway.C:48
 AAFPluginRailway.C:49
 AAFPluginRailway.C:50
 AAFPluginRailway.C:51
 AAFPluginRailway.C:52
 AAFPluginRailway.C:53
 AAFPluginRailway.C:54
 AAFPluginRailway.C:55
 AAFPluginRailway.C:56
 AAFPluginRailway.C:57
 AAFPluginRailway.C:58
 AAFPluginRailway.C:59
 AAFPluginRailway.C:60
 AAFPluginRailway.C:61
 AAFPluginRailway.C:62
 AAFPluginRailway.C:63
 AAFPluginRailway.C:64
 AAFPluginRailway.C:65
 AAFPluginRailway.C:66
 AAFPluginRailway.C:67
 AAFPluginRailway.C:68
 AAFPluginRailway.C:69
 AAFPluginRailway.C:70
 AAFPluginRailway.C:71
 AAFPluginRailway.C:72
 AAFPluginRailway.C:73
 AAFPluginRailway.C:74
 AAFPluginRailway.C:75
 AAFPluginRailway.C:76
 AAFPluginRailway.C:77
 AAFPluginRailway.C:78
 AAFPluginRailway.C:79
 AAFPluginRailway.C:80
 AAFPluginRailway.C:81
 AAFPluginRailway.C:82
 AAFPluginRailway.C:83
 AAFPluginRailway.C:84
 AAFPluginRailway.C:85
 AAFPluginRailway.C:86
 AAFPluginRailway.C:87
 AAFPluginRailway.C:88
 AAFPluginRailway.C:89
 AAFPluginRailway.C:90
 AAFPluginRailway.C:91
 AAFPluginRailway.C:92
 AAFPluginRailway.C:93
 AAFPluginRailway.C:94
 AAFPluginRailway.C:95
 AAFPluginRailway.C:96
 AAFPluginRailway.C:97
 AAFPluginRailway.C:98
 AAFPluginRailway.C:99
 AAFPluginRailway.C:100
 AAFPluginRailway.C:101
 AAFPluginRailway.C:102
 AAFPluginRailway.C:103
 AAFPluginRailway.C:104
 AAFPluginRailway.C:105
 AAFPluginRailway.C:106
 AAFPluginRailway.C:107
 AAFPluginRailway.C:108
 AAFPluginRailway.C:109
 AAFPluginRailway.C:110
 AAFPluginRailway.C:111
 AAFPluginRailway.C:112
 AAFPluginRailway.C:113
 AAFPluginRailway.C:114
 AAFPluginRailway.C:115
 AAFPluginRailway.C:116
 AAFPluginRailway.C:117
 AAFPluginRailway.C:118
 AAFPluginRailway.C:119
 AAFPluginRailway.C:120
 AAFPluginRailway.C:121
 AAFPluginRailway.C:122
 AAFPluginRailway.C:123
 AAFPluginRailway.C:124
 AAFPluginRailway.C:125
 AAFPluginRailway.C:126
 AAFPluginRailway.C:127
 AAFPluginRailway.C:128
 AAFPluginRailway.C:129
 AAFPluginRailway.C:130
 AAFPluginRailway.C:131
 AAFPluginRailway.C:132
 AAFPluginRailway.C:133
 AAFPluginRailway.C:134
 AAFPluginRailway.C:135
 AAFPluginRailway.C:136
 AAFPluginRailway.C:137
 AAFPluginRailway.C:138
 AAFPluginRailway.C:139
 AAFPluginRailway.C:140
 AAFPluginRailway.C:141
 AAFPluginRailway.C:142
 AAFPluginRailway.C:143
 AAFPluginRailway.C:144
 AAFPluginRailway.C:145
 AAFPluginRailway.C:146
 AAFPluginRailway.C:147
 AAFPluginRailway.C:148
 AAFPluginRailway.C:149
 AAFPluginRailway.C:150
 AAFPluginRailway.C:151
 AAFPluginRailway.C:152
 AAFPluginRailway.C:153
 AAFPluginRailway.C:154
 AAFPluginRailway.C:155
 AAFPluginRailway.C:156
 AAFPluginRailway.C:157
 AAFPluginRailway.C:158
 AAFPluginRailway.C:159
 AAFPluginRailway.C:160
 AAFPluginRailway.C:161
 AAFPluginRailway.C:162
 AAFPluginRailway.C:163
 AAFPluginRailway.C:164
 AAFPluginRailway.C:165
 AAFPluginRailway.C:166
 AAFPluginRailway.C:167
 AAFPluginRailway.C:168
 AAFPluginRailway.C:169
 AAFPluginRailway.C:170
 AAFPluginRailway.C:171
 AAFPluginRailway.C:172
 AAFPluginRailway.C:173
 AAFPluginRailway.C:174
 AAFPluginRailway.C:175
 AAFPluginRailway.C:176
 AAFPluginRailway.C:177
 AAFPluginRailway.C:178
 AAFPluginRailway.C:179
 AAFPluginRailway.C:180
 AAFPluginRailway.C:181
 AAFPluginRailway.C:182
 AAFPluginRailway.C:183
 AAFPluginRailway.C:184
 AAFPluginRailway.C:185
 AAFPluginRailway.C:186
 AAFPluginRailway.C:187
 AAFPluginRailway.C:188
 AAFPluginRailway.C:189
 AAFPluginRailway.C:190
 AAFPluginRailway.C:191
 AAFPluginRailway.C:192
 AAFPluginRailway.C:193
 AAFPluginRailway.C:194
 AAFPluginRailway.C:195
 AAFPluginRailway.C:196
 AAFPluginRailway.C:197
 AAFPluginRailway.C:198
 AAFPluginRailway.C:199