58 ClassImp(RooLinearVar);
64 RooLinearVar::RooLinearVar(
const char *name,
const char *title, RooAbsRealLValue& variable,
65 const RooAbsReal& slope,
const RooAbsReal& offs,
const char *unit) :
66 RooAbsRealLValue(name, title, unit),
67 _binning(variable.getBinning(),slope.getVal(),offs.getVal()),
68 _var(
"var",
"variable",this,variable,kTRUE,kTRUE),
69 _slope(
"slope",
"slope",this,(RooAbsReal&)slope),
70 _offset(
"offset",
"offset",this,(RooAbsReal&)offs)
73 if (slope.dependsOnValue(variable) || offs.dependsOnValue(variable)) {
74 coutE(InputArguments) <<
"RooLinearVar::RooLinearVar(" << GetName()
75 <<
"): ERROR, slope(" << slope.GetName() <<
") and offset("
76 << offs.GetName() <<
") may not depend on variable("
77 << variable.GetName() <<
")" << endl ;
93 RooLinearVar::RooLinearVar(
const RooLinearVar& other,
const char* name) :
94 RooAbsRealLValue(other,name),
95 _binning(other._binning),
96 _var(
"var",this,other._var),
97 _slope(
"slope",this,other._slope),
98 _offset(
"offset",this,other._offset)
107 RooLinearVar::~RooLinearVar()
109 _altBinning.Delete() ;
117 Double_t RooLinearVar::evaluate()
const
119 return _offset + _var * _slope ;
128 void RooLinearVar::setVal(Double_t value)
134 coutE(Eval) <<
"RooLinearVar::setVal(" << GetName() <<
"): ERROR: slope is zero, cannot invert relation" << endl ;
139 ((RooRealVar&)_var.arg()).setVal((value - _offset) / _slope) ;
149 Bool_t RooLinearVar::isJacobianOK(
const RooArgSet& depList)
const
151 if (!((RooAbsRealLValue&)_var.arg()).isJacobianOK(depList)) {
157 TIterator* dIter = depList.createIterator() ;
158 while ((arg=(RooAbsArg*)dIter->Next())) {
159 if (arg->IsA()->InheritsFrom(RooAbsReal::Class())) {
160 if (_slope.arg().dependsOnValue(*arg)) {
176 Double_t RooLinearVar::jacobian()
const
178 return _slope*((RooAbsRealLValue&)_var.arg()).jacobian() ;
186 Bool_t RooLinearVar::readFromStream(istream& , Bool_t , Bool_t )
196 void RooLinearVar::writeToStream(ostream& os, Bool_t compact)
const
201 os << _slope.arg().GetName() <<
" * " << _var.arg().GetName() <<
" + " << _offset.arg().GetName() ;
213 RooAbsBinning& RooLinearVar::getBinning(
const char* name, Bool_t verbose, Bool_t createOnTheFly)
217 _binning.updateInput(((RooAbsRealLValue&)_var.arg()).getBinning(),_slope,_offset) ;
222 RooLinTransBinning* altBinning = (RooLinTransBinning*) _altBinning.FindObject(name) ;
224 altBinning->updateInput(((RooAbsRealLValue&)_var.arg()).getBinning(name,verbose),_slope,_offset) ;
229 if (!_var.arg().hasRange(name) && !createOnTheFly) {
234 RooAbsBinning& sourceBinning = ((RooAbsRealLValue&)_var.arg()).getBinning(name,verbose) ;
235 RooLinTransBinning* transBinning =
new RooLinTransBinning(sourceBinning,_slope,_offset) ;
236 _altBinning.Add(transBinning) ;
238 return *transBinning ;
245 const RooAbsBinning& RooLinearVar::getBinning(
const char* name, Bool_t verbose, Bool_t createOnTheFly)
const
247 return const_cast<RooLinearVar*
>(
this)->getBinning(name,verbose,createOnTheFly) ;
254 std::list<std::string> RooLinearVar::getBinningNames()
const
256 std::list<std::string> binningNames(1,
"");
258 RooFIter iter = _altBinning.fwdIterator();
259 const RooAbsArg* binning = 0;
260 while((binning = iter.next())) {
261 const char* name = binning->GetName();
262 binningNames.push_back(name);
273 Bool_t RooLinearVar::hasBinning(
const char* name)
const
275 return ((RooAbsRealLValue&)_var.arg()).hasBinning(name) ;