16 #ifndef ROO_LIN_TRANS_BINNING
17 #define ROO_LIN_TRANS_BINNING
22 class RooLinTransBinning :
public RooAbsBinning {
25 RooLinTransBinning(
const char* name=0) : RooAbsBinning(name) { }
26 RooLinTransBinning(
const RooAbsBinning& input, Double_t slope=1.0, Double_t offset=0.0,
const char* name=0);
27 RooLinTransBinning(
const RooLinTransBinning&,
const char* name=0);
28 virtual RooAbsBinning* clone(
const char* name=0)
const {
return new RooLinTransBinning(*
this,name) ; }
29 virtual ~RooLinTransBinning() ;
31 virtual Int_t numBoundaries()
const {
return _input->numBoundaries() ; }
32 virtual Int_t binNumber(Double_t x)
const {
return _input->binNumber(invTrans(x)) ; }
33 virtual Double_t binCenter(Int_t bin)
const {
return trans(_input->binCenter(binTrans(bin))) ; }
34 virtual Double_t binWidth(Int_t bin)
const {
return _slope*_input->binWidth(binTrans(bin)) ; }
35 virtual Double_t binLow(Int_t bin)
const {
if (_slope>0)
return trans(_input->binLow(binTrans(bin))) ;
else return trans(_input->binHigh(binTrans(bin))) ; }
36 virtual Double_t binHigh(Int_t bin)
const {
if (_slope>0)
return trans(_input->binHigh(binTrans(bin))) ;
else return trans(_input->binLow(binTrans(bin))) ; }
38 virtual void setRange(Double_t xlo, Double_t xhi) ;
39 virtual void setMin(Double_t xlo) { setRange(xlo,highBound()) ; }
40 virtual void setMax(Double_t xhi) { setRange(lowBound(),xhi) ; }
42 virtual Double_t lowBound()
const {
if (_slope>0)
return trans(_input->lowBound()) ;
else return trans(_input->highBound()) ; }
43 virtual Double_t highBound()
const {
if (_slope>0)
return trans(_input->highBound()) ;
else return trans(_input->lowBound()) ; }
44 virtual Double_t averageBinWidth()
const {
return _slope*_input->averageBinWidth() ; }
46 virtual Double_t* array()
const ;
48 void updateInput(
const RooAbsBinning& input, Double_t slope=1.0, Double_t offset=0.0) ;
52 inline Int_t binTrans(Int_t bin)
const {
if (_slope>0)
return bin ;
else return numBins()-bin-1 ; }
53 inline Double_t trans(Double_t x)
const {
return x*_slope + _offset ; }
54 inline Double_t invTrans(Double_t x)
const {
if (_slope==0.)
return 0 ;
return (x-_offset)/_slope ; }
58 RooAbsBinning* _input{
nullptr};
59 mutable Double_t *_array{
nullptr};
61 ClassDef(RooLinTransBinning,1)