#include "RooFit.h"
#include <math.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "TObjString.h"
#include "TTree.h"
#include "RooLinearVar.h"
#include "RooStreamParser.h"
#include "RooArgSet.h"
#include "RooRealVar.h"
#include "RooNumber.h"
#include "RooBinning.h"
ClassImp(RooLinearVar)
RooLinearVar::RooLinearVar(const char *name, const char *title, RooAbsRealLValue& variable,
const RooAbsReal& slope, const RooAbsReal& offset, const char *unit) :
RooAbsRealLValue(name, title, unit),
_binning(variable.getBinning(),slope.getVal(),offset.getVal()),
_var("var","variable",this,variable,kTRUE,kTRUE),
_slope("slope","slope",this,(RooAbsReal&)slope),
_offset("offset","offset",this,(RooAbsReal&)offset)
{
if (slope.dependsOn(variable) || offset.dependsOn(variable)) {
cout << "RooLinearVar::RooLinearVar(" << GetName()
<< "): ERROR, slope(" << slope.GetName() << ") and offset("
<< offset.GetName() << ") may not depend on variable("
<< variable.GetName() << ")" << endl ;
assert(0) ;
}
}
RooLinearVar::RooLinearVar(const RooLinearVar& other, const char* name) :
RooAbsRealLValue(other,name),
_binning(other._binning),
_var("var",this,other._var),
_slope("slope",this,other._slope),
_offset("offset",this,other._offset)
{
}
RooLinearVar::~RooLinearVar()
{
_altBinning.Delete() ;
}
Double_t RooLinearVar::evaluate() const
{
return _offset + _var * _slope ;
}
void RooLinearVar::setVal(Double_t value)
{
if (_slope == 0.) {
cout << "RooLinearVar::setVal(" << GetName() << "): ERROR: slope is zero, cannot invert relation" << endl ;
return ;
}
((RooRealVar&)_var.arg()).setVal((value - _offset) / _slope) ;
}
Bool_t RooLinearVar::isJacobianOK(const RooArgSet& depList) const
{
if (!((RooAbsRealLValue&)_var.arg()).isJacobianOK(depList)) {
return kFALSE ;
}
RooAbsArg* arg ;
TIterator* dIter = depList.createIterator() ;
while ((arg=(RooAbsArg*)dIter->Next())) {
if (arg->IsA()->InheritsFrom(RooAbsReal::Class())) {
if (_slope.arg().dependsOn(*arg)) {
return kFALSE ;
}
}
}
return kTRUE ;
}
Double_t RooLinearVar::jacobian() const
{
return _slope*((RooAbsRealLValue&)_var.arg()).jacobian() ;
}
Bool_t RooLinearVar::readFromStream(istream& , Bool_t , Bool_t )
{
return kTRUE ;
}
void RooLinearVar::writeToStream(ostream& os, Bool_t compact) const
{
if (compact) {
os << getVal() ;
} else {
os << _slope.arg().GetName() << " * " << _var.arg().GetName() << " + " << _offset.arg().GetName() ;
}
}
void RooLinearVar::printToStream(ostream& os, PrintOption opt, TString indent) const {
RooAbsReal::printToStream(os,opt,indent);
if(opt >= Verbose) {
os << indent << "--- RooLinearVar ---" << endl;
}
}
RooAbsBinning& RooLinearVar::getBinning(const char* name, Bool_t verbose, Bool_t createOnTheFly)
{
if (name==0) {
_binning.updateInput(((RooAbsRealLValue&)_var.arg()).getBinning(),_slope,_offset) ;
return _binning ;
}
RooLinTransBinning* altBinning = (RooLinTransBinning*) _altBinning.FindObject(name) ;
if (altBinning) {
altBinning->updateInput(((RooAbsRealLValue&)_var.arg()).getBinning(name,verbose),_slope,_offset) ;
return *altBinning ;
}
if (!createOnTheFly) {
return _binning ;
}
RooAbsBinning& sourceBinning = ((RooAbsRealLValue&)_var.arg()).getBinning(name,verbose) ;
RooLinTransBinning* transBinning = new RooLinTransBinning(sourceBinning,_slope,_offset) ;
_altBinning.Add(transBinning) ;
return *transBinning ;
}
const RooAbsBinning& RooLinearVar::getBinning(const char* name, Bool_t verbose, Bool_t createOnTheFly) const
{
return const_cast<RooLinearVar*>(this)->getBinning(name,verbose,createOnTheFly) ;
}
Bool_t RooLinearVar::hasBinning(const char* name) const
{
return ((RooAbsRealLValue&)_var.arg()).hasBinning(name) ;
}
ROOT page - Class index - Class Hierarchy - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.