Logo ROOT   6.07/09
Reference Guide
RooAbsString.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 RooAbsString.cxx
19 \class RooAbsString
20 \ingroup Roofitcore
21 
22 RooAbsString is the common abstract base class for objects that represent a
23 string value
24 
25 Implementation of RooAbsString may be derived, there no interface
26 is provided to modify the contents
27 **/
28 //
29 
30 #include "RooFit.h"
31 
32 #include "Riostream.h"
33 #include "Riostream.h"
34 #include "TObjString.h"
35 #include "TH1.h"
36 #include "TTree.h"
37 
38 #include "RooArgSet.h"
39 #include "RooAbsString.h"
40 #include "RooStringVar.h"
41 #include "RooMsgService.h"
42 
43 using namespace std;
44 
46 ;
47 
48 
49 ////////////////////////////////////////////////////////////////////////////////
50 /// Default constructor
51 
52 RooAbsString::RooAbsString() : RooAbsArg(), _len(128) , _value(new char[128])
53 {
54 }
55 
56 
57 ////////////////////////////////////////////////////////////////////////////////
58 /// Constructor
59 
60 RooAbsString::RooAbsString(const char *name, const char *title, Int_t bufLen) :
61  RooAbsArg(name,title), _len(bufLen), _value(new char[bufLen])
62 {
63  setValueDirty() ;
64  setShapeDirty() ;
65 }
66 
67 
68 
69 ////////////////////////////////////////////////////////////////////////////////
70 /// Copy constructor
71 
72 RooAbsString::RooAbsString(const RooAbsString& other, const char* name) :
73  RooAbsArg(other, name), _len(other._len), _value(new char[other._len])
74 {
75  strlcpy(_value,other._value,_len) ;
76 }
77 
78 
79 
80 ////////////////////////////////////////////////////////////////////////////////
81 /// Destructor
82 
84 {
85  delete[] _value ;
86 }
87 
88 
89 
90 ////////////////////////////////////////////////////////////////////////////////
91 /// Return value of object. Calculated if dirty, otherwise cached value is returned.
92 
93 const char* RooAbsString::getVal() const
94 {
95  if (isValueDirty()) {
96  clearValueDirty() ;
97  strlcpy(_value,traceEval(),_len) ;
98  }
99 
100  return _value ;
101 }
102 
103 
104 
105 ////////////////////////////////////////////////////////////////////////////////
106 /// Equality operator comparing with a TString
107 
108 Bool_t RooAbsString::operator==(const char* value) const
109 {
110  return !TString(getVal()).CompareTo(value) ;
111 }
112 
113 
114 ////////////////////////////////////////////////////////////////////////////////
115 
116 Bool_t RooAbsString::isIdentical(const RooAbsArg& other, Bool_t assumeSameType)
117 {
118  if (!assumeSameType) {
119  const RooAbsString* otherString = dynamic_cast<const RooAbsString*>(&other) ;
120  return otherString ? operator==(otherString->getVal()) : kFALSE ;
121  } else {
122  return !TString(getVal()).CompareTo(((RooAbsString&)other).getVal()) ; ;
123  }
124 }
125 
126 
127 
128 ////////////////////////////////////////////////////////////////////////////////
129 /// Equality operator comparing to another RooAbsArg
130 
132 {
133  const RooAbsString* otherString = dynamic_cast<const RooAbsString*>(&other) ;
134  return otherString ? operator==(otherString->getVal()) : kFALSE ;
135 }
136 
137 
138 
139 ////////////////////////////////////////////////////////////////////////////////
140 ///Read object contents from stream (dummy for now)
141 
142 Bool_t RooAbsString::readFromStream(istream& /*is*/, Bool_t /*compact*/, Bool_t /*verbose*/)
143 {
144  return kFALSE ;
145 }
146 
147 
148 
149 ////////////////////////////////////////////////////////////////////////////////
150 ///Write object contents to stream (dummy for now)
151 
152 void RooAbsString::writeToStream(ostream& /*os*/, Bool_t /*compact*/) const
153 {
154 }
155 
156 
157 
158 ////////////////////////////////////////////////////////////////////////////////
159 /// Print value
160 
161 void RooAbsString::printValue(ostream& os) const
162 {
163  os << getVal() ;
164 }
165 
166 
167 
168 ////////////////////////////////////////////////////////////////////////////////
169 /// Check if current value is valid
170 
172 {
173  return isValidString(getVal()) ;
174 }
175 
176 
177 
178 ////////////////////////////////////////////////////////////////////////////////
179 /// Check if given string value is valid
180 
181 Bool_t RooAbsString::isValidString(const char* value, Bool_t /*printError*/) const
182 {
183  // Protect against string overflows
184  if (TString(value).Length()>_len) return kFALSE ;
185 
186  return kTRUE ;
187 }
188 
189 
190 ////////////////////////////////////////////////////////////////////////////////
191 /// Hook function for trace evaluation
192 
193 Bool_t RooAbsString::traceEvalHook(const char* /*value*/) const
194 {
195  return kFALSE ;
196 }
197 
198 
199 
200 ////////////////////////////////////////////////////////////////////////////////
201 /// Calculate current value of object, with error tracing wrapper
202 
204 {
205  TString value = evaluate() ;
206 
207  //Standard tracing code goes here
208  if (!isValidString(value)) {
209  cxcoutD(Tracing) << "RooAbsString::traceEval(" << GetName() << "): new output too long (>" << _len << " chars): " << value << endl ;
210  }
211 
212  //Call optional subclass tracing code
213  traceEvalHook(value) ;
214 
215  return value ;
216 }
217 
218 
219 
220 ////////////////////////////////////////////////////////////////////////////////
221 /// Forcibly bring internal cache up-to-date
222 
224 {
225  getVal() ;
226 }
227 
228 
229 
230 ////////////////////////////////////////////////////////////////////////////////
231 /// Copy cache of another RooAbsArg to our cache
232 ///
233 /// Warning: This function copies the cached values of source,
234 /// it is the callers responsibility to make sure the cache is clean
235 
236 void RooAbsString::copyCache(const RooAbsArg* source, Bool_t /*valueOnly*/, Bool_t setValDirty)
237 {
238  RooAbsString* other = dynamic_cast<RooAbsString*>(const_cast<RooAbsArg*>(source)) ;
239  assert(other!=0) ;
240 
241  strlcpy(_value,other->_value,_len) ;
242  if (setValDirty) {
243  setValueDirty() ;
244  }
245 }
246 
247 
248 
249 ////////////////////////////////////////////////////////////////////////////////
250 /// Attach object to a branch of given TTree
251 
253 {
254  // First determine if branch is taken
255  TBranch* branch ;
256  if ((branch = t.GetBranch(GetName()))) {
258  if (branch->GetCompressionLevel()<0) {
259  cxcoutD(DataHandling) << "RooAbsString::attachToTree(" << GetName() << ") Fixing compression level of branch " << GetName() << endl ;
260  branch->SetCompressionLevel(1) ;
261  }
262  } else {
264  format.Append("/C");
265  branch = t.Branch(GetName(), _value, (const Text_t*)format, bufSize);
266  branch->SetCompressionLevel(1) ;
267  }
268 }
269 
270 
271 
272 ////////////////////////////////////////////////////////////////////////////////
273 /// Fill tree branch associated with this object
274 
276 {
277  // First determine if branch is taken
278  TBranch* branch = t.GetBranch(GetName()) ;
279  if (!branch) {
280  coutE(DataHandling) << "RooAbsString::fillTreeBranch(" << GetName() << ") ERROR: not attached to tree" << endl ;
281  assert(0) ;
282  }
283  branch->Fill() ;
284 }
285 
286 
287 
288 ////////////////////////////////////////////////////////////////////////////////
289 /// (De)Activate associated tree branch
290 
292 {
293  TBranch* branch = t.GetBranch(GetName()) ;
294  if (branch) {
295  t.SetBranchStatus(GetName(),active?1:0) ;
296  }
297 }
298 
299 
300 
301 ////////////////////////////////////////////////////////////////////////////////
302 /// Create a RooStringVar fundamental object with our properties.
303 
304 RooAbsArg *RooAbsString::createFundamental(const char* newname) const
305 {
306  RooStringVar *fund= new RooStringVar(newname?newname:GetName(),GetTitle(),"") ;
307  return fund;
308 }
virtual const char * GetTitle() const
Returns title of object.
Definition: TNamed.h:52
#define coutE(a)
Definition: RooMsgService.h:35
void setShapeDirty() const
Definition: RooAbsArg.h:440
virtual Bool_t isValidString(const char *, Bool_t printError=kFALSE) const
Check if given string value is valid.
virtual void SetBranchStatus(const char *bname, Bool_t status=1, UInt_t *found=0)
Set branch status to Process or DoNotProcess.
Definition: TTree.cxx:7865
virtual void setTreeBranchStatus(TTree &t, Bool_t active)
(De)Activate associated tree branch
#define cxcoutD(a)
Definition: RooMsgService.h:80
virtual TString evaluate() const
Definition: RooAbsString.h:55
void SetCompressionLevel(Int_t level=1)
Set compression level.
Definition: TBranch.cxx:2169
Basic string class.
Definition: TString.h:137
virtual Bool_t readFromStream(std::istream &is, Bool_t compact, Bool_t verbose=kFALSE)
Read object contents from stream (dummy for now)
int Int_t
Definition: RtypesCore.h:41
bool Bool_t
Definition: RtypesCore.h:59
const Bool_t kFALSE
Definition: Rtypes.h:92
STL namespace.
static std::string format(double x, double y, int digits, int width)
void copyCache(const RooAbsArg *source, Bool_t valueOnly=kFALSE, Bool_t setValDiry=kTRUE)
Copy cache of another RooAbsArg to our cache.
virtual Int_t SetBranchAddress(const char *bname, void *add, TBranch **ptr=0)
Change branch address, dealing with clone trees properly.
Definition: TTree.cxx:7719
virtual Bool_t isIdentical(const RooAbsArg &other, Bool_t assumeSameType=kFALSE)
RooAbsArg * createFundamental(const char *newname=0) const
Create a RooStringVar fundamental object with our properties.
TString & Append(const char *cs)
Definition: TString.h:492
virtual TBranch * GetBranch(const char *name)
Return pointer to the branch with the given name in this tree or its friends.
Definition: TTree.cxx:4868
virtual Int_t Fill()
Loop on all leaves of this branch to fill Basket buffer.
Definition: TBranch.cxx:737
virtual void fillTreeBranch(TTree &t)
Fill tree branch associated with this object.
virtual void attachToTree(TTree &t, Int_t bufSize=32000)
Attach object to a branch of given TTree.
Bool_t operator==(const char *) const
Equality operator comparing with a TString.
char * _value
Definition: RooAbsString.h:68
virtual void syncCache(const RooArgSet *nset=0)
Forcibly bring internal cache up-to-date.
virtual const char * GetName() const
Returns name of object.
Definition: TNamed.h:51
RooAbsString()
Default constructor.
#define ClassImp(name)
Definition: Rtypes.h:279
virtual ~RooAbsString()
Destructor.
virtual Bool_t isValid() const
Check if current value is valid.
void setValueDirty() const
Definition: RooAbsArg.h:439
virtual void writeToStream(std::ostream &os, Bool_t compact) const
Write object contents to stream (dummy for now)
TString traceEval() const
Calculate current value of object, with error tracing wrapper.
RooAbsString is the common abstract base class for objects that represent a string value...
Definition: RooAbsString.h:25
virtual Int_t Branch(TCollection *list, Int_t bufsize=32000, Int_t splitlevel=99, const char *name="")
Create one branch for each element in the collection.
Definition: TTree.cxx:1651
virtual Bool_t traceEvalHook(const char *value) const
Hook function for trace evaluation.
virtual const char * getVal() const
Return value of object. Calculated if dirty, otherwise cached value is returned.
Bool_t isValueDirty() const
Definition: RooAbsArg.h:336
char Text_t
Definition: RtypesCore.h:58
A TTree object has a header with a name and a title.
Definition: TTree.h:98
void clearValueDirty() const
Definition: RooAbsArg.h:447
RooAbsArg is the common abstract base class for objects that represent a value (of arbitrary type) an...
Definition: RooAbsArg.h:66
A TTree is a list of TBranches.
Definition: TBranch.h:58
const Bool_t kTRUE
Definition: Rtypes.h:91
RooStringVar implements a string values RooAbsArg.
Definition: RooStringVar.h:24
Int_t GetCompressionLevel() const
Definition: TBranch.h:234
virtual void printValue(std::ostream &os) const
Print value.
char name[80]
Definition: TGX11.cxx:109
int CompareTo(const char *cs, ECaseCompare cmp=kExact) const
Compare a string to char *cs2.
Definition: TString.cxx:386