ROOT logo
// $Id$
// 
// @file run-compression.C
// @brief Define and run custom chains for the TPC data compression
// @author Matthias.Richter@ift.uib.no
//
// The macro can be used to either define chains to be run in the
// AliRoot reconstruction or to run a chain standalone. Some of the
// configurations can only be run embedded into AliRoot reconstruction
// in order to couple to the input.
// 1) AliRoot reconstruction examples, just use the macro in front of
//    the reconstruction macro, e.g.
// aliroot -b -q -l run-compression.C $ALICE_ROOT/HLT/exa/recraw-local.C'("raw.root", "local://OCDB", 0, 5, "HLT", "loglevel=0x7c chains=compressor-input-writer")'
// 
// 2) standalone chains can be used if all input files are available
// on disk and the configuration file for the publisher is existing
// aliroot -b -q -l run-compressor.C'(1, 2, 1, "writer", "compressor compressor-publisher", 167808, "local://OCDB")'
//
// Chains:
// 'hltout-cluster-writer' writes cluster blocks in binary format from HLTOUT for every event in directory
//              hltout-compressed-cluster and a publisher configuration
//              file hltout-compressed-cluster.txt 
//
// 'tpc-raw-writer' writes TPC raw DDL files per event in directory tpc-raw
//              and a publisher configuration file tpc-raw.txt
//
// 'compressor-input-writer' writes input to compression component (clusters
//              from HWCF and reconstructed tracks) to directory compressor-input
//              and publisher configuration file compressor-input.txt
//
// 'compressor' the compressor component is configured to write a
//              statistics file HLT.TPCDataCompression-histograms*.root
//              the command line arguments of the macro are passed to the compressor component
//              configuration in order to specify the compression algorithms
//
// 'huffmantrainer' huffman table trainer
//
// 'writer'     cluster monitor component, requires to define input, e.g
//              "compressor compressor-publisher"
//              "compressed-cluster-publisher"
//              "monitor-publisher"
//              "hltout-publisher"
//              "TPC-hwcfdata TPC-compression" (note: defined by AliHLTTPCAgent)
const int defaultMode=0;
const int defaultDeflaterMode=2;
const char* defaultMonitorInput="compressor compressor-publisher";
const char* defaultCDBUri="local://OCDB";
void run_compression(int mode=defaultMode, int deflaterMode=defaultDeflaterMode, int events=1,
		const char* chain=NULL,
		const char* monitorInput=defaultMonitorInput,
		int runno=-1,
		const char* cdbURI=defaultCDBUri)
{
  // setup the OCDB access
  // required to load the GRP entry in order to initialize the magnetic field
  if (runno>=0) {
    AliCDBManager::Instance()->SetDefaultStorage(cdbURI);
    AliCDBManager::Instance()->SetRun(runno);
    AliGRPManager grpman;
    grpman.ReadGRPEntry();
    grpman.SetMagField();
  }

  // init the HLT system
  AliHLTSystem* pHLT=AliHLTPluginBase::GetInstance();

  ///////////////////////////////////////////////////////////////////////////////////////////
  //
  // list of configurations
  //
  ///////////////////////////////////////////////////////////////////////////////////////////

  // handling of compressed cluster blocks from HLTOUT
  // 'hltout-cluster-writer' writes cluster blocks in binary format from HLTOUT for every event in directory hltout-compressed-cluster
  // and a publisher configuration file hltout-compressed-cluster.txt 
  // 'compressed-cluster-publisher' publishes according to list hltout-compressed-cluster.txt
  AliHLTConfiguration hltoutpublisher("hltout-publisher", "AliHLTOUTPublisher", "", "-datatype 'REMCLSCM' 'TPC '");
  AliHLTConfiguration hltoutclusterwriter("hltout-cluster-writer", "FileWriter", "hltout-publisher", "-directory hltout-compressed-cluster -subdir -specfmt=_0x%08x -blocknofmt= -publisher-conf hltout-compressed-cluster.txt");
  AliHLTConfiguration hltoutclusterpublisher("compressed-cluster-publisher", "FilePublisher", "", "-datafilelist hltout-compressed-cluster.txt");

  // processing of TPC raw data
  // 'tpc-raw-writer' writes TPC raw DDL files per event in directory tpc-raw and a publisher
  // configuration file tpc-raw.txt
  // 'compressor-input-writer' writes input to compression component (clusters from HWCF and reconstructed tracks)
  // the chains TPC-hwcfdata and TPC-globalmerger are executed to emulate clusters from raw data
  // and produce the track data binary block
  // to directory compressor-input and publisher configuration file compressor-input.txt
  // 'compressor-publisher' publishes files according to configuration file
  AliHLTConfiguration tpcrawwriter("tpc-raw-writer", "FileWriter","TPC-raw-data", "-directory tpc-raw -subdir -specfmt=_0x%08x -blocknofmt= -publisher-conf tpc-raw.txt");
  AliHLTConfiguration emulatorhwclust1writer("compressor-input-writer", "FileWriter","TPC-HWCFDecoder TPC-globalmerger", "-directory compressor-input -subdir -specfmt=_0x%08x -blocknofmt= -publisher-conf compressor-input.txt");
  AliHLTConfiguration compressorpublisher("compressor-publisher", "FilePublisher", "", "-datafilelist compressor-input.txt");

  // compressor configuration
  // input from file list created by 'compressor-input-writer'
  TString compressorArgument;
  if (mode>0) compressorArgument+=Form(" -mode %d", mode); // take default from configuration object if mode==0
  if (deflaterMode>0)   compressorArgument+=Form(" -deflater-mode %d", deflaterMode);  // take default from configuration object if deflaterMode==0
  compressorArgument+=Form(" -histogram-file HLT.TPCDataCompression-histograms-mode%d-%s.root -cluster-verification 0", mode, (deflaterMode==2?"huffman":"simple"));
  AliHLTConfiguration compressor("compressor", "TPCDataCompressor", "compressor-publisher",  compressorArgument.Data());

  // huffman trainer configuration
  // input from file list created by 'compressor-input-writer'
  TString trainerArgument;
  trainerArgument.Form("-deflater-mode 3 -mode %d", mode);
  AliHLTConfiguration trainer("huffmantrainer", "TPCDataCompressor", "compressor-publisher", trainerArgument.Data());

  // writer component for the compressor output
  AliHLTConfiguration compressoroutputwriter("compressor-output-writer", "FileWriter","compressor", "-directory compressor-output -subdir -specfmt=_0x%08x -blocknofmt= -publisher-conf compressor-output.txt");
  AliHLTConfiguration compressoroutputpublisher("compressor-data", "FilePublisher","", "-datafilelist compressor-output.txt");

  // specifc configuration to publish some data blocks for the
  // monitoring component
  AliHLTConfiguration monitorpublisher("monitor-publisher", "FilePublisher", "", "-datafilelist monitor-input.txt");

  // the monitoring ccomponent setup
  TString writerArguments(Form("-concatenate-events -overwrite -datafile HLT.TPCcluster-compression-mode%d-histograms.root",mode));
  AliHLTConfiguration monitor("monitor", "TPCDataCompressorMonitor", monitorInput, "");
  AliHLTConfiguration writer("writer", "ROOTFileWriter", "monitor", writerArguments);

  if (chain) {
    pHLT->ScanOptions("loglevel=0x7c");
    //pHLT->ScanOptions("loglevel=0x7f frameworklog=0x7f");
    pHLT->BuildTaskList(chain);
    pHLT->Run(events);
  }
}

// an abbreviated version setting default deflaterMode to 2
void run_compression(int mode, int events,
		const char* chain,
		const char* monitorInput=defaultMonitorInput,
		int runno=-1,
		const char* cdbURI=defaultCDBUri)
{
  run_compression(mode, defaultDeflaterMode, events, chain, monitorInput, runno, cdbURI);
}

// an abbreviated version setting default deflaterMode to 2 and
// omitting monitorInput
// example:
//  aliroot -b -q -l run-compression.C'(1, 5, "compressor", 167808)'
void run_compression(int mode, int events,
		const char* chain,
		int runno,
		const char* cdbURI=defaultCDBUri)
{
  run_compression(mode, defaultDeflaterMode, events, chain, defaultMonitorInput, runno, cdbURI);
}

// an abbreviated version omitting monitorInput
// example:
//  aliroot -b -q -l run-compression.C'(1, 2, 5, "compressor", 167808)'
void run_compression(int mode, int deflaterMode, int events,
		const char* chain,
		int runno,
		const char* cdbURI=defaultCDBUri)
{
  run_compression(mode, deflaterMode, events, chain, defaultMonitorInput, runno, cdbURI);
}
 run-compression.C:1
 run-compression.C:2
 run-compression.C:3
 run-compression.C:4
 run-compression.C:5
 run-compression.C:6
 run-compression.C:7
 run-compression.C:8
 run-compression.C:9
 run-compression.C:10
 run-compression.C:11
 run-compression.C:12
 run-compression.C:13
 run-compression.C:14
 run-compression.C:15
 run-compression.C:16
 run-compression.C:17
 run-compression.C:18
 run-compression.C:19
 run-compression.C:20
 run-compression.C:21
 run-compression.C:22
 run-compression.C:23
 run-compression.C:24
 run-compression.C:25
 run-compression.C:26
 run-compression.C:27
 run-compression.C:28
 run-compression.C:29
 run-compression.C:30
 run-compression.C:31
 run-compression.C:32
 run-compression.C:33
 run-compression.C:34
 run-compression.C:35
 run-compression.C:36
 run-compression.C:37
 run-compression.C:38
 run-compression.C:39
 run-compression.C:40
 run-compression.C:41
 run-compression.C:42
 run-compression.C:43
 run-compression.C:44
 run-compression.C:45
 run-compression.C:46
 run-compression.C:47
 run-compression.C:48
 run-compression.C:49
 run-compression.C:50
 run-compression.C:51
 run-compression.C:52
 run-compression.C:53
 run-compression.C:54
 run-compression.C:55
 run-compression.C:56
 run-compression.C:57
 run-compression.C:58
 run-compression.C:59
 run-compression.C:60
 run-compression.C:61
 run-compression.C:62
 run-compression.C:63
 run-compression.C:64
 run-compression.C:65
 run-compression.C:66
 run-compression.C:67
 run-compression.C:68
 run-compression.C:69
 run-compression.C:70
 run-compression.C:71
 run-compression.C:72
 run-compression.C:73
 run-compression.C:74
 run-compression.C:75
 run-compression.C:76
 run-compression.C:77
 run-compression.C:78
 run-compression.C:79
 run-compression.C:80
 run-compression.C:81
 run-compression.C:82
 run-compression.C:83
 run-compression.C:84
 run-compression.C:85
 run-compression.C:86
 run-compression.C:87
 run-compression.C:88
 run-compression.C:89
 run-compression.C:90
 run-compression.C:91
 run-compression.C:92
 run-compression.C:93
 run-compression.C:94
 run-compression.C:95
 run-compression.C:96
 run-compression.C:97
 run-compression.C:98
 run-compression.C:99
 run-compression.C:100
 run-compression.C:101
 run-compression.C:102
 run-compression.C:103
 run-compression.C:104
 run-compression.C:105
 run-compression.C:106
 run-compression.C:107
 run-compression.C:108
 run-compression.C:109
 run-compression.C:110
 run-compression.C:111
 run-compression.C:112
 run-compression.C:113
 run-compression.C:114
 run-compression.C:115
 run-compression.C:116
 run-compression.C:117
 run-compression.C:118
 run-compression.C:119
 run-compression.C:120
 run-compression.C:121
 run-compression.C:122
 run-compression.C:123
 run-compression.C:124
 run-compression.C:125
 run-compression.C:126
 run-compression.C:127
 run-compression.C:128
 run-compression.C:129
 run-compression.C:130
 run-compression.C:131
 run-compression.C:132
 run-compression.C:133
 run-compression.C:134
 run-compression.C:135
 run-compression.C:136
 run-compression.C:137
 run-compression.C:138
 run-compression.C:139
 run-compression.C:140
 run-compression.C:141
 run-compression.C:142
 run-compression.C:143
 run-compression.C:144
 run-compression.C:145
 run-compression.C:146
 run-compression.C:147
 run-compression.C:148
 run-compression.C:149
 run-compression.C:150
 run-compression.C:151
 run-compression.C:152
 run-compression.C:153
 run-compression.C:154
 run-compression.C:155
 run-compression.C:156
 run-compression.C:157
 run-compression.C:158
 run-compression.C:159
 run-compression.C:160