/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 *    File: $Id: RooSimPdfBuilder.h,v 1.13 2007/05/11 10:14:56 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_SIM_PDF_BUILDER
#define ROO_SIM_PDF_BUILDER

#include "Rtypes.h"
#include "TObject.h"
#include "RooArgSet.h"
#include "RooArgList.h"
#include "RooAbsData.h"
#include <list>
class RooSimultaneous ;
class RooAbsPdf ;
class RooCategory ;
class RooSuperCategory ;

class RooSimPdfBuilder : public TObject {
public:

  RooSimPdfBuilder(const RooArgSet& pdfProtoList) ;
  ~RooSimPdfBuilder() ;

  RooArgSet* createProtoBuildConfig() ;

  RooSimultaneous* buildPdf(const RooArgSet& buildConfig, const RooArgSet& dependents, 
				  const RooArgSet* auxSplitCats=0, Bool_t verbose=kFALSE) ;

  RooSimultaneous* buildPdf(const RooArgSet& buildConfig, const RooAbsData* dataSet, 
				  const RooArgSet& auxSplitCats, Bool_t verbose=kFALSE) {
    return buildPdf(buildConfig,*dataSet->get(),&auxSplitCats,verbose) ;
  }

  RooSimultaneous* buildPdf(const RooArgSet& buildConfig, const RooArgSet& dependents,
				  const RooArgSet& auxSplitCats, Bool_t verbose=kFALSE) {
    return buildPdf(buildConfig,dependents,&auxSplitCats,verbose) ;
  }

  RooSimultaneous* buildPdf(const RooArgSet& buildConfig, const RooAbsData* dataSet, 
				  const RooArgSet* auxSplitCats=0, Bool_t verbose=kFALSE) {
    return buildPdf(buildConfig,*dataSet->get(),auxSplitCats,verbose) ;
  }
  
  const RooArgSet& splitLeafList() { return _splitNodeList; }

  void addSpecializations(const RooArgSet& specSet) ;
 
protected:

  RooArgSet _protoPdfSet ;       // Set of prototype PDFS

  RooArgSet _compSplitCatSet ;   // List of owned composite splitting categories
  RooArgSet _splitNodeListOwned ;  // List of all split nodes
  RooArgSet _splitNodeList ;       // List of owned split nodes
  TList     _retiredCustomizerList ; // Retired customizer from previous builds (own their PDF branch nodes)
 
  std::list<RooSimultaneous*> _simPdfList ;     // The simpdfs that we built
  std::list<RooSuperCategory*> _fitCatList ;     // The supercategories that we built


private:
  RooSimPdfBuilder(const RooSimPdfBuilder&) ; // No copying allowed

protected:
  ClassDef(RooSimPdfBuilder,0) // RooSimultaneous PDF Builder (obsolete)
};

#endif
 RooSimPdfBuilder.h:1
 RooSimPdfBuilder.h:2
 RooSimPdfBuilder.h:3
 RooSimPdfBuilder.h:4
 RooSimPdfBuilder.h:5
 RooSimPdfBuilder.h:6
 RooSimPdfBuilder.h:7
 RooSimPdfBuilder.h:8
 RooSimPdfBuilder.h:9
 RooSimPdfBuilder.h:10
 RooSimPdfBuilder.h:11
 RooSimPdfBuilder.h:12
 RooSimPdfBuilder.h:13
 RooSimPdfBuilder.h:14
 RooSimPdfBuilder.h:15
 RooSimPdfBuilder.h:16
 RooSimPdfBuilder.h:17
 RooSimPdfBuilder.h:18
 RooSimPdfBuilder.h:19
 RooSimPdfBuilder.h:20
 RooSimPdfBuilder.h:21
 RooSimPdfBuilder.h:22
 RooSimPdfBuilder.h:23
 RooSimPdfBuilder.h:24
 RooSimPdfBuilder.h:25
 RooSimPdfBuilder.h:26
 RooSimPdfBuilder.h:27
 RooSimPdfBuilder.h:28
 RooSimPdfBuilder.h:29
 RooSimPdfBuilder.h:30
 RooSimPdfBuilder.h:31
 RooSimPdfBuilder.h:32
 RooSimPdfBuilder.h:33
 RooSimPdfBuilder.h:34
 RooSimPdfBuilder.h:35
 RooSimPdfBuilder.h:36
 RooSimPdfBuilder.h:37
 RooSimPdfBuilder.h:38
 RooSimPdfBuilder.h:39
 RooSimPdfBuilder.h:40
 RooSimPdfBuilder.h:41
 RooSimPdfBuilder.h:42
 RooSimPdfBuilder.h:43
 RooSimPdfBuilder.h:44
 RooSimPdfBuilder.h:45
 RooSimPdfBuilder.h:46
 RooSimPdfBuilder.h:47
 RooSimPdfBuilder.h:48
 RooSimPdfBuilder.h:49
 RooSimPdfBuilder.h:50
 RooSimPdfBuilder.h:51
 RooSimPdfBuilder.h:52
 RooSimPdfBuilder.h:53
 RooSimPdfBuilder.h:54
 RooSimPdfBuilder.h:55
 RooSimPdfBuilder.h:56
 RooSimPdfBuilder.h:57
 RooSimPdfBuilder.h:58
 RooSimPdfBuilder.h:59
 RooSimPdfBuilder.h:60
 RooSimPdfBuilder.h:61
 RooSimPdfBuilder.h:62
 RooSimPdfBuilder.h:63
 RooSimPdfBuilder.h:64
 RooSimPdfBuilder.h:65
 RooSimPdfBuilder.h:66
 RooSimPdfBuilder.h:67
 RooSimPdfBuilder.h:68
 RooSimPdfBuilder.h:69
 RooSimPdfBuilder.h:70
 RooSimPdfBuilder.h:71
 RooSimPdfBuilder.h:72
 RooSimPdfBuilder.h:73
 RooSimPdfBuilder.h:74
 RooSimPdfBuilder.h:75
 RooSimPdfBuilder.h:76
 RooSimPdfBuilder.h:77
 RooSimPdfBuilder.h:78
 RooSimPdfBuilder.h:79
 RooSimPdfBuilder.h:80