/*****************************************************************************
 * 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)             *
 *****************************************************************************/

//////////////////////////////////////////////////////////////////////////////
// 
// RooCustomizer is a factory class to produce clones
// of a prototype composite PDF object with the same structure but
// different leaf servers (parameters or dependents)
//
// RooCustomizer supports two kinds of modifications:
// 
// -> replace(leaf_arg,repl_arg) 
// replaces each occurence of leaf_arg with repl_arg in the composite pdf.
//
// -> split(split_arg)
// is used when building multiple clones of the same prototype. Each
// occurrence of split_arg is replaceed with a clone of split_arg
// named split_arg_[MCstate], where [MCstate] is the name of the
// 'master category state' that indexes the clones to be built.
//
//
// [Example]
//
// Splitting is particularly useful when building simultaneous fits to
// subsets of the data sample with different background properties.
// In such a case, the user builds a single prototype PDF representing
// the structure of the signal and background and splits the dataset
// into categories with different background properties. Using
// RooCustomizer a PDF for each subfit can be constructed from the
// prototype that has same structure and signal parameters, but
// different instances of the background parameters: e.g.
//
//     ...
//     RooExponential bg("bg","background",x,alpha) ;
//     RooGaussian sig("sig","signal",x,mean,sigma) ;
//     RooAddPdf pdf("pdf","pdf",sig,bg,sigfrac) ;
//
//     RooDataSet data("data","dataset",RooArgSet(x,runblock),...)
//
//     RooCategory runblock("runblock","run block") ;
//     runblock.defineType("run1") ;
//     runblock.defineType("run2") ;
//
//     RooArgSet splitLeafs
//     RooCustomizer cust(pdf,runblock,splitLeafs)
//     cust.split(alpha,runblock)
//
//     RooAbsPdf* pdf_run1 = cust.build("run1") ;
//     RooAbsPdf* pdf_run2 = cust.build("run2") ;
//
//     RooSimultaneous simpdf("simpdf","simpdf",RooArgSet(*pdf_run1,*pdf_run2)) 
//
// If the master category state is a super category, leafs may be split
// by any subset of that master category. E.g. if the master category
// is 'A x B', leafs may be split by A, B or AxB.
//
// In addition to replacing leaf nodes, RooCustomizer clones all branch
// nodes that depend directly or indirectly on modified leaf nodes, so
// that the input pdf is untouched by each build operation.
//
// The customizer owns all the branch nodes including the returned top
// level node, so the customizer should live as longs as the cloned
// composites are needed.
//
// Any leaf nodes that are created by the customizer will be put into
// the leaf list that is passed into the customizers constructor (splitLeafs in
// the above example. The list owner is responsible for deleting these leaf
// nodes after the customizer is deleted.
//
//
// [Advanced techniques]
//
// By default the customizer clones the prototype leaf node when splitting a leaf,
// but the user can feed pre-defined split leafs in leaf list. These leafs
// must have the name <split_leaf>_<splitcat_label> to be picked up. The list
// of pre-supplied leafs may be partial, any missing split leafs will be auto
// generated.
//
// Another common construction is to have two prototype PDFs, each to be customized
// by a separate customizer instance, that share parameters. To ensure that
// the customized clones also share their respective split leafs, i.e.
//
//   PDF1(x,y;A) and PDF2(z,A)   ---> PDF1_run1(x,y,A_run1) and PDF2_run1(x,y,A_run1)
//                                    PDF1_run2(x,y,A_run2) and PDF2_run2(x,y,A_run2)
//
// feed the same split leaf list into both customizers. In that case the second customizer
// will pick up the split leafs instantiated by the first customizer and the link between
// the two PDFs is retained
//
//


#include "RooFit.h"

#include "TClass.h"
#include "TStopwatch.h"

#include "RooAbsCategoryLValue.h" 
#include "RooAbsCategory.h"
#include "RooAbsArg.h"
#include "RooAbsPdf.h"
#include "RooArgSet.h"
#include "RooArgList.h"
#include "RooMsgService.h"

#include "RooCustomizer.h"

#include "Riostream.h"
#include "RooWorkspace.h"
#include "RooGlobalFunc.h"
#include "RooConstVar.h"
#include "RooRealConstant.h"


#ifndef _WIN32
#include <strings.h>
#else
static char *strtok_r(char *s1, const char *s2, char **lasts)
{
  char *ret;
  
  if (s1 == NULL)
    s1 = *lasts;
  while(*s1 && strchr(s2, *s1))
    ++s1;
  if(*s1 == '\0')
    return NULL;
  ret = s1;
  while(*s1 && !strchr(s2, *s1))
    ++s1;
  if(*s1)
    *s1++ = '\0';
  *lasts = s1;
  return ret;
}
#endif


using namespace std;

ClassImp(RooCustomizer) 
;


static Int_t init()
{
  RooFactoryWSTool::IFace* iface = new RooCustomizer::CustIFace ;
  RooFactoryWSTool::registerSpecial("EDIT",iface) ;
  return 0 ;
}
static Int_t dummy = init() ;


//_____________________________________________________________________________
RooCustomizer::RooCustomizer(const RooAbsArg& pdf, const RooAbsCategoryLValue& masterCat, RooArgSet& splitLeafs, RooArgSet* splitLeafsAll) :
  TNamed(pdf.GetName(),pdf.GetTitle()),
  _sterile(kFALSE),
  _owning(kTRUE),
  _masterPdf((RooAbsArg*)&pdf), 
  _masterCat((RooAbsCategoryLValue*)&masterCat), 
  _masterBranchList("masterBranchList"), 
  _masterLeafList("masterLeafList"), 
  _internalCloneBranchList("cloneBranchList"),
  _cloneNodeListAll(splitLeafsAll),
  _cloneNodeListOwned(&splitLeafs)
{
  // Constructor with a prototype and masterCat index category.
  // Customizers created by this constructor offer offer both the
  // replaceArg() and splitArg() functionality. All nodes created in
  // the customization process are added to the splitLeafs set.
  // If the customizer is owning, the splitLeafs set will become
  // owner of all created objects by the customizer
  // 

  _masterBranchList.setHashTableSize(1000) ;
  _masterLeafList.setHashTableSize(1000) ;

  _cloneBranchList = &_internalCloneBranchList ;
  _cloneBranchList->setHashTableSize(1000) ;

  initialize() ;
}



//_____________________________________________________________________________
RooCustomizer::RooCustomizer(const RooAbsArg& pdf, const char* name) :
  TNamed(pdf.GetName(),pdf.GetTitle()),
  _sterile(kTRUE), 
  _owning(kFALSE),
  _name(name),
  _masterPdf((RooAbsArg*)&pdf), 
  _masterCat(0), 
  _masterBranchList("masterBranchList"), 
  _masterLeafList("masterLeafList"), 
  _internalCloneBranchList("cloneBranchList"),
  _cloneNodeListAll(0),
  _cloneNodeListOwned(0)
{
  // Sterile Constructor. Customizers created by this constructor
  // offer only the replace() method. The supplied 'name' is used as
  // suffix for any cloned branch nodes

  _masterBranchList.setHashTableSize(1000) ;
  _masterLeafList.setHashTableSize(1000) ;

  _cloneBranchList = &_internalCloneBranchList ;
  _cloneBranchList->setHashTableSize(1000) ;

  initialize() ;
}




//_____________________________________________________________________________
void RooCustomizer::initialize() 
{
  // Initialize the customizer

  _masterPdf->leafNodeServerList(&_masterLeafList) ;
  _masterPdf->branchNodeServerList(&_masterBranchList) ;

  _masterLeafListIter = _masterLeafList.createIterator() ;
  _masterBranchListIter = _masterBranchList.createIterator() ;
}



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

  delete _masterLeafListIter ;
  delete _masterBranchListIter ;

}


  

//_____________________________________________________________________________
void RooCustomizer::splitArgs(const RooArgSet& set, const RooAbsCategory& splitCat) 
{
  // Split all arguments in 'set' into individualized clones for each
  // defined state of 'splitCat'. The 'splitCats' category must be
  // subset of or equal to the master category supplied in the
  // customizer constructor.
  //
  // Splitting is only available on customizers created with a master index category

  if (_sterile) {
    coutE(InputArguments) << "RooCustomizer::splitArgs(" << _name 
			  << ") ERROR cannot set spitting rules on this sterile customizer" << endl ;
    return ;
  }
  TIterator* iter = set.createIterator() ;
  RooAbsArg* arg ;
  while((arg=(RooAbsArg*)iter->Next())){
    splitArg(*arg,splitCat) ;
  }
  delete iter ;
}



//_____________________________________________________________________________
void RooCustomizer::splitArg(const RooAbsArg& arg, const RooAbsCategory& splitCat) 
{
  // Split all argument 'arg' into individualized clones for each
  // defined state of 'splitCat'. The 'splitCats' category must be
  // subset of or equal to the master category supplied in the
  // customizer constructor.
  //
  // Splitting is only available on customizers created with a master index category

  if (_splitArgList.FindObject(arg.GetName())) {
    coutE(InputArguments) << "RooCustomizer(" << GetName() << ") ERROR: multiple splitting rules defined for " 
			  << arg.GetName() << " only using first rule" << endl ;
    return ;
  }

  if (_sterile) {
    coutE(InputArguments) << "RooCustomizer::splitArg(" << _name 
	 << ") ERROR cannot set spitting rules on this sterile customizer" << endl ;
    return ;
  }

  _splitArgList.Add((RooAbsArg*)&arg) ;
  _splitCatList.Add((RooAbsCategory*)&splitCat) ;
}



//_____________________________________________________________________________
void RooCustomizer::replaceArg(const RooAbsArg& orig, const RooAbsArg& subst) 
{
  // Replace any occurence of arg 'orig' with arg 'subst'

  if (_replaceArgList.FindObject(orig.GetName())) {
    coutE(InputArguments) << "RooCustomizer(" << GetName() << ") ERROR: multiple replacement rules defined for " 
	 << orig.GetName() << " only using first rule" << endl ;
    return ;
  }

  _replaceArgList.Add((RooAbsArg*)&orig) ;
  _replaceSubList.Add((RooAbsArg*)&subst) ;
}



//_____________________________________________________________________________
RooAbsArg* RooCustomizer::build(Bool_t verbose) 
{
  // Build a clone of the prototype executing all registered 'replace' rules
  // If verbose is set a message is printed for each leaf or branch node
  // modification. The returned head node owns all cloned branch nodes
  // that were created in the cloning proces

  // Execute build
  RooAbsArg* ret =  doBuild(_name.Length()>0?_name.Data():0,verbose) ;

  // Make root object own all cloned nodes

  // First make list of all objects that were created
  RooArgSet allOwned ;
  if (_cloneNodeListOwned) {
    allOwned.add(*_cloneNodeListOwned) ;
  }
  allOwned.add(*_cloneBranchList) ;

  // Remove head node from list
  allOwned.remove(*ret) ;

  // If list with owned objects is not empty, assign
  // head node as owner
  if (allOwned.getSize()>0) {
    ret->addOwnedComponents(allOwned) ;
  }

  return ret ;
}



//_____________________________________________________________________________
RooAbsArg* RooCustomizer::build(const char* masterCatState, Bool_t verbose) 
{
  // Build a clone of the prototype executing all registered 'replace'
  // rules and 'split' rules for the masterCat state named
  // 'masterCatState'.  If verbose is set a message is printed for
  // each leaf or branch node modification. The returned composite arg
  // is owned by the customizer.  This function cannot be called on
  // customizer build with the sterile constructor.

  if (_sterile) {
    coutE(InputArguments) << "RooCustomizer::build(" << _name 
			  << ") ERROR cannot use leaf spitting build() on this sterile customizer" << endl ;
    return 0 ;
  }

  // Set masterCat to given state
  if (_masterCat->setLabel(masterCatState)) {
    coutE(InputArguments) << "RooCustomizer::build(" << _masterPdf->GetName() << "): ERROR label '" << masterCatState 
			  << "' not defined for master splitting category " << _masterCat->GetName() << endl ;
    return 0 ;
  }

  return doBuild(masterCatState,verbose) ;
}



//_____________________________________________________________________________
RooAbsArg* RooCustomizer::doBuild(const char* masterCatState, Bool_t verbose) 
{
  // Back-end implementation of the p.d.f building functionality

  // Find nodes that must be split according to provided description, Clone nodes, change their names
  RooArgSet masterNodesToBeSplit("masterNodesToBeSplit") ;
  RooArgSet masterNodesToBeReplaced("masterNodesToBeReplaced") ;
  RooArgSet masterReplacementNodes("masterReplacementNodes") ;
  RooArgSet clonedMasterNodes("clonedMasterNodes") ;

  masterNodesToBeSplit.setHashTableSize(1000) ;
  masterNodesToBeReplaced.setHashTableSize(1000) ;
  masterReplacementNodes.setHashTableSize(1000) ;
  clonedMasterNodes.setHashTableSize(1000) ;

  _masterLeafListIter->Reset() ;
  RooAbsArg* node ;

  RooArgSet nodeList(_masterLeafList) ;
  nodeList.setHashTableSize(1000) ;

  nodeList.add(_masterBranchList) ;
  TIterator* nIter = nodeList.createIterator() ;

  //   cout << "loop over " << nodeList.getSize() << " nodes" << endl ;
  while((node=(RooAbsArg*)nIter->Next())) {
    RooAbsArg* theSplitArg = !_sterile?(RooAbsArg*) _splitArgList.FindObject(node->GetName()):0 ;
    if (theSplitArg) {
      RooAbsCategory* splitCat = (RooAbsCategory*) _splitCatList.At(_splitArgList.IndexOf(theSplitArg)) ;
      if (verbose) {
	coutI(ObjectHandling) << "RooCustomizer::build(" << _masterPdf->GetName() 
			      << "): tree node " << node->GetName() << " is split by category " << splitCat->GetName() << endl ;
      }
      
      TString newName(node->GetName()) ;
      if (masterCatState) {
	newName.Append("_") ;
	newName.Append(splitCat->getLabel()) ;	
      }

      // Check if this node instance already exists
      RooAbsArg* specNode = _cloneNodeListAll ? _cloneNodeListAll->find(newName) : _cloneNodeListOwned->find(newName) ;
      if (specNode) {

	// Copy instance to one-time use list for this build
	clonedMasterNodes.add(*specNode) ;
	if (verbose) {
	  coutI(ObjectHandling) << "RooCustomizer::build(" << _masterPdf->GetName() 
				<< ") Adding existing node specialization " << newName << " to clonedMasterNodes" << endl ;
	}

	// Affix attribute with old name to clone to support name changing server redirect
	TString nameAttrib("ORIGNAME:") ;
	nameAttrib.Append(node->GetName()) ;
	specNode->setAttribute(nameAttrib) ;
	
	if (!specNode->getStringAttribute("origName")) {
	  specNode->setStringAttribute("origName",node->GetName()) ;
	}



      } else {

	if (node->isDerived()) {
	  coutW(ObjectHandling) << "RooCustomizer::build(" << _masterPdf->GetName() 
				<< "): WARNING: branch node " << node->GetName() << " is split but has no pre-defined specializations" << endl ;
	}

	TString newTitle(node->GetTitle()) ;
	newTitle.Append(" (") ;
	newTitle.Append(splitCat->getLabel()) ;
	newTitle.Append(")") ;
      
	// Create a new clone
	RooAbsArg* clone = (RooAbsArg*) node->Clone(newName.Data()) ;
	clone->setStringAttribute("factory_tag",0) ;
	clone->SetTitle(newTitle) ;

	// Affix attribute with old name to clone to support name changing server redirect
	TString nameAttrib("ORIGNAME:") ;
	nameAttrib.Append(node->GetName()) ;
	clone->setAttribute(nameAttrib) ;

	if (!clone->getStringAttribute("origName")) {
	  clone->setStringAttribute("origName",node->GetName()) ;
	}

	// Add to one-time use list and life-time use list
	clonedMasterNodes.add(*clone) ;
	if (_owning) {
	  _cloneNodeListOwned->addOwned(*clone) ;	
	} else {
	  _cloneNodeListOwned->add(*clone) ;	
	}
	if (_cloneNodeListAll) {
	  _cloneNodeListAll->add(*clone) ;	
	}	
      }
      masterNodesToBeSplit.add(*node) ;     
    }

    RooAbsArg* ReplaceArg = (RooAbsArg*) _replaceArgList.FindObject(node->GetName()) ;
    if (ReplaceArg) {
      RooAbsArg* substArg = (RooAbsArg*) _replaceSubList.At(_replaceArgList.IndexOf(ReplaceArg)) ;
      if (verbose) {
	coutI(ObjectHandling) << "RooCustomizer::build(" << _masterPdf->GetName() 
			      << "): tree node " << node->GetName() << " will be replaced by " << substArg->GetName() << endl ;
      }

      // Affix attribute with old name to support name changing server redirect
      TString nameAttrib("ORIGNAME:") ;
      nameAttrib.Append(node->GetName()) ;
      substArg->setAttribute(nameAttrib) ;

      // Add to list
      masterNodesToBeReplaced.add(*node) ;
      masterReplacementNodes.add(*substArg) ;
    }
  }
  delete nIter ;

  // Find branches that are affected by splitting and must be cloned
  RooArgSet masterBranchesToBeCloned("masterBranchesToBeCloned") ;
  masterBranchesToBeCloned.setHashTableSize(1000) ;
  _masterBranchListIter->Reset() ;
  RooAbsArg* branch ;
  while((branch=(RooAbsArg*)_masterBranchListIter->Next())) {
    
    // If branch is split itself, don't handle here
    if (masterNodesToBeSplit.find(branch->GetName())) {
      if (verbose) {
	coutI(ObjectHandling) << "RooCustomizer::build(" << _masterPdf->GetName() << ") Branch node " << branch->GetName() << " is already split" << endl ;
      }
      continue ;
    }
    if (masterNodesToBeReplaced.find(branch->GetName())) {
      if (verbose) {
	coutI(ObjectHandling) << "RooCustomizer::build(" << _masterPdf->GetName() << ") Branch node " << branch->GetName() << " is already replaced" << endl ;
      }
      continue ;
    }

    if (branch->dependsOn(masterNodesToBeSplit)) {
      if (verbose) {
	coutI(ObjectHandling) << "RooCustomizer::build(" << _masterPdf->GetName() << ") Branch node " 
			      << branch->IsA()->GetName() << "::" << branch->GetName() << " cloned: depends on a split parameter" << endl ;
      }
      masterBranchesToBeCloned.add(*branch) ;
    } else if (branch->dependsOn(masterNodesToBeReplaced)) {
      if (verbose) {
	coutI(ObjectHandling) << "RooCustomizer::build(" << _masterPdf->GetName() << ") Branch node " 
			      << branch->IsA()->GetName() << "::" << branch->GetName() << " cloned: depends on a replaced parameter" << endl ;
      }
      masterBranchesToBeCloned.add(*branch) ;
    }
  }

  // Clone branches, changes their names 
  RooAbsArg* cloneTopPdf = 0;
  RooArgSet clonedMasterBranches("clonedMasterBranches") ;
  clonedMasterBranches.setHashTableSize(1000) ;
  TIterator* iter = masterBranchesToBeCloned.createIterator() ;
  while((branch=(RooAbsArg*)iter->Next())) {
    TString newName(branch->GetName()) ;
    if (masterCatState) {
      newName.Append("_") ;
      newName.Append(masterCatState) ;
    }

    // Affix attribute with old name to clone to support name changing server redirect
    RooAbsArg* clone = (RooAbsArg*) branch->Clone(newName.Data()) ;
    clone->setStringAttribute("factory_tag",0) ;
    TString nameAttrib("ORIGNAME:") ;
    nameAttrib.Append(branch->GetName()) ;
    clone->setAttribute(nameAttrib) ;

    if (!clone->getStringAttribute("origName")) {
      clone->setStringAttribute("origName",branch->GetName()) ;
    }
    
    clonedMasterBranches.add(*clone) ;      

    // Save pointer to clone of top-level pdf
    if (branch==_masterPdf) cloneTopPdf=(RooAbsArg*)clone ;
  }
  delete iter ;
  if (_owning) {
    _cloneBranchList->addOwned(clonedMasterBranches) ;
  } else {
    _cloneBranchList->add(clonedMasterBranches) ;
  }
    
  // Reconnect cloned branches to each other and to cloned nodess
  iter = clonedMasterBranches.createIterator() ;
  while((branch=(RooAbsArg*)iter->Next())) {
    branch->redirectServers(clonedMasterBranches,kFALSE,kTRUE) ;
    branch->redirectServers(clonedMasterNodes,kFALSE,kTRUE) ;
    branch->redirectServers(masterReplacementNodes,kFALSE,kTRUE) ;
  }
  delete iter ;  

  return cloneTopPdf?cloneTopPdf:_masterPdf ;
}


//_____________________________________________________________________________
void RooCustomizer::printName(ostream& os) const 
{
  // Print name of customizer
  os << GetName() ;
}


//_____________________________________________________________________________
void RooCustomizer::printTitle(ostream& os) const 
{
  // Print title of customizer
  os << GetTitle() ;
}


//_____________________________________________________________________________
void RooCustomizer::printClassName(ostream& os) const 
{
  // Print class name of customizer
  os << IsA()->GetName() ;
}


//_____________________________________________________________________________
void RooCustomizer::printArgs(ostream& os) const 
{
  // Print arguments of customizer, i.e. input p.d.f and input master category (if any)
  os << "[ masterPdf=" << _masterPdf->GetName() ;
  if (_masterCat) {
    os << " masterCat=" << _masterCat->GetName() ;
  }
  os << " ]" ;
}



//_____________________________________________________________________________
void RooCustomizer::printMultiline(ostream& os, Int_t /*content*/, Bool_t /*verbose*/, TString indent) const
{
  // Print customizer configuration details

  os << indent << "RooCustomizer for " << _masterPdf->GetName() << (_sterile?" (sterile)":"") << endl ;

  Int_t i, nsplit = _splitArgList.GetSize() ;
  if (nsplit>0) {
    os << indent << "  Splitting rules:" << endl ;
    for (i=0 ; i<nsplit ; i++) {
      os << indent << "   " << _splitArgList.At(i)->GetName() << " is split by " << _splitCatList.At(i)->GetName() << endl ;
    }
  }

  Int_t nrepl = _replaceArgList.GetSize() ;
  if (nrepl>0) {
    os << indent << "  Replacement rules:" << endl ;
    for (i=0 ; i<nrepl ; i++) {
      os << indent << "   " << _replaceSubList.At(i)->GetName() << " replaces " << _replaceArgList.At(i)->GetName() << endl ;
    }
  }
  
  return ;
}



//_____________________________________________________________________________
void RooCustomizer::setCloneBranchSet(RooArgSet& cloneBranchSet) 
{
  // Install the input RooArgSet as container in which all cloned branches
  // will be stored

  _cloneBranchList = &cloneBranchSet ;
  _cloneBranchList->setHashTableSize(1000) ;
}




//_____________________________________________________________________________
std::string RooCustomizer::CustIFace::create(RooFactoryWSTool& ft, const char* typeName, const char* instanceName, std::vector<std::string> args) 
{

  // Check number of arguments
  if (args.size()<2) {
    throw string(Form("RooCustomizer::CustIFace::create() ERROR: expect at least 2 arguments for EDIT: the input object and at least one $Replace() rule")) ;
  }

  if (string(typeName)!="EDIT") {
    throw string(Form("RooCustomizer::CustIFace::create() ERROR: unknown type requested: %s",typeName)) ;
  }

  // Check that first arg exists as RooAbsArg
  RooAbsArg* arg = ft.ws().arg(args[0].c_str()) ;
  if (!arg) {
    throw string(Form("RooCustomizer::CustIFace::create() ERROR: input RooAbsArg %s does not exist",args[0].c_str())) ;
  }

  // If name of new object is same as original, execute in sterile mode (i.e no suffixes attached), and rename original nodes in workspace upon import
  if (args[0]==instanceName) {
    instanceName=0 ;
  }

  // Create a customizer
  RooCustomizer cust(*arg,instanceName) ;
  
  for (unsigned int i=1 ; i<args.size() ; i++) {
    char buf[1024] ;
    strlcpy(buf,args[i].c_str(),1024) ;
    char* sep = strchr(buf,'=') ;
    if (!sep) {
      throw string(Form("RooCustomizer::CustIFace::create() ERROR: unknown argument: %s, expect form orig=subst",args[i].c_str())) ;
    }
    *sep = 0 ;    
    RooAbsArg* orig = ft.ws().arg(buf) ;
    RooAbsArg* subst(0) ;
    if (string(sep+1).find("$REMOVE")==0) {

      // Create a removal dummy ;
      subst = &RooRealConstant::removalDummy() ;

      // If removal instructed was annotated with target node, encode these in removal dummy
      char* sep2 = strchr(sep+1,'(') ;
      if (sep2) {
	char buf2[1024] ;
	strlcpy(buf2,sep2+1,1024) ;
	char* saveptr ;
	char* tok = strtok_r(buf2,",)",&saveptr) ;
	while(tok) {
	  //cout << "$REMOVE is restricted to " << tok << endl ;
	  subst->setAttribute(Form("REMOVE_FROM_%s",tok)) ;
	  tok = strtok_r(0,",)",&saveptr) ;
	}
      } else {
	// Otherwise mark as universal removal node
	subst->setAttribute("REMOVE_ALL") ;
      }

    } else {
      subst = ft.ws().arg(sep+1) ;
    }
//     if (!orig) {
//       throw string(Form("RooCustomizer::CustIFace::create() ERROR: $Replace() input RooAbsArg %s does not exist",buf)) ;
//     }
//     if (!subst) {
//       throw string(Form("RooCustomizer::CustIFace::create() ERROR: $Replace() replacement RooAbsArg %s does not exist",sep+1)) ;
//     }
    if (orig && subst) {
      cust.replaceArg(*orig,*subst) ;
    } else {
      oocoutW((TObject*)0,ObjectHandling) << "RooCustomizer::CustIFace::create() WARNING: input or replacement of a replacement operation not found, operation ignored"<< endl ;
    }
  }

  // Build the desired edited object
  RooAbsArg* targ = cust.build(kFALSE)  ;
  if (!targ) {
    throw string(Form("RooCustomizer::CustIFace::create() ERROR in customizer build, object %snot created",instanceName)) ;
  }

  // Import the object into the workspace
  if (instanceName) {
    // Set the desired name of the top level node
    targ->SetName(instanceName) ;
    ft.ws().import(cust.cloneBranchList(),RooFit::Silence(),RooFit::NoRecursion(kTRUE)) ;
  } else {
    ft.ws().import(cust.cloneBranchList(),RooFit::Silence(),RooFit::RenameConflictNodes("orig",1),RooFit::NoRecursion(kTRUE)) ;    
  }

  return string(instanceName?instanceName:targ->GetName()) ;
}
 RooCustomizer.cxx:1
 RooCustomizer.cxx:2
 RooCustomizer.cxx:3
 RooCustomizer.cxx:4
 RooCustomizer.cxx:5
 RooCustomizer.cxx:6
 RooCustomizer.cxx:7
 RooCustomizer.cxx:8
 RooCustomizer.cxx:9
 RooCustomizer.cxx:10
 RooCustomizer.cxx:11
 RooCustomizer.cxx:12
 RooCustomizer.cxx:13
 RooCustomizer.cxx:14
 RooCustomizer.cxx:15
 RooCustomizer.cxx:16
 RooCustomizer.cxx:17
 RooCustomizer.cxx:18
 RooCustomizer.cxx:19
 RooCustomizer.cxx:20
 RooCustomizer.cxx:21
 RooCustomizer.cxx:22
 RooCustomizer.cxx:23
 RooCustomizer.cxx:24
 RooCustomizer.cxx:25
 RooCustomizer.cxx:26
 RooCustomizer.cxx:27
 RooCustomizer.cxx:28
 RooCustomizer.cxx:29
 RooCustomizer.cxx:30
 RooCustomizer.cxx:31
 RooCustomizer.cxx:32
 RooCustomizer.cxx:33
 RooCustomizer.cxx:34
 RooCustomizer.cxx:35
 RooCustomizer.cxx:36
 RooCustomizer.cxx:37
 RooCustomizer.cxx:38
 RooCustomizer.cxx:39
 RooCustomizer.cxx:40
 RooCustomizer.cxx:41
 RooCustomizer.cxx:42
 RooCustomizer.cxx:43
 RooCustomizer.cxx:44
 RooCustomizer.cxx:45
 RooCustomizer.cxx:46
 RooCustomizer.cxx:47
 RooCustomizer.cxx:48
 RooCustomizer.cxx:49
 RooCustomizer.cxx:50
 RooCustomizer.cxx:51
 RooCustomizer.cxx:52
 RooCustomizer.cxx:53
 RooCustomizer.cxx:54
 RooCustomizer.cxx:55
 RooCustomizer.cxx:56
 RooCustomizer.cxx:57
 RooCustomizer.cxx:58
 RooCustomizer.cxx:59
 RooCustomizer.cxx:60
 RooCustomizer.cxx:61
 RooCustomizer.cxx:62
 RooCustomizer.cxx:63
 RooCustomizer.cxx:64
 RooCustomizer.cxx:65
 RooCustomizer.cxx:66
 RooCustomizer.cxx:67
 RooCustomizer.cxx:68
 RooCustomizer.cxx:69
 RooCustomizer.cxx:70
 RooCustomizer.cxx:71
 RooCustomizer.cxx:72
 RooCustomizer.cxx:73
 RooCustomizer.cxx:74
 RooCustomizer.cxx:75
 RooCustomizer.cxx:76
 RooCustomizer.cxx:77
 RooCustomizer.cxx:78
 RooCustomizer.cxx:79
 RooCustomizer.cxx:80
 RooCustomizer.cxx:81
 RooCustomizer.cxx:82
 RooCustomizer.cxx:83
 RooCustomizer.cxx:84
 RooCustomizer.cxx:85
 RooCustomizer.cxx:86
 RooCustomizer.cxx:87
 RooCustomizer.cxx:88
 RooCustomizer.cxx:89
 RooCustomizer.cxx:90
 RooCustomizer.cxx:91
 RooCustomizer.cxx:92
 RooCustomizer.cxx:93
 RooCustomizer.cxx:94
 RooCustomizer.cxx:95
 RooCustomizer.cxx:96
 RooCustomizer.cxx:97
 RooCustomizer.cxx:98
 RooCustomizer.cxx:99
 RooCustomizer.cxx:100
 RooCustomizer.cxx:101
 RooCustomizer.cxx:102
 RooCustomizer.cxx:103
 RooCustomizer.cxx:104
 RooCustomizer.cxx:105
 RooCustomizer.cxx:106
 RooCustomizer.cxx:107
 RooCustomizer.cxx:108
 RooCustomizer.cxx:109
 RooCustomizer.cxx:110
 RooCustomizer.cxx:111
 RooCustomizer.cxx:112
 RooCustomizer.cxx:113
 RooCustomizer.cxx:114
 RooCustomizer.cxx:115
 RooCustomizer.cxx:116
 RooCustomizer.cxx:117
 RooCustomizer.cxx:118
 RooCustomizer.cxx:119
 RooCustomizer.cxx:120
 RooCustomizer.cxx:121
 RooCustomizer.cxx:122
 RooCustomizer.cxx:123
 RooCustomizer.cxx:124
 RooCustomizer.cxx:125
 RooCustomizer.cxx:126
 RooCustomizer.cxx:127
 RooCustomizer.cxx:128
 RooCustomizer.cxx:129
 RooCustomizer.cxx:130
 RooCustomizer.cxx:131
 RooCustomizer.cxx:132
 RooCustomizer.cxx:133
 RooCustomizer.cxx:134
 RooCustomizer.cxx:135
 RooCustomizer.cxx:136
 RooCustomizer.cxx:137
 RooCustomizer.cxx:138
 RooCustomizer.cxx:139
 RooCustomizer.cxx:140
 RooCustomizer.cxx:141
 RooCustomizer.cxx:142
 RooCustomizer.cxx:143
 RooCustomizer.cxx:144
 RooCustomizer.cxx:145
 RooCustomizer.cxx:146
 RooCustomizer.cxx:147
 RooCustomizer.cxx:148
 RooCustomizer.cxx:149
 RooCustomizer.cxx:150
 RooCustomizer.cxx:151
 RooCustomizer.cxx:152
 RooCustomizer.cxx:153
 RooCustomizer.cxx:154
 RooCustomizer.cxx:155
 RooCustomizer.cxx:156
 RooCustomizer.cxx:157
 RooCustomizer.cxx:158
 RooCustomizer.cxx:159
 RooCustomizer.cxx:160
 RooCustomizer.cxx:161
 RooCustomizer.cxx:162
 RooCustomizer.cxx:163
 RooCustomizer.cxx:164
 RooCustomizer.cxx:165
 RooCustomizer.cxx:166
 RooCustomizer.cxx:167
 RooCustomizer.cxx:168
 RooCustomizer.cxx:169
 RooCustomizer.cxx:170
 RooCustomizer.cxx:171
 RooCustomizer.cxx:172
 RooCustomizer.cxx:173
 RooCustomizer.cxx:174
 RooCustomizer.cxx:175
 RooCustomizer.cxx:176
 RooCustomizer.cxx:177
 RooCustomizer.cxx:178
 RooCustomizer.cxx:179
 RooCustomizer.cxx:180
 RooCustomizer.cxx:181
 RooCustomizer.cxx:182
 RooCustomizer.cxx:183
 RooCustomizer.cxx:184
 RooCustomizer.cxx:185
 RooCustomizer.cxx:186
 RooCustomizer.cxx:187
 RooCustomizer.cxx:188
 RooCustomizer.cxx:189
 RooCustomizer.cxx:190
 RooCustomizer.cxx:191
 RooCustomizer.cxx:192
 RooCustomizer.cxx:193
 RooCustomizer.cxx:194
 RooCustomizer.cxx:195
 RooCustomizer.cxx:196
 RooCustomizer.cxx:197
 RooCustomizer.cxx:198
 RooCustomizer.cxx:199
 RooCustomizer.cxx:200
 RooCustomizer.cxx:201
 RooCustomizer.cxx:202
 RooCustomizer.cxx:203
 RooCustomizer.cxx:204
 RooCustomizer.cxx:205
 RooCustomizer.cxx:206
 RooCustomizer.cxx:207
 RooCustomizer.cxx:208
 RooCustomizer.cxx:209
 RooCustomizer.cxx:210
 RooCustomizer.cxx:211
 RooCustomizer.cxx:212
 RooCustomizer.cxx:213
 RooCustomizer.cxx:214
 RooCustomizer.cxx:215
 RooCustomizer.cxx:216
 RooCustomizer.cxx:217
 RooCustomizer.cxx:218
 RooCustomizer.cxx:219
 RooCustomizer.cxx:220
 RooCustomizer.cxx:221
 RooCustomizer.cxx:222
 RooCustomizer.cxx:223
 RooCustomizer.cxx:224
 RooCustomizer.cxx:225
 RooCustomizer.cxx:226
 RooCustomizer.cxx:227
 RooCustomizer.cxx:228
 RooCustomizer.cxx:229
 RooCustomizer.cxx:230
 RooCustomizer.cxx:231
 RooCustomizer.cxx:232
 RooCustomizer.cxx:233
 RooCustomizer.cxx:234
 RooCustomizer.cxx:235
 RooCustomizer.cxx:236
 RooCustomizer.cxx:237
 RooCustomizer.cxx:238
 RooCustomizer.cxx:239
 RooCustomizer.cxx:240
 RooCustomizer.cxx:241
 RooCustomizer.cxx:242
 RooCustomizer.cxx:243
 RooCustomizer.cxx:244
 RooCustomizer.cxx:245
 RooCustomizer.cxx:246
 RooCustomizer.cxx:247
 RooCustomizer.cxx:248
 RooCustomizer.cxx:249
 RooCustomizer.cxx:250
 RooCustomizer.cxx:251
 RooCustomizer.cxx:252
 RooCustomizer.cxx:253
 RooCustomizer.cxx:254
 RooCustomizer.cxx:255
 RooCustomizer.cxx:256
 RooCustomizer.cxx:257
 RooCustomizer.cxx:258
 RooCustomizer.cxx:259
 RooCustomizer.cxx:260
 RooCustomizer.cxx:261
 RooCustomizer.cxx:262
 RooCustomizer.cxx:263
 RooCustomizer.cxx:264
 RooCustomizer.cxx:265
 RooCustomizer.cxx:266
 RooCustomizer.cxx:267
 RooCustomizer.cxx:268
 RooCustomizer.cxx:269
 RooCustomizer.cxx:270
 RooCustomizer.cxx:271
 RooCustomizer.cxx:272
 RooCustomizer.cxx:273
 RooCustomizer.cxx:274
 RooCustomizer.cxx:275
 RooCustomizer.cxx:276
 RooCustomizer.cxx:277
 RooCustomizer.cxx:278
 RooCustomizer.cxx:279
 RooCustomizer.cxx:280
 RooCustomizer.cxx:281
 RooCustomizer.cxx:282
 RooCustomizer.cxx:283
 RooCustomizer.cxx:284
 RooCustomizer.cxx:285
 RooCustomizer.cxx:286
 RooCustomizer.cxx:287
 RooCustomizer.cxx:288
 RooCustomizer.cxx:289
 RooCustomizer.cxx:290
 RooCustomizer.cxx:291
 RooCustomizer.cxx:292
 RooCustomizer.cxx:293
 RooCustomizer.cxx:294
 RooCustomizer.cxx:295
 RooCustomizer.cxx:296
 RooCustomizer.cxx:297
 RooCustomizer.cxx:298
 RooCustomizer.cxx:299
 RooCustomizer.cxx:300
 RooCustomizer.cxx:301
 RooCustomizer.cxx:302
 RooCustomizer.cxx:303
 RooCustomizer.cxx:304
 RooCustomizer.cxx:305
 RooCustomizer.cxx:306
 RooCustomizer.cxx:307
 RooCustomizer.cxx:308
 RooCustomizer.cxx:309
 RooCustomizer.cxx:310
 RooCustomizer.cxx:311
 RooCustomizer.cxx:312
 RooCustomizer.cxx:313
 RooCustomizer.cxx:314
 RooCustomizer.cxx:315
 RooCustomizer.cxx:316
 RooCustomizer.cxx:317
 RooCustomizer.cxx:318
 RooCustomizer.cxx:319
 RooCustomizer.cxx:320
 RooCustomizer.cxx:321
 RooCustomizer.cxx:322
 RooCustomizer.cxx:323
 RooCustomizer.cxx:324
 RooCustomizer.cxx:325
 RooCustomizer.cxx:326
 RooCustomizer.cxx:327
 RooCustomizer.cxx:328
 RooCustomizer.cxx:329
 RooCustomizer.cxx:330
 RooCustomizer.cxx:331
 RooCustomizer.cxx:332
 RooCustomizer.cxx:333
 RooCustomizer.cxx:334
 RooCustomizer.cxx:335
 RooCustomizer.cxx:336
 RooCustomizer.cxx:337
 RooCustomizer.cxx:338
 RooCustomizer.cxx:339
 RooCustomizer.cxx:340
 RooCustomizer.cxx:341
 RooCustomizer.cxx:342
 RooCustomizer.cxx:343
 RooCustomizer.cxx:344
 RooCustomizer.cxx:345
 RooCustomizer.cxx:346
 RooCustomizer.cxx:347
 RooCustomizer.cxx:348
 RooCustomizer.cxx:349
 RooCustomizer.cxx:350
 RooCustomizer.cxx:351
 RooCustomizer.cxx:352
 RooCustomizer.cxx:353
 RooCustomizer.cxx:354
 RooCustomizer.cxx:355
 RooCustomizer.cxx:356
 RooCustomizer.cxx:357
 RooCustomizer.cxx:358
 RooCustomizer.cxx:359
 RooCustomizer.cxx:360
 RooCustomizer.cxx:361
 RooCustomizer.cxx:362
 RooCustomizer.cxx:363
 RooCustomizer.cxx:364
 RooCustomizer.cxx:365
 RooCustomizer.cxx:366
 RooCustomizer.cxx:367
 RooCustomizer.cxx:368
 RooCustomizer.cxx:369
 RooCustomizer.cxx:370
 RooCustomizer.cxx:371
 RooCustomizer.cxx:372
 RooCustomizer.cxx:373
 RooCustomizer.cxx:374
 RooCustomizer.cxx:375
 RooCustomizer.cxx:376
 RooCustomizer.cxx:377
 RooCustomizer.cxx:378
 RooCustomizer.cxx:379
 RooCustomizer.cxx:380
 RooCustomizer.cxx:381
 RooCustomizer.cxx:382
 RooCustomizer.cxx:383
 RooCustomizer.cxx:384
 RooCustomizer.cxx:385
 RooCustomizer.cxx:386
 RooCustomizer.cxx:387
 RooCustomizer.cxx:388
 RooCustomizer.cxx:389
 RooCustomizer.cxx:390
 RooCustomizer.cxx:391
 RooCustomizer.cxx:392
 RooCustomizer.cxx:393
 RooCustomizer.cxx:394
 RooCustomizer.cxx:395
 RooCustomizer.cxx:396
 RooCustomizer.cxx:397
 RooCustomizer.cxx:398
 RooCustomizer.cxx:399
 RooCustomizer.cxx:400
 RooCustomizer.cxx:401
 RooCustomizer.cxx:402
 RooCustomizer.cxx:403
 RooCustomizer.cxx:404
 RooCustomizer.cxx:405
 RooCustomizer.cxx:406
 RooCustomizer.cxx:407
 RooCustomizer.cxx:408
 RooCustomizer.cxx:409
 RooCustomizer.cxx:410
 RooCustomizer.cxx:411
 RooCustomizer.cxx:412
 RooCustomizer.cxx:413
 RooCustomizer.cxx:414
 RooCustomizer.cxx:415
 RooCustomizer.cxx:416
 RooCustomizer.cxx:417
 RooCustomizer.cxx:418
 RooCustomizer.cxx:419
 RooCustomizer.cxx:420
 RooCustomizer.cxx:421
 RooCustomizer.cxx:422
 RooCustomizer.cxx:423
 RooCustomizer.cxx:424
 RooCustomizer.cxx:425
 RooCustomizer.cxx:426
 RooCustomizer.cxx:427
 RooCustomizer.cxx:428
 RooCustomizer.cxx:429
 RooCustomizer.cxx:430
 RooCustomizer.cxx:431
 RooCustomizer.cxx:432
 RooCustomizer.cxx:433
 RooCustomizer.cxx:434
 RooCustomizer.cxx:435
 RooCustomizer.cxx:436
 RooCustomizer.cxx:437
 RooCustomizer.cxx:438
 RooCustomizer.cxx:439
 RooCustomizer.cxx:440
 RooCustomizer.cxx:441
 RooCustomizer.cxx:442
 RooCustomizer.cxx:443
 RooCustomizer.cxx:444
 RooCustomizer.cxx:445
 RooCustomizer.cxx:446
 RooCustomizer.cxx:447
 RooCustomizer.cxx:448
 RooCustomizer.cxx:449
 RooCustomizer.cxx:450
 RooCustomizer.cxx:451
 RooCustomizer.cxx:452
 RooCustomizer.cxx:453
 RooCustomizer.cxx:454
 RooCustomizer.cxx:455
 RooCustomizer.cxx:456
 RooCustomizer.cxx:457
 RooCustomizer.cxx:458
 RooCustomizer.cxx:459
 RooCustomizer.cxx:460
 RooCustomizer.cxx:461
 RooCustomizer.cxx:462
 RooCustomizer.cxx:463
 RooCustomizer.cxx:464
 RooCustomizer.cxx:465
 RooCustomizer.cxx:466
 RooCustomizer.cxx:467
 RooCustomizer.cxx:468
 RooCustomizer.cxx:469
 RooCustomizer.cxx:470
 RooCustomizer.cxx:471
 RooCustomizer.cxx:472
 RooCustomizer.cxx:473
 RooCustomizer.cxx:474
 RooCustomizer.cxx:475
 RooCustomizer.cxx:476
 RooCustomizer.cxx:477
 RooCustomizer.cxx:478
 RooCustomizer.cxx:479
 RooCustomizer.cxx:480
 RooCustomizer.cxx:481
 RooCustomizer.cxx:482
 RooCustomizer.cxx:483
 RooCustomizer.cxx:484
 RooCustomizer.cxx:485
 RooCustomizer.cxx:486
 RooCustomizer.cxx:487
 RooCustomizer.cxx:488
 RooCustomizer.cxx:489
 RooCustomizer.cxx:490
 RooCustomizer.cxx:491
 RooCustomizer.cxx:492
 RooCustomizer.cxx:493
 RooCustomizer.cxx:494
 RooCustomizer.cxx:495
 RooCustomizer.cxx:496
 RooCustomizer.cxx:497
 RooCustomizer.cxx:498
 RooCustomizer.cxx:499
 RooCustomizer.cxx:500
 RooCustomizer.cxx:501
 RooCustomizer.cxx:502
 RooCustomizer.cxx:503
 RooCustomizer.cxx:504
 RooCustomizer.cxx:505
 RooCustomizer.cxx:506
 RooCustomizer.cxx:507
 RooCustomizer.cxx:508
 RooCustomizer.cxx:509
 RooCustomizer.cxx:510
 RooCustomizer.cxx:511
 RooCustomizer.cxx:512
 RooCustomizer.cxx:513
 RooCustomizer.cxx:514
 RooCustomizer.cxx:515
 RooCustomizer.cxx:516
 RooCustomizer.cxx:517
 RooCustomizer.cxx:518
 RooCustomizer.cxx:519
 RooCustomizer.cxx:520
 RooCustomizer.cxx:521
 RooCustomizer.cxx:522
 RooCustomizer.cxx:523
 RooCustomizer.cxx:524
 RooCustomizer.cxx:525
 RooCustomizer.cxx:526
 RooCustomizer.cxx:527
 RooCustomizer.cxx:528
 RooCustomizer.cxx:529
 RooCustomizer.cxx:530
 RooCustomizer.cxx:531
 RooCustomizer.cxx:532
 RooCustomizer.cxx:533
 RooCustomizer.cxx:534
 RooCustomizer.cxx:535
 RooCustomizer.cxx:536
 RooCustomizer.cxx:537
 RooCustomizer.cxx:538
 RooCustomizer.cxx:539
 RooCustomizer.cxx:540
 RooCustomizer.cxx:541
 RooCustomizer.cxx:542
 RooCustomizer.cxx:543
 RooCustomizer.cxx:544
 RooCustomizer.cxx:545
 RooCustomizer.cxx:546
 RooCustomizer.cxx:547
 RooCustomizer.cxx:548
 RooCustomizer.cxx:549
 RooCustomizer.cxx:550
 RooCustomizer.cxx:551
 RooCustomizer.cxx:552
 RooCustomizer.cxx:553
 RooCustomizer.cxx:554
 RooCustomizer.cxx:555
 RooCustomizer.cxx:556
 RooCustomizer.cxx:557
 RooCustomizer.cxx:558
 RooCustomizer.cxx:559
 RooCustomizer.cxx:560
 RooCustomizer.cxx:561
 RooCustomizer.cxx:562
 RooCustomizer.cxx:563
 RooCustomizer.cxx:564
 RooCustomizer.cxx:565
 RooCustomizer.cxx:566
 RooCustomizer.cxx:567
 RooCustomizer.cxx:568
 RooCustomizer.cxx:569
 RooCustomizer.cxx:570
 RooCustomizer.cxx:571
 RooCustomizer.cxx:572
 RooCustomizer.cxx:573
 RooCustomizer.cxx:574
 RooCustomizer.cxx:575
 RooCustomizer.cxx:576
 RooCustomizer.cxx:577
 RooCustomizer.cxx:578
 RooCustomizer.cxx:579
 RooCustomizer.cxx:580
 RooCustomizer.cxx:581
 RooCustomizer.cxx:582
 RooCustomizer.cxx:583
 RooCustomizer.cxx:584
 RooCustomizer.cxx:585
 RooCustomizer.cxx:586
 RooCustomizer.cxx:587
 RooCustomizer.cxx:588
 RooCustomizer.cxx:589
 RooCustomizer.cxx:590
 RooCustomizer.cxx:591
 RooCustomizer.cxx:592
 RooCustomizer.cxx:593
 RooCustomizer.cxx:594
 RooCustomizer.cxx:595
 RooCustomizer.cxx:596
 RooCustomizer.cxx:597
 RooCustomizer.cxx:598
 RooCustomizer.cxx:599
 RooCustomizer.cxx:600
 RooCustomizer.cxx:601
 RooCustomizer.cxx:602
 RooCustomizer.cxx:603
 RooCustomizer.cxx:604
 RooCustomizer.cxx:605
 RooCustomizer.cxx:606
 RooCustomizer.cxx:607
 RooCustomizer.cxx:608
 RooCustomizer.cxx:609
 RooCustomizer.cxx:610
 RooCustomizer.cxx:611
 RooCustomizer.cxx:612
 RooCustomizer.cxx:613
 RooCustomizer.cxx:614
 RooCustomizer.cxx:615
 RooCustomizer.cxx:616
 RooCustomizer.cxx:617
 RooCustomizer.cxx:618
 RooCustomizer.cxx:619
 RooCustomizer.cxx:620
 RooCustomizer.cxx:621
 RooCustomizer.cxx:622
 RooCustomizer.cxx:623
 RooCustomizer.cxx:624
 RooCustomizer.cxx:625
 RooCustomizer.cxx:626
 RooCustomizer.cxx:627
 RooCustomizer.cxx:628
 RooCustomizer.cxx:629
 RooCustomizer.cxx:630
 RooCustomizer.cxx:631
 RooCustomizer.cxx:632
 RooCustomizer.cxx:633
 RooCustomizer.cxx:634
 RooCustomizer.cxx:635
 RooCustomizer.cxx:636
 RooCustomizer.cxx:637
 RooCustomizer.cxx:638
 RooCustomizer.cxx:639
 RooCustomizer.cxx:640
 RooCustomizer.cxx:641
 RooCustomizer.cxx:642
 RooCustomizer.cxx:643
 RooCustomizer.cxx:644
 RooCustomizer.cxx:645
 RooCustomizer.cxx:646
 RooCustomizer.cxx:647
 RooCustomizer.cxx:648
 RooCustomizer.cxx:649
 RooCustomizer.cxx:650
 RooCustomizer.cxx:651
 RooCustomizer.cxx:652
 RooCustomizer.cxx:653
 RooCustomizer.cxx:654
 RooCustomizer.cxx:655
 RooCustomizer.cxx:656
 RooCustomizer.cxx:657
 RooCustomizer.cxx:658
 RooCustomizer.cxx:659
 RooCustomizer.cxx:660
 RooCustomizer.cxx:661
 RooCustomizer.cxx:662
 RooCustomizer.cxx:663
 RooCustomizer.cxx:664
 RooCustomizer.cxx:665
 RooCustomizer.cxx:666
 RooCustomizer.cxx:667
 RooCustomizer.cxx:668
 RooCustomizer.cxx:669
 RooCustomizer.cxx:670
 RooCustomizer.cxx:671
 RooCustomizer.cxx:672
 RooCustomizer.cxx:673
 RooCustomizer.cxx:674
 RooCustomizer.cxx:675
 RooCustomizer.cxx:676
 RooCustomizer.cxx:677
 RooCustomizer.cxx:678
 RooCustomizer.cxx:679
 RooCustomizer.cxx:680
 RooCustomizer.cxx:681
 RooCustomizer.cxx:682
 RooCustomizer.cxx:683
 RooCustomizer.cxx:684
 RooCustomizer.cxx:685
 RooCustomizer.cxx:686
 RooCustomizer.cxx:687
 RooCustomizer.cxx:688
 RooCustomizer.cxx:689
 RooCustomizer.cxx:690
 RooCustomizer.cxx:691
 RooCustomizer.cxx:692
 RooCustomizer.cxx:693
 RooCustomizer.cxx:694
 RooCustomizer.cxx:695
 RooCustomizer.cxx:696
 RooCustomizer.cxx:697
 RooCustomizer.cxx:698
 RooCustomizer.cxx:699
 RooCustomizer.cxx:700
 RooCustomizer.cxx:701
 RooCustomizer.cxx:702
 RooCustomizer.cxx:703
 RooCustomizer.cxx:704
 RooCustomizer.cxx:705
 RooCustomizer.cxx:706
 RooCustomizer.cxx:707
 RooCustomizer.cxx:708
 RooCustomizer.cxx:709
 RooCustomizer.cxx:710
 RooCustomizer.cxx:711
 RooCustomizer.cxx:712
 RooCustomizer.cxx:713
 RooCustomizer.cxx:714
 RooCustomizer.cxx:715
 RooCustomizer.cxx:716
 RooCustomizer.cxx:717
 RooCustomizer.cxx:718
 RooCustomizer.cxx:719
 RooCustomizer.cxx:720
 RooCustomizer.cxx:721
 RooCustomizer.cxx:722
 RooCustomizer.cxx:723
 RooCustomizer.cxx:724
 RooCustomizer.cxx:725
 RooCustomizer.cxx:726
 RooCustomizer.cxx:727
 RooCustomizer.cxx:728
 RooCustomizer.cxx:729
 RooCustomizer.cxx:730
 RooCustomizer.cxx:731
 RooCustomizer.cxx:732
 RooCustomizer.cxx:733
 RooCustomizer.cxx:734
 RooCustomizer.cxx:735
 RooCustomizer.cxx:736
 RooCustomizer.cxx:737
 RooCustomizer.cxx:738
 RooCustomizer.cxx:739
 RooCustomizer.cxx:740
 RooCustomizer.cxx:741
 RooCustomizer.cxx:742
 RooCustomizer.cxx:743
 RooCustomizer.cxx:744
 RooCustomizer.cxx:745
 RooCustomizer.cxx:746
 RooCustomizer.cxx:747
 RooCustomizer.cxx:748
 RooCustomizer.cxx:749
 RooCustomizer.cxx:750
 RooCustomizer.cxx:751
 RooCustomizer.cxx:752
 RooCustomizer.cxx:753
 RooCustomizer.cxx:754
 RooCustomizer.cxx:755
 RooCustomizer.cxx:756
 RooCustomizer.cxx:757
 RooCustomizer.cxx:758
 RooCustomizer.cxx:759
 RooCustomizer.cxx:760
 RooCustomizer.cxx:761
 RooCustomizer.cxx:762
 RooCustomizer.cxx:763
 RooCustomizer.cxx:764