/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 * @(#)root/roofitcore:$Id$
 * Authors:                                                                  *
 *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
 *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
 *                                                                           *
 * Copyright (c) 2000-2005, Regents of the University of California          *
 *                          and Stanford University. All rights reserved.    *
 *                                                                           *
 * Redistribution and use in source and binary forms,                        *
 * with or without modification, are permitted according to the terms        *
 * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
 *****************************************************************************/

//////////////////////////////////////////////////////////////////////////////
//
// BEGIN_HTML
//
// The RooMsgService class is a singleton class that organizes informational, debugging, 
// warning and errors messages generated by the RooFit core code. 
// <p>
// Each message generated by the core
// has a message level (DEBUG,INFO,PROGRESS,WARNING,ERROR or FATAL), an originating object,
// and a 'topic'. Currently implemented topics are "Generation","Plotting",
// "Integration", "Minimization" and "Workspace" and "ChangeTracking".
// <p>
// The RooMsgService class allows to filter and redirect messages into 'streams' 
// according to message level, topic, (base) class of originating object, name of originating
// object and based on attribute labels attached to individual objects. 
// <p>
// The current default configuration creates streams for all messages at WARNING level
// or higher (e.g. ERROR and FATAL) and for all INFO message on topics Generation,Plotting,
// Integration and Minimization and redirects them to stdout. Users can create additional streams 
// for logging of e.g. DEBUG messages on particular topics or objects and or redirect streams to
// C++ streams or files.
// <p>
// The singleton instance is accessible through RooMsgService::instance() ;
//
// END_HTML
//


#include <sys/types.h>

#include "RooFit.h"
#include "RooAbsArg.h"
#include "TClass.h"
#include "TROOT.h"

#include "RooMsgService.h"
#include "RooCmdArg.h"
#include "RooCmdConfig.h"
#include "RooGlobalFunc.h"
#include "RooSentinel.h"
#include "RooWorkspace.h"

#include "TSystem.h"
#include "Riostream.h"
#include <iomanip>
#include <fstream>
using namespace std ;
using namespace RooFit ;

ClassImp(RooMsgService)
;

RooMsgService* gMsgService = 0 ;
RooMsgService* RooMsgService::_instance = 0 ;
Int_t RooMsgService::_debugCount = 0 ;


//_____________________________________________________________________________
void RooMsgService::cleanup() 
{
  // Cleanup function called by atexit() handler installed by RooSentinel
  // to delete all global object upon program termination
  if (_instance) {
    delete _instance ;
    _instance = 0 ;
  }
}



//_____________________________________________________________________________
RooMsgService::RooMsgService() 
{
  // Constructor. Defines names of message levels
  // and mapping of topic codes to topic names
  // Install default message streams.

  _silentMode = kFALSE ;
  _showPid = kFALSE ;
  _globMinLevel = DEBUG ;
  _lastMsgLevel = DEBUG ;

  _devnull = new ofstream("/dev/null") ;

  _levelNames[DEBUG]="DEBUG" ;
  _levelNames[INFO]="INFO" ;
  _levelNames[PROGRESS]="PROGRESS" ;
  _levelNames[WARNING]="WARNING" ;
  _levelNames[ERROR]="ERROR" ;
  _levelNames[FATAL]="FATAL" ;

  _topicNames[Generation]="Generation" ;
  _topicNames[Minimization]="Minization" ;
  _topicNames[Plotting]="Plotting" ;
  _topicNames[Fitting]="Fitting" ;
  _topicNames[Integration]="Integration" ;
  _topicNames[LinkStateMgmt]="LinkStateMgmt" ;
  _topicNames[Eval]="Eval" ;
  _topicNames[Caching]="Caching" ;
  _topicNames[Optimization]="Optimization" ;
  _topicNames[ObjectHandling]="ObjectHandling" ;
  _topicNames[InputArguments]="InputArguments" ;
  _topicNames[Tracing]="Tracing" ;
  _topicNames[Contents]="Contents" ;
  _topicNames[DataHandling]="DataHandling" ;
  _topicNames[NumIntegration]="NumericIntegration" ;

  _instance = this ;
  gMsgService = this ;

  _debugWorkspace = 0 ;
  _debugCode = 0 ;

  // Old-style streams
  addStream(RooFit::PROGRESS) ;
  addStream(RooFit::INFO,Topic(RooFit::Eval|RooFit::Plotting|RooFit::Fitting|RooFit::Minimization|RooFit::Caching|RooFit::ObjectHandling|RooFit::NumIntegration|RooFit::InputArguments|RooFit::DataHandling)) ;
}


//_____________________________________________________________________________
RooMsgService::~RooMsgService() 
{
  // Destructor

  // Delete all ostreams we own ;
  map<string,ostream*>::iterator iter = _files.begin() ;
  for (; iter != _files.end() ; ++iter) {
    delete iter->second ;
  }

  if (_debugWorkspace) {
    delete _debugWorkspace ;
  }

  delete _devnull ;
}



//_____________________________________________________________________________
Bool_t RooMsgService::anyDebug() 
{ 
  // Returns true if any debug level stream is active
  return instance()._debugCount>0 ; 
}



//_____________________________________________________________________________
RooWorkspace* RooMsgService::debugWorkspace() 
{
  if (!_debugWorkspace) {
    _debugWorkspace = new RooWorkspace("wdebug") ;
  }
  return _debugWorkspace ;
}



//_____________________________________________________________________________
Int_t RooMsgService::addStream(RooFit::MsgLevel level, const RooCmdArg& arg1, const RooCmdArg& arg2, const RooCmdArg& arg3, 
    	      			               const RooCmdArg& arg4, const RooCmdArg& arg5, const RooCmdArg& arg6) 
{
  // Add a message logging stream for message with given RooFit::MsgLevel or higher (i.e. more severe)
  // This method accepts the following arguments to configure the stream
  //
  // Output Style options
  // --------------------
  // Prefix(Bool_t flag=kTRUE) -- Prefix all messages in this stream with Topic/Originator information
  //
  // Filtering options
  // -----------------
  // Topic(const char*)        -- Restrict stream to messages on given topic
  // ObjectName(const char*)   -- Restrict stream to messages from object with given name
  // ClassName(const char*)    -- Restrict stream to messages from objects with given class name
  // BaseClassName(const char*)-- Restrict stream to messages from objects with given base class name
  // LabelName(const chat*)    -- Restrict stream to messages from objects setAtrribute(const char*) tag with given name
  //
  // Output redirection options
  // --------------------------
  // OutputFile(const char*)  -- Send output to file with given name. Multiple streams can write to same file.
  // OutputStream(ostream&)   -- Send output to given C++ stream. Multiple message streams can write to same c++ stream
  //
  // The return value is the unique ID code of the defined stream


  // Aggregate all arguments in a list
  RooLinkedList l ;
  l.Add((TObject*)&arg1) ;  l.Add((TObject*)&arg2) ;  
  l.Add((TObject*)&arg3) ;  l.Add((TObject*)&arg4) ;
  l.Add((TObject*)&arg5) ;  l.Add((TObject*)&arg6) ;  

  // Define configuration for this method
  RooCmdConfig pc(Form("RooMsgService::addReportingStream(%s)",GetName())) ;
  pc.defineInt("prefix","Prefix",0,kTRUE) ;
  pc.defineInt("color","Color",0,static_cast<Int_t>(kBlack)) ;
  pc.defineInt("topic","Topic",0,0xFFFFF) ;
  pc.defineString("objName","ObjectName",0,"") ;
  pc.defineString("className","ClassName",0,"") ;
  pc.defineString("baseClassName","BaseClassName",0,"") ;
  pc.defineString("tagName","LabelName",0,"") ;
  pc.defineString("outFile","OutputFile",0,"") ;
  pc.defineObject("outStream","OutputStream",0,0) ;
  pc.defineMutex("OutputFile","OutputStream") ;

  // Process & check varargs 
  pc.process(l) ;
  if (!pc.ok(kTRUE)) {
    return -1 ;
  }

  // Extract values from named arguments
  RooFit::MsgTopic topic =  (RooFit::MsgTopic) pc.getInt("topic") ;
  const char* objName =  pc.getString("objName") ;
  const char* className =  pc.getString("className") ;
  const char* baseClassName =  pc.getString("baseClassName") ;
  const char* tagName =  pc.getString("tagName") ;
  const char* outFile = pc.getString("outFile") ;
  Bool_t prefix = pc.getInt("prefix") ;
  Color_t color = static_cast<Color_t>(pc.getInt("color")) ;
  ostream* os = reinterpret_cast<ostream*>(pc.getObject("outStream")) ;

  // Create new stream object
  StreamConfig newStream ;

  // Store configuration info
  newStream.active = kTRUE ;
  newStream.minLevel = level ;
  newStream.topic = topic ;
  newStream.objectName = (objName ? objName : "" ) ;
  newStream.className = (className ? className : "" ) ;
  newStream.baseClassName = (baseClassName ? baseClassName : "" ) ;
  newStream.tagName = (tagName ? tagName : "" ) ;
  newStream.color = color ;
  newStream.prefix = prefix ;
  newStream.universal = (newStream.objectName=="" && newStream.className=="" && newStream.baseClassName=="" && newStream.tagName=="") ;

  // Update debug stream count 
  if (level==DEBUG) {
    _debugCount++ ;
  }

  // Configure output
  if (os) {

    // To given non-owned stream
    newStream.os = os ;

  } else if (string(outFile).size()>0) {

    // See if we already opened the file
    ostream* os2 = _files["outFile"] ;

    if (!os2) {

      // To given file name, create owned stream for it
      os2 = new ofstream(outFile) ;

      if (!*os2) {
	cout << "RooMsgService::addReportingStream ERROR: cannot open output log file " << outFile << " reverting stream to stdout" << endl ;
	delete os2 ;
	newStream.os = &cout ;
      } else {
	newStream.os = os2 ;
      }

    } else {
      _files["outFile"] = os2 ;
      newStream.os = os2 ;
    }

        
  } else {

    // To stdout
    newStream.os = &cout ;

  }


  // Add it to list of active streams ;
  _streams.push_back(newStream) ;

  // Return stream identifier
  return _streams.size()-1 ;
}



//_____________________________________________________________________________
void RooMsgService::deleteStream(Int_t id) 
{
  // Delete stream with given unique ID code

  vector<StreamConfig>::iterator iter = _streams.begin() ;
  iter += id ;

  // Update debug stream count 
  if (iter->minLevel==DEBUG) {
    _debugCount-- ;
  }

  _streams.erase(iter) ;
}



//_____________________________________________________________________________
void RooMsgService::setStreamStatus(Int_t id, Bool_t flag) 
{
  // (De)Activate stream with given unique ID

  if (id<0 || id>=static_cast<Int_t>(_streams.size())) {
    cout << "RooMsgService::setStreamStatus() ERROR: invalid stream ID " << id << endl ;
    return ;
  }

  // Update debug stream count 
  if (_streams[id].minLevel==DEBUG) {
    _debugCount += flag ? 1 : -1 ;
  }

  _streams[id].active = flag ;
}



//_____________________________________________________________________________
Bool_t RooMsgService::getStreamStatus(Int_t id) const 
{
  // Get activation status of stream with given unique ID

  if (id<0 || id>= static_cast<Int_t>(_streams.size())) {
    cout << "RooMsgService::getStreamStatus() ERROR: invalid stream ID " << id << endl ;
    return kFALSE ;
  }
  return _streams[id].active ;
}



//_____________________________________________________________________________
RooMsgService& RooMsgService::instance() 
{
  // Return reference to singleton instance 

  if (!_instance) {
    new RooMsgService() ;    
    RooSentinel::activate() ;
  }
  return *_instance ;
}



//_____________________________________________________________________________
void RooMsgService::saveState() 
{
  // Save current state of message service
  _streamsSaved.push(_streams) ;
}



//_____________________________________________________________________________
void RooMsgService::restoreState() 
{
  // Restore last saved state of message service
  _streams = _streamsSaved.top() ;
  _streamsSaved.pop() ;
}



//_____________________________________________________________________________
Bool_t RooMsgService::isActive(const RooAbsArg* self, RooFit::MsgTopic topic, RooFit::MsgLevel level) 
{
  // Check if logging is active for given object/topic/RooFit::MsgLevel combination

  return (activeStream(self,topic,level)>=0) ;
}


//_____________________________________________________________________________
Bool_t RooMsgService::isActive(const TObject* self, RooFit::MsgTopic topic, RooFit::MsgLevel level) 
{
  // Check if logging is active for given object/topic/RooFit::MsgLevel combination

  return (activeStream(self,topic,level)>=0) ;
}


//_____________________________________________________________________________
Int_t RooMsgService::activeStream(const RooAbsArg* self, RooFit::MsgTopic topic, RooFit::MsgLevel level) 
{
  // Find appropriate logging stream for message from given object with given topic and message level

  if (level<_globMinLevel) return -1 ;
  for (UInt_t i=0 ; i<_streams.size() ; i++) {
    if (_streams[i].match(level,topic,self)) {
      return i ;
    }
  }
  return -1 ;
}


//_____________________________________________________________________________
Int_t RooMsgService::activeStream(const TObject* self, RooFit::MsgTopic topic, RooFit::MsgLevel level) 
{
  // Find appropriate logging stream for message from given object with given topic and message level

  if (level<_globMinLevel) return -1 ;
  for (UInt_t i=0 ; i<_streams.size() ; i++) {
    if (_streams[i].match(level,topic,self)) {
      return i ;
    }
  }
  return -1 ;
}


//_____________________________________________________________________________
Bool_t RooMsgService::StreamConfig::match(RooFit::MsgLevel level, RooFit::MsgTopic top, const RooAbsArg* obj) 
{
  // Determine if message from given object at given level on given topic is logged

  if (!active) return kFALSE ;
  if (level<minLevel) return kFALSE ;
  if (!(topic&top)) return kFALSE ;

  if (universal) return kTRUE ;

  if (objectName.size()>0 && objectName != obj->GetName()) return kFALSE ;
  if (className.size()>0 && className != obj->IsA()->GetName()) return kFALSE ;
  if (baseClassName.size()>0 && !obj->IsA()->InheritsFrom(baseClassName.c_str())) return kFALSE ;
  if (tagName.size()>0 && !obj->getAttribute(tagName.c_str())) return kFALSE ;
  
  return kTRUE ;
}


//_____________________________________________________________________________
Bool_t RooMsgService::StreamConfig::match(RooFit::MsgLevel level, RooFit::MsgTopic top, const TObject* obj) 
{
  // Determine if message from given object at given level on given topic is logged

  if (!active) return kFALSE ;
  if (level<minLevel) return kFALSE ;
  if (!(topic&top)) return kFALSE ;

  if (universal) return kTRUE ;
  
  if (objectName.size()>0 && objectName != obj->GetName()) return kFALSE ;
  if (className.size()>0 && className != obj->IsA()->GetName()) return kFALSE ;
  if (baseClassName.size()>0 && !obj->IsA()->InheritsFrom(baseClassName.c_str())) return kFALSE ;
  
  return kTRUE ;
}



//_____________________________________________________________________________
ostream& RooMsgService::log(const RooAbsArg* self, RooFit::MsgLevel level, RooFit::MsgTopic topic, Bool_t skipPrefix) 
{
  // Log error message associated with RooAbsArg object self at given level and topic. If skipPrefix
  // is true the standard RooMsgService prefix is not added.

  if (level>=ERROR) {
    _errorCount++ ;
  }

  // Return C++ ostream associated with given message configuration
  Int_t as = activeStream(self,topic,level) ;

  if (as==-1) {
    return *_devnull ;
  }

  // Flush any previous messages
  (*_streams[as].os).flush() ;

  // Insert an endl if we switch from progress to another level
  if (_lastMsgLevel==PROGRESS && level!=PROGRESS) {
    (*_streams[as].os) << endl ;
  }
  _lastMsgLevel=level ;
    
  if (_streams[as].prefix && !skipPrefix) {
    if (_showPid) {
      (*_streams[as].os) << "pid" << gSystem->GetPid() << " " ;
    }
    (*_streams[as].os) << "[#" << as << "] " << _levelNames[level] << ":" << _topicNames[topic]  << " -- " ;
  }
  return (*_streams[as].os) ;
}



//_____________________________________________________________________________
ostream& RooMsgService::log(const TObject* self, RooFit::MsgLevel level, RooFit::MsgTopic topic, Bool_t skipPrefix) 
{
  // Log error message associated with TObject object self at given level and topic. If skipPrefix
  // is true the standard RooMsgService prefix is not added.

  if (level>=ERROR) {
    _errorCount++ ;
  }

  // Return C++ ostream associated with given message configuration
  Int_t as = activeStream(self,topic,level) ;
  if (as==-1) {
    return *_devnull ;
  }

  // Flush any previous messages
  (*_streams[as].os).flush() ;
    
  if (_streams[as].prefix && !skipPrefix) {
    if (_showPid) {
      (*_streams[as].os) << "pid" << gSystem->GetPid() << " " ;
    }
    (*_streams[as].os) << "[#" << as << "] " << _levelNames[level] << ":" << _topicNames[topic]  << " -- " ;
  }
  return (*_streams[as].os) ;
}



//_____________________________________________________________________________
void RooMsgService::Print(Option_t *options) const 
{
  // Print configuration of message service. If "v" option is given also
  // inactive streams are listed

  Bool_t activeOnly = kTRUE ;
  if (TString(options).Contains("V") || TString(options).Contains("v")) {
    activeOnly = kFALSE ;
  }

  cout << (activeOnly?"Active Message streams":"All Message streams") << endl ;
  for (UInt_t i=0 ; i<_streams.size() ; i++) {

    // Skip passive streams in active only mode
    if (activeOnly && !_streams[i].active) {
      continue ;
    }

    
    map<int,string>::const_iterator is = _levelNames.find(_streams[i].minLevel) ;
    cout << "[" << i << "] MinLevel = " << is->second ;

    cout << " Topic = " ;
    if (_streams[i].topic != 0xFFFFF) {      
      map<int,string>::const_iterator iter = _topicNames.begin() ;
      while(iter!=_topicNames.end()) {
	if (iter->first & _streams[i].topic) {
	  cout << iter->second << " " ;
	}
	++iter ;
      }
    } else {
      cout << " Any " ;
    }
    

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