Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
RooRealConstant.cxx
Go to the documentation of this file.
1 /*****************************************************************************
2  * Project: RooFit *
3  * Package: RooFitCore *
4  * @(#)root/roofitcore:$Id$
5  * Authors: *
6  * WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu *
7  * DK, David Kirkby, UC Irvine, dkirkby@uci.edu *
8  * *
9  * Copyright (c) 2000-2005, Regents of the University of California *
10  * and Stanford University. All rights reserved. *
11  * *
12  * Redistribution and use in source and binary forms, *
13  * with or without modification, are permitted according to the terms *
14  * listed in LICENSE (http://roofit.sourceforge.net/license.txt) *
15  *****************************************************************************/
16 
17 /**
18 \file RooRealConstant.cxx
19 \class RooRealConstant
20 \ingroup Roofitcore
21 
22 RooRealConstant provides static functions to create and keep track
23 of RooRealVar constants. Instead of creating such constants by
24 hand (e.g. RooRealVar one("one","one",1)), simply use
25 ~~~{.cpp}
26  RooRealConstant::value(1.0)
27 ~~~
28 whenever a reference to RooRealVar with constant value 1.0 is needed.
29 RooRealConstant keeps an internal database of previously created
30 RooRealVar objects and will recycle them as appropriate.
31 **/
32 
33 #include "RooFit.h"
34 
35 #include <math.h>
36 #include <sstream>
37 #include "RooRealConstant.h"
38 #include "RooRealConstant.h"
39 #include "RooConstVar.h"
40 #include "RooArgList.h"
41 
42 using namespace std;
43 
44 ClassImp(RooRealConstant);
45 
46 
47 
48 ////////////////////////////////////////////////////////////////////////////////
49 /// Return a constant value object with given value.
50 /// Return previously created object if available,
51 /// otherwise create a new one on the fly.
52 
53 RooConstVar& RooRealConstant::value(Double_t value)
54 {
55  // Lookup existing constant
56  for (auto varArg : constDB()) {
57  auto var = static_cast<RooConstVar*>(varArg);
58  if ((var->getVal()==value) && (!var->getAttribute("REMOVAL_DUMMY"))) return *var ;
59  }
60 
61  // Create new constant
62  std::ostringstream s ;
63  s << value ;
64 
65  auto var = new RooConstVar(s.str().c_str(),s.str().c_str(),value) ;
66  var->setAttribute("RooRealConstant_Factory_Object",kTRUE) ;
67  constDB().addOwned(*var) ;
68 
69  return *var ;
70 }
71 
72 
73 ////////////////////////////////////////////////////////////////////////////////
74 /// Create a dummy node used in node-removal operations
75 
76 RooConstVar& RooRealConstant::removalDummy()
77 {
78  RooConstVar* var = new RooConstVar("REMOVAL_DUMMY","REMOVAL_DUMMY",1) ;
79  var->setAttribute("RooRealConstant_Factory_Object",kTRUE) ;
80  var->setAttribute("REMOVAL_DUMMY") ;
81  constDB().addOwned(*var) ;
82 
83  return *var ;
84 }
85 
86 
87 
88 ////////////////////////////////////////////////////////////////////////////////
89 /// One-time initialization of constants database
90 
91 RooArgList& RooRealConstant::constDB()
92 {
93  static RooArgList constDB("RooRealVar Constants Database");
94  return constDB;
95 }