ROOT logo
// $Id$
/**
 * @file AddCalibStreamerInfo.C
 * @brief Extraction of data blocks from HLTOUT
 *
 * <pre>
 * Usage: aliroot -b -q AddCalibStreamerInfo.C'(classname, uri, version, firstRun, lastRun)'
 *     classname    name of the class to add the streamer info
 *     uri          optional URI of the OCDB, default local://$ALICE_ROOT/OCDB
 *     version      version number of the entry (optional)
 *     firstRun     first run (optional)
 *     lastRun      last run (optional)    
 * </pre>
 *
 * The macro checks whether the streamer info of the current version
 * of the class 'classname' is available in the
 * HLT/Calib/StreamerInfo entry, and adds it if not.
 * 
 * Streamer infos are needed in order to extract TObjects from the HLT raw data
 * payload.
 *
 * @author Matthias.Richter@ift.uib.no
 * @ingroup alihlt_rec
 */
void AddCalibStreamerInfo(
			  const char* className,
			  const char* cdbPath = "local://$ALICE_ROOT/OCDB",
			  Int_t version = 0,
			  Int_t firstRun = 0,
			  Int_t lastRun = AliCDBRunRange::Infinity()
			  )
{
  const char* gkCalibStreamerInfoEntry="HLT/Calib/StreamerInfo";

  // Setup the CDB default storage and run number.
  AliCDBManager* cdbManager = AliCDBManager::Instance();
  if (cdbManager == NULL) {
    cerr << "ERROR: Global CDB manager object does not exist." << endl;
    return;
  }
  AliCDBStorage* storage = cdbManager->GetStorage(cdbPath);
  if (storage == NULL) {
    cerr << "ERROR: Could not get storage for: " << cdbPath << endl;
    return;
  }

  TClass* pClass=TClass::GetClass(className);
  if (!pClass) {
    cerr << "ERROR: Can not find TClass object: " << className << endl;
    return;
  }
  Int_t classVersion=pClass->GetClassVersion();

  TObjArray* pInfos=NULL;
  AliCDBRunRange runRange(firstRun, lastRun);
  AliCDBEntry* pExistingEntry=storage->Get(gkCalibStreamerInfoEntry, runRange);
  if (pExistingEntry) pInfos=(TObjArray*)pExistingEntry->GetObject();
  else pInfos=new TObjArray;

  TStreamerInfo* pInfo=NULL;
  for (int i=0; i<pInfos->GetEntriesFast(); i++) {
    if (pInfos->At(i)==NULL) continue;

    if (pInfos->At(i)->IsA()!=TStreamerInfo::Class()) {
      cout << "skipping object " << pInfos->At(i)->GetName() << " class " << pInfos->At(i)->Class()->GetName() << endl;
      continue;
    }

    pInfo=(TStreamerInfo*)pInfos->At(i);
    TString infoname=pInfo->GetName();
    if (infoname.CompareTo(className)!=0) continue;

    if (pInfo->GetClassVersion()==classVersion) {
      cout << "nothing to be done, class " << className << " version " << classVersion << " already in the object" << endl;
      return;
    }
  }
  pInfo=new TStreamerInfo(pClass);
  pInfo->Build();
  pInfos->AddAtFree(pInfo);
  
  ///////////////////////////////////////////////////////////////////////////////////////////	
  // Write the updated object to OCDB
  AliCDBId id(gkCalibStreamerInfoEntry, firstRun, lastRun, version);
  AliCDBMetaData* metaData = new AliCDBMetaData();
  metaData->SetResponsible("HLT");
  metaData->SetComment("Streamer info for streamed objects in the HLT raw data payload.");
  storage->Put(pInfos, id, metaData);
}
 AddCalibStreamerInfo.C:1
 AddCalibStreamerInfo.C:2
 AddCalibStreamerInfo.C:3
 AddCalibStreamerInfo.C:4
 AddCalibStreamerInfo.C:5
 AddCalibStreamerInfo.C:6
 AddCalibStreamerInfo.C:7
 AddCalibStreamerInfo.C:8
 AddCalibStreamerInfo.C:9
 AddCalibStreamerInfo.C:10
 AddCalibStreamerInfo.C:11
 AddCalibStreamerInfo.C:12
 AddCalibStreamerInfo.C:13
 AddCalibStreamerInfo.C:14
 AddCalibStreamerInfo.C:15
 AddCalibStreamerInfo.C:16
 AddCalibStreamerInfo.C:17
 AddCalibStreamerInfo.C:18
 AddCalibStreamerInfo.C:19
 AddCalibStreamerInfo.C:20
 AddCalibStreamerInfo.C:21
 AddCalibStreamerInfo.C:22
 AddCalibStreamerInfo.C:23
 AddCalibStreamerInfo.C:24
 AddCalibStreamerInfo.C:25
 AddCalibStreamerInfo.C:26
 AddCalibStreamerInfo.C:27
 AddCalibStreamerInfo.C:28
 AddCalibStreamerInfo.C:29
 AddCalibStreamerInfo.C:30
 AddCalibStreamerInfo.C:31
 AddCalibStreamerInfo.C:32
 AddCalibStreamerInfo.C:33
 AddCalibStreamerInfo.C:34
 AddCalibStreamerInfo.C:35
 AddCalibStreamerInfo.C:36
 AddCalibStreamerInfo.C:37
 AddCalibStreamerInfo.C:38
 AddCalibStreamerInfo.C:39
 AddCalibStreamerInfo.C:40
 AddCalibStreamerInfo.C:41
 AddCalibStreamerInfo.C:42
 AddCalibStreamerInfo.C:43
 AddCalibStreamerInfo.C:44
 AddCalibStreamerInfo.C:45
 AddCalibStreamerInfo.C:46
 AddCalibStreamerInfo.C:47
 AddCalibStreamerInfo.C:48
 AddCalibStreamerInfo.C:49
 AddCalibStreamerInfo.C:50
 AddCalibStreamerInfo.C:51
 AddCalibStreamerInfo.C:52
 AddCalibStreamerInfo.C:53
 AddCalibStreamerInfo.C:54
 AddCalibStreamerInfo.C:55
 AddCalibStreamerInfo.C:56
 AddCalibStreamerInfo.C:57
 AddCalibStreamerInfo.C:58
 AddCalibStreamerInfo.C:59
 AddCalibStreamerInfo.C:60
 AddCalibStreamerInfo.C:61
 AddCalibStreamerInfo.C:62
 AddCalibStreamerInfo.C:63
 AddCalibStreamerInfo.C:64
 AddCalibStreamerInfo.C:65
 AddCalibStreamerInfo.C:66
 AddCalibStreamerInfo.C:67
 AddCalibStreamerInfo.C:68
 AddCalibStreamerInfo.C:69
 AddCalibStreamerInfo.C:70
 AddCalibStreamerInfo.C:71
 AddCalibStreamerInfo.C:72
 AddCalibStreamerInfo.C:73
 AddCalibStreamerInfo.C:74
 AddCalibStreamerInfo.C:75
 AddCalibStreamerInfo.C:76
 AddCalibStreamerInfo.C:77
 AddCalibStreamerInfo.C:78
 AddCalibStreamerInfo.C:79
 AddCalibStreamerInfo.C:80
 AddCalibStreamerInfo.C:81
 AddCalibStreamerInfo.C:82
 AddCalibStreamerInfo.C:83
 AddCalibStreamerInfo.C:84
 AddCalibStreamerInfo.C:85
 AddCalibStreamerInfo.C:86
 AddCalibStreamerInfo.C:87
 AddCalibStreamerInfo.C:88
 AddCalibStreamerInfo.C:89
 AddCalibStreamerInfo.C:90