ROOT logo
// $Id$
/**
 * @file extract-ESD.C
 * @brief Tool to extract the HLT ESD from the raw data.
 *
 * Usage:
 * <pre>
 *   aliroot -b -q 'extract-ESD.C("raw.root", cdb, nOfEvents)' | tee extract-ESD.log
 *   aliroot -b -q 'extract-ESD.C("alien:///alice/data/2010/.../.root", "raw://", nOfEvents)' | tee extract-ESD.log
 * </pre>
 *
 * This macro only needs the HLT/Calib/StreamerInfo object to extract the HLT ESD from raw data.
 * However, it is extremely slow, it even gets slower during running. It should be used as an
 * emergency solution. HLT/exa/recraw-local.C is the proper and fast way to extract HLT data. 
 *
 * @author Kalliopi.Kanaki@ift.uib.no
 * @ingroup alihlt_tutorial
 */
void extract_ESD(const char* input, const char *cdbURI, int nofEvents=-1){

  // setup of the RawReader
  if(!input){
    cerr << "invalid path" << endl;
    cerr << "usage: aliroot -b -q extract-ESD.C'(\"raw.root\", \"cdb\", nOfEvents)'" << endl;
    return;
  }

  TString strfile = input;
  TString struri  = cdbURI;
  
  if(strfile.Contains("://") && !strfile.Contains("local://")) TGrid::Connect("alien");
  
  // Set the CDB storage location
  AliCDBManager *man = AliCDBManager::Instance();
  man->SetDefaultStorage(cdbURI);
 
  AliRawReader *pRawReader = AliRawReader::Create(input);
  if(!pRawReader){
     cout << "cannot open RawReader for file " << input << endl;
     return;
  }
  
  if (!pRawReader->NextEvent()){
    cerr << "no events available" << endl;
    return;
  }
  
  if(!struri.BeginsWith("raw://")) man->SetRun(pRawReader->GetRunNumber());

  // setup of the HLT system
  AliHLTSystem *pHLT = AliHLTPluginBase::GetInstance();
  if(!pHLT) cerr << "fatal error: cannot get HLT instance" << endl;

  TString arg;
  arg.Form("-typeid ALIESDV0");
  AliHLTConfiguration publisher("hltout-publisher", "AliHLTOUTPublisher" , NULL, arg.Data());

  arg.Form("-treename HLTesdTree");
  AliHLTConfiguration collector("sink1","EsdCollector","hltout-publisher", arg.Data());

  // the reconstructor setup
  AliHLTReconstructor hltRec;
  hltRec.SetOption("libAliHLTUtil.so loglevel=0x7c chains=sink1 ignore-hltout ignore-ctp");
  if (hltRec.Init()<0) {
    cerr << "initialization of reconstructor failed" << endl;
    return;
  }

  // the reconstruction loop
  Int_t event=0;
  UChar_t* pData=NULL;
  pRawReader->RewindEvents();
  while(pRawReader->NextEvent() && (nofEvents<0 || event<nofEvents)){
    cout << "=======================================================" << endl;
    cout << "event " << event << endl;
    cout << "-------------------------------------------------------" << endl;
    pRawReader->Reset();
    hltRec.Reconstruct(pRawReader, NULL);
    event++;
  }
}

void extract_ESD(const char* input, int nofEvents=-1){
  extract_ESD(input, "raw://", nofEvents);
}

void extract_ESD(){
  cerr << "===============================================================" << endl;
  cerr << "usage: aliroot -b -q extract-ESD.C'(\"raw.root\", \"cdb\", nOfEvents)'"<< endl;
  cerr <<"       aliroot -b -q extract-ESD.C'(\"alien:///alice/data/2010/LHC10../../.root\", \"raw://\", nOfEvents)'"<< endl;
  cerr << "===============================================================" << endl;
}
 extract-ESD.C:1
 extract-ESD.C:2
 extract-ESD.C:3
 extract-ESD.C:4
 extract-ESD.C:5
 extract-ESD.C:6
 extract-ESD.C:7
 extract-ESD.C:8
 extract-ESD.C:9
 extract-ESD.C:10
 extract-ESD.C:11
 extract-ESD.C:12
 extract-ESD.C:13
 extract-ESD.C:14
 extract-ESD.C:15
 extract-ESD.C:16
 extract-ESD.C:17
 extract-ESD.C:18
 extract-ESD.C:19
 extract-ESD.C:20
 extract-ESD.C:21
 extract-ESD.C:22
 extract-ESD.C:23
 extract-ESD.C:24
 extract-ESD.C:25
 extract-ESD.C:26
 extract-ESD.C:27
 extract-ESD.C:28
 extract-ESD.C:29
 extract-ESD.C:30
 extract-ESD.C:31
 extract-ESD.C:32
 extract-ESD.C:33
 extract-ESD.C:34
 extract-ESD.C:35
 extract-ESD.C:36
 extract-ESD.C:37
 extract-ESD.C:38
 extract-ESD.C:39
 extract-ESD.C:40
 extract-ESD.C:41
 extract-ESD.C:42
 extract-ESD.C:43
 extract-ESD.C:44
 extract-ESD.C:45
 extract-ESD.C:46
 extract-ESD.C:47
 extract-ESD.C:48
 extract-ESD.C:49
 extract-ESD.C:50
 extract-ESD.C:51
 extract-ESD.C:52
 extract-ESD.C:53
 extract-ESD.C:54
 extract-ESD.C:55
 extract-ESD.C:56
 extract-ESD.C:57
 extract-ESD.C:58
 extract-ESD.C:59
 extract-ESD.C:60
 extract-ESD.C:61
 extract-ESD.C:62
 extract-ESD.C:63
 extract-ESD.C:64
 extract-ESD.C:65
 extract-ESD.C:66
 extract-ESD.C:67
 extract-ESD.C:68
 extract-ESD.C:69
 extract-ESD.C:70
 extract-ESD.C:71
 extract-ESD.C:72
 extract-ESD.C:73
 extract-ESD.C:74
 extract-ESD.C:75
 extract-ESD.C:76
 extract-ESD.C:77
 extract-ESD.C:78
 extract-ESD.C:79
 extract-ESD.C:80
 extract-ESD.C:81
 extract-ESD.C:82
 extract-ESD.C:83
 extract-ESD.C:84
 extract-ESD.C:85
 extract-ESD.C:86
 extract-ESD.C:87
 extract-ESD.C:88
 extract-ESD.C:89
 extract-ESD.C:90
 extract-ESD.C:91
 extract-ESD.C:92
 extract-ESD.C:93