ROOT logo
// $Id$
/**************************************************************************
 * This file is property of and copyright by the ALICE HLT Project        *
 * ALICE Experiment at CERN, All rights reserved.                         *
 *                                                                        *
 * Primary Authors: Artur Szostak <artursz@iafrica.com>                   *
 *                  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   AliHLTTriggerDomain.cxx
/// @author Artur Szostak <artursz@iafrica.com>
/// @date   19 Nov 2008
/// @brief  Implementation of the AliHLTTriggerDomain class.
///
/// The trigger domain class is the set of HLT raw data block types that should
/// be readout and sent to HLTOUT.

#include <stdlib.h>

#include "AliHLTTriggerDomain.h"
#include "AliHLTDomainEntry.h"
#include "AliHLTReadoutList.h"
#include "Riostream.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "AliHLTDAQ.h"

ClassImp(AliHLTTriggerDomain)


AliHLTTriggerDomain::AliHLTTriggerDomain() :
  TObject(), fEntries(AliHLTDomainEntry::Class(), 10)
{
  // Default constructor.
}


AliHLTTriggerDomain::AliHLTTriggerDomain(const char* list) :
  TObject(), fEntries(AliHLTDomainEntry::Class(), 10)
{
  // Constructs the domain from a list of entries.
  
  TString lst = list;
  TObjArray* entries = lst.Tokenize(",");
  for (Int_t i = 0; i < entries->GetEntriesFast(); i++)
  {
    TString entry = static_cast<TObjString*>(entries->UncheckedAt(i))->GetString();
    TObjArray* domainStrings = entry.Tokenize(":");
    if (domainStrings->GetEntriesFast() <= 0 or domainStrings->GetEntriesFast() > 3)
    {
      Error("AliHLTTriggerDomain",
            "The domain string must contain 1, 2 or 3 fields separated by a ':'."
           );
      delete domainStrings;
      continue;
    }
    
    bool inclusiveEntry = true;
    TString typeString = "*******";
    if (domainStrings->GetEntriesFast() >= 1)
    {
      typeString = static_cast<TObjString*>(domainStrings->UncheckedAt(0))->GetString();
      if (typeString.Length() > 0)
      {
        if (typeString[0] == '+')
        {
          inclusiveEntry = true;
          typeString.Remove(0, 1);
        }
        if (typeString[0] == '-')
        {
          inclusiveEntry = false;
          typeString.Remove(0, 1);
        }
      }
    }
    TString originString = "***";
    if (domainStrings->GetEntriesFast() >= 2)
    {
      originString = static_cast<TObjString*>(domainStrings->UncheckedAt(1))->GetString();
    }
    bool usespec = false;
    UInt_t spec = 0;
    if (domainStrings->GetEntriesFast() == 3)
    {
      TString specString = static_cast<TObjString*>(domainStrings->UncheckedAt(2))->GetString();
      char* error = NULL;
      spec = UInt_t( strtoul(specString.Data(), &error, 0) );
      if (error == NULL or *error != '\0')
      {
        Error("AliHLTTriggerDomain",
              "The last field of the domain string must be a number, but we received '%s'.",
              specString.Data()
             );
      }
      else
      {
        usespec = true;
      }
    }
    
    if (usespec)
    {
      if (inclusiveEntry)
        Add(typeString.Data(), originString.Data(), spec);
      else
        Remove(typeString.Data(), originString.Data(), spec);
    }
    else
    {
      if (inclusiveEntry)
        Add(typeString.Data(), originString.Data());
      else
        Remove(typeString.Data(), originString.Data());
    }
    
    delete domainStrings;
  }
  delete entries;
}


AliHLTTriggerDomain::AliHLTTriggerDomain(const AliHLTReadoutList& list) :
  TObject(), fEntries(AliHLTDomainEntry::Class(), 10)
{
  // Constructor creates a trigger domain from a readout list.
  // See header file for more details.
  
  Add(list);
}


AliHLTTriggerDomain::AliHLTTriggerDomain(const AliHLTTriggerDomain& domain) :
  TObject(domain),
  fEntries(AliHLTDomainEntry::Class(), domain.fEntries.GetEntriesFast())
{
  // Copy constructor performs a deep copy.
  // See header file for more details.
  
  for (Int_t i = 0; i < domain.fEntries.GetEntriesFast(); i++)
  {
    const AliHLTDomainEntry* entry = static_cast<const AliHLTDomainEntry*>( domain.fEntries.UncheckedAt(i) );
    new (fEntries[fEntries.GetEntriesFast()]) AliHLTDomainEntry(*entry);
  }
}


AliHLTTriggerDomain::~AliHLTTriggerDomain()
{
  // Default destructor.
}


void AliHLTTriggerDomain::Add(const AliHLTReadoutList& list)
{
  // Adds the readout list to the trigger domain.
  // See header file for more details.
  
  Int_t detId[] = {
      AliHLTReadoutList::kITSSPD, AliHLTReadoutList::kITSSDD, AliHLTReadoutList::kITSSSD,
      AliHLTReadoutList::kTPC, AliHLTReadoutList::kTRD, AliHLTReadoutList::kTOF,
      AliHLTReadoutList::kHMPID, AliHLTReadoutList::kPHOS, AliHLTReadoutList::kCPV,
      AliHLTReadoutList::kPMD, AliHLTReadoutList::kMUONTRK, AliHLTReadoutList::kMUONTRG,
      AliHLTReadoutList::kFMD, AliHLTReadoutList::kT0, AliHLTReadoutList::kV0,
      AliHLTReadoutList::kZDC, AliHLTReadoutList::kACORDE, AliHLTReadoutList::kTRG,
      AliHLTReadoutList::kEMCAL, AliHLTReadoutList::kDAQTEST, AliHLTReadoutList::kHLT
    };
  
  for (Int_t deti = 0; deti < (Int_t)AliHLTDAQ::NumberOfDetectors() && deti < (Int_t)(sizeof(detId)/sizeof(Int_t)); deti++)
  {
    if (list.DetectorEnabled(detId[deti]))
    {
      Add(kAliHLTDAQRDOUTDataTypeID, AliHLTDAQ::OnlineName(deti));
    }
    else
    {
      for (Int_t i = 0; i < AliHLTDAQ::NumberOfDdls(deti); i++)
      {
        Int_t ddlId = AliHLTDAQ::DdlID(deti, i);
        if (list.IsDDLEnabled(ddlId)) Add(kAliHLTDAQRDOUTDataTypeID, AliHLTDAQ::OnlineName(deti), ddlId);
      }
    }
  }
}

void AliHLTTriggerDomain::Add(const AliHLTDomainEntry& entry)
{
  // Adds a new domain entry to the trigger domain.
  // See header file for more details.
  
  AliHLTDomainEntry intersect;
  bool alreadyInSet = false;
  
  // Get the initial size of the fEntries array since we might add things to the
  // end during the calculation.
  Int_t count = fEntries.GetEntriesFast();
  
  // Go through each entry that is already in fEntries and see if we can remove
  // it because it will become redundant, or if we need to patch exclusion entries
  // by adding inclusive intersects, or if we do not even need to add the new entry
  // because it is already part of the trigger domain.
  for (Int_t i = 0; i < count; i++)
  {
    AliHLTDomainEntry* ientry = static_cast<AliHLTDomainEntry*>(fEntries.UncheckedAt(i));
    if (ientry->Inclusive())
    {
      if (entry.SubsetOf(*ientry))
      {
        alreadyInSet = true;
      }
      else if (ientry->SubsetOf(entry))
      {
        ientry->SetBit(BIT(14), true);  // mark for removal.
      }
    }
    else
    {
      if (ientry->SubsetOf(entry))
      {
        ientry->SetBit(BIT(14), true);  // mark for removal.
      }
      else if (entry.SubsetOf(*ientry))
      {
        alreadyInSet = false;
      }
      else if (ientry->IntersectWith(entry, intersect))
      {
        MarkForDeletionSubsetsOf(intersect, count);
        new (fEntries[fEntries.GetEntriesFast()]) AliHLTDomainEntry(kFALSE, intersect);
      }
    }
  }
  
  // Check if we need to add the new entry.
  if (not alreadyInSet)
  {
    MarkForDeletionSubsetsOf(entry, count);
    new (fEntries[fEntries.GetEntriesFast()]) AliHLTDomainEntry(kFALSE, entry);
  }
  RemoveMarkedEntries();
}


void AliHLTTriggerDomain::Add(const AliHLTComponentDataType& datatype)
{
  // Adds a new domain entry with the given data type to the trigger domain.
  // But the data block specification is set to the any matching wild card.
  // See header file for more details.
  
  Add(AliHLTDomainEntry(datatype));
}


void AliHLTTriggerDomain::Add(const char* blocktype, const char* origin)
{
  // Adds a new domain entry with the given data type and origin to the trigger domain.
  // But the data block specification is set to the any matching wild card.
  // See header file for more details.
  
  Add(AliHLTDomainEntry(blocktype, origin));
}


void AliHLTTriggerDomain::Add(const AliHLTComponentDataType& datatype, UInt_t spec)
{
  // Adds a new domain entry to the trigger domain with the data type and data block
  // specification bits.
  // See header file for more details.
  
  Add(AliHLTDomainEntry(datatype, spec));
}


void AliHLTTriggerDomain::Add(const char* blocktype, const char* origin, UInt_t spec)
{
  // Adds a new domain entry to the trigger domain with the given data type, origin
  // and data block specification bits.
  // See header file for more details.
  
  Add(AliHLTDomainEntry(blocktype, origin, spec));
}


void AliHLTTriggerDomain::Remove(const AliHLTReadoutList& list)
{
  // Removes the entries in the readout list from the trigger domain that are enabled.
  // See header file for more details.
  
  Int_t detId[] = {
      AliHLTReadoutList::kITSSPD, AliHLTReadoutList::kITSSDD, AliHLTReadoutList::kITSSSD,
      AliHLTReadoutList::kTPC, AliHLTReadoutList::kTRD, AliHLTReadoutList::kTOF,
      AliHLTReadoutList::kHMPID, AliHLTReadoutList::kPHOS, AliHLTReadoutList::kCPV,
      AliHLTReadoutList::kPMD, AliHLTReadoutList::kMUONTRK, AliHLTReadoutList::kMUONTRG,
      AliHLTReadoutList::kFMD, AliHLTReadoutList::kT0, AliHLTReadoutList::kV0,
      AliHLTReadoutList::kZDC, AliHLTReadoutList::kACORDE, AliHLTReadoutList::kTRG,
      AliHLTReadoutList::kEMCAL, AliHLTReadoutList::kDAQTEST, AliHLTReadoutList::kHLT
    };
  
  for (Int_t deti = 0; deti < (Int_t)AliHLTDAQ::NumberOfDetectors() && deti < (Int_t)(sizeof(detId)/sizeof(Int_t)); deti++)
  {
    if (list.DetectorEnabled(detId[deti]))
    {
      Remove(kAliHLTDAQRDOUTDataTypeID, AliHLTDAQ::OnlineName(deti));
    }
    else
    {
      for (Int_t i = 0; i < AliHLTDAQ::NumberOfDdls(deti); i++)
      {
        Int_t ddlId = AliHLTDAQ::DdlID(deti, i);
        if (list.IsDDLEnabled(ddlId)) Remove(kAliHLTDAQRDOUTDataTypeID, AliHLTDAQ::OnlineName(deti), ddlId);
      }
    }
  }
}


void AliHLTTriggerDomain::Remove(const AliHLTDomainEntry& entry)
{
  // Removes the given domain entry from the trigger domain.
  // See header file for more details.

  AliHLTDomainEntry intersect;
  bool addToExcludeSet = false;
  
  // Get the initial size of the fEntries array since we might add things to the
  // end during the calculation.
  Int_t count = fEntries.GetEntriesFast();
  
  // We need to go through all existing entries and see if they need to be removed
  // because they would become redundant when we add the new 'entry' to the end of
  // the fEntries list. We also need to check if the new entry needs to be added
  // at all because the trigger domain might already not contain those entries.
  // Lastly, some intersection entries might need to be added to patch up existing
  // inclusive trigger domain entries (rules / patterns).
  for (Int_t i = 0; i < count; i++)
  {
    AliHLTDomainEntry* ientry = static_cast<AliHLTDomainEntry*>(fEntries.UncheckedAt(i));
    if (ientry->Inclusive())
    {
      if (ientry->SubsetOf(entry))
      {
        ientry->SetBit(BIT(14), true);  // mark for removal.
      }
      else if (entry.SubsetOf(*ientry))
      {
        addToExcludeSet = true;
      }
      else if (ientry->IntersectWith(entry, intersect))
      {
        new (fEntries[fEntries.GetEntriesFast()]) AliHLTDomainEntry(kTRUE, intersect);
      }
    }
    else
    {
      if (entry.SubsetOf(*ientry))
      {
        addToExcludeSet = false;
      }
      else if (ientry->SubsetOf(entry))
      {
        ientry->SetBit(BIT(14), true);  // mark for removal.
      }
    }
  }
  
  // Check if we need to add the new entry.
  if (addToExcludeSet)
  {
    MarkForDeletionSubsetsOf(entry, count);
    new (fEntries[fEntries.GetEntriesFast()]) AliHLTDomainEntry(kTRUE, entry);
  }
  RemoveMarkedEntries();
}


void AliHLTTriggerDomain::Remove(const AliHLTComponentDataType& datatype)
{
  // Removes the domain entries that have the given data type from the trigger domain.
  // See header file for more details.
  
  Remove(AliHLTDomainEntry(datatype));
}


void AliHLTTriggerDomain::Remove(const char* blocktype, const char* origin)
{
  // Removes the domain entries that have the given data type and origin from the
  // trigger domain.
  // See header file for more details.
  
  Remove(AliHLTDomainEntry(blocktype, origin));
}


void AliHLTTriggerDomain::Remove(const AliHLTComponentDataType& datatype, UInt_t spec)
{
  // Removes the domain entries that have the given data type and data block
  // specification bits from the trigger domain.
  // See header file for more details.
  
  Remove(AliHLTDomainEntry(datatype, spec));
}


void AliHLTTriggerDomain::Remove(const char* blocktype, const char* origin, UInt_t spec)
{
  // Removes the domain entries that have the given data type, origin and data
  // block specification bits from the trigger domain.
  // See header file for more details.
  
  Remove(AliHLTDomainEntry(blocktype, origin, spec));
}


bool AliHLTTriggerDomain::Contains(const AliHLTDomainEntry& entry) const
{
  // Checks to see if the given domain entry is part of the trigger domain set.
  // See header file for more details.

  // Simply go through the whole list of fEntries and for each entry see if the
  // given domain entry 'entry' being checked matches. If there is a match then
  // update the result depending on the entry type. i.e. set to false if the entry
  // in fEntries is an exclusion and set to true if it is an inclusion.
  bool result = false;
  for (Int_t i = 0; i < fEntries.GetEntriesFast(); i++)
  {
    const AliHLTDomainEntry* ientry = static_cast<const AliHLTDomainEntry*>(fEntries.UncheckedAt(i));
    if (ientry->Inclusive())
    {
      if (*ientry == entry) result = true;
    }
    else
    {
      if (entry.SubsetOf(*ientry)) result = false;
    }
  }
  return result;
}


bool AliHLTTriggerDomain::IncludeInReadout(const AliHLTComponentBlockData* block) const
{
  // Checks to see if the given data block is part of the trigger domain set and
  // should be readout.
  // See header file for more details.

  // Same algorithm as for Contains() but applied directly to the data block
  // descriptor structure.
  AliHLTDomainEntry blockEntry(block->fDataType, block->fSpecification);
  bool result = false;
  for (Int_t i = 0; i < fEntries.GetEntriesFast(); i++)
  {
    const AliHLTDomainEntry* entry = static_cast<const AliHLTDomainEntry*>(fEntries.UncheckedAt(i));
    if (entry->Inclusive())
    {
      if (*entry == block) result = true;
    }
    else
    {
      if (blockEntry.SubsetOf(*entry)) result = false;
    }
  }
  return result;
}


void AliHLTTriggerDomain::Clear(Option_t* option)
{
  // Clears the trigger domain (Removes all entries).
  
  fEntries.Clear(option);
}


void AliHLTTriggerDomain::Print(Option_t* /*option*/) const
{
  // Prints the trigger domain entries in the order that they are applied.
  // See header file for more details.

  cout << "Trigger domain rules (applied in order of first to last):" << endl;
  for (Int_t i = 0; i < fEntries.GetEntriesFast(); i++)
  {
    const AliHLTDomainEntry* entry = static_cast<const AliHLTDomainEntry*>( fEntries.UncheckedAt(i) );
    if (entry->Inclusive())
    {
      cout << "Include ";
    }
    else
    {
      cout << "Exclude ";
    }
    entry->Print();
  }
  if (fEntries.GetEntriesFast() == 0)
  {
    cout << "(empty)" << endl;
  }
}


AliHLTTriggerDomain& AliHLTTriggerDomain::operator = (const AliHLTTriggerDomain& domain)
{
  // Assignment operator performs a deep copy.
  // See header file for more details.
  
  if (this == &domain) return *this;
  TObject::operator = (domain);
  fEntries.Clear();
  for (Int_t i = 0; i < domain.fEntries.GetEntriesFast(); i++)
  {
    const AliHLTDomainEntry* entry = static_cast<const AliHLTDomainEntry*>( domain.fEntries.UncheckedAt(i) );
    new (fEntries[fEntries.GetEntriesFast()]) AliHLTDomainEntry(*entry);
  }
  return *this;
}


AliHLTTriggerDomain& AliHLTTriggerDomain::operator |= (const AliHLTTriggerDomain& domain)
{
  // This operator performs the set union.
  // See header file for more details.
  
  // Note that we partition the fEntries array into 3 regions for this calculation.
  //   - 0..entriesCount-1 : contains the initial entries of this trigger domain.
  //   - entriesCount..startOfIntersects-1 : is space reserved for the new entries
  //       from 'domain'.
  //   - startOfIntersects..fEntries.GetEntriesFast()-1 : This will grow as we add
  //       all the new domain intersections created during the calculation.
  //
  // Get the number of entries now before we start adding more entries from 'domain'.
  Int_t count = fEntries.GetEntriesFast();
  // Mark the start location for new intersection entries.
  Int_t startOfIntersects = count + domain.fEntries.GetEntriesFast();
  Int_t newIndex = startOfIntersects;

  // Allocate and initialise a single block of memory so that we do not call new twice.
  bool* buffer = new bool[startOfIntersects];
  for (Int_t i = 0; i < startOfIntersects; i++) buffer[i] = false;
  bool* removeThisEntry = buffer;
  bool* removeDomainEntry = buffer + count;

  AliHLTDomainEntry intersect;
  
  // The idea behind this algorithm is that we need to add all inclusion domain
  // entries from 'domain' to this object that will not be redundant, but for
  // the exclusion entries we patch the fEntries rule set by adding the appropriate
  // intersections to the end of fEntries.
  for (Int_t i = 0; i < domain.fEntries.GetEntriesFast(); i++)
  {
    const AliHLTDomainEntry* newEntry = static_cast<const AliHLTDomainEntry*>( domain.fEntries.UncheckedAt(i) );
    for (Int_t j = 0; j < count; j++)
    {
      const AliHLTDomainEntry* currentEntry = static_cast<const AliHLTDomainEntry*>( fEntries.UncheckedAt(j) );
      if (currentEntry->Inclusive() and newEntry->Inclusive())
      {
        // If either entry is a subset of the other then we do not need to add
        // both, so make sure to remove the one that is redundant.
        if (newEntry->SubsetOf(*currentEntry))
        {
          removeDomainEntry[i] = true;
        }
        else if (currentEntry->SubsetOf(*newEntry))
        {
          removeThisEntry[j] = true;
        }
      }
      else
      {
        if (newEntry->IntersectWith(*currentEntry, intersect))
        {
          // We can remove all intersections that were already added that will
          // become redundant when this intersection is added to fEntries.
          MarkForDeletionSubsetsOf(intersect, startOfIntersects);
          
          // Make the new intersection entry an exclusion if the newEntry and
          // currentEntry flags are the same.
          bool exclude = newEntry->Exclusive() == currentEntry->Exclusive();
          new (fEntries[newIndex++]) AliHLTDomainEntry(exclude, intersect);
          
          // We can also remove entries that are subsets of another entry in the
          // opposite list, since they will be redundant when everything is merged
          // together. For example, remove entry x from fEntries if it is a subset
          // of entry y in domain.fEntries.
          if (currentEntry->IdenticalTo(intersect)) removeThisEntry[j] = true;
          if (newEntry->IdenticalTo(intersect)) removeDomainEntry[i] = true;
        }
      }
    }
  }

  MergeEntries(removeThisEntry, count, removeDomainEntry, startOfIntersects, domain);
  delete [] buffer;
  Optimise();
  return *this;
}


AliHLTTriggerDomain& AliHLTTriggerDomain::operator ^= (const AliHLTTriggerDomain& domain)
{
  // This operator performs the set union, less the set intersect (something like and xor).
  // See header file for more details.
  
  // Note that we partition the fEntries array into 3 regions for this calculation.
  //   - 0..entriesCount-1 : contains the initial entries of this trigger domain.
  //   - entriesCount..startOfIntersects-1 : is space reserved for the new entries
  //       from 'domain'.
  //   - startOfIntersects..fEntries.GetEntriesFast()-1 : This will grow as we add
  //       all the new domain intersections created during the calculation.
  //
  // Get the number of entries now before we start adding more entries from 'domain'.
  Int_t count = fEntries.GetEntriesFast();
  // Mark the start location for new intersection entries.
  Int_t startOfIntersects = count + domain.fEntries.GetEntriesFast();
  Int_t newIndex = startOfIntersects;

  // Allocate and initialise a single block of memory so that we do not call new twice.
  bool* buffer = new bool[startOfIntersects];
  for (Int_t i = 0; i < startOfIntersects; i++) buffer[i] = false;
  bool* removeThisEntry = buffer;
  bool* removeDomainEntry = buffer + count;

  AliHLTDomainEntry intersect;
  
  // This algorithm is similar to the case for the set union (operator |=), except
  // that we make sure to remove from the trigger domain all parts where the entries
  // from fEntries and domain.fEntries intersect.
  // This is done by adding the intersections to the end of fEntries such that they
  // effectively remove those overlapping trigger domain entries when calculating
  // IncludeInReadout() or Contains().
  for (Int_t i = 0; i < domain.fEntries.GetEntriesFast(); i++)
  {
    const AliHLTDomainEntry* newEntry = static_cast<const AliHLTDomainEntry*>( domain.fEntries.UncheckedAt(i) );
    for (Int_t j = 0; j < count; j++)
    {
      const AliHLTDomainEntry* currentEntry = static_cast<const AliHLTDomainEntry*>( fEntries.UncheckedAt(j) );
      if (newEntry->IntersectWith(*currentEntry, intersect))
      {
        // We can remove all intersections that were already added that will
        // become redundant when this intersection is added to fEntries.
        MarkForDeletionSubsetsOf(intersect, startOfIntersects);
        
        // Make the new intersection entry an exclusion if the newEntry and
        // currentEntry flags are the same.
        bool exclude = newEntry->Exclusive() == currentEntry->Exclusive();
        new (fEntries[newIndex++]) AliHLTDomainEntry(exclude, intersect);
        
        // We can also remove entries that are subsets of another entry in the
        // opposite list, since they will be redundant when everything is merged
        // together. For example, remove entry x from fEntries if it is a subset
        // of entry y in domain.fEntries.
        if (currentEntry->IdenticalTo(intersect)) removeThisEntry[j] = true;
        if (newEntry->IdenticalTo(intersect)) removeDomainEntry[i] = true;
      }
    }
  }

  MergeEntries(removeThisEntry, count, removeDomainEntry, startOfIntersects, domain);
  delete [] buffer;
  Optimise();
  return *this;
}


AliHLTTriggerDomain& AliHLTTriggerDomain::operator -= (const AliHLTTriggerDomain& domain)
{
  // This operator performs the set difference.
  // See header file for more details.
  
  // Mark the number of entries in fEntries now before we start adding more
  // entries from 'domain' or intersections.
  Int_t startOfIntersects = fEntries.GetEntriesFast();
  Int_t newIndex = startOfIntersects;
  
  AliHLTDomainEntry intersect;
  
  // To compute the set difference we need to remove all all parts that overlap
  // with 'domain'. i.e. we need to find all the intersects between the domain
  // entries in fEntries and those in domain.fEntries, and add the intersects
  // to the fEntries list, such that they will cancel or remove the overlapping
  // parts of the two trigger domains.
  for (Int_t i = 0; i < domain.fEntries.GetEntriesFast(); i++)
  {
    const AliHLTDomainEntry* checkEntry = static_cast<const AliHLTDomainEntry*>( domain.fEntries.UncheckedAt(i) );
    if (checkEntry->Inclusive())
    {
      // For inclusive entries we need to find the overlaps with the inclusive
      // entries in fEntries and add exclusive entries that will remove that
      // part of the trigger domain set.
      for (Int_t j = 0; j < startOfIntersects; j++)
      {
        AliHLTDomainEntry* currentEntry = static_cast<AliHLTDomainEntry*>( fEntries.UncheckedAt(j) );
        
        // We only need to consider the case where both entries are inclusive,
        // since an exclusion in fEntries already eliminates those data blocks
        // from the trigger domain set.
        if (currentEntry->Exclusive()) continue;
        
        if (checkEntry->IntersectWith(*currentEntry, intersect))
        {
          // We can remove all intersections that were already added that will
          // become redundant when this intersection is added to fEntries.
          MarkForDeletionSubsetsOf(intersect, startOfIntersects);
          
          new (fEntries[newIndex++]) AliHLTDomainEntry(kTRUE, intersect);
          if (currentEntry->IdenticalTo(intersect))
          {
            currentEntry->SetBit(BIT(14), true);
          }
        }
      }
    }
    else
    {
      // For an exclusive entry in 'domain' we need to find the intersections with
      // all of fEntries and re-apply these with the same exclude flags.
      for (Int_t j = 0; j < startOfIntersects; j++)
      {
        AliHLTDomainEntry* currentEntry = static_cast<AliHLTDomainEntry*>( fEntries.UncheckedAt(j) );
        if (checkEntry->IntersectWith(*currentEntry, intersect))
        {
          // We can remove all intersections that were already added that will
          // become redundant when this intersection is added to fEntries.
          MarkForDeletionSubsetsOf(intersect, startOfIntersects);
          
          new (fEntries[newIndex++]) AliHLTDomainEntry(currentEntry->Exclusive(), intersect);
        }
      }
    }
  }

  RemoveMarkedEntries();
  Optimise();
  return *this;
}


AliHLTTriggerDomain AliHLTTriggerDomain::operator ~ () const
{
  // Performs a set complement of the trigger domain.
  
  // The set complement is calculated by creating a new trigger domain which
  // accepts all possible data blocks, and then apply all the trigger domain
  // entries (rules / patterns) from top to bottom, but apply them with the
  // opposite meaning. For example, this->fEntries contains an inclusive domain
  // entry then remove it from the new trigger domain 'result', but if it is
  // an exclusion then add it.
  AliHLTTriggerDomain result;
  result.Add(kAliHLTAnyDataType);
  for (Int_t i = 0; i < fEntries.GetEntriesFast(); i++)
  {
    const AliHLTDomainEntry* entry = static_cast<const AliHLTDomainEntry*>( fEntries.UncheckedAt(i) );
    if (entry->Inclusive())
    {
      result.Remove(*entry);
    }
    else
    {
      result.Add(*entry);
    }
  }
  return result;
}


AliHLTTriggerDomain AliHLTTriggerDomain::operator & (const AliHLTTriggerDomain& domain) const
{
  // This operator finds the set intersect.
  // See header file for more details.
  
  AliHLTTriggerDomain result;
  Int_t newIndex = 0;
  AliHLTDomainEntry intersect;
  
  // To find the set intersect we need to compare each entry in 'domain' to those
  // of fEntries. For each inclusive entry in 'domain' we need to add to the result
  // the intersect between it and each entry of fEntries, with the same exclude flag
  // value as the domain entry from fEntries.
  // However, in principle, for the exclusion entries in 'domain' we just add them
  // to the result, since those entries do not form part of the 'domain' trigger
  // domain set, so they should not form part of the result (remember any data block
  // must be contained in both trigger domains for a set intersect).
  // In actual fact we just add the intersect of the exclusion entries in 'domain'
  // with those of fEntries to the result. This has the same overall effect, but
  // makes sure that all exclusion entries are always subsets of inclusion entries.
  for (Int_t i = 0; i < domain.fEntries.GetEntriesFast(); i++)
  {
    const AliHLTDomainEntry* checkEntry = static_cast<const AliHLTDomainEntry*>( domain.fEntries.UncheckedAt(i) );
    if (checkEntry->Inclusive())
    {
      for (Int_t j = 0; j < fEntries.GetEntriesFast(); j++)
      {
        AliHLTDomainEntry* currentEntry = static_cast<AliHLTDomainEntry*>( fEntries.UncheckedAt(j) );
        if (checkEntry->IntersectWith(*currentEntry, intersect))
        {
          // We can remove all entries that were already added to the result that
          // will become redundent because they are subsets of the new entry.
          result.MarkForDeletionSubsetsOf(intersect, 0);
          
          new (result.fEntries[newIndex++]) AliHLTDomainEntry(currentEntry->Exclusive(), intersect);
        }
      }
    }
    else
    {
      for (Int_t j = 0; j < fEntries.GetEntriesFast(); j++)
      {
        AliHLTDomainEntry* currentEntry = static_cast<AliHLTDomainEntry*>( fEntries.UncheckedAt(j) );
        if (checkEntry->IntersectWith(*currentEntry, intersect))
        {
          // We can remove all entries that were already added to the result that
          // will become redundant because they are subsets of the new entry.
          result.MarkForDeletionSubsetsOf(intersect, 0);
          
          new (result.fEntries[newIndex++]) AliHLTDomainEntry(kTRUE, intersect);
        }
      }
    }
  }

  result.RemoveMarkedEntries();
  result.Optimise();
  return result;
}


bool AliHLTTriggerDomain::operator == (const AliHLTTriggerDomain& domain) const
{
  // Checks if two domains are the same.
  
  if (fEntries.GetEntriesFast() != domain.fEntries.GetEntriesFast()) return false;
  
  // We need to find for each entry in this domain an identical entry in the domain
  // that we are comparing to. Both entries cannot have subset entries further down
  // in the entries lists. i.e. for fEntries[n], there cannot be any entry fEntries[m]
  // that is a subset of fEntries[n] where m > n. Similarly for domain.fEntries.
  // If two such entries are matched and they respect the subset rule mentioned,
  // then they are marked. We keep finding matching pairs until no more pairs are
  // found and check if there are any unmarked entries in either list. If there are
  // any unmatched pairs then the two domains do not match.
  //
  // Note: We use bit 14 in fBits to mark the entries.
  // 2) We traverse fEntries from back to front (i.e. from N-1 down to 0) so that
  //    we are guaranteed that fEntries[n] has no subset entries above it that are
  //    not marked.
  for (Int_t i = fEntries.GetEntriesFast() - 1; i >= 0; --i)
  {
    AliHLTDomainEntry* entry1 = static_cast<AliHLTDomainEntry*>(const_cast<TObject*>( fEntries.UncheckedAt(i) ));
    // Find identical domain entry in domain.fEntries.
    AliHLTDomainEntry* entry2 = NULL;
    Int_t entry2index = -1;
    for (Int_t j = fEntries.GetEntriesFast() - 1; j >= 0; --j)
    {
      AliHLTDomainEntry* current = static_cast<AliHLTDomainEntry*>(const_cast<TObject*>( domain.fEntries.UncheckedAt(j) ));
      if (current->TestBit(BIT(14))) continue;  // skip marked entries.
      if (entry1->IdenticalTo(*current) and entry1->Exclusive() == current->Exclusive())
      {
        entry2 = current;
        entry2index = j;
        break;
      }
    }
    if (entry2 == NULL)
    {
      // Could not find identical entry in domain.fEntries for fEntries[i] so we
      // will have at least one unmatched entry and thus the domains do not match.
      return false;
    }
    // Now check if entry2 has any subset entries below it. If it does then
    // it fails our ordering requirements and the domains cannot match.
    for (Int_t j = entry2index + 1; j < fEntries.GetEntriesFast(); ++j)
    {
      const AliHLTDomainEntry* current = static_cast<const AliHLTDomainEntry*>(const_cast<TObject*>( domain.fEntries.UncheckedAt(j) ));
      if (current->TestBit(BIT(14))) continue;  // skip marked entries.
      if (entry1->SubsetOf(*current)) return false;
    }
    // If we got to this point then entry1 and entry2 are a match and obey the
    // ordering rules, so mark them.
    entry1->SetBit(BIT(14), true);
    entry2->SetBit(BIT(14), true);
  }
  // At this point we could find all pairs so the domains match.
  // We now just need to clear the bits that we set.
  for (Int_t i = 0; i < fEntries.GetEntriesFast() - 1; ++i)
  {
    fEntries[i]->SetBit(BIT(14), false);
    domain.fEntries[i]->SetBit(BIT(14), false);
  }
  return true;
}


AliHLTTriggerDomain::operator AliHLTReadoutList () const
{
  // Typecast operator which constructs a readout list from the trigger domain.
  
  AliHLTReadoutList result;
  for (Int_t deti = 0; deti < AliHLTDAQ::NumberOfDetectors(); deti++)
  {
    for (Int_t i = 0; i < AliHLTDAQ::NumberOfDdls(deti); i++)
    {
      Int_t ddlId = AliHLTDAQ::DdlID(deti, i);
      AliHLTComponentDataType type = AliHLTComponentDataTypeInitializer(kAliHLTDAQRDOUTDataTypeID, AliHLTDAQ::OnlineName(deti));
      if (Contains(AliHLTDomainEntry(type, ddlId)))
      {
        result.EnableDDLBit(ddlId);
      }
    }
  }
  return result;
}


void AliHLTTriggerDomain::MergeEntries(
    const bool* removeThisEntry, Int_t entriesCount,
    const bool* removeDomainEntry, Int_t startOfIntersects,
    const AliHLTTriggerDomain& domain
  )
{
  // Merges the entries in this trigger domain with the ones in 'domain', while
  // removing all entries that were marked for removal.
  // See header file for more information.
  
  bool anythingRemoved = false;
  
  // Remember this method is used at the end of the calculation of the binary operators
  // and that fEntries is expected to be partitioned into 3 regions.
  //   - 0..entriesCount-1 : contains the original (initial) entries of this trigger domain.
  //   - entriesCount..startOfIntersects-1 : is space reserved for the new entries
  //       from the given trigger domain 'domain' being processed.
  //   - startOfIntersects..fEntries.GetEntriesFast()-1 : contains all new domain entry
  //       intersection created and added to fEntries.
  //
  // First we need to remove all entries marked for removal from the original entries.
  for (Int_t i = 0; i < entriesCount; i++)
  {
    if (removeThisEntry[i])
    {
      fEntries.RemoveAt(i);
      anythingRemoved = true;
    }
  }
  
  // Now we copy over all the new entries from 'domain' which were not marked for removal
  // and indicate anythingRemoved = true since there will now be gaps in the clones array
  // that need to be compressed away later.
  for (Int_t i = 0; i < domain.fEntries.GetEntriesFast(); i++)
  {
    if (removeDomainEntry[i])
    {
      anythingRemoved = true;
    }
    else
    {
      const AliHLTDomainEntry* newEntry = static_cast<const AliHLTDomainEntry*>( domain.fEntries.UncheckedAt(i) );
      new (fEntries[entriesCount+i]) AliHLTDomainEntry(*newEntry);
    }
  }
  
  // Finally remove all new intersection entries that were marked for removal by
  // the MarkForDeletionSubsetsOf method.
  for (Int_t i = startOfIntersects; i < fEntries.GetEntriesFast(); i++)
  {
    const AliHLTDomainEntry* ientry = static_cast<const AliHLTDomainEntry*>( fEntries.UncheckedAt(i) );
    if (ientry->TestBit(BIT(14)))
    {
      fEntries.RemoveAt(i);
      anythingRemoved = true;
    }
  }
  if (anythingRemoved) fEntries.Compress();
}


void AliHLTTriggerDomain::MarkForDeletionSubsetsOf(const AliHLTDomainEntry& entry, Int_t min)
{
  // Marks for deletion all the entries in this trigger domain that are subsets
  // of the given entry.
  // See header file for more information.

  AliHLTDomainEntry intersect;
  for (Int_t i = min; i < fEntries.GetEntriesFast(); i++)
  {
    AliHLTDomainEntry* ientry = static_cast<AliHLTDomainEntry*>( fEntries.UncheckedAt(i) );
    if (ientry->TestBit(BIT(14))) continue;
    if (ientry->SubsetOf(entry))
    {
      ientry->SetBit(BIT(14), true);
    }
  }
}


void AliHLTTriggerDomain::RemoveMarkedEntries()
{
  // Removes all entries in this trigger domain which were marked for removal.
  // See header file for more information.
  
  bool anythingRemoved = false;
  for (Int_t i = 0; i < fEntries.GetEntriesFast(); i++)
  {
    const AliHLTDomainEntry* ientry = static_cast<const AliHLTDomainEntry*>( fEntries.UncheckedAt(i) );
    if (ientry->TestBit(BIT(14)))
    {
      fEntries.RemoveAt(i);
      anythingRemoved = true;
    }
  }
  if (anythingRemoved) fEntries.Compress();
}


void AliHLTTriggerDomain::Optimise()
{
  // Removes redundant trigger domain entries from the trigger domain.
  // See header file for more information.

  AliHLTDomainEntry intersect;
  
  // Check that the first entry is not and exclusion which would be redundent.
  if (fEntries.GetEntriesFast() == 0) return;
  AliHLTDomainEntry* firstEntry = static_cast<AliHLTDomainEntry*>( fEntries[0] );
  if (firstEntry->Exclusive()) firstEntry->SetBit(BIT(14), true);
  
  for (Int_t i = 1; i < fEntries.GetEntriesFast(); i++)
  {
    AliHLTDomainEntry* ientry = static_cast<AliHLTDomainEntry*>( fEntries.UncheckedAt(i) );
    
    // For the i'th entry in fEntries, compare it in reverse order with all other
    // entries that are before it and look for redundant ones, i.e. that are subsets
    // of the i'th entry.
    for (Int_t j = i-1; j >= 0; j--)
    {
      AliHLTDomainEntry* jentry = static_cast<AliHLTDomainEntry*>( fEntries.UncheckedAt(j) );
      if (jentry->TestBit(BIT(14))) continue;
      // Find entries that intersect
      if (jentry->SubsetOf(*ientry))
      {
        // jentry is a subset of ientry so it is redundant because for all values
        // ientry will override jentry when calling IncludeInReadout.
        jentry->SetBit(BIT(14), true);
      }
      else if (*ientry == *jentry)
      {
        // If intersecting entries have opposite exclude flags then search no further,
        // we know that we will need this entry for correct behaviour of IncludeInReadout.
        if (ientry->Inclusive() == jentry->Exclusive()) goto processNextEntry;
        
        if (ientry->SubsetOf(*jentry))
        {
          ientry->SetBit(BIT(14), true);
          goto processNextEntry;
        }
      }
    }
    
    // If we got to this point then we hit the top of the trigger domain rules
    // (pattern matching) list without hitting any and overlapping entries.
    // So now we need to check if ientry is an exclusion. If it is, then it is
    // redundant and we can mark it for removal.
    if (ientry->Exclusive()) ientry->SetBit(BIT(14), true);
    
    processNextEntry: ;
  }
  
  RemoveMarkedEntries();
}

const AliHLTDomainEntry& AliHLTTriggerDomain::operator[](int index) const
{
  // Access individual entry of the domain
  return static_cast<AliHLTDomainEntry&>(*fEntries[index]);
}
 AliHLTTriggerDomain.cxx:1
 AliHLTTriggerDomain.cxx:2
 AliHLTTriggerDomain.cxx:3
 AliHLTTriggerDomain.cxx:4
 AliHLTTriggerDomain.cxx:5
 AliHLTTriggerDomain.cxx:6
 AliHLTTriggerDomain.cxx:7
 AliHLTTriggerDomain.cxx:8
 AliHLTTriggerDomain.cxx:9
 AliHLTTriggerDomain.cxx:10
 AliHLTTriggerDomain.cxx:11
 AliHLTTriggerDomain.cxx:12
 AliHLTTriggerDomain.cxx:13
 AliHLTTriggerDomain.cxx:14
 AliHLTTriggerDomain.cxx:15
 AliHLTTriggerDomain.cxx:16
 AliHLTTriggerDomain.cxx:17
 AliHLTTriggerDomain.cxx:18
 AliHLTTriggerDomain.cxx:19
 AliHLTTriggerDomain.cxx:20
 AliHLTTriggerDomain.cxx:21
 AliHLTTriggerDomain.cxx:22
 AliHLTTriggerDomain.cxx:23
 AliHLTTriggerDomain.cxx:24
 AliHLTTriggerDomain.cxx:25
 AliHLTTriggerDomain.cxx:26
 AliHLTTriggerDomain.cxx:27
 AliHLTTriggerDomain.cxx:28
 AliHLTTriggerDomain.cxx:29
 AliHLTTriggerDomain.cxx:30
 AliHLTTriggerDomain.cxx:31
 AliHLTTriggerDomain.cxx:32
 AliHLTTriggerDomain.cxx:33
 AliHLTTriggerDomain.cxx:34
 AliHLTTriggerDomain.cxx:35
 AliHLTTriggerDomain.cxx:36
 AliHLTTriggerDomain.cxx:37
 AliHLTTriggerDomain.cxx:38
 AliHLTTriggerDomain.cxx:39
 AliHLTTriggerDomain.cxx:40
 AliHLTTriggerDomain.cxx:41
 AliHLTTriggerDomain.cxx:42
 AliHLTTriggerDomain.cxx:43
 AliHLTTriggerDomain.cxx:44
 AliHLTTriggerDomain.cxx:45
 AliHLTTriggerDomain.cxx:46
 AliHLTTriggerDomain.cxx:47
 AliHLTTriggerDomain.cxx:48
 AliHLTTriggerDomain.cxx:49
 AliHLTTriggerDomain.cxx:50
 AliHLTTriggerDomain.cxx:51
 AliHLTTriggerDomain.cxx:52
 AliHLTTriggerDomain.cxx:53
 AliHLTTriggerDomain.cxx:54
 AliHLTTriggerDomain.cxx:55
 AliHLTTriggerDomain.cxx:56
 AliHLTTriggerDomain.cxx:57
 AliHLTTriggerDomain.cxx:58
 AliHLTTriggerDomain.cxx:59
 AliHLTTriggerDomain.cxx:60
 AliHLTTriggerDomain.cxx:61
 AliHLTTriggerDomain.cxx:62
 AliHLTTriggerDomain.cxx:63
 AliHLTTriggerDomain.cxx:64
 AliHLTTriggerDomain.cxx:65
 AliHLTTriggerDomain.cxx:66
 AliHLTTriggerDomain.cxx:67
 AliHLTTriggerDomain.cxx:68
 AliHLTTriggerDomain.cxx:69
 AliHLTTriggerDomain.cxx:70
 AliHLTTriggerDomain.cxx:71
 AliHLTTriggerDomain.cxx:72
 AliHLTTriggerDomain.cxx:73
 AliHLTTriggerDomain.cxx:74
 AliHLTTriggerDomain.cxx:75
 AliHLTTriggerDomain.cxx:76
 AliHLTTriggerDomain.cxx:77
 AliHLTTriggerDomain.cxx:78
 AliHLTTriggerDomain.cxx:79
 AliHLTTriggerDomain.cxx:80
 AliHLTTriggerDomain.cxx:81
 AliHLTTriggerDomain.cxx:82
 AliHLTTriggerDomain.cxx:83
 AliHLTTriggerDomain.cxx:84
 AliHLTTriggerDomain.cxx:85
 AliHLTTriggerDomain.cxx:86
 AliHLTTriggerDomain.cxx:87
 AliHLTTriggerDomain.cxx:88
 AliHLTTriggerDomain.cxx:89
 AliHLTTriggerDomain.cxx:90
 AliHLTTriggerDomain.cxx:91
 AliHLTTriggerDomain.cxx:92
 AliHLTTriggerDomain.cxx:93
 AliHLTTriggerDomain.cxx:94
 AliHLTTriggerDomain.cxx:95
 AliHLTTriggerDomain.cxx:96
 AliHLTTriggerDomain.cxx:97
 AliHLTTriggerDomain.cxx:98
 AliHLTTriggerDomain.cxx:99
 AliHLTTriggerDomain.cxx:100
 AliHLTTriggerDomain.cxx:101
 AliHLTTriggerDomain.cxx:102
 AliHLTTriggerDomain.cxx:103
 AliHLTTriggerDomain.cxx:104
 AliHLTTriggerDomain.cxx:105
 AliHLTTriggerDomain.cxx:106
 AliHLTTriggerDomain.cxx:107
 AliHLTTriggerDomain.cxx:108
 AliHLTTriggerDomain.cxx:109
 AliHLTTriggerDomain.cxx:110
 AliHLTTriggerDomain.cxx:111
 AliHLTTriggerDomain.cxx:112
 AliHLTTriggerDomain.cxx:113
 AliHLTTriggerDomain.cxx:114
 AliHLTTriggerDomain.cxx:115
 AliHLTTriggerDomain.cxx:116
 AliHLTTriggerDomain.cxx:117
 AliHLTTriggerDomain.cxx:118
 AliHLTTriggerDomain.cxx:119
 AliHLTTriggerDomain.cxx:120
 AliHLTTriggerDomain.cxx:121
 AliHLTTriggerDomain.cxx:122
 AliHLTTriggerDomain.cxx:123
 AliHLTTriggerDomain.cxx:124
 AliHLTTriggerDomain.cxx:125
 AliHLTTriggerDomain.cxx:126
 AliHLTTriggerDomain.cxx:127
 AliHLTTriggerDomain.cxx:128
 AliHLTTriggerDomain.cxx:129
 AliHLTTriggerDomain.cxx:130
 AliHLTTriggerDomain.cxx:131
 AliHLTTriggerDomain.cxx:132
 AliHLTTriggerDomain.cxx:133
 AliHLTTriggerDomain.cxx:134
 AliHLTTriggerDomain.cxx:135
 AliHLTTriggerDomain.cxx:136
 AliHLTTriggerDomain.cxx:137
 AliHLTTriggerDomain.cxx:138
 AliHLTTriggerDomain.cxx:139
 AliHLTTriggerDomain.cxx:140
 AliHLTTriggerDomain.cxx:141
 AliHLTTriggerDomain.cxx:142
 AliHLTTriggerDomain.cxx:143
 AliHLTTriggerDomain.cxx:144
 AliHLTTriggerDomain.cxx:145
 AliHLTTriggerDomain.cxx:146
 AliHLTTriggerDomain.cxx:147
 AliHLTTriggerDomain.cxx:148
 AliHLTTriggerDomain.cxx:149
 AliHLTTriggerDomain.cxx:150
 AliHLTTriggerDomain.cxx:151
 AliHLTTriggerDomain.cxx:152
 AliHLTTriggerDomain.cxx:153
 AliHLTTriggerDomain.cxx:154
 AliHLTTriggerDomain.cxx:155
 AliHLTTriggerDomain.cxx:156
 AliHLTTriggerDomain.cxx:157
 AliHLTTriggerDomain.cxx:158
 AliHLTTriggerDomain.cxx:159
 AliHLTTriggerDomain.cxx:160
 AliHLTTriggerDomain.cxx:161
 AliHLTTriggerDomain.cxx:162
 AliHLTTriggerDomain.cxx:163
 AliHLTTriggerDomain.cxx:164
 AliHLTTriggerDomain.cxx:165
 AliHLTTriggerDomain.cxx:166
 AliHLTTriggerDomain.cxx:167
 AliHLTTriggerDomain.cxx:168
 AliHLTTriggerDomain.cxx:169
 AliHLTTriggerDomain.cxx:170
 AliHLTTriggerDomain.cxx:171
 AliHLTTriggerDomain.cxx:172
 AliHLTTriggerDomain.cxx:173
 AliHLTTriggerDomain.cxx:174
 AliHLTTriggerDomain.cxx:175
 AliHLTTriggerDomain.cxx:176
 AliHLTTriggerDomain.cxx:177
 AliHLTTriggerDomain.cxx:178
 AliHLTTriggerDomain.cxx:179
 AliHLTTriggerDomain.cxx:180
 AliHLTTriggerDomain.cxx:181
 AliHLTTriggerDomain.cxx:182
 AliHLTTriggerDomain.cxx:183
 AliHLTTriggerDomain.cxx:184
 AliHLTTriggerDomain.cxx:185
 AliHLTTriggerDomain.cxx:186
 AliHLTTriggerDomain.cxx:187
 AliHLTTriggerDomain.cxx:188
 AliHLTTriggerDomain.cxx:189
 AliHLTTriggerDomain.cxx:190
 AliHLTTriggerDomain.cxx:191
 AliHLTTriggerDomain.cxx:192
 AliHLTTriggerDomain.cxx:193
 AliHLTTriggerDomain.cxx:194
 AliHLTTriggerDomain.cxx:195
 AliHLTTriggerDomain.cxx:196
 AliHLTTriggerDomain.cxx:197
 AliHLTTriggerDomain.cxx:198
 AliHLTTriggerDomain.cxx:199
 AliHLTTriggerDomain.cxx:200
 AliHLTTriggerDomain.cxx:201
 AliHLTTriggerDomain.cxx:202
 AliHLTTriggerDomain.cxx:203
 AliHLTTriggerDomain.cxx:204
 AliHLTTriggerDomain.cxx:205
 AliHLTTriggerDomain.cxx:206
 AliHLTTriggerDomain.cxx:207
 AliHLTTriggerDomain.cxx:208
 AliHLTTriggerDomain.cxx:209
 AliHLTTriggerDomain.cxx:210
 AliHLTTriggerDomain.cxx:211
 AliHLTTriggerDomain.cxx:212
 AliHLTTriggerDomain.cxx:213
 AliHLTTriggerDomain.cxx:214
 AliHLTTriggerDomain.cxx:215
 AliHLTTriggerDomain.cxx:216
 AliHLTTriggerDomain.cxx:217
 AliHLTTriggerDomain.cxx:218
 AliHLTTriggerDomain.cxx:219
 AliHLTTriggerDomain.cxx:220
 AliHLTTriggerDomain.cxx:221
 AliHLTTriggerDomain.cxx:222
 AliHLTTriggerDomain.cxx:223
 AliHLTTriggerDomain.cxx:224
 AliHLTTriggerDomain.cxx:225
 AliHLTTriggerDomain.cxx:226
 AliHLTTriggerDomain.cxx:227
 AliHLTTriggerDomain.cxx:228
 AliHLTTriggerDomain.cxx:229
 AliHLTTriggerDomain.cxx:230
 AliHLTTriggerDomain.cxx:231
 AliHLTTriggerDomain.cxx:232
 AliHLTTriggerDomain.cxx:233
 AliHLTTriggerDomain.cxx:234
 AliHLTTriggerDomain.cxx:235
 AliHLTTriggerDomain.cxx:236
 AliHLTTriggerDomain.cxx:237
 AliHLTTriggerDomain.cxx:238
 AliHLTTriggerDomain.cxx:239
 AliHLTTriggerDomain.cxx:240
 AliHLTTriggerDomain.cxx:241
 AliHLTTriggerDomain.cxx:242
 AliHLTTriggerDomain.cxx:243
 AliHLTTriggerDomain.cxx:244
 AliHLTTriggerDomain.cxx:245
 AliHLTTriggerDomain.cxx:246
 AliHLTTriggerDomain.cxx:247
 AliHLTTriggerDomain.cxx:248
 AliHLTTriggerDomain.cxx:249
 AliHLTTriggerDomain.cxx:250
 AliHLTTriggerDomain.cxx:251
 AliHLTTriggerDomain.cxx:252
 AliHLTTriggerDomain.cxx:253
 AliHLTTriggerDomain.cxx:254
 AliHLTTriggerDomain.cxx:255
 AliHLTTriggerDomain.cxx:256
 AliHLTTriggerDomain.cxx:257
 AliHLTTriggerDomain.cxx:258
 AliHLTTriggerDomain.cxx:259
 AliHLTTriggerDomain.cxx:260
 AliHLTTriggerDomain.cxx:261
 AliHLTTriggerDomain.cxx:262
 AliHLTTriggerDomain.cxx:263
 AliHLTTriggerDomain.cxx:264
 AliHLTTriggerDomain.cxx:265
 AliHLTTriggerDomain.cxx:266
 AliHLTTriggerDomain.cxx:267
 AliHLTTriggerDomain.cxx:268
 AliHLTTriggerDomain.cxx:269
 AliHLTTriggerDomain.cxx:270
 AliHLTTriggerDomain.cxx:271
 AliHLTTriggerDomain.cxx:272
 AliHLTTriggerDomain.cxx:273
 AliHLTTriggerDomain.cxx:274
 AliHLTTriggerDomain.cxx:275
 AliHLTTriggerDomain.cxx:276
 AliHLTTriggerDomain.cxx:277
 AliHLTTriggerDomain.cxx:278
 AliHLTTriggerDomain.cxx:279
 AliHLTTriggerDomain.cxx:280
 AliHLTTriggerDomain.cxx:281
 AliHLTTriggerDomain.cxx:282
 AliHLTTriggerDomain.cxx:283
 AliHLTTriggerDomain.cxx:284
 AliHLTTriggerDomain.cxx:285
 AliHLTTriggerDomain.cxx:286
 AliHLTTriggerDomain.cxx:287
 AliHLTTriggerDomain.cxx:288
 AliHLTTriggerDomain.cxx:289
 AliHLTTriggerDomain.cxx:290
 AliHLTTriggerDomain.cxx:291
 AliHLTTriggerDomain.cxx:292
 AliHLTTriggerDomain.cxx:293
 AliHLTTriggerDomain.cxx:294
 AliHLTTriggerDomain.cxx:295
 AliHLTTriggerDomain.cxx:296
 AliHLTTriggerDomain.cxx:297
 AliHLTTriggerDomain.cxx:298
 AliHLTTriggerDomain.cxx:299
 AliHLTTriggerDomain.cxx:300
 AliHLTTriggerDomain.cxx:301
 AliHLTTriggerDomain.cxx:302
 AliHLTTriggerDomain.cxx:303
 AliHLTTriggerDomain.cxx:304
 AliHLTTriggerDomain.cxx:305
 AliHLTTriggerDomain.cxx:306
 AliHLTTriggerDomain.cxx:307
 AliHLTTriggerDomain.cxx:308
 AliHLTTriggerDomain.cxx:309
 AliHLTTriggerDomain.cxx:310
 AliHLTTriggerDomain.cxx:311
 AliHLTTriggerDomain.cxx:312
 AliHLTTriggerDomain.cxx:313
 AliHLTTriggerDomain.cxx:314
 AliHLTTriggerDomain.cxx:315
 AliHLTTriggerDomain.cxx:316
 AliHLTTriggerDomain.cxx:317
 AliHLTTriggerDomain.cxx:318
 AliHLTTriggerDomain.cxx:319
 AliHLTTriggerDomain.cxx:320
 AliHLTTriggerDomain.cxx:321
 AliHLTTriggerDomain.cxx:322
 AliHLTTriggerDomain.cxx:323
 AliHLTTriggerDomain.cxx:324
 AliHLTTriggerDomain.cxx:325
 AliHLTTriggerDomain.cxx:326
 AliHLTTriggerDomain.cxx:327
 AliHLTTriggerDomain.cxx:328
 AliHLTTriggerDomain.cxx:329
 AliHLTTriggerDomain.cxx:330
 AliHLTTriggerDomain.cxx:331
 AliHLTTriggerDomain.cxx:332
 AliHLTTriggerDomain.cxx:333
 AliHLTTriggerDomain.cxx:334
 AliHLTTriggerDomain.cxx:335
 AliHLTTriggerDomain.cxx:336
 AliHLTTriggerDomain.cxx:337
 AliHLTTriggerDomain.cxx:338
 AliHLTTriggerDomain.cxx:339
 AliHLTTriggerDomain.cxx:340
 AliHLTTriggerDomain.cxx:341
 AliHLTTriggerDomain.cxx:342
 AliHLTTriggerDomain.cxx:343
 AliHLTTriggerDomain.cxx:344
 AliHLTTriggerDomain.cxx:345
 AliHLTTriggerDomain.cxx:346
 AliHLTTriggerDomain.cxx:347
 AliHLTTriggerDomain.cxx:348
 AliHLTTriggerDomain.cxx:349
 AliHLTTriggerDomain.cxx:350
 AliHLTTriggerDomain.cxx:351
 AliHLTTriggerDomain.cxx:352
 AliHLTTriggerDomain.cxx:353
 AliHLTTriggerDomain.cxx:354
 AliHLTTriggerDomain.cxx:355
 AliHLTTriggerDomain.cxx:356
 AliHLTTriggerDomain.cxx:357
 AliHLTTriggerDomain.cxx:358
 AliHLTTriggerDomain.cxx:359
 AliHLTTriggerDomain.cxx:360
 AliHLTTriggerDomain.cxx:361
 AliHLTTriggerDomain.cxx:362
 AliHLTTriggerDomain.cxx:363
 AliHLTTriggerDomain.cxx:364
 AliHLTTriggerDomain.cxx:365
 AliHLTTriggerDomain.cxx:366
 AliHLTTriggerDomain.cxx:367
 AliHLTTriggerDomain.cxx:368
 AliHLTTriggerDomain.cxx:369
 AliHLTTriggerDomain.cxx:370
 AliHLTTriggerDomain.cxx:371
 AliHLTTriggerDomain.cxx:372
 AliHLTTriggerDomain.cxx:373
 AliHLTTriggerDomain.cxx:374
 AliHLTTriggerDomain.cxx:375
 AliHLTTriggerDomain.cxx:376
 AliHLTTriggerDomain.cxx:377
 AliHLTTriggerDomain.cxx:378
 AliHLTTriggerDomain.cxx:379
 AliHLTTriggerDomain.cxx:380
 AliHLTTriggerDomain.cxx:381
 AliHLTTriggerDomain.cxx:382
 AliHLTTriggerDomain.cxx:383
 AliHLTTriggerDomain.cxx:384
 AliHLTTriggerDomain.cxx:385
 AliHLTTriggerDomain.cxx:386
 AliHLTTriggerDomain.cxx:387
 AliHLTTriggerDomain.cxx:388
 AliHLTTriggerDomain.cxx:389
 AliHLTTriggerDomain.cxx:390
 AliHLTTriggerDomain.cxx:391
 AliHLTTriggerDomain.cxx:392
 AliHLTTriggerDomain.cxx:393
 AliHLTTriggerDomain.cxx:394
 AliHLTTriggerDomain.cxx:395
 AliHLTTriggerDomain.cxx:396
 AliHLTTriggerDomain.cxx:397
 AliHLTTriggerDomain.cxx:398
 AliHLTTriggerDomain.cxx:399
 AliHLTTriggerDomain.cxx:400
 AliHLTTriggerDomain.cxx:401
 AliHLTTriggerDomain.cxx:402
 AliHLTTriggerDomain.cxx:403
 AliHLTTriggerDomain.cxx:404
 AliHLTTriggerDomain.cxx:405
 AliHLTTriggerDomain.cxx:406
 AliHLTTriggerDomain.cxx:407
 AliHLTTriggerDomain.cxx:408
 AliHLTTriggerDomain.cxx:409
 AliHLTTriggerDomain.cxx:410
 AliHLTTriggerDomain.cxx:411
 AliHLTTriggerDomain.cxx:412
 AliHLTTriggerDomain.cxx:413
 AliHLTTriggerDomain.cxx:414
 AliHLTTriggerDomain.cxx:415
 AliHLTTriggerDomain.cxx:416
 AliHLTTriggerDomain.cxx:417
 AliHLTTriggerDomain.cxx:418
 AliHLTTriggerDomain.cxx:419
 AliHLTTriggerDomain.cxx:420
 AliHLTTriggerDomain.cxx:421
 AliHLTTriggerDomain.cxx:422
 AliHLTTriggerDomain.cxx:423
 AliHLTTriggerDomain.cxx:424
 AliHLTTriggerDomain.cxx:425
 AliHLTTriggerDomain.cxx:426
 AliHLTTriggerDomain.cxx:427
 AliHLTTriggerDomain.cxx:428
 AliHLTTriggerDomain.cxx:429
 AliHLTTriggerDomain.cxx:430
 AliHLTTriggerDomain.cxx:431
 AliHLTTriggerDomain.cxx:432
 AliHLTTriggerDomain.cxx:433
 AliHLTTriggerDomain.cxx:434
 AliHLTTriggerDomain.cxx:435
 AliHLTTriggerDomain.cxx:436
 AliHLTTriggerDomain.cxx:437
 AliHLTTriggerDomain.cxx:438
 AliHLTTriggerDomain.cxx:439
 AliHLTTriggerDomain.cxx:440
 AliHLTTriggerDomain.cxx:441
 AliHLTTriggerDomain.cxx:442
 AliHLTTriggerDomain.cxx:443
 AliHLTTriggerDomain.cxx:444
 AliHLTTriggerDomain.cxx:445
 AliHLTTriggerDomain.cxx:446
 AliHLTTriggerDomain.cxx:447
 AliHLTTriggerDomain.cxx:448
 AliHLTTriggerDomain.cxx:449
 AliHLTTriggerDomain.cxx:450
 AliHLTTriggerDomain.cxx:451
 AliHLTTriggerDomain.cxx:452
 AliHLTTriggerDomain.cxx:453
 AliHLTTriggerDomain.cxx:454
 AliHLTTriggerDomain.cxx:455
 AliHLTTriggerDomain.cxx:456
 AliHLTTriggerDomain.cxx:457
 AliHLTTriggerDomain.cxx:458
 AliHLTTriggerDomain.cxx:459
 AliHLTTriggerDomain.cxx:460
 AliHLTTriggerDomain.cxx:461
 AliHLTTriggerDomain.cxx:462
 AliHLTTriggerDomain.cxx:463
 AliHLTTriggerDomain.cxx:464
 AliHLTTriggerDomain.cxx:465
 AliHLTTriggerDomain.cxx:466
 AliHLTTriggerDomain.cxx:467
 AliHLTTriggerDomain.cxx:468
 AliHLTTriggerDomain.cxx:469
 AliHLTTriggerDomain.cxx:470
 AliHLTTriggerDomain.cxx:471
 AliHLTTriggerDomain.cxx:472
 AliHLTTriggerDomain.cxx:473
 AliHLTTriggerDomain.cxx:474
 AliHLTTriggerDomain.cxx:475
 AliHLTTriggerDomain.cxx:476
 AliHLTTriggerDomain.cxx:477
 AliHLTTriggerDomain.cxx:478
 AliHLTTriggerDomain.cxx:479
 AliHLTTriggerDomain.cxx:480
 AliHLTTriggerDomain.cxx:481
 AliHLTTriggerDomain.cxx:482
 AliHLTTriggerDomain.cxx:483
 AliHLTTriggerDomain.cxx:484
 AliHLTTriggerDomain.cxx:485
 AliHLTTriggerDomain.cxx:486
 AliHLTTriggerDomain.cxx:487
 AliHLTTriggerDomain.cxx:488
 AliHLTTriggerDomain.cxx:489
 AliHLTTriggerDomain.cxx:490
 AliHLTTriggerDomain.cxx:491
 AliHLTTriggerDomain.cxx:492
 AliHLTTriggerDomain.cxx:493
 AliHLTTriggerDomain.cxx:494
 AliHLTTriggerDomain.cxx:495
 AliHLTTriggerDomain.cxx:496
 AliHLTTriggerDomain.cxx:497
 AliHLTTriggerDomain.cxx:498
 AliHLTTriggerDomain.cxx:499
 AliHLTTriggerDomain.cxx:500
 AliHLTTriggerDomain.cxx:501
 AliHLTTriggerDomain.cxx:502
 AliHLTTriggerDomain.cxx:503
 AliHLTTriggerDomain.cxx:504
 AliHLTTriggerDomain.cxx:505
 AliHLTTriggerDomain.cxx:506
 AliHLTTriggerDomain.cxx:507
 AliHLTTriggerDomain.cxx:508
 AliHLTTriggerDomain.cxx:509
 AliHLTTriggerDomain.cxx:510
 AliHLTTriggerDomain.cxx:511
 AliHLTTriggerDomain.cxx:512
 AliHLTTriggerDomain.cxx:513
 AliHLTTriggerDomain.cxx:514
 AliHLTTriggerDomain.cxx:515
 AliHLTTriggerDomain.cxx:516
 AliHLTTriggerDomain.cxx:517
 AliHLTTriggerDomain.cxx:518
 AliHLTTriggerDomain.cxx:519
 AliHLTTriggerDomain.cxx:520
 AliHLTTriggerDomain.cxx:521
 AliHLTTriggerDomain.cxx:522
 AliHLTTriggerDomain.cxx:523
 AliHLTTriggerDomain.cxx:524
 AliHLTTriggerDomain.cxx:525
 AliHLTTriggerDomain.cxx:526
 AliHLTTriggerDomain.cxx:527
 AliHLTTriggerDomain.cxx:528
 AliHLTTriggerDomain.cxx:529
 AliHLTTriggerDomain.cxx:530
 AliHLTTriggerDomain.cxx:531
 AliHLTTriggerDomain.cxx:532
 AliHLTTriggerDomain.cxx:533
 AliHLTTriggerDomain.cxx:534
 AliHLTTriggerDomain.cxx:535
 AliHLTTriggerDomain.cxx:536
 AliHLTTriggerDomain.cxx:537
 AliHLTTriggerDomain.cxx:538
 AliHLTTriggerDomain.cxx:539
 AliHLTTriggerDomain.cxx:540
 AliHLTTriggerDomain.cxx:541
 AliHLTTriggerDomain.cxx:542
 AliHLTTriggerDomain.cxx:543
 AliHLTTriggerDomain.cxx:544
 AliHLTTriggerDomain.cxx:545
 AliHLTTriggerDomain.cxx:546
 AliHLTTriggerDomain.cxx:547
 AliHLTTriggerDomain.cxx:548
 AliHLTTriggerDomain.cxx:549
 AliHLTTriggerDomain.cxx:550
 AliHLTTriggerDomain.cxx:551
 AliHLTTriggerDomain.cxx:552
 AliHLTTriggerDomain.cxx:553
 AliHLTTriggerDomain.cxx:554
 AliHLTTriggerDomain.cxx:555
 AliHLTTriggerDomain.cxx:556
 AliHLTTriggerDomain.cxx:557
 AliHLTTriggerDomain.cxx:558
 AliHLTTriggerDomain.cxx:559
 AliHLTTriggerDomain.cxx:560
 AliHLTTriggerDomain.cxx:561
 AliHLTTriggerDomain.cxx:562
 AliHLTTriggerDomain.cxx:563
 AliHLTTriggerDomain.cxx:564
 AliHLTTriggerDomain.cxx:565
 AliHLTTriggerDomain.cxx:566
 AliHLTTriggerDomain.cxx:567
 AliHLTTriggerDomain.cxx:568
 AliHLTTriggerDomain.cxx:569
 AliHLTTriggerDomain.cxx:570
 AliHLTTriggerDomain.cxx:571
 AliHLTTriggerDomain.cxx:572
 AliHLTTriggerDomain.cxx:573
 AliHLTTriggerDomain.cxx:574
 AliHLTTriggerDomain.cxx:575
 AliHLTTriggerDomain.cxx:576
 AliHLTTriggerDomain.cxx:577
 AliHLTTriggerDomain.cxx:578
 AliHLTTriggerDomain.cxx:579
 AliHLTTriggerDomain.cxx:580
 AliHLTTriggerDomain.cxx:581
 AliHLTTriggerDomain.cxx:582
 AliHLTTriggerDomain.cxx:583
 AliHLTTriggerDomain.cxx:584
 AliHLTTriggerDomain.cxx:585
 AliHLTTriggerDomain.cxx:586
 AliHLTTriggerDomain.cxx:587
 AliHLTTriggerDomain.cxx:588
 AliHLTTriggerDomain.cxx:589
 AliHLTTriggerDomain.cxx:590
 AliHLTTriggerDomain.cxx:591
 AliHLTTriggerDomain.cxx:592
 AliHLTTriggerDomain.cxx:593
 AliHLTTriggerDomain.cxx:594
 AliHLTTriggerDomain.cxx:595
 AliHLTTriggerDomain.cxx:596
 AliHLTTriggerDomain.cxx:597
 AliHLTTriggerDomain.cxx:598
 AliHLTTriggerDomain.cxx:599
 AliHLTTriggerDomain.cxx:600
 AliHLTTriggerDomain.cxx:601
 AliHLTTriggerDomain.cxx:602
 AliHLTTriggerDomain.cxx:603
 AliHLTTriggerDomain.cxx:604
 AliHLTTriggerDomain.cxx:605
 AliHLTTriggerDomain.cxx:606
 AliHLTTriggerDomain.cxx:607
 AliHLTTriggerDomain.cxx:608
 AliHLTTriggerDomain.cxx:609
 AliHLTTriggerDomain.cxx:610
 AliHLTTriggerDomain.cxx:611
 AliHLTTriggerDomain.cxx:612
 AliHLTTriggerDomain.cxx:613
 AliHLTTriggerDomain.cxx:614
 AliHLTTriggerDomain.cxx:615
 AliHLTTriggerDomain.cxx:616
 AliHLTTriggerDomain.cxx:617
 AliHLTTriggerDomain.cxx:618
 AliHLTTriggerDomain.cxx:619
 AliHLTTriggerDomain.cxx:620
 AliHLTTriggerDomain.cxx:621
 AliHLTTriggerDomain.cxx:622
 AliHLTTriggerDomain.cxx:623
 AliHLTTriggerDomain.cxx:624
 AliHLTTriggerDomain.cxx:625
 AliHLTTriggerDomain.cxx:626
 AliHLTTriggerDomain.cxx:627
 AliHLTTriggerDomain.cxx:628
 AliHLTTriggerDomain.cxx:629
 AliHLTTriggerDomain.cxx:630
 AliHLTTriggerDomain.cxx:631
 AliHLTTriggerDomain.cxx:632
 AliHLTTriggerDomain.cxx:633
 AliHLTTriggerDomain.cxx:634
 AliHLTTriggerDomain.cxx:635
 AliHLTTriggerDomain.cxx:636
 AliHLTTriggerDomain.cxx:637
 AliHLTTriggerDomain.cxx:638
 AliHLTTriggerDomain.cxx:639
 AliHLTTriggerDomain.cxx:640
 AliHLTTriggerDomain.cxx:641
 AliHLTTriggerDomain.cxx:642
 AliHLTTriggerDomain.cxx:643
 AliHLTTriggerDomain.cxx:644
 AliHLTTriggerDomain.cxx:645
 AliHLTTriggerDomain.cxx:646
 AliHLTTriggerDomain.cxx:647
 AliHLTTriggerDomain.cxx:648
 AliHLTTriggerDomain.cxx:649
 AliHLTTriggerDomain.cxx:650
 AliHLTTriggerDomain.cxx:651
 AliHLTTriggerDomain.cxx:652
 AliHLTTriggerDomain.cxx:653
 AliHLTTriggerDomain.cxx:654
 AliHLTTriggerDomain.cxx:655
 AliHLTTriggerDomain.cxx:656
 AliHLTTriggerDomain.cxx:657
 AliHLTTriggerDomain.cxx:658
 AliHLTTriggerDomain.cxx:659
 AliHLTTriggerDomain.cxx:660
 AliHLTTriggerDomain.cxx:661
 AliHLTTriggerDomain.cxx:662
 AliHLTTriggerDomain.cxx:663
 AliHLTTriggerDomain.cxx:664
 AliHLTTriggerDomain.cxx:665
 AliHLTTriggerDomain.cxx:666
 AliHLTTriggerDomain.cxx:667
 AliHLTTriggerDomain.cxx:668
 AliHLTTriggerDomain.cxx:669
 AliHLTTriggerDomain.cxx:670
 AliHLTTriggerDomain.cxx:671
 AliHLTTriggerDomain.cxx:672
 AliHLTTriggerDomain.cxx:673
 AliHLTTriggerDomain.cxx:674
 AliHLTTriggerDomain.cxx:675
 AliHLTTriggerDomain.cxx:676
 AliHLTTriggerDomain.cxx:677
 AliHLTTriggerDomain.cxx:678
 AliHLTTriggerDomain.cxx:679
 AliHLTTriggerDomain.cxx:680
 AliHLTTriggerDomain.cxx:681
 AliHLTTriggerDomain.cxx:682
 AliHLTTriggerDomain.cxx:683
 AliHLTTriggerDomain.cxx:684
 AliHLTTriggerDomain.cxx:685
 AliHLTTriggerDomain.cxx:686
 AliHLTTriggerDomain.cxx:687
 AliHLTTriggerDomain.cxx:688
 AliHLTTriggerDomain.cxx:689
 AliHLTTriggerDomain.cxx:690
 AliHLTTriggerDomain.cxx:691
 AliHLTTriggerDomain.cxx:692
 AliHLTTriggerDomain.cxx:693
 AliHLTTriggerDomain.cxx:694
 AliHLTTriggerDomain.cxx:695
 AliHLTTriggerDomain.cxx:696
 AliHLTTriggerDomain.cxx:697
 AliHLTTriggerDomain.cxx:698
 AliHLTTriggerDomain.cxx:699
 AliHLTTriggerDomain.cxx:700
 AliHLTTriggerDomain.cxx:701
 AliHLTTriggerDomain.cxx:702
 AliHLTTriggerDomain.cxx:703
 AliHLTTriggerDomain.cxx:704
 AliHLTTriggerDomain.cxx:705
 AliHLTTriggerDomain.cxx:706
 AliHLTTriggerDomain.cxx:707
 AliHLTTriggerDomain.cxx:708
 AliHLTTriggerDomain.cxx:709
 AliHLTTriggerDomain.cxx:710
 AliHLTTriggerDomain.cxx:711
 AliHLTTriggerDomain.cxx:712
 AliHLTTriggerDomain.cxx:713
 AliHLTTriggerDomain.cxx:714
 AliHLTTriggerDomain.cxx:715
 AliHLTTriggerDomain.cxx:716
 AliHLTTriggerDomain.cxx:717
 AliHLTTriggerDomain.cxx:718
 AliHLTTriggerDomain.cxx:719
 AliHLTTriggerDomain.cxx:720
 AliHLTTriggerDomain.cxx:721
 AliHLTTriggerDomain.cxx:722
 AliHLTTriggerDomain.cxx:723
 AliHLTTriggerDomain.cxx:724
 AliHLTTriggerDomain.cxx:725
 AliHLTTriggerDomain.cxx:726
 AliHLTTriggerDomain.cxx:727
 AliHLTTriggerDomain.cxx:728
 AliHLTTriggerDomain.cxx:729
 AliHLTTriggerDomain.cxx:730
 AliHLTTriggerDomain.cxx:731
 AliHLTTriggerDomain.cxx:732
 AliHLTTriggerDomain.cxx:733
 AliHLTTriggerDomain.cxx:734
 AliHLTTriggerDomain.cxx:735
 AliHLTTriggerDomain.cxx:736
 AliHLTTriggerDomain.cxx:737
 AliHLTTriggerDomain.cxx:738
 AliHLTTriggerDomain.cxx:739
 AliHLTTriggerDomain.cxx:740
 AliHLTTriggerDomain.cxx:741
 AliHLTTriggerDomain.cxx:742
 AliHLTTriggerDomain.cxx:743
 AliHLTTriggerDomain.cxx:744
 AliHLTTriggerDomain.cxx:745
 AliHLTTriggerDomain.cxx:746
 AliHLTTriggerDomain.cxx:747
 AliHLTTriggerDomain.cxx:748
 AliHLTTriggerDomain.cxx:749
 AliHLTTriggerDomain.cxx:750
 AliHLTTriggerDomain.cxx:751
 AliHLTTriggerDomain.cxx:752
 AliHLTTriggerDomain.cxx:753
 AliHLTTriggerDomain.cxx:754
 AliHLTTriggerDomain.cxx:755
 AliHLTTriggerDomain.cxx:756
 AliHLTTriggerDomain.cxx:757
 AliHLTTriggerDomain.cxx:758
 AliHLTTriggerDomain.cxx:759
 AliHLTTriggerDomain.cxx:760
 AliHLTTriggerDomain.cxx:761
 AliHLTTriggerDomain.cxx:762
 AliHLTTriggerDomain.cxx:763
 AliHLTTriggerDomain.cxx:764
 AliHLTTriggerDomain.cxx:765
 AliHLTTriggerDomain.cxx:766
 AliHLTTriggerDomain.cxx:767
 AliHLTTriggerDomain.cxx:768
 AliHLTTriggerDomain.cxx:769
 AliHLTTriggerDomain.cxx:770
 AliHLTTriggerDomain.cxx:771
 AliHLTTriggerDomain.cxx:772
 AliHLTTriggerDomain.cxx:773
 AliHLTTriggerDomain.cxx:774
 AliHLTTriggerDomain.cxx:775
 AliHLTTriggerDomain.cxx:776
 AliHLTTriggerDomain.cxx:777
 AliHLTTriggerDomain.cxx:778
 AliHLTTriggerDomain.cxx:779
 AliHLTTriggerDomain.cxx:780
 AliHLTTriggerDomain.cxx:781
 AliHLTTriggerDomain.cxx:782
 AliHLTTriggerDomain.cxx:783
 AliHLTTriggerDomain.cxx:784
 AliHLTTriggerDomain.cxx:785
 AliHLTTriggerDomain.cxx:786
 AliHLTTriggerDomain.cxx:787
 AliHLTTriggerDomain.cxx:788
 AliHLTTriggerDomain.cxx:789
 AliHLTTriggerDomain.cxx:790
 AliHLTTriggerDomain.cxx:791
 AliHLTTriggerDomain.cxx:792
 AliHLTTriggerDomain.cxx:793
 AliHLTTriggerDomain.cxx:794
 AliHLTTriggerDomain.cxx:795
 AliHLTTriggerDomain.cxx:796
 AliHLTTriggerDomain.cxx:797
 AliHLTTriggerDomain.cxx:798
 AliHLTTriggerDomain.cxx:799
 AliHLTTriggerDomain.cxx:800
 AliHLTTriggerDomain.cxx:801
 AliHLTTriggerDomain.cxx:802
 AliHLTTriggerDomain.cxx:803
 AliHLTTriggerDomain.cxx:804
 AliHLTTriggerDomain.cxx:805
 AliHLTTriggerDomain.cxx:806
 AliHLTTriggerDomain.cxx:807
 AliHLTTriggerDomain.cxx:808
 AliHLTTriggerDomain.cxx:809
 AliHLTTriggerDomain.cxx:810
 AliHLTTriggerDomain.cxx:811
 AliHLTTriggerDomain.cxx:812
 AliHLTTriggerDomain.cxx:813
 AliHLTTriggerDomain.cxx:814
 AliHLTTriggerDomain.cxx:815
 AliHLTTriggerDomain.cxx:816
 AliHLTTriggerDomain.cxx:817
 AliHLTTriggerDomain.cxx:818
 AliHLTTriggerDomain.cxx:819
 AliHLTTriggerDomain.cxx:820
 AliHLTTriggerDomain.cxx:821
 AliHLTTriggerDomain.cxx:822
 AliHLTTriggerDomain.cxx:823
 AliHLTTriggerDomain.cxx:824
 AliHLTTriggerDomain.cxx:825
 AliHLTTriggerDomain.cxx:826
 AliHLTTriggerDomain.cxx:827
 AliHLTTriggerDomain.cxx:828
 AliHLTTriggerDomain.cxx:829
 AliHLTTriggerDomain.cxx:830
 AliHLTTriggerDomain.cxx:831
 AliHLTTriggerDomain.cxx:832
 AliHLTTriggerDomain.cxx:833
 AliHLTTriggerDomain.cxx:834
 AliHLTTriggerDomain.cxx:835
 AliHLTTriggerDomain.cxx:836
 AliHLTTriggerDomain.cxx:837
 AliHLTTriggerDomain.cxx:838
 AliHLTTriggerDomain.cxx:839
 AliHLTTriggerDomain.cxx:840
 AliHLTTriggerDomain.cxx:841
 AliHLTTriggerDomain.cxx:842
 AliHLTTriggerDomain.cxx:843
 AliHLTTriggerDomain.cxx:844
 AliHLTTriggerDomain.cxx:845
 AliHLTTriggerDomain.cxx:846
 AliHLTTriggerDomain.cxx:847
 AliHLTTriggerDomain.cxx:848
 AliHLTTriggerDomain.cxx:849
 AliHLTTriggerDomain.cxx:850
 AliHLTTriggerDomain.cxx:851
 AliHLTTriggerDomain.cxx:852
 AliHLTTriggerDomain.cxx:853
 AliHLTTriggerDomain.cxx:854
 AliHLTTriggerDomain.cxx:855
 AliHLTTriggerDomain.cxx:856
 AliHLTTriggerDomain.cxx:857
 AliHLTTriggerDomain.cxx:858
 AliHLTTriggerDomain.cxx:859
 AliHLTTriggerDomain.cxx:860
 AliHLTTriggerDomain.cxx:861
 AliHLTTriggerDomain.cxx:862
 AliHLTTriggerDomain.cxx:863
 AliHLTTriggerDomain.cxx:864
 AliHLTTriggerDomain.cxx:865
 AliHLTTriggerDomain.cxx:866
 AliHLTTriggerDomain.cxx:867
 AliHLTTriggerDomain.cxx:868
 AliHLTTriggerDomain.cxx:869
 AliHLTTriggerDomain.cxx:870
 AliHLTTriggerDomain.cxx:871
 AliHLTTriggerDomain.cxx:872
 AliHLTTriggerDomain.cxx:873
 AliHLTTriggerDomain.cxx:874
 AliHLTTriggerDomain.cxx:875
 AliHLTTriggerDomain.cxx:876
 AliHLTTriggerDomain.cxx:877
 AliHLTTriggerDomain.cxx:878
 AliHLTTriggerDomain.cxx:879
 AliHLTTriggerDomain.cxx:880
 AliHLTTriggerDomain.cxx:881
 AliHLTTriggerDomain.cxx:882
 AliHLTTriggerDomain.cxx:883
 AliHLTTriggerDomain.cxx:884
 AliHLTTriggerDomain.cxx:885
 AliHLTTriggerDomain.cxx:886
 AliHLTTriggerDomain.cxx:887
 AliHLTTriggerDomain.cxx:888
 AliHLTTriggerDomain.cxx:889
 AliHLTTriggerDomain.cxx:890
 AliHLTTriggerDomain.cxx:891
 AliHLTTriggerDomain.cxx:892
 AliHLTTriggerDomain.cxx:893
 AliHLTTriggerDomain.cxx:894
 AliHLTTriggerDomain.cxx:895
 AliHLTTriggerDomain.cxx:896
 AliHLTTriggerDomain.cxx:897
 AliHLTTriggerDomain.cxx:898
 AliHLTTriggerDomain.cxx:899
 AliHLTTriggerDomain.cxx:900
 AliHLTTriggerDomain.cxx:901
 AliHLTTriggerDomain.cxx:902
 AliHLTTriggerDomain.cxx:903
 AliHLTTriggerDomain.cxx:904
 AliHLTTriggerDomain.cxx:905
 AliHLTTriggerDomain.cxx:906
 AliHLTTriggerDomain.cxx:907
 AliHLTTriggerDomain.cxx:908
 AliHLTTriggerDomain.cxx:909
 AliHLTTriggerDomain.cxx:910
 AliHLTTriggerDomain.cxx:911
 AliHLTTriggerDomain.cxx:912
 AliHLTTriggerDomain.cxx:913
 AliHLTTriggerDomain.cxx:914
 AliHLTTriggerDomain.cxx:915
 AliHLTTriggerDomain.cxx:916
 AliHLTTriggerDomain.cxx:917
 AliHLTTriggerDomain.cxx:918
 AliHLTTriggerDomain.cxx:919
 AliHLTTriggerDomain.cxx:920
 AliHLTTriggerDomain.cxx:921
 AliHLTTriggerDomain.cxx:922
 AliHLTTriggerDomain.cxx:923
 AliHLTTriggerDomain.cxx:924
 AliHLTTriggerDomain.cxx:925
 AliHLTTriggerDomain.cxx:926
 AliHLTTriggerDomain.cxx:927
 AliHLTTriggerDomain.cxx:928
 AliHLTTriggerDomain.cxx:929
 AliHLTTriggerDomain.cxx:930
 AliHLTTriggerDomain.cxx:931
 AliHLTTriggerDomain.cxx:932
 AliHLTTriggerDomain.cxx:933
 AliHLTTriggerDomain.cxx:934
 AliHLTTriggerDomain.cxx:935
 AliHLTTriggerDomain.cxx:936
 AliHLTTriggerDomain.cxx:937
 AliHLTTriggerDomain.cxx:938
 AliHLTTriggerDomain.cxx:939
 AliHLTTriggerDomain.cxx:940
 AliHLTTriggerDomain.cxx:941
 AliHLTTriggerDomain.cxx:942
 AliHLTTriggerDomain.cxx:943
 AliHLTTriggerDomain.cxx:944
 AliHLTTriggerDomain.cxx:945
 AliHLTTriggerDomain.cxx:946
 AliHLTTriggerDomain.cxx:947
 AliHLTTriggerDomain.cxx:948
 AliHLTTriggerDomain.cxx:949
 AliHLTTriggerDomain.cxx:950
 AliHLTTriggerDomain.cxx:951
 AliHLTTriggerDomain.cxx:952
 AliHLTTriggerDomain.cxx:953
 AliHLTTriggerDomain.cxx:954
 AliHLTTriggerDomain.cxx:955
 AliHLTTriggerDomain.cxx:956
 AliHLTTriggerDomain.cxx:957
 AliHLTTriggerDomain.cxx:958
 AliHLTTriggerDomain.cxx:959
 AliHLTTriggerDomain.cxx:960
 AliHLTTriggerDomain.cxx:961
 AliHLTTriggerDomain.cxx:962
 AliHLTTriggerDomain.cxx:963
 AliHLTTriggerDomain.cxx:964
 AliHLTTriggerDomain.cxx:965
 AliHLTTriggerDomain.cxx:966
 AliHLTTriggerDomain.cxx:967
 AliHLTTriggerDomain.cxx:968
 AliHLTTriggerDomain.cxx:969
 AliHLTTriggerDomain.cxx:970
 AliHLTTriggerDomain.cxx:971
 AliHLTTriggerDomain.cxx:972
 AliHLTTriggerDomain.cxx:973
 AliHLTTriggerDomain.cxx:974
 AliHLTTriggerDomain.cxx:975
 AliHLTTriggerDomain.cxx:976
 AliHLTTriggerDomain.cxx:977
 AliHLTTriggerDomain.cxx:978
 AliHLTTriggerDomain.cxx:979
 AliHLTTriggerDomain.cxx:980
 AliHLTTriggerDomain.cxx:981
 AliHLTTriggerDomain.cxx:982
 AliHLTTriggerDomain.cxx:983
 AliHLTTriggerDomain.cxx:984
 AliHLTTriggerDomain.cxx:985
 AliHLTTriggerDomain.cxx:986
 AliHLTTriggerDomain.cxx:987
 AliHLTTriggerDomain.cxx:988
 AliHLTTriggerDomain.cxx:989
 AliHLTTriggerDomain.cxx:990
 AliHLTTriggerDomain.cxx:991
 AliHLTTriggerDomain.cxx:992
 AliHLTTriggerDomain.cxx:993
 AliHLTTriggerDomain.cxx:994
 AliHLTTriggerDomain.cxx:995
 AliHLTTriggerDomain.cxx:996
 AliHLTTriggerDomain.cxx:997
 AliHLTTriggerDomain.cxx:998
 AliHLTTriggerDomain.cxx:999
 AliHLTTriggerDomain.cxx:1000
 AliHLTTriggerDomain.cxx:1001
 AliHLTTriggerDomain.cxx:1002
 AliHLTTriggerDomain.cxx:1003
 AliHLTTriggerDomain.cxx:1004
 AliHLTTriggerDomain.cxx:1005
 AliHLTTriggerDomain.cxx:1006
 AliHLTTriggerDomain.cxx:1007
 AliHLTTriggerDomain.cxx:1008
 AliHLTTriggerDomain.cxx:1009
 AliHLTTriggerDomain.cxx:1010
 AliHLTTriggerDomain.cxx:1011
 AliHLTTriggerDomain.cxx:1012
 AliHLTTriggerDomain.cxx:1013
 AliHLTTriggerDomain.cxx:1014
 AliHLTTriggerDomain.cxx:1015
 AliHLTTriggerDomain.cxx:1016
 AliHLTTriggerDomain.cxx:1017
 AliHLTTriggerDomain.cxx:1018
 AliHLTTriggerDomain.cxx:1019
 AliHLTTriggerDomain.cxx:1020
 AliHLTTriggerDomain.cxx:1021
 AliHLTTriggerDomain.cxx:1022
 AliHLTTriggerDomain.cxx:1023
 AliHLTTriggerDomain.cxx:1024
 AliHLTTriggerDomain.cxx:1025
 AliHLTTriggerDomain.cxx:1026
 AliHLTTriggerDomain.cxx:1027
 AliHLTTriggerDomain.cxx:1028
 AliHLTTriggerDomain.cxx:1029
 AliHLTTriggerDomain.cxx:1030
 AliHLTTriggerDomain.cxx:1031
 AliHLTTriggerDomain.cxx:1032
 AliHLTTriggerDomain.cxx:1033
 AliHLTTriggerDomain.cxx:1034
 AliHLTTriggerDomain.cxx:1035
 AliHLTTriggerDomain.cxx:1036
 AliHLTTriggerDomain.cxx:1037
 AliHLTTriggerDomain.cxx:1038
 AliHLTTriggerDomain.cxx:1039
 AliHLTTriggerDomain.cxx:1040
 AliHLTTriggerDomain.cxx:1041
 AliHLTTriggerDomain.cxx:1042
 AliHLTTriggerDomain.cxx:1043
 AliHLTTriggerDomain.cxx:1044
 AliHLTTriggerDomain.cxx:1045
 AliHLTTriggerDomain.cxx:1046
 AliHLTTriggerDomain.cxx:1047
 AliHLTTriggerDomain.cxx:1048
 AliHLTTriggerDomain.cxx:1049
 AliHLTTriggerDomain.cxx:1050
 AliHLTTriggerDomain.cxx:1051
 AliHLTTriggerDomain.cxx:1052
 AliHLTTriggerDomain.cxx:1053
 AliHLTTriggerDomain.cxx:1054
 AliHLTTriggerDomain.cxx:1055
 AliHLTTriggerDomain.cxx:1056
 AliHLTTriggerDomain.cxx:1057
 AliHLTTriggerDomain.cxx:1058
 AliHLTTriggerDomain.cxx:1059
 AliHLTTriggerDomain.cxx:1060
 AliHLTTriggerDomain.cxx:1061
 AliHLTTriggerDomain.cxx:1062
 AliHLTTriggerDomain.cxx:1063
 AliHLTTriggerDomain.cxx:1064
 AliHLTTriggerDomain.cxx:1065
 AliHLTTriggerDomain.cxx:1066
 AliHLTTriggerDomain.cxx:1067
 AliHLTTriggerDomain.cxx:1068
 AliHLTTriggerDomain.cxx:1069
 AliHLTTriggerDomain.cxx:1070
 AliHLTTriggerDomain.cxx:1071
 AliHLTTriggerDomain.cxx:1072
 AliHLTTriggerDomain.cxx:1073
 AliHLTTriggerDomain.cxx:1074
 AliHLTTriggerDomain.cxx:1075
 AliHLTTriggerDomain.cxx:1076
 AliHLTTriggerDomain.cxx:1077
 AliHLTTriggerDomain.cxx:1078
 AliHLTTriggerDomain.cxx:1079
 AliHLTTriggerDomain.cxx:1080