ROOT logo
// $Id$

//**************************************************************************
//* This file is property of and copyright by the ALICE HLT Project        *
//* ALICE Experiment at CERN, All rights reserved.                         *
//*                                                                        *
//* Primary Authors:                                                       *
//*                  for The ALICE HLT Project.                            *
//*                                                                        *
//* Permission to use, copy, modify and distribute this software and its   *
//* documentation strictly for non-commercial purposes is hereby granted   *
//* without fee, provided that the above copyright notice appears in all   *
//* copies and that both the copyright notice and this permission notice   *
//* appear in the supporting documentation. The authors make no claims     *
//* about the suitability of this software for any purpose. It is          *
//* provided "as is" without express or implied warranty.                  *
//**************************************************************************

///  @file   AliHLTOnlineConfiguration.h
///  @author Matthias Richter
///  @author Lars Christian Raae
///  @date   
///  @brief  Description of the HLT online configuration

#include <cerrno>
#include <fstream>
#include <iostream>
#include <cstdio>

#include <TDOMParser.h>
#include <TXMLAttr.h>
#include <TXMLNode.h>
#include <TString.h>
#include <TObjString.h>

#include "AliHLTConfigurationHandler.h"
#include "AliHLTDAQ.h"
#include "AliHLTOnlineConfiguration.h"
#include "AliHLTComponentConfiguration.h"

/** ROOT macro for the implementation of ROOT specific class methods */
ClassImp(AliHLTOnlineConfiguration)

AliHLTOnlineConfiguration::AliHLTOnlineConfiguration()
  : TObject()
  , fXMLBuffer()
  , fXMLSize(0)
  , fConfEntryList()
  , fDefaultChains()
{
  // see header file for class documentation
  // or
  // refer to README to build package
  // or
  // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt

}

AliHLTOnlineConfiguration::~AliHLTOnlineConfiguration()
{
  // destructor
}

int AliHLTOnlineConfiguration::LoadConfiguration(const char* filename)
{
  /// load configuration from file

  if (TestBit(kLoaded))
    return -EPROTO;
  ifstream in;
  in.open(filename);
  if (!in.is_open())
    return -EIO;

  size_t filesize = 0;
  in.seekg(0, std::ios::end );
  filesize = in.tellg();
  in.seekg(0, std::ios::beg);

  char * content = new char[filesize];
  in.read(content, filesize);
  in.close();

  fXMLBuffer.Adopt(filesize, content);
  fXMLSize = filesize;
  SetBit(kLoaded);

  return filesize;
}

int AliHLTOnlineConfiguration::Compress()
{
  /// compress the xml buffer

  return 0;
}

int AliHLTOnlineConfiguration::Uncompress()
{
  /// compress the xml buffer

  return 0;
}

int AliHLTOnlineConfiguration::Parse()
{
  /// parse the xml buffer

  int iResult = 0;
  if (TestBit(kLoaded) && !TestBit(kParsed)) {
    iResult = -EINVAL;
    TDOMParser *domParser = new TDOMParser();
    domParser->SetValidate(false);
    Int_t parsecode = domParser->ParseBuffer(fXMLBuffer.GetArray(), fXMLSize);
    if (parsecode < 0) {
       HLTError("Configuration XML invalid or not well-formed (error code %d)", parsecode);
    }
    else {
      TXMLDocument* doc;
      if ((doc = domParser->GetXMLDocument()) && doc->GetRootNode()) {
        AliHLTConfigurationHandler* pHandler = AliHLTConfigurationHandler::Instance();
        pHandler->Deactivate(true);
        iResult = ParseConfiguration(doc->GetRootNode());
        if (iResult == 0)
          SetBit(kParsed);
        else {
          pHandler->ClearScheduledRegistrations();
          fConfEntryList.Delete();
          fDefaultChains.Clear();
        }
        pHandler->Activate();
      }
    }
    delete domParser;
  }
  else
    iResult = -EPROTO; 
  return iResult;
}

int AliHLTOnlineConfiguration::ParseConfiguration(TXMLNode* node)
{
  /// parse xml configuration

  int iResult = 0;
  int nElems = 0;
  if (node && node->GetChildren()) {
    node = node->GetChildren();
    for (; node && iResult == 0; node = node->GetNextNode()) {
      if (node->GetNodeType() == TXMLNode::kXMLElementNode) {
        if (strcmp(node->GetNodeName(), "Proc") == 0) {
          const char* id = 0;
          const char* type = 0;
          if (node->HasAttributes()) {
            TList* attrList = node->GetAttributes();
            TXMLAttr* attr = 0;
            TIter next(attrList);
            while ((attr=(TXMLAttr*)next()))
              if (strcmp(attr->GetName(), "ID") == 0) {
                id = attr->GetValue();
              } else if (strcmp(attr->GetName(), "type") == 0) {
                type = attr->GetValue();
              }
          }
          if (id && type && node->GetChildren()) {
            iResult = ParseEntry(node->GetChildren(), id, type);
            if (iResult == 0)
              nElems++;
          }
          else {
            iResult = -EINVAL;
            if (!id) {
              HLTError("Configuration component missing ID attribute");
            }
            else if (!type) {
              HLTError("Configuration component missing type attribute");
            }
            else {
              HLTError("Empty configuration component %s", id);
            }
          }
        }
      }
    }
    if (iResult != 0) {
      HLTError("An error occurred parsing the configuration. Aborting...");
    }
    else if (!nElems) {
      iResult = -EINVAL;
      HLTError("Configuration did not contain any (valid) elements");
    }
  }
  else {
    iResult = -EINVAL;
    HLTError("Configuration was empty");
  }
  return iResult;
}

int AliHLTOnlineConfiguration::ParseEntry(TXMLNode* node, const char* id,
  const char* type)
{
  /// Parse XML configuration entry.

  int iResult = 0;
  const char* cmd = 0;
  const char* source = 0;
  TString sources;
  TString nodes;
  for (; node; node = node->GetNextNode()) {
    if (node->GetNodeType() == TXMLNode::kXMLElementNode) {
      if (strcmp(node->GetNodeName(), "Cmd") == 0) {
        if (!cmd) // Use only the first (non-empty) <Cmd> element
          cmd = node->GetText();
      }
      else if (strcmp(node->GetNodeName(), "Node") == 0) {
        if (!nodes.IsNull()) nodes += " "; nodes += node->GetText();
      }
      else if (strcmp(node->GetNodeName(), "Parent") == 0) {
        source = node->GetText();
        if (sources.Contains(source)) {
          iResult = -EINVAL;
          HLTError("Configuration component %s has duplicate <Parent> element %s",
            id, source);
          break;
        }
        if (!sources.IsNull()) sources += " "; sources += node->GetText();
      }
    }
  }

  if (iResult == 0) {
    if (!cmd) {
      iResult = -EINVAL;
      HLTError("Configuration component %s does not contain <Cmd> element", id);
    }
    else if (cmd == strstr(cmd, "AliRootWrapperSubscriber"))
      iResult = ParseStandardComponent(id, type, cmd, sources, nodes);
    else if (cmd == strstr(cmd, "RORCPublisher"))
      iResult = ParseRORCPublisher(id, type, cmd, sources, nodes);
    else if (cmd == strstr(cmd, "TCPDumpSubscriber"))
      iResult = ParseTCPDumpSubscriber(id, type, cmd, sources, nodes);
    else if (cmd == strstr(cmd, "Relay"))
      iResult = ParseRelay(id, type, cmd, sources, nodes);
    else if (cmd == strstr(cmd, "HLTOutFormatter"))
      iResult = ParseHLTOutFormatter(id, type, cmd, sources, nodes);
    else if (cmd == strstr(cmd, "HLTOutWriterSubscriber"))
      iResult = ParseHLTOutWriterSubscriber(id, type, cmd, sources, nodes);
    else {
      iResult = -EINVAL;
      HLTError("Configuration component %s contains unknown <Cmd> element", id);
    }
  }
  
  return iResult;
}

int AliHLTOnlineConfiguration::ParseStandardComponent(const char* id,
  const char* type, const char* cmd, TString& sources, TString& nodes)
{
  /// Parse standard component configuration

  int iResult = 0;
  if (strcmp(type, "prc") != 0) {
    iResult = -EINVAL;
    HLTError("Configuration component %s has invalid type %s (expected prc)",
      id, type);  
  }
  else {
    // Parse component command
    const char* compid="";
    const char* complib="";
    char* compargs = 0;
    bool hasArgs = false;
    char* cmdcopy = new char[strlen(cmd)+1];
    if (!cmdcopy) return -ENOMEM;
    cmdcopy[strlen(cmd)]=0;
    strncpy(cmdcopy, cmd, strlen(cmd));
    strtok(cmdcopy, " -"); // Skip "AliRootWrapperSubscriber"
    char* strtmp = 0;
    bool CFTransform = false;
    while (((strtmp = strtok(0, " -")))) {
      if (strcmp(strtmp, "componentid") == 0) {
        compid = strtok(0, " -");
        if (strcmp(compid, "TPCHWClusterTransform") == 0)
        // FIXME: Ugly hack to replace cluster transformers. Refactor.
          CFTransform = true;
      }
      else if (strcmp(strtmp, "componentargs") == 0)
        hasArgs = true;
      else if (strcmp(strtmp, "componentlibrary") == 0)
        complib = strtok(0, " -");
    }
    if (CFTransform) {
      compid = "TPCClusterFinder32Bit";
      // NOTE: Cluster transformer's arguments ignored and cluster finder
      // component gets no arguments at all...
      hasArgs = false;
    }
    if (hasArgs) {
      // Parse component arguments
      int start = strstr(cmd, "-componentargs") + strlen("-componentargs") + 2
        - cmd;
      int arglen = strcspn(cmd+start, "\"");
      // Verify that we have the actual limits of the componentargs
      if ((size_t)(start+arglen) < strlen(cmd) && cmd[start-1] == '\"' &&
        cmd[start+arglen] == '\"')
      {
        compargs = new char[arglen+1];
        strncpy(compargs, cmd + start, arglen);
        compargs[arglen] = '\0';
      }
    }
    if (!compid) {
      iResult = -EINVAL;
      HLTError("Configuration component %s is missing component id", id);
    }
    if (!complib) {
      iResult = -EINVAL;
      HLTError("Configuration component %s is missing component library", id);
    }
    if (hasArgs && !compargs) {
      iResult = -EINVAL;
      HLTError("Configuration component %s is missing component arguments", id);
    }
    if (iResult == 0) {
      AliHLTComponentConfiguration* entry = new AliHLTComponentConfiguration(id,
        compid, sources.Data(), compargs);
      entry->SetOnlineCommand(cmd);
      entry->SetComponentLibrary(complib);
      entry->SetNodeNames(nodes.Data());
      fConfEntryList.Add(entry);
    }
    delete [] cmdcopy;
    delete [] compargs;
  }
  return iResult;
}

int AliHLTOnlineConfiguration::ParseRORCPublisher(const char* id,
  const char* type, const char* cmd, TString& sources, TString& nodes)
{
  /// Parse RORCPublisher configuration

  int iResult = 0;
  if (strcmp(type, "src") != 0) {
    iResult = -EINVAL;
    HLTError("Configuration component %s has invalid type %s (expected src)",
      id, type);  
  }
  else {
    const char compid[] = "AliRawReaderPublisher";
    const char complib[] = "libAliHLTUtil.so";
    // Parse (and validate) component command
    int ddlID;
    int res;
    if (strstr(cmd, "-hwcoproc")) {
      // HW Co-processor has complex argument rules, so skip full validation
      const char* key=strstr(cmd, "-ddlid");
      if (key)
	res = sscanf(key, "-ddlid %d", &ddlID);
      else
	res=0;
    } else {
      res = sscanf(cmd, "RORCPublisher -slot %*d %*d %*d %*d -rorcinterface %*d -sleep "
        "-sleeptime %*d -maxpendingevents %*d -alicehlt -ddlid %d", &ddlID);
    }
    if (res != 1) {
      iResult = -EINVAL;
      HLTError("Configuration component %s has <Cmd> element of unknown format\n"
        "Expected format: RORCPublisher -slot %%d %%d %%d %%d -rorcinterface %%d "
        "-sleep -sleeptime %%d -maxpendingevents %%d -alicehlt -ddlid %%d", id);
    }
    else {
      Int_t ddlIndex;
      Int_t detectorID = AliHLTDAQ::DetectorIDFromDdlID(ddlID, ddlIndex);
      string HLTOrigin = AliHLTDAQ::HLTOrigin(detectorID);
      string HLTSpecification = AliHLTDAQ::HLTSpecificationFromDdlID(ddlID);
      TString compargs;
      compargs.Form("-minid %d -datatype 'DDL_RAW ' '%s' -dataspec %s",
        ddlID, HLTOrigin.c_str(), HLTSpecification.c_str());
      AliHLTComponentConfiguration* entry = new AliHLTComponentConfiguration(id,
        compid, sources.Data(), compargs.Data());
      entry->SetOnlineCommand(cmd);
      entry->SetComponentLibrary(complib);
      entry->SetNodeNames(nodes.Data());
      fConfEntryList.Add(entry);
    }
  }
  return iResult;
}

int AliHLTOnlineConfiguration::ParseTCPDumpSubscriber(const char* id,
  const char* type, const char* /* cmd */, TString& /* sources */,
  TString& /* nodes */)
{
  /// Parse TCPDumpSubscriber configuration
  int iResult = 0;
  if (strcmp(type, "snk") != 0) {
    iResult = -EINVAL;
    HLTError("Configuration component %s has invalid type %s (expected snk)",
      id, type);  
  }
  return iResult;
}

int AliHLTOnlineConfiguration::ParseRelay(const char* id, const char* type,
  const char* cmd, TString& sources, TString& nodes)
{
  /// Parse Relay configuration

  int iResult = 0;
  if (strcmp(type, "prc") != 0) {
    iResult = -EINVAL;
    HLTError("Configuration component %s has invalid type %s (expected prc)",
      id, type);  
  }
  else {
    const char compid[] = "BlockFilter";
    const char complib[] = "libAliHLTUtil.so";
    const char* compargs = "";
    if (strcmp(cmd, "Relay") == 0) {
      AliHLTComponentConfiguration* entry = new AliHLTComponentConfiguration(id,
        compid, sources.Data(), compargs);
      entry->SetOnlineCommand(cmd);
      entry->SetComponentLibrary(complib);
      entry->SetNodeNames(nodes.Data());
      fConfEntryList.Add(entry);
    }
    else {
      iResult = -EINVAL;
      HLTError("Configuration component %s has <Cmd> element of unknown type "
        "\"%s\"", id, cmd);
    }
  }
  return iResult;
}

int AliHLTOnlineConfiguration::ParseHLTOutFormatter(const char* id,
  const char* type, const char* /* cmd */, TString& sources,
  TString& /* nodes */)
{
  /// Parse HLTOutFormatter configuration

  int iResult = 0;
  if (strcmp(type, "prc") != 0) {
    iResult = -EINVAL;
    HLTError("Configuration component %s has invalid type %s (expected prc)",
      id, type);
  }
  else {
    fDefaultChains = sources;
  }
  return iResult;
}

int AliHLTOnlineConfiguration::ParseHLTOutWriterSubscriber(const char* id,
  const char* type, const char* /* cmd */, TString& /* sources */,
  TString& /* nodes */)
{
  /// Parse HLTOutWriterSubscriber configuration

  int iResult = 0;
  if (strcmp(type, "snk") != 0) {
    iResult = -EINVAL;
    HLTError("Configuration component %s has invalid type %s (expected snk)",
      id, type);  
  }  
  return iResult;
}

TString AliHLTOnlineConfiguration::GetComponentLibraries()
{
  /// get component libraries
  
  TString result;
  AliHLTComponentConfiguration* pConf;
  const char* complib;
  TIter next(&fConfEntryList);
  while ((pConf=(AliHLTComponentConfiguration*)next())) {
    complib = pConf->GetComponentLibrary();
    if (!result.Contains(complib)) {
      if (!result.IsNull()) result+=" "; result+=complib;
    }
  }
  return result;
}

void AliHLTOnlineConfiguration::Print(const char* options) const
{
  /// overloaded from TObject, print info
  const UInt_t defaultSampleSize = 200;

  TObject::Print(options);
  printf("Configuration loaded: %s\n", (TestBit(kLoaded) ? "YES" : "NO"));
  TString opt = options;
  opt.ToLower();
  Bool_t buffer = opt.Contains("buffer");
  Bool_t parsed = opt.Contains("parsed");

  if (TestBit(kLoaded)) {
    if (buffer) {
      char configuration[fXMLSize + 1];
      strncpy(configuration, fXMLBuffer.GetArray(), fXMLSize);
      printf("%s\n\n", configuration);
    } else if (parsed) {
        AliHLTComponentConfiguration* pConf;
        TIter next(&fConfEntryList);
        while ((pConf=(AliHLTComponentConfiguration*)next())) {
          pConf->Print("status");
        }
    } else {
      Int_t sampleSize = (defaultSampleSize <= fXMLSize) ?
	      defaultSampleSize : fXMLSize;
      char sample[sampleSize];
      for (int i = 0; i < sampleSize - 1; i++)
	      sample[i] = fXMLBuffer.At(i);
      sample[sampleSize - 1] = '\0';
      printf("%s...\n\n", sample);
    }
  }

  printf("XML size (uncompressed): %d\n", fXMLSize);
  printf("Configuration compressed: %s\n", (TestBit(kCompressed) ? "YES" : "NO"));
  printf("Configuration parsed: %s\n", (TestBit(kParsed) ? "YES" : "NO"));
  printf("Parsed configuration entries: %d\n", fConfEntryList.GetSize());
  printf("Default chains: %s\n", fDefaultChains.Data());
}

void AliHLTOnlineConfiguration::Dump() const
{
  /// overloaded from TObject, more crude data dump

  TObject::Dump();
}

void AliHLTOnlineConfiguration::Clear(Option_t * option)
{
  /// overloaded from TObject, clear object

  TObject::Clear(option);
  fConfEntryList.Delete();
  fDefaultChains.Clear();
  fXMLBuffer.Reset();
  fXMLSize = 0;
  ResetBit(kLoaded);
  ResetBit(kCompressed);
  ResetBit(kParsed);
}

TObject * AliHLTOnlineConfiguration::Clone(const char *newname) const
{
  /// overloaded from TObject, clone object

  return TObject::Clone(newname);
}

void AliHLTOnlineConfiguration::Copy(TObject &object) const
{
  /// overloaded from TObject, copy object

  TObject::Copy(object);
}

void AliHLTOnlineConfiguration::Draw(Option_t */*option*/)
{
  /// overloaded from TObject, draw graph of the configuration
}
 AliHLTOnlineConfiguration.cxx:1
 AliHLTOnlineConfiguration.cxx:2
 AliHLTOnlineConfiguration.cxx:3
 AliHLTOnlineConfiguration.cxx:4
 AliHLTOnlineConfiguration.cxx:5
 AliHLTOnlineConfiguration.cxx:6
 AliHLTOnlineConfiguration.cxx:7
 AliHLTOnlineConfiguration.cxx:8
 AliHLTOnlineConfiguration.cxx:9
 AliHLTOnlineConfiguration.cxx:10
 AliHLTOnlineConfiguration.cxx:11
 AliHLTOnlineConfiguration.cxx:12
 AliHLTOnlineConfiguration.cxx:13
 AliHLTOnlineConfiguration.cxx:14
 AliHLTOnlineConfiguration.cxx:15
 AliHLTOnlineConfiguration.cxx:16
 AliHLTOnlineConfiguration.cxx:17
 AliHLTOnlineConfiguration.cxx:18
 AliHLTOnlineConfiguration.cxx:19
 AliHLTOnlineConfiguration.cxx:20
 AliHLTOnlineConfiguration.cxx:21
 AliHLTOnlineConfiguration.cxx:22
 AliHLTOnlineConfiguration.cxx:23
 AliHLTOnlineConfiguration.cxx:24
 AliHLTOnlineConfiguration.cxx:25
 AliHLTOnlineConfiguration.cxx:26
 AliHLTOnlineConfiguration.cxx:27
 AliHLTOnlineConfiguration.cxx:28
 AliHLTOnlineConfiguration.cxx:29
 AliHLTOnlineConfiguration.cxx:30
 AliHLTOnlineConfiguration.cxx:31
 AliHLTOnlineConfiguration.cxx:32
 AliHLTOnlineConfiguration.cxx:33
 AliHLTOnlineConfiguration.cxx:34
 AliHLTOnlineConfiguration.cxx:35
 AliHLTOnlineConfiguration.cxx:36
 AliHLTOnlineConfiguration.cxx:37
 AliHLTOnlineConfiguration.cxx:38
 AliHLTOnlineConfiguration.cxx:39
 AliHLTOnlineConfiguration.cxx:40
 AliHLTOnlineConfiguration.cxx:41
 AliHLTOnlineConfiguration.cxx:42
 AliHLTOnlineConfiguration.cxx:43
 AliHLTOnlineConfiguration.cxx:44
 AliHLTOnlineConfiguration.cxx:45
 AliHLTOnlineConfiguration.cxx:46
 AliHLTOnlineConfiguration.cxx:47
 AliHLTOnlineConfiguration.cxx:48
 AliHLTOnlineConfiguration.cxx:49
 AliHLTOnlineConfiguration.cxx:50
 AliHLTOnlineConfiguration.cxx:51
 AliHLTOnlineConfiguration.cxx:52
 AliHLTOnlineConfiguration.cxx:53
 AliHLTOnlineConfiguration.cxx:54
 AliHLTOnlineConfiguration.cxx:55
 AliHLTOnlineConfiguration.cxx:56
 AliHLTOnlineConfiguration.cxx:57
 AliHLTOnlineConfiguration.cxx:58
 AliHLTOnlineConfiguration.cxx:59
 AliHLTOnlineConfiguration.cxx:60
 AliHLTOnlineConfiguration.cxx:61
 AliHLTOnlineConfiguration.cxx:62
 AliHLTOnlineConfiguration.cxx:63
 AliHLTOnlineConfiguration.cxx:64
 AliHLTOnlineConfiguration.cxx:65
 AliHLTOnlineConfiguration.cxx:66
 AliHLTOnlineConfiguration.cxx:67
 AliHLTOnlineConfiguration.cxx:68
 AliHLTOnlineConfiguration.cxx:69
 AliHLTOnlineConfiguration.cxx:70
 AliHLTOnlineConfiguration.cxx:71
 AliHLTOnlineConfiguration.cxx:72
 AliHLTOnlineConfiguration.cxx:73
 AliHLTOnlineConfiguration.cxx:74
 AliHLTOnlineConfiguration.cxx:75
 AliHLTOnlineConfiguration.cxx:76
 AliHLTOnlineConfiguration.cxx:77
 AliHLTOnlineConfiguration.cxx:78
 AliHLTOnlineConfiguration.cxx:79
 AliHLTOnlineConfiguration.cxx:80
 AliHLTOnlineConfiguration.cxx:81
 AliHLTOnlineConfiguration.cxx:82
 AliHLTOnlineConfiguration.cxx:83
 AliHLTOnlineConfiguration.cxx:84
 AliHLTOnlineConfiguration.cxx:85
 AliHLTOnlineConfiguration.cxx:86
 AliHLTOnlineConfiguration.cxx:87
 AliHLTOnlineConfiguration.cxx:88
 AliHLTOnlineConfiguration.cxx:89
 AliHLTOnlineConfiguration.cxx:90
 AliHLTOnlineConfiguration.cxx:91
 AliHLTOnlineConfiguration.cxx:92
 AliHLTOnlineConfiguration.cxx:93
 AliHLTOnlineConfiguration.cxx:94
 AliHLTOnlineConfiguration.cxx:95
 AliHLTOnlineConfiguration.cxx:96
 AliHLTOnlineConfiguration.cxx:97
 AliHLTOnlineConfiguration.cxx:98
 AliHLTOnlineConfiguration.cxx:99
 AliHLTOnlineConfiguration.cxx:100
 AliHLTOnlineConfiguration.cxx:101
 AliHLTOnlineConfiguration.cxx:102
 AliHLTOnlineConfiguration.cxx:103
 AliHLTOnlineConfiguration.cxx:104
 AliHLTOnlineConfiguration.cxx:105
 AliHLTOnlineConfiguration.cxx:106
 AliHLTOnlineConfiguration.cxx:107
 AliHLTOnlineConfiguration.cxx:108
 AliHLTOnlineConfiguration.cxx:109
 AliHLTOnlineConfiguration.cxx:110
 AliHLTOnlineConfiguration.cxx:111
 AliHLTOnlineConfiguration.cxx:112
 AliHLTOnlineConfiguration.cxx:113
 AliHLTOnlineConfiguration.cxx:114
 AliHLTOnlineConfiguration.cxx:115
 AliHLTOnlineConfiguration.cxx:116
 AliHLTOnlineConfiguration.cxx:117
 AliHLTOnlineConfiguration.cxx:118
 AliHLTOnlineConfiguration.cxx:119
 AliHLTOnlineConfiguration.cxx:120
 AliHLTOnlineConfiguration.cxx:121
 AliHLTOnlineConfiguration.cxx:122
 AliHLTOnlineConfiguration.cxx:123
 AliHLTOnlineConfiguration.cxx:124
 AliHLTOnlineConfiguration.cxx:125
 AliHLTOnlineConfiguration.cxx:126
 AliHLTOnlineConfiguration.cxx:127
 AliHLTOnlineConfiguration.cxx:128
 AliHLTOnlineConfiguration.cxx:129
 AliHLTOnlineConfiguration.cxx:130
 AliHLTOnlineConfiguration.cxx:131
 AliHLTOnlineConfiguration.cxx:132
 AliHLTOnlineConfiguration.cxx:133
 AliHLTOnlineConfiguration.cxx:134
 AliHLTOnlineConfiguration.cxx:135
 AliHLTOnlineConfiguration.cxx:136
 AliHLTOnlineConfiguration.cxx:137
 AliHLTOnlineConfiguration.cxx:138
 AliHLTOnlineConfiguration.cxx:139
 AliHLTOnlineConfiguration.cxx:140
 AliHLTOnlineConfiguration.cxx:141
 AliHLTOnlineConfiguration.cxx:142
 AliHLTOnlineConfiguration.cxx:143
 AliHLTOnlineConfiguration.cxx:144
 AliHLTOnlineConfiguration.cxx:145
 AliHLTOnlineConfiguration.cxx:146
 AliHLTOnlineConfiguration.cxx:147
 AliHLTOnlineConfiguration.cxx:148
 AliHLTOnlineConfiguration.cxx:149
 AliHLTOnlineConfiguration.cxx:150
 AliHLTOnlineConfiguration.cxx:151
 AliHLTOnlineConfiguration.cxx:152
 AliHLTOnlineConfiguration.cxx:153
 AliHLTOnlineConfiguration.cxx:154
 AliHLTOnlineConfiguration.cxx:155
 AliHLTOnlineConfiguration.cxx:156
 AliHLTOnlineConfiguration.cxx:157
 AliHLTOnlineConfiguration.cxx:158
 AliHLTOnlineConfiguration.cxx:159
 AliHLTOnlineConfiguration.cxx:160
 AliHLTOnlineConfiguration.cxx:161
 AliHLTOnlineConfiguration.cxx:162
 AliHLTOnlineConfiguration.cxx:163
 AliHLTOnlineConfiguration.cxx:164
 AliHLTOnlineConfiguration.cxx:165
 AliHLTOnlineConfiguration.cxx:166
 AliHLTOnlineConfiguration.cxx:167
 AliHLTOnlineConfiguration.cxx:168
 AliHLTOnlineConfiguration.cxx:169
 AliHLTOnlineConfiguration.cxx:170
 AliHLTOnlineConfiguration.cxx:171
 AliHLTOnlineConfiguration.cxx:172
 AliHLTOnlineConfiguration.cxx:173
 AliHLTOnlineConfiguration.cxx:174
 AliHLTOnlineConfiguration.cxx:175
 AliHLTOnlineConfiguration.cxx:176
 AliHLTOnlineConfiguration.cxx:177
 AliHLTOnlineConfiguration.cxx:178
 AliHLTOnlineConfiguration.cxx:179
 AliHLTOnlineConfiguration.cxx:180
 AliHLTOnlineConfiguration.cxx:181
 AliHLTOnlineConfiguration.cxx:182
 AliHLTOnlineConfiguration.cxx:183
 AliHLTOnlineConfiguration.cxx:184
 AliHLTOnlineConfiguration.cxx:185
 AliHLTOnlineConfiguration.cxx:186
 AliHLTOnlineConfiguration.cxx:187
 AliHLTOnlineConfiguration.cxx:188
 AliHLTOnlineConfiguration.cxx:189
 AliHLTOnlineConfiguration.cxx:190
 AliHLTOnlineConfiguration.cxx:191
 AliHLTOnlineConfiguration.cxx:192
 AliHLTOnlineConfiguration.cxx:193
 AliHLTOnlineConfiguration.cxx:194
 AliHLTOnlineConfiguration.cxx:195
 AliHLTOnlineConfiguration.cxx:196
 AliHLTOnlineConfiguration.cxx:197
 AliHLTOnlineConfiguration.cxx:198
 AliHLTOnlineConfiguration.cxx:199
 AliHLTOnlineConfiguration.cxx:200
 AliHLTOnlineConfiguration.cxx:201
 AliHLTOnlineConfiguration.cxx:202
 AliHLTOnlineConfiguration.cxx:203
 AliHLTOnlineConfiguration.cxx:204
 AliHLTOnlineConfiguration.cxx:205
 AliHLTOnlineConfiguration.cxx:206
 AliHLTOnlineConfiguration.cxx:207
 AliHLTOnlineConfiguration.cxx:208
 AliHLTOnlineConfiguration.cxx:209
 AliHLTOnlineConfiguration.cxx:210
 AliHLTOnlineConfiguration.cxx:211
 AliHLTOnlineConfiguration.cxx:212
 AliHLTOnlineConfiguration.cxx:213
 AliHLTOnlineConfiguration.cxx:214
 AliHLTOnlineConfiguration.cxx:215
 AliHLTOnlineConfiguration.cxx:216
 AliHLTOnlineConfiguration.cxx:217
 AliHLTOnlineConfiguration.cxx:218
 AliHLTOnlineConfiguration.cxx:219
 AliHLTOnlineConfiguration.cxx:220
 AliHLTOnlineConfiguration.cxx:221
 AliHLTOnlineConfiguration.cxx:222
 AliHLTOnlineConfiguration.cxx:223
 AliHLTOnlineConfiguration.cxx:224
 AliHLTOnlineConfiguration.cxx:225
 AliHLTOnlineConfiguration.cxx:226
 AliHLTOnlineConfiguration.cxx:227
 AliHLTOnlineConfiguration.cxx:228
 AliHLTOnlineConfiguration.cxx:229
 AliHLTOnlineConfiguration.cxx:230
 AliHLTOnlineConfiguration.cxx:231
 AliHLTOnlineConfiguration.cxx:232
 AliHLTOnlineConfiguration.cxx:233
 AliHLTOnlineConfiguration.cxx:234
 AliHLTOnlineConfiguration.cxx:235
 AliHLTOnlineConfiguration.cxx:236
 AliHLTOnlineConfiguration.cxx:237
 AliHLTOnlineConfiguration.cxx:238
 AliHLTOnlineConfiguration.cxx:239
 AliHLTOnlineConfiguration.cxx:240
 AliHLTOnlineConfiguration.cxx:241
 AliHLTOnlineConfiguration.cxx:242
 AliHLTOnlineConfiguration.cxx:243
 AliHLTOnlineConfiguration.cxx:244
 AliHLTOnlineConfiguration.cxx:245
 AliHLTOnlineConfiguration.cxx:246
 AliHLTOnlineConfiguration.cxx:247
 AliHLTOnlineConfiguration.cxx:248
 AliHLTOnlineConfiguration.cxx:249
 AliHLTOnlineConfiguration.cxx:250
 AliHLTOnlineConfiguration.cxx:251
 AliHLTOnlineConfiguration.cxx:252
 AliHLTOnlineConfiguration.cxx:253
 AliHLTOnlineConfiguration.cxx:254
 AliHLTOnlineConfiguration.cxx:255
 AliHLTOnlineConfiguration.cxx:256
 AliHLTOnlineConfiguration.cxx:257
 AliHLTOnlineConfiguration.cxx:258
 AliHLTOnlineConfiguration.cxx:259
 AliHLTOnlineConfiguration.cxx:260
 AliHLTOnlineConfiguration.cxx:261
 AliHLTOnlineConfiguration.cxx:262
 AliHLTOnlineConfiguration.cxx:263
 AliHLTOnlineConfiguration.cxx:264
 AliHLTOnlineConfiguration.cxx:265
 AliHLTOnlineConfiguration.cxx:266
 AliHLTOnlineConfiguration.cxx:267
 AliHLTOnlineConfiguration.cxx:268
 AliHLTOnlineConfiguration.cxx:269
 AliHLTOnlineConfiguration.cxx:270
 AliHLTOnlineConfiguration.cxx:271
 AliHLTOnlineConfiguration.cxx:272
 AliHLTOnlineConfiguration.cxx:273
 AliHLTOnlineConfiguration.cxx:274
 AliHLTOnlineConfiguration.cxx:275
 AliHLTOnlineConfiguration.cxx:276
 AliHLTOnlineConfiguration.cxx:277
 AliHLTOnlineConfiguration.cxx:278
 AliHLTOnlineConfiguration.cxx:279
 AliHLTOnlineConfiguration.cxx:280
 AliHLTOnlineConfiguration.cxx:281
 AliHLTOnlineConfiguration.cxx:282
 AliHLTOnlineConfiguration.cxx:283
 AliHLTOnlineConfiguration.cxx:284
 AliHLTOnlineConfiguration.cxx:285
 AliHLTOnlineConfiguration.cxx:286
 AliHLTOnlineConfiguration.cxx:287
 AliHLTOnlineConfiguration.cxx:288
 AliHLTOnlineConfiguration.cxx:289
 AliHLTOnlineConfiguration.cxx:290
 AliHLTOnlineConfiguration.cxx:291
 AliHLTOnlineConfiguration.cxx:292
 AliHLTOnlineConfiguration.cxx:293
 AliHLTOnlineConfiguration.cxx:294
 AliHLTOnlineConfiguration.cxx:295
 AliHLTOnlineConfiguration.cxx:296
 AliHLTOnlineConfiguration.cxx:297
 AliHLTOnlineConfiguration.cxx:298
 AliHLTOnlineConfiguration.cxx:299
 AliHLTOnlineConfiguration.cxx:300
 AliHLTOnlineConfiguration.cxx:301
 AliHLTOnlineConfiguration.cxx:302
 AliHLTOnlineConfiguration.cxx:303
 AliHLTOnlineConfiguration.cxx:304
 AliHLTOnlineConfiguration.cxx:305
 AliHLTOnlineConfiguration.cxx:306
 AliHLTOnlineConfiguration.cxx:307
 AliHLTOnlineConfiguration.cxx:308
 AliHLTOnlineConfiguration.cxx:309
 AliHLTOnlineConfiguration.cxx:310
 AliHLTOnlineConfiguration.cxx:311
 AliHLTOnlineConfiguration.cxx:312
 AliHLTOnlineConfiguration.cxx:313
 AliHLTOnlineConfiguration.cxx:314
 AliHLTOnlineConfiguration.cxx:315
 AliHLTOnlineConfiguration.cxx:316
 AliHLTOnlineConfiguration.cxx:317
 AliHLTOnlineConfiguration.cxx:318
 AliHLTOnlineConfiguration.cxx:319
 AliHLTOnlineConfiguration.cxx:320
 AliHLTOnlineConfiguration.cxx:321
 AliHLTOnlineConfiguration.cxx:322
 AliHLTOnlineConfiguration.cxx:323
 AliHLTOnlineConfiguration.cxx:324
 AliHLTOnlineConfiguration.cxx:325
 AliHLTOnlineConfiguration.cxx:326
 AliHLTOnlineConfiguration.cxx:327
 AliHLTOnlineConfiguration.cxx:328
 AliHLTOnlineConfiguration.cxx:329
 AliHLTOnlineConfiguration.cxx:330
 AliHLTOnlineConfiguration.cxx:331
 AliHLTOnlineConfiguration.cxx:332
 AliHLTOnlineConfiguration.cxx:333
 AliHLTOnlineConfiguration.cxx:334
 AliHLTOnlineConfiguration.cxx:335
 AliHLTOnlineConfiguration.cxx:336
 AliHLTOnlineConfiguration.cxx:337
 AliHLTOnlineConfiguration.cxx:338
 AliHLTOnlineConfiguration.cxx:339
 AliHLTOnlineConfiguration.cxx:340
 AliHLTOnlineConfiguration.cxx:341
 AliHLTOnlineConfiguration.cxx:342
 AliHLTOnlineConfiguration.cxx:343
 AliHLTOnlineConfiguration.cxx:344
 AliHLTOnlineConfiguration.cxx:345
 AliHLTOnlineConfiguration.cxx:346
 AliHLTOnlineConfiguration.cxx:347
 AliHLTOnlineConfiguration.cxx:348
 AliHLTOnlineConfiguration.cxx:349
 AliHLTOnlineConfiguration.cxx:350
 AliHLTOnlineConfiguration.cxx:351
 AliHLTOnlineConfiguration.cxx:352
 AliHLTOnlineConfiguration.cxx:353
 AliHLTOnlineConfiguration.cxx:354
 AliHLTOnlineConfiguration.cxx:355
 AliHLTOnlineConfiguration.cxx:356
 AliHLTOnlineConfiguration.cxx:357
 AliHLTOnlineConfiguration.cxx:358
 AliHLTOnlineConfiguration.cxx:359
 AliHLTOnlineConfiguration.cxx:360
 AliHLTOnlineConfiguration.cxx:361
 AliHLTOnlineConfiguration.cxx:362
 AliHLTOnlineConfiguration.cxx:363
 AliHLTOnlineConfiguration.cxx:364
 AliHLTOnlineConfiguration.cxx:365
 AliHLTOnlineConfiguration.cxx:366
 AliHLTOnlineConfiguration.cxx:367
 AliHLTOnlineConfiguration.cxx:368
 AliHLTOnlineConfiguration.cxx:369
 AliHLTOnlineConfiguration.cxx:370
 AliHLTOnlineConfiguration.cxx:371
 AliHLTOnlineConfiguration.cxx:372
 AliHLTOnlineConfiguration.cxx:373
 AliHLTOnlineConfiguration.cxx:374
 AliHLTOnlineConfiguration.cxx:375
 AliHLTOnlineConfiguration.cxx:376
 AliHLTOnlineConfiguration.cxx:377
 AliHLTOnlineConfiguration.cxx:378
 AliHLTOnlineConfiguration.cxx:379
 AliHLTOnlineConfiguration.cxx:380
 AliHLTOnlineConfiguration.cxx:381
 AliHLTOnlineConfiguration.cxx:382
 AliHLTOnlineConfiguration.cxx:383
 AliHLTOnlineConfiguration.cxx:384
 AliHLTOnlineConfiguration.cxx:385
 AliHLTOnlineConfiguration.cxx:386
 AliHLTOnlineConfiguration.cxx:387
 AliHLTOnlineConfiguration.cxx:388
 AliHLTOnlineConfiguration.cxx:389
 AliHLTOnlineConfiguration.cxx:390
 AliHLTOnlineConfiguration.cxx:391
 AliHLTOnlineConfiguration.cxx:392
 AliHLTOnlineConfiguration.cxx:393
 AliHLTOnlineConfiguration.cxx:394
 AliHLTOnlineConfiguration.cxx:395
 AliHLTOnlineConfiguration.cxx:396
 AliHLTOnlineConfiguration.cxx:397
 AliHLTOnlineConfiguration.cxx:398
 AliHLTOnlineConfiguration.cxx:399
 AliHLTOnlineConfiguration.cxx:400
 AliHLTOnlineConfiguration.cxx:401
 AliHLTOnlineConfiguration.cxx:402
 AliHLTOnlineConfiguration.cxx:403
 AliHLTOnlineConfiguration.cxx:404
 AliHLTOnlineConfiguration.cxx:405
 AliHLTOnlineConfiguration.cxx:406
 AliHLTOnlineConfiguration.cxx:407
 AliHLTOnlineConfiguration.cxx:408
 AliHLTOnlineConfiguration.cxx:409
 AliHLTOnlineConfiguration.cxx:410
 AliHLTOnlineConfiguration.cxx:411
 AliHLTOnlineConfiguration.cxx:412
 AliHLTOnlineConfiguration.cxx:413
 AliHLTOnlineConfiguration.cxx:414
 AliHLTOnlineConfiguration.cxx:415
 AliHLTOnlineConfiguration.cxx:416
 AliHLTOnlineConfiguration.cxx:417
 AliHLTOnlineConfiguration.cxx:418
 AliHLTOnlineConfiguration.cxx:419
 AliHLTOnlineConfiguration.cxx:420
 AliHLTOnlineConfiguration.cxx:421
 AliHLTOnlineConfiguration.cxx:422
 AliHLTOnlineConfiguration.cxx:423
 AliHLTOnlineConfiguration.cxx:424
 AliHLTOnlineConfiguration.cxx:425
 AliHLTOnlineConfiguration.cxx:426
 AliHLTOnlineConfiguration.cxx:427
 AliHLTOnlineConfiguration.cxx:428
 AliHLTOnlineConfiguration.cxx:429
 AliHLTOnlineConfiguration.cxx:430
 AliHLTOnlineConfiguration.cxx:431
 AliHLTOnlineConfiguration.cxx:432
 AliHLTOnlineConfiguration.cxx:433
 AliHLTOnlineConfiguration.cxx:434
 AliHLTOnlineConfiguration.cxx:435
 AliHLTOnlineConfiguration.cxx:436
 AliHLTOnlineConfiguration.cxx:437
 AliHLTOnlineConfiguration.cxx:438
 AliHLTOnlineConfiguration.cxx:439
 AliHLTOnlineConfiguration.cxx:440
 AliHLTOnlineConfiguration.cxx:441
 AliHLTOnlineConfiguration.cxx:442
 AliHLTOnlineConfiguration.cxx:443
 AliHLTOnlineConfiguration.cxx:444
 AliHLTOnlineConfiguration.cxx:445
 AliHLTOnlineConfiguration.cxx:446
 AliHLTOnlineConfiguration.cxx:447
 AliHLTOnlineConfiguration.cxx:448
 AliHLTOnlineConfiguration.cxx:449
 AliHLTOnlineConfiguration.cxx:450
 AliHLTOnlineConfiguration.cxx:451
 AliHLTOnlineConfiguration.cxx:452
 AliHLTOnlineConfiguration.cxx:453
 AliHLTOnlineConfiguration.cxx:454
 AliHLTOnlineConfiguration.cxx:455
 AliHLTOnlineConfiguration.cxx:456
 AliHLTOnlineConfiguration.cxx:457
 AliHLTOnlineConfiguration.cxx:458
 AliHLTOnlineConfiguration.cxx:459
 AliHLTOnlineConfiguration.cxx:460
 AliHLTOnlineConfiguration.cxx:461
 AliHLTOnlineConfiguration.cxx:462
 AliHLTOnlineConfiguration.cxx:463
 AliHLTOnlineConfiguration.cxx:464
 AliHLTOnlineConfiguration.cxx:465
 AliHLTOnlineConfiguration.cxx:466
 AliHLTOnlineConfiguration.cxx:467
 AliHLTOnlineConfiguration.cxx:468
 AliHLTOnlineConfiguration.cxx:469
 AliHLTOnlineConfiguration.cxx:470
 AliHLTOnlineConfiguration.cxx:471
 AliHLTOnlineConfiguration.cxx:472
 AliHLTOnlineConfiguration.cxx:473
 AliHLTOnlineConfiguration.cxx:474
 AliHLTOnlineConfiguration.cxx:475
 AliHLTOnlineConfiguration.cxx:476
 AliHLTOnlineConfiguration.cxx:477
 AliHLTOnlineConfiguration.cxx:478
 AliHLTOnlineConfiguration.cxx:479
 AliHLTOnlineConfiguration.cxx:480
 AliHLTOnlineConfiguration.cxx:481
 AliHLTOnlineConfiguration.cxx:482
 AliHLTOnlineConfiguration.cxx:483
 AliHLTOnlineConfiguration.cxx:484
 AliHLTOnlineConfiguration.cxx:485
 AliHLTOnlineConfiguration.cxx:486
 AliHLTOnlineConfiguration.cxx:487
 AliHLTOnlineConfiguration.cxx:488
 AliHLTOnlineConfiguration.cxx:489
 AliHLTOnlineConfiguration.cxx:490
 AliHLTOnlineConfiguration.cxx:491
 AliHLTOnlineConfiguration.cxx:492
 AliHLTOnlineConfiguration.cxx:493
 AliHLTOnlineConfiguration.cxx:494
 AliHLTOnlineConfiguration.cxx:495
 AliHLTOnlineConfiguration.cxx:496
 AliHLTOnlineConfiguration.cxx:497
 AliHLTOnlineConfiguration.cxx:498
 AliHLTOnlineConfiguration.cxx:499
 AliHLTOnlineConfiguration.cxx:500
 AliHLTOnlineConfiguration.cxx:501
 AliHLTOnlineConfiguration.cxx:502
 AliHLTOnlineConfiguration.cxx:503
 AliHLTOnlineConfiguration.cxx:504
 AliHLTOnlineConfiguration.cxx:505
 AliHLTOnlineConfiguration.cxx:506
 AliHLTOnlineConfiguration.cxx:507
 AliHLTOnlineConfiguration.cxx:508
 AliHLTOnlineConfiguration.cxx:509
 AliHLTOnlineConfiguration.cxx:510
 AliHLTOnlineConfiguration.cxx:511
 AliHLTOnlineConfiguration.cxx:512
 AliHLTOnlineConfiguration.cxx:513
 AliHLTOnlineConfiguration.cxx:514
 AliHLTOnlineConfiguration.cxx:515
 AliHLTOnlineConfiguration.cxx:516
 AliHLTOnlineConfiguration.cxx:517
 AliHLTOnlineConfiguration.cxx:518
 AliHLTOnlineConfiguration.cxx:519
 AliHLTOnlineConfiguration.cxx:520
 AliHLTOnlineConfiguration.cxx:521
 AliHLTOnlineConfiguration.cxx:522
 AliHLTOnlineConfiguration.cxx:523
 AliHLTOnlineConfiguration.cxx:524
 AliHLTOnlineConfiguration.cxx:525
 AliHLTOnlineConfiguration.cxx:526
 AliHLTOnlineConfiguration.cxx:527
 AliHLTOnlineConfiguration.cxx:528
 AliHLTOnlineConfiguration.cxx:529
 AliHLTOnlineConfiguration.cxx:530
 AliHLTOnlineConfiguration.cxx:531
 AliHLTOnlineConfiguration.cxx:532
 AliHLTOnlineConfiguration.cxx:533
 AliHLTOnlineConfiguration.cxx:534
 AliHLTOnlineConfiguration.cxx:535
 AliHLTOnlineConfiguration.cxx:536
 AliHLTOnlineConfiguration.cxx:537
 AliHLTOnlineConfiguration.cxx:538
 AliHLTOnlineConfiguration.cxx:539
 AliHLTOnlineConfiguration.cxx:540
 AliHLTOnlineConfiguration.cxx:541
 AliHLTOnlineConfiguration.cxx:542
 AliHLTOnlineConfiguration.cxx:543
 AliHLTOnlineConfiguration.cxx:544
 AliHLTOnlineConfiguration.cxx:545
 AliHLTOnlineConfiguration.cxx:546
 AliHLTOnlineConfiguration.cxx:547
 AliHLTOnlineConfiguration.cxx:548
 AliHLTOnlineConfiguration.cxx:549
 AliHLTOnlineConfiguration.cxx:550
 AliHLTOnlineConfiguration.cxx:551
 AliHLTOnlineConfiguration.cxx:552
 AliHLTOnlineConfiguration.cxx:553
 AliHLTOnlineConfiguration.cxx:554
 AliHLTOnlineConfiguration.cxx:555
 AliHLTOnlineConfiguration.cxx:556
 AliHLTOnlineConfiguration.cxx:557
 AliHLTOnlineConfiguration.cxx:558
 AliHLTOnlineConfiguration.cxx:559
 AliHLTOnlineConfiguration.cxx:560
 AliHLTOnlineConfiguration.cxx:561
 AliHLTOnlineConfiguration.cxx:562
 AliHLTOnlineConfiguration.cxx:563
 AliHLTOnlineConfiguration.cxx:564
 AliHLTOnlineConfiguration.cxx:565
 AliHLTOnlineConfiguration.cxx:566
 AliHLTOnlineConfiguration.cxx:567
 AliHLTOnlineConfiguration.cxx:568