ROOT logo
// $Id$
/**
 * @file extract-ddlraw.C
 * @brief Tool to extract DDL raw data.
 *
 * Usage:
 * <pre>
 *   aliroot -b -q 'extract-ddlraw.C("raw.root", 768, 769)' | tee extract-ddlraw.log
 * </pre>
 *
 * This macro is an example for the AliHLTRawReaderPublisherComponent.
 * It extracts the DDL payload from an AliRawReader in a given equipment
 * range. Input can be either a root file or the path to the directory
 * containing the 'rawx' sub folders.
 *
 * A light-weight AliReconstruction-like setup creates the appropriate
 * RawReader for the specified input and uses the standard AliHLTReconstructor
 * to run a small HLT chain. The chain utilizes the AliRawReaderPublisher
 * to extract the payload of the equipments and writes this to files.
 *
 * @note In this example the AliHLTRawReaderPublisherComponent does not set any data
 * type nor specification for the published data blocks. Please remember
 * to provide appropriate arguments via '-datatype' and '-dataspec'
 * arguments (see AliHLTRawReaderPublisherComponent).
 *
 * @author Matthias.Richter@ift.uib.no
 * @ingroup alihlt_tutorial
 */
void extract_ddlraw(const char* input, int iMinDDLno, int iMaxDDLno, int nofEvents=-1)
{
  /////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////
  //
  // some defaults
  const char* baseName="RAW.ddl";

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

  TString strfile=input;
  if (strfile.Contains("://") && !strfile.Contains("local://")) {
    TGrid::Connect("alien");
  }

  AliRawReader* pRawReader=AliRawReader::Create(input);
  if (!pRawReader) {
    cout << "can not open RawReader for file " << input << endl;
    return;
  }

  if (!pRawReader->NextEvent()) {
    cerr << "no events available" << endl;
    return;
  }

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

  /////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////
  //
  // the configuration chain
  // we show two possible configurations:
  //  1. having one publisher for each ddl, the configurations are created
  //     in a loop
  //  2. all in one publisher
  // can be easily switched with the following
  bool bAllInOne=true;

  TString writerInput;
  TString arg;

  if (!bAllInOne) {
    // create one publisher for each ddl
    for (int ddlno=iMinDDLno; ddlno<=iMaxDDLno; ddlno++) {
      TString arg, publisher;

      // raw data publisher components
      arg.Form("-minid %d -skipempty -verbose", ddlno);
      publisher.Form("DP_%d", ddlno);
      // see AliHLTRawReaderPublisherComponent
      AliHLTConfiguration pubconf(publisher.Data(), "AliRawReaderPublisher", NULL , arg.Data());

      if (!writerInput.IsNull()) writerInput+=" ";
      writerInput+=publisher;
    }
  } else {
    // publish all ddls by the same component, this is much more
    // effective as it avoids repeated parsing through the data
    arg.Form("-minid %d -maxid %d -skipempty -verbose", iMinDDLno, iMaxDDLno);
    // see AliHLTRawReaderPublisherComponent
    AliHLTConfiguration pubconf("publisher", "AliRawReaderPublisher", NULL , arg.Data());
    if (!writerInput.IsNull()) writerInput+=" ";
    writerInput+="publisher";
  }

  // the writer configuration is the same for both
  arg.Form("-specfmt=_%%d -subdir=raw%%d -blcknofmt= -idfmt= -datafile %s", baseName);
  // see AliHLTFileWriter
  AliHLTConfiguration fwconf("sink1", "FileWriter"   , writerInput.Data(), 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;
  }

  // this is just a dummy ESD to provide valid parameters to the
  // reconstructor
  AliESDEvent* pESD = new AliESDEvent;
  pESD->CreateStdContent();

  /////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////
  //
  // 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++;
  }

  delete pESD;
}

void extract_ddlraw()
{
  cerr << "===============================================================" << endl;
  cerr << "usage: aliroot -b -q 'extract-ddlraw.C(\"raw.root\", 768, 769)'" << endl << endl;
  cerr << "please provide input, min and max equipment id" << endl;
  cerr << "===============================================================" << endl;
}
 extract-ddlraw.C:1
 extract-ddlraw.C:2
 extract-ddlraw.C:3
 extract-ddlraw.C:4
 extract-ddlraw.C:5
 extract-ddlraw.C:6
 extract-ddlraw.C:7
 extract-ddlraw.C:8
 extract-ddlraw.C:9
 extract-ddlraw.C:10
 extract-ddlraw.C:11
 extract-ddlraw.C:12
 extract-ddlraw.C:13
 extract-ddlraw.C:14
 extract-ddlraw.C:15
 extract-ddlraw.C:16
 extract-ddlraw.C:17
 extract-ddlraw.C:18
 extract-ddlraw.C:19
 extract-ddlraw.C:20
 extract-ddlraw.C:21
 extract-ddlraw.C:22
 extract-ddlraw.C:23
 extract-ddlraw.C:24
 extract-ddlraw.C:25
 extract-ddlraw.C:26
 extract-ddlraw.C:27
 extract-ddlraw.C:28
 extract-ddlraw.C:29
 extract-ddlraw.C:30
 extract-ddlraw.C:31
 extract-ddlraw.C:32
 extract-ddlraw.C:33
 extract-ddlraw.C:34
 extract-ddlraw.C:35
 extract-ddlraw.C:36
 extract-ddlraw.C:37
 extract-ddlraw.C:38
 extract-ddlraw.C:39
 extract-ddlraw.C:40
 extract-ddlraw.C:41
 extract-ddlraw.C:42
 extract-ddlraw.C:43
 extract-ddlraw.C:44
 extract-ddlraw.C:45
 extract-ddlraw.C:46
 extract-ddlraw.C:47
 extract-ddlraw.C:48
 extract-ddlraw.C:49
 extract-ddlraw.C:50
 extract-ddlraw.C:51
 extract-ddlraw.C:52
 extract-ddlraw.C:53
 extract-ddlraw.C:54
 extract-ddlraw.C:55
 extract-ddlraw.C:56
 extract-ddlraw.C:57
 extract-ddlraw.C:58
 extract-ddlraw.C:59
 extract-ddlraw.C:60
 extract-ddlraw.C:61
 extract-ddlraw.C:62
 extract-ddlraw.C:63
 extract-ddlraw.C:64
 extract-ddlraw.C:65
 extract-ddlraw.C:66
 extract-ddlraw.C:67
 extract-ddlraw.C:68
 extract-ddlraw.C:69
 extract-ddlraw.C:70
 extract-ddlraw.C:71
 extract-ddlraw.C:72
 extract-ddlraw.C:73
 extract-ddlraw.C:74
 extract-ddlraw.C:75
 extract-ddlraw.C:76
 extract-ddlraw.C:77
 extract-ddlraw.C:78
 extract-ddlraw.C:79
 extract-ddlraw.C:80
 extract-ddlraw.C:81
 extract-ddlraw.C:82
 extract-ddlraw.C:83
 extract-ddlraw.C:84
 extract-ddlraw.C:85
 extract-ddlraw.C:86
 extract-ddlraw.C:87
 extract-ddlraw.C:88
 extract-ddlraw.C:89
 extract-ddlraw.C:90
 extract-ddlraw.C:91
 extract-ddlraw.C:92
 extract-ddlraw.C:93
 extract-ddlraw.C:94
 extract-ddlraw.C:95
 extract-ddlraw.C:96
 extract-ddlraw.C:97
 extract-ddlraw.C:98
 extract-ddlraw.C:99
 extract-ddlraw.C:100
 extract-ddlraw.C:101
 extract-ddlraw.C:102
 extract-ddlraw.C:103
 extract-ddlraw.C:104
 extract-ddlraw.C:105
 extract-ddlraw.C:106
 extract-ddlraw.C:107
 extract-ddlraw.C:108
 extract-ddlraw.C:109
 extract-ddlraw.C:110
 extract-ddlraw.C:111
 extract-ddlraw.C:112
 extract-ddlraw.C:113
 extract-ddlraw.C:114
 extract-ddlraw.C:115
 extract-ddlraw.C:116
 extract-ddlraw.C:117
 extract-ddlraw.C:118
 extract-ddlraw.C:119
 extract-ddlraw.C:120
 extract-ddlraw.C:121
 extract-ddlraw.C:122
 extract-ddlraw.C:123
 extract-ddlraw.C:124
 extract-ddlraw.C:125
 extract-ddlraw.C:126
 extract-ddlraw.C:127
 extract-ddlraw.C:128
 extract-ddlraw.C:129
 extract-ddlraw.C:130
 extract-ddlraw.C:131
 extract-ddlraw.C:132
 extract-ddlraw.C:133
 extract-ddlraw.C:134
 extract-ddlraw.C:135
 extract-ddlraw.C:136
 extract-ddlraw.C:137
 extract-ddlraw.C:138
 extract-ddlraw.C:139
 extract-ddlraw.C:140
 extract-ddlraw.C:141
 extract-ddlraw.C:142
 extract-ddlraw.C:143
 extract-ddlraw.C:144
 extract-ddlraw.C:145
 extract-ddlraw.C:146
 extract-ddlraw.C:147
 extract-ddlraw.C:148
 extract-ddlraw.C:149
 extract-ddlraw.C:150
 extract-ddlraw.C:151
 extract-ddlraw.C:152
 extract-ddlraw.C:153
 extract-ddlraw.C:154
 extract-ddlraw.C:155
 extract-ddlraw.C:156
 extract-ddlraw.C:157
 extract-ddlraw.C:158
 extract-ddlraw.C:159