ROOT logo
#include <Riostream.h>
#include <TError.h>
#include <TObjArray.h>
#include <TObjString.h>
#include "AliAnalysisAlien.h"

namespace PluginSetup
{
   //
   // === DEFINITIONS ==============================================================================
   //
   
   // output object
   AliAnalysisAlien *plugin   = 0x0;                 // --> output of this code
   
   // basic setup
   Bool_t  targetAlien        = kTRUE;               // [*all*] kTRUE --> alien, kFALSE --> proof

   // executables
   TString aliVersion         = "v4-21-19-AN";       // [*all*] tag used for AliRoot
   TString rootVersion        = "v5-28-00a";         // [*all*] tag used for ROOT
   TString apiVersion         = "V1.1x";             // [AliEn] tag used for AliEn API
                                                       
   // file naming 
   TString jobName            = "";                  // [AliEn] basic name for all files                                   
   TString fileJDL            = "";                  // [AliEn] JDL filename
   TString fileC              = "";                  // [AliEn] run macro name
   TString fileSH             = "";                  // [AliEn] executable shell script name
                              
   // input definitions 
   Bool_t  alienInputRuns     = kTRUE;               // [AliEn] choose if inputs are runs (kTRUE) or lists of XML (kFALSE)      
   TString runList            = "";                  // [AliEn] list of run numbers from which XML collections are created
   TString runPath            = "";                  // [AliEn] common path where the above runs are stored
   TString runPrefix          = "";                  // [AliEn] a common string prefix to all run numbers (usually, "" for MC, "000" for data)
   TString runPattern         = "";                  // [AliEn] pattern to be used for the 'find -x' command
   TString xmlList            = "";                  // [AliEn] alternative to runs, pass a list of already-made XML files (NOTE: cannot do "test")
   TString dataSet            = "";                  // [PROOF] dataset name
   TString proofTest          = "";                  // [PROOF] test TXT collection of local files for running in "test" mode for PROOF
   TString proofCluster       = "alice-caf.cern.ch"; // [PROOF] name of used PROOF cluster
   Bool_t  proofReset         = kFALSE;              // [PROOF] tell the cluster if compiled libraries must be cleared
   TString alirootMode        = "default";           // [PROOF] modality for AliRoot loading
   Bool_t  proofClear         = kFALSE;              // [PROOF] tell the cluster if compiled libraries must be cleared
                              
   // output paths            
   TString workDir            = "";                  // [AliEn] working dir w.r. to user $ALIEN_HOME
   TString outDir             = "out";               // [AliEn] output dir w.r. to 'workDir'

   // additional libraries
   TString addTaskRuntime     = "";                  // [*all*] list of tasks compiled at runtime (just the name)
   TString addLibs            = "";                  // [*all*] list of all libraries to be added (order matters)
   TString addIncludes        = "";                  // [*all*] list of additional include paths to use
   TString addPar             = "";                  // [*all*] list of additional PARs to use
                                                   
   // AliEn JDL parameters                         
   Int_t   split              = 100;                 // [AliEn] split parameter in JDL
   Int_t   maxMergeFiles      = 50;                  // [AliEn] how many files to be merged per chunk
   Int_t   nRunsPerMaster     = 1;                   // [AliEn] how many runs are used together in a single master job (for ESD: 1, for AOD: even all)
   Int_t   maxMergeStages     = 2;                   // [AliEn] how many maximum merge stages to have
   Int_t   maxInitFailed      = 0;                   // [AliEn] how many failed initializations are tolerated (?)
   Int_t   resubmitThr        = 0;                   // [AliEn] threshold that triggers automatic job resubmit (?)
   Int_t   TTL                = 30000;               // [AliEn] time-to-live (in sec)
   TString inputFormat        = "xml-single";        // [AliEn] input format in JDL
   TString splitMode          = "se";                // [AliEn] splitting modality
   Int_t   price              = 1;                   // [AliEn] job price
   TString jobTag             = "";                  // [AliEn] tag assigned to job
   Int_t   nTestFiles         = 1;                   // [AliEn] number of input files used locally in test mode
   
   //
   // === FUNCTIONS ================================================================================
   //
   
   Bool_t AssignNames();
   Bool_t CreatePlugin();
   Bool_t SetupForAlien();
   Bool_t SetupForProof();
   
   //_______________________________________________________________________________________________
   //
   // Define all 'automatic' names from the job name
   //
   Bool_t AssignNames()
   {
      if (jobName.Length() < 1) {
         ::Error("SetupPlugin::AssignNames()", "Job name not defined");
         return kFALSE;
      }
         
      
      fileC = jobName;
      fileSH = jobName;
      fileJDL = jobName;
      
      fileC.Append(".C");
      fileSH.Append(".sh");
      fileJDL.Append(".jdl");
      
      ::Info("SetupPlugin::AssignNames()", "macro  name: \"%s\"", fileC.Data());
      ::Info("SetupPlugin::AssignNames()", "JDL    name: \"%s\"", fileJDL.Data());
      ::Info("SetupPlugin::AssignNames()", "script name: \"%s\"", fileSH.Data());
      
      return kTRUE;
   }
   
   //_______________________________________________________________________________________________
   //
   // Initialize plugin with all its common values
   //
   Bool_t CreatePlugin()
   {
      // create object
      plugin = new AliAnalysisAlien;
      
      // framework version
      plugin->SetROOTVersion(rootVersion.Data());
      plugin->SetAliROOTVersion(aliVersion.Data());
      
      // additional libraries/includes
      if (addLibs.Length() > 0) plugin->SetAdditionalLibs(addLibs.Data());
      if (addIncludes.Length() > 0) plugin->AddIncludePath(addIncludes.Data());
      
      // runtime tasks
      if (addTaskRuntime.Length() > 0) {
         TObjArray *list = addTaskRuntime.Tokenize(" ");
         TObjArrayIter next(list);
         TObjString *os = 0x0;
         TString sources("");
         while ( (os = (TObjString*)next()) ) {
            const char *taskName = os->GetString().Data();
            addLibs.Append(Form("%s.h %s.cxx", taskName, taskName));
            sources.Append(Form("%s.cxx", taskName));
         }
         plugin->SetAnalysisSource(sources.Data());
      }
      
      // specific setups
      if (targetAlien) {
         ::Info("SetupPlugin::CreatePlugin()", "Setting up for ALIEN");
         return SetupForAlien();
      } else {
         ::Info("SetupPlugin::CreatePlugin()", "Setting up for PROOF");
         return SetupForProof();
      }
   }
   
   
   //_______________________________________________________________________________________________
   //
   // Initialize plugin with all needed for AliEn
   //
   Bool_t SetupForAlien()
   {
      if (!plugin) {
         ::Error("SetupPlugin::SetupForAlien()", "Initialize plugin first");
         return kFALSE;
      }
      
      // create names
      if (!AssignNames()) {
         ::Error("SetupPlugin::SetupForAlien()", "Failed name initializations");
         return kFALSE;
      }
      
      // API version
      plugin->SetAPIVersion(apiVersion.Data());
      
      // merging detauls
      plugin->SetMergeViaJDL();
      plugin->SetMaxMergeFiles(maxMergeFiles);
      plugin->SetMaxMergeStages(maxMergeStages);
      
      // output paths
      plugin->SetGridWorkingDir(workDir.Data());
      plugin->SetGridOutputDir(outDir.Data());
      plugin->SetDefaultOutputs(kTRUE);
      
      // excutable
      plugin->SetExecutableCommand("aliroot -q -b");
      plugin->SetExecutableArgs(">& std.log");
      plugin->SetExecutable(fileSH.Data());
      
      // automatically created files
      plugin->SetAnalysisMacro(fileC.Data());
      plugin->SetJDLName(fileJDL.Data());
      
      // JDL parameters
      plugin->SetSplitMaxInputFileNumber(split);
      plugin->SetMaxInitFailed(maxInitFailed);
      plugin->SetMasterResubmitThreshold(resubmitThr);
      plugin->SetTTL(TTL);
      plugin->SetPrice(price);
      plugin->SetInputFormat(inputFormat.Data());
      plugin->SetSplitMode(splitMode.Data());
      if (jobTag.Length() > 0) plugin->SetJobTag(jobTag.Data());
   
      // input definition
      if (alienInputRuns) {
         plugin->SetOutputToRunNo(kTRUE);
         plugin->SetNtestFiles(nTestFiles);
         plugin->SetNrunsPerMaster(nRunsPerMaster);
         plugin->SetRunPrefix(runPrefix.Data());
         plugin->SetGridDataDir(runPath.Data());
         plugin->SetDataPattern(runPattern.Data());
         plugin->AddRunList(runList.Data());
      } else {
         TObjArray *list = xmlList.Tokenize(" ");
         TObjArrayIter next(list);
         TObjString *os = 0x0;
         while ( (os = (TObjString*)next()) ) {
            plugin->AddDataFile(os->GetString().Data());
         }
         plugin->SetOutputToRunNo(kFALSE);
      }
      
      return kTRUE;
   }
   
   //_______________________________________________________________________________________________
   //
   // Initialize plugin with all needed for PROOF
   //
   Bool_t SetupForProof()
   {
      if (!plugin) {
         ::Error("SetupPlugin::SetupForAlien()", "Initialize plugin first");
         return kFALSE;
      }
      
      plugin->SetProofCluster(proofCluster.Data());
      plugin->SetProofDataSet(dataSet.Data());
      plugin->SetProofReset(proofReset);
      plugin->SetProofConnectGrid(kTRUE);
      plugin->SetAliRootMode(alirootMode.Data());
      plugin->SetClearPackages(proofClear);
      plugin->SetFileForTestMode(proofTest.Data());
      
      return kTRUE;
   }
};
 SetupPlugin.C:1
 SetupPlugin.C:2
 SetupPlugin.C:3
 SetupPlugin.C:4
 SetupPlugin.C:5
 SetupPlugin.C:6
 SetupPlugin.C:7
 SetupPlugin.C:8
 SetupPlugin.C:9
 SetupPlugin.C:10
 SetupPlugin.C:11
 SetupPlugin.C:12
 SetupPlugin.C:13
 SetupPlugin.C:14
 SetupPlugin.C:15
 SetupPlugin.C:16
 SetupPlugin.C:17
 SetupPlugin.C:18
 SetupPlugin.C:19
 SetupPlugin.C:20
 SetupPlugin.C:21
 SetupPlugin.C:22
 SetupPlugin.C:23
 SetupPlugin.C:24
 SetupPlugin.C:25
 SetupPlugin.C:26
 SetupPlugin.C:27
 SetupPlugin.C:28
 SetupPlugin.C:29
 SetupPlugin.C:30
 SetupPlugin.C:31
 SetupPlugin.C:32
 SetupPlugin.C:33
 SetupPlugin.C:34
 SetupPlugin.C:35
 SetupPlugin.C:36
 SetupPlugin.C:37
 SetupPlugin.C:38
 SetupPlugin.C:39
 SetupPlugin.C:40
 SetupPlugin.C:41
 SetupPlugin.C:42
 SetupPlugin.C:43
 SetupPlugin.C:44
 SetupPlugin.C:45
 SetupPlugin.C:46
 SetupPlugin.C:47
 SetupPlugin.C:48
 SetupPlugin.C:49
 SetupPlugin.C:50
 SetupPlugin.C:51
 SetupPlugin.C:52
 SetupPlugin.C:53
 SetupPlugin.C:54
 SetupPlugin.C:55
 SetupPlugin.C:56
 SetupPlugin.C:57
 SetupPlugin.C:58
 SetupPlugin.C:59
 SetupPlugin.C:60
 SetupPlugin.C:61
 SetupPlugin.C:62
 SetupPlugin.C:63
 SetupPlugin.C:64
 SetupPlugin.C:65
 SetupPlugin.C:66
 SetupPlugin.C:67
 SetupPlugin.C:68
 SetupPlugin.C:69
 SetupPlugin.C:70
 SetupPlugin.C:71
 SetupPlugin.C:72
 SetupPlugin.C:73
 SetupPlugin.C:74
 SetupPlugin.C:75
 SetupPlugin.C:76
 SetupPlugin.C:77
 SetupPlugin.C:78
 SetupPlugin.C:79
 SetupPlugin.C:80
 SetupPlugin.C:81
 SetupPlugin.C:82
 SetupPlugin.C:83
 SetupPlugin.C:84
 SetupPlugin.C:85
 SetupPlugin.C:86
 SetupPlugin.C:87
 SetupPlugin.C:88
 SetupPlugin.C:89
 SetupPlugin.C:90
 SetupPlugin.C:91
 SetupPlugin.C:92
 SetupPlugin.C:93
 SetupPlugin.C:94
 SetupPlugin.C:95
 SetupPlugin.C:96
 SetupPlugin.C:97
 SetupPlugin.C:98
 SetupPlugin.C:99
 SetupPlugin.C:100
 SetupPlugin.C:101
 SetupPlugin.C:102
 SetupPlugin.C:103
 SetupPlugin.C:104
 SetupPlugin.C:105
 SetupPlugin.C:106
 SetupPlugin.C:107
 SetupPlugin.C:108
 SetupPlugin.C:109
 SetupPlugin.C:110
 SetupPlugin.C:111
 SetupPlugin.C:112
 SetupPlugin.C:113
 SetupPlugin.C:114
 SetupPlugin.C:115
 SetupPlugin.C:116
 SetupPlugin.C:117
 SetupPlugin.C:118
 SetupPlugin.C:119
 SetupPlugin.C:120
 SetupPlugin.C:121
 SetupPlugin.C:122
 SetupPlugin.C:123
 SetupPlugin.C:124
 SetupPlugin.C:125
 SetupPlugin.C:126
 SetupPlugin.C:127
 SetupPlugin.C:128
 SetupPlugin.C:129
 SetupPlugin.C:130
 SetupPlugin.C:131
 SetupPlugin.C:132
 SetupPlugin.C:133
 SetupPlugin.C:134
 SetupPlugin.C:135
 SetupPlugin.C:136
 SetupPlugin.C:137
 SetupPlugin.C:138
 SetupPlugin.C:139
 SetupPlugin.C:140
 SetupPlugin.C:141
 SetupPlugin.C:142
 SetupPlugin.C:143
 SetupPlugin.C:144
 SetupPlugin.C:145
 SetupPlugin.C:146
 SetupPlugin.C:147
 SetupPlugin.C:148
 SetupPlugin.C:149
 SetupPlugin.C:150
 SetupPlugin.C:151
 SetupPlugin.C:152
 SetupPlugin.C:153
 SetupPlugin.C:154
 SetupPlugin.C:155
 SetupPlugin.C:156
 SetupPlugin.C:157
 SetupPlugin.C:158
 SetupPlugin.C:159
 SetupPlugin.C:160
 SetupPlugin.C:161
 SetupPlugin.C:162
 SetupPlugin.C:163
 SetupPlugin.C:164
 SetupPlugin.C:165
 SetupPlugin.C:166
 SetupPlugin.C:167
 SetupPlugin.C:168
 SetupPlugin.C:169
 SetupPlugin.C:170
 SetupPlugin.C:171
 SetupPlugin.C:172
 SetupPlugin.C:173
 SetupPlugin.C:174
 SetupPlugin.C:175
 SetupPlugin.C:176
 SetupPlugin.C:177
 SetupPlugin.C:178
 SetupPlugin.C:179
 SetupPlugin.C:180
 SetupPlugin.C:181
 SetupPlugin.C:182
 SetupPlugin.C:183
 SetupPlugin.C:184
 SetupPlugin.C:185
 SetupPlugin.C:186
 SetupPlugin.C:187
 SetupPlugin.C:188
 SetupPlugin.C:189
 SetupPlugin.C:190
 SetupPlugin.C:191
 SetupPlugin.C:192
 SetupPlugin.C:193
 SetupPlugin.C:194
 SetupPlugin.C:195
 SetupPlugin.C:196
 SetupPlugin.C:197
 SetupPlugin.C:198
 SetupPlugin.C:199
 SetupPlugin.C:200
 SetupPlugin.C:201
 SetupPlugin.C:202
 SetupPlugin.C:203
 SetupPlugin.C:204
 SetupPlugin.C:205
 SetupPlugin.C:206
 SetupPlugin.C:207
 SetupPlugin.C:208
 SetupPlugin.C:209
 SetupPlugin.C:210
 SetupPlugin.C:211
 SetupPlugin.C:212
 SetupPlugin.C:213
 SetupPlugin.C:214
 SetupPlugin.C:215
 SetupPlugin.C:216
 SetupPlugin.C:217
 SetupPlugin.C:218
 SetupPlugin.C:219
 SetupPlugin.C:220
 SetupPlugin.C:221
 SetupPlugin.C:222
 SetupPlugin.C:223
 SetupPlugin.C:224
 SetupPlugin.C:225
 SetupPlugin.C:226
 SetupPlugin.C:227
 SetupPlugin.C:228
 SetupPlugin.C:229
 SetupPlugin.C:230
 SetupPlugin.C:231
 SetupPlugin.C:232
 SetupPlugin.C:233
 SetupPlugin.C:234
 SetupPlugin.C:235
 SetupPlugin.C:236
 SetupPlugin.C:237
 SetupPlugin.C:238
 SetupPlugin.C:239