/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitModels                                                     *
 *    File: $Id: RooNonCPEigenDecay.h,v 1.13 2007/05/11 09:13:07 verkerke Exp $
 * Authors:                                                                  *
 *   AH, Andreas Hoecker,  Orsay,            hoecker@slac.stanford.edu       *
 *   SL, Sandrine Laplace, Orsay,            laplace@slac.stanford.edu       *
 *   JS, Jan Stark,        Paris,            stark@slac.stanford.edu         *
 *   WV, Wouter Verkerke,  UC Santa Barbara, verkerke@slac.stanford.edu      *
 *                                                                           *                  
 * Copyright (c) 2000-2005, Regents of the University of California,         *
 *                          IN2P3. All rights reserved.                      *
 *                                                                           *
 * History                                                                   *
 *   Nov-2001   WV Created initial version                                   *
 *   Dec-2001   SL mischarge correction, direct CPV                          *
 *   Jan-2002   AH built dedicated generator + code cleaning                 *
 *   Mar-2002   JS committed debugged version to CVS                         *
 *   Apr-2002   AH allow prompt (ie, non-Pdf) mischarge treatment            *
 *   May-2002   JS Changed the set of CP parameters (mathematically equiv.)  *
 *                                                                           *
 * 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_NONCPEIGEN_DECAY
#define ROO_NONCPEIGEN_DECAY

#include "RooAbsAnaConvPdf.h"
#include "RooRealProxy.h"
#include "RooCategoryProxy.h"

class RooNonCPEigenDecay : public RooAbsAnaConvPdf {

public:

  enum DecayType { SingleSided, DoubleSided, Flipped };

  // Constructors, assignment etc
  inline RooNonCPEigenDecay( void ) { }

  // with explicit mischarge
  RooNonCPEigenDecay( const char *name, const char *title, 
		      RooRealVar&     t, 
	              RooAbsCategory& tag,
		      RooAbsReal&     tau, 
		      RooAbsReal&     dm,
		      RooAbsReal&     avgW, 
		      RooAbsReal&     delW, 
		      RooAbsCategory& rhoQ, 
		      RooAbsReal&     correctQ, 
		      RooAbsReal&     wQ,
		      RooAbsReal&     a,
		      RooAbsReal&     C,
		      RooAbsReal&     delC,
		      RooAbsReal&     S,
		      RooAbsReal&     delS,
		      const RooResolutionModel& model, 
		      DecayType       type = DoubleSided );

  // no explicit mischarge (=> set to zero)
  RooNonCPEigenDecay( const char *name, const char *title, 
		      RooRealVar&     t, 
	              RooAbsCategory& tag,
		      RooAbsReal&     tau, 
		      RooAbsReal&     dm,
		      RooAbsReal&     avgW, 
		      RooAbsReal&     delW, 
		      RooAbsCategory& rhoQ, 
		      RooAbsReal&     correctQ, 
		      RooAbsReal&     a,
		      RooAbsReal&     C,
		      RooAbsReal&     delC,
		      RooAbsReal&     S,
		      RooAbsReal&     delS,
		      const RooResolutionModel& model, 
		      DecayType       type = DoubleSided );

  RooNonCPEigenDecay(const RooNonCPEigenDecay& other, const char* name=0);
  virtual TObject* clone(const char* newname) const { 
    return new RooNonCPEigenDecay(*this,newname); 
  }
  virtual ~RooNonCPEigenDecay( void );

  virtual Double_t coefficient( Int_t basisIndex ) const;

  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;

  Int_t getGenerator( const RooArgSet& directVars, 
		      RooArgSet&       generateVars, Bool_t staticInitOK=kTRUE ) const;
  void initGenerator( Int_t code );
  void generateEvent( Int_t code );

protected:

  RooRealProxy     _acp ;
  RooRealProxy     _avgC ;
  RooRealProxy     _delC ;
  RooRealProxy     _avgS ;
  RooRealProxy     _delS ;
  RooRealProxy     _avgW ;
  RooRealProxy     _delW ;
  RooRealProxy     _t ;
  RooRealProxy     _tau;
  RooRealProxy     _dm;
  RooCategoryProxy _tag;
  RooCategoryProxy _rhoQ;
  RooRealProxy     _correctQ;
  RooRealProxy     _wQ;
  Double_t         _genB0Frac;
  Double_t         _genRhoPlusFrac;
  
  DecayType        _type;
  Int_t            _basisExp;
  Int_t            _basisSin;
  Int_t            _basisCos;

  ClassDef(RooNonCPEigenDecay,1) // PDF to model CP-violating decays to final states which are not CP eigenstates
};

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