2 Merge calibration entry macro:
6 .L $ALICE_ROOT/ANALYSIS/CalibMacros/mergeCalibObjects.C
11 #if !defined(__CINT__) || defined(__MAKECINT__)
16 #include "TObjArray.h"
17 #include "AliSysInfo.h"
18 #include "AliTPCcalibBase.h"
20 #include "TMethodCall.h"
22 #include "TGridResult.h"
26 void IterTXT( const char * fileList="calib.list",Bool_t separate=kFALSE);
27 void IterAlien(const char* outputDir, const char* outputFileName="AliESDfriends_v1.root");
28 void Merge(TFile* fileIn, TObjArray * array);
29 void StoreResults(TObjArray * array);
30 void StoreSeparateResults(TObjArray * array);
32 void mergeCalibObjects( const char * fileList="calib.list",Bool_t separate=kFALSE){
36 IterTXT(fileList,separate );
41 // Loading the necessary libraries
43 gSystem->Load("libANALYSIS");
44 gSystem->Load("libTPCcalib");
51 // iterating over the files coming from an XML collection
58 void IterAlien(const char* outputDir, const char* outputFileName){
61 // Merge the files coming out of the calibration job
65 TObjArray * mergeArray= new TObjArray;
67 TString outputFile(outputFileName);
69 // looking for files to be merged in the output directory
70 command = Form("find %s/ *%s", outputDir, outputFile.Data());
71 printf("command: %s\n", command.Data());
72 TGrid::Connect("alien://");
73 TGridResult *res = gGrid->Command(command);
77 // loop over the results
78 while((map=(TMap*)nextmap())) {
80 TObjString *objs = dynamic_cast<TObjString*>(map->GetValue("turl"));
81 if (!objs || !objs->GetString().Length()) {
82 // Nothing found - skip this output
86 printf("looking for file %s\n",(objs->GetString()).Data());
87 TFile* currentFile=TFile::Open((objs->GetString()).Data());
88 Merge(currentFile, mergeArray);
90 Bool_t separate = kFALSE;
92 StoreSeparateResults(mergeArray);
94 StoreResults(mergeArray);
100 void IterTXT( const char * fileList, Bool_t separate){
102 // Merge the files indicated in the list - fileList
103 // ASCII file opition example:
104 // find `pwd`/ | grep AliESDfriends_v1.root > calib.list
107 TObjArray * mergeArray= new TObjArray;
109 // Open the input stream
113 // Read the input list of files
118 if (!objfile.Contains("root")) continue; // protection
119 printf("Open file:Counter\t%d\tMerging file %s\n",counter++,objfile.Data());
120 TFile currentFile(objfile.Data());
121 Merge(¤tFile, mergeArray);
124 StoreSeparateResults(mergeArray);
126 StoreResults(mergeArray);
130 void StoreResults(TObjArray * array){
132 // Storing the results in one single file
134 TFile *f = new TFile("CalibObjects.root","recreate");
135 for (Int_t i=0; i<array->GetEntries(); i++){
136 TObject *object0 = array->At(i);
137 if (!object0) continue;
145 void StoreSeparateResults(TObjArray * array){
147 // Store the results in separate files (one per object)
149 for (Int_t i=0; i<array->GetEntries(); i++){
150 TObject *object0 = array->At(i);
151 if (!object0) continue;
152 TFile *f = new TFile(Form("CalibObjects_%s.root",object0->GetName()),"recreate");
161 void Merge(TFile* fileIn, TObjArray * array){
165 TObjArray *carray = new TObjArray; //array of the objects inside current file
166 carray->SetOwner(kTRUE);
168 // load all objects to memory
170 TList *farr = fileIn->GetListOfKeys();
172 for (Int_t ical=0; ical<farr->GetEntries(); ical++){
173 if (!farr->At(ical)) continue;
174 TObject *obj = fileIn->Get(farr->At(ical)->GetName());
175 if (obj) carray->AddLast(obj);
176 AliSysInfo::AddStamp(farr->At(ical)->GetName(),1,ical);
179 if (carray->GetEntries()==0) return;
182 for (Int_t i=0; i<carray->GetEntries(); i++){
184 TObjArray *templist = new TObjArray(1);
185 templist->SetOwner(kFALSE);
186 TObject *currentObject = carray->At(i);
187 if (!currentObject) continue;
188 printf("%s\n",currentObject->GetName());
189 callEnv.InitWithPrototype(currentObject->IsA(), "Merge", "TCollection*");
190 if (!callEnv.IsValid()) {continue;}
191 TString oname=currentObject->GetName();
192 if (oname.Contains("esdFriendTree")) continue;
193 TObject *mergedObject = array->FindObject(currentObject->GetName());
195 array->AddLast(currentObject);
199 templist->AddLast(currentObject);
200 callEnv.SetParam((Long_t) templist);
201 callEnv.Execute(mergedObject);