ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, 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 for logging debug, info and error messages                          //
//                                                                           //
// The AliLog class is a singleton class. It allows to steer the output      //
// level and output streams for different types of messages via static       //
// methods.                                                                  //
//                                                                           //
// It also handles the messages produces by the preprocessor macros defined  //
// in the header file: AliDebug, AliInfo, AliWarning, AliError, AliFatal.    //
//                                                                           //
// More details about the message logging can be found on the ALICE Offline  //
// web page.                                                                 //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include <cstdlib>
#include <strings.h>
#include <Riostream.h>
#include <TError.h>
#include <TNamed.h>
#include <TSystem.h>
#include <TEnv.h>
#include <TArrayC.h>
#include <Varargs.h> // platform independent definition of va_copy

#include "AliLog.h"
// STD
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdexcept>
#include <functional>



using std::endl;
using std::cout;
using std::ostream;
using std::cerr;
using std::ofstream;
using std::ios;
ClassImp(AliLog)

// implementation of a singleton here
AliLog* AliLog::fgInstance = NULL;

Bool_t AliLog::fgDebugEnabled = kTRUE;
Bool_t AliLog::fgCoreEnabled = kFALSE;

/**
 * get root logger singleton instance
 */
AliLog *AliLog::GetRootLogger()
{
	if (fgInstance == NULL)
	{
		// creating singleton
		fgInstance =  new AliLog;
	}

	return fgInstance;
}

/**
 * delete the root logger singleton instance
 */
void AliLog::DeleteRootLogger()
{
	if (fgInstance != NULL)
	{
		delete fgInstance;
		fgInstance = NULL;
	}
}

/**
 * default private constructor
 */
AliLog::AliLog() :
  TObject(),
  fGlobalLogLevel(kInfo),
  fModuleDebugLevels(),
  fClassDebugLevels(),
  fPrintRepetitions(kTRUE),
  fRepetitions(0),
  fLastType(0),
  fLastMessage(),
  fLastModule(),
  fLastClassName(),
  fLastFunction(),
  fLastFile(),
  fLastLine(0)
{
// default constructor: set default values

  for (Int_t iType = kFatal; iType < kMaxType; iType++)
  {
    fOutputTypes[iType] = 0;
    fFileNames[iType] = "";
    fOutputFiles[iType] = NULL;
    fOutputStreams[iType] = NULL;
    fCallBacks[iType]=NULL;

    fPrintType[iType] = kTRUE;
    fPrintModule[iType] = kFALSE;
    fPrintScope[iType] = kTRUE;
    fPrintLocation[iType] = (iType == kDebug);  
  }

  // TO BE REVIEWED
  // replace the previous instance by this one
  if (fgInstance) delete fgInstance;
  fgInstance = this;

  SetHandleRootMessages(kTRUE);

  // read the .rootrc settings
  ReadEnvSettings();
}

/**
 * private destructor
 */
AliLog::~AliLog()
{
// destructor: clean up and reset instance pointer

  if (fRepetitions > 0) PrintRepetitions();

  for (Int_t i = 0; i < fModuleDebugLevels.GetEntriesFast(); i++)
  {
    if (fModuleDebugLevels[i]) fModuleDebugLevels[i]->Delete();
  }

  fClassDebugLevels.Delete();

  for (Int_t i = 0; i < fClassDebugLevels.GetEntriesFast(); i++)
  {
    if (fClassDebugLevels[i]) fClassDebugLevels[i]->Delete();
  }

  fClassDebugLevels.Delete();

  for (Int_t iType = kFatal; iType < kMaxType; iType++)
  {
    CloseFile(iType);
  }

  fflush(stderr);
  fflush(stdout);

  fgInstance = NULL;
}

// NOT IMPLEMENTED!?
//_____________________________________________________________________________
AliLog::AliLog(const AliLog& log) :
  TObject(log),
  fGlobalLogLevel(log.fGlobalLogLevel),
  fModuleDebugLevels(log.fModuleDebugLevels),
  fClassDebugLevels(log.fClassDebugLevels),
  fPrintRepetitions(log.fPrintRepetitions),
  fRepetitions(log.fRepetitions),
  fLastType(log.fLastType),
  fLastMessage(log.fLastMessage),
  fLastModule(log.fLastModule),
  fLastClassName(log.fLastClassName),
  fLastFunction(log.fLastFunction),
  fLastFile(log.fLastFile),
  fLastLine(log.fLastLine)
{
// copy constructor

  Fatal("AliLog", "copy constructor not implemented");
}

// NOT IMPLEMENTED!?
//_____________________________________________________________________________
AliLog& AliLog::operator = (const AliLog& /*log*/)
{
// assignment operator

  Fatal("operator =", "assignment operator not implemented");
  return *this;
}


/**
 * gSystem see TSystem.h
 * gEnv see TEnv.h
 *
 * LOG_NO_DEBUG: fgDebugEnabled <- false
 * AliRoot.AliLog.EnableDebug
 * AliRoot.AliLog.GlobalLogLevel
 */
//_____________________________________________________________________________
void AliLog::ReadEnvSettings()
{
// load settings from the root configuration file (.rootrc)
// and from environment variables

  static const char* typeNames[kMaxType] = {"kFatal", "kError", "kWarning", "kInfo", "kDebug"};

  // debug en- or disabling
  if (gSystem->Getenv("LOG_NO_DEBUG"))
  {
    fgDebugEnabled = kFALSE;
  }
  else if (gEnv->Defined("AliRoot.AliLog.EnableDebug"))
  {
    fgDebugEnabled = gEnv->GetValue("AliRoot.AliLog.EnableDebug", fgDebugEnabled);
    AliInfo(Form("debug %sabled", ((fgDebugEnabled) ? "en" : "dis")));
  }

  // global log level
  if (gEnv->Defined("AliRoot.AliLog.GlobalLogLevel"))
  {
    const char* type = gEnv->GetValue("AliRoot.AliLog.GlobalLogLevel", "");

    for (Int_t iType = kFatal; iType < kMaxType; iType++)
    {
      if (strcmp(type, typeNames[iType]) == 0) fGlobalLogLevel = iType;
    }

    AliDebug(3, Form("global log level set to %d", fGlobalLogLevel));
  }

  // global debug level
  if (gEnv->Defined("AliRoot.AliLog.GlobalDebugLevel"))
  {
    Int_t level = gEnv->GetValue("AliRoot.AliLog.GlobalDebugLevel", Int_t(fGlobalLogLevel - kDebugOffset));
    if (level < -kDebugOffset) level = kDebugOffset;
    fGlobalLogLevel = kDebugOffset + level;
    AliDebug(3, Form("global debug level set to %d", fGlobalLogLevel - kDebugOffset));
  }

  // module debug level
  if (gEnv->Defined("AliRoot.AliLog.ModuleDebugLevel"))
  {
    TString levels = gEnv->GetValue("AliRoot.AliLog.ModuleDebugLevel", "");
    char* p = const_cast<char*>(levels.Data());

    while (const char* module = strtok(p, " "))
    {
      p = NULL;
      char* pos = const_cast<char*>(index(module, ':'));
      if (!pos) continue;
      *(pos++) = '\0';
      Int_t level = atoi(pos);
      SetModuleDebugLevel(module, level);
      AliDebug(3, Form("debug level for module %s set to %d", module, level));
    }
  }

  // class debug level
  if (gEnv->Defined("AliRoot.AliLog.ClassDebugLevel"))
  {
    TString levels = gEnv->GetValue("AliRoot.AliLog.ClassDebugLevel", "");
    char* p = const_cast<char*>(levels.Data());

    while (const char* className = strtok(p, " "))
    {
      p = NULL;
      char* pos = const_cast<char*>(index(className, ':'));
      if (!pos) continue;
      *(pos++) = '\0';
      Int_t level = atoi(pos);
      SetClassDebugLevel(className, level);
      AliDebug(3, Form("debug level for class %s set to %d", className, level));
    }
  }

  // general output stream
  if (gEnv->Defined("AliRoot.AliLog.Output"))
  {
    TString stream = gEnv->GetValue("AliRoot.AliLog.Output", "Standard");

    if (stream.CompareTo("standard", TString::kIgnoreCase) == 0)
    {
      SetStandardOutput();
      AliDebug(3, "output stream set to standard output for all types");
    }
    else if (stream.CompareTo("error", TString::kIgnoreCase) == 0)
    {
      SetErrorOutput();
      AliDebug(3, "output stream set to error output for all types");
    }
    else if (!stream.IsNull())
    {
      SetFileOutput(stream);
      AliDebug(3, Form("output stream set to file %s for all types", stream.Data()));
    }
  }

  // individual output streams
  for (Int_t iType = kFatal; iType < kMaxType; iType++)
  {
    TString name("AliRoot.AliLog.Output.");
    name += &typeNames[iType][1];

    if (gEnv->Defined(name))
    {
      TString stream = gEnv->GetValue(name, "Standard");

      if (stream.CompareTo("standard", TString::kIgnoreCase) == 0)
      {
        SetStandardOutput(EType_t(iType));
        AliDebug(3, Form("output stream set to standard output for type %s", typeNames[iType]));
      }
      else if (stream.CompareTo("error", TString::kIgnoreCase) == 0)
      {
        SetErrorOutput(EType_t(iType));
        AliDebug(3, Form("output stream set to error output for type %s", typeNames[iType]));
      }
      else if (!stream.IsNull())
      {
        SetFileOutput(EType_t(iType), stream);
        AliDebug(3, Form("output stream set to file %s for type %s", stream.Data(), typeNames[iType]));
      }
    }
  }

  // handling of root error messages
  if (gEnv->Defined("AliRoot.AliLog.HandleRootMessages"))
  {
    Bool_t on = gEnv->GetValue("AliRoot.AliLog.HandleRootMessages", kTRUE);
    SetHandleRootMessages(on);
    AliDebug(3, Form("handling of root messages %sabled", ((on) ? "en" : "dis")));
  }

  // printout settings
  static const char* settingNames[4] = {"Type", "Module", "Scope", "Location"};
  Bool_t* settings[] = {fPrintType, fPrintModule, fPrintScope, fPrintLocation};

  for (Int_t iSetting = 0; iSetting < 4; iSetting++)
  {
    TString name("AliRoot.AliLog.Print");
    name += settingNames[iSetting];

    if (gEnv->Defined(name))
    {
      Bool_t on = gEnv->GetValue(name, settings[iSetting][0]);

      for (Int_t iType = kFatal; iType < kMaxType; iType++)
      {
        settings[iSetting][iType] = on;
      }
      AliDebug(3, Form("printing of %s %sabled for all types", settingNames[iSetting], ((on) ? "en" : "dis")));
    }

    for (Int_t iType = kFatal; iType < kMaxType; iType++)
    {
      TString nameType = name + "." + &typeNames[iType][1];

      if (gEnv->Defined(nameType))
      {
        Bool_t on = gEnv->GetValue(nameType, settings[iSetting][iType]);
        settings[iSetting][iType] = on;
        AliDebug(3, Form("printing of %s %sabled for type %s", settingNames[iSetting], ((on) ? "en" : "dis"), typeNames[iType]));
      }
    }
  }

  // repetition of messages
  if (gEnv->Defined("AliRoot.AliLog.PrintRepetitions"))
  {
    Bool_t on = gEnv->GetValue("AliRoot.AliLog.PrintRepetitions", kTRUE);
    fPrintRepetitions = on;
    AliDebug(3, Form("printing of message repetitions %sabled", ((on) ? "en" : "dis")));
  }
  if (gSystem->Getenv("ALIROOT_FORCE_COREDUMP")){
    EnableCoreDump(kTRUE);
  }

}


//_____________________________________________________________________________
void AliLog::RootErrorHandler(Int_t level, Bool_t abort, 
			      const char* location, const char* message)
{
// new error handler for messages from root

  switch (level)
  {
  case ::kFatal    : level = kFatal; break;
  case ::kSysError :
    DefaultErrorHandler(level, abort, location, message);
    return;
  case ::kBreak    :
    DefaultErrorHandler(level, abort, location, message);
    return;
  case ::kError    : level = kError; break;
  case ::kWarning  : level = kWarning; break;
  case ::kInfo     : level = kInfo; break;
  default          : level = kDebug; break;
  }
  AliLog::Message(level, message, "ROOT", NULL, location, NULL, 0);
}


// DEPRECATED: USE A CONFIGURATION FILE INSTEAD
//_____________________________________________________________________________
void AliLog::EnableDebug(Bool_t enabled)
{
// enable or disable debug output

  fgDebugEnabled = enabled;
}

void AliLog::EnableCoreDump(Bool_t enabled)
{
// enable or disable debug output
  gSystem->Exec("ulimit -c unlimited");
  fgCoreEnabled = enabled;
  gSystem->ResetSignal(kSigFloatingException,enabled);
  gSystem->ResetSignal(kSigSegmentationViolation,enabled);
  if (enabled) {
    printf("Core dump enabled\n");
  }
  else { 
    printf("Core dump disabled\n");
  }
}



//_____________________________________________________________________________
void AliLog::SetGlobalLogLevel(EType_t type)
{
// set the global debug level

  // TO BE DELETED
  if (!fgInstance) new AliLog; 
  fgInstance->fGlobalLogLevel = type;
}

//_____________________________________________________________________________
Int_t AliLog::GetGlobalLogLevel()
{
// get the global debug level

  if (!fgInstance) new AliLog;
  return fgInstance->fGlobalLogLevel;
}

//_____________________________________________________________________________
void AliLog::SetGlobalDebugLevel(Int_t level)
{
// set the global debug level

  if (!fgInstance) new AliLog;
  if (level < -kDebugOffset) level = -kDebugOffset;
  fgInstance->fGlobalLogLevel = kDebugOffset + level;
}

//_____________________________________________________________________________
Int_t AliLog::GetGlobalDebugLevel()
{
// get the global debug level

  if (!fgInstance) new AliLog;
  return fgInstance->fGlobalLogLevel - kDebugOffset;
}

//_____________________________________________________________________________
void AliLog::SetModuleDebugLevel(const char* module, Int_t level)
{
// set the debug level for the given module

  if (!module) return;
  if (!fgInstance) new AliLog;
  TObject* obj = fgInstance->fModuleDebugLevels.FindObject(module);
  if (!obj) {
    obj = new TNamed(module, module);
    fgInstance->fModuleDebugLevels.Add(obj);
  }
  level += kDebugOffset;
  if (level < kFatal) level = kFatal;
  obj->SetUniqueID(level);
}

//_____________________________________________________________________________
void AliLog::ClearModuleDebugLevel(const char* module)
{
// remove the setting of the debug level for the given module

  if (!module) return;
  if (!fgInstance) new AliLog;
  TObject* obj = fgInstance->fModuleDebugLevels.FindObject(module);
  if (obj) delete fgInstance->fModuleDebugLevels.Remove(obj);
}

//_____________________________________________________________________________
void AliLog::SetClassDebugLevel(const char* className, Int_t level)
{
// set the debug level for the given class

  if (!className) return;
  if (!fgInstance) new AliLog;
  TObject* obj = fgInstance->fClassDebugLevels.FindObject(className);
  if (!obj) {
    obj = new TNamed(className, className);
    fgInstance->fClassDebugLevels.Add(obj);
  }
  level += kDebugOffset;
  if (level < kFatal) level = kFatal;
  obj->SetUniqueID(level);
}

//_____________________________________________________________________________
void AliLog::ClearClassDebugLevel(const char* className)
{
// remove the setting of the debug level for the given class

  if (!className) return;
  if (!fgInstance) new AliLog;
  TObject* obj = fgInstance->fClassDebugLevels.FindObject(className);
  if (obj) delete fgInstance->fClassDebugLevels.Remove(obj);
}


//_____________________________________________________________________________
void AliLog::SetStandardOutput()
{
// write all log messages to the standard output (stdout)

  if (!fgInstance) new AliLog;
  for (Int_t iType = kFatal; iType < kMaxType; iType++) {
    fgInstance->CloseFile(iType);
    fgInstance->fOutputTypes[iType] = 0;
  }
}

//_____________________________________________________________________________
void AliLog::SetStandardOutput(EType_t type)
{
// write log messages of the given type to the standard output (stdout)

  if ((type < kFatal) || (type >= kMaxType)) return;
  if (!fgInstance) new AliLog;
  fgInstance->CloseFile(type);
  fgInstance->fOutputTypes[type] = 0;
}

//_____________________________________________________________________________
void AliLog::SetErrorOutput()
{
// write all log messages to the error output (stderr)

  if (!fgInstance) new AliLog;
  for (Int_t iType = kFatal; iType < kMaxType; iType++) {
    fgInstance->CloseFile(iType);
    fgInstance->fOutputTypes[iType] = 1;
  }
}

//_____________________________________________________________________________
void AliLog::SetErrorOutput(EType_t type)
{
// write log messages of the given type to the error output (stderr)

  if ((type < kFatal) || (type >= kMaxType)) return;
  if (!fgInstance) new AliLog;
  fgInstance->CloseFile(type);
  fgInstance->fOutputTypes[type] = 1;
}

//_____________________________________________________________________________
void AliLog::SetFileOutput(const char* fileName)
{
// write all log messages to the given file

  if (!fgInstance) new AliLog;
  for (Int_t iType = kFatal; iType < kMaxType; iType++) {
    if ((fgInstance->fOutputTypes[iType] == 2) && 
	(fgInstance->fFileNames[iType].CompareTo(fileName) != 0)) {
      fgInstance->CloseFile(iType);
    }
    fgInstance->fOutputTypes[iType] = 2;
    fgInstance->fFileNames[iType] = fileName;
    fgInstance->fOutputFiles[iType] = NULL;
    fgInstance->fOutputStreams[iType] = NULL;
  }
}

//_____________________________________________________________________________
void AliLog::SetFileOutput(EType_t type, const char* fileName)
{
// write log messages of the given type to the given file

  if ((type < kFatal) || (type >= kMaxType)) return;
  if (!fgInstance) new AliLog;
  if ((fgInstance->fOutputTypes[type] == 2) && 
      (fgInstance->fFileNames[type].CompareTo(fileName) != 0)) {
    fgInstance->CloseFile(type);
  }
  fgInstance->fOutputTypes[type] = 2;
  fgInstance->fFileNames[type] = fileName;
  fgInstance->fOutputFiles[type] = NULL;
  fgInstance->fOutputStreams[type] = NULL;
}

//_____________________________________________________________________________
void AliLog::CloseFile(Int_t type)
{
// close the file for the given type if needed

  if ((fOutputTypes[type] == 2) && fOutputFiles[type]) {
    Bool_t closeFile = kTRUE;
    for (Int_t iType = kFatal; iType < kMaxType; iType++) {
      if ((iType != type) && (fOutputFiles[iType] == fOutputFiles[type])) {
	closeFile = kFALSE;
      }
    }
    if (closeFile) {
      fclose(fOutputFiles[type]);
      ofstream* stream=reinterpret_cast<ofstream*>(fOutputStreams[type]);
      stream->close();
      delete fOutputStreams[type];
    }
  }
  fOutputFiles[type] = NULL;
  fOutputStreams[type] = NULL;
  fFileNames[type] = "";
  fOutputTypes[type] = 0;
}

//_____________________________________________________________________________
FILE* AliLog::GetOutputStream(Int_t type)
{
// get the output stream for the given type of messages

  if (type > kDebug) type = kDebug;
  if (fOutputTypes[type] == 0) return stdout;
  else if (fOutputTypes[type] == 1) return stderr;
  else if (fOutputTypes[type] == 2) {
    if (!fOutputFiles[type]) {
      FILE* file = NULL;
      ostream* stream = NULL;
      if (!fFileNames[type].IsNull()) {
	for (Int_t iType = kFatal; iType < kMaxType; iType++) {
	  if ((iType != type) && 
	      (fFileNames[iType].CompareTo(fFileNames[type]) == 0) &&
	      fOutputFiles[iType]) {
	    file = fOutputFiles[iType];
	    stream = fOutputStreams[iType];
	    break;
	  }
	}
	if (!file) {
	  file = fopen(fFileNames[type], "a");
	  stream = new ofstream(fFileNames[type], ios::app);
	}
      }
      fOutputFiles[type] = file;
      fOutputStreams[type] = stream;
      if (!file) CloseFile(type);
    }
    if (fOutputFiles[type]) return fOutputFiles[type];
  }

  return stdout;
}

//_____________________________________________________________________________
void AliLog::Flush()
{
// flush the output streams

  if (!fgInstance) new AliLog;
  for (Int_t iType = kFatal; iType < kMaxType; iType++) {
    if (fgInstance->fOutputFiles[iType]) {
      fflush(fgInstance->fOutputFiles[iType]);
      fgInstance->fOutputStreams[iType]->flush();
    }
  }
  fflush(stderr);
  fflush(stdout);
}


//_____________________________________________________________________________
void AliLog::SetHandleRootMessages(Bool_t on)
{
// enable or disable the handling of messages form root

  if (!fgInstance) new AliLog;
  if (on) {
    SetErrorHandler(RootErrorHandler);
  } else {
    SetErrorHandler(DefaultErrorHandler);
  }
}


//_____________________________________________________________________________
void AliLog::SetPrintType(Bool_t on)
{
// switch on or off the printing of the message type for all message types

  if (!fgInstance) new AliLog;
  for (Int_t iType = kFatal; iType < kMaxType; iType++) {
    fgInstance->fPrintType[iType] = on;
  }
}

//_____________________________________________________________________________
void AliLog::SetPrintType(EType_t type, Bool_t on)
{
// switch on or off the printing of the message type for the given message type

  if ((type < kFatal) || (type >= kMaxType)) return;
  if (!fgInstance) new AliLog;
  fgInstance->fPrintType[type] = on;
}

//_____________________________________________________________________________
void AliLog::SetPrintModule(Bool_t on)
{
// switch on or off the printing of the module for all message types

  if (!fgInstance) new AliLog;
  for (Int_t iType = kFatal; iType < kMaxType; iType++) {
    fgInstance->fPrintModule[iType] = on;
  }
}

//_____________________________________________________________________________
void AliLog::SetPrintModule(EType_t type, Bool_t on)
{
// switch on or off the printing of the module for the given message type

  if ((type < kFatal) || (type >= kMaxType)) return;
  if (!fgInstance) new AliLog;
  fgInstance->fPrintModule[type] = on;
}

//_____________________________________________________________________________
void AliLog::SetPrintScope(Bool_t on)
{
// switch on or off the printing of the scope/class name for all message types

  if (!fgInstance) new AliLog;
  for (Int_t iType = kFatal; iType < kMaxType; iType++) {
    fgInstance->fPrintScope[iType] = on;
  }
}

//_____________________________________________________________________________
void AliLog::SetPrintScope(EType_t type, Bool_t on)
{
// switch on or off the printing of the scope/class name
// for the given message type

  if ((type < kFatal) || (type >= kMaxType)) return;
  if (!fgInstance) new AliLog;
  fgInstance->fPrintScope[type] = on;
}

//_____________________________________________________________________________
void AliLog::SetPrintLocation(Bool_t on)
{
// switch on or off the printing of the file name and line number
// for all message types

  if (!fgInstance) new AliLog;
  for (Int_t iType = kFatal; iType < kMaxType; iType++) {
    fgInstance->fPrintLocation[iType] = on;
  }
}

//_____________________________________________________________________________
void AliLog::SetPrintLocation(EType_t type, Bool_t on)
{
// switch on or off the printing of the file name and line number 
// for the given message type

  if ((type < kFatal) || (type >= kMaxType)) return;
  if (!fgInstance) new AliLog;
  fgInstance->fPrintLocation[type] = on;
}


//_____________________________________________________________________________
void AliLog::SetPrintRepetitions(Bool_t on)
{
// switch on or off the printing of the number of repetitions of a message
// instead of repeating the same message

  if (!fgInstance) new AliLog;
  if (!on && (fgInstance->fRepetitions > 0)) fgInstance->PrintRepetitions();
  fgInstance->fPrintRepetitions = on;
}


//_____________________________________________________________________________
void AliLog::WriteToFile(const char* name, Int_t option)
{
// write the log object with the given name and option to the current file

  if (!fgInstance) new AliLog;
  fgInstance->TObject::Write(name, option);
}


//_____________________________________________________________________________
UInt_t AliLog::GetLogLevel(const char* module, const char* className) const
{
// get the logging level for the given module and class

  if (!fgInstance) new AliLog;
  if (className) {
    TObject* obj = fgInstance->fClassDebugLevels.FindObject(className);
    if (obj) return obj->GetUniqueID();
  }
  if (module) {
    TObject* obj = fgInstance->fModuleDebugLevels.FindObject(module);
    if (obj) return obj->GetUniqueID();
  }
  return fgInstance->fGlobalLogLevel;
}

//_____________________________________________________________________________
Int_t AliLog::GetDebugLevel(const char* module, const char* className)
{
// get the debug level for the given module and class

  if (!fgInstance) new AliLog;
  return fgInstance->GetLogLevel(module, className) - kDebugOffset;
}

//_____________________________________________________________________________
void AliLog::PrintMessage(UInt_t type, const char* message, 
                          const char* module, const char* className,
                          const char* function, const char* file, Int_t line)
{
// print the given message

  // don't print the message if it is repeated
  if (fPrintRepetitions &&
      (fLastType == type) && 
      (message && (fLastMessage.CompareTo(message) == 0)) &&
      ((module && (fLastModule.CompareTo(module) == 0)) ||
       (!module && fLastModule.IsNull())) &&
      ((className && (fLastClassName.CompareTo(className) == 0)) ||
       (!className && fLastClassName.IsNull())) &&
      ((function && (fLastFunction.CompareTo(function) == 0)) ||
       (!function && fLastFunction.IsNull()))&&
      ((file && (fLastFile.CompareTo(file) == 0)) ||
       (!file && fLastFile.IsNull())) &&
      (fLastLine == line)) {
    fRepetitions++;
    return;
  }

  // print number of repetitions
  if (fRepetitions > 0) PrintRepetitions();

  // remember this message
  fRepetitions = 0;
  fLastType = type;
  fLastMessage = message;
  fLastModule = module;
  fLastClassName = className;
  fLastFunction = function;
  fLastFile = file;
  fLastLine = line;

  // print the message
  FILE* stream = GetOutputStream(type);
  static const char* typeNames[kMaxType] = 
    {"Fatal", "Error", "Warning", "Info", "Debug"};

  if (fPrintType[type]) {
    PrintString(type, stream, "%c-", typeNames[type][0]);
  }
  if (fPrintModule[type] && module) {
    PrintString(type, stream, "%s/", module);
  }
  if (fPrintScope[type] && className) {
    PrintString(type, stream, "%s::", className);
  }
  if (message) {
    PrintString(type, stream, "%s: %s", function, message);
  } else {
    PrintString(type, stream, "%s", function);
  }
  if (fPrintLocation[type] && file) {
    PrintString(type, stream, " (%s:%.0d)", file, line);
  }
  if (message) {
    PrintString(type, stream, "\n");
  } else {
    PrintString(type, stream, ": ");
  }
  if (fCallBacks[type]) (*(fCallBacks[type]))((EType_t)type, NULL);
}

//_____________________________________________________________________________
void AliLog::PrintRepetitions()
{
// print number of repetitions

  PrintString(fLastType, GetOutputStream(fLastType), " <message repeated %d time%s>\n", 
          fRepetitions, (fRepetitions > 1) ? "s" : "");
  if (fCallBacks[fLastType]) (*(fCallBacks[fLastType]))((EType_t)fLastType, NULL);
}

//_____________________________________________________________________________
void AliLog::Message(UInt_t level, const char* message, 
		     const char* module, const char* className,
		     const char* function, const char* file, Int_t line)
{
// print a log message

  if (!fgInstance) new AliLog;

  // get the message type
  UInt_t type = level;
  if (type >= kMaxType) type = kMaxType - 1;

  // print the message if the debug level allows
  if (level <= fgInstance->GetLogLevel(module, className)) {
    fgInstance->PrintMessage(type, message, 
                             module, className, function, file, line);
  }

  // abort in case of a fatal message
  if (type == kFatal) {
    delete fgInstance;
    if (gSystem) {
      gSystem->StackTrace();
      if (fgCoreEnabled) MakeCoreDump("core.AliRoot");
      gSystem->Abort();
    } else {
      if (fgCoreEnabled) MakeCoreDump("core.AliRoot");
      ::abort();
    }
  }
}



//_____________________________________________________________________________
void AliLog::Debug(UInt_t level, const char* message, 
		   const char* module, const char* className,
		   const char* function, const char* file, Int_t line)
{
// print a debug message

  if (level == 0) level = 1;
  level += kDebugOffset;
  Message(level, message, module, className, function, file, line);
}


//_____________________________________________________________________________
Int_t AliLog::RedirectStdoutTo(EType_t type, UInt_t level, const char* module, 
                               const char* className, const char* function,
                               const char* file, Int_t line, Bool_t print)
{
// redirect the standard output to the stream of the given type

  if (!fgInstance) new AliLog;
  return fgInstance->RedirectTo(stdout, type, level, module, className, 
                                function, file, line, print);
}

//_____________________________________________________________________________
Int_t AliLog::RedirectStderrTo(EType_t type, UInt_t level, const char* module, 
                               const char* className, const char* function,
                               const char* file, Int_t line, Bool_t print)
{
// redirect the standard error output to the stream of the given type

  if (!fgInstance) new AliLog;
  return fgInstance->RedirectTo(stderr, type, level, module, className, 
                                function, file, line, print);
}

//_____________________________________________________________________________
Int_t AliLog::RedirectTo(FILE* stream, EType_t type, UInt_t level, 
                         const char* module, const char* className,
                         const char* function, const char* file, Int_t line,
			 Bool_t print)
{
// redirect the standard (error) output stream to the stream of the given type

  // get the original file descriptor to be able to restore it later
  Int_t original = dup(fileno(stream));
  fflush(stream);

  // flush the stream of the selected type
  FILE* newStream = GetOutputStream(type);
  fflush(newStream);

  // redirect stream
  if ((type == kDebug) && (level > 0)) level--;
  if (type + level > GetLogLevel(module, className)) { // /dev/null
    if(!freopen("/dev/null", "a", stream)) AliWarning("Cannot reopen /dev/null");
  } else if (fOutputTypes[type] == 0) {         // stdout
    if (stream != stdout) dup2(fileno(stdout), fileno(stream));
  } else if (fOutputTypes[type] == 1) {         // stderr
    if (stream != stderr) dup2(fileno(stderr), fileno(stream));
  } else if (fOutputTypes[type] == 2) {         // file
    if(!freopen(fFileNames[type], "a", stream)) AliWarning(Form("Cannot reopen %s",fFileNames[type].Data()));
  } else if (fOutputTypes[type] == 3) {         // external C++ stream
    // redirection is not possible for external C++ streams
  }

  // print information
  if (print) {
    PrintMessage(type, NULL, module, className, function, file, line);
    fflush(newStream);
  }

  return original;
}

//_____________________________________________________________________________
void AliLog::RestoreStdout(Int_t original)
{
// restore the standard output

  fflush(stdout);
  dup2(original, fileno(stdout));  
  close(original);
}

//_____________________________________________________________________________
void AliLog::RestoreStderr(Int_t original)
{
// restore the standard error output

  fflush(stderr);
  dup2(original, fileno(stderr));  
  close(original);
}


//_____________________________________________________________________________
ostream& AliLog::Stream(EType_t type, UInt_t level,
                        const char* module, const char* className,
                        const char* function, const char* file, Int_t line)
{
// get the stream object for the given output type

  if (!fgInstance) new AliLog;
  return fgInstance->GetStream(type, level, module, className, 
                               function, file, line);
}

//_____________________________________________________________________________
ostream& AliLog::GetStream(EType_t type, UInt_t level,
                           const char* module, const char* className,
                           const char* function, const char* file, Int_t line)
{
// get the stream object for the given output type

  if ((type == kDebug) && (level > 0)) level--;
  Bool_t noOutput = (type + level > GetLogLevel(module, className));

  if (!noOutput) {
    PrintMessage(type, NULL, module, className, function, file, line);
  }
  fflush(GetOutputStream(type));

  static ofstream nullStream("/dev/null");
  if (noOutput) {
    return nullStream;
  } else if (fOutputTypes[type] == 0) {
    return cout;
  } else if (fOutputTypes[type] == 1) {
    return cerr;
  } else if (fOutputTypes[type] == 2) {
    return *fOutputStreams[type];
  } else if (fOutputTypes[type] == 3) {
    return *fOutputStreams[type];
  }

  return nullStream;
}

void  AliLog::SetStreamOutput(ostream* stream)
{
  // set an external stream as target for log messages of all types
  // the external stream is completely handled by the caller, the
  // AliLog class just writes to it

  for (Int_t iType = kFatal; iType < kMaxType; iType++) {
    SetStreamOutput((AliLog::EType_t)iType, stream);
  }
}

void  AliLog::SetStreamOutput(EType_t type, ostream* stream)
{
  // set an external stream as target for log messages of the given type
  // the external stream is completely handled by the caller, the
  // AliLog class just writes to it

  if ((type < kFatal) || (type >= kMaxType)) return;
  if (!fgInstance) new AliLog;
  if (fgInstance->fOutputTypes[type] == 2) {
    fgInstance->CloseFile(type);
  }
  fgInstance->fOutputTypes[type] = 3;
  fgInstance->fFileNames[type] = "";
  fgInstance->fOutputFiles[type] = NULL;
  fgInstance->fOutputStreams[type] = stream;
}

void  AliLog::SetLogNotification(AliLogNotification pCallBack)
{
  // set a notification callback function for log messages of all types

  for (Int_t iType = kFatal; iType < kMaxType; iType++) {
    SetLogNotification((AliLog::EType_t)iType, pCallBack);
  }
}

void  AliLog::SetLogNotification(EType_t type, AliLogNotification pCallBack)
{
  // set a notifications call back function for log messages of all types
  // the callback fuction is invoced whenever an output was written
  // Note: does not work for c++ streamer classes, the external stream
  // has to handle this diectly (e.g. custom implementation of endl)

  if ((type < kFatal) || (type >= kMaxType)) return;
  if (!fgInstance) new AliLog;
  fgInstance->fCallBacks[type]=pCallBack;
}

void  AliLog::PrintString(Int_t type, FILE* stream, const char* format, ...)
{
  // this is the general method to print a log message using variadac args
  // to the FILE* like (C - like) streams, e.g. stdout, stderr, or files
  // opened by fopen.
  // Only in case of an external c++ ostream type output, the message is
  // written to that stream and the notifictaion callback is called.
  // The message is printed by a normal vfprintf function otherwise

  if (format==NULL) return;
  
  va_list ap;
  va_start(ap, format);
  if (fOutputTypes[type] != 3) {
    if (stream!=NULL) {
      vfprintf(stream, format, ap);
    }
  } else {
    // build the string and write everthing to the corresponding ostream
    TString fmt(format);
    TArrayC tgt(fmt.Length()*10); // just take a number
#ifdef R__VA_COPY
    va_list bap;
    R__VA_COPY(bap, ap);
#else
#warning definition of R__VA_COPY has disappeared
#endif //R__VA_COPY

    Int_t iResult=0;
    while (1) {
      iResult=vsnprintf(tgt.GetArray(), tgt.GetSize(), format, ap);
      if (iResult==-1) {
	iResult=tgt.GetSize()*2;
      } else if (iResult<tgt.GetSize()) {
	break;
      }
#ifdef R__VA_COPY
      if (iResult<10000) {
	tgt.Set(iResult+1);
	va_end(ap);
	R__VA_COPY(ap, bap);
      } else
#endif //R__VA_COPY 
      {
	tgt[tgt.GetSize()-1]=0;
	break;
      }
    }
#ifdef R__VA_COPY
    va_end(bap);
#endif //R__VA_COPY

    if (fOutputStreams[type]) {
      *(fOutputStreams[type]) << tgt.GetArray();
    }
  }
  va_end(ap);
}


void AliLog::MakeCoreDump(const char *fout){
  //
  // Functionality to make a program snapshot 
  //   gcore - Generate a core file for a running process 
  //   gcore dmake a current snapshot, program can continue further
  //   We assum that gcore is installed
  //   for details see:  man gcore
  //
  // Example use - make default core file for current process:  AliLog::MakeCoreDump(0)
  //
  //
  // Automatic core dump creation in case of the AliFatal can be specified using
  // static void  EnableCoreDump(Bool_t enabled);
  // Core dump is created in addition to the stack trace ()  
  // marian.ivanov@cern.ch
  //
  if (!gSystem) return;
  printf("AliLog::MakeCoreDump\n");
  if (fout){
    gSystem->Exec(Form("gcore -o %s  %d",fout, gSystem->GetPid()));
  }else{
    gSystem->Exec(Form("gcore   %d", gSystem->GetPid()));
  }
}


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