ROOT logo
// Usage:
//   makeResults.C("tasks", "file_list", ""task_id, kGRID)
//   tasks : "ALL" or one/more of the following separated by space:
//     "EFF"  : TRD Tracking Efficiency 
//     "EFFC" : TRD Tracking Efficiency Combined (barrel + stand alone) - only in case of simulations
//     "RES"  : TRD tracking Resolution
//     "PID"  : TRD PID - pion efficiency 
//     "DET"  : Basic TRD Detector checks
//     "NOFR" : Data set does not have AliESDfriends.root 
//     "NOMC" : Data set does not have Monte Carlo Informations (real data), so all tasks which rely
//              on MC information are switched off
//   file_list : is the list of the files to be processed. 
//     They should contain the full path. Here is an example:
// /lustre/alice/local/TRDdata/SIM/P-Flat/TRUNK/RUN0/TRD.Performance.root
// or for GRID alien:///alice/cern.ch/user/m/mfasel/MinBiasProd/results/ppMinBias80000/1/TRD.Performance.root
//   task_id : identifier of task speciality as defined by the AddMacro.C. 
//             (e.g. AddTRDresolution.C defines "" for barrel tracks, "K" for kink tracks and "SA" for stand alone tracks)
//   kGRID : specify if files are comming from a GRID collection [default kFALSE]
//
// HOW TO BUILD THE FILE LIST
//   1. locally
// ls -1 BaseDir/RUN*/TRD.Performance.root > files.lst
// 
//   2. on Grid
// char *BaseDir="/alice/cern.ch/user/m/mfasel/MinBiasProd/results/ppMinBias80000/";
// TGrid::Connect("alien://");
// TGridResult *res = gGrid->Query(BaseDir, "%/TRD.Performance.root");
// TGridCollection *col = gGrid->OpenCollectionQuery(res);
// col->Reset();
// TMap *map = 0x0;
// while(map = (TMap*)col->Next()){
//   TIter it((TCollection*)map);
//   TObjString *info = 0x0;
//   while(info=(TObjString*)it()){
//     printf("alien://%s\n", col->GetLFN(info->GetString().Data()));
//   }
// }
//
// The files which will be processed are the intersection between the
// condition on the tasks and the files in the file list.
//
//
// In compiled mode :
// Don't forget to load first the libraries
// gSystem->Load("libANALYSIS.so")
// gSystem->Load("libANALYSISalice.so")
// gSystem->Load("libTENDER.so");
// gSystem->Load("libPWGPP.so");
// gSystem->Load("libCORRFW.so");
// gSystem->Load("libPWGmuon.so");
// gSystem->Load("libNetx.so") ;
// gSystem->Load("libRAliEn.so");

// Authors:
//   Alex Bercuci (A.Bercuci@gsi.de)
//   Markus Fasel (m.Fasel@gsi.de)
//

#if ! defined (__CINT__) || defined (__MAKECINT__)
#include <fstream>
#include "TError.h"
#include <TClass.h>
#include <TCanvas.h>
#include <TH1.h>
#include <TGraph.h>
#include <TObjArray.h>
#include <TObjString.h>
#include <TString.h>
#include <TROOT.h>
#include <TStyle.h>
#include <TSystem.h>
#include <TGrid.h>
#include <TGridResult.h>
#include <TGridCollection.h>

#include "AliLog.h"

#include "PWGPP/TRD/info/AliTRDtrendingManager.h"
#include "PWGPP/TRD/AliTRDpwgppHelper.h"
#include "PWGPP/TRD/AliTRDrecoTask.h"
#include "PWGPP/TRD/AliTRDcheckESD.h"
#include "PWGPP/TRD/AliTRDinfoGen.h"
#endif

const Char_t *libs[] = {"libProofPlayer.so", "libANALYSIS.so", "libANALYSISalice.so", "libCORRFW", "libTENDER.so", "libPWGPP.so", "libPWGmuon.so"};
// define setup
TCanvas *c(NULL);
Bool_t mc(kFALSE), friends(kFALSE);
Bool_t summary(kTRUE);

void processTRD(TNamed* task, const Char_t *filename);
void processESD(TNamed* task, const Char_t *filename);
void processGEN(TNamed* task, const Char_t *filename);
void makeSummaryESD(const Char_t* filename="QAresults.root", 
		    Double_t* trendValues=0x0, 
		    Bool_t useCF=kTRUE, 
		    Bool_t useIsolatedBC=kFALSE, 
		    Bool_t cutTOFbc=kFALSE, 
		    const Char_t* dir="TRD_Performance", 
		    Bool_t isGrid=kFALSE);
void makeResults(const Char_t *opt = "ALL",
                 const Char_t *files="QAresults.root",
                 const Char_t *cid = "",
                 Bool_t kGRID=kFALSE, Bool_t dosummary = kTRUE)
{
  if(kGRID) TGrid::Connect("alien://");

  // Load Libraries in interactive mode
  Int_t nlibs = static_cast<Int_t>(sizeof(libs)/sizeof(Char_t *));
  for(Int_t ilib=0; ilib<nlibs; ilib++){
    if(gSystem->Load(libs[ilib]) >= 0) continue;
    Error("makeResults.C", "Failed to load %s.", libs[ilib]);
    return;
  }

  mc      = AliTRDpwgppHelper::HasReadMCData(opt);
  friends = AliTRDpwgppHelper::HasReadFriendData(opt);

  gStyle->SetOptStat(0);
  gStyle->SetOptFit(0);
  TString outputFile;
  if(!TString(files).EndsWith(".root")){
    outputFile = Form("%s/QAResults.root", gSystem->ExpandPathName("$PWD"));
    AliTRDpwgppHelper::MergeProd("QAResults.root", files);
  } else {
    outputFile = files;
  }
  Int_t fSteerTask = AliTRDpwgppHelper::ParseOptions(opt);

  if(!dosummary){
    summary = kFALSE;
    if(!c) c=new TCanvas("c", "Performance", 10, 10, 800, 500);
  }

  TClass *ctask = new TClass;
  AliAnalysisTask *task = NULL;
  for(Int_t itask = AliTRDpwgppHelper::kNTRDQATASKS; itask--;){
    if(!AliTRDpwgppHelper::DoTask(itask, fSteerTask)) continue;
    new(ctask) TClass(AliTRDpwgppHelper::TaskClassName(itask));
    task = (AliAnalysisTask*)ctask->New();
    task->SetName(Form("%s%s", task->GetName(), cid));
    printf(" *** task %s, output file %s\n", task->GetName(), outputFile.Data());
    if(task->IsA()->InheritsFrom("AliTRDrecoTask")) processTRD(task, outputFile.Data());
    else if(strcmp(task->IsA()->GetName(), "AliTRDcheckESD")==0) processESD(task, outputFile.Data());
    else if(strcmp(task->IsA()->GetName(), "AliTRDinfoGen")==0) processGEN(task, outputFile.Data());
    else{
      Error("makeResults.C", "Handling of class task \"%s\" not implemented.", task->IsA()->GetName());
      delete task;
    }
  }
  delete ctask;
  delete c;
  // write trending summary
  AliTRDtrendingManager::Instance()->Terminate();
}


//______________________________________________________
void processTRD(TNamed *otask, const Char_t *filename)
{
  printf("process[%s] : %s\n", otask->GetName(), otask->GetTitle());
  Int_t debug(0);
  AliTRDrecoTask *task = dynamic_cast<AliTRDrecoTask*>(otask);
  task->SetDebugLevel(debug);
  AliLog::SetClassDebugLevel(otask->IsA()->GetName(), debug);
  task->SetMCdata(mc);
  task->SetFriends(friends);

  //if(!task->Load(Form("%s/AnalysisResults.root", gSystem->ExpandPathName("$PWD")))){
  if(!task->Load(filename)){
    Error("makeResults.C", "Load data container for task %s failed.", task->GetName());
    delete task;
    return;
  }
  task->LoadDetectorMap(filename);
  if(!task->PostProcess()){
    Error("makeResults.C", "Processing data container for task %s failed.", task->GetName());
    delete task;
    return;
  }
  if(summary) task->MakeSummary();
  else{
    for(Int_t ipic=0; ipic<task->GetNRefFigures(); ipic++){
      c->Clear();
      if(!task->GetRefFigure(ipic)) continue;
      c->SaveAs(Form("%s_Fig%02d.gif", task->GetName(), ipic), "gif");
    }
  }
  delete task;
}

//______________________________________________________
void processESD(TNamed *otask, const Char_t *filename)
{
  printf("process[%s] : %s\n", otask->GetName(), otask->GetTitle());

  AliTRDcheckESD *esd = dynamic_cast<AliTRDcheckESD*>(otask);
  if(!esd){
    Info("makeResults.C", "Processing of task %s failed.", otask->GetName());
    delete otask;
    return;
  }
  //if(!esd->Load(Form("%s/AnalysisResults.root", gSystem->ExpandPathName("$PWD")), "TRD_Performance")){
  if(!esd->Load(filename, "TRD_Performance")){
    Error("makeResults.C", "Load data container for task %s failed.", esd->GetName());
    delete esd;
    return;
  }
  esd->Terminate(NULL);

  if(summary) esd->MakeSummaryFromCF(0, "", kFALSE, kFALSE);
  // else{
  //   for(Int_t ipic(0); ipic<esd->GetNRefFigures(); ipic++){
  //     c->Clear();
  //     if(!esd->GetRefFigure(ipic)) continue;
  //     c->SaveAs(Form("%s_Fig%02d.gif", esd->GetName(), ipic));
  //   }
  // }
  delete esd;
}

//______________________________________________________
void processGEN(TNamed *otask, const Char_t *filename)
{
  printf("process[%s] : %s\n", otask->GetName(), otask->GetTitle());

  AliTRDinfoGen *info = dynamic_cast<AliTRDinfoGen*>(otask);

  if(!info->Load(filename, "TRD_Performance")){
    Error("makeResults.C", "Load data container for task %s failed.", info->GetName());
    delete info;
    return;
  }
  info->MakeSummary();
//   else{
//     for(Int_t ipic(0); ipic<info->GetNRefFigures(); ipic++){
//       c->Clear();
//       if(!info->GetRefFigure(ipic)) continue;
//       c->SaveAs(Form("%s_Fig%02d.gif", info->GetName(), ipic));
//     }
//   }

  delete info;
}

//______________________________________________________
void makeSummaryESD(const Char_t* filename, Double_t* trendValues, Bool_t useCF, Bool_t useIsolatedBC, Bool_t cutTOFbc, const Char_t* dir, Bool_t isGrid) {
  //
  //  Make the summary picture and get trending variables from the ESD task
  //
  if(isGrid) TGrid::Connect("alien://");

  // Load Libraries in interactive mode
  Int_t nlibs = static_cast<Int_t>(sizeof(libs)/sizeof(Char_t *));
  for(Int_t ilib=0; ilib<nlibs; ilib++){
    if(gSystem->Load(libs[ilib]) >= 0) continue;
    Error("makeResults.C", "Failed to load %s.", libs[ilib]);
    return;
  }

  AliTRDcheckESD *esd=new AliTRDcheckESD();
  if(!esd->Load(filename,dir)) return;
  //esd->Terminate();
  if(useCF) esd->MakeSummaryFromCF(trendValues, "", useIsolatedBC, cutTOFbc);
  //  else esd->MakeSummary(trendValues);
}
 makeResults.C:1
 makeResults.C:2
 makeResults.C:3
 makeResults.C:4
 makeResults.C:5
 makeResults.C:6
 makeResults.C:7
 makeResults.C:8
 makeResults.C:9
 makeResults.C:10
 makeResults.C:11
 makeResults.C:12
 makeResults.C:13
 makeResults.C:14
 makeResults.C:15
 makeResults.C:16
 makeResults.C:17
 makeResults.C:18
 makeResults.C:19
 makeResults.C:20
 makeResults.C:21
 makeResults.C:22
 makeResults.C:23
 makeResults.C:24
 makeResults.C:25
 makeResults.C:26
 makeResults.C:27
 makeResults.C:28
 makeResults.C:29
 makeResults.C:30
 makeResults.C:31
 makeResults.C:32
 makeResults.C:33
 makeResults.C:34
 makeResults.C:35
 makeResults.C:36
 makeResults.C:37
 makeResults.C:38
 makeResults.C:39
 makeResults.C:40
 makeResults.C:41
 makeResults.C:42
 makeResults.C:43
 makeResults.C:44
 makeResults.C:45
 makeResults.C:46
 makeResults.C:47
 makeResults.C:48
 makeResults.C:49
 makeResults.C:50
 makeResults.C:51
 makeResults.C:52
 makeResults.C:53
 makeResults.C:54
 makeResults.C:55
 makeResults.C:56
 makeResults.C:57
 makeResults.C:58
 makeResults.C:59
 makeResults.C:60
 makeResults.C:61
 makeResults.C:62
 makeResults.C:63
 makeResults.C:64
 makeResults.C:65
 makeResults.C:66
 makeResults.C:67
 makeResults.C:68
 makeResults.C:69
 makeResults.C:70
 makeResults.C:71
 makeResults.C:72
 makeResults.C:73
 makeResults.C:74
 makeResults.C:75
 makeResults.C:76
 makeResults.C:77
 makeResults.C:78
 makeResults.C:79
 makeResults.C:80
 makeResults.C:81
 makeResults.C:82
 makeResults.C:83
 makeResults.C:84
 makeResults.C:85
 makeResults.C:86
 makeResults.C:87
 makeResults.C:88
 makeResults.C:89
 makeResults.C:90
 makeResults.C:91
 makeResults.C:92
 makeResults.C:93
 makeResults.C:94
 makeResults.C:95
 makeResults.C:96
 makeResults.C:97
 makeResults.C:98
 makeResults.C:99
 makeResults.C:100
 makeResults.C:101
 makeResults.C:102
 makeResults.C:103
 makeResults.C:104
 makeResults.C:105
 makeResults.C:106
 makeResults.C:107
 makeResults.C:108
 makeResults.C:109
 makeResults.C:110
 makeResults.C:111
 makeResults.C:112
 makeResults.C:113
 makeResults.C:114
 makeResults.C:115
 makeResults.C:116
 makeResults.C:117
 makeResults.C:118
 makeResults.C:119
 makeResults.C:120
 makeResults.C:121
 makeResults.C:122
 makeResults.C:123
 makeResults.C:124
 makeResults.C:125
 makeResults.C:126
 makeResults.C:127
 makeResults.C:128
 makeResults.C:129
 makeResults.C:130
 makeResults.C:131
 makeResults.C:132
 makeResults.C:133
 makeResults.C:134
 makeResults.C:135
 makeResults.C:136
 makeResults.C:137
 makeResults.C:138
 makeResults.C:139
 makeResults.C:140
 makeResults.C:141
 makeResults.C:142
 makeResults.C:143
 makeResults.C:144
 makeResults.C:145
 makeResults.C:146
 makeResults.C:147
 makeResults.C:148
 makeResults.C:149
 makeResults.C:150
 makeResults.C:151
 makeResults.C:152
 makeResults.C:153
 makeResults.C:154
 makeResults.C:155
 makeResults.C:156
 makeResults.C:157
 makeResults.C:158
 makeResults.C:159
 makeResults.C:160
 makeResults.C:161
 makeResults.C:162
 makeResults.C:163
 makeResults.C:164
 makeResults.C:165
 makeResults.C:166
 makeResults.C:167
 makeResults.C:168
 makeResults.C:169
 makeResults.C:170
 makeResults.C:171
 makeResults.C:172
 makeResults.C:173
 makeResults.C:174
 makeResults.C:175
 makeResults.C:176
 makeResults.C:177
 makeResults.C:178
 makeResults.C:179
 makeResults.C:180
 makeResults.C:181
 makeResults.C:182
 makeResults.C:183
 makeResults.C:184
 makeResults.C:185
 makeResults.C:186
 makeResults.C:187
 makeResults.C:188
 makeResults.C:189
 makeResults.C:190
 makeResults.C:191
 makeResults.C:192
 makeResults.C:193
 makeResults.C:194
 makeResults.C:195
 makeResults.C:196
 makeResults.C:197
 makeResults.C:198
 makeResults.C:199
 makeResults.C:200
 makeResults.C:201
 makeResults.C:202
 makeResults.C:203
 makeResults.C:204
 makeResults.C:205
 makeResults.C:206
 makeResults.C:207
 makeResults.C:208
 makeResults.C:209
 makeResults.C:210
 makeResults.C:211
 makeResults.C:212
 makeResults.C:213
 makeResults.C:214
 makeResults.C:215
 makeResults.C:216
 makeResults.C:217
 makeResults.C:218
 makeResults.C:219
 makeResults.C:220
 makeResults.C:221
 makeResults.C:222
 makeResults.C:223
 makeResults.C:224
 makeResults.C:225
 makeResults.C:226
 makeResults.C:227
 makeResults.C:228
 makeResults.C:229
 makeResults.C:230
 makeResults.C:231
 makeResults.C:232
 makeResults.C:233
 makeResults.C:234
 makeResults.C:235
 makeResults.C:236
 makeResults.C:237
 makeResults.C:238
 makeResults.C:239
 makeResults.C:240
 makeResults.C:241
 makeResults.C:242
 makeResults.C:243
 makeResults.C:244
 makeResults.C:245
 makeResults.C:246
 makeResults.C:247
 makeResults.C:248
 makeResults.C:249
 makeResults.C:250
 makeResults.C:251
 makeResults.C:252
 makeResults.C:253
 makeResults.C:254
 makeResults.C:255
 makeResults.C:256
 makeResults.C:257
 makeResults.C:258
 makeResults.C:259
 makeResults.C:260
 makeResults.C:261
 makeResults.C:262
 makeResults.C:263
 makeResults.C:264
 makeResults.C:265
 makeResults.C:266
 makeResults.C:267