ROOT logo
void SetupPar(char* pararchivename);
void SwitchBranches(TChain *c);
TChain * CreateXMLChain(char* xmlfile);
TChain * CreateAODChain(const char * name = 0x0);

void runPIDqa(const char *treelist = 0x0, Bool_t hasMC = kTRUE, Int_t nFiles = 5, Int_t nSkip = 0){
  if(!treelist){
    printf("Error: No ESD list specified\n");
    return;
  }
  if(gSystem->Getenv("ALICE_ROOT")){
    gSystem->Load("libANALYSIS");
    gSystem->Load("libANALYSISalice");
    gSystem->Load("libCORRFW");
  }
  else{
    SetupPar("STEERBase");
    SetupPar("ESD");
    SetupPar("AOD");
    SetupPar("ANALYSIS");
    SetupPar("ANALYSISalice");
    SetupPar("CORRFW");
    SetupPar("Util");
  }
  //SetupPar("HFE");
  gSystem->Load("libPWGHFhfe.so");
  AliLog::SetClassDebugLevel("AliHFEV0pid", 0);
  AliLog::SetClassDebugLevel("AliHFEpidQA", 0);
  //  gROOT->LoadMacro("AliAnalysisTaskHFE.cxx++");
  AliLog::SetGlobalLogLevel(AliLog::kWarning);

  AliHFEtools::SetLogLevel(0);
  
  // Make the ESD chain
  TString treename = treelist;
  TChain *inputChain = 0x0;
  Bool_t isAOD = kFALSE;
  if(treename.EndsWith(".xml")){
    esdchain = CreateXMLChain(treelist);
    SwitchBranches(inputChain);
  }else{
    inputChain = CreateAODChain(treelist);
    if(inputChain) isAOD = kTRUE;
    else{
      gROOT->LoadMacro("$ALICE_ROOT/PWG0/CreateESDChain.C");
      inputChain = CreateESDChain(treelist, nFiles, nSkip);
      SwitchBranches(inputChain);
    }
  }
 
  // Start the Analysis Manager and Create Handlers
  AliAnalysisManager *hfeAnalysis = new AliAnalysisManager("Single Electron Analysis");
  AliESDInputHandler *esdInputHandler;
  if(!isAOD) {
    hfeAnalysis->SetInputEventHandler(esdInputHandler = new AliESDInputHandler);
    // otherwise your proof analysis crashes if no ESD friends are available
    //esdInputHandler->SetReadFriends(kFALSE);   
  }
  else hfeAnalysis->SetInputEventHandler(new AliAODInputHandler);
  if(hasMC && !isAOD) hfeAnalysis->SetMCtruthEventHandler(new AliMCEventHandler);

  // test the NN reference file
  TFile *f = new TFile("NNref_v2_data.root", "READ");
  if(!f){
    AliError("NN reference file not found");
    return;
  }

  AliAnalysisTaskHFEpidQA *qaTask = new AliAnalysisTaskHFEpidQA("HFEpidQA");
  qaTask->SetV0pidQA();
  qaTask->SetNNref(f);
  hfeAnalysis->AddTask(qaTask);
  qaTask->ConnectInput(0, hfeAnalysis->GetCommonInputContainer());
  qaTask->ConnectOutput(1, hfeAnalysis->CreateContainer("PIDResults", TList::Class(), AliAnalysisManager::kOutputContainer, "PIDqa.root"));
  // Run the Analysis
  if(hfeAnalysis->InitAnalysis()){  
    TStopwatch timer;
    timer.Start();
    hfeAnalysis->StartAnalysis("local", inputChain);
    timer.Stop();
    timer.Print();
  }
}

//____________________________________________
TChain * CreateXMLChain(char* xmlfile)
{

  //TChain *chain = 0x0;
  const char *chainname="esdTree";
  TChain* chain = new TChain(chainname);
 
  TString input =xmlfile;
  cout<<" the input is::"<< xmlfile<<endl;

  char kXML  [1000];
  if(gSystem->Getenv("XML") )
    kXML = gSystem->Getenv("XML");
  else
    sprintf(kXML, xmlfile) ; 

  //    sprintf(kXML, "collection.xml") ; 
  
  cout<<"XML file "<<kXML<<endl;
  
  if (!TFile::Open(kXML)) {
    printf("No collection file with name -- %s -- was found\n",kXML);
    return ;
  }
  gSystem->Load("libNetx.so") ;
  gSystem->Load("libRAliEn.so");
  TGrid::Connect("alien://") ;



  //  TGridCollection * collection =  (TGridCollection*)gROOT->ProcessLine(Form("TAlienCollection::Open(\"%s\", 0)", kXML));
  TGridCollection * collection = (TGridCollection*) TAlienCollection::Open(kXML);
  if (! collection) {
    AliError(Form("%s not found", kXML)) ; 
    return kFALSE ; 
  }
  //collection->CheckIfOnline();

  TGridResult* result = collection->GetGridResult("",0 ,0);

  //  TList* analysisfilelist = result->GetFileInfoList();
  
  // Makes the ESD chain 
  printf("*** Getting the Chain       ***\n");

  for (Int_t index = 0; index < result->GetEntries(); index++) {
    TString alienURL = result->GetKey(index, "turl") ; 
    cout << "================== " << alienURL << endl ; 
    chain->Add(alienURL) ; 
    //alienURL.ReplaceAll("AliESDs.root",kXSFileName);
    // chainxs->Add(alienURL) ; 
  }


  //  chain->AddFileInfoList(analysisfilelist);
  if (chain) chain->ls();
  chain->SetBranchStatus("*Calo*",0);
  chain->SetBranchStatus("*FMD*",0);
  return chain;
}

//______________________________________________________________________________
TChain *CreateAODChain(const char * name){
  if(!name) return NULL;
  ifstream filelist(name);
  string filename;
  TChain *c = new TChain("aodTree");
  Bool_t isAODlist = kTRUE;
  while(getline(filelist,filename)){
    if(!strstr(filename.c_str(), "AliAOD")){
      isAODlist = kFALSE;
      break;
    }
    c->Add(filename.c_str());
  }
  if(!isAODlist){
    printf("No AOD anlysis\n");
    delete c;
    return NULL;
  }
  return c;
}

//______________________________________________________________________________
void SetupPar(char* pararchivename)
{
  if (pararchivename) {
    char processline[1024];
    sprintf(processline,".! tar xvzf %s.par",pararchivename);
    gROOT->ProcessLine(processline);
    TString ocwd = gSystem->WorkingDirectory();
    gSystem->ChangeDirectory(pararchivename);
    
    // check for BUILD.sh and execute
    if (!gSystem->AccessPathName("PROOF-INF/BUILD.sh")) {
      printf("*******************************\n");
      printf("*** Building PAR archive    ***\n");
      printf("*******************************\n");
      
      if (gSystem->Exec("PROOF-INF/BUILD.sh")) {
	Error("runProcess","Cannot Build the PAR Archive! - Abort!");
	return -1;
      }
    }
    // check for SETUP.C and execute
    if (!gSystem->AccessPathName("PROOF-INF/SETUP.C")) {
      printf("*******************************\n");
      printf("*** Setup PAR archive       ***\n");
      printf("*******************************\n");
      gROOT->Macro("PROOF-INF/SETUP.C");
    }
    
    gSystem->ChangeDirectory(ocwd.Data());
    printf("Current dir: %s\n", ocwd.Data());
  }
}

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