ROOT logo
/*
  Merge calibration entry macro:
  
  Example usage:
  
  .L $ALICE_ROOT/ANALYSIS/macros/mergeCalibObjects.C
  mergeCalibObjects()
  
*/

#if !defined(__CINT__) || defined(__MAKECINT__)

#include <fstream>
#include "TSystem.h"
#include "TFile.h"
#include "TObjArray.h"
#include "AliSysInfo.h"
#include "AliTPCcalibBase.h"
#include "TH1F.h"
#include "TMethodCall.h"

#endif

void IterTXT( const char * fileList="calib.list",Bool_t separate);
void Merge(TFile* fileIn, TObjArray * array);
void StoreResults(TObjArray * array);


void mergeCalibObjects( const char * fileList="calib.list",Bool_t separate=kFALSE){

  // main function

  IterTXT(fileList,separate );
}

void LoadLib(){

  // Loading the necessary libraries

  gSystem->Load("libANALYSIS");
  gSystem->Load("libTPCcalib"); 
  TH1::AddDirectory(0);
}


void IterXML(){ 

  // iterating over the files coming from an XML collection 
  // to be implemented

  LoadLib();
}

void IterTXT( const char * fileList, Bool_t separate){

  // Merge the files indicated in the list - fileList
  // ASCII file opition example: 
  // find `pwd`/ | grep AliESDfriends_v1.root > calib.list

  LoadLib();
  TObjArray * mergeArray= new TObjArray;
  
  // Open the input stream
  
  ifstream in;
  in.open(fileList);
  // Read the input list of files 
  TString objfile;
  Int_t counter=0;
  while(in.good()) {
    in >> objfile;
    if (!objfile.Contains("root")) continue; // protection    
    printf("Open file:Counter\t%d\tMerging file %s\n",counter++,objfile.Data());
    TFile currentFile(objfile.Data());
    Merge(&currentFile, mergeArray);
  }
  if (separate) 
    StoreSeparateResults(mergeArray);
  else
    StoreResults(mergeArray);
  delete mergeArray;
}

void StoreResults(TObjArray * array){

  // Storing the results in one single file

  TFile *f = new TFile("CalibObjects.root","recreate");
  for (Int_t i=0; i<array->GetEntries(); i++){
    TObject *object0 = array->At(i);
    if (!object0) continue;
    object0->Write();
  }
  f->Close();
  delete f;
}


void StoreSeparateResults(TObjArray * array){

  // Store the results in separate files (one per object)

  for (Int_t i=0; i<array->GetEntries(); i++){
    TObject *object0 = array->At(i);
    if (!object0) continue;
    TFile *f = new TFile(Form("CalibObjects_%s.root",object0->GetName()),"recreate");
    object0->Write();
    f->Close();
    delete f;
  }
}



void Merge(TFile* fileIn, TObjArray * array){
  
  // Merging procedure
  
  TObjArray *carray = new TObjArray;   //array of the objects inside current file
  carray->SetOwner(kTRUE);

  // load all objects to  memory
  
  TList *farr = fileIn->GetListOfKeys();
  if (!farr) return;
  for (Int_t ical=0; ical<farr->GetEntries(); ical++){
    if (!farr->At(ical)) continue;
    TObject *obj = fileIn->Get(farr->At(ical)->GetName());
    if (obj) carray->AddLast(obj);
    AliSysInfo::AddStamp(farr->At(ical)->GetName(),1,ical);  
  }

  if (carray->GetEntries()==0) return;
  TMethodCall callEnv;

  for (Int_t i=0; i<carray->GetEntries(); i++){

    TObjArray *templist = new TObjArray(1);
    templist->SetOwner(kFALSE);
    TObject *currentObject = carray->At(i);
    if (!currentObject) continue;
    printf("%s\n",currentObject->GetName());
    callEnv.InitWithPrototype(currentObject->IsA(), "Merge", "TCollection*");
    if (!callEnv.IsValid()) {continue;}

    TObject *mergedObject = array->FindObject(currentObject->GetName());
    if (!mergedObject) {
      array->AddLast(currentObject);
      carray->RemoveAt(i);
      continue;
    }
    templist->AddLast(currentObject);
    callEnv.SetParam((Long_t) templist);
    callEnv.Execute(mergedObject);
    delete templist;
  }
  delete carray;
}
 mergeCalibObjects.C:1
 mergeCalibObjects.C:2
 mergeCalibObjects.C:3
 mergeCalibObjects.C:4
 mergeCalibObjects.C:5
 mergeCalibObjects.C:6
 mergeCalibObjects.C:7
 mergeCalibObjects.C:8
 mergeCalibObjects.C:9
 mergeCalibObjects.C:10
 mergeCalibObjects.C:11
 mergeCalibObjects.C:12
 mergeCalibObjects.C:13
 mergeCalibObjects.C:14
 mergeCalibObjects.C:15
 mergeCalibObjects.C:16
 mergeCalibObjects.C:17
 mergeCalibObjects.C:18
 mergeCalibObjects.C:19
 mergeCalibObjects.C:20
 mergeCalibObjects.C:21
 mergeCalibObjects.C:22
 mergeCalibObjects.C:23
 mergeCalibObjects.C:24
 mergeCalibObjects.C:25
 mergeCalibObjects.C:26
 mergeCalibObjects.C:27
 mergeCalibObjects.C:28
 mergeCalibObjects.C:29
 mergeCalibObjects.C:30
 mergeCalibObjects.C:31
 mergeCalibObjects.C:32
 mergeCalibObjects.C:33
 mergeCalibObjects.C:34
 mergeCalibObjects.C:35
 mergeCalibObjects.C:36
 mergeCalibObjects.C:37
 mergeCalibObjects.C:38
 mergeCalibObjects.C:39
 mergeCalibObjects.C:40
 mergeCalibObjects.C:41
 mergeCalibObjects.C:42
 mergeCalibObjects.C:43
 mergeCalibObjects.C:44
 mergeCalibObjects.C:45
 mergeCalibObjects.C:46
 mergeCalibObjects.C:47
 mergeCalibObjects.C:48
 mergeCalibObjects.C:49
 mergeCalibObjects.C:50
 mergeCalibObjects.C:51
 mergeCalibObjects.C:52
 mergeCalibObjects.C:53
 mergeCalibObjects.C:54
 mergeCalibObjects.C:55
 mergeCalibObjects.C:56
 mergeCalibObjects.C:57
 mergeCalibObjects.C:58
 mergeCalibObjects.C:59
 mergeCalibObjects.C:60
 mergeCalibObjects.C:61
 mergeCalibObjects.C:62
 mergeCalibObjects.C:63
 mergeCalibObjects.C:64
 mergeCalibObjects.C:65
 mergeCalibObjects.C:66
 mergeCalibObjects.C:67
 mergeCalibObjects.C:68
 mergeCalibObjects.C:69
 mergeCalibObjects.C:70
 mergeCalibObjects.C:71
 mergeCalibObjects.C:72
 mergeCalibObjects.C:73
 mergeCalibObjects.C:74
 mergeCalibObjects.C:75
 mergeCalibObjects.C:76
 mergeCalibObjects.C:77
 mergeCalibObjects.C:78
 mergeCalibObjects.C:79
 mergeCalibObjects.C:80
 mergeCalibObjects.C:81
 mergeCalibObjects.C:82
 mergeCalibObjects.C:83
 mergeCalibObjects.C:84
 mergeCalibObjects.C:85
 mergeCalibObjects.C:86
 mergeCalibObjects.C:87
 mergeCalibObjects.C:88
 mergeCalibObjects.C:89
 mergeCalibObjects.C:90
 mergeCalibObjects.C:91
 mergeCalibObjects.C:92
 mergeCalibObjects.C:93
 mergeCalibObjects.C:94
 mergeCalibObjects.C:95
 mergeCalibObjects.C:96
 mergeCalibObjects.C:97
 mergeCalibObjects.C:98
 mergeCalibObjects.C:99
 mergeCalibObjects.C:100
 mergeCalibObjects.C:101
 mergeCalibObjects.C:102
 mergeCalibObjects.C:103
 mergeCalibObjects.C:104
 mergeCalibObjects.C:105
 mergeCalibObjects.C:106
 mergeCalibObjects.C:107
 mergeCalibObjects.C:108
 mergeCalibObjects.C:109
 mergeCalibObjects.C:110
 mergeCalibObjects.C:111
 mergeCalibObjects.C:112
 mergeCalibObjects.C:113
 mergeCalibObjects.C:114
 mergeCalibObjects.C:115
 mergeCalibObjects.C:116
 mergeCalibObjects.C:117
 mergeCalibObjects.C:118
 mergeCalibObjects.C:119
 mergeCalibObjects.C:120
 mergeCalibObjects.C:121
 mergeCalibObjects.C:122
 mergeCalibObjects.C:123
 mergeCalibObjects.C:124
 mergeCalibObjects.C:125
 mergeCalibObjects.C:126
 mergeCalibObjects.C:127
 mergeCalibObjects.C:128
 mergeCalibObjects.C:129
 mergeCalibObjects.C:130
 mergeCalibObjects.C:131
 mergeCalibObjects.C:132
 mergeCalibObjects.C:133
 mergeCalibObjects.C:134
 mergeCalibObjects.C:135
 mergeCalibObjects.C:136
 mergeCalibObjects.C:137
 mergeCalibObjects.C:138
 mergeCalibObjects.C:139
 mergeCalibObjects.C:140
 mergeCalibObjects.C:141
 mergeCalibObjects.C:142
 mergeCalibObjects.C:143
 mergeCalibObjects.C:144
 mergeCalibObjects.C:145
 mergeCalibObjects.C:146
 mergeCalibObjects.C:147
 mergeCalibObjects.C:148
 mergeCalibObjects.C:149
 mergeCalibObjects.C:150
 mergeCalibObjects.C:151
 mergeCalibObjects.C:152
 mergeCalibObjects.C:153
 mergeCalibObjects.C:154
 mergeCalibObjects.C:155
 mergeCalibObjects.C:156
 mergeCalibObjects.C:157
 mergeCalibObjects.C:158
 mergeCalibObjects.C:159