/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 *    File: $Id: RooCustomizer.h,v 1.11 2007/05/11 09:11:30 verkerke Exp $
 * 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)             *
 *****************************************************************************/

#ifndef ROO_PDF_CUSTOMIZER
#define ROO_PDF_CUSTOMIZER

#include "Rtypes.h"
#include "TList.h"
#include "TNamed.h"
#include "TString.h"
#include "RooArgSet.h"
#include "RooPrintable.h"
#include "RooFactoryWSTool.h"
class RooAbsCategoryLValue ; 
class RooAbsCategory ;
class RooAbsArg ;
class RooAbsPdf ;

class RooCustomizer : public TNamed, public RooPrintable {

public:

  // Constructors, assignment etc
  RooCustomizer(const RooAbsArg& pdf, const RooAbsCategoryLValue& masterCat, RooArgSet& splitLeafListOwned, RooArgSet* splitLeafListAll=0) ;
  RooCustomizer(const RooAbsArg& pdf, const char* name) ;
  virtual ~RooCustomizer() ;
  
  void setOwning(Bool_t flag) { 
    // If flag is true, make customizer own all created components
    _owning = flag ; 
  }
  
  void splitArgs(const RooArgSet& argSet, const RooAbsCategory& splitCat) ;
  void splitArg(const RooAbsArg& arg, const RooAbsCategory& splitCat) ;
  void replaceArg(const RooAbsArg& orig, const RooAbsArg& subst) ;
  RooAbsArg* build(const char* masterCatState, Bool_t verbose=kFALSE) ;
  RooAbsArg* build(Bool_t verbose=kFALSE) ;

  const RooArgSet& cloneBranchList() const { 
    // Return list of cloned branch nodes
    return *_cloneBranchList ; 
  }
  const RooArgSet& cloneLeafList() const { 
    // Return list of cloned leaf nodes
    return *_cloneNodeListOwned ; 
  }

  // Printing interface 
  virtual void printName(std::ostream& os) const ;
  virtual void printTitle(std::ostream& os) const ;
  virtual void printClassName(std::ostream& os) const ;
  virtual void printArgs(std::ostream& os) const ;
  virtual void printMultiline(std::ostream& os, Int_t content, Bool_t verbose=kFALSE, TString indent= "") const;

  inline virtual void Print(Option_t *options= 0) const {
    // Printing interface
    printStream(defaultPrintStream(),defaultPrintContents(options),defaultPrintStyle(options));
  }

  // Releases ownership of list of cloned branch nodes
  void setCloneBranchSet(RooArgSet& cloneBranchSet) ;

  // Factory interface
  class CustIFace : public RooFactoryWSTool::IFace {
  public:
    virtual ~CustIFace() {} ;
    std::string create(RooFactoryWSTool& ft, const char* typeName, const char* instanceName, std::vector<std::string> args) ;
  } ;

protected:
  
  RooCustomizer(const RooCustomizer&) ;
  void initialize() ;
  
  RooAbsArg* doBuild(const char* masterCatState, Bool_t verbose) ;

  Bool_t _sterile ; // If true we do not have as associated master category
  Bool_t _owning ;  // If true we own all created components
  TString _name ;   // Name of this object

  TList _splitArgList ; // List of RooAbsArgs to be split
  TList _splitCatList ; // List of categories to be used for above splits

  TList _replaceArgList ; // List of RooAbsArgs to be replaced
  TList _replaceSubList ; // List of replacement RooAbsArgs

  // Master nodes are not owned
  RooAbsArg* _masterPdf ;             // Pointer to input p.d.f
  RooAbsCategoryLValue* _masterCat ;  // Pointer to input master category

  TIterator* _masterLeafListIter ;    // Iterator over leaf list
  TIterator* _masterBranchListIter ;  // Iterator over branch list

  RooArgSet  _masterBranchList ;      // List of branch nodes
  RooArgSet  _masterLeafList ;        // List of leaf nodes

  RooArgSet  _internalCloneBranchList ; // List of branches of internal clone
  RooArgSet* _cloneBranchList ;         // Pointer to list of cloned branches used

  // Cloned leafs are owned by the user supplied list in the ctor
  RooArgSet* _cloneNodeListAll ;        // List of all cloned nodes
  RooArgSet* _cloneNodeListOwned ;      // List of owned cloned nodes

  ClassDef(RooCustomizer,0) // Editing tool for RooAbsArg composite object expressions
} ;

#endif
 RooCustomizer.h:1
 RooCustomizer.h:2
 RooCustomizer.h:3
 RooCustomizer.h:4
 RooCustomizer.h:5
 RooCustomizer.h:6
 RooCustomizer.h:7
 RooCustomizer.h:8
 RooCustomizer.h:9
 RooCustomizer.h:10
 RooCustomizer.h:11
 RooCustomizer.h:12
 RooCustomizer.h:13
 RooCustomizer.h:14
 RooCustomizer.h:15
 RooCustomizer.h:16
 RooCustomizer.h:17
 RooCustomizer.h:18
 RooCustomizer.h:19
 RooCustomizer.h:20
 RooCustomizer.h:21
 RooCustomizer.h:22
 RooCustomizer.h:23
 RooCustomizer.h:24
 RooCustomizer.h:25
 RooCustomizer.h:26
 RooCustomizer.h:27
 RooCustomizer.h:28
 RooCustomizer.h:29
 RooCustomizer.h:30
 RooCustomizer.h:31
 RooCustomizer.h:32
 RooCustomizer.h:33
 RooCustomizer.h:34
 RooCustomizer.h:35
 RooCustomizer.h:36
 RooCustomizer.h:37
 RooCustomizer.h:38
 RooCustomizer.h:39
 RooCustomizer.h:40
 RooCustomizer.h:41
 RooCustomizer.h:42
 RooCustomizer.h:43
 RooCustomizer.h:44
 RooCustomizer.h:45
 RooCustomizer.h:46
 RooCustomizer.h:47
 RooCustomizer.h:48
 RooCustomizer.h:49
 RooCustomizer.h:50
 RooCustomizer.h:51
 RooCustomizer.h:52
 RooCustomizer.h:53
 RooCustomizer.h:54
 RooCustomizer.h:55
 RooCustomizer.h:56
 RooCustomizer.h:57
 RooCustomizer.h:58
 RooCustomizer.h:59
 RooCustomizer.h:60
 RooCustomizer.h:61
 RooCustomizer.h:62
 RooCustomizer.h:63
 RooCustomizer.h:64
 RooCustomizer.h:65
 RooCustomizer.h:66
 RooCustomizer.h:67
 RooCustomizer.h:68
 RooCustomizer.h:69
 RooCustomizer.h:70
 RooCustomizer.h:71
 RooCustomizer.h:72
 RooCustomizer.h:73
 RooCustomizer.h:74
 RooCustomizer.h:75
 RooCustomizer.h:76
 RooCustomizer.h:77
 RooCustomizer.h:78
 RooCustomizer.h:79
 RooCustomizer.h:80
 RooCustomizer.h:81
 RooCustomizer.h:82
 RooCustomizer.h:83
 RooCustomizer.h:84
 RooCustomizer.h:85
 RooCustomizer.h:86
 RooCustomizer.h:87
 RooCustomizer.h:88
 RooCustomizer.h:89
 RooCustomizer.h:90
 RooCustomizer.h:91
 RooCustomizer.h:92
 RooCustomizer.h:93
 RooCustomizer.h:94
 RooCustomizer.h:95
 RooCustomizer.h:96
 RooCustomizer.h:97
 RooCustomizer.h:98
 RooCustomizer.h:99
 RooCustomizer.h:100
 RooCustomizer.h:101
 RooCustomizer.h:102
 RooCustomizer.h:103
 RooCustomizer.h:104
 RooCustomizer.h:105
 RooCustomizer.h:106
 RooCustomizer.h:107
 RooCustomizer.h:108
 RooCustomizer.h:109
 RooCustomizer.h:110
 RooCustomizer.h:111
 RooCustomizer.h:112
 RooCustomizer.h:113
 RooCustomizer.h:114
 RooCustomizer.h:115
 RooCustomizer.h:116
 RooCustomizer.h:117
 RooCustomizer.h:118
 RooCustomizer.h:119
 RooCustomizer.h:120