/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 *    File: $Id: RooSimultaneous.h,v 1.42 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_SIMULTANEOUS
#define ROO_SIMULTANEOUS

//#include "THashList.h"
#include "TList.h"
#include "RooAbsPdf.h"
#include "RooCategoryProxy.h"
#include "RooRealProxy.h"
#include "RooSetProxy.h"
#include "RooAICRegistry.h"
#include "RooObjCacheManager.h"
#include "RooAbsCacheElement.h"
#include "RooArgList.h"
#include <map>
#include <string>
class RooAbsCategoryLValue ;
class RooFitResult ;
class RooPlot ;
class RooAbsData ;
class RooLinkedList ;

class RooSimultaneous : public RooAbsPdf {
public:

  // Constructors, assignment etc
  inline RooSimultaneous() : _plotCoefNormRange(0) { }
  RooSimultaneous(const char *name, const char *title, RooAbsCategoryLValue& indexCat) ;
  RooSimultaneous(const char *name, const char *title, std::map<std::string,RooAbsPdf*> pdfMap, RooAbsCategoryLValue& inIndexCat) ;
  RooSimultaneous(const char *name, const char *title, const RooArgList& pdfList, RooAbsCategoryLValue& indexCat) ;
  RooSimultaneous(const RooSimultaneous& other, const char* name=0);
  virtual TObject* clone(const char* newname) const { return new RooSimultaneous(*this,newname) ; }
  virtual ~RooSimultaneous() ;

  virtual Double_t evaluate() const ;
  virtual Bool_t selfNormalized() const { return kTRUE ; }
  Bool_t addPdf(const RooAbsPdf& pdf, const char* catLabel) ;

  virtual ExtendMode extendMode() const ;

  virtual Double_t expectedEvents(const RooArgSet* nset) const ;
  virtual Double_t expectedEvents(const RooArgSet& nset) const { return expectedEvents(&nset) ; }

  virtual Bool_t forceAnalyticalInt(const RooAbsArg&) const { return kTRUE ; }
  Int_t getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& numVars, const RooArgSet* normSet, const char* rangeName=0) const ;
  Double_t analyticalIntegralWN(Int_t code, const RooArgSet* normSet, const char* rangeName=0) const ;

  using RooAbsPdf::plotOn ;
  virtual RooPlot* plotOn(RooPlot* frame, 
			  const RooCmdArg& arg1            , const RooCmdArg& arg2=RooCmdArg(),
			  const RooCmdArg& arg3=RooCmdArg(), const RooCmdArg& arg4=RooCmdArg(),
			  const RooCmdArg& arg5=RooCmdArg(), const RooCmdArg& arg6=RooCmdArg(),
			  const RooCmdArg& arg7=RooCmdArg(), const RooCmdArg& arg8=RooCmdArg(),
			  const RooCmdArg& arg9=RooCmdArg(), const RooCmdArg& arg10=RooCmdArg()) const {
    return RooAbsReal::plotOn(frame,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10) ;
  }
  virtual RooPlot* plotOn(RooPlot* frame, RooLinkedList& cmdList) const ;

  // Backward compatibility function
  virtual RooPlot *plotOn(RooPlot *frame, Option_t* drawOptions, Double_t scaleFactor=1.0, 
			  ScaleType stype=Relative, const RooAbsData* projData=0, const RooArgSet* projSet=0,
			  Double_t precision=1e-3, Bool_t shiftToZero=kFALSE, const RooArgSet* projDataSet=0,
			  Double_t rangeLo=0, Double_t rangeHi=0, RooCurve::WingMode wmode=RooCurve::Extended) const;
  
  RooAbsPdf* getPdf(const char* catName) const ;
  const RooAbsCategoryLValue& indexCat() const { return (RooAbsCategoryLValue&) _indexCat.arg() ; }


  virtual RooDataSet* generateSimGlobal(const RooArgSet& whatVars, Int_t nEvents) ;

  virtual RooDataHist* fillDataHist(RooDataHist *hist, const RooArgSet* nset, Double_t scaleFactor,
				    Bool_t correctForBinVolume=kFALSE, Bool_t showProgress=kFALSE) const ;
  
protected:

  void initialize(RooAbsCategoryLValue& inIndexCat, std::map<std::string,RooAbsPdf*> pdfMap) ;

  virtual void selectNormalization(const RooArgSet* depSet=0, Bool_t force=kFALSE) ;
  virtual void selectNormalizationRange(const char* rangeName=0, Bool_t force=kFALSE) ;
  mutable RooSetProxy _plotCoefNormSet ;
  const TNamed* _plotCoefNormRange ;

  class CacheElem : public RooAbsCacheElement {
  public:
    virtual ~CacheElem() {} ;
    RooArgList containedArgs(Action) { return RooArgList(_partIntList) ; }
    RooArgList _partIntList ;
  } ;
  mutable RooObjCacheManager _partIntMgr ; // Component normalization manager


  friend class RooSimGenContext ;
  friend class RooSimSplitGenContext ;
  virtual RooAbsGenContext* autoGenContext(const RooArgSet &vars, const RooDataSet* prototype=0, const RooArgSet* auxProto=0, 
					   Bool_t verbose=kFALSE, Bool_t autoBinned=kTRUE, const char* binnedTag="") const ;
  virtual RooAbsGenContext* genContext(const RooArgSet &vars, const RooDataSet *prototype=0, 
	                               const RooArgSet* auxProto=0, Bool_t verbose= kFALSE) const ;
 
  RooCategoryProxy _indexCat ; // Index category
  TList    _pdfProxyList ;     // List of PDF proxies (named after applicable category state)
  Int_t    _numPdf ;           // Number of registered PDFs

  ClassDef(RooSimultaneous,2)  // Simultaneous operator p.d.f, functions like C++  'switch()' on input p.d.fs operating on index category5A
};

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