ROOT logo
/**
 * @file   AAFPluginHelper.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 "PluginHelper.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 AAFPluginHelper : public PluginHelper
{
  /** 
   * Constructor 
   * 
   * @param url  Url 
   * @param verbose Verbosity level
   */
  AAFPluginHelper(const TUrl& url, Int_t verbose)
    : PluginHelper(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 ~AAFPluginHelper() {}
  /** 
   * 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("ProofHelper::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("AAFPluginHelper::PreSetup", "Will do a %s reset of %s", 
	   hard ? "hard" : "soft", fUrl.GetHost());
      fHandler->SetProofReset(hard ? 2 : 1);
    }
    
    return PluginHelper::PreSetup();
  }
  /** 
   * Set-up done after the task set-ups 
   *
   * @return true on success 
   */
  virtual Bool_t PostSetup() 
  {
    if (!PluginHelper::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
//
 AAFPluginHelper.C:1
 AAFPluginHelper.C:2
 AAFPluginHelper.C:3
 AAFPluginHelper.C:4
 AAFPluginHelper.C:5
 AAFPluginHelper.C:6
 AAFPluginHelper.C:7
 AAFPluginHelper.C:8
 AAFPluginHelper.C:9
 AAFPluginHelper.C:10
 AAFPluginHelper.C:11
 AAFPluginHelper.C:12
 AAFPluginHelper.C:13
 AAFPluginHelper.C:14
 AAFPluginHelper.C:15
 AAFPluginHelper.C:16
 AAFPluginHelper.C:17
 AAFPluginHelper.C:18
 AAFPluginHelper.C:19
 AAFPluginHelper.C:20
 AAFPluginHelper.C:21
 AAFPluginHelper.C:22
 AAFPluginHelper.C:23
 AAFPluginHelper.C:24
 AAFPluginHelper.C:25
 AAFPluginHelper.C:26
 AAFPluginHelper.C:27
 AAFPluginHelper.C:28
 AAFPluginHelper.C:29
 AAFPluginHelper.C:30
 AAFPluginHelper.C:31
 AAFPluginHelper.C:32
 AAFPluginHelper.C:33
 AAFPluginHelper.C:34
 AAFPluginHelper.C:35
 AAFPluginHelper.C:36
 AAFPluginHelper.C:37
 AAFPluginHelper.C:38
 AAFPluginHelper.C:39
 AAFPluginHelper.C:40
 AAFPluginHelper.C:41
 AAFPluginHelper.C:42
 AAFPluginHelper.C:43
 AAFPluginHelper.C:44
 AAFPluginHelper.C:45
 AAFPluginHelper.C:46
 AAFPluginHelper.C:47
 AAFPluginHelper.C:48
 AAFPluginHelper.C:49
 AAFPluginHelper.C:50
 AAFPluginHelper.C:51
 AAFPluginHelper.C:52
 AAFPluginHelper.C:53
 AAFPluginHelper.C:54
 AAFPluginHelper.C:55
 AAFPluginHelper.C:56
 AAFPluginHelper.C:57
 AAFPluginHelper.C:58
 AAFPluginHelper.C:59
 AAFPluginHelper.C:60
 AAFPluginHelper.C:61
 AAFPluginHelper.C:62
 AAFPluginHelper.C:63
 AAFPluginHelper.C:64
 AAFPluginHelper.C:65
 AAFPluginHelper.C:66
 AAFPluginHelper.C:67
 AAFPluginHelper.C:68
 AAFPluginHelper.C:69
 AAFPluginHelper.C:70
 AAFPluginHelper.C:71
 AAFPluginHelper.C:72
 AAFPluginHelper.C:73
 AAFPluginHelper.C:74
 AAFPluginHelper.C:75
 AAFPluginHelper.C:76
 AAFPluginHelper.C:77
 AAFPluginHelper.C:78
 AAFPluginHelper.C:79
 AAFPluginHelper.C:80
 AAFPluginHelper.C:81
 AAFPluginHelper.C:82
 AAFPluginHelper.C:83
 AAFPluginHelper.C:84
 AAFPluginHelper.C:85
 AAFPluginHelper.C:86
 AAFPluginHelper.C:87
 AAFPluginHelper.C:88
 AAFPluginHelper.C:89
 AAFPluginHelper.C:90
 AAFPluginHelper.C:91
 AAFPluginHelper.C:92
 AAFPluginHelper.C:93
 AAFPluginHelper.C:94
 AAFPluginHelper.C:95
 AAFPluginHelper.C:96
 AAFPluginHelper.C:97
 AAFPluginHelper.C:98
 AAFPluginHelper.C:99
 AAFPluginHelper.C:100
 AAFPluginHelper.C:101
 AAFPluginHelper.C:102
 AAFPluginHelper.C:103
 AAFPluginHelper.C:104
 AAFPluginHelper.C:105
 AAFPluginHelper.C:106
 AAFPluginHelper.C:107
 AAFPluginHelper.C:108
 AAFPluginHelper.C:109
 AAFPluginHelper.C:110
 AAFPluginHelper.C:111
 AAFPluginHelper.C:112
 AAFPluginHelper.C:113
 AAFPluginHelper.C:114
 AAFPluginHelper.C:115
 AAFPluginHelper.C:116
 AAFPluginHelper.C:117
 AAFPluginHelper.C:118
 AAFPluginHelper.C:119
 AAFPluginHelper.C:120
 AAFPluginHelper.C:121
 AAFPluginHelper.C:122
 AAFPluginHelper.C:123
 AAFPluginHelper.C:124
 AAFPluginHelper.C:125
 AAFPluginHelper.C:126
 AAFPluginHelper.C:127
 AAFPluginHelper.C:128
 AAFPluginHelper.C:129
 AAFPluginHelper.C:130
 AAFPluginHelper.C:131
 AAFPluginHelper.C:132
 AAFPluginHelper.C:133
 AAFPluginHelper.C:134
 AAFPluginHelper.C:135
 AAFPluginHelper.C:136
 AAFPluginHelper.C:137
 AAFPluginHelper.C:138
 AAFPluginHelper.C:139
 AAFPluginHelper.C:140
 AAFPluginHelper.C:141
 AAFPluginHelper.C:142
 AAFPluginHelper.C:143
 AAFPluginHelper.C:144
 AAFPluginHelper.C:145
 AAFPluginHelper.C:146
 AAFPluginHelper.C:147
 AAFPluginHelper.C:148
 AAFPluginHelper.C:149
 AAFPluginHelper.C:150
 AAFPluginHelper.C:151
 AAFPluginHelper.C:152
 AAFPluginHelper.C:153
 AAFPluginHelper.C:154
 AAFPluginHelper.C:155
 AAFPluginHelper.C:156
 AAFPluginHelper.C:157
 AAFPluginHelper.C:158
 AAFPluginHelper.C:159
 AAFPluginHelper.C:160
 AAFPluginHelper.C:161
 AAFPluginHelper.C:162
 AAFPluginHelper.C:163
 AAFPluginHelper.C:164
 AAFPluginHelper.C:165
 AAFPluginHelper.C:166
 AAFPluginHelper.C:167
 AAFPluginHelper.C:168
 AAFPluginHelper.C:169
 AAFPluginHelper.C:170
 AAFPluginHelper.C:171
 AAFPluginHelper.C:172
 AAFPluginHelper.C:173
 AAFPluginHelper.C:174
 AAFPluginHelper.C:175
 AAFPluginHelper.C:176
 AAFPluginHelper.C:177
 AAFPluginHelper.C:178
 AAFPluginHelper.C:179
 AAFPluginHelper.C:180
 AAFPluginHelper.C:181
 AAFPluginHelper.C:182
 AAFPluginHelper.C:183
 AAFPluginHelper.C:184
 AAFPluginHelper.C:185
 AAFPluginHelper.C:186
 AAFPluginHelper.C:187
 AAFPluginHelper.C:188
 AAFPluginHelper.C:189
 AAFPluginHelper.C:190
 AAFPluginHelper.C:191
 AAFPluginHelper.C:192
 AAFPluginHelper.C:193
 AAFPluginHelper.C:194
 AAFPluginHelper.C:195
 AAFPluginHelper.C:196
 AAFPluginHelper.C:197
 AAFPluginHelper.C:198
 AAFPluginHelper.C:199