ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * 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.                  *
 **************************************************************************/

/* $Id$ */

//-----------------------------------------------------------------------------
/// \class AliCounterCollection
/// 
/// generic class to handle a collection of counters
///
/// \author Philippe Pillot
//-----------------------------------------------------------------------------

#include "AliCounterCollection.h"

#include <limits.h>

#include <AliLog.h>

#include <TString.h>
#include <TObjString.h>
#include <TObjArray.h>
#include <THnSparse.h>
#include <THashList.h>
#include <TArrayI.h>
#include <TH1D.h>
#include <TH2D.h>
#include <TCollection.h>

ClassImp(AliCounterCollection)

//-----------------------------------------------------------------------
AliCounterCollection::AliCounterCollection(const char* name) :
TNamed(name,name),
fRubrics(new THashList(10)),
fRubricsSize(new TArrayI(10)),
fCounters(0x0),
fWeightedCounters(kFALSE),
fLongCounters(kFALSE)
{
  /// Constructor
  fRubrics->SetOwner();
}

//-----------------------------------------------------------------------
AliCounterCollection::~AliCounterCollection()
{
  /// Destructor
  delete fRubrics;
  delete fRubricsSize;
  delete fCounters;
}

//-----------------------------------------------------------------------
void AliCounterCollection::Clear(Option_t*)
{
  /// Clear counters
  fRubrics->Clear();
  fRubricsSize->Reset();
  delete fCounters; fCounters = 0x0;
  fWeightedCounters = kFALSE;
  fLongCounters = kFALSE;
}

//-----------------------------------------------------------------------
void AliCounterCollection::AddRubric(TString name, TString listOfKeyWords)
{
  /// Add a new rubric with the complete list of related key words separated by "/".
  /// If the key word "any" is not defined, the overall statistics is
  /// assumed to be the sum of the statistics under each key word.
  
  name.ToUpper();
  listOfKeyWords.ToUpper();
  
  if (fRubrics->Contains(name.Data())) {
    AliError(Form("rubric named %s already exist",name.Data()));
    return;
  }
  
  // add the list of autorized key words
  TObjArray* rubric = listOfKeyWords.Tokenize("/");
  CleanListOfStrings(rubric);
  rubric->SetName(name.Data());
  Int_t nRubrics = fRubrics->GetSize();
  rubric->SetUniqueID(nRubrics);
  fRubrics->AddLast(rubric);
  
  // save the number of autorized key words (expand the array if needed)
  if (nRubrics+1 > fRubricsSize->GetSize()) fRubricsSize->Set(2*fRubricsSize->GetSize());
  (*fRubricsSize)[nRubrics] = rubric->GetEntriesFast();
}

//-----------------------------------------------------------------------
void AliCounterCollection::AddRubric(TString name, Int_t maxNKeyWords)
{
  /// Add a new rubric containing at maximum maxNKeyWords key words.
  /// Key words will be added as the counters get filled until the maximum is reached.
  /// If the key word "any" is never defined, the overall statistics is
  /// assumed to be the sum of the statistics under each key word.
  
  name.ToUpper();
  
  if (fRubrics->Contains(name.Data())) {
    AliError(Form("rubric named %s already exist",name.Data()));
    return;
  }
  
  // create the empty rubric
  TObjString* rubric = new TObjString(name.Data());
  Int_t nRubrics = fRubrics->GetSize();
  rubric->SetUniqueID(nRubrics);
  fRubrics->AddLast(rubric);
  
  // save the maximum number of autorized key words
  if (nRubrics+1 > fRubricsSize->GetSize()) fRubricsSize->Set(2*fRubricsSize->GetSize());
  (*fRubricsSize)[nRubrics] = maxNKeyWords;
}

//-----------------------------------------------------------------------
void AliCounterCollection::Init(Bool_t weightedCounters)
{
  /// Initialize the internal counters from the added rubrics.
  
  // create the counters
  delete fCounters;
  fWeightedCounters = weightedCounters;
  if (fWeightedCounters)
    fCounters = new THnSparseT<TArrayF>("hCounters", "hCounters", fRubrics->GetSize(), fRubricsSize->GetArray(), 0x0, 0x0);
  else
    fCounters = new THnSparseT<TArrayI>("hCounters", "hCounters", fRubrics->GetSize(), fRubricsSize->GetArray(), 0x0, 0x0);
  
  // loop over axis
  TObject* rubric = 0x0;
  TIter nextRubric(fRubrics);
  while ((rubric = nextRubric())) {
    TAxis* axis = fCounters->GetAxis((Int_t)rubric->GetUniqueID());
    
    // set axis name
    axis->SetName(rubric->GetName());
    
    // set labels if already known
    TObjArray* keyWords = dynamic_cast<TObjArray*>(rubric);
    if (keyWords) {
      TObjString* label = 0x0;
      Int_t bin = 1;
      TIter nextLabel(keyWords);
      while ((label = static_cast<TObjString*>(nextLabel()))) axis->SetBinLabel(bin++, label->String().Data());
    }
    
  }
  
}

//-----------------------------------------------------------------------
Int_t AliCounterCollection::GetNActiveBins(Int_t dim)
{
  /// return the number of labels in that rubric.
  THashList* labels = fCounters->GetAxis(dim)->GetLabels();
  return (labels) ? labels->GetSize() : 0;
}

//-----------------------------------------------------------------------
Bool_t AliCounterCollection::ContainsAny(Int_t dim)
{
  /// return kTRUE if that rubric contains the keyWord "ANY".
  THashList* labels = fCounters->GetAxis(dim)->GetLabels();
  return (labels && labels->Contains("ANY"));
}

//-----------------------------------------------------------------------
const Int_t* AliCounterCollection::FindBins(const TString& externalKey, Bool_t allocate, Int_t& nEmptySlots)
{
  /// Return the corresponding bins ordered by rubric or 0x0 if externalKey is not valid.
  /// The externalKey format must be rubric:keyWord/rubric:keyWord/rubric:keyWord/...
  /// If allocate = kTRUE, new key words are added to the corresponding rubric if possible.
  /// If a rubric is not filled in, the coresponding slot contain -1 in the array.
  /// It is the responsability of the user to delete the returned array.
  
  // produce an empty array of keys
  Int_t nRubrics = fRubrics->GetSize();
  Int_t* bins = new Int_t[nRubrics];
  for (Int_t i=0; i<nRubrics; i++) bins[i] = -1;
  nEmptySlots = nRubrics;
  Bool_t isValid = kTRUE;
  
  // get the list of rubric:keyWord pairs
  TObjArray* rubricKeyPairs = externalKey.Tokenize("/");
  
  // loop over each rubric:keyWord pair
  TObjString* pair = 0x0;
  TIter next(rubricKeyPairs);
  while ((pair = static_cast<TObjString*>(next()))) {
    
    // get both rubric and associated key word
    TObjArray* rubricKeyPair = pair->String().Tokenize(":");
    
    // check the format of the pair
    if (rubricKeyPair->GetEntriesFast() != 2) {
      AliError("invalid key format");
      isValid = kFALSE;
      delete rubricKeyPair;
      break;
    }
    
    // get the axis corresponding to that rubric
    Int_t dim = FindDim(static_cast<TObjString*>(rubricKeyPair->UncheckedAt(0))->String());
    if (dim < 0) {
      isValid = kFALSE;
      delete rubricKeyPair;
      break;
    }
    
    // find the bin corresponding to that key word
    Int_t bin = FindBin(dim, static_cast<TObjString*>(rubricKeyPair->UncheckedAt(1))->String(), allocate);
    if (bin < 0) {
      isValid = kFALSE;
      delete rubricKeyPair;
      break;
    }
    
    // check if the array of keys already contains something for that rubric
    if (bins[dim] >= 0) {
      AliWarning("key already given for that rubric --> ignored");
      delete rubricKeyPair;
      continue;
    }
    
    // store the corresponding bin for that slot
    bins[dim] = bin;
    nEmptySlots--;
    
    // clean memory
    delete rubricKeyPair;
  }
  
  // delete the array in case of problem
  if (!isValid) {
    delete[] bins;
    bins = 0x0;
    nEmptySlots = nRubrics;
  }
  
  // clean memory
  delete rubricKeyPairs;
  
  return bins;
}

//-----------------------------------------------------------------------
Int_t AliCounterCollection::FindDim(const TString& rubricName) const
{
  /// Return the dimension corresponding to that rubric (or -1 in case of failure).
  TObject* rubric = fRubrics->FindObject(rubricName.Data());
  if (!rubric) {
    AliError(Form("invalid rubric: %s",rubricName.Data()));
    return -1;
  }
  return (Int_t) rubric->GetUniqueID();
}

//-----------------------------------------------------------------------
Int_t AliCounterCollection::FindBin(Int_t dim, const TString& keyWord, Bool_t allocate)
{
  /// Return the bin number corresponding to that key word (or -1 in case of failure).
  /// If allocate = kTRUE, try to add the key word if possible.
  
  TAxis* axis = fCounters->GetAxis(dim);
  
  // look for the bin corresponding to keyWord
  THashList* labels = axis->GetLabels();
  TObjString* label = (labels) ? static_cast<TObjString*>(labels->FindObject(keyWord.Data())) : 0x0;
  Int_t bin = (label) ? (Int_t)label->GetUniqueID() : -1;
  
  // in case the keyWord does not exist, try to add it if required
  if (bin<0 && allocate) {
    Int_t nLabels = (labels) ? labels->GetSize() : 0;
    if (nLabels < axis->GetNbins()) {
      bin = nLabels+1;
      axis->SetBinLabel(bin, keyWord.Data());
    }
  }
  
  if (bin<0) AliError(Form("invalid key word: %s:%s",axis->GetName(),keyWord.Data()));
  
  return bin;
}

//-----------------------------------------------------------------------
Short_t** AliCounterCollection::DecodeSelection(const TString& selections, const TObjArray& displayedRubrics)
{
  /// Tag the selected keywords in each rubric (-1=subtract; 0=discard; 1=add). Format:
  /// "rubric:[any-]keyWord,keyWord,../rubric:[any-]keyWord,.." (order does not matter).
  /// It is the responsability of the user to delete the returned array.
  
  // produce an empty array of selected keys
  Int_t nRubrics = fCounters->GetNdimensions();
  Short_t** selects = new Short_t*[nRubrics];
  for (Int_t i=0; i<nRubrics; i++) selects[i] = 0x0;
  
  // get the list of rubric:LisOfKeyWord pairs
  TObjArray* rubricKeyPairs = selections.Tokenize("/");
  
  // loop over each rubric:keyWord pair
  TObjString* pair = 0x0;
  TIter next(rubricKeyPairs);
  while ((pair = static_cast<TObjString*>(next()))) {
    
    // get both rubric and associated list of key words
    TObjArray* rubricKeyPair = pair->String().Tokenize(":");
    
    // check the format of the pair
    if (rubricKeyPair->GetEntriesFast() != 2) {
      AliError("invalid key format");
      delete rubricKeyPair;
      delete rubricKeyPairs;
      for (Int_t i=0; i<nRubrics; i++) if (selects[i]) delete[] selects[i];
      delete[] selects;
      return 0x0;
    }
    
    // check wether to select or to discard the keyWords
    Int_t include = kTRUE;
    TString ListOfKeyWords(static_cast<TObjString*>(rubricKeyPair->UncheckedAt(1))->String());
    if (ListOfKeyWords.BeginsWith("ANY-")) {
      ListOfKeyWords.Remove(0,4);
      include = kFALSE;
    }
    
    // select the key words
    const TString& rubric = static_cast<TObjString*>(rubricKeyPair->UncheckedAt(0))->String();
    if (!Select(include, rubric, ListOfKeyWords, displayedRubrics.Contains(rubric.Data()), selects)) {
      delete rubricKeyPair;
      delete rubricKeyPairs;
      for (Int_t i=0; i<nRubrics; i++) if (selects[i]) delete[] selects[i];
      delete[] selects;
      return 0x0;
    }
    
    // clean memory
    delete rubricKeyPair;
  }
  
  // clean memory
  delete rubricKeyPairs;
  
  // complete the selection of other rubrics
  for (Int_t i=0; i<nRubrics; i++) {
    
    // skip already processed rubrics
    if (selects[i]) continue;
    
    // create the list of bins
    Int_t nBins = GetNActiveBins(i) + 1;
    selects[i] = new Short_t[nBins];
    
    // select all key words or only the key work "ANY"
    if (ContainsAny(i) && !displayedRubrics.Contains(fCounters->GetAxis(i)->GetName())) {
      memset(selects[i], 0, sizeof(Short_t) * nBins);
      selects[i][FindBin(i, "ANY", kFALSE)] = 1;
    } else for (Int_t j=0; j<nBins; j++) selects[i][j] = 1;
    
  }
  
  return selects;
}

//-----------------------------------------------------------------------
Bool_t AliCounterCollection::Select(Bool_t include, const TString& rubric, const TString& keywords,
				    Bool_t displayed, Short_t* selectBins[])
{
  /// Tag the selected keywords (separated by ',') in that rubric (-1=subtract; 0=discard; 1=add).
  
  Int_t dim = FindDim(rubric);
  if (dim < 0) return kFALSE;
  
  if (selectBins[dim]) {
    AliWarning(Form("selection already made for rubric %s --> ignored",rubric.Data()));
    return kTRUE;
  }
  
  // get list of key words to select
  TObjArray* keys = keywords.Tokenize(",");
  if (keys->GetEntriesFast() == 0) {
    AliError(Form("no key word specified for rubric %s",rubric.Data()));
    delete keys;
    return kFALSE;
  }
  
  // create the list of bins
  Int_t nBins = GetNActiveBins(dim) + 1;
  selectBins[dim] = new Short_t[nBins];
  
  // select/unselect all bins
  Bool_t containsAny = ContainsAny(dim);
  if (include || (containsAny && !displayed)) {
    memset(selectBins[dim], 0, sizeof(Short_t) * nBins);
    if (!include) selectBins[dim][FindBin(dim, "ANY", kFALSE)] = 1;
  } else for (Int_t j=0; j<nBins; j++) selectBins[dim][j] = 1;
  
  // select/unselect specific key words
  TObjString* key = 0x0;
  TIter nextKey(keys);
  while ((key = static_cast<TObjString*>(nextKey()))) {
    
    // special case of key word "ANY"
    if (key->String() == "ANY") {
      
      if (containsAny) {
	
	Int_t binAny = FindBin(dim, "ANY", kFALSE);
	if (include) selectBins[dim][binAny] = 1;
	else selectBins[dim][binAny] = 0;
	
      } else {
	
	if (include) for (Int_t j=0; j<nBins; j++) selectBins[dim][j] = 1;
	else memset(selectBins[dim], 0, sizeof(Short_t) * nBins);
	
      }
      
    } else { // other cases
      
      // find the corresponding bin
      Int_t bin = FindBin(dim, key->String().Data(), kFALSE);
      if (bin < 0) {
	delete keys;
	return kFALSE;
      }
      
      // select/unselect it
      if (include) selectBins[dim][bin] = 1;
      else if (containsAny && !displayed) selectBins[dim][bin] = -1;
      else selectBins[dim][bin] = 0;
      
    }
    
  }
  
  // clean memory
  delete keys;
  
  return kTRUE;
}

//-----------------------------------------------------------------------
void AliCounterCollection::CleanListOfStrings(TObjArray* list)
{
  /// Make sure all strings appear only once in this list
  
  // remove multiple-occurrence
  Int_t nEntries = list->GetEntriesFast();
  for (Int_t i = 0; i < nEntries; i++) {
    TObjString* entry1 = static_cast<TObjString*>(list->UncheckedAt(i));
    if (!entry1) continue;
    for (Int_t j = i+1; j < nEntries; j++) {
      TObjString* entry2 = static_cast<TObjString*>(list->UncheckedAt(j));
      if (entry2 && entry2->IsEqual(entry1)) {
	AliWarning(Form("multiple-occurence of string \"%s\" --> removed",entry2->String().Data()));
	list->RemoveAt(j);
      }
    }
  }
  
  // remove empty slots
  list->Compress();
}

//-----------------------------------------------------------------------
void AliCounterCollection::Count(TString externalKey, Int_t value)
{
  /// Add "value" to the counter referenced by "externalKey".
  /// The externalKey format must be rubric:keyWord/rubric:keyWord/rubric:keyWord/...
  if (value > 0) CountAsDouble(externalKey, (Double_t)value);
  else if (value < 0) AliError("cannot count negative values");
}

//-----------------------------------------------------------------------
void AliCounterCollection::Count(TString externalKey, Double_t value)
{
  /// Add "value" to the counter referenced by "externalKey".
  /// The externalKey format must be rubric:keyWord/rubric:keyWord/rubric:keyWord/...
  if (fWeightedCounters) CountAsDouble(externalKey, value);
  else AliError("non-weighted counters can only be filled with intergers");
}

//-----------------------------------------------------------------------
void AliCounterCollection::CountAsDouble(TString externalKey, Double_t value)
{
  /// Add "value" to the counter referenced by "externalKey".
  /// The externalKey format must be rubric:keyWord/rubric:keyWord/rubric:keyWord/...
  
  if (!fCounters) {
    AliError("counters are not initialized");
    return;
  }
  
  externalKey.ToUpper();
  
  // convert external to internal key
  Int_t nEmptySlots = 0;
  const Int_t* bins = FindBins(externalKey, kTRUE, nEmptySlots);
  if (!bins) return;
  
  // check for empty slots
  if (nEmptySlots > 0) {
    AliError("incomplete key");
    delete[] bins;
    return;
  }
  
  if (fWeightedCounters || fLongCounters) {
    
    // increment the corresponding counter
    fCounters->AddBinContent(bins, value);
    
  } else {
    
    // switch to long counters if needed before incrementing
    Long64_t linBin = fCounters->GetBin(bins, kTRUE);
    Double_t currentValue = fCounters->GetBinContent(linBin);
    if (currentValue+value > INT_MAX) {
      ConvertToTHnSparseL(fCounters);
      fLongCounters = kTRUE;
      fCounters->AddBinContent(bins, value);
    } else fCounters->AddBinContent(linBin, value);
    
  }
  
  // clean memory
  delete[] bins;
}

//-----------------------------------------------------------------------
void AliCounterCollection::Print(const Option_t* opt) const
{
  /// Print every individual counters if opt=="" or call "Print(opt, "")".
  
  if (strcmp(opt,"")) {
    const_cast<AliCounterCollection*>(this)->Print(opt, "");
    return;
  }
  
  if (!fCounters) {
    AliError("counters are not initialized");
    return;
  }
  
  if (fCounters->GetNbins() == 0) {
    printf("\nall counters are empty\n\n");
    return;
  }
  
  Int_t nRubrics = fCounters->GetNdimensions();
  Int_t* bins = new Int_t[nRubrics];
  
  // loop over every filled counters
  for (Long64_t i=0; i<fCounters->GetNbins(); ++i) {
    
    // get the content of the bin
    Double_t value = fCounters->GetBinContent(i, bins);
    
    // build the corresponding counter name
    TString counter;
    for (Int_t j=0; j<nRubrics; j++) counter += Form("/%s",fCounters->GetAxis(j)->GetBinLabel(bins[j]));
    counter += "/";
    
    // print value
    if (fWeightedCounters) printf("\n%s   %g", counter.Data(), value);
    else if (fLongCounters) printf("\n%s   %ld", counter.Data(), (Long_t)value);
    else printf("\n%s   %d", counter.Data(), (Int_t)value);
  }
  printf("\n\n");
  
  // clean memory
  delete[] bins;
}

//-----------------------------------------------------------------------
TString AliCounterCollection::GetKeyWords(TString rubric) const
{
  /// return the list of key words for the given rubric.
  
  TString keyWords = "";
  
  if (!fCounters) {
    AliError("counters are not initialized");
    return keyWords;
  }
  
  rubric.ToUpper();
  
  // get the dimension corresponding to that rubric
  Int_t dim = FindDim(rubric);
  if (dim < 0) return keyWords;
  
  // build list of key words
  TObjString* label = 0x0;
  TIter nextLabel(fCounters->GetAxis(dim)->GetLabels());
  while ((label = static_cast<TObjString*>(nextLabel()))) keyWords += Form("%s,",label->String().Data());
  keyWords.Remove(TString::kTrailing, ',');
  
  return keyWords;
}

//-----------------------------------------------------------------------
Double_t AliCounterCollection::GetSum(TString selections, Bool_t* longCounters)
{
  /// Get the overall statistics for the given selection (result is integrated over not specified rubrics):
  /// - format of "selections" is rubric:[any-]keyWord,keyWord,../rubric:[any-]keyWord,.. (order does not matter).
  /// - The flag "longCounters" tells whether the histogram contains value(s) larger than INT_MAX.
  
  // set the flag "longCounters" according to the content of current counters
  if (longCounters) *longCounters = fLongCounters;
  
  if (!fCounters) {
    AliError("counters are not initialized");
    return 0.;
  }
  
  selections.ToUpper();
  
  // decode the selections
  Short_t** select = DecodeSelection(selections, TObjArray());
  if (!select) return 0.;
  
  // loop over every filled counters and compute integral
  Double_t sum = 0.;
  Int_t nDims = fCounters->GetNdimensions();
  Int_t* coord = new Int_t[nDims];
  for (Long64_t i=0; i<fCounters->GetNbins(); ++i) {
    
    // get the content of the counter
    Double_t value = fCounters->GetBinContent(i, coord);
    
    // discard not selected counters and compute the selection factor
    Int_t selectionFactor = 1;
    for (Int_t dim = 0; dim < nDims && selectionFactor != 0; dim++) selectionFactor *= select[dim][coord[dim]];
    if (selectionFactor == 0) continue;
    
    // compute integral
    sum += selectionFactor * value;
  }
  
  // check if the sum exceed INT_MAX (only in case of integer counters)
  if (longCounters && !fWeightedCounters && sum > INT_MAX) *longCounters = kTRUE;
  
  // clean memory
  for (Int_t iDim=0; iDim<nDims; iDim++) delete[] select[iDim];
  delete[] select;
  delete[] coord;
  
  return sum;
}

//-----------------------------------------------------------------------
void AliCounterCollection::PrintKeyWords() const
{
  /// Print the full list of key words.
  
  if (!fCounters) {
    AliError("counters are not initialized");
    return;
  }
  
  // loop over rubrics
  Int_t nRubrics = fCounters->GetNdimensions();
  for (Int_t iDim=0; iDim<nRubrics; iDim++) {
    TAxis* axis = fCounters->GetAxis(iDim);
    
    // print rubric's name
    printf("\n%s:", axis->GetName());
    
    // loop over key words
    Bool_t first = kTRUE;
    TObjString* label = 0x0;
    TIter nextLabel(axis->GetLabels());
    while ((label = static_cast<TObjString*>(nextLabel()))) {
      
      //print key word's name
      if (first) {
	printf("%s", label->String().Data());
	first = kFALSE;
      } else printf(",%s", label->String().Data());
      
    }
  }
  printf("\n\n");
}

//-----------------------------------------------------------------------
void AliCounterCollection::PrintValue(TString selections)
{
  /// Print value of selected counter.
  /// format of "selections" is rubric:keyWord/rubric:keyWord/rubric:keyWord/...
  
  if (!fCounters) {
    AliError("counters are not initialized");
    return;
  }
  
  selections.ToUpper();
  
  // convert external to internal key
  Int_t nEmptySlots = 0;
  const Int_t* selectedBins = FindBins(selections, kFALSE, nEmptySlots);
  if (!selectedBins) return;
  
  // check for empty slots
  if (nEmptySlots > 0) {
    AliError("incomplete key");
    delete[] selectedBins;
    return;
  }
  
  // print value
  if (fWeightedCounters) printf("\n%g\n\n", fCounters->GetBinContent(selectedBins));
  else if (fLongCounters) printf("\n%ld\n\n", (Long_t) fCounters->GetBinContent(selectedBins));
  else printf("\n%d\n\n", (Int_t) fCounters->GetBinContent(selectedBins));
  
  // clean memory
  delete[] selectedBins;
}

//-----------------------------------------------------------------------
void AliCounterCollection::Print(TString rubrics, TString selections, Bool_t removeEmpty)
{
  /// Print desired rubrics for the given selection:
  /// - format of "rubrics" is rubric1/rubric2/.. (order matters only for output).
  /// - format of "selections" is rubric:[any-]keyWord,keyWord,../rubric:[any-]keyWord,.. (order does not matter).
  /// If "data" contains 1 rubric, the output will be one counter for each element of that rubric.
  /// If "data" contains 2 rubrics, the output will be an array of counters, rubric1 vs rubric2.
  /// If "data" contains 3 rubrics, the output will be an array rubric1 vs rubric2 for each element in rubric3.
  /// ...
  /// Results are integrated over rubrics not specified neither in "rubrics" nor in "selections".
  
  if (!fCounters) {
    AliError("counters are not initialized");
    return;
  }
  
  rubrics.ToUpper();
  selections.ToUpper();
  
  // get the rubrics to print
  TObjArray* rubricsToPrint = rubrics.Tokenize("/");
  if (rubricsToPrint->GetEntriesFast() == 0) {
    delete rubricsToPrint;
    return;
  }
  
  // remove rubrics called twice
  CleanListOfStrings(rubricsToPrint);
  
  // project counters in the rubrics to print according to the selections
  Bool_t longCounters = kFALSE;
  TObject* hist = Projection(*rubricsToPrint, selections, longCounters);
  if (!hist) {
    delete rubricsToPrint;
    return;
  }
  
  // print counters
  Int_t nRubricsToPrint = rubricsToPrint->GetEntriesFast();
  if (nRubricsToPrint == 1 && (static_cast<TH1D*>(hist))->GetEntries() > 0)
    PrintList(static_cast<TH1D*>(hist), removeEmpty, longCounters);
  else if (nRubricsToPrint == 2 && (static_cast<TH2D*>(hist))->GetEntries() > 0)
    PrintArray(static_cast<TH2D*>(hist), removeEmpty, longCounters);
  else if (nRubricsToPrint > 2 && (static_cast<THnSparse*>(hist))->GetEntries() > 0)
    PrintListOfArrays(static_cast<THnSparse*>(hist), removeEmpty, longCounters);
  else
    printf("\nselected counters are empty\n\n");
  
  // clean memory
  delete rubricsToPrint;
  delete hist;
}

//-----------------------------------------------------------------------
void AliCounterCollection::PrintSum(TString selections)
{
  /// Print the overall statistics for the given selection (result is integrated over not specified rubrics):
  /// - format of "selections" is rubric:[any-]keyWord,keyWord,../rubric:[any-]keyWord,.. (order does not matter).
  Bool_t longCounters = kFALSE;
  Double_t sum = GetSum(selections, &longCounters);
  if (fWeightedCounters) printf("\n%g\n\n", sum);
  else if (longCounters) printf("\n%ld\n\n", (Long_t)sum);
  else printf("\n%d\n\n", (Int_t)sum);
}

//-----------------------------------------------------------------------
void AliCounterCollection::PrintList(const TH1D* hist, Bool_t removeEmpty, Bool_t longCounters) const
{
  /// Print the content of 1D histogram as a list.
  
  // set the format to print labels
  THashList* labels = hist->GetXaxis()->GetLabels();
  TString format = "";
  if (fWeightedCounters) format = Form("\n%%%ds %%10g",GetMaxLabelSize(labels));
  else if (longCounters) format = Form("\n%%%ds %%16ld",GetMaxLabelSize(labels));
  else format = Form("\n%%%ds %%10d",GetMaxLabelSize(labels));
  
  // print value for each label
  TObjString* label = 0x0;
  TIter nextLabel(labels);
  while ((label = static_cast<TObjString*>(nextLabel()))) {
    Int_t bin = (Int_t) label->GetUniqueID();
    Double_t value = hist->GetBinContent(bin);
    if (removeEmpty && value == 0.) continue;
    if (fWeightedCounters) printf(format.Data(), label->String().Data(), value);
    else if (longCounters) printf(format.Data(), label->String().Data(), (Long_t) value);
    else printf(format.Data(), label->String().Data(), (Int_t) value);
  }
  printf("\n\n");
}

//-----------------------------------------------------------------------
void AliCounterCollection::PrintArray(const TH2D* hist, Bool_t removeEmpty, Bool_t longCounters) const
{
  /// Print the content of 2D histogram as an array.
  
  // set the format to print labels in X direction
  THashList* labelsX = hist->GetXaxis()->GetLabels();
  TString formatX(Form("\n%%%ds ",GetMaxLabelSize(labelsX)));
  
  // set the format to print labels in Y direction
  THashList* labelsY = hist->GetYaxis()->GetLabels();
  Int_t maxLabelSizeY = GetMaxLabelSize(labelsY);
  TString formatYv = "";
  if (fWeightedCounters) {
    maxLabelSizeY = TMath::Max(10, maxLabelSizeY);
    formatYv = Form("%%%dg ",maxLabelSizeY);
  } else if (longCounters) {
    maxLabelSizeY = TMath::Max(16, maxLabelSizeY);
    formatYv = Form("%%%dld ",maxLabelSizeY);
  } else {
    maxLabelSizeY = TMath::Max(10, maxLabelSizeY);
    formatYv = Form("%%%dd ",maxLabelSizeY);
  }
  TString formatYs = Form("%%%ds ",maxLabelSizeY);
  
  // if required, set the list of labels for which all counters are not empty
  Bool_t *useLabelX = 0x0, *useLabelY = 0x0;
  TObjString *labelX = 0x0, *labelY = 0x0;
  TIter nextLabelX(labelsX);
  TIter nextLabelY(labelsY);
  if (removeEmpty) {
    
    // create label flags and set them as unused
    useLabelX = new Bool_t[labelsX->GetSize()+1];
    memset(useLabelX, kFALSE, sizeof(Bool_t) * (labelsX->GetSize()+1));
    useLabelY = new Bool_t[labelsY->GetSize()+1];
    memset(useLabelY, kFALSE, sizeof(Bool_t) * (labelsY->GetSize()+1));
    
    // loop over labels in X direction
    while ((labelX = static_cast<TObjString*>(nextLabelX()))) {
      Int_t binX = (Int_t) labelX->GetUniqueID();
      
      // loop over labels in Y direction
      nextLabelY.Reset();
      while ((labelY = static_cast<TObjString*>(nextLabelY()))) {
	Int_t binY = (Int_t) labelY->GetUniqueID();
	
	// both labels already set as used
	if (useLabelX[binX] && useLabelY[binY]) continue;
	
	// skip empty bins
	if (hist->GetBinContent(binX, binY) == 0.) continue;
	
	// set label as used
	useLabelX[binX] = kTRUE;
	useLabelY[binY] = kTRUE;
	
      }
      
    }
    
  }
  
  // print labels in Y axis
  printf(formatX.Data()," ");
  nextLabelY.Reset();
  while ((labelY = static_cast<TObjString*>(nextLabelY()))) {
    if (removeEmpty && !useLabelY[labelY->GetUniqueID()]) continue;
    printf(formatYs.Data(), labelY->String().Data());
  }
  
  // fill array for each label in X axis
  nextLabelX.Reset();
  while ((labelX = static_cast<TObjString*>(nextLabelX()))) {
    Int_t binX = (Int_t) labelX->GetUniqueID();
    
    if (removeEmpty && !useLabelX[binX]) continue;
    
    // print label X
    printf(formatX.Data(), labelX->String().Data());
    
    // print value for each label in Y axis
    nextLabelY.Reset();
    while ((labelY = static_cast<TObjString*>(nextLabelY()))) {
      Int_t binY = (Int_t) labelY->GetUniqueID();
      if (removeEmpty && !useLabelY[binY]) continue;
      if (fWeightedCounters) printf(formatYv.Data(), hist->GetBinContent(binX, binY));
      else if (longCounters) printf(formatYv.Data(), (Long_t) hist->GetBinContent(binX, binY));
      else printf(formatYv.Data(), (Int_t) hist->GetBinContent(binX, binY));
    }
  }
  printf("\n\n");
  
  // clean memory
  if (removeEmpty) {
    delete[] useLabelX;
    delete[] useLabelY;
  }
}

//-----------------------------------------------------------------------
void AliCounterCollection::PrintListOfArrays(const THnSparse* hist, Bool_t removeEmpty, Bool_t longCounters) const
{
  /// Print the content of nD histogram as a list of arrays.
  
  // set the format to print labels in X direction
  THashList* labelsX = hist->GetAxis(0)->GetLabels();
  TString formatX(Form("\n%%%ds ",GetMaxLabelSize(labelsX)));
  
  // set the format to print labels in Y direction
  THashList* labelsY = hist->GetAxis(1)->GetLabels();
  Int_t maxLabelSizeY = GetMaxLabelSize(labelsY);
  TString formatYv = "";
  if (fWeightedCounters) {
    maxLabelSizeY = TMath::Max(10, maxLabelSizeY);
    formatYv = Form("%%%dg ",maxLabelSizeY);
  } else if (longCounters) {
    maxLabelSizeY = TMath::Max(16, maxLabelSizeY);
    formatYv = Form("%%%dld ",maxLabelSizeY);
  } else {
    maxLabelSizeY = TMath::Max(10, maxLabelSizeY);
    formatYv = Form("%%%dd ",maxLabelSizeY);
  }
  TString formatYs(Form("%%%ds ",maxLabelSizeY));
  
  // create a list containing each combination of labels refering the arrays to be printout
  TList listOfCombis;
  listOfCombis.SetOwner();
  
  // add a first empty combination
  Int_t nDim = hist->GetNdimensions();
  listOfCombis.AddLast(new TObjArray(nDim-2));
  
  // loop over the nDim-2 other rubrics
  for (Int_t i=2; i<nDim; i++) {
    
    // save the last label of that rubic
    THashList* labels = hist->GetAxis(i)->GetLabels();
    TObjString* lastLabel = (labels) ? static_cast<TObjString*>(labels->Last()) : 0x0;
    if (!lastLabel) return;
    
    // prepare iteration over the list of labels
    TIter nextLabel(labels);
    
    // loop over existing combinations
    TObjLink* lnk = listOfCombis.FirstLink();
    while (lnk) {
      
      // get the current combination
      TObjArray* currentCombi = static_cast<TObjArray*>(lnk->GetObject());
      
      // loop over labels in the current rubric
      nextLabel.Reset();
      TObjString* label = 0x0;
      while ((label = static_cast<TObjString*>(nextLabel()))) {
	
	// stop at the last one
	if (label == lastLabel) break;
	
	// copy the current combination, add the current label to it and add it to the list of combinations
	TObjArray* combi = new TObjArray(*currentCombi);
	combi->AddLast(label);
	listOfCombis.AddBefore(lnk, combi);
      }
      
      // add the last label to the current combination
      currentCombi->AddLast(lastLabel);
      
      lnk = lnk->Next();
    }
    
  }
  
  // create bin coordinates to access individual counters
  Int_t* bins = new Int_t[nDim];
  
  // create label flags
  Bool_t *useLabelX = 0x0, *useLabelY = 0x0;
  if (removeEmpty) {
    useLabelX = new Bool_t[labelsX->GetSize()+1];
    useLabelY = new Bool_t[labelsY->GetSize()+1];
  }
  
  // loop over each combination of labels
  TObjArray* combi = 0x0;
  TIter nextCombi(&listOfCombis);
  while ((combi = static_cast<TObjArray*>(nextCombi()))) {
    
    // make the name of the combination and fill the corresponding bin coordinates
    TString combiName = "/";
    for (Int_t i=2; i<nDim; i++) {
      TObjString* label = static_cast<TObjString*>(combi->UncheckedAt(i-2));
      combiName += Form("%s/",label->String().Data());
      bins[i] = (Int_t)label->GetUniqueID();
    }
    
    // reset the list of labels for which all counters are not empty
    if (removeEmpty) {
      memset(useLabelX, kFALSE, sizeof(Bool_t) * (labelsX->GetSize()+1));
      memset(useLabelY, kFALSE, sizeof(Bool_t) * (labelsY->GetSize()+1));
    }
    
    Bool_t empty = kTRUE;
    TObjString* labelX = 0x0;
    TObjString* labelY = 0x0;
    TIter nextLabelX(labelsX);
    TIter nextLabelY(labelsY);
    // loop over labels in X direction
    while ((labelX = static_cast<TObjString*>(nextLabelX()))) {
      bins[0] = (Int_t) labelX->GetUniqueID();
      
      // loop over labels in Y direction
      nextLabelY.Reset();
      while ((labelY = static_cast<TObjString*>(nextLabelY()))) {
	bins[1] = (Int_t) labelY->GetUniqueID();
	
	// both labels already set as used
	if (removeEmpty && useLabelX[bins[0]] && useLabelY[bins[1]]) continue;
	
	// skip empty bins
	if (hist->GetBinContent(bins) == 0.) continue;
	
	// set label as used and array as not empty
	empty = kFALSE;
	if (removeEmpty) {
	  useLabelX[bins[0]] = kTRUE;
	  useLabelY[bins[1]] = kTRUE;
	} else break;
	
      }
      
      if (!removeEmpty && !empty) break;
      
    }
    
    // skip empty arrays
    if (empty) continue;
    
    // print the name of the combination of labels refering the incoming array
    printf("\n%s:\n",combiName.Data());
    
    // print labels in Y axis
    printf(formatX.Data()," ");
    nextLabelY.Reset();
    while ((labelY = static_cast<TObjString*>(nextLabelY()))) {
      if (removeEmpty && !useLabelY[labelY->GetUniqueID()]) continue;
      printf(formatYs.Data(), labelY->String().Data());
    }
    
    // fill array for each label in X axis
    nextLabelX.Reset();
    while ((labelX = static_cast<TObjString*>(nextLabelX()))) {
      bins[0] = (Int_t) labelX->GetUniqueID();
      
      if (removeEmpty && !useLabelX[bins[0]]) continue;
      
      // print label X
      printf(formatX.Data(), labelX->String().Data());
      
      // print value for each label in Y axis
      nextLabelY.Reset();
      while ((labelY = static_cast<TObjString*>(nextLabelY()))) {
	bins[1] = (Int_t) labelY->GetUniqueID();
	if (removeEmpty && !useLabelY[bins[1]]) continue;
	if (fWeightedCounters) printf(formatYv.Data(), hist->GetBinContent(bins));
	else if (longCounters) printf(formatYv.Data(), (Long_t) hist->GetBinContent(bins));
	else printf(formatYv.Data(), (Int_t) hist->GetBinContent(bins));
      }
    }
    printf("\n\n");
  }
  
  // clean memory
  delete[] bins;
  if (removeEmpty) {
    delete[] useLabelX;
    delete[] useLabelY;
  }
}

//-----------------------------------------------------------------------
Int_t AliCounterCollection::GetMaxLabelSize(THashList* labels) const
{
  /// Return the number of characters of the longest label.
  Int_t maxLabelSize = 0;
  TObjString* label = 0x0;
  TIter nextLabel(labels);
  while ((label = static_cast<TObjString*>(nextLabel())))
    maxLabelSize = TMath::Max(maxLabelSize, label->String().Length());
  return maxLabelSize;
}

//-----------------------------------------------------------------------
TH1D* AliCounterCollection::Get(TString rubric, TString selections)
{
  /// Get counters of the rubric "rubric" for the given "selection".
  /// Format of "selections" is rubric:[any-]keyWord,keyWord,../rubric:[any-]keyWord,.. (order does not matter).
  /// Results are integrated over rubrics not specified neither in "rubric1" nor in "selections".
  /// It is the responsability of the user to delete the returned histogram.
  
  if (!fCounters) {
    AliError("counters are not initialized");
    return 0x0;
  }
  
  rubric.ToUpper();
  selections.ToUpper();
  
  // fill the rubrics to print
  TObjArray rubricsToPrint(1);
  rubricsToPrint.SetOwner();
  rubricsToPrint.AddLast(new TObjString(rubric.Data()));
  
  // project counters in the rubrics to print according to the selections
  Bool_t longCounters = kFALSE;
  TH1D* hist = static_cast<TH1D*>(Projection(rubricsToPrint, selections, longCounters));
  
  // make it ready to display
  if (hist) {
    
    // remove statistic box
    hist->SetStats(kFALSE);
    
    // prepare X axis
    TAxis* axis = hist->GetXaxis();
    THashList* labels = axis->GetLabels();
    Int_t nLabels = (labels) ? labels->GetSize() : 1;
    axis->SetRange(1,nLabels);
    axis->SetNdivisions(1,kFALSE);
    axis->SetTitle(rubric.Data());
    
    // prepare Y axis
    hist->GetYaxis()->SetTitle("Counts");
  }
  
  return hist;
}

//-----------------------------------------------------------------------
TH2D* AliCounterCollection::Get(TString rubric1, TString rubric2, TString selections)
{
  /// Get counters of the "rubric1" vs "rubric2" for the given "selection".
  /// Format of "selections" is rubric:[any-]keyWord,keyWord,../rubric:[any-]keyWord,.. (order does not matter).
  /// Results are integrated over rubrics not specified neither in "rubric1", "rubric2" nor in "selections".
  /// It is the responsability of the user to delete the returned histogram.
  
  if (!fCounters) {
    AliError("counters are not initialized");
    return 0x0;
  }
  
  rubric1.ToUpper();
  rubric2.ToUpper();
  selections.ToUpper();
  
  // fill the rubrics to print
  TObjArray rubricsToPrint(2);
  rubricsToPrint.SetOwner();
  rubricsToPrint.AddLast(new TObjString(rubric2.Data()));
  rubricsToPrint.AddLast(new TObjString(rubric1.Data()));
  
  // project counters in the rubrics to print according to the selections
  Bool_t longCounters = kFALSE;
  TH2D* hist = static_cast<TH2D*>(Projection(rubricsToPrint, selections, longCounters));
  
  // draw counters
  if (hist) {
    
    // remove statistic box
    hist->SetStats(kFALSE);
    
    // prepare X axis
    TAxis* axisX = hist->GetXaxis();
    THashList* labelsX = axisX->GetLabels();
    Int_t nLabelsX = (labelsX) ? labelsX->GetSize() : 1;
    axisX->SetRange(1,nLabelsX);
    axisX->SetNdivisions(1,kFALSE);
    axisX->SetTitle(rubric2.Data());
    
    // prepare Y axis
    TAxis* axisY = hist->GetYaxis();
    THashList* labelsY = axisY->GetLabels();
    Int_t nLabelsY = (labelsY) ? labelsY->GetSize() : 1;
    axisY->SetRange(1,nLabelsY);
    axisY->SetNdivisions(1,kFALSE);
    axisY->SetTitle(rubric1.Data());
  }
  
  return hist;
}

//-----------------------------------------------------------------------
TH1D* AliCounterCollection::Draw(TString rubric, TString selections)
{
  /// Draw counters of the rubric "rubric" for the given "selection".
  /// Format of "selections" is rubric:[any-]keyWord,keyWord,../rubric:[any-]keyWord,.. (order does not matter).
  /// Results are integrated over rubrics not specified neither in "rubric1" nor in "selections".
  /// It is the responsability of the user to delete the returned histogram.
  TH1D* hist = Get(rubric, selections);
  if (hist) hist->Draw("htext");
  return hist;
}

//-----------------------------------------------------------------------
TH2D* AliCounterCollection::Draw(TString rubric1, TString rubric2, TString selections)
{
  /// Draw counters of the "rubric1" vs "rubric2" for the given "selection".
  /// Format of "selections" is rubric:[any-]keyWord,keyWord,../rubric:[any-]keyWord,.. (order does not matter).
  /// Results are integrated over rubrics not specified neither in "rubric1", "rubric2" nor in "selections".
  /// It is the responsability of the user to delete the returned histogram.
  TH2D* hist = Get(rubric1, rubric2, selections);
  if (hist) hist->Draw("text");
  return hist;
}

//-----------------------------------------------------------------------
TObject* AliCounterCollection::Projection(const TObjArray& data, const TString& selections, Bool_t& longCounters)
{
  /// Return desired "data" for the given "selection" stored in a new histogram or 0x0 in case of failure.
  /// The type of the histogram (TH1D, TH2D or THnSparse) depend on the number of data.
  /// The flag "longCounters" tells whether the histogram contains value(s) larger than INT_MAX.
  /// It is the responsability of the user to delete the returned histogram.
  
  // set the flag "longCounters" according to the content of current counters
  longCounters = fLongCounters;
  
  // decode the selections
  Short_t** select = DecodeSelection(selections, data);
  if (!select) return 0x0;
  
  // define name and dimensions of projection histo
  TString name(fCounters->GetName());
  Int_t nDims = fCounters->GetNdimensions();
  Int_t nTargetDims = data.GetEntriesFast();
  TArrayI targetDims(nTargetDims);
  TArrayI nNewBins(nTargetDims);
  TArrayI* OldToNewCoord = new TArrayI[nTargetDims];
  for (Int_t i=0; i<nTargetDims; i++) {
    
    // histo name
    name += Form("_%s",static_cast<TObjString*>(data.UncheckedAt(i))->String().Data());
    
    // find target dims
    targetDims[i] = FindDim(static_cast<TObjString*>(data.UncheckedAt(i))->String());
    
    // set number of selected bins in the target dims and make the correspondence between old and new coordinates
    nNewBins[i] = 0;
    if (targetDims[i] > -1) {
      Int_t nBins = GetNActiveBins(targetDims[i]) + 1;
      OldToNewCoord[i].Set(nBins);
      for (Int_t j=1; j<nBins; j++) if (select[targetDims[i]][j] > 0) OldToNewCoord[i][j] = ++nNewBins[i];
    }
    
    // clean memory and return 0x0 in case of problem
    if (nNewBins[i] == 0) {
      for (Int_t iDim=0; iDim<nDims; iDim++) delete[] select[iDim];
      delete[] select;
      delete[] OldToNewCoord;
      return 0x0;
    }
    
  }
  
  // define title of projection histo
  TString title = "Selections:  ";
  TString selectionString(selections);
  selectionString.Remove(TString::kBoth, '/');
  if (selectionString.Length() > 0) title += Form("%s/", selectionString.Data());
  TObject* rub = 0x0;
  TIter nextRubric(fRubrics);
  while ((rub = nextRubric())) {
    if (selectionString.Contains(Form("%s:",rub->GetName()))) continue;
    if (data.Contains(rub->GetName())) continue;
    title += Form("%s:ANY/", rub->GetName());
  }
  title.ReplaceAll("/", "  ");
  
  // Create new histograms
  TObject* hist;
  if (nTargetDims == 1) hist = new TH1D(name.Data(), title.Data(), nNewBins[0], 0., 1.);
  else if (nTargetDims == 2) hist = new TH2D(name.Data(), title.Data(), nNewBins[0], 0., 1., nNewBins[1], 0., 1.);
  else if (fWeightedCounters) hist = new THnSparseT<TArrayF>(name.Data(), title.Data(), nTargetDims, nNewBins.GetArray(), 0x0, 0x0);
  else if (fLongCounters) hist = new THnSparseT<TArrayL>(name.Data(), title.Data(), nTargetDims, nNewBins.GetArray(), 0x0, 0x0);
  else hist = new THnSparseT<TArrayI>(name.Data(), title.Data(), nTargetDims, nNewBins.GetArray(), 0x0, 0x0);
  
  // Set new axis labels
  TObjString* label;
  if (nTargetDims < 3) {
    
    // X axis
    TIter nextLabelX(fCounters->GetAxis(targetDims[0])->GetLabels());
    while ((label = static_cast<TObjString*>(nextLabelX()))) {
      if (select[targetDims[0]][label->GetUniqueID()] > 0) {
	static_cast<TH1*>(hist)->GetXaxis()->SetBinLabel(OldToNewCoord[0][label->GetUniqueID()], label->String().Data());
      }
    }
    
    // Y axis if any
    if (nTargetDims == 2) {
      TIter nextLabelY(fCounters->GetAxis(targetDims[1])->GetLabels());
      while ((label = static_cast<TObjString*>(nextLabelY()))) {
	if (select[targetDims[1]][label->GetUniqueID()] > 0) {
	  static_cast<TH1*>(hist)->GetYaxis()->SetBinLabel(OldToNewCoord[1][label->GetUniqueID()], label->String().Data());
	}
      }
    }
    
  } else {
    
    // all axes
    for (Int_t i=0; i<nTargetDims; i++) {
      TIter nextLabel(fCounters->GetAxis(targetDims[i])->GetLabels());
      while ((label = static_cast<TObjString*>(nextLabel()))) {
	if (select[targetDims[i]][label->GetUniqueID()] > 0) {
	  static_cast<THnSparse*>(hist)->GetAxis(i)->SetBinLabel(OldToNewCoord[i][label->GetUniqueID()], label->String().Data());
	}
      }
    }
    
  }
  
  // loop over every filled counters
  Int_t* coord = new Int_t[nDims];
  Int_t* newCoord = new Int_t[nTargetDims];
  Int_t nEntries = 0;
  for (Long64_t i=0; i<fCounters->GetNbins(); ++i) {
    
    // get the content of the counter
    Double_t value = fCounters->GetBinContent(i, coord);
    
    // discard not selected counters and compute the selection factor
    Int_t selectionFactor = 1;
    for (Int_t dim = 0; dim < nDims && selectionFactor != 0; dim++) selectionFactor *= select[dim][coord[dim]];
    if (selectionFactor == 0) continue;
    
    // find new coordinates in the projection histo
    for (Int_t d = 0; d < nTargetDims; ++d) newCoord[d] = OldToNewCoord[d][coord[targetDims[d]]];
    
    // fill projection histo
    if (nTargetDims < 3) {
      
      Int_t linBin = (nTargetDims == 1) ? newCoord[0] : static_cast<TH1*>(hist)->GetBin(newCoord[0], newCoord[1]);
      static_cast<TH1*>(hist)->AddBinContent(linBin, selectionFactor*value);
      
      // check if the new value exceed INT_MAX (only in case of integer counters)
      if (!fWeightedCounters && !longCounters && static_cast<TH1*>(hist)->GetBinContent(linBin) > INT_MAX)
	longCounters = kTRUE;
      
    } else if (fWeightedCounters || longCounters) {
      
      static_cast<THnSparse*>(hist)->AddBinContent(newCoord, selectionFactor*value);
      
    } else {
      
      // switch to long counters if needed before filling
      Long64_t linBin = static_cast<THnSparse*>(hist)->GetBin(newCoord, kTRUE);
      Double_t currentValue = static_cast<THnSparse*>(hist)->GetBinContent(linBin);
      if (currentValue+selectionFactor*value > INT_MAX) {
	THnSparse* h = static_cast<THnSparse*>(hist);
	ConvertToTHnSparseL(h);
	hist = h;
	longCounters = kTRUE;
	static_cast<THnSparse*>(hist)->AddBinContent(newCoord, selectionFactor*value);
      } else static_cast<THnSparse*>(hist)->AddBinContent(linBin, selectionFactor*value);
      
    }
    
    nEntries++;
  }
  
  // update the number of entries
  if (nTargetDims < 3) static_cast<TH1*>(hist)->SetEntries(nEntries);
  else static_cast<THnSparse*>(hist)->SetEntries(nEntries);
  
  // clean memory
  for (Int_t iDim=0; iDim<nDims; iDim++) delete[] select[iDim];
  delete[] select;
  delete[] coord;
  delete[] newCoord;
  delete[] OldToNewCoord;
  
  return hist;
}

//-----------------------------------------------------------------------
Int_t* AliCounterCollection::CheckConsistency(const AliCounterCollection* c)
{
  /// Consistency check of the two counter collections. To be consistent, both counters
  /// must have the same rubrics with the same list of authorized key words if any.
  /// Return the correspondence between the local rubric ordering and the one of the other counter,
  /// or 0x0 in case of problem. It is the responsability of the user to delete the returned array.
  
  if (!fCounters || !c->fCounters) {
    AliError("counters are not initialized");
    return 0x0;
  }
  
  // check if both counters are weighted or not
  if (c->fWeightedCounters != fWeightedCounters) AliWarning("merging non-weighted with weigthed counters");
  
  // check if the number of rubrics is the same
  Int_t nRubrics = fRubrics->GetSize();
  if (c->fRubrics->GetSize() != nRubrics) {
    AliError("both counters do not contain the same number of rubrics");
    return 0x0;
  }
  
  Int_t* otherDims = new Int_t[nRubrics];
  
  // loop over local rubrics
  TObject* rubric1 = 0x0;
  TIter nextRubric(fRubrics);
  while ((rubric1 = nextRubric())) {
    
    // find that rubric in the other counter
    TObject* rubric2 = c->fRubrics->FindObject(rubric1->GetName());
    if (!rubric2) {
      AliError(Form("the other counter does not contain the rubric %s", rubric1->GetName()));
      delete[] otherDims;
      return 0x0;
    }
    
    // check the list of authorized key words if any
    TObjArray* keyWords1 = dynamic_cast<TObjArray*>(rubric1);
    TObjArray* keyWords2 = dynamic_cast<TObjArray*>(rubric2);
    if (keyWords1 && keyWords2) {
      
      // check if the number of key words is the same
      if (keyWords1->GetEntriesFast() != keyWords2->GetEntriesFast()) {
	AliError("that rubric does not contain the same number of authorized key words in both counters");
	delete[] otherDims;
	return 0x0;
      }
      
      // loop over local key words
      TObjString* keyWord = 0x0;
      TIter nextKeyWord(keyWords1);
      while ((keyWord = static_cast<TObjString*>(nextKeyWord()))) {
	
	// find that key word in the corresponding rubric of the other counter
	if (!keyWords2->FindObject(keyWord->String().Data())) {
	  AliError(Form("rubric %s does not contain the key word %s in the other counter", rubric1->GetName(), keyWord->String().Data()));
	  delete[] otherDims;
	  return 0x0;
	}
	
      }
      
    } else if (keyWords1 || keyWords2) {
      
      // that rubric has not been initialized the same way in both counter
      if (keyWords1) {
	AliError(Form("rubric %s of the other counter does not contain a list of authorized key words while this does", rubric1->GetName()));
      } else {
	AliError(Form("rubric %s of this counter does not contain a list of authorized key words while the other does", rubric1->GetName()));
      }
      delete[] otherDims;
      return 0x0;
      
    }
    
    // save the correspondence of rubric IDs in both counters
    otherDims[rubric1->GetUniqueID()] = rubric2->GetUniqueID();
    
  }
  
  return otherDims;
}

//-----------------------------------------------------------------------
void AliCounterCollection::Add(const AliCounterCollection* counter)
{
  /// Add the given AliCounterCollections to this. They must have the
  /// same rubrics with the same list of authorized key words if any.
  
  // check the consistency between the other counter and this and get the correspondences between rubric IDs.
  Int_t* otherDims = CheckConsistency(counter);
  if (!otherDims) return;
  
  // switch to long counters if the given counter collection is of that type
  if (counter->fLongCounters && !fLongCounters) {
    ConvertToTHnSparseL(fCounters);
    fLongCounters = kTRUE;
  }
  
  Int_t nRubrics = fCounters->GetNdimensions();
  Int_t* thisBins = new Int_t[nRubrics];
  Int_t* otherBins = new Int_t[nRubrics];
  
  // loop over every filled bins inside the other counter
  for (Long64_t i = 0; i < counter->fCounters->GetNbins(); i++) {
    
    // get the content of the bin
    Double_t value = counter->fCounters->GetBinContent(i, otherBins);
    
    // convert "other" bin coordinates to "this" bin coordinates
    Bool_t ok = kTRUE;
    for (Int_t dim = 0; dim < nRubrics; dim++) {
      TString label = counter->fCounters->GetAxis(otherDims[dim])->GetBinLabel(otherBins[otherDims[dim]]);
      thisBins[dim] = FindBin(dim, label, kTRUE);
      if (thisBins[dim] < 0) {
	AliError("this counter is full, unable to add that key word");
	ok = kFALSE;
	break;
      }
    }
    if (!ok) continue;
    
    if (fWeightedCounters || fLongCounters) {
      
      // increment the corresponding local counter
      fCounters->AddBinContent(thisBins, value);
      
    } else {
      
      // switch to long counters if needed before incrementing
      Long64_t linBin = fCounters->GetBin(thisBins, kTRUE);
      Double_t currentValue = fCounters->GetBinContent(linBin);
      if (currentValue+value > INT_MAX) {
	ConvertToTHnSparseL(fCounters);
	fLongCounters = kTRUE;
	fCounters->AddBinContent(thisBins, value);
      } else fCounters->AddBinContent(linBin, value);
      
    }
    
  }
  
  // clean memory
  delete[] otherDims;
  delete[] thisBins;
  delete[] otherBins;
}

//-----------------------------------------------------------------------
Long64_t AliCounterCollection::Merge(TCollection* list)
{
  /// Merge this with a list of AliCounterCollections. All AliCounterCollections provided
  /// must have the same rubrics with the same list of authorized key words if any.
  
  if (!list || !fCounters) return 0;
  if (list->IsEmpty()) return (Long64_t)fCounters->GetEntries();
  
  TIter next(list);
  const TObject* obj = 0x0;
  while ((obj = next())) {
    
    // check that "obj" is an object of the class AliCounterCollection
    const AliCounterCollection* counter = dynamic_cast<const AliCounterCollection*>(obj);
    if (!counter) {
      AliFatal(Form("object named \"%s\" is a %s instead of an AliCounterCollection!", obj->GetName(), obj->ClassName()));
      continue;
    }
    
    // merge counter to this one
    Add(counter);
    
  }
  
  return (Long64_t)fCounters->GetEntries();
}

//-----------------------------------------------------------------------
void AliCounterCollection::Sort(Option_t* opt, Bool_t asInt)
{
  /// Sort rubrics defined without a list of authorized key words or all rubrics if opt=="all".
  /// If asInt=kTRUE, key words are ordered as interger instead of alphabetically.
  
  if (!fCounters) {
    AliError("counters are not initialized");
    return;
  }
  
  Bool_t all = (!strcasecmp(opt, "all"));
  
  Bool_t somethingToSort = kFALSE;
  Int_t nRubrics = fRubrics->GetSize();
  Bool_t* rubricsToSort = new Bool_t[nRubrics];
  memset(rubricsToSort, kFALSE, sizeof(Bool_t) * nRubrics);
  
  // choose rubrics to sort
  TObject* rubric = 0x0;
  TIter nextRubric(fRubrics);
  while ((rubric = nextRubric())) {
    
    if (all || dynamic_cast<TObjString*>(rubric)) {
      
      // check if something to sort
      THashList* labels = fCounters->GetAxis((Int_t)rubric->GetUniqueID())->GetLabels();
      if (!labels || labels->GetSize() < 2) continue;
      
      // select that rubric
      rubricsToSort[(Int_t)rubric->GetUniqueID()] = kTRUE;
      somethingToSort = kTRUE;
      
    }
    
  }
  
  // sort selected rubrics if any
  if (somethingToSort) Sort(rubricsToSort, asInt);
  
  // clean memory
  delete[] rubricsToSort;
}

//-----------------------------------------------------------------------
void AliCounterCollection::SortRubric(TString rubric, Bool_t asInt)
{
  /// Sort only that rubric. If asInt=kTRUE, key words are ordered as interger instead of alphabetically.
  
  if (!fCounters) {
    AliError("counters are not initialized");
    return;
  }
  
  rubric.ToUpper();
  
  // find the rubric to sort
  Int_t dim = FindDim(rubric);
  if (dim < 0) return;
  
  // check if something to sort
  THashList* labels = fCounters->GetAxis(dim)->GetLabels();
  if (!labels || labels->GetSize() < 2) return;
  
  // select that rubric
  Int_t nRubrics = fRubrics->GetSize();
  Bool_t* rubricsToSort = new Bool_t[nRubrics];
  memset(rubricsToSort, kFALSE, sizeof(Bool_t) * nRubrics);
  rubricsToSort[dim] = kTRUE;
  
  // sort it
  Sort(rubricsToSort, asInt);
  
  // clean memory
  delete[] rubricsToSort;
}

//-----------------------------------------------------------------------
void AliCounterCollection::Sort(const Bool_t* rubricsToSort, Bool_t asInt)
{
  /// Sort labels (alphabetically or as integer) in each rubric flagged in "rubricsToSort".
  
  // create a new counter
  THnSparse* oldCounters = fCounters;
  Int_t nRubrics = fRubrics->GetSize();
  if (fWeightedCounters)
    fCounters = new THnSparseT<TArrayF>("hCounters", "hCounters", nRubrics, fRubricsSize->GetArray(), 0x0, 0x0);
  else if (fLongCounters)
    fCounters = new THnSparseT<TArrayL>("hCounters", "hCounters", nRubrics, fRubricsSize->GetArray(), 0x0, 0x0);
  else 
    fCounters = new THnSparseT<TArrayI>("hCounters", "hCounters", nRubrics, fRubricsSize->GetArray(), 0x0, 0x0);
  Int_t** newBins = new Int_t*[nRubrics];
  Bool_t newBinsFilled = kTRUE;
  
  // define the new axes
  for (Int_t i=0; i<nRubrics; i++) {
    TAxis* oldAxis = oldCounters->GetAxis(i);
    TAxis* newAxis = fCounters->GetAxis(i);
    
    // set the name of the new axis
    newAxis->SetName(oldAxis->GetName());
    
    // get old labels
    THashList* oldLabels = oldAxis->GetLabels();
    if (!oldLabels) {
      newBins[i] = 0x0;
      newBinsFilled = kFALSE;
      continue;
    }
    
    // sort them if required
    if (rubricsToSort[i]) {
      if (asInt) { oldLabels = SortAsInt(oldLabels); }
      else { oldLabels->Sort(); }
    }
    
    // set labels in the new axis and save the correspondence between new and old bins
    newBins[i] = new Int_t[oldLabels->GetSize()+1];
    TObjString* label = 0x0;
    Int_t bin = 1;
    TIter nextLabel(oldLabels);
    while ((label = static_cast<TObjString*>(nextLabel()))) {
      newAxis->SetBinLabel(bin, label->String().Data());
      newBins[i][(Int_t)label->GetUniqueID()] = bin;
      bin++;
    }
    
    // clean memory
    if (rubricsToSort[i] && asInt) delete oldLabels;
  }
  
  // fill the new fCounters only if all axes have label(s) defined (otherwise it is empty)
  if (newBinsFilled) {
    
    // fill the new counters
    Int_t* oldCoor = new Int_t[nRubrics];
    Int_t* newCoor = new Int_t[nRubrics];
    for (Long64_t i = 0; i < oldCounters->GetNbins(); i++) {
      Double_t value = oldCounters->GetBinContent(i, oldCoor);
      for (Int_t dim = 0; dim < nRubrics; dim++) newCoor[dim] = newBins[dim][oldCoor[dim]];    
      fCounters->AddBinContent(newCoor, value);
    }
    
    // clean memory
    delete[] oldCoor;
    delete[] newCoor;
  }
  
  // clean memory
  for (Int_t i=0; i<nRubrics; i++) delete[] newBins[i];
  delete[] newBins;
  delete oldCounters;
}

//-----------------------------------------------------------------------
THashList* AliCounterCollection::SortAsInt(const THashList* labels)
{
  /// Return a list (not owner) of labels sorted assuming they are integers.
  /// It is the responsability of user to delete the returned list.
  
  THashList* sortedLabels = new THashList(labels->GetSize());
  TIter nextSortedLabel(sortedLabels);
  
  // loop over labels
  TObjString* label = 0x0;
  TIter nextLabel(labels);
  while ((label = static_cast<TObjString*>(nextLabel()))) {
    
    // find where to add it
    TObjString* sortedLabel = 0x0;
    nextSortedLabel.Reset();
    while ((sortedLabel = static_cast<TObjString*>(nextSortedLabel())) &&
	   (sortedLabel->String().Atoi() <= label->String().Atoi())) {}
    
    // add it
    if (sortedLabel) sortedLabels->AddBefore(sortedLabel, label);
    else sortedLabels->AddLast(label);
  }
  
  return sortedLabels;
}

//-----------------------------------------------------------------------
void AliCounterCollection::ConvertToTHnSparseL(THnSparse* &h)
{
  /// Convert the given THnSparse to a THnSparseL (able to handle numbers >= 2^31)
  
  // create the new THnSparse
  Int_t nDims = h->GetNdimensions();
  Int_t* nBins = new Int_t[nDims];
  for (Int_t i=0; i<nDims; i++) nBins[i] = h->GetAxis(i)->GetNbins();
  THnSparse* hNew = new THnSparseT<TArrayL>("new", "new", nDims, nBins, 0x0, 0x0);
  delete[] nBins;
  
  // transfer the axes
  for (Int_t i=0; i<nDims; i++) {
    TAxis* oldAxis = h->GetAxis(i);
    TAxis* newAxis = hNew->GetAxis(i);
    
    // transfer the name
    newAxis->SetName(oldAxis->GetName());
    
    // transfer labels
    TObjString* label = 0x0;
    TIter nextLabel(oldAxis->GetLabels());
    while ((label = static_cast<TObjString*>(nextLabel())))
      newAxis->SetBinLabel(label->GetUniqueID(), label->String().Data());
  }
  
  // fill the new THnSparse
  Int_t* coor = new Int_t[nDims];
  for (Long64_t i = 0; i < h->GetNbins(); i++) {
    Double_t value = h->GetBinContent(i, coor);
    hNew->AddBinContent(coor, value);
  }
  delete[] coor;
  
  // transfer the number of entries
  hNew->SetEntries(h->GetEntries());
  
  // remove old THnSparse and transfer its name and title to the new one
  TString name(h->GetName());
  TString title(h->GetTitle());
  delete h;
  h = hNew;
  h->SetNameTitle(name.Data(), title.Data());
}

 AliCounterCollection.cxx:1
 AliCounterCollection.cxx:2
 AliCounterCollection.cxx:3
 AliCounterCollection.cxx:4
 AliCounterCollection.cxx:5
 AliCounterCollection.cxx:6
 AliCounterCollection.cxx:7
 AliCounterCollection.cxx:8
 AliCounterCollection.cxx:9
 AliCounterCollection.cxx:10
 AliCounterCollection.cxx:11
 AliCounterCollection.cxx:12
 AliCounterCollection.cxx:13
 AliCounterCollection.cxx:14
 AliCounterCollection.cxx:15
 AliCounterCollection.cxx:16
 AliCounterCollection.cxx:17
 AliCounterCollection.cxx:18
 AliCounterCollection.cxx:19
 AliCounterCollection.cxx:20
 AliCounterCollection.cxx:21
 AliCounterCollection.cxx:22
 AliCounterCollection.cxx:23
 AliCounterCollection.cxx:24
 AliCounterCollection.cxx:25
 AliCounterCollection.cxx:26
 AliCounterCollection.cxx:27
 AliCounterCollection.cxx:28
 AliCounterCollection.cxx:29
 AliCounterCollection.cxx:30
 AliCounterCollection.cxx:31
 AliCounterCollection.cxx:32
 AliCounterCollection.cxx:33
 AliCounterCollection.cxx:34
 AliCounterCollection.cxx:35
 AliCounterCollection.cxx:36
 AliCounterCollection.cxx:37
 AliCounterCollection.cxx:38
 AliCounterCollection.cxx:39
 AliCounterCollection.cxx:40
 AliCounterCollection.cxx:41
 AliCounterCollection.cxx:42
 AliCounterCollection.cxx:43
 AliCounterCollection.cxx:44
 AliCounterCollection.cxx:45
 AliCounterCollection.cxx:46
 AliCounterCollection.cxx:47
 AliCounterCollection.cxx:48
 AliCounterCollection.cxx:49
 AliCounterCollection.cxx:50
 AliCounterCollection.cxx:51
 AliCounterCollection.cxx:52
 AliCounterCollection.cxx:53
 AliCounterCollection.cxx:54
 AliCounterCollection.cxx:55
 AliCounterCollection.cxx:56
 AliCounterCollection.cxx:57
 AliCounterCollection.cxx:58
 AliCounterCollection.cxx:59
 AliCounterCollection.cxx:60
 AliCounterCollection.cxx:61
 AliCounterCollection.cxx:62
 AliCounterCollection.cxx:63
 AliCounterCollection.cxx:64
 AliCounterCollection.cxx:65
 AliCounterCollection.cxx:66
 AliCounterCollection.cxx:67
 AliCounterCollection.cxx:68
 AliCounterCollection.cxx:69
 AliCounterCollection.cxx:70
 AliCounterCollection.cxx:71
 AliCounterCollection.cxx:72
 AliCounterCollection.cxx:73
 AliCounterCollection.cxx:74
 AliCounterCollection.cxx:75
 AliCounterCollection.cxx:76
 AliCounterCollection.cxx:77
 AliCounterCollection.cxx:78
 AliCounterCollection.cxx:79
 AliCounterCollection.cxx:80
 AliCounterCollection.cxx:81
 AliCounterCollection.cxx:82
 AliCounterCollection.cxx:83
 AliCounterCollection.cxx:84
 AliCounterCollection.cxx:85
 AliCounterCollection.cxx:86
 AliCounterCollection.cxx:87
 AliCounterCollection.cxx:88
 AliCounterCollection.cxx:89
 AliCounterCollection.cxx:90
 AliCounterCollection.cxx:91
 AliCounterCollection.cxx:92
 AliCounterCollection.cxx:93
 AliCounterCollection.cxx:94
 AliCounterCollection.cxx:95
 AliCounterCollection.cxx:96
 AliCounterCollection.cxx:97
 AliCounterCollection.cxx:98
 AliCounterCollection.cxx:99
 AliCounterCollection.cxx:100
 AliCounterCollection.cxx:101
 AliCounterCollection.cxx:102
 AliCounterCollection.cxx:103
 AliCounterCollection.cxx:104
 AliCounterCollection.cxx:105
 AliCounterCollection.cxx:106
 AliCounterCollection.cxx:107
 AliCounterCollection.cxx:108
 AliCounterCollection.cxx:109
 AliCounterCollection.cxx:110
 AliCounterCollection.cxx:111
 AliCounterCollection.cxx:112
 AliCounterCollection.cxx:113
 AliCounterCollection.cxx:114
 AliCounterCollection.cxx:115
 AliCounterCollection.cxx:116
 AliCounterCollection.cxx:117
 AliCounterCollection.cxx:118
 AliCounterCollection.cxx:119
 AliCounterCollection.cxx:120
 AliCounterCollection.cxx:121
 AliCounterCollection.cxx:122
 AliCounterCollection.cxx:123
 AliCounterCollection.cxx:124
 AliCounterCollection.cxx:125
 AliCounterCollection.cxx:126
 AliCounterCollection.cxx:127
 AliCounterCollection.cxx:128
 AliCounterCollection.cxx:129
 AliCounterCollection.cxx:130
 AliCounterCollection.cxx:131
 AliCounterCollection.cxx:132
 AliCounterCollection.cxx:133
 AliCounterCollection.cxx:134
 AliCounterCollection.cxx:135
 AliCounterCollection.cxx:136
 AliCounterCollection.cxx:137
 AliCounterCollection.cxx:138
 AliCounterCollection.cxx:139
 AliCounterCollection.cxx:140
 AliCounterCollection.cxx:141
 AliCounterCollection.cxx:142
 AliCounterCollection.cxx:143
 AliCounterCollection.cxx:144
 AliCounterCollection.cxx:145
 AliCounterCollection.cxx:146
 AliCounterCollection.cxx:147
 AliCounterCollection.cxx:148
 AliCounterCollection.cxx:149
 AliCounterCollection.cxx:150
 AliCounterCollection.cxx:151
 AliCounterCollection.cxx:152
 AliCounterCollection.cxx:153
 AliCounterCollection.cxx:154
 AliCounterCollection.cxx:155
 AliCounterCollection.cxx:156
 AliCounterCollection.cxx:157
 AliCounterCollection.cxx:158
 AliCounterCollection.cxx:159
 AliCounterCollection.cxx:160
 AliCounterCollection.cxx:161
 AliCounterCollection.cxx:162
 AliCounterCollection.cxx:163
 AliCounterCollection.cxx:164
 AliCounterCollection.cxx:165
 AliCounterCollection.cxx:166
 AliCounterCollection.cxx:167
 AliCounterCollection.cxx:168
 AliCounterCollection.cxx:169
 AliCounterCollection.cxx:170
 AliCounterCollection.cxx:171
 AliCounterCollection.cxx:172
 AliCounterCollection.cxx:173
 AliCounterCollection.cxx:174
 AliCounterCollection.cxx:175
 AliCounterCollection.cxx:176
 AliCounterCollection.cxx:177
 AliCounterCollection.cxx:178
 AliCounterCollection.cxx:179
 AliCounterCollection.cxx:180
 AliCounterCollection.cxx:181
 AliCounterCollection.cxx:182
 AliCounterCollection.cxx:183
 AliCounterCollection.cxx:184
 AliCounterCollection.cxx:185
 AliCounterCollection.cxx:186
 AliCounterCollection.cxx:187
 AliCounterCollection.cxx:188
 AliCounterCollection.cxx:189
 AliCounterCollection.cxx:190
 AliCounterCollection.cxx:191
 AliCounterCollection.cxx:192
 AliCounterCollection.cxx:193
 AliCounterCollection.cxx:194
 AliCounterCollection.cxx:195
 AliCounterCollection.cxx:196
 AliCounterCollection.cxx:197
 AliCounterCollection.cxx:198
 AliCounterCollection.cxx:199
 AliCounterCollection.cxx:200
 AliCounterCollection.cxx:201
 AliCounterCollection.cxx:202
 AliCounterCollection.cxx:203
 AliCounterCollection.cxx:204
 AliCounterCollection.cxx:205
 AliCounterCollection.cxx:206
 AliCounterCollection.cxx:207
 AliCounterCollection.cxx:208
 AliCounterCollection.cxx:209
 AliCounterCollection.cxx:210
 AliCounterCollection.cxx:211
 AliCounterCollection.cxx:212
 AliCounterCollection.cxx:213
 AliCounterCollection.cxx:214
 AliCounterCollection.cxx:215
 AliCounterCollection.cxx:216
 AliCounterCollection.cxx:217
 AliCounterCollection.cxx:218
 AliCounterCollection.cxx:219
 AliCounterCollection.cxx:220
 AliCounterCollection.cxx:221
 AliCounterCollection.cxx:222
 AliCounterCollection.cxx:223
 AliCounterCollection.cxx:224
 AliCounterCollection.cxx:225
 AliCounterCollection.cxx:226
 AliCounterCollection.cxx:227
 AliCounterCollection.cxx:228
 AliCounterCollection.cxx:229
 AliCounterCollection.cxx:230
 AliCounterCollection.cxx:231
 AliCounterCollection.cxx:232
 AliCounterCollection.cxx:233
 AliCounterCollection.cxx:234
 AliCounterCollection.cxx:235
 AliCounterCollection.cxx:236
 AliCounterCollection.cxx:237
 AliCounterCollection.cxx:238
 AliCounterCollection.cxx:239
 AliCounterCollection.cxx:240
 AliCounterCollection.cxx:241
 AliCounterCollection.cxx:242
 AliCounterCollection.cxx:243
 AliCounterCollection.cxx:244
 AliCounterCollection.cxx:245
 AliCounterCollection.cxx:246
 AliCounterCollection.cxx:247
 AliCounterCollection.cxx:248
 AliCounterCollection.cxx:249
 AliCounterCollection.cxx:250
 AliCounterCollection.cxx:251
 AliCounterCollection.cxx:252
 AliCounterCollection.cxx:253
 AliCounterCollection.cxx:254
 AliCounterCollection.cxx:255
 AliCounterCollection.cxx:256
 AliCounterCollection.cxx:257
 AliCounterCollection.cxx:258
 AliCounterCollection.cxx:259
 AliCounterCollection.cxx:260
 AliCounterCollection.cxx:261
 AliCounterCollection.cxx:262
 AliCounterCollection.cxx:263
 AliCounterCollection.cxx:264
 AliCounterCollection.cxx:265
 AliCounterCollection.cxx:266
 AliCounterCollection.cxx:267
 AliCounterCollection.cxx:268
 AliCounterCollection.cxx:269
 AliCounterCollection.cxx:270
 AliCounterCollection.cxx:271
 AliCounterCollection.cxx:272
 AliCounterCollection.cxx:273
 AliCounterCollection.cxx:274
 AliCounterCollection.cxx:275
 AliCounterCollection.cxx:276
 AliCounterCollection.cxx:277
 AliCounterCollection.cxx:278
 AliCounterCollection.cxx:279
 AliCounterCollection.cxx:280
 AliCounterCollection.cxx:281
 AliCounterCollection.cxx:282
 AliCounterCollection.cxx:283
 AliCounterCollection.cxx:284
 AliCounterCollection.cxx:285
 AliCounterCollection.cxx:286
 AliCounterCollection.cxx:287
 AliCounterCollection.cxx:288
 AliCounterCollection.cxx:289
 AliCounterCollection.cxx:290
 AliCounterCollection.cxx:291
 AliCounterCollection.cxx:292
 AliCounterCollection.cxx:293
 AliCounterCollection.cxx:294
 AliCounterCollection.cxx:295
 AliCounterCollection.cxx:296
 AliCounterCollection.cxx:297
 AliCounterCollection.cxx:298
 AliCounterCollection.cxx:299
 AliCounterCollection.cxx:300
 AliCounterCollection.cxx:301
 AliCounterCollection.cxx:302
 AliCounterCollection.cxx:303
 AliCounterCollection.cxx:304
 AliCounterCollection.cxx:305
 AliCounterCollection.cxx:306
 AliCounterCollection.cxx:307
 AliCounterCollection.cxx:308
 AliCounterCollection.cxx:309
 AliCounterCollection.cxx:310
 AliCounterCollection.cxx:311
 AliCounterCollection.cxx:312
 AliCounterCollection.cxx:313
 AliCounterCollection.cxx:314
 AliCounterCollection.cxx:315
 AliCounterCollection.cxx:316
 AliCounterCollection.cxx:317
 AliCounterCollection.cxx:318
 AliCounterCollection.cxx:319
 AliCounterCollection.cxx:320
 AliCounterCollection.cxx:321
 AliCounterCollection.cxx:322
 AliCounterCollection.cxx:323
 AliCounterCollection.cxx:324
 AliCounterCollection.cxx:325
 AliCounterCollection.cxx:326
 AliCounterCollection.cxx:327
 AliCounterCollection.cxx:328
 AliCounterCollection.cxx:329
 AliCounterCollection.cxx:330
 AliCounterCollection.cxx:331
 AliCounterCollection.cxx:332
 AliCounterCollection.cxx:333
 AliCounterCollection.cxx:334
 AliCounterCollection.cxx:335
 AliCounterCollection.cxx:336
 AliCounterCollection.cxx:337
 AliCounterCollection.cxx:338
 AliCounterCollection.cxx:339
 AliCounterCollection.cxx:340
 AliCounterCollection.cxx:341
 AliCounterCollection.cxx:342
 AliCounterCollection.cxx:343
 AliCounterCollection.cxx:344
 AliCounterCollection.cxx:345
 AliCounterCollection.cxx:346
 AliCounterCollection.cxx:347
 AliCounterCollection.cxx:348
 AliCounterCollection.cxx:349
 AliCounterCollection.cxx:350
 AliCounterCollection.cxx:351
 AliCounterCollection.cxx:352
 AliCounterCollection.cxx:353
 AliCounterCollection.cxx:354
 AliCounterCollection.cxx:355
 AliCounterCollection.cxx:356
 AliCounterCollection.cxx:357
 AliCounterCollection.cxx:358
 AliCounterCollection.cxx:359
 AliCounterCollection.cxx:360
 AliCounterCollection.cxx:361
 AliCounterCollection.cxx:362
 AliCounterCollection.cxx:363
 AliCounterCollection.cxx:364
 AliCounterCollection.cxx:365
 AliCounterCollection.cxx:366
 AliCounterCollection.cxx:367
 AliCounterCollection.cxx:368
 AliCounterCollection.cxx:369
 AliCounterCollection.cxx:370
 AliCounterCollection.cxx:371
 AliCounterCollection.cxx:372
 AliCounterCollection.cxx:373
 AliCounterCollection.cxx:374
 AliCounterCollection.cxx:375
 AliCounterCollection.cxx:376
 AliCounterCollection.cxx:377
 AliCounterCollection.cxx:378
 AliCounterCollection.cxx:379
 AliCounterCollection.cxx:380
 AliCounterCollection.cxx:381
 AliCounterCollection.cxx:382
 AliCounterCollection.cxx:383
 AliCounterCollection.cxx:384
 AliCounterCollection.cxx:385
 AliCounterCollection.cxx:386
 AliCounterCollection.cxx:387
 AliCounterCollection.cxx:388
 AliCounterCollection.cxx:389
 AliCounterCollection.cxx:390
 AliCounterCollection.cxx:391
 AliCounterCollection.cxx:392
 AliCounterCollection.cxx:393
 AliCounterCollection.cxx:394
 AliCounterCollection.cxx:395
 AliCounterCollection.cxx:396
 AliCounterCollection.cxx:397
 AliCounterCollection.cxx:398
 AliCounterCollection.cxx:399
 AliCounterCollection.cxx:400
 AliCounterCollection.cxx:401
 AliCounterCollection.cxx:402
 AliCounterCollection.cxx:403
 AliCounterCollection.cxx:404
 AliCounterCollection.cxx:405
 AliCounterCollection.cxx:406
 AliCounterCollection.cxx:407
 AliCounterCollection.cxx:408
 AliCounterCollection.cxx:409
 AliCounterCollection.cxx:410
 AliCounterCollection.cxx:411
 AliCounterCollection.cxx:412
 AliCounterCollection.cxx:413
 AliCounterCollection.cxx:414
 AliCounterCollection.cxx:415
 AliCounterCollection.cxx:416
 AliCounterCollection.cxx:417
 AliCounterCollection.cxx:418
 AliCounterCollection.cxx:419
 AliCounterCollection.cxx:420
 AliCounterCollection.cxx:421
 AliCounterCollection.cxx:422
 AliCounterCollection.cxx:423
 AliCounterCollection.cxx:424
 AliCounterCollection.cxx:425
 AliCounterCollection.cxx:426
 AliCounterCollection.cxx:427
 AliCounterCollection.cxx:428
 AliCounterCollection.cxx:429
 AliCounterCollection.cxx:430
 AliCounterCollection.cxx:431
 AliCounterCollection.cxx:432
 AliCounterCollection.cxx:433
 AliCounterCollection.cxx:434
 AliCounterCollection.cxx:435
 AliCounterCollection.cxx:436
 AliCounterCollection.cxx:437
 AliCounterCollection.cxx:438
 AliCounterCollection.cxx:439
 AliCounterCollection.cxx:440
 AliCounterCollection.cxx:441
 AliCounterCollection.cxx:442
 AliCounterCollection.cxx:443
 AliCounterCollection.cxx:444
 AliCounterCollection.cxx:445
 AliCounterCollection.cxx:446
 AliCounterCollection.cxx:447
 AliCounterCollection.cxx:448
 AliCounterCollection.cxx:449
 AliCounterCollection.cxx:450
 AliCounterCollection.cxx:451
 AliCounterCollection.cxx:452
 AliCounterCollection.cxx:453
 AliCounterCollection.cxx:454
 AliCounterCollection.cxx:455
 AliCounterCollection.cxx:456
 AliCounterCollection.cxx:457
 AliCounterCollection.cxx:458
 AliCounterCollection.cxx:459
 AliCounterCollection.cxx:460
 AliCounterCollection.cxx:461
 AliCounterCollection.cxx:462
 AliCounterCollection.cxx:463
 AliCounterCollection.cxx:464
 AliCounterCollection.cxx:465
 AliCounterCollection.cxx:466
 AliCounterCollection.cxx:467
 AliCounterCollection.cxx:468
 AliCounterCollection.cxx:469
 AliCounterCollection.cxx:470
 AliCounterCollection.cxx:471
 AliCounterCollection.cxx:472
 AliCounterCollection.cxx:473
 AliCounterCollection.cxx:474
 AliCounterCollection.cxx:475
 AliCounterCollection.cxx:476
 AliCounterCollection.cxx:477
 AliCounterCollection.cxx:478
 AliCounterCollection.cxx:479
 AliCounterCollection.cxx:480
 AliCounterCollection.cxx:481
 AliCounterCollection.cxx:482
 AliCounterCollection.cxx:483
 AliCounterCollection.cxx:484
 AliCounterCollection.cxx:485
 AliCounterCollection.cxx:486
 AliCounterCollection.cxx:487
 AliCounterCollection.cxx:488
 AliCounterCollection.cxx:489
 AliCounterCollection.cxx:490
 AliCounterCollection.cxx:491
 AliCounterCollection.cxx:492
 AliCounterCollection.cxx:493
 AliCounterCollection.cxx:494
 AliCounterCollection.cxx:495
 AliCounterCollection.cxx:496
 AliCounterCollection.cxx:497
 AliCounterCollection.cxx:498
 AliCounterCollection.cxx:499
 AliCounterCollection.cxx:500
 AliCounterCollection.cxx:501
 AliCounterCollection.cxx:502
 AliCounterCollection.cxx:503
 AliCounterCollection.cxx:504
 AliCounterCollection.cxx:505
 AliCounterCollection.cxx:506
 AliCounterCollection.cxx:507
 AliCounterCollection.cxx:508
 AliCounterCollection.cxx:509
 AliCounterCollection.cxx:510
 AliCounterCollection.cxx:511
 AliCounterCollection.cxx:512
 AliCounterCollection.cxx:513
 AliCounterCollection.cxx:514
 AliCounterCollection.cxx:515
 AliCounterCollection.cxx:516
 AliCounterCollection.cxx:517
 AliCounterCollection.cxx:518
 AliCounterCollection.cxx:519
 AliCounterCollection.cxx:520
 AliCounterCollection.cxx:521
 AliCounterCollection.cxx:522
 AliCounterCollection.cxx:523
 AliCounterCollection.cxx:524
 AliCounterCollection.cxx:525
 AliCounterCollection.cxx:526
 AliCounterCollection.cxx:527
 AliCounterCollection.cxx:528
 AliCounterCollection.cxx:529
 AliCounterCollection.cxx:530
 AliCounterCollection.cxx:531
 AliCounterCollection.cxx:532
 AliCounterCollection.cxx:533
 AliCounterCollection.cxx:534
 AliCounterCollection.cxx:535
 AliCounterCollection.cxx:536
 AliCounterCollection.cxx:537
 AliCounterCollection.cxx:538
 AliCounterCollection.cxx:539
 AliCounterCollection.cxx:540
 AliCounterCollection.cxx:541
 AliCounterCollection.cxx:542
 AliCounterCollection.cxx:543
 AliCounterCollection.cxx:544
 AliCounterCollection.cxx:545
 AliCounterCollection.cxx:546
 AliCounterCollection.cxx:547
 AliCounterCollection.cxx:548
 AliCounterCollection.cxx:549
 AliCounterCollection.cxx:550
 AliCounterCollection.cxx:551
 AliCounterCollection.cxx:552
 AliCounterCollection.cxx:553
 AliCounterCollection.cxx:554
 AliCounterCollection.cxx:555
 AliCounterCollection.cxx:556
 AliCounterCollection.cxx:557
 AliCounterCollection.cxx:558
 AliCounterCollection.cxx:559
 AliCounterCollection.cxx:560
 AliCounterCollection.cxx:561
 AliCounterCollection.cxx:562
 AliCounterCollection.cxx:563
 AliCounterCollection.cxx:564
 AliCounterCollection.cxx:565
 AliCounterCollection.cxx:566
 AliCounterCollection.cxx:567
 AliCounterCollection.cxx:568
 AliCounterCollection.cxx:569
 AliCounterCollection.cxx:570
 AliCounterCollection.cxx:571
 AliCounterCollection.cxx:572
 AliCounterCollection.cxx:573
 AliCounterCollection.cxx:574
 AliCounterCollection.cxx:575
 AliCounterCollection.cxx:576
 AliCounterCollection.cxx:577
 AliCounterCollection.cxx:578
 AliCounterCollection.cxx:579
 AliCounterCollection.cxx:580
 AliCounterCollection.cxx:581
 AliCounterCollection.cxx:582
 AliCounterCollection.cxx:583
 AliCounterCollection.cxx:584
 AliCounterCollection.cxx:585
 AliCounterCollection.cxx:586
 AliCounterCollection.cxx:587
 AliCounterCollection.cxx:588
 AliCounterCollection.cxx:589
 AliCounterCollection.cxx:590
 AliCounterCollection.cxx:591
 AliCounterCollection.cxx:592
 AliCounterCollection.cxx:593
 AliCounterCollection.cxx:594
 AliCounterCollection.cxx:595
 AliCounterCollection.cxx:596
 AliCounterCollection.cxx:597
 AliCounterCollection.cxx:598
 AliCounterCollection.cxx:599
 AliCounterCollection.cxx:600
 AliCounterCollection.cxx:601
 AliCounterCollection.cxx:602
 AliCounterCollection.cxx:603
 AliCounterCollection.cxx:604
 AliCounterCollection.cxx:605
 AliCounterCollection.cxx:606
 AliCounterCollection.cxx:607
 AliCounterCollection.cxx:608
 AliCounterCollection.cxx:609
 AliCounterCollection.cxx:610
 AliCounterCollection.cxx:611
 AliCounterCollection.cxx:612
 AliCounterCollection.cxx:613
 AliCounterCollection.cxx:614
 AliCounterCollection.cxx:615
 AliCounterCollection.cxx:616
 AliCounterCollection.cxx:617
 AliCounterCollection.cxx:618
 AliCounterCollection.cxx:619
 AliCounterCollection.cxx:620
 AliCounterCollection.cxx:621
 AliCounterCollection.cxx:622
 AliCounterCollection.cxx:623
 AliCounterCollection.cxx:624
 AliCounterCollection.cxx:625
 AliCounterCollection.cxx:626
 AliCounterCollection.cxx:627
 AliCounterCollection.cxx:628
 AliCounterCollection.cxx:629
 AliCounterCollection.cxx:630
 AliCounterCollection.cxx:631
 AliCounterCollection.cxx:632
 AliCounterCollection.cxx:633
 AliCounterCollection.cxx:634
 AliCounterCollection.cxx:635
 AliCounterCollection.cxx:636
 AliCounterCollection.cxx:637
 AliCounterCollection.cxx:638
 AliCounterCollection.cxx:639
 AliCounterCollection.cxx:640
 AliCounterCollection.cxx:641
 AliCounterCollection.cxx:642
 AliCounterCollection.cxx:643
 AliCounterCollection.cxx:644
 AliCounterCollection.cxx:645
 AliCounterCollection.cxx:646
 AliCounterCollection.cxx:647
 AliCounterCollection.cxx:648
 AliCounterCollection.cxx:649
 AliCounterCollection.cxx:650
 AliCounterCollection.cxx:651
 AliCounterCollection.cxx:652
 AliCounterCollection.cxx:653
 AliCounterCollection.cxx:654
 AliCounterCollection.cxx:655
 AliCounterCollection.cxx:656
 AliCounterCollection.cxx:657
 AliCounterCollection.cxx:658
 AliCounterCollection.cxx:659
 AliCounterCollection.cxx:660
 AliCounterCollection.cxx:661
 AliCounterCollection.cxx:662
 AliCounterCollection.cxx:663
 AliCounterCollection.cxx:664
 AliCounterCollection.cxx:665
 AliCounterCollection.cxx:666
 AliCounterCollection.cxx:667
 AliCounterCollection.cxx:668
 AliCounterCollection.cxx:669
 AliCounterCollection.cxx:670
 AliCounterCollection.cxx:671
 AliCounterCollection.cxx:672
 AliCounterCollection.cxx:673
 AliCounterCollection.cxx:674
 AliCounterCollection.cxx:675
 AliCounterCollection.cxx:676
 AliCounterCollection.cxx:677
 AliCounterCollection.cxx:678
 AliCounterCollection.cxx:679
 AliCounterCollection.cxx:680
 AliCounterCollection.cxx:681
 AliCounterCollection.cxx:682
 AliCounterCollection.cxx:683
 AliCounterCollection.cxx:684
 AliCounterCollection.cxx:685
 AliCounterCollection.cxx:686
 AliCounterCollection.cxx:687
 AliCounterCollection.cxx:688
 AliCounterCollection.cxx:689
 AliCounterCollection.cxx:690
 AliCounterCollection.cxx:691
 AliCounterCollection.cxx:692
 AliCounterCollection.cxx:693
 AliCounterCollection.cxx:694
 AliCounterCollection.cxx:695
 AliCounterCollection.cxx:696
 AliCounterCollection.cxx:697
 AliCounterCollection.cxx:698
 AliCounterCollection.cxx:699
 AliCounterCollection.cxx:700
 AliCounterCollection.cxx:701
 AliCounterCollection.cxx:702
 AliCounterCollection.cxx:703
 AliCounterCollection.cxx:704
 AliCounterCollection.cxx:705
 AliCounterCollection.cxx:706
 AliCounterCollection.cxx:707
 AliCounterCollection.cxx:708
 AliCounterCollection.cxx:709
 AliCounterCollection.cxx:710
 AliCounterCollection.cxx:711
 AliCounterCollection.cxx:712
 AliCounterCollection.cxx:713
 AliCounterCollection.cxx:714
 AliCounterCollection.cxx:715
 AliCounterCollection.cxx:716
 AliCounterCollection.cxx:717
 AliCounterCollection.cxx:718
 AliCounterCollection.cxx:719
 AliCounterCollection.cxx:720
 AliCounterCollection.cxx:721
 AliCounterCollection.cxx:722
 AliCounterCollection.cxx:723
 AliCounterCollection.cxx:724
 AliCounterCollection.cxx:725
 AliCounterCollection.cxx:726
 AliCounterCollection.cxx:727
 AliCounterCollection.cxx:728
 AliCounterCollection.cxx:729
 AliCounterCollection.cxx:730
 AliCounterCollection.cxx:731
 AliCounterCollection.cxx:732
 AliCounterCollection.cxx:733
 AliCounterCollection.cxx:734
 AliCounterCollection.cxx:735
 AliCounterCollection.cxx:736
 AliCounterCollection.cxx:737
 AliCounterCollection.cxx:738
 AliCounterCollection.cxx:739
 AliCounterCollection.cxx:740
 AliCounterCollection.cxx:741
 AliCounterCollection.cxx:742
 AliCounterCollection.cxx:743
 AliCounterCollection.cxx:744
 AliCounterCollection.cxx:745
 AliCounterCollection.cxx:746
 AliCounterCollection.cxx:747
 AliCounterCollection.cxx:748
 AliCounterCollection.cxx:749
 AliCounterCollection.cxx:750
 AliCounterCollection.cxx:751
 AliCounterCollection.cxx:752
 AliCounterCollection.cxx:753
 AliCounterCollection.cxx:754
 AliCounterCollection.cxx:755
 AliCounterCollection.cxx:756
 AliCounterCollection.cxx:757
 AliCounterCollection.cxx:758
 AliCounterCollection.cxx:759
 AliCounterCollection.cxx:760
 AliCounterCollection.cxx:761
 AliCounterCollection.cxx:762
 AliCounterCollection.cxx:763
 AliCounterCollection.cxx:764
 AliCounterCollection.cxx:765
 AliCounterCollection.cxx:766
 AliCounterCollection.cxx:767
 AliCounterCollection.cxx:768
 AliCounterCollection.cxx:769
 AliCounterCollection.cxx:770
 AliCounterCollection.cxx:771
 AliCounterCollection.cxx:772
 AliCounterCollection.cxx:773
 AliCounterCollection.cxx:774
 AliCounterCollection.cxx:775
 AliCounterCollection.cxx:776
 AliCounterCollection.cxx:777
 AliCounterCollection.cxx:778
 AliCounterCollection.cxx:779
 AliCounterCollection.cxx:780
 AliCounterCollection.cxx:781
 AliCounterCollection.cxx:782
 AliCounterCollection.cxx:783
 AliCounterCollection.cxx:784
 AliCounterCollection.cxx:785
 AliCounterCollection.cxx:786
 AliCounterCollection.cxx:787
 AliCounterCollection.cxx:788
 AliCounterCollection.cxx:789
 AliCounterCollection.cxx:790
 AliCounterCollection.cxx:791
 AliCounterCollection.cxx:792
 AliCounterCollection.cxx:793
 AliCounterCollection.cxx:794
 AliCounterCollection.cxx:795
 AliCounterCollection.cxx:796
 AliCounterCollection.cxx:797
 AliCounterCollection.cxx:798
 AliCounterCollection.cxx:799
 AliCounterCollection.cxx:800
 AliCounterCollection.cxx:801
 AliCounterCollection.cxx:802
 AliCounterCollection.cxx:803
 AliCounterCollection.cxx:804
 AliCounterCollection.cxx:805
 AliCounterCollection.cxx:806
 AliCounterCollection.cxx:807
 AliCounterCollection.cxx:808
 AliCounterCollection.cxx:809
 AliCounterCollection.cxx:810
 AliCounterCollection.cxx:811
 AliCounterCollection.cxx:812
 AliCounterCollection.cxx:813
 AliCounterCollection.cxx:814
 AliCounterCollection.cxx:815
 AliCounterCollection.cxx:816
 AliCounterCollection.cxx:817
 AliCounterCollection.cxx:818
 AliCounterCollection.cxx:819
 AliCounterCollection.cxx:820
 AliCounterCollection.cxx:821
 AliCounterCollection.cxx:822
 AliCounterCollection.cxx:823
 AliCounterCollection.cxx:824
 AliCounterCollection.cxx:825
 AliCounterCollection.cxx:826
 AliCounterCollection.cxx:827
 AliCounterCollection.cxx:828
 AliCounterCollection.cxx:829
 AliCounterCollection.cxx:830
 AliCounterCollection.cxx:831
 AliCounterCollection.cxx:832
 AliCounterCollection.cxx:833
 AliCounterCollection.cxx:834
 AliCounterCollection.cxx:835
 AliCounterCollection.cxx:836
 AliCounterCollection.cxx:837
 AliCounterCollection.cxx:838
 AliCounterCollection.cxx:839
 AliCounterCollection.cxx:840
 AliCounterCollection.cxx:841
 AliCounterCollection.cxx:842
 AliCounterCollection.cxx:843
 AliCounterCollection.cxx:844
 AliCounterCollection.cxx:845
 AliCounterCollection.cxx:846
 AliCounterCollection.cxx:847
 AliCounterCollection.cxx:848
 AliCounterCollection.cxx:849
 AliCounterCollection.cxx:850
 AliCounterCollection.cxx:851
 AliCounterCollection.cxx:852
 AliCounterCollection.cxx:853
 AliCounterCollection.cxx:854
 AliCounterCollection.cxx:855
 AliCounterCollection.cxx:856
 AliCounterCollection.cxx:857
 AliCounterCollection.cxx:858
 AliCounterCollection.cxx:859
 AliCounterCollection.cxx:860
 AliCounterCollection.cxx:861
 AliCounterCollection.cxx:862
 AliCounterCollection.cxx:863
 AliCounterCollection.cxx:864
 AliCounterCollection.cxx:865
 AliCounterCollection.cxx:866
 AliCounterCollection.cxx:867
 AliCounterCollection.cxx:868
 AliCounterCollection.cxx:869
 AliCounterCollection.cxx:870
 AliCounterCollection.cxx:871
 AliCounterCollection.cxx:872
 AliCounterCollection.cxx:873
 AliCounterCollection.cxx:874
 AliCounterCollection.cxx:875
 AliCounterCollection.cxx:876
 AliCounterCollection.cxx:877
 AliCounterCollection.cxx:878
 AliCounterCollection.cxx:879
 AliCounterCollection.cxx:880
 AliCounterCollection.cxx:881
 AliCounterCollection.cxx:882
 AliCounterCollection.cxx:883
 AliCounterCollection.cxx:884
 AliCounterCollection.cxx:885
 AliCounterCollection.cxx:886
 AliCounterCollection.cxx:887
 AliCounterCollection.cxx:888
 AliCounterCollection.cxx:889
 AliCounterCollection.cxx:890
 AliCounterCollection.cxx:891
 AliCounterCollection.cxx:892
 AliCounterCollection.cxx:893
 AliCounterCollection.cxx:894
 AliCounterCollection.cxx:895
 AliCounterCollection.cxx:896
 AliCounterCollection.cxx:897
 AliCounterCollection.cxx:898
 AliCounterCollection.cxx:899
 AliCounterCollection.cxx:900
 AliCounterCollection.cxx:901
 AliCounterCollection.cxx:902
 AliCounterCollection.cxx:903
 AliCounterCollection.cxx:904
 AliCounterCollection.cxx:905
 AliCounterCollection.cxx:906
 AliCounterCollection.cxx:907
 AliCounterCollection.cxx:908
 AliCounterCollection.cxx:909
 AliCounterCollection.cxx:910
 AliCounterCollection.cxx:911
 AliCounterCollection.cxx:912
 AliCounterCollection.cxx:913
 AliCounterCollection.cxx:914
 AliCounterCollection.cxx:915
 AliCounterCollection.cxx:916
 AliCounterCollection.cxx:917
 AliCounterCollection.cxx:918
 AliCounterCollection.cxx:919
 AliCounterCollection.cxx:920
 AliCounterCollection.cxx:921
 AliCounterCollection.cxx:922
 AliCounterCollection.cxx:923
 AliCounterCollection.cxx:924
 AliCounterCollection.cxx:925
 AliCounterCollection.cxx:926
 AliCounterCollection.cxx:927
 AliCounterCollection.cxx:928
 AliCounterCollection.cxx:929
 AliCounterCollection.cxx:930
 AliCounterCollection.cxx:931
 AliCounterCollection.cxx:932
 AliCounterCollection.cxx:933
 AliCounterCollection.cxx:934
 AliCounterCollection.cxx:935
 AliCounterCollection.cxx:936
 AliCounterCollection.cxx:937
 AliCounterCollection.cxx:938
 AliCounterCollection.cxx:939
 AliCounterCollection.cxx:940
 AliCounterCollection.cxx:941
 AliCounterCollection.cxx:942
 AliCounterCollection.cxx:943
 AliCounterCollection.cxx:944
 AliCounterCollection.cxx:945
 AliCounterCollection.cxx:946
 AliCounterCollection.cxx:947
 AliCounterCollection.cxx:948
 AliCounterCollection.cxx:949
 AliCounterCollection.cxx:950
 AliCounterCollection.cxx:951
 AliCounterCollection.cxx:952
 AliCounterCollection.cxx:953
 AliCounterCollection.cxx:954
 AliCounterCollection.cxx:955
 AliCounterCollection.cxx:956
 AliCounterCollection.cxx:957
 AliCounterCollection.cxx:958
 AliCounterCollection.cxx:959
 AliCounterCollection.cxx:960
 AliCounterCollection.cxx:961
 AliCounterCollection.cxx:962
 AliCounterCollection.cxx:963
 AliCounterCollection.cxx:964
 AliCounterCollection.cxx:965
 AliCounterCollection.cxx:966
 AliCounterCollection.cxx:967
 AliCounterCollection.cxx:968
 AliCounterCollection.cxx:969
 AliCounterCollection.cxx:970
 AliCounterCollection.cxx:971
 AliCounterCollection.cxx:972
 AliCounterCollection.cxx:973
 AliCounterCollection.cxx:974
 AliCounterCollection.cxx:975
 AliCounterCollection.cxx:976
 AliCounterCollection.cxx:977
 AliCounterCollection.cxx:978
 AliCounterCollection.cxx:979
 AliCounterCollection.cxx:980
 AliCounterCollection.cxx:981
 AliCounterCollection.cxx:982
 AliCounterCollection.cxx:983
 AliCounterCollection.cxx:984
 AliCounterCollection.cxx:985
 AliCounterCollection.cxx:986
 AliCounterCollection.cxx:987
 AliCounterCollection.cxx:988
 AliCounterCollection.cxx:989
 AliCounterCollection.cxx:990
 AliCounterCollection.cxx:991
 AliCounterCollection.cxx:992
 AliCounterCollection.cxx:993
 AliCounterCollection.cxx:994
 AliCounterCollection.cxx:995
 AliCounterCollection.cxx:996
 AliCounterCollection.cxx:997
 AliCounterCollection.cxx:998
 AliCounterCollection.cxx:999
 AliCounterCollection.cxx:1000
 AliCounterCollection.cxx:1001
 AliCounterCollection.cxx:1002
 AliCounterCollection.cxx:1003
 AliCounterCollection.cxx:1004
 AliCounterCollection.cxx:1005
 AliCounterCollection.cxx:1006
 AliCounterCollection.cxx:1007
 AliCounterCollection.cxx:1008
 AliCounterCollection.cxx:1009
 AliCounterCollection.cxx:1010
 AliCounterCollection.cxx:1011
 AliCounterCollection.cxx:1012
 AliCounterCollection.cxx:1013
 AliCounterCollection.cxx:1014
 AliCounterCollection.cxx:1015
 AliCounterCollection.cxx:1016
 AliCounterCollection.cxx:1017
 AliCounterCollection.cxx:1018
 AliCounterCollection.cxx:1019
 AliCounterCollection.cxx:1020
 AliCounterCollection.cxx:1021
 AliCounterCollection.cxx:1022
 AliCounterCollection.cxx:1023
 AliCounterCollection.cxx:1024
 AliCounterCollection.cxx:1025
 AliCounterCollection.cxx:1026
 AliCounterCollection.cxx:1027
 AliCounterCollection.cxx:1028
 AliCounterCollection.cxx:1029
 AliCounterCollection.cxx:1030
 AliCounterCollection.cxx:1031
 AliCounterCollection.cxx:1032
 AliCounterCollection.cxx:1033
 AliCounterCollection.cxx:1034
 AliCounterCollection.cxx:1035
 AliCounterCollection.cxx:1036
 AliCounterCollection.cxx:1037
 AliCounterCollection.cxx:1038
 AliCounterCollection.cxx:1039
 AliCounterCollection.cxx:1040
 AliCounterCollection.cxx:1041
 AliCounterCollection.cxx:1042
 AliCounterCollection.cxx:1043
 AliCounterCollection.cxx:1044
 AliCounterCollection.cxx:1045
 AliCounterCollection.cxx:1046
 AliCounterCollection.cxx:1047
 AliCounterCollection.cxx:1048
 AliCounterCollection.cxx:1049
 AliCounterCollection.cxx:1050
 AliCounterCollection.cxx:1051
 AliCounterCollection.cxx:1052
 AliCounterCollection.cxx:1053
 AliCounterCollection.cxx:1054
 AliCounterCollection.cxx:1055
 AliCounterCollection.cxx:1056
 AliCounterCollection.cxx:1057
 AliCounterCollection.cxx:1058
 AliCounterCollection.cxx:1059
 AliCounterCollection.cxx:1060
 AliCounterCollection.cxx:1061
 AliCounterCollection.cxx:1062
 AliCounterCollection.cxx:1063
 AliCounterCollection.cxx:1064
 AliCounterCollection.cxx:1065
 AliCounterCollection.cxx:1066
 AliCounterCollection.cxx:1067
 AliCounterCollection.cxx:1068
 AliCounterCollection.cxx:1069
 AliCounterCollection.cxx:1070
 AliCounterCollection.cxx:1071
 AliCounterCollection.cxx:1072
 AliCounterCollection.cxx:1073
 AliCounterCollection.cxx:1074
 AliCounterCollection.cxx:1075
 AliCounterCollection.cxx:1076
 AliCounterCollection.cxx:1077
 AliCounterCollection.cxx:1078
 AliCounterCollection.cxx:1079
 AliCounterCollection.cxx:1080
 AliCounterCollection.cxx:1081
 AliCounterCollection.cxx:1082
 AliCounterCollection.cxx:1083
 AliCounterCollection.cxx:1084
 AliCounterCollection.cxx:1085
 AliCounterCollection.cxx:1086
 AliCounterCollection.cxx:1087
 AliCounterCollection.cxx:1088
 AliCounterCollection.cxx:1089
 AliCounterCollection.cxx:1090
 AliCounterCollection.cxx:1091
 AliCounterCollection.cxx:1092
 AliCounterCollection.cxx:1093
 AliCounterCollection.cxx:1094
 AliCounterCollection.cxx:1095
 AliCounterCollection.cxx:1096
 AliCounterCollection.cxx:1097
 AliCounterCollection.cxx:1098
 AliCounterCollection.cxx:1099
 AliCounterCollection.cxx:1100
 AliCounterCollection.cxx:1101
 AliCounterCollection.cxx:1102
 AliCounterCollection.cxx:1103
 AliCounterCollection.cxx:1104
 AliCounterCollection.cxx:1105
 AliCounterCollection.cxx:1106
 AliCounterCollection.cxx:1107
 AliCounterCollection.cxx:1108
 AliCounterCollection.cxx:1109
 AliCounterCollection.cxx:1110
 AliCounterCollection.cxx:1111
 AliCounterCollection.cxx:1112
 AliCounterCollection.cxx:1113
 AliCounterCollection.cxx:1114
 AliCounterCollection.cxx:1115
 AliCounterCollection.cxx:1116
 AliCounterCollection.cxx:1117
 AliCounterCollection.cxx:1118
 AliCounterCollection.cxx:1119
 AliCounterCollection.cxx:1120
 AliCounterCollection.cxx:1121
 AliCounterCollection.cxx:1122
 AliCounterCollection.cxx:1123
 AliCounterCollection.cxx:1124
 AliCounterCollection.cxx:1125
 AliCounterCollection.cxx:1126
 AliCounterCollection.cxx:1127
 AliCounterCollection.cxx:1128
 AliCounterCollection.cxx:1129
 AliCounterCollection.cxx:1130
 AliCounterCollection.cxx:1131
 AliCounterCollection.cxx:1132
 AliCounterCollection.cxx:1133
 AliCounterCollection.cxx:1134
 AliCounterCollection.cxx:1135
 AliCounterCollection.cxx:1136
 AliCounterCollection.cxx:1137
 AliCounterCollection.cxx:1138
 AliCounterCollection.cxx:1139
 AliCounterCollection.cxx:1140
 AliCounterCollection.cxx:1141
 AliCounterCollection.cxx:1142
 AliCounterCollection.cxx:1143
 AliCounterCollection.cxx:1144
 AliCounterCollection.cxx:1145
 AliCounterCollection.cxx:1146
 AliCounterCollection.cxx:1147
 AliCounterCollection.cxx:1148
 AliCounterCollection.cxx:1149
 AliCounterCollection.cxx:1150
 AliCounterCollection.cxx:1151
 AliCounterCollection.cxx:1152
 AliCounterCollection.cxx:1153
 AliCounterCollection.cxx:1154
 AliCounterCollection.cxx:1155
 AliCounterCollection.cxx:1156
 AliCounterCollection.cxx:1157
 AliCounterCollection.cxx:1158
 AliCounterCollection.cxx:1159
 AliCounterCollection.cxx:1160
 AliCounterCollection.cxx:1161
 AliCounterCollection.cxx:1162
 AliCounterCollection.cxx:1163
 AliCounterCollection.cxx:1164
 AliCounterCollection.cxx:1165
 AliCounterCollection.cxx:1166
 AliCounterCollection.cxx:1167
 AliCounterCollection.cxx:1168
 AliCounterCollection.cxx:1169
 AliCounterCollection.cxx:1170
 AliCounterCollection.cxx:1171
 AliCounterCollection.cxx:1172
 AliCounterCollection.cxx:1173
 AliCounterCollection.cxx:1174
 AliCounterCollection.cxx:1175
 AliCounterCollection.cxx:1176
 AliCounterCollection.cxx:1177
 AliCounterCollection.cxx:1178
 AliCounterCollection.cxx:1179
 AliCounterCollection.cxx:1180
 AliCounterCollection.cxx:1181
 AliCounterCollection.cxx:1182
 AliCounterCollection.cxx:1183
 AliCounterCollection.cxx:1184
 AliCounterCollection.cxx:1185
 AliCounterCollection.cxx:1186
 AliCounterCollection.cxx:1187
 AliCounterCollection.cxx:1188
 AliCounterCollection.cxx:1189
 AliCounterCollection.cxx:1190
 AliCounterCollection.cxx:1191
 AliCounterCollection.cxx:1192
 AliCounterCollection.cxx:1193
 AliCounterCollection.cxx:1194
 AliCounterCollection.cxx:1195
 AliCounterCollection.cxx:1196
 AliCounterCollection.cxx:1197
 AliCounterCollection.cxx:1198
 AliCounterCollection.cxx:1199
 AliCounterCollection.cxx:1200
 AliCounterCollection.cxx:1201
 AliCounterCollection.cxx:1202
 AliCounterCollection.cxx:1203
 AliCounterCollection.cxx:1204
 AliCounterCollection.cxx:1205
 AliCounterCollection.cxx:1206
 AliCounterCollection.cxx:1207
 AliCounterCollection.cxx:1208
 AliCounterCollection.cxx:1209
 AliCounterCollection.cxx:1210
 AliCounterCollection.cxx:1211
 AliCounterCollection.cxx:1212
 AliCounterCollection.cxx:1213
 AliCounterCollection.cxx:1214
 AliCounterCollection.cxx:1215
 AliCounterCollection.cxx:1216
 AliCounterCollection.cxx:1217
 AliCounterCollection.cxx:1218
 AliCounterCollection.cxx:1219
 AliCounterCollection.cxx:1220
 AliCounterCollection.cxx:1221
 AliCounterCollection.cxx:1222
 AliCounterCollection.cxx:1223
 AliCounterCollection.cxx:1224
 AliCounterCollection.cxx:1225
 AliCounterCollection.cxx:1226
 AliCounterCollection.cxx:1227
 AliCounterCollection.cxx:1228
 AliCounterCollection.cxx:1229
 AliCounterCollection.cxx:1230
 AliCounterCollection.cxx:1231
 AliCounterCollection.cxx:1232
 AliCounterCollection.cxx:1233
 AliCounterCollection.cxx:1234
 AliCounterCollection.cxx:1235
 AliCounterCollection.cxx:1236
 AliCounterCollection.cxx:1237
 AliCounterCollection.cxx:1238
 AliCounterCollection.cxx:1239
 AliCounterCollection.cxx:1240
 AliCounterCollection.cxx:1241
 AliCounterCollection.cxx:1242
 AliCounterCollection.cxx:1243
 AliCounterCollection.cxx:1244
 AliCounterCollection.cxx:1245
 AliCounterCollection.cxx:1246
 AliCounterCollection.cxx:1247
 AliCounterCollection.cxx:1248
 AliCounterCollection.cxx:1249
 AliCounterCollection.cxx:1250
 AliCounterCollection.cxx:1251
 AliCounterCollection.cxx:1252
 AliCounterCollection.cxx:1253
 AliCounterCollection.cxx:1254
 AliCounterCollection.cxx:1255
 AliCounterCollection.cxx:1256
 AliCounterCollection.cxx:1257
 AliCounterCollection.cxx:1258
 AliCounterCollection.cxx:1259
 AliCounterCollection.cxx:1260
 AliCounterCollection.cxx:1261
 AliCounterCollection.cxx:1262
 AliCounterCollection.cxx:1263
 AliCounterCollection.cxx:1264
 AliCounterCollection.cxx:1265
 AliCounterCollection.cxx:1266
 AliCounterCollection.cxx:1267
 AliCounterCollection.cxx:1268
 AliCounterCollection.cxx:1269
 AliCounterCollection.cxx:1270
 AliCounterCollection.cxx:1271
 AliCounterCollection.cxx:1272
 AliCounterCollection.cxx:1273
 AliCounterCollection.cxx:1274
 AliCounterCollection.cxx:1275
 AliCounterCollection.cxx:1276
 AliCounterCollection.cxx:1277
 AliCounterCollection.cxx:1278
 AliCounterCollection.cxx:1279
 AliCounterCollection.cxx:1280
 AliCounterCollection.cxx:1281
 AliCounterCollection.cxx:1282
 AliCounterCollection.cxx:1283
 AliCounterCollection.cxx:1284
 AliCounterCollection.cxx:1285
 AliCounterCollection.cxx:1286
 AliCounterCollection.cxx:1287
 AliCounterCollection.cxx:1288
 AliCounterCollection.cxx:1289
 AliCounterCollection.cxx:1290
 AliCounterCollection.cxx:1291
 AliCounterCollection.cxx:1292
 AliCounterCollection.cxx:1293
 AliCounterCollection.cxx:1294
 AliCounterCollection.cxx:1295
 AliCounterCollection.cxx:1296
 AliCounterCollection.cxx:1297
 AliCounterCollection.cxx:1298
 AliCounterCollection.cxx:1299
 AliCounterCollection.cxx:1300
 AliCounterCollection.cxx:1301
 AliCounterCollection.cxx:1302
 AliCounterCollection.cxx:1303
 AliCounterCollection.cxx:1304
 AliCounterCollection.cxx:1305
 AliCounterCollection.cxx:1306
 AliCounterCollection.cxx:1307
 AliCounterCollection.cxx:1308
 AliCounterCollection.cxx:1309
 AliCounterCollection.cxx:1310
 AliCounterCollection.cxx:1311
 AliCounterCollection.cxx:1312
 AliCounterCollection.cxx:1313
 AliCounterCollection.cxx:1314
 AliCounterCollection.cxx:1315
 AliCounterCollection.cxx:1316
 AliCounterCollection.cxx:1317
 AliCounterCollection.cxx:1318
 AliCounterCollection.cxx:1319
 AliCounterCollection.cxx:1320
 AliCounterCollection.cxx:1321
 AliCounterCollection.cxx:1322
 AliCounterCollection.cxx:1323
 AliCounterCollection.cxx:1324
 AliCounterCollection.cxx:1325
 AliCounterCollection.cxx:1326
 AliCounterCollection.cxx:1327
 AliCounterCollection.cxx:1328
 AliCounterCollection.cxx:1329
 AliCounterCollection.cxx:1330
 AliCounterCollection.cxx:1331
 AliCounterCollection.cxx:1332
 AliCounterCollection.cxx:1333
 AliCounterCollection.cxx:1334
 AliCounterCollection.cxx:1335
 AliCounterCollection.cxx:1336
 AliCounterCollection.cxx:1337
 AliCounterCollection.cxx:1338
 AliCounterCollection.cxx:1339
 AliCounterCollection.cxx:1340
 AliCounterCollection.cxx:1341
 AliCounterCollection.cxx:1342
 AliCounterCollection.cxx:1343
 AliCounterCollection.cxx:1344
 AliCounterCollection.cxx:1345
 AliCounterCollection.cxx:1346
 AliCounterCollection.cxx:1347
 AliCounterCollection.cxx:1348
 AliCounterCollection.cxx:1349
 AliCounterCollection.cxx:1350
 AliCounterCollection.cxx:1351
 AliCounterCollection.cxx:1352
 AliCounterCollection.cxx:1353
 AliCounterCollection.cxx:1354
 AliCounterCollection.cxx:1355
 AliCounterCollection.cxx:1356
 AliCounterCollection.cxx:1357
 AliCounterCollection.cxx:1358
 AliCounterCollection.cxx:1359
 AliCounterCollection.cxx:1360
 AliCounterCollection.cxx:1361
 AliCounterCollection.cxx:1362
 AliCounterCollection.cxx:1363
 AliCounterCollection.cxx:1364
 AliCounterCollection.cxx:1365
 AliCounterCollection.cxx:1366
 AliCounterCollection.cxx:1367
 AliCounterCollection.cxx:1368
 AliCounterCollection.cxx:1369
 AliCounterCollection.cxx:1370
 AliCounterCollection.cxx:1371
 AliCounterCollection.cxx:1372
 AliCounterCollection.cxx:1373
 AliCounterCollection.cxx:1374
 AliCounterCollection.cxx:1375
 AliCounterCollection.cxx:1376
 AliCounterCollection.cxx:1377
 AliCounterCollection.cxx:1378
 AliCounterCollection.cxx:1379
 AliCounterCollection.cxx:1380
 AliCounterCollection.cxx:1381
 AliCounterCollection.cxx:1382
 AliCounterCollection.cxx:1383
 AliCounterCollection.cxx:1384
 AliCounterCollection.cxx:1385
 AliCounterCollection.cxx:1386
 AliCounterCollection.cxx:1387
 AliCounterCollection.cxx:1388
 AliCounterCollection.cxx:1389
 AliCounterCollection.cxx:1390
 AliCounterCollection.cxx:1391
 AliCounterCollection.cxx:1392
 AliCounterCollection.cxx:1393
 AliCounterCollection.cxx:1394
 AliCounterCollection.cxx:1395
 AliCounterCollection.cxx:1396
 AliCounterCollection.cxx:1397
 AliCounterCollection.cxx:1398
 AliCounterCollection.cxx:1399
 AliCounterCollection.cxx:1400
 AliCounterCollection.cxx:1401
 AliCounterCollection.cxx:1402
 AliCounterCollection.cxx:1403
 AliCounterCollection.cxx:1404
 AliCounterCollection.cxx:1405
 AliCounterCollection.cxx:1406
 AliCounterCollection.cxx:1407
 AliCounterCollection.cxx:1408
 AliCounterCollection.cxx:1409
 AliCounterCollection.cxx:1410
 AliCounterCollection.cxx:1411
 AliCounterCollection.cxx:1412
 AliCounterCollection.cxx:1413
 AliCounterCollection.cxx:1414
 AliCounterCollection.cxx:1415
 AliCounterCollection.cxx:1416
 AliCounterCollection.cxx:1417
 AliCounterCollection.cxx:1418
 AliCounterCollection.cxx:1419
 AliCounterCollection.cxx:1420
 AliCounterCollection.cxx:1421
 AliCounterCollection.cxx:1422
 AliCounterCollection.cxx:1423
 AliCounterCollection.cxx:1424
 AliCounterCollection.cxx:1425
 AliCounterCollection.cxx:1426
 AliCounterCollection.cxx:1427
 AliCounterCollection.cxx:1428
 AliCounterCollection.cxx:1429
 AliCounterCollection.cxx:1430
 AliCounterCollection.cxx:1431
 AliCounterCollection.cxx:1432
 AliCounterCollection.cxx:1433
 AliCounterCollection.cxx:1434
 AliCounterCollection.cxx:1435
 AliCounterCollection.cxx:1436
 AliCounterCollection.cxx:1437
 AliCounterCollection.cxx:1438
 AliCounterCollection.cxx:1439
 AliCounterCollection.cxx:1440
 AliCounterCollection.cxx:1441
 AliCounterCollection.cxx:1442
 AliCounterCollection.cxx:1443
 AliCounterCollection.cxx:1444
 AliCounterCollection.cxx:1445
 AliCounterCollection.cxx:1446
 AliCounterCollection.cxx:1447
 AliCounterCollection.cxx:1448
 AliCounterCollection.cxx:1449
 AliCounterCollection.cxx:1450
 AliCounterCollection.cxx:1451
 AliCounterCollection.cxx:1452
 AliCounterCollection.cxx:1453
 AliCounterCollection.cxx:1454
 AliCounterCollection.cxx:1455
 AliCounterCollection.cxx:1456
 AliCounterCollection.cxx:1457
 AliCounterCollection.cxx:1458
 AliCounterCollection.cxx:1459
 AliCounterCollection.cxx:1460
 AliCounterCollection.cxx:1461
 AliCounterCollection.cxx:1462
 AliCounterCollection.cxx:1463
 AliCounterCollection.cxx:1464
 AliCounterCollection.cxx:1465
 AliCounterCollection.cxx:1466
 AliCounterCollection.cxx:1467
 AliCounterCollection.cxx:1468
 AliCounterCollection.cxx:1469
 AliCounterCollection.cxx:1470
 AliCounterCollection.cxx:1471
 AliCounterCollection.cxx:1472
 AliCounterCollection.cxx:1473
 AliCounterCollection.cxx:1474
 AliCounterCollection.cxx:1475
 AliCounterCollection.cxx:1476
 AliCounterCollection.cxx:1477
 AliCounterCollection.cxx:1478
 AliCounterCollection.cxx:1479
 AliCounterCollection.cxx:1480
 AliCounterCollection.cxx:1481
 AliCounterCollection.cxx:1482
 AliCounterCollection.cxx:1483
 AliCounterCollection.cxx:1484
 AliCounterCollection.cxx:1485
 AliCounterCollection.cxx:1486
 AliCounterCollection.cxx:1487
 AliCounterCollection.cxx:1488
 AliCounterCollection.cxx:1489
 AliCounterCollection.cxx:1490
 AliCounterCollection.cxx:1491
 AliCounterCollection.cxx:1492
 AliCounterCollection.cxx:1493
 AliCounterCollection.cxx:1494
 AliCounterCollection.cxx:1495
 AliCounterCollection.cxx:1496
 AliCounterCollection.cxx:1497
 AliCounterCollection.cxx:1498
 AliCounterCollection.cxx:1499
 AliCounterCollection.cxx:1500
 AliCounterCollection.cxx:1501
 AliCounterCollection.cxx:1502
 AliCounterCollection.cxx:1503
 AliCounterCollection.cxx:1504
 AliCounterCollection.cxx:1505
 AliCounterCollection.cxx:1506
 AliCounterCollection.cxx:1507
 AliCounterCollection.cxx:1508
 AliCounterCollection.cxx:1509
 AliCounterCollection.cxx:1510
 AliCounterCollection.cxx:1511
 AliCounterCollection.cxx:1512
 AliCounterCollection.cxx:1513
 AliCounterCollection.cxx:1514
 AliCounterCollection.cxx:1515
 AliCounterCollection.cxx:1516
 AliCounterCollection.cxx:1517
 AliCounterCollection.cxx:1518
 AliCounterCollection.cxx:1519
 AliCounterCollection.cxx:1520
 AliCounterCollection.cxx:1521
 AliCounterCollection.cxx:1522
 AliCounterCollection.cxx:1523
 AliCounterCollection.cxx:1524
 AliCounterCollection.cxx:1525
 AliCounterCollection.cxx:1526
 AliCounterCollection.cxx:1527
 AliCounterCollection.cxx:1528
 AliCounterCollection.cxx:1529
 AliCounterCollection.cxx:1530
 AliCounterCollection.cxx:1531
 AliCounterCollection.cxx:1532
 AliCounterCollection.cxx:1533
 AliCounterCollection.cxx:1534
 AliCounterCollection.cxx:1535
 AliCounterCollection.cxx:1536
 AliCounterCollection.cxx:1537
 AliCounterCollection.cxx:1538
 AliCounterCollection.cxx:1539
 AliCounterCollection.cxx:1540
 AliCounterCollection.cxx:1541
 AliCounterCollection.cxx:1542
 AliCounterCollection.cxx:1543
 AliCounterCollection.cxx:1544
 AliCounterCollection.cxx:1545
 AliCounterCollection.cxx:1546
 AliCounterCollection.cxx:1547
 AliCounterCollection.cxx:1548
 AliCounterCollection.cxx:1549
 AliCounterCollection.cxx:1550
 AliCounterCollection.cxx:1551
 AliCounterCollection.cxx:1552
 AliCounterCollection.cxx:1553
 AliCounterCollection.cxx:1554
 AliCounterCollection.cxx:1555
 AliCounterCollection.cxx:1556
 AliCounterCollection.cxx:1557
 AliCounterCollection.cxx:1558
 AliCounterCollection.cxx:1559
 AliCounterCollection.cxx:1560
 AliCounterCollection.cxx:1561
 AliCounterCollection.cxx:1562
 AliCounterCollection.cxx:1563
 AliCounterCollection.cxx:1564
 AliCounterCollection.cxx:1565
 AliCounterCollection.cxx:1566
 AliCounterCollection.cxx:1567
 AliCounterCollection.cxx:1568
 AliCounterCollection.cxx:1569
 AliCounterCollection.cxx:1570
 AliCounterCollection.cxx:1571
 AliCounterCollection.cxx:1572
 AliCounterCollection.cxx:1573
 AliCounterCollection.cxx:1574
 AliCounterCollection.cxx:1575
 AliCounterCollection.cxx:1576
 AliCounterCollection.cxx:1577
 AliCounterCollection.cxx:1578
 AliCounterCollection.cxx:1579
 AliCounterCollection.cxx:1580
 AliCounterCollection.cxx:1581
 AliCounterCollection.cxx:1582
 AliCounterCollection.cxx:1583
 AliCounterCollection.cxx:1584
 AliCounterCollection.cxx:1585
 AliCounterCollection.cxx:1586
 AliCounterCollection.cxx:1587
 AliCounterCollection.cxx:1588
 AliCounterCollection.cxx:1589
 AliCounterCollection.cxx:1590
 AliCounterCollection.cxx:1591
 AliCounterCollection.cxx:1592
 AliCounterCollection.cxx:1593
 AliCounterCollection.cxx:1594
 AliCounterCollection.cxx:1595
 AliCounterCollection.cxx:1596
 AliCounterCollection.cxx:1597
 AliCounterCollection.cxx:1598
 AliCounterCollection.cxx:1599
 AliCounterCollection.cxx:1600
 AliCounterCollection.cxx:1601
 AliCounterCollection.cxx:1602
 AliCounterCollection.cxx:1603
 AliCounterCollection.cxx:1604
 AliCounterCollection.cxx:1605
 AliCounterCollection.cxx:1606
 AliCounterCollection.cxx:1607
 AliCounterCollection.cxx:1608
 AliCounterCollection.cxx:1609
 AliCounterCollection.cxx:1610
 AliCounterCollection.cxx:1611
 AliCounterCollection.cxx:1612
 AliCounterCollection.cxx:1613
 AliCounterCollection.cxx:1614
 AliCounterCollection.cxx:1615
 AliCounterCollection.cxx:1616
 AliCounterCollection.cxx:1617
 AliCounterCollection.cxx:1618
 AliCounterCollection.cxx:1619
 AliCounterCollection.cxx:1620
 AliCounterCollection.cxx:1621
 AliCounterCollection.cxx:1622
 AliCounterCollection.cxx:1623
 AliCounterCollection.cxx:1624
 AliCounterCollection.cxx:1625
 AliCounterCollection.cxx:1626
 AliCounterCollection.cxx:1627
 AliCounterCollection.cxx:1628
 AliCounterCollection.cxx:1629
 AliCounterCollection.cxx:1630
 AliCounterCollection.cxx:1631
 AliCounterCollection.cxx:1632
 AliCounterCollection.cxx:1633
 AliCounterCollection.cxx:1634
 AliCounterCollection.cxx:1635
 AliCounterCollection.cxx:1636
 AliCounterCollection.cxx:1637
 AliCounterCollection.cxx:1638
 AliCounterCollection.cxx:1639
 AliCounterCollection.cxx:1640
 AliCounterCollection.cxx:1641
 AliCounterCollection.cxx:1642
 AliCounterCollection.cxx:1643
 AliCounterCollection.cxx:1644
 AliCounterCollection.cxx:1645
 AliCounterCollection.cxx:1646
 AliCounterCollection.cxx:1647
 AliCounterCollection.cxx:1648
 AliCounterCollection.cxx:1649
 AliCounterCollection.cxx:1650
 AliCounterCollection.cxx:1651
 AliCounterCollection.cxx:1652
 AliCounterCollection.cxx:1653
 AliCounterCollection.cxx:1654
 AliCounterCollection.cxx:1655
 AliCounterCollection.cxx:1656
 AliCounterCollection.cxx:1657
 AliCounterCollection.cxx:1658
 AliCounterCollection.cxx:1659
 AliCounterCollection.cxx:1660
 AliCounterCollection.cxx:1661
 AliCounterCollection.cxx:1662
 AliCounterCollection.cxx:1663
 AliCounterCollection.cxx:1664
 AliCounterCollection.cxx:1665
 AliCounterCollection.cxx:1666
 AliCounterCollection.cxx:1667
 AliCounterCollection.cxx:1668
 AliCounterCollection.cxx:1669
 AliCounterCollection.cxx:1670
 AliCounterCollection.cxx:1671
 AliCounterCollection.cxx:1672
 AliCounterCollection.cxx:1673
 AliCounterCollection.cxx:1674
 AliCounterCollection.cxx:1675
 AliCounterCollection.cxx:1676
 AliCounterCollection.cxx:1677
 AliCounterCollection.cxx:1678
 AliCounterCollection.cxx:1679
 AliCounterCollection.cxx:1680
 AliCounterCollection.cxx:1681
 AliCounterCollection.cxx:1682
 AliCounterCollection.cxx:1683
 AliCounterCollection.cxx:1684
 AliCounterCollection.cxx:1685
 AliCounterCollection.cxx:1686
 AliCounterCollection.cxx:1687
 AliCounterCollection.cxx:1688
 AliCounterCollection.cxx:1689
 AliCounterCollection.cxx:1690
 AliCounterCollection.cxx:1691
 AliCounterCollection.cxx:1692
 AliCounterCollection.cxx:1693
 AliCounterCollection.cxx:1694
 AliCounterCollection.cxx:1695
 AliCounterCollection.cxx:1696
 AliCounterCollection.cxx:1697
 AliCounterCollection.cxx:1698
 AliCounterCollection.cxx:1699
 AliCounterCollection.cxx:1700
 AliCounterCollection.cxx:1701
 AliCounterCollection.cxx:1702
 AliCounterCollection.cxx:1703
 AliCounterCollection.cxx:1704
 AliCounterCollection.cxx:1705
 AliCounterCollection.cxx:1706
 AliCounterCollection.cxx:1707
 AliCounterCollection.cxx:1708
 AliCounterCollection.cxx:1709
 AliCounterCollection.cxx:1710
 AliCounterCollection.cxx:1711
 AliCounterCollection.cxx:1712
 AliCounterCollection.cxx:1713
 AliCounterCollection.cxx:1714
 AliCounterCollection.cxx:1715
 AliCounterCollection.cxx:1716
 AliCounterCollection.cxx:1717
 AliCounterCollection.cxx:1718
 AliCounterCollection.cxx:1719
 AliCounterCollection.cxx:1720
 AliCounterCollection.cxx:1721
 AliCounterCollection.cxx:1722
 AliCounterCollection.cxx:1723
 AliCounterCollection.cxx:1724
 AliCounterCollection.cxx:1725
 AliCounterCollection.cxx:1726
 AliCounterCollection.cxx:1727
 AliCounterCollection.cxx:1728
 AliCounterCollection.cxx:1729
 AliCounterCollection.cxx:1730
 AliCounterCollection.cxx:1731
 AliCounterCollection.cxx:1732
 AliCounterCollection.cxx:1733
 AliCounterCollection.cxx:1734
 AliCounterCollection.cxx:1735
 AliCounterCollection.cxx:1736
 AliCounterCollection.cxx:1737
 AliCounterCollection.cxx:1738
 AliCounterCollection.cxx:1739
 AliCounterCollection.cxx:1740
 AliCounterCollection.cxx:1741
 AliCounterCollection.cxx:1742
 AliCounterCollection.cxx:1743
 AliCounterCollection.cxx:1744
 AliCounterCollection.cxx:1745
 AliCounterCollection.cxx:1746
 AliCounterCollection.cxx:1747
 AliCounterCollection.cxx:1748
 AliCounterCollection.cxx:1749
 AliCounterCollection.cxx:1750
 AliCounterCollection.cxx:1751
 AliCounterCollection.cxx:1752
 AliCounterCollection.cxx:1753
 AliCounterCollection.cxx:1754
 AliCounterCollection.cxx:1755
 AliCounterCollection.cxx:1756
 AliCounterCollection.cxx:1757
 AliCounterCollection.cxx:1758
 AliCounterCollection.cxx:1759
 AliCounterCollection.cxx:1760
 AliCounterCollection.cxx:1761
 AliCounterCollection.cxx:1762
 AliCounterCollection.cxx:1763
 AliCounterCollection.cxx:1764
 AliCounterCollection.cxx:1765
 AliCounterCollection.cxx:1766
 AliCounterCollection.cxx:1767
 AliCounterCollection.cxx:1768
 AliCounterCollection.cxx:1769
 AliCounterCollection.cxx:1770
 AliCounterCollection.cxx:1771
 AliCounterCollection.cxx:1772
 AliCounterCollection.cxx:1773
 AliCounterCollection.cxx:1774
 AliCounterCollection.cxx:1775
 AliCounterCollection.cxx:1776
 AliCounterCollection.cxx:1777
 AliCounterCollection.cxx:1778
 AliCounterCollection.cxx:1779
 AliCounterCollection.cxx:1780
 AliCounterCollection.cxx:1781
 AliCounterCollection.cxx:1782
 AliCounterCollection.cxx:1783
 AliCounterCollection.cxx:1784
 AliCounterCollection.cxx:1785
 AliCounterCollection.cxx:1786
 AliCounterCollection.cxx:1787
 AliCounterCollection.cxx:1788
 AliCounterCollection.cxx:1789
 AliCounterCollection.cxx:1790
 AliCounterCollection.cxx:1791
 AliCounterCollection.cxx:1792
 AliCounterCollection.cxx:1793
 AliCounterCollection.cxx:1794
 AliCounterCollection.cxx:1795
 AliCounterCollection.cxx:1796
 AliCounterCollection.cxx:1797
 AliCounterCollection.cxx:1798
 AliCounterCollection.cxx:1799
 AliCounterCollection.cxx:1800
 AliCounterCollection.cxx:1801
 AliCounterCollection.cxx:1802
 AliCounterCollection.cxx:1803
 AliCounterCollection.cxx:1804
 AliCounterCollection.cxx:1805
 AliCounterCollection.cxx:1806
 AliCounterCollection.cxx:1807
 AliCounterCollection.cxx:1808
 AliCounterCollection.cxx:1809
 AliCounterCollection.cxx:1810
 AliCounterCollection.cxx:1811
 AliCounterCollection.cxx:1812
 AliCounterCollection.cxx:1813
 AliCounterCollection.cxx:1814
 AliCounterCollection.cxx:1815
 AliCounterCollection.cxx:1816
 AliCounterCollection.cxx:1817