added AliFlatExternalTrackParam to HLT global library
[u/mrichter/AliRoot.git] / HLT / rec / AddCalibStreamerInfo.C
1 // $Id$
2 /**
3  * @file AddCalibStreamerInfo.C
4  * @brief Extraction of data blocks from HLTOUT
5  *
6  * <pre>
7  * Usage: aliroot -b -q AddCalibStreamerInfo.C'(classname, uri, version, firstRun, lastRun)'
8  *     classname    name of the class to add the streamer info
9  *     uri          optional URI of the OCDB, default local://$ALICE_ROOT/OCDB
10  *     version      version number of the entry (optional)
11  *     firstRun     first run (optional)
12  *     lastRun      last run (optional)    
13  * </pre>
14  *
15  * The macro checks whether the streamer info of the current version
16  * of the class 'classname' is available in the
17  * HLT/Calib/StreamerInfo entry, and adds it if not.
18  * 
19  * Streamer infos are needed in order to extract TObjects from the HLT raw data
20  * payload.
21  *
22  * @author Matthias.Richter@ift.uib.no
23  * @ingroup alihlt_rec
24  */
25 void AddCalibStreamerInfo(
26                           const char* className,
27                           const char* cdbPath = "local://$ALICE_ROOT/OCDB",
28                           Int_t version = 0,
29                           Int_t firstRun = 0,
30                           Int_t lastRun = AliCDBRunRange::Infinity()
31                           )
32 {
33   const char* gkCalibStreamerInfoEntry="HLT/Calib/StreamerInfo";
34
35   // Setup the CDB default storage and run number.
36   AliCDBManager* cdbManager = AliCDBManager::Instance();
37   if (cdbManager == NULL) {
38     cerr << "ERROR: Global CDB manager object does not exist." << endl;
39     return;
40   }
41   AliCDBStorage* storage = cdbManager->GetStorage(cdbPath);
42   if (storage == NULL) {
43     cerr << "ERROR: Could not get storage for: " << cdbPath << endl;
44     return;
45   }
46
47   TClass* pClass=TClass::GetClass(className);
48   if (!pClass) {
49     cerr << "ERROR: Can not find TClass object: " << className << endl;
50     return;
51   }
52   Int_t classVersion=pClass->GetClassVersion();
53
54   TObjArray* pInfos=NULL;
55   AliCDBRunRange runRange(firstRun, lastRun);
56   AliCDBEntry* pExistingEntry=storage->Get(gkCalibStreamerInfoEntry, runRange);
57   if (pExistingEntry) pInfos=(TObjArray*)pExistingEntry->GetObject();
58   else pInfos=new TObjArray;
59
60   TStreamerInfo* pInfo=NULL;
61   for (int i=0; i<pInfos->GetEntriesFast(); i++) {
62     if (pInfos->At(i)==NULL) continue;
63
64     if (pInfos->At(i)->IsA()!=TStreamerInfo::Class()) {
65       cout << "skipping object " << pInfos->At(i)->GetName() << " class " << pInfos->At(i)->Class()->GetName() << endl;
66       continue;
67     }
68
69     pInfo=(TStreamerInfo*)pInfos->At(i);
70     TString infoname=pInfo->GetName();
71     if (infoname.CompareTo(className)!=0) continue;
72
73     if (pInfo->GetClassVersion()==classVersion) {
74       cout << "nothing to be done, class " << className << " version " << classVersion << " already in the object" << endl;
75       return;
76     }
77   }
78   pInfo=new TStreamerInfo(pClass);
79   pInfo->Build();
80   pInfos->AddAtFree(pInfo);
81   
82   ///////////////////////////////////////////////////////////////////////////////////////////   
83   // Write the updated object to OCDB
84   AliCDBId id(gkCalibStreamerInfoEntry, firstRun, lastRun, version);
85   AliCDBMetaData* metaData = new AliCDBMetaData();
86   metaData->SetResponsible("HLT");
87   metaData->SetComment("Streamer info for streamed objects in the HLT raw data payload.");
88   storage->Put(pInfos, id, metaData);
89 }