/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 *    File: $Id: RooAbsAnaConvPdf.h,v 1.8 2007/07/16 21:04:28 wouter 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_ABS_ANA_CONV_PDF
#define ROO_ABS_ANA_CONV_PDF


class TIterator  ;
#include "RooAbsPdf.h"
#include "RooRealProxy.h"
#include "RooListProxy.h"
#include "RooDataSet.h"
#include "RooAICRegistry.h"
#include "RooObjCacheManager.h"
#include "RooAbsCacheElement.h"

class RooResolutionModel ;
class RooRealVar ;
class RooAbsGenContext ;
class RooConvGenContext ;

class RooAbsAnaConvPdf : public RooAbsPdf {
public:

  // Constructors, assignment etc
  RooAbsAnaConvPdf() ;
  RooAbsAnaConvPdf(const char *name, const char *title, 
		   const RooResolutionModel& model, 
		   RooRealVar& convVar) ;

  RooAbsAnaConvPdf(const RooAbsAnaConvPdf& other, const char* name=0);
  virtual ~RooAbsAnaConvPdf();

  Int_t declareBasis(const char* expression, const RooArgList& params) ;
  virtual void printMultiline(std::ostream& stream, Int_t contents, Bool_t verbose=kFALSE, TString indent= "") const ;

  // Coefficient normalization access
  inline Double_t getCoefNorm(Int_t coefIdx, const RooArgSet& nset, const char* rangeName) const { 
    // Returns normalization integral for coefficient coefIdx for observables nset in range rangeNae
    return getCoefNorm(coefIdx,&nset,rangeName) ; 
  }
  Double_t getCoefNorm(Int_t coefIdx, const RooArgSet* nset=0, const char* rangeName=0) const {
       return getCoefNorm(coefIdx,nset,RooNameReg::ptr(rangeName));
  }

  // Analytical integration support
  virtual Int_t getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& analVars, const RooArgSet* normSet, const char* rangeName=0) const ;
  virtual Double_t analyticalIntegralWN(Int_t code, const RooArgSet* normSet, const char* rangeName=0) const ;
  
  // Coefficient Analytical integration support
  virtual Int_t getCoefAnalyticalIntegral(Int_t coef, RooArgSet& allVars, RooArgSet& analVars, const char* rangeName=0) const ;
  virtual Double_t coefAnalyticalIntegral(Int_t coef, Int_t code, const char* rangeName=0) const ;
  virtual Bool_t forceAnalyticalInt(const RooAbsArg& dep) const ; 
  
  virtual Double_t coefficient(Int_t basisIndex) const = 0 ;
  virtual RooArgSet* coefVars(Int_t coefIdx) const ;

  virtual Bool_t isDirectGenSafe(const RooAbsArg& arg) const ;
    
protected:
  Double_t getCoefNorm(Int_t coefIdx, const RooArgSet* nset, const TNamed* rangeName) const ;

  Bool_t _isCopy ;

  virtual Double_t evaluate() const ;

  void makeCoefVarList(RooArgList&) const ;

  friend class RooConvGenContext ;
  Bool_t changeModel(const RooResolutionModel& newModel) ;
  virtual RooAbsGenContext* genContext(const RooArgSet &vars, const RooDataSet *prototype=0, 
                                       const RooArgSet* auxProto=0, Bool_t verbose= kFALSE) const ;

  RooRealProxy _model ; // Original model
  RooRealProxy _convVar ; // Convolution variable

  RooArgSet* parseIntegrationRequest(const RooArgSet& intSet, Int_t& coefCode, RooArgSet* analVars=0) const ;

  const RooRealVar* convVar() const ;  //  Convolution variable 

  RooListProxy _convSet  ;             //  Set of (resModel (x) basisFunc) convolution objects
  RooArgList _basisList ;              //!  List of created basis functions
  mutable RooArgSet* _convNormSet ;    //!  Subset of last normalization that applies to convolutions
  mutable TIterator* _convSetIter ;    //! Iterator over _convNormSet


  class CacheElem : public RooAbsCacheElement {
  public:
    virtual ~CacheElem() {} ;

    RooArgList containedArgs(Action) { 
      RooArgList l(_coefVarList) ; 
      l.add(_normList) ; 
      return l ; 
    }

    RooArgList _coefVarList ;
    RooArgList _normList ;
  } ;
  mutable RooObjCacheManager _coefNormMgr ; // Coefficient normalization manager

  mutable RooAICRegistry _codeReg ;   //! Registry of analytical integration codes

  ClassDef(RooAbsAnaConvPdf,2) // Abstract Composite Convoluted PDF
};

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