]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGPP/CalibMacros/AliOCDBToolkit.cxx
added info on evaluatation on weighted merging of vzero event planes
[u/mrichter/AliRoot.git] / PWGPP / CalibMacros / AliOCDBToolkit.cxx
CommitLineData
4f76c2f2 1/*
2
3 Primary goal of the proposal was to provide functionality to browse and compare the content of the OCDB
4 specified by different means.
5
6 a.) galice.root - as currently implemented by Ruben in MC (or any file with cdbMap, and cdbList)
7 b.) AliESDs.root - for the reconstructed data
8 c.) ocdb snapshot - as used for grid productions
9 d.) TMap(s) - as used internally in galice.root and AliESDs,root
10 e.) log file (if possible) - looks logs aways used similar syntax, tested and working
11 f.) C macro - custom macro
12
13 Content comparison should be done:
14 a.) on the level of symbolic links
15 b.) on the level of content itself
16 - by by byte comparison dif
17 - data member by data member comparison
18
19 Implementation assumption:
20 All input formats (a .. f) will be converted to the TMap storages and TList if AliCDBIds
21
22
23 Example usage:
284c4af2 24 export mcProd=$ALICE_ROOT/PWGPP/CalibMacros/
4f76c2f2 25 .L $mcProd/AliOCDBToolkit.cxx+
284c4af2 26 MakeDiffExampleUseCase();
4f76c2f2 27
28
29*/
30
31// STD
32#include <iostream>
33#include <algorithm>
34#include <sstream>
35#include <stdexcept>
36#include <functional>
37//
38#include "TSystem.h"
39#include "TObjArray.h"
40#include "TString.h"
41#include "TTree.h"
3ab100e6 42#include "TMessage.h"
4f76c2f2 43//
44#include "AliCDBManager.h"
45#include "AliCDBEntry.h"
46
47//
48//
49//
50
51
52void MakeDiffExampleUseCase(); // example usage
53//
54//
55Bool_t ParseInfoFromOcdbString(TString ocdbString, TString &ocdbPath, Int_t &run0, Int_t &run1, Int_t &version, Int_t &subVersion);
56Bool_t ParseInfoFromOcdbString(TString ocdbString, AliCDBId &cdbId);
57TList * ConvertListStringToCDBId(const TList *cdbList0);
58
59void LoadOCDBFromLog(const char *logName, Int_t verbose);
60void LoadOCDBFromMap(const TMap *cdbMap, const TList *cdbList);
61void MakeDiff(const TMap *cdbMap0, const TList *cdbList0, const TMap *cdbMap1, const TList *cdbList1, Int_t verbose);
3ab100e6 62void DumpOCDB(const TMap *cdbMap0, const TList *cdbList0);
4f76c2f2 63
64
65
66void MakeDiffExampleUseCase(){
67 //
68 // Example usage for the MC
69 // To run example case, assuming presence of following files in working directory:
70 // - rec.log
71 // - galice.root
72 // - AliESDs.root
73 //
74 AliCDBManager * man = AliCDBManager::Instance();
75 LoadOCDBFromLog("rec.log",0);
76 const TMap *cdbMapLog= man->GetStorageMap(); // this is map of
77 const TList *cdbListLog=man->GetRetrievedIds(); // this is list of AliCDBId
78 // TList *cdbListLog0=man->GetRetrievedIds(); // this is list of AliCDBId
79 //
80 TFile *fmc = TFile::Open("galice.root");
81 TMap *cdbMapMC= (TMap*)fmc->Get("cdbMap"); //
82 TList *cdbListMC0= (TList*)fmc->Get("cdbList"); // this is list of TObjStrings
83 TList *cdbListMC = ConvertListStringToCDBId(cdbListMC0); // convert to the TObjArray of AliCDBids
84 //
85 TFile *fesd = TFile::Open("AliESDs.root");
86 TList *listESD = ((TTree*)fesd->Get("esdTree"))->GetUserInfo();
87 TMap *cdbMapESD= (TMap*)listESD->FindObject("cdbMap");
88 TList *cdbListESD0= (TList*)listESD->FindObject("cdbList"); // this is list of TObjStrings
89 TList *cdbListESD = ConvertListStringToCDBId(cdbListESD0); // convert to the TObjArray of AliCDBids
90 //
91 //
92 //
93 printf("\n\n");
94 printf("Diff log>>>ESD\n\n:");
95 MakeDiff(cdbMapLog, cdbListLog, cdbMapESD, cdbListESD,0);
96 printf("\n\n");
97 printf("Diff ESD>>>log\n\n:");
98 MakeDiff(cdbMapESD, cdbListESD,cdbMapLog, cdbListLog,0);
99 //
100 printf("\n\n");
101 printf("Diff ESD>>>MC\n\n:");
102 MakeDiff(cdbMapMC, cdbListMC, cdbMapESD, cdbListESD,0);
103}
104
105
3ab100e6 106void DumpOCDBAsTxt(const TString fInput,const TString fType){
107 TFile *file;
108 const TMap *cdbMap;
109 const TList *cdbList;
110
111
112 if(fType.EqualTo("MC",TString::kIgnoreCase)){
113 file = TFile::Open(fInput.Data());
114 cdbMap = (TMap*)file->Get("cdbMap"); //
115 TList *cdbListMC0 = (TList*)file->Get("cdbList"); // this is list of TObjStrings
116 cdbList = ConvertListStringToCDBId(cdbListMC0); // convert to the TObjArray of AliCDBids
117 }
118 else if(fType.EqualTo("ESD",TString::kIgnoreCase)){
119 file = TFile::Open(fInput.Data());
120 TList *listESD = ((TTree*)file->Get("esdTree"))->GetUserInfo();
121 cdbMap = (TMap*)listESD->FindObject("cdbMap");
122 TList *cdbListESD0= (TList*)listESD->FindObject("cdbList"); // this is list of TObjStrings
123 cdbList = ConvertListStringToCDBId(cdbListESD0); // convert to the TObjArray of AliCDBids
124 }
125 else if(fType.EqualTo("log",TString::kIgnoreCase)){
126 AliCDBManager * man = AliCDBManager::Instance();
127 LoadOCDBFromLog(fInput.Data(),0);
128 cdbMap = man->GetStorageMap(); // this is map of
129 cdbList =man->GetRetrievedIds(); // this is list of AliCDBId
130 }
131 else{
132 printf("unsupported option: %s",fType.Data());
133 return;
134 }
135 cout <<"BEGINDUMP:" << endl;
136 DumpOCDB(cdbMap,cdbList);
137}
4f76c2f2 138
139
140Bool_t ParseInfoFromOcdbString(TString ocdbString, TString &ocdbPath, Int_t &run0, Int_t &run1, Int_t &version, Int_t &subVersion){
141 //
142 // Parse OCDB id string and provide basic ocdb information
143 //
144 // a.) parse ocdbPath
145 Int_t indexBeginPath= ocdbString.Index("path: ")+7;
146 if (indexBeginPath<0) return kFALSE;
147 Int_t indexEndPath=ocdbString.Index(";",indexBeginPath);
148 if (indexEndPath<0) return kFALSE;
149 ocdbPath=TString(&(ocdbString.Data()[indexBeginPath]), indexEndPath-indexBeginPath-1);
150 // b.) parse runRange
151 Int_t indexRun0= ocdbString.Index(": [",indexEndPath)+3;
152 if (indexRun0<0) return kFALSE;
153 Int_t indexRun1= ocdbString.Index(",",indexRun0)+1;
154 if (indexRun1<0) return kFALSE;
155 run0=atoi(&(ocdbString.Data()[indexRun0]));
156 run1=atoi(&(ocdbString.Data()[indexRun1]));
157 AliCDBRunRange runRange(run0,run1);
158 //c.) parse version, subversion
159 Int_t indexVersion= ocdbString.Index("version: v",indexRun1)+10;
160 if (indexVersion<0) return kFALSE;
161 Int_t indexSubVersion= ocdbString.Index("_s",indexVersion)+2;
162 if (indexSubVersion<0) return kFALSE;
163 version=atoi(&(ocdbString.Data()[indexVersion]));
164 subVersion=atoi(&(ocdbString.Data()[indexSubVersion]));
165 return kTRUE;
166}
167
168Bool_t ParseInfoFromOcdbString(TString ocdbString, AliCDBId &cdbId){
169 //
170 // Parse OCDB id string and provide basic ocdb information and fillcdbID object
171 //
172 TString ocdbPath;
173 Int_t run0=0, run1=0;
174 Int_t version=0, subVersion=0;
175 Bool_t parseStatus = ParseInfoFromOcdbString(ocdbString, ocdbPath, run0,run1,version,subVersion);
176 if (parseStatus) {
177 AliCDBRunRange runRange(run0,run1);
178 cdbId=AliCDBId(ocdbPath.Data(),runRange,version,subVersion);
179 AliCDBId* id = AliCDBId::MakeFromString(ocdbString);
180 cdbId=*id;
181 delete id;
182 }
183 //
184 return parseStatus;
185}
186
187TList * ConvertListStringToCDBId(const TList *cdbList0){
188 //
189 // Convert input list of the TObjString to list to AliCDBid
190 //
191 Int_t entriesList0=cdbList0->GetEntries();
192 TList * array0 = new TList();
193 AliCDBId tmp0;
194 for (Int_t ientry0=0; ientry0<entriesList0; ientry0++){
195 if (cdbList0->At(ientry0)==0) continue;
196 Bool_t isId = cdbList0->At(ientry0)->IsA()->InheritsFrom("AliCDBId");
197 if (isId){
198 array0->AddLast(cdbList0->At(ientry0));
199 }else{
200 Bool_t isString = cdbList0->At(ientry0)->IsA()->InheritsFrom("TObjString");
201 if (isString){
202 TObjString* sid0 = dynamic_cast<TObjString*> (cdbList0->At(ientry0));
203 Bool_t status = ParseInfoFromOcdbString(sid0->String(), tmp0);
204 if (!status) continue;
205 array0->AddLast(new AliCDBId(tmp0));
206 }
207 }
208 }
209 return array0;
210}
211
212
213
214void LoadOCDBFromLog(const char *logName, Int_t verbose){
215 //
216 // Initilaize OCDB
217 // Load OCDB setting as specified in log
218 // Assuming fixed version of the log
219 // AliCDBManager is initilaized - ocdbMap and ID list can be exported
220 //
221
222 // Parsing/loading sequence:
223 // 0.) SetDefault storage *** Default Storage URI:
224 // 1.) SetSpecific storage *** Specific storage
225 // 2.) SetRunNumber Run number:
226 // 3.) Set used IDs
227 //
228 AliCDBManager * man = AliCDBManager::Instance();
229 //
230 // 0.) SetDefault storage *** Default Storage URI:
231 //
232 TString defaultOCDB = gSystem->GetFromPipe(TString::Format("cat %s| grep \"Storage URI:\"",logName).Data());
233 TObjArray *array = defaultOCDB.Tokenize("\"");
234 man->SetDefaultStorage(array->Last()->GetName());
235 delete array;
236 //
237 // 1.) SetSpecific storage *** Specific storage
238 //
239 TString specificStorage = gSystem->GetFromPipe(TString::Format("cat %s| grep \"Specific storage\"",logName).Data());
240 array = specificStorage.Tokenize("\"");
241 Int_t entries = array->GetEntries();
242 for (Int_t i=1; i<entries-2; i+=4){
243 // add protection here line shuld be in expected format
244 if (verbose&2>0) printf("%s\t%s\n",array->At(i)->GetName(),array->At(i+2)->GetName());
245 man->SetSpecificStorage(array->At(i)->GetName(),array->At(i+2)->GetName());
246 }
247 delete array;
248 //
249 // 2.) SetRunNumber Run number:
250 //
251 TString runLine = gSystem->GetFromPipe(TString::Format("cat %s| grep \"I-AliCDBManager::Print: Run number =\"",logName).Data());
252 array = runLine.Tokenize("=");
253 Int_t run = 0;
254 if (array->GetEntries()>1) run=atoi(array->At(1)->GetName());
255 delete array;
256 man->SetRun(run);
257 //
258 // 3.) Set used IDs
259 //
260 TString ids = gSystem->GetFromPipe(TString::Format("cat %s| grep I-AliCDB | grep path| grep range | grep version", logName).Data());
261 array= ids.Tokenize("\n");
262 entries = array->GetEntries();
263 //
264 for (Int_t i=0; i<entries; i++){
265 //
266 TString ocdbString = array->At(i)->GetName();
267 TString ocdbEntry;
268 TString ocdbPath;
269 Int_t run0=0, run1=0;
270 Int_t version=0, subVersion=0;
271 Bool_t parseStatus = ParseInfoFromOcdbString(ocdbString, ocdbPath, run0,run1,version,subVersion);
272 if (!parseStatus) continue;
273 AliCDBRunRange runRange(run0,run1);
274 //
275 if ((verbose&2)!=0) {
276 printf("%s/Run%d_%d_v%d_s%d.root\n",ocdbPath.Data(),run0,run1,version,subVersion);
277 }
278 try {
279 AliCDBEntry*entry= man->Get(ocdbPath.Data(),runRange,version,subVersion);
280 } catch(const exception &e){
281 cerr << "OCDB retrieval failed!" << endl;
282 cerr << "Detailes: " << e.what() << endl;
283 }
284 }
285 if ((verbose&1)!=0){
286 man->Print();
287 man->GetStorageMap()->Print();
288 man->GetRetrievedIds()->Print();
289 }
290}
291
292
293void LoadOCDBFromMap(TMap */*cdbMap*/, TList */*cdbList*/){
294 //
295 // Initilaize OCDB
296 // Load OCDB setting as specified in maps
297 // Or Do we have already implementation in AliCDBanager?
298}
299
300
301
302void MakeDiff(const TMap *cdbMap0, const TList *cdbList0, const TMap *cdbMap1, const TList *cdbList1, Int_t verbose){
303 //
304 //
305 // Print difference between the 2 ocdb maps
306 // Input:
307 // maps and list charactireizing OCDB setup
308 // Output:
309 // To be decided, currently it is the teinal output
310 //
311 Int_t entriesList0=cdbList0->GetEntries();
312 Int_t entriesList1=cdbList1->GetEntries();
313 //
314 for (Int_t ientry0=0; ientry0<entriesList0; ientry0++){
315 AliCDBId *id0 = dynamic_cast<AliCDBId*> (cdbList0->At(ientry0));
316 AliCDBId *id1=0;
317 for (Int_t ientry1=0; ientry1<entriesList1; ientry1++){
318 AliCDBId *cid1 = dynamic_cast<AliCDBId*> (cdbList1->At(ientry1));
319 //id0.Print();
320 //cid1.Print();
321 if (cid1->GetPath().Contains(id0->GetPath().Data())==0) continue;
322 id1=cid1;
323 }
324 if (!id1) {
325 printf("Missing entry\t");
326 id0->Print();
327 continue;
328 }
329 Bool_t isOK=kTRUE;
330 if (id0->GetFirstRun()!= id1->GetFirstRun() ||id0->GetLastRun()!= id1->GetLastRun()){
331 printf("Differrent run range\n");
332 id0->Print();
333 id1->Print();
334 }
335 if (id0->GetVersion()!= id1->GetVersion() ||id0->GetSubVersion()!= id1->GetSubVersion()){
336 printf("Differrent version\n");
337 id0->Print();
338 id1->Print();
339 }
340 }
341}
342
3ab100e6 343void DumpOCDB(const TMap *cdbMap0, const TList *cdbList0){
284c4af2 344 //
345 // Dump the OCDb configuatation as formated text file
346 // with following collumns
347 // cdb name prefix cdb path
348 // OCDB entries are sorted alphabetically
349 // e.g:
3ab100e6 350 // TPC/Calib/RecoParam /hera/alice/jwagner/software/aliroot/AliRoot_TPCdev/OCDB/ TPC/Calib/RecoParam/Run0_999999999_v0_s0.root $SIZE_AliCDBEntry_Object $HASH_AliCDBEntry_Object
351
352 AliCDBManager * man = AliCDBManager::Instance();
353 TIter next(cdbList0);
354 AliCDBId *CDBId;
355 TString cdbName;
356 TString cdbPath;
357 TObjString *ostr;
358 AliCDBEntry *cdbEntry;
359 UInt_t hash;
360 TMessage * file;
361 Int_t size;
362
363 while ((CDBId =(AliCDBId*) next())){
364 cdbName = CDBId->GetPath();
365 ostr = (TObjString*)cdbMap0->GetValue(cdbName.Data());
366 if(!ostr) ostr = (TObjString*)cdbMap0->GetValue("default");
367 cdbPath = ostr->GetString();
368 if(cdbPath.Contains("local://"))cdbPath=cdbPath(8,cdbPath.Length()).Data();
369
370 cdbEntry = (AliCDBEntry*) man->Get(*CDBId);
371 TObject *obj = cdbEntry->GetObject();
372 file = new TMessage(TBuffer::kWrite);
373 file->WriteObject(obj);
374 size = file->Length();
375 if(!obj){
376 printf("object %s empty!\n",cdbName.Data());
377 continue;
378 }
379 hash = TString::Hash(file->Buffer(),size);
380 printf("%s\t%s\t%s/Run%d_%d_v%d_s%d.root\t%d\t%u\n",
381 cdbName.Data(),
382 cdbPath.Data(),
383 cdbName.Data(),
384 CDBId->GetFirstRun(),
385 CDBId->GetLastRun(),
386 CDBId->GetVersion(),
387 CDBId->GetSubVersion(),
388 size,
389 hash
390 );
391 //if(!(CDBId->GetPathLevel(0)).Contains("TPC")) continue;
392 //cout << CDBId.ToString() << endl;
393
394 delete file;
395 }
284c4af2 396}