ROOT logo
//-----------------Global variables for the the analysis------------------------
TString aliroot_version = "v4-21-11-AN";
TString analysis_mode = "";
TString output_file = "PWG3hfe.root";
TString root_version = "";
TString api_version = "V1.1x";
TString input_data = "";

//___________________________________________________________
Bool_t FindDependentPackages(){
  // Find packages where aliroot depends on
  // Method is the following: the dependencies are on a webpage on alimonitor
  // we download file and try to find the aliroot expression in the file. The line
  // we read into a string. The we tokenize the string and look for the expression VO_ALICE@ROOT::
  // Then we have all information we need
  const char *wd = gSystem->pwd(); 
  gSystem->cd("/tmp");
  gSystem->Exec("wget http://alimonitor.cern.ch/packages");
  TString setting = gSystem->GetFromPipe(Form("cat index.html | grep VO_ALICE@AliRoot::%s", aliroot_version.Data()));
  gSystem->Exec("rm index.html");
  gSystem->cd(wd);
  if(!setting.Length()) return kFALSE;
  TObjArray *tokens = setting.Tokenize(";");
  TIter tokiter(tokens);
  TObjString *os = NULL;
  while((os = dynamic_cast<TObjString *>(tokiter()))){
    TString &mys = os->String();
    if(!mys.Contains("VO_ALICE@ROOT")) continue;
    mys.ReplaceAll("VO_ALICE@ROOT::", "");
    mys.ReplaceAll("&quot","");
    root_version = mys;
    break;
  }
  // print results:
  printf("Found Packages for Analysis:\n");
  printf("=====================================\n");
  printf("ALIROOT: %s\n", aliroot_version.Data());
  printf("ROOT:    %s\n", root_version.Data());
  printf("\n");
  return kTRUE;
}

//___________________________________________________________
AliAnalysisAlien *CreateAlienHandler(Bool_t isProof){
  //if(!AliAnalysisGrid::CreateToken()) return NULL;
  if(!FindDependentPackages()) return NULL;
  AliAnalysisAlien *alienplugin = new AliAnalysisAlien;
   
  // common settings
  alienplugin->SetAliROOTVersion(aliroot_version);
  alienplugin->SetROOTVersion(root_version);
  alienplugin->SetAPIVersion(api_version);
  alienplugin->SetAdditionalLibs("libPWGHFhfe.so");
  alienplugin->SetDefaultOutputs(kTRUE);
  if(isProof){
    // proof mode
    if(analysis_mode.Contains("test")) alienplugin->SetRunMode("test");
    alienplugin->SetProofCluster("alice_caf.cern.ch");
    alienplugin->SetRootVersionForProof(root_version);
    alienplugin->SetAliRootMode("aliroot");
  } else {
    // grid mode
    alienplugin->SetRunMode(analysis_mode.Data());
    // default setting that need no deeper logic
    alienplugin->SetJDLName("hfeanalysis.jdl");
    alienplugin->SetExecutable("hfeanalysis.sh");
    alienplugin->SetAnalysisMacro("hfeanalysis.C");
    alienplugin->SetValidationScript("hfevalidate.sh");
    alienplugin->SetGridWorkingDir("hfeanalysis");
    /*alienplugin->SetOutputArchive();
    alienplugin->SetDefaultOutputs();*/
    alienplugin->SetOverwriteMode();
    alienplugin->SetFastReadOption();
    alienplugin->SetSplitMaxInputFileNumber(5);
    alienplugin->SetTTL(30000);
    alienplugin->SetInputFormat("xml-single");
    alienplugin->SetPrice(1);
    alienplugin->SetSplitMode("se");
    alienplugin->SetNtestFiles(1);

    // Merging setting, only needed in terminate or full mode
    if(analysis_mode.Contains("full") || analysis_mode.Contains("terminate")){
      alienplugin->SetMergeViaJDL();
      alienplugin->SetMaxMergeFiles(50);
      alienplugin->SetMaxMergeStages(5);
    }
  }
  return alienplugin;
}

//___________________________________________________________
void DecodeDataString(const TString &datastring, TString &sample, TArrayI &listofruns){
  TObjArray *toks = datastring.Tokenize(":");
  sample = (dynamic_cast<TObjString *>(toks->At(0)))->String();
  TString &listrunstring = (dynamic_cast<TObjString *>(toks->At(1)))->String();
  TObjArray *runstrings = listrunstring.Tokenize(",");
  TIter runiter(runstrings);
  listofruns.Set(runstrings->GetEntriesFast());
  TObjString *myrunstring = NULL;
  Int_t counter = 0;
  while((myrunstring = dynamic_cast<TObjString *>(runiter()))) listofruns[counter++] = myrunstring->String().Atoi();  
  // Print summary:
  printf("Selected sample: %s\n", sample.Data());
  printf("========================================\n");
  for(Int_t irun = 0; irun < listofruns.GetSize(); irun++){
    printf("\trun %d\n", listofruns[irun]);
  }
  printf("\n");
  delete toks; delete runstrings;
}

//___________________________________________________________
Int_t GetYear(TString &sample){
  TString yearstring = sample(3,4); 
  Int_t year = yearstring.Atoi();
  return 2000 + year;
}

//___________________________________________________________
void AddInput(AliAnalysisAlien *alienhandler, TString sample, TArrayI &listofruns, Bool_t MC){
  Int_t year = GetYear(sample);
  TString specialpattern, datapattern;
  if(!MC){
    // handle Data
    datapattern = "ESDs/pass2/*ESDs.root";
    specialpattern = Form("data/%d", year);
    //alienhandler->SetRunPrefix("%09d");
  } else {
    // handle MC
    datapattern = "*ESDs.root";
    specialpattern = "sim";
  }
  alienhandler->SetGridDataDir(Form("/alice/%s/%s", specialpattern.Data(), sample.Data()));
  alienhandler->SetDataPattern(datapattern.Data());
  for(Int_t ien = 0; ien < listofruns.GetSize(); ien++){
    if(!MC) alienhandler->AddRunNumber(Form("%09d", listofruns[ien]));
    else alienhandler->AddRunNumber(listofruns[ien]);
  }
  alienhandler->SetGridOutputDir(sample.Data());
  alienhandler->SetOutputToRunNo();
}

//___________________________________________________________
void runAlien(TString data, TString mode = "test", Bool_t MC = kFALSE){  
  if(!gSystem->Getenv("ALICE_ROOT")){
    printf("AliRoot has to be initialized\n");  
    return;
  }
  
  // check for valid modes
  const int kModes = 5;
  TString allowed_modes[kModes] = {"proof", "prooftest", "test", "full", "submit"}; 
  Bool_t isValid = kFALSE;
  mode.ToLower();
  for(int imode = 0; imode < kModes; imode++){
    if(!mode.CompareTo(allowed_modes[imode])) isValid = kTRUE;
  }
  if(!isValid){
    printf("invalid analysis mode selected\n");
    return;
  }
  analysis_mode = mode; 
  Bool_t proofmode = mode.Contains("proof");
  // libraries to be loaded
  gSystem->Load("libANALYSIS");
  gSystem->Load("libANALYSISalice");
  gSystem->Load("libCORRFW");
  gSystem->Load("libPWGhfe");
  
  // Create Analysis Manager
  AliAnalysisManager *runAnalysis = new AliAnalysisManager("Heavy Flavour Electron Analysis");
  runAnalysis->SetCommonFileName(output_file.Data());
  runAnalysis->SetInputEventHandler(new AliESDInputHandler); 
  if(MC) runAnalysis->SetMCtruthEventHandler(new AliMCEventHandler);
  AliAnalysisAlien *alienhandler = CreateAlienHandler(proofmode);
  printf("alienhandler %p\n", alienhandler);
  runAnalysis->SetGridHandler(alienhandler);
  //return;
  
  // Specify input (runs or dataset)
  if(!proofmode){
    // Query sample ID and runs
    TString sample;
    TArrayI listofruns;
    DecodeDataString(data, sample, listofruns);
    AddInput(alienhandler, sample, listofruns, MC);
  } else {
    alienhandler->SetProofDataSet(data);
  }

  // Add Tasks
  gROOT->LoadMacro(Form("%s/ANALYSIS/macros/AddTaskPhysicsSelection.C", gSystem->Getenv("ALICE_ROOT")));
  gROOT->LoadMacro(Form("%s/PWG3/hfe/macros/AddTaskHFE.C", gSystem->Getenv("ALICE_ROOT")));
  AddTaskPhysicsSelection(MC);
  AddTaskHFE();     // @TODO: MC and PbPb flag to be fixed

  // Run Analysis
  TString anamode = proofmode ? "proof" : "grid";
  if(runAnalysis->InitAnalysis()){
    runAnalysis->PrintStatus();
    runAnalysis->StartAnalysis(anamode);
  }
}
 runAlien.C:1
 runAlien.C:2
 runAlien.C:3
 runAlien.C:4
 runAlien.C:5
 runAlien.C:6
 runAlien.C:7
 runAlien.C:8
 runAlien.C:9
 runAlien.C:10
 runAlien.C:11
 runAlien.C:12
 runAlien.C:13
 runAlien.C:14
 runAlien.C:15
 runAlien.C:16
 runAlien.C:17
 runAlien.C:18
 runAlien.C:19
 runAlien.C:20
 runAlien.C:21
 runAlien.C:22
 runAlien.C:23
 runAlien.C:24
 runAlien.C:25
 runAlien.C:26
 runAlien.C:27
 runAlien.C:28
 runAlien.C:29
 runAlien.C:30
 runAlien.C:31
 runAlien.C:32
 runAlien.C:33
 runAlien.C:34
 runAlien.C:35
 runAlien.C:36
 runAlien.C:37
 runAlien.C:38
 runAlien.C:39
 runAlien.C:40
 runAlien.C:41
 runAlien.C:42
 runAlien.C:43
 runAlien.C:44
 runAlien.C:45
 runAlien.C:46
 runAlien.C:47
 runAlien.C:48
 runAlien.C:49
 runAlien.C:50
 runAlien.C:51
 runAlien.C:52
 runAlien.C:53
 runAlien.C:54
 runAlien.C:55
 runAlien.C:56
 runAlien.C:57
 runAlien.C:58
 runAlien.C:59
 runAlien.C:60
 runAlien.C:61
 runAlien.C:62
 runAlien.C:63
 runAlien.C:64
 runAlien.C:65
 runAlien.C:66
 runAlien.C:67
 runAlien.C:68
 runAlien.C:69
 runAlien.C:70
 runAlien.C:71
 runAlien.C:72
 runAlien.C:73
 runAlien.C:74
 runAlien.C:75
 runAlien.C:76
 runAlien.C:77
 runAlien.C:78
 runAlien.C:79
 runAlien.C:80
 runAlien.C:81
 runAlien.C:82
 runAlien.C:83
 runAlien.C:84
 runAlien.C:85
 runAlien.C:86
 runAlien.C:87
 runAlien.C:88
 runAlien.C:89
 runAlien.C:90
 runAlien.C:91
 runAlien.C:92
 runAlien.C:93
 runAlien.C:94
 runAlien.C:95
 runAlien.C:96
 runAlien.C:97
 runAlien.C:98
 runAlien.C:99
 runAlien.C:100
 runAlien.C:101
 runAlien.C:102
 runAlien.C:103
 runAlien.C:104
 runAlien.C:105
 runAlien.C:106
 runAlien.C:107
 runAlien.C:108
 runAlien.C:109
 runAlien.C:110
 runAlien.C:111
 runAlien.C:112
 runAlien.C:113
 runAlien.C:114
 runAlien.C:115
 runAlien.C:116
 runAlien.C:117
 runAlien.C:118
 runAlien.C:119
 runAlien.C:120
 runAlien.C:121
 runAlien.C:122
 runAlien.C:123
 runAlien.C:124
 runAlien.C:125
 runAlien.C:126
 runAlien.C:127
 runAlien.C:128
 runAlien.C:129
 runAlien.C:130
 runAlien.C:131
 runAlien.C:132
 runAlien.C:133
 runAlien.C:134
 runAlien.C:135
 runAlien.C:136
 runAlien.C:137
 runAlien.C:138
 runAlien.C:139
 runAlien.C:140
 runAlien.C:141
 runAlien.C:142
 runAlien.C:143
 runAlien.C:144
 runAlien.C:145
 runAlien.C:146
 runAlien.C:147
 runAlien.C:148
 runAlien.C:149
 runAlien.C:150
 runAlien.C:151
 runAlien.C:152
 runAlien.C:153
 runAlien.C:154
 runAlien.C:155
 runAlien.C:156
 runAlien.C:157
 runAlien.C:158
 runAlien.C:159
 runAlien.C:160
 runAlien.C:161
 runAlien.C:162
 runAlien.C:163
 runAlien.C:164
 runAlien.C:165
 runAlien.C:166
 runAlien.C:167
 runAlien.C:168
 runAlien.C:169
 runAlien.C:170
 runAlien.C:171
 runAlien.C:172
 runAlien.C:173
 runAlien.C:174
 runAlien.C:175
 runAlien.C:176
 runAlien.C:177
 runAlien.C:178
 runAlien.C:179
 runAlien.C:180
 runAlien.C:181
 runAlien.C:182
 runAlien.C:183
 runAlien.C:184
 runAlien.C:185
 runAlien.C:186
 runAlien.C:187
 runAlien.C:188
 runAlien.C:189
 runAlien.C:190
 runAlien.C:191
 runAlien.C:192
 runAlien.C:193
 runAlien.C:194
 runAlien.C:195
 runAlien.C:196
 runAlien.C:197
 runAlien.C:198
 runAlien.C:199
 runAlien.C:200
 runAlien.C:201
 runAlien.C:202
 runAlien.C:203
 runAlien.C:204