/*****************************************************************************
 * 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
// RooSimultaneous facilitates simultaneous fitting of multiple PDFs
// to subsets of a given dataset.
// <p>
// The class takes an index category, which is interpreted as
// the data subset indicator, and a list of PDFs, each associated
// with a state of the index category. RooSimultaneous always returns
// the value of the PDF that is associated with the current value
// of the index category
// <p>
// Extended likelihood fitting is supported if all components support
// extended likelihood mode. The expected number of events by a RooSimultaneous
// is that of the component p.d.f. selected by the index category
// END_HTML
//

#include "RooFit.h"
#include "Riostream.h"

#include "TObjString.h"
#include "RooSimultaneous.h"
#include "RooAbsCategoryLValue.h"
#include "RooPlot.h"
#include "RooCurve.h"
#include "RooRealVar.h"
#include "RooAddPdf.h"
#include "RooAbsData.h"
#include "Roo1DTable.h"
#include "RooSimGenContext.h"
#include "RooSimSplitGenContext.h"
#include "RooDataSet.h"
#include "RooCmdConfig.h"
#include "RooNameReg.h"
#include "RooGlobalFunc.h"
#include "RooNameReg.h"
#include "RooMsgService.h"
#include "RooCategory.h"
#include "RooSuperCategory.h"
#include "RooDataHist.h"
#include "RooRandom.h"
#include "RooArgSet.h"

using namespace std ;

ClassImp(RooSimultaneous)
;




//_____________________________________________________________________________
RooSimultaneous::RooSimultaneous(const char *name, const char *title, 
				 RooAbsCategoryLValue& inIndexCat) : 
  RooAbsPdf(name,title), 
  _plotCoefNormSet("!plotCoefNormSet","plotCoefNormSet",this,kFALSE,kFALSE),
  _plotCoefNormRange(0),
  _partIntMgr(this,10),
  _indexCat("indexCat","Index category",this,inIndexCat),
  _numPdf(0)
{
  // Constructor with index category. PDFs associated with indexCat
  // states can be added after construction with the addPdf() function.
  // 
  // RooSimultaneous can function without having a PDF associated
  // with every single state. The normalization in such cases is taken
  // from the number of registered PDFs, but getVal() will assert if
  // when called for an unregistered index state.
}



//_____________________________________________________________________________
RooSimultaneous::RooSimultaneous(const char *name, const char *title, 
				 const RooArgList& inPdfList, RooAbsCategoryLValue& inIndexCat) :
  RooAbsPdf(name,title), 
  _plotCoefNormSet("!plotCoefNormSet","plotCoefNormSet",this,kFALSE,kFALSE),
  _plotCoefNormRange(0),
  _partIntMgr(this,10),
  _indexCat("indexCat","Index category",this,inIndexCat),
  _numPdf(0)
{
  // Constructor from index category and full list of PDFs. 
  // In this constructor form, a PDF must be supplied for each indexCat state
  // to avoid ambiguities. The PDFS are associated in order with the state of the
  // index category as listed by the index categories type iterator.
  //
  // PDFs may not overlap (i.e. share any variables) with the index category (function)

  if (inPdfList.getSize() != inIndexCat.numTypes()) {
    coutE(InputArguments) << "RooSimultaneous::ctor(" << GetName() 
			  << " ERROR: Number PDF list entries must match number of index category states, no PDFs added" << endl ;
    return ;
  }

  map<string,RooAbsPdf*> pdfMap ;
  // Iterator over PDFs and index cat states and add each pair
  TIterator* pIter = inPdfList.createIterator() ;
  TIterator* cIter = inIndexCat.typeIterator() ;
  RooAbsPdf* pdf ;
  RooCatType* type(0) ;
  while ((pdf=(RooAbsPdf*)pIter->Next())) {
    type = (RooCatType*) cIter->Next() ;
    pdfMap[string(type->GetName())] = pdf ;
  }
  delete pIter ;
  delete cIter ;

  initialize(inIndexCat,pdfMap) ;
}


//_____________________________________________________________________________
RooSimultaneous::RooSimultaneous(const char *name, const char *title, 
				 map<string,RooAbsPdf*> pdfMap, RooAbsCategoryLValue& inIndexCat) :
  RooAbsPdf(name,title), 
  _plotCoefNormSet("!plotCoefNormSet","plotCoefNormSet",this,kFALSE,kFALSE),
  _plotCoefNormRange(0),
  _partIntMgr(this,10),
  _indexCat("indexCat","Index category",this,inIndexCat),
  _numPdf(0)
{
  initialize(inIndexCat,pdfMap) ;
}




// This class cannot be locally defined in initialize as it cannot be
// used as a template argument in that case
namespace RooSimultaneousAux {
  struct CompInfo {
    RooAbsPdf* pdf ;
    RooSimultaneous* simPdf ;
    const RooAbsCategoryLValue* subIndex ;
    RooArgSet* subIndexComps ;
  } ;
}

void RooSimultaneous::initialize(RooAbsCategoryLValue& inIndexCat, std::map<std::string,RooAbsPdf*> pdfMap) 
{
  // First see if there are any RooSimultaneous input components
  Bool_t simComps(kFALSE) ;
  for (map<string,RooAbsPdf*>::iterator iter=pdfMap.begin() ; iter!=pdfMap.end() ; iter++) {    
    if (dynamic_cast<RooSimultaneous*>(iter->second)) {
      simComps = kTRUE ;
      break ;
    }
  }

  // If there are no simultaneous component p.d.f. do simple processing through addPdf()
  if (!simComps) {
    for (map<string,RooAbsPdf*>::iterator iter=pdfMap.begin() ; iter!=pdfMap.end() ; iter++) {    
      addPdf(*iter->second,iter->first.c_str()) ;
    }
    return ;
  }

  // Issue info message that we are about to do some rearraning
  coutI(InputArguments) << "RooSimultaneous::initialize(" << GetName() << ") INFO: one or more input component of simultaneous p.d.f.s are"
			<< " simultaneous p.d.f.s themselves, rewriting composite expressions as one-level simultaneous p.d.f. in terms of"
			<< " final constituents and extended index category" << endl ;


  RooArgSet allAuxCats ;
  map<string,RooSimultaneousAux::CompInfo> compMap ;
  for (map<string,RooAbsPdf*>::iterator iter=pdfMap.begin() ; iter!=pdfMap.end() ; iter++) {    
    RooSimultaneousAux::CompInfo ci ;
    ci.pdf = iter->second ;
    RooSimultaneous* simComp = dynamic_cast<RooSimultaneous*>(iter->second) ;
    if (simComp) {
      ci.simPdf = simComp ;
      ci.subIndex = &simComp->indexCat() ;      
      ci.subIndexComps = simComp->indexCat().isFundamental() ? new RooArgSet(simComp->indexCat()) : simComp->indexCat().getVariables() ;
      allAuxCats.add(*(ci.subIndexComps),kTRUE) ;
    } else {
      ci.simPdf = 0 ;
      ci.subIndex = 0 ;
      ci.subIndexComps = 0 ;
    }
    compMap[iter->first] = ci ;
  }

  // Construct the 'superIndex' from the nominal index category and all auxiliary components
  RooArgSet allCats(inIndexCat) ;
  allCats.add(allAuxCats) ;
  string siname = Form("%s_index",GetName()) ;
  RooSuperCategory* superIndex = new RooSuperCategory(siname.c_str(),siname.c_str(),allCats) ;
  
  // Now process each of original pdf/state map entries
  for (map<string,RooSimultaneousAux::CompInfo>::iterator citer = compMap.begin() ; citer != compMap.end() ; citer++) {

    RooArgSet repliCats(allAuxCats) ;
    if (citer->second.subIndexComps) {
      repliCats.remove(*citer->second.subIndexComps) ;
      delete citer->second.subIndexComps ;
    }
    inIndexCat.setLabel(citer->first.c_str()) ;
    
       
    if (!citer->second.simPdf) {

      // Entry is a plain p.d.f. assign it to every state permutation of the repliCats set
      RooSuperCategory repliSuperCat("tmp","tmp",repliCats) ;

      // Iterator over all states of repliSuperCat
      TIterator* titer = repliSuperCat.typeIterator() ;
      RooCatType* type ;
      while ((type=(RooCatType*)titer->Next())) {
	// Set value 
	repliSuperCat.setLabel(type->GetName()) ;
	// Retrieve corresponding label of superIndex 
	string superLabel = superIndex->getLabel() ;
	addPdf(*citer->second.pdf,superLabel.c_str()) ;
	cxcoutD(InputArguments) << "RooSimultaneous::initialize(" << GetName() 
				<< ") assigning pdf " << citer->second.pdf->GetName() << " to super label " << superLabel << endl ;
      }
    } else {

      // Entry is a simultaneous p.d.f

      if (repliCats.getSize()==0) {

	// Case 1 -- No replication of components of RooSim component are required

	TIterator* titer = citer->second.subIndex->typeIterator() ;
	RooCatType* type ;
	while ((type=(RooCatType*)titer->Next())) {
	  const_cast<RooAbsCategoryLValue*>(citer->second.subIndex)->setLabel(type->GetName()) ;
	  string superLabel = superIndex->getLabel() ;
	  RooAbsPdf* compPdf = citer->second.simPdf->getPdf(type->GetName()) ;
	  if (compPdf) {
	    addPdf(*compPdf,superLabel.c_str()) ;
	    cxcoutD(InputArguments) << "RooSimultaneous::initialize(" << GetName() 
				    << ") assigning pdf " << compPdf->GetName() << "(member of " << citer->second.pdf->GetName() 
				    << ") to super label " << superLabel << endl ;	  
	  } else {
	    coutW(InputArguments) << "RooSimultaneous::initialize(" << GetName() << ") WARNING: No p.d.f. associated with label " 
				  << type->GetName() << " for component RooSimultaneous p.d.f " << citer->second.pdf->GetName() 
				  << "which is associated with master index label " << citer->first << endl ;	    
	  }		
	}
	delete titer ;

      } else {

	// Case 2 -- Replication of components of RooSim component are required

	// Make replication supercat
	RooSuperCategory repliSuperCat("tmp","tmp",repliCats) ;
	TIterator* triter = repliSuperCat.typeIterator() ;

	TIterator* tsiter = citer->second.subIndex->typeIterator() ;
	RooCatType* stype, *rtype ;
	while ((stype=(RooCatType*)tsiter->Next())) {
	  const_cast<RooAbsCategoryLValue*>(citer->second.subIndex)->setLabel(stype->GetName()) ;
	  triter->Reset() ;
	  while ((rtype=(RooCatType*)triter->Next())) {
	    repliSuperCat.setLabel(rtype->GetName()) ;
	    string superLabel = superIndex->getLabel() ;
	    RooAbsPdf* compPdf = citer->second.simPdf->getPdf(stype->GetName()) ;
	    if (compPdf) {
	      addPdf(*compPdf,superLabel.c_str()) ;
	      cxcoutD(InputArguments) << "RooSimultaneous::initialize(" << GetName() 
				      << ") assigning pdf " << compPdf->GetName() << "(member of " << citer->second.pdf->GetName() 
				      << ") to super label " << superLabel << endl ;	  
	    } else {
	      coutW(InputArguments) << "RooSimultaneous::initialize(" << GetName() << ") WARNING: No p.d.f. associated with label " 
				    << stype->GetName() << " for component RooSimultaneous p.d.f " << citer->second.pdf->GetName() 
				    << "which is associated with master index label " << citer->first << endl ;	    
	    }		
	  }
	}

	delete tsiter ;
	delete triter ;
	
      }
    }
  }

  // Change original master index to super index and take ownership of it
  _indexCat.setArg(*superIndex) ;
  addOwnedComponents(*superIndex) ;

}



//_____________________________________________________________________________
RooSimultaneous::RooSimultaneous(const RooSimultaneous& other, const char* name) : 
  RooAbsPdf(other,name),
  _plotCoefNormSet("!plotCoefNormSet",this,other._plotCoefNormSet),
  _plotCoefNormRange(other._plotCoefNormRange),
  _partIntMgr(other._partIntMgr,this),
  _indexCat("indexCat",this,other._indexCat), 
  _numPdf(other._numPdf)
{
  // Copy constructor

  // Copy proxy list 
  TIterator* pIter = other._pdfProxyList.MakeIterator() ;
  RooRealProxy* proxy ;
  while ((proxy=(RooRealProxy*)pIter->Next())) {
    _pdfProxyList.Add(new RooRealProxy(proxy->GetName(),this,*proxy)) ;
  }
  delete pIter ;
}



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

  _pdfProxyList.Delete() ;
}



//_____________________________________________________________________________
RooAbsPdf* RooSimultaneous::getPdf(const char* catName) const 
{
  // Return the p.d.f associated with the given index category name
  
  RooRealProxy* proxy = (RooRealProxy*) _pdfProxyList.FindObject(catName) ;
  return proxy ? ((RooAbsPdf*)proxy->absArg()) : 0 ;
}



//_____________________________________________________________________________
Bool_t RooSimultaneous::addPdf(const RooAbsPdf& pdf, const char* catLabel)
{
  // Associate given PDF with index category state label 'catLabel'.
  // The names state must be already defined in the index category
  //
  // RooSimultaneous can function without having a PDF associated
  // with every single state. The normalization in such cases is taken
  // from the number of registered PDFs, but getVal() will assert if
  // when called for an unregistered index state.
  //
  // PDFs may not overlap (i.e. share any variables) with the index category (function)

  // PDFs cannot overlap with the index category
  if (pdf.dependsOn(_indexCat.arg())) {
    coutE(InputArguments) << "RooSimultaneous::addPdf(" << GetName() << "): ERROR, PDF " << pdf.GetName() 
			  << " overlaps with index category " << _indexCat.arg().GetName() << endl ;
    return kTRUE ;
  }

  // Each index state can only have one PDF associated with it
  if (_pdfProxyList.FindObject(catLabel)) {
    coutE(InputArguments) << "RooSimultaneous::addPdf(" << GetName() << "): ERROR, index state " 
			  << catLabel << " has already an associated PDF" << endl ;
    return kTRUE ;
  }

  const RooSimultaneous* simPdf = dynamic_cast<const RooSimultaneous*>(&pdf) ;
  if (simPdf) {

    coutE(InputArguments) << "RooSimultaneous::addPdf(" << GetName() 
			  << ") ERROR: you cannot add a RooSimultaneous component to a RooSimultaneous using addPdf()." 
			  << " Use the constructor with RooArgList if input p.d.f.s or the map<string,RooAbsPdf&> instead." << endl ;
    return kTRUE ;

  } else {

    // Create a proxy named after the associated index state
    TObject* proxy = new RooRealProxy(catLabel,catLabel,this,(RooAbsPdf&)pdf) ;
    _pdfProxyList.Add(proxy) ;
    _numPdf += 1 ;
  }

  return kFALSE ;
}





//_____________________________________________________________________________
RooAbsPdf::ExtendMode RooSimultaneous::extendMode() const 
{ 
  // WVE NEEDS FIX
  Bool_t allCanExtend(kTRUE) ;
  Bool_t anyMustExtend(kFALSE) ;

  for (Int_t i=0 ; i<_numPdf ; i++) {
    RooRealProxy* proxy = (RooRealProxy*) _pdfProxyList.FindObject(_indexCat.label()) ;
    if (proxy) {
//       cout << " now processing pdf " << pdf->GetName() << endl ;
      RooAbsPdf* pdf = (RooAbsPdf*) proxy->absArg() ;
      if (!pdf->canBeExtended()) {
// 	cout << "RooSim::extendedMode(" << GetName() << ") component " << pdf->GetName() << " cannot be extended" << endl ;
	allCanExtend=kFALSE ;
      }
      if (pdf->mustBeExtended()) {
	anyMustExtend=kTRUE;
      }
    }
  }
  if (anyMustExtend) {
//     cout << "RooSim::extendedMode(" << GetName() << ") returning MustBeExtended" << endl ;
    return MustBeExtended ;
  }
  if (allCanExtend) {
//     cout << "RooSim::extendedMode(" << GetName() << ") returning CanBeExtended" << endl ;
    return CanBeExtended ;
  }
//   cout << "RooSim::extendedMode(" << GetName() << ") returning CanNotBeExtended" << endl ;
  return CanNotBeExtended ; 
}




//_____________________________________________________________________________
Double_t RooSimultaneous::evaluate() const
{  
  // Return the current value: 
  // the value of the PDF associated with the current index category state

  // Retrieve the proxy by index name
  RooRealProxy* proxy = (RooRealProxy*) _pdfProxyList.FindObject(_indexCat.label()) ;
  
  //assert(proxy!=0) ;
  if (proxy==0) return 0 ;

  // Calculate relative weighting factor for sim-pdfs of all extendable components
  Double_t catFrac(1) ;
  if (canBeExtended()) {
    Double_t nEvtCat = ((RooAbsPdf*)(proxy->absArg()))->expectedEvents(_normSet) ; 
    
    Double_t nEvtTot(0) ;
    TIterator* iter = _pdfProxyList.MakeIterator() ;
    RooRealProxy* proxy2 ;
    while((proxy2=(RooRealProxy*)iter->Next())) {      
      nEvtTot += ((RooAbsPdf*)(proxy2->absArg()))->expectedEvents(_normSet) ;
    }
    delete iter ;
    catFrac=nEvtCat/nEvtTot ;
  }

  // Return the selected PDF value, normalized by the number of index states  
  return ((RooAbsPdf*)(proxy->absArg()))->getVal(_normSet)*catFrac ; 
}



//_____________________________________________________________________________
Double_t RooSimultaneous::expectedEvents(const RooArgSet* nset) const 
{
  // Return the number of expected events: If the index is in nset,
  // then return the sum of the expected events of all components,
  // otherwise return the number of expected events of the PDF
  // associated with the current index category state

  if (nset->contains(_indexCat.arg())) {

    Double_t sum(0) ;

    TIterator* iter = _pdfProxyList.MakeIterator() ;
    RooRealProxy* proxy ;
    while((proxy=(RooRealProxy*)iter->Next())) {      
      sum += ((RooAbsPdf*)(proxy->absArg()))->expectedEvents(nset) ;
    }
    delete iter ;

    return sum ;
    
  } else {

    // Retrieve the proxy by index name
    RooRealProxy* proxy = (RooRealProxy*) _pdfProxyList.FindObject(_indexCat.label()) ;
    
    //assert(proxy!=0) ;
    if (proxy==0) return 0 ;

    // Return the selected PDF value, normalized by the number of index states
    return ((RooAbsPdf*)(proxy->absArg()))->expectedEvents(nset); 
  }
}



//_____________________________________________________________________________
Int_t RooSimultaneous::getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& analVars, 
					       const RooArgSet* normSet, const char* rangeName) const 
{
  // Forward determination of analytical integration capabilities to component p.d.f.s
  // A unique code is assigned to the combined integration capabilities of all associated
  // p.d.f.s
  
  // Declare that we can analytically integrate all requested observables
  analVars.add(allVars) ;

  // Retrieve (or create) the required partial integral list
  Int_t code ;

  // Check if this configuration was created before
  CacheElem* cache = (CacheElem*) _partIntMgr.getObj(normSet,&analVars,0,RooNameReg::ptr(rangeName)) ;
  if (cache) {
    code = _partIntMgr.lastIndex() ;
    return code+1 ;
  }
  cache = new CacheElem ;

  // Create the partial integral set for this request
  TIterator* iter = _pdfProxyList.MakeIterator() ;
  RooRealProxy* proxy ;
  while((proxy=(RooRealProxy*)iter->Next())) {
    RooAbsReal* pdfInt = proxy->arg().createIntegral(analVars,normSet,0,rangeName) ;
    cache->_partIntList.addOwned(*pdfInt) ;
  }
  delete iter ;

  // Store the partial integral list and return the assigned code ;
  code = _partIntMgr.setObj(normSet,&analVars,cache,RooNameReg::ptr(rangeName)) ;
  
  return code+1 ;
}



//_____________________________________________________________________________
Double_t RooSimultaneous::analyticalIntegralWN(Int_t code, const RooArgSet* normSet, const char* /*rangeName*/) const 
{
  // Return analytical integration defined by given code

  // No integration scenario
  if (code==0) {
    return getVal(normSet) ;
  }

  // Partial integration scenarios, rangeName already encoded in 'code'
  CacheElem* cache = (CacheElem*) _partIntMgr.getObjByIndex(code-1) ;

  RooRealProxy* proxy = (RooRealProxy*) _pdfProxyList.FindObject(_indexCat.label()) ;
  Int_t idx = _pdfProxyList.IndexOf(proxy) ;
  return ((RooAbsReal*)cache->_partIntList.at(idx))->getVal(normSet) ;
}






//_____________________________________________________________________________
RooPlot* RooSimultaneous::plotOn(RooPlot *frame, RooLinkedList& cmdList) const
{
  // Back-end for plotOn() implementation on RooSimultaneous which
  // needs special handling because a RooSimultaneous PDF cannot
  // project out its index category via integration, plotOn() will
  // abort if this is requested without providing a projection dataset

  // Sanity checks
  if (plotSanityChecks(frame)) return frame ;
  
  // Extract projection configuration from command list
  RooCmdConfig pc(Form("RooSimultaneous::plotOn(%s)",GetName())) ;
  pc.defineString("sliceCatState","SliceCat",0,"",kTRUE) ;
  pc.defineDouble("scaleFactor","Normalization",0,1.0) ;
  pc.defineInt("scaleType","Normalization",0,RooAbsPdf::Relative) ;
  pc.defineObject("sliceCatList","SliceCat",0,0,kTRUE) ;
  pc.defineObject("projSet","Project",0) ;
  pc.defineObject("sliceSet","SliceVars",0) ;
  pc.defineObject("projDataSet","ProjData",0) ;
  pc.defineObject("projData","ProjData",1) ;
  pc.defineMutex("Project","SliceVars") ;
  pc.allowUndefined() ; // there may be commands we don't handle here

  // Process and check varargs 
  pc.process(cmdList) ;
  if (!pc.ok(kTRUE)) {
    return frame ;
  }

  const RooAbsData* projData = (const RooAbsData*) pc.getObject("projData") ;
  const RooArgSet* projDataSet = (const RooArgSet*) pc.getObject("projDataSet") ;
  const RooArgSet* sliceSetTmp = (const RooArgSet*) pc.getObject("sliceSet") ;
  RooArgSet* sliceSet = sliceSetTmp ? ((RooArgSet*) sliceSetTmp->Clone()) : 0 ;
  const RooArgSet* projSet = (const RooArgSet*) pc.getObject("projSet") ;  
  Double_t scaleFactor = pc.getDouble("scaleFactor") ;
  ScaleType stype = (ScaleType) pc.getInt("scaleType") ;


  // Look for category slice arguments and add them to the master slice list if found
  const char* sliceCatState = pc.getString("sliceCatState",0,kTRUE) ;
  const RooLinkedList& sliceCatList = pc.getObjectList("sliceCatList") ;
  if (sliceCatState) {

    // Make the master slice set if it doesnt exist
    if (!sliceSet) {
      sliceSet = new RooArgSet ;
    }

    // Prepare comma separated label list for parsing
    char buf[1024] ;
    strlcpy(buf,sliceCatState,1024) ;
    const char* slabel = strtok(buf,",") ;

    // Loop over all categories provided by (multiple) Slice() arguments
    TIterator* iter = sliceCatList.MakeIterator() ;
    RooCategory* scat ;
    while((scat=(RooCategory*)iter->Next())) {
      if (slabel) {
	// Set the slice position to the value indicate by slabel
	scat->setLabel(slabel) ;
	// Add the slice category to the master slice set
	sliceSet->add(*scat,kFALSE) ;
      }
      slabel = strtok(0,",") ;
    }
    delete iter ;
  }

  // Check if we have a projection dataset
  if (!projData) {
    coutE(InputArguments) << "RooSimultaneous::plotOn(" << GetName() << ") ERROR: must have a projection dataset for index category" << endl ;
    return frame ;
  }

  // Make list of variables to be projected
  RooArgSet projectedVars ;
  if (sliceSet) {
    //cout << "frame->getNormVars() = " ; frame->getNormVars()->Print("1") ;

    makeProjectionSet(frame->getPlotVar(),frame->getNormVars(),projectedVars,kTRUE) ;
    
    // Take out the sliced variables
    TIterator* iter = sliceSet->createIterator() ;
    RooAbsArg* sliceArg ;
    while((sliceArg=(RooAbsArg*)iter->Next())) {
      RooAbsArg* arg = projectedVars.find(sliceArg->GetName()) ;
      if (arg) {
	projectedVars.remove(*arg) ;
      } else {
	coutI(Plotting) << "RooAbsReal::plotOn(" << GetName() << ") slice variable " 
			<< sliceArg->GetName() << " was not projected anyway" << endl ;
      }
    }
    delete iter ;
  } else if (projSet) {
    makeProjectionSet(frame->getPlotVar(),projSet,projectedVars,kFALSE) ;
  } else {
    makeProjectionSet(frame->getPlotVar(),frame->getNormVars(),projectedVars,kTRUE) ;
  }

  Bool_t projIndex(kFALSE) ;

  if (!_indexCat.arg().isDerived()) {
    // *** Error checking for a fundamental index category ***
    //cout << "RooSim::plotOn: index is fundamental" << endl ;
      
    // Check that the provided projection dataset contains our index variable
    if (!projData->get()->find(_indexCat.arg().GetName())) {
      coutE(Plotting) << "RooSimultaneous::plotOn(" << GetName() << ") ERROR: Projection over index category "
		      << "requested, but projection data set doesn't contain index category" << endl ;
      return frame ;
    }

    if (projectedVars.find(_indexCat.arg().GetName())) {
      projIndex=kTRUE ;
    }

  } else {
    // *** Error checking for a composite index category ***

    // Determine if any servers of the index category are in the projectedVars
    TIterator* sIter = _indexCat.arg().serverIterator() ;
    RooAbsArg* server ;
    RooArgSet projIdxServers ;
    Bool_t anyServers(kFALSE) ;
    while((server=(RooAbsArg*)sIter->Next())) {
      if (projectedVars.find(server->GetName())) {
	anyServers=kTRUE ;
	projIdxServers.add(*server) ;
      }
    }
    delete sIter ;

    // Check that the projection dataset contains all the 
    // index category components we're projecting over

    // Determine if all projected servers of the index category are in the projection dataset
    sIter = projIdxServers.createIterator() ;
    Bool_t allServers(kTRUE) ;
    while((server=(RooAbsArg*)sIter->Next())) {
      if (!projData->get()->find(server->GetName())) {
	allServers=kFALSE ;
      }
    }
    delete sIter ;
    
    if (!allServers) {      
      coutE(Plotting) << "RooSimultaneous::plotOn(" << GetName() 
	   << ") ERROR: Projection dataset doesn't contain complete set of index category dependents" << endl ;
      return frame ;
    }

    if (anyServers) {
      projIndex = kTRUE ;
    }
  } 

  // Calculate relative weight fractions of components
  Roo1DTable* wTable = projData->table(_indexCat.arg()) ;

  // If we don't project over the index, just do the regular plotOn
  if (!projIndex) {

    coutI(Plotting) << "RooSimultaneous::plotOn(" << GetName() << ") plot on " << frame->getPlotVar()->GetName() 
		    << " represents a slice in the index category ("  << _indexCat.arg().GetName() << ")" << endl ;

    // Reduce projData: take out fitCat (component) columns and entries that don't match selected slice
    // Construct cut string to only select projection data event that match the current slice

    const RooAbsData* projDataTmp(projData) ;
    if (projData) {
      // Make list of categories columns to exclude from projection data      
      RooArgSet* indexCatComps = _indexCat.arg().getObservables(frame->getNormVars());

      // Make cut string to exclude rows from projection data
      TString cutString ;
      TIterator* compIter =  indexCatComps->createIterator() ;    
      RooAbsCategory* idxComp ;
      Bool_t first(kTRUE) ;
      while((idxComp=(RooAbsCategory*)compIter->Next())) {
	if (!first) {
	  cutString.Append("&&") ;
	} else {
	  first=kFALSE ;
	}
	cutString.Append(Form("%s==%d",idxComp->GetName(),idxComp->getIndex())) ;
      }
      delete compIter ;

      // Make temporary projData without RooSim index category components
      RooArgSet projDataVars(*projData->get()) ;
      projDataVars.remove(*indexCatComps,kTRUE,kTRUE) ;
      
      projDataTmp = ((RooAbsData*)projData)->reduce(projDataVars,cutString) ;
      delete indexCatComps ;
    }

    // Multiply scale factor with fraction of events in current state of index

//     RooPlot* retFrame =  getPdf(_indexCat.arg().getLabel())->plotOn(frame,drawOptions,
// 					   scaleFactor*wTable->getFrac(_indexCat.arg().getLabel()),
// 					   stype,projDataTmp,projSet) ;

    // Override normalization and projection dataset
    RooCmdArg tmp1 = RooFit::Normalization(scaleFactor*wTable->getFrac(_indexCat.arg().getLabel()),stype) ;
    RooCmdArg tmp2 = RooFit::ProjWData(*projDataSet,*projDataTmp) ;

    // WVE -- do not adjust normalization for asymmetry plots
    RooLinkedList cmdList2(cmdList) ;
    if (!cmdList.find("Asymmetry")) {
      cmdList2.Add(&tmp1) ;
    }
    cmdList2.Add(&tmp2) ;

    // Plot single component
    RooPlot* retFrame =  getPdf(_indexCat.arg().getLabel())->plotOn(frame,cmdList2) ;

    // Delete temporary dataset
    if (projDataTmp) {
      delete projDataTmp ;
    }

    delete wTable ;
    delete sliceSet ;
    return retFrame ;
  }

  // If we project over the index, plot using a temporary RooAddPdf
  // using the weights from the data as coefficients

  // Make a deep clone of our index category
  RooArgSet* idxCloneSet = (RooArgSet*) RooArgSet(_indexCat.arg()).snapshot(kTRUE) ;
  RooAbsCategoryLValue* idxCatClone = (RooAbsCategoryLValue*) idxCloneSet->find(_indexCat.arg().GetName()) ;

  // Build the list of indexCat components that are sliced
  RooArgSet* idxCompSliceSet = _indexCat.arg().getObservables(frame->getNormVars()) ;
  idxCompSliceSet->remove(projectedVars,kTRUE,kTRUE) ;
  TIterator* idxCompSliceIter = idxCompSliceSet->createIterator() ;

  // Make a new expression that is the weighted sum of requested components
  RooArgList pdfCompList ;
  RooArgList wgtCompList ;
//RooAbsPdf* pdf ;
  RooRealProxy* proxy ;
  TIterator* pIter = _pdfProxyList.MakeIterator() ;
  Double_t sumWeight(0) ;
  while((proxy=(RooRealProxy*)pIter->Next())) {

    idxCatClone->setLabel(proxy->name()) ;

    // Determine if this component is the current slice (if we slice)
    Bool_t skip(kFALSE) ;
    idxCompSliceIter->Reset() ;
    RooAbsCategory* idxSliceComp ;
    while((idxSliceComp=(RooAbsCategory*)idxCompSliceIter->Next())) {
      RooAbsCategory* idxComp = (RooAbsCategory*) idxCloneSet->find(idxSliceComp->GetName()) ;
      if (idxComp->getIndex()!=idxSliceComp->getIndex()) {
	skip=kTRUE ;
	break ;
      }
    }
    if (skip) continue ;
 
    // Instantiate a RRV holding this pdfs weight fraction
    RooRealVar *wgtVar = new RooRealVar(proxy->name(),"coef",wTable->getFrac(proxy->name())) ;
    wgtCompList.addOwned(*wgtVar) ;
    sumWeight += wTable->getFrac(proxy->name()) ;

    // Add the PDF to list list
    pdfCompList.add(proxy->arg()) ;
  }

  TString plotVarName(GetName()) ;
  RooAddPdf *plotVar = new RooAddPdf(plotVarName,"weighted sum of RS components",pdfCompList,wgtCompList) ;

  // Fix appropriate coefficient normalization in plot function
  if (_plotCoefNormSet.getSize()>0) {
    plotVar->fixAddCoefNormalization(_plotCoefNormSet) ;
  }

  RooAbsData* projDataTmp(0) ;
  RooArgSet projSetTmp ;
  if (projData) {
    
    // Construct cut string to only select projection data event that match the current slice
    TString cutString ;
    if (idxCompSliceSet->getSize()>0) {
      idxCompSliceIter->Reset() ;
      RooAbsCategory* idxSliceComp ;
      Bool_t first(kTRUE) ;
      while((idxSliceComp=(RooAbsCategory*)idxCompSliceIter->Next())) {
	if (!first) {
	  cutString.Append("&&") ;
	} else {
	  first=kFALSE ;
	}
	cutString.Append(Form("%s==%d",idxSliceComp->GetName(),idxSliceComp->getIndex())) ;
      }
    }

    // Make temporary projData without RooSim index category components
    RooArgSet projDataVars(*projData->get()) ;
    RooArgSet* idxCatServers = _indexCat.arg().getObservables(frame->getNormVars()) ;

    projDataVars.remove(*idxCatServers,kTRUE,kTRUE) ;

    if (idxCompSliceSet->getSize()>0) {
      projDataTmp = ((RooAbsData*)projData)->reduce(projDataVars,cutString) ;
    } else {
      projDataTmp = ((RooAbsData*)projData)->reduce(projDataVars) ;      
    }

    

    if (projSet) {
      projSetTmp.add(*projSet) ;
      projSetTmp.remove(*idxCatServers,kTRUE,kTRUE);
    }

    
    delete idxCatServers ;
  }


  if (_indexCat.arg().isDerived() && idxCompSliceSet->getSize()>0) {
    coutI(Plotting) << "RooSimultaneous::plotOn(" << GetName() << ") plot on " << frame->getPlotVar()->GetName() 
		    << " represents a slice in index category components " << *idxCompSliceSet << endl ;

    RooArgSet* idxCompProjSet = _indexCat.arg().getObservables(frame->getNormVars()) ;
    idxCompProjSet->remove(*idxCompSliceSet,kTRUE,kTRUE) ;
    if (idxCompProjSet->getSize()>0) {
      coutI(Plotting) << "RooSimultaneous::plotOn(" << GetName() << ") plot on " << frame->getPlotVar()->GetName() 
		      << " averages with data index category components " << *idxCompProjSet << endl ;
    }
    delete idxCompProjSet ;
  } else {
    coutI(Plotting) << "RooSimultaneous::plotOn(" << GetName() << ") plot on " << frame->getPlotVar()->GetName() 
		    << " averages with data index category (" << _indexCat.arg().GetName() << ")" << endl ;
  }


  // Override normalization and projection dataset
  RooLinkedList cmdList2(cmdList) ;

  RooCmdArg tmp1 = RooFit::Normalization(scaleFactor*sumWeight,stype) ;
  RooCmdArg tmp2 = RooFit::ProjWData(*projDataSet,*projDataTmp) ;
  // WVE -- do not adjust normalization for asymmetry plots
  if (!cmdList.find("Asymmetry")) {
    cmdList2.Add(&tmp1) ;
  }
  cmdList2.Add(&tmp2) ;

  RooPlot* frame2 ;
  if (projSetTmp.getSize()>0) {
    // Plot temporary function  
    RooCmdArg tmp3 = RooFit::Project(projSetTmp) ;
    cmdList2.Add(&tmp3) ;
    frame2 = plotVar->plotOn(frame,cmdList2) ;
  } else {
    // Plot temporary function  
    frame2 = plotVar->plotOn(frame,cmdList2) ;
  }

  // Cleanup
  delete sliceSet ;
  delete pIter ;
  delete wTable ;
  delete idxCloneSet ;
  delete idxCompSliceIter ;
  delete idxCompSliceSet ;
  delete plotVar ;

  if (projDataTmp) delete projDataTmp ;

  return frame2 ;
}



//_____________________________________________________________________________
RooPlot* RooSimultaneous::plotOn(RooPlot *frame, Option_t* drawOptions, Double_t scaleFactor, 
				 ScaleType stype, const RooAbsData* projData, const RooArgSet* projSet,
				 Double_t /*precision*/, Bool_t /*shiftToZero*/, const RooArgSet* /*projDataSet*/,
				 Double_t /*rangeLo*/, Double_t /*rangeHi*/, RooCurve::WingMode /*wmode*/) const
{
  // OBSOLETE -- Retained for backward compatibility

  // Make command list
  RooLinkedList cmdList ;
  cmdList.Add(new RooCmdArg(RooFit::DrawOption(drawOptions))) ;
  cmdList.Add(new RooCmdArg(RooFit::Normalization(scaleFactor,stype))) ;
  if (projData) cmdList.Add(new RooCmdArg(RooFit::ProjWData(*projData))) ;
  if (projSet) cmdList.Add(new RooCmdArg(RooFit::Project(*projSet))) ;

  // Call new method
  RooPlot* ret = plotOn(frame,cmdList) ;

  // Cleanup
  cmdList.Delete() ;
  return ret ;  
}



//_____________________________________________________________________________
void RooSimultaneous::selectNormalization(const RooArgSet* normSet, Bool_t /*force*/) 
{
  // Interface function used by test statistics to freeze choice of observables
  // for interpretation of fraction coefficients. Needed here because a RooSimultaneous
  // works like a RooAddPdf when plotted
  
  _plotCoefNormSet.removeAll() ;
  if (normSet) _plotCoefNormSet.add(*normSet) ;
}


//_____________________________________________________________________________
void RooSimultaneous::selectNormalizationRange(const char* normRange2, Bool_t /*force*/) 
{
  // Interface function used by test statistics to freeze choice of range
  // for interpretation of fraction coefficients. Needed here because a RooSimultaneous
  // works like a RooAddPdf when plotted

  _plotCoefNormRange = RooNameReg::ptr(normRange2) ;
}




//_____________________________________________________________________________
RooAbsGenContext* RooSimultaneous::autoGenContext(const RooArgSet &vars, const RooDataSet* prototype, 
						  const RooArgSet* auxProto, Bool_t verbose, Bool_t autoBinned, const char* binnedTag) const 
{
  const char* idxCatName = _indexCat.arg().GetName() ;
  
  if (vars.find(idxCatName) && prototype==0 && (auxProto==0 || auxProto->getSize()==0) && (autoBinned || (binnedTag && strlen(binnedTag)))) {    

    // Return special generator config that can also do binned generation for selected states
    return new RooSimSplitGenContext(*this,vars,verbose,autoBinned,binnedTag) ;

  } else {
    
    // Return regular generator config ;
    return genContext(vars,prototype,auxProto,verbose) ;
  }     
}



//_____________________________________________________________________________
RooAbsGenContext* RooSimultaneous::genContext(const RooArgSet &vars, const RooDataSet *prototype, 
					      const RooArgSet* auxProto, Bool_t verbose) const 
{
  // Return specialized generator contenxt for simultaneous p.d.f.s

  const char* idxCatName = _indexCat.arg().GetName() ;
  const RooArgSet* protoVars = prototype ? prototype->get() : 0 ;

  if (vars.find(idxCatName) || (protoVars && protoVars->find(idxCatName))) {

    // Generating index category: return special sim-context
    return new RooSimGenContext(*this,vars,prototype,auxProto,verbose) ;

  } else if (_indexCat.arg().isDerived()) {
    // Generating dependents of a derived index category

    // Determine if we none,any or all servers
    Bool_t anyServer(kFALSE), allServers(kTRUE) ;
    if (prototype) {
      TIterator* sIter = _indexCat.arg().serverIterator() ;
      RooAbsArg* server ;
      while((server=(RooAbsArg*)sIter->Next())) {
	if (prototype->get()->find(server->GetName())) {
	  anyServer=kTRUE ;
	} else {
	  allServers=kFALSE ;
	}
      }
      delete sIter ;
    } else {
      allServers=kTRUE ;
    }

    if (allServers) {
      // Use simcontext if we have all servers

      return new RooSimGenContext(*this,vars,prototype,auxProto,verbose) ;
    } else if (!allServers && anyServer) {
      // Abort if we have only part of the servers
      coutE(Plotting) << "RooSimultaneous::genContext: ERROR: prototype must include either all "
		      << " components of the RooSimultaneous index category or none " << endl ;
      return 0 ; 
    } 
    // Otherwise make single gencontext for current state
  } 

  // Not generating index cat: return context for pdf associated with present index state
  RooRealProxy* proxy = (RooRealProxy*) _pdfProxyList.FindObject(_indexCat.arg().getLabel()) ;
  if (!proxy) {
    coutE(InputArguments) << "RooSimultaneous::genContext(" << GetName() 
			  << ") ERROR: no PDF associated with current state (" 
			  << _indexCat.arg().GetName() << "=" << _indexCat.arg().getLabel() << ")" << endl ; 
    return 0 ;
  }
  return ((RooAbsPdf*)proxy->absArg())->genContext(vars,prototype,auxProto,verbose) ;
}




//_____________________________________________________________________________
RooDataHist* RooSimultaneous::fillDataHist(RooDataHist *hist,
                                           const RooArgSet* nset,
                                           Double_t scaleFactor,
                                           Bool_t correctForBinVolume,
                                           Bool_t showProgress) const
{
  if (RooAbsReal::fillDataHist (hist, nset, scaleFactor,
                                correctForBinVolume, showProgress) == 0)
    return 0;

  Double_t sum = 0;
  for (int i=0 ; i<hist->numEntries() ; i++) {
    hist->get(i) ;
    sum += hist->weight();
  }
  if (sum != 0) {
    for (int i=0 ; i<hist->numEntries() ; i++) {
      hist->get(i) ;
      hist->set (hist->weight() / sum);
    }
  }

  return hist;
}




//_____________________________________________________________________________
RooDataSet* RooSimultaneous::generateSimGlobal(const RooArgSet& whatVars, Int_t nEvents) 
{
  // Special generator interface for generation of 'global observables' -- for RooStats tools

  // Make set with clone of variables (placeholder for output)
  RooArgSet* globClone = (RooArgSet*) whatVars.snapshot() ;

  RooDataSet* data = new RooDataSet("gensimglobal","gensimglobal",whatVars) ;
  
  // Construct iterator over index types
  TIterator* iter = indexCat().typeIterator() ;

  for (Int_t i=0 ; i<nEvents ; i++) {
    iter->Reset() ;
    RooCatType* tt ; 
    while((tt=(RooCatType*) iter->Next())) {
      
      // Get pdf associated with state from simpdf
      RooAbsPdf* pdftmp = getPdf(tt->GetName()) ;
      
      // Generate only global variables defined by the pdf associated with this state
      RooArgSet* globtmp = pdftmp->getObservables(whatVars) ;
      RooDataSet* tmp = pdftmp->generate(*globtmp,1) ;
      
      // Transfer values to output placeholder
      *globClone = *tmp->get(0) ;
      
      // Cleanup 
      delete globtmp ;
      delete tmp ;
    }
    data->add(*globClone) ;
  }


  delete iter ;
  delete globClone ;
  return data ;
}









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