Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
RooFactoryWSTool.h
Go to the documentation of this file.
1 /*****************************************************************************
2  * Project: RooFit *
3  * Package: RooFitCore *
4  * File: $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 #ifndef ROO_FACTORY_WS_TOOL
18 #define ROO_FACTORY_WS_TOOL
19 
20 #include "RooArgSet.h"
21 #include "RooArgList.h"
22 #include <string>
23 #include <list>
24 #include <vector>
25 #include <stack>
26 
27 class RooAbsReal ;
28 class RooAbsRealLValue ;
29 class RooAbsPdf ;
30 class RooWorkspace ;
31 class RooRealVar ;
32 class RooCategory ;
33 class RooAddPdf ;
34 class RooProdPdf ;
35 class RooSimultaneous ;
36 class RooDataHist ;
37 class RooDataSet ;
38 class RooAbsData ;
39 class RooFactoryWSToolSpec ;
40 class RooAbsCategoryLValue ;
41 class RooAbsCategory ;
42 class RooResolutionModel ;
43 class RooAddition ;
44 class RooProduct ;
45 class RooRealSumPdf ;
46 
47 class RooFactoryWSTool : public TNamed, public RooPrintable {
48 
49 public:
50 
51  // Constructors, assignment etc
52  RooFactoryWSTool(RooWorkspace& ws) ;
53  virtual ~RooFactoryWSTool() ;
54 
55  // --- low level factory interface ---
56 
57  // Create variables
58  RooRealVar* createVariable(const char* name, Double_t xmin, Double_t xmax) ;
59  RooCategory* createCategory(const char* name, const char* stateNameList=0) ;
60 
61  // Create functions and p.d.f.s (any RooAbsArg)
62  RooAbsArg* createArg(const char* className, const char* objName, const char* varList) ;
63 
64  // Create operator p.d.f.s
65  RooAddPdf* add(const char *objName, const char* specList, Bool_t recursiveCoefs=kFALSE) ;
66  RooRealSumPdf* amplAdd(const char *objName, const char* specList) ;
67  RooProdPdf* prod(const char *objName, const char* pdfList) ;
68  RooSimultaneous* simul(const char* objName, const char* indexCat, const char* pdfMap) ;
69 
70  // Create operator functions
71  RooAddition* addfunc(const char *objName, const char* specList) ;
72  RooProduct* prodfunc(const char *objName, const char* pdfList) ;
73 
74  RooWorkspace& ws() { return *_ws ; }
75 
76  // --- High level factory interface ---
77 
78  // Composite object construction language parser
79  RooAbsArg* process(const char* expr) ;
80  std::string processExpression(const char* expr) ;
81  std::vector<std::string> splitFunctionArgs(const char* funcExpr) ;
82 
83 
84  // --- Internal stuff that must be public so that CINT can access it ---
85 
86  // CINT constructor interface
87  static RooAbsArg& as_ARG(UInt_t idx) { checkIndex(idx) ; return of()->of()->asARG(of()->_args[idx].c_str()) ; }
88 
89  static RooAbsPdf& as_PDF(UInt_t idx) { checkIndex(idx) ; return of()->asPDF(of()->_args[idx].c_str()) ; }
90  static RooAbsReal& as_FUNC(UInt_t idx) { checkIndex(idx) ; return of()->asFUNC(of()->_args[idx].c_str()) ; }
91  static RooRealVar& as_VAR(UInt_t idx) { checkIndex(idx) ; return of()->asVAR(of()->_args[idx].c_str()) ; }
92  static RooAbsRealLValue& as_VARLV(UInt_t idx) { checkIndex(idx) ; return of()->asVARLV(of()->_args[idx].c_str()) ; }
93  static RooResolutionModel& as_RMODEL(UInt_t idx) { checkIndex(idx) ; return of()->asRMODEL(of()->_args[idx].c_str()) ; }
94 
95  static RooCategory& as_CAT(UInt_t idx) { checkIndex(idx) ; return of()->asCAT(of()->_args[idx].c_str()) ; }
96  static RooAbsCategoryLValue& as_CATLV(UInt_t idx) { checkIndex(idx) ; return of()->asCATLV(of()->_args[idx].c_str()) ; }
97  static RooAbsCategory& as_CATFUNC(UInt_t idx) { checkIndex(idx) ; return of()->asCATFUNC(of()->_args[idx].c_str()) ; }
98 
99  static RooArgSet as_SET(UInt_t idx) { checkIndex(idx) ; return of()->asSET(of()->_args[idx].c_str()) ; }
100  static RooArgList as_LIST(UInt_t idx) { checkIndex(idx) ; return of()->asLIST(of()->_args[idx].c_str()) ; }
101 
102  static RooAbsData& as_DATA(UInt_t idx) { checkIndex(idx) ; return of()->asDATA(of()->_args[idx].c_str()) ; }
103  static RooDataHist& as_DHIST(UInt_t idx) { checkIndex(idx) ; return of()->asDHIST(of()->_args[idx].c_str()) ; }
104  static RooDataSet& as_DSET(UInt_t idx) { checkIndex(idx) ; return of()->asDSET(of()->_args[idx].c_str()) ; }
105 
106  static TObject& as_OBJ(UInt_t idx) { checkIndex(idx) ; return of()->asOBJ(of()->_args[idx].c_str()) ; }
107 
108  static const char* as_STRING(UInt_t idx) { checkIndex(idx) ; return of()->asSTRING(of()->_args[idx].c_str()) ; }
109  static Int_t as_INT(UInt_t idx) { checkIndex(idx) ; return of()->asINT(of()->_args[idx].c_str()) ; }
110  static Double_t as_DOUBLE(UInt_t idx) { checkIndex(idx) ; return of()->asDOUBLE(of()->_args[idx].c_str()) ; }
111  static Int_t as_INT(UInt_t idx, Int_t defVal) { checkIndex(idx) ; if (idx>of()->_args.size()-1) return defVal ; return of()->asINT(of()->_args[idx].c_str()) ; }
112  static Double_t as_DOUBLE(UInt_t idx, Double_t defVal) { checkIndex(idx) ; if (idx>of()->_args.size()-1) return defVal ; return of()->asDOUBLE(of()->_args[idx].c_str()) ; }
113 
114  RooAbsArg& asARG(const char*) ;
115 
116  RooAbsPdf& asPDF(const char*) ;
117  RooAbsReal& asFUNC(const char*) ;
118  RooRealVar& asVAR(const char*) ;
119  RooAbsRealLValue& asVARLV(const char*) ;
120  RooResolutionModel& asRMODEL(const char*) ;
121 
122  RooCategory& asCAT(const char*) ;
123  RooAbsCategoryLValue& asCATLV(const char*) ;
124  RooAbsCategory& asCATFUNC(const char*) ;
125 
126  RooArgSet asSET(const char*) ;
127  RooArgList asLIST(const char*) ;
128 
129  RooAbsData& asDATA(const char*) ;
130  RooDataHist& asDHIST(const char*) ;
131  RooDataSet& asDSET(const char*) ;
132 
133  TObject& asOBJ(const char*) ;
134 
135  const char* asSTRING(const char*) ;
136  Int_t asINT(const char*) ;
137  Double_t asDOUBLE(const char*) ;
138 
139  class IFace {
140  public:
141  virtual ~IFace() {} ;
142  virtual std::string create(RooFactoryWSTool& ft, const char* typeName, const char* instanceName, std::vector<std::string> args) = 0 ;
143  } ;
144 
145  class SpecialsIFace : public IFace {
146  public:
147  virtual ~SpecialsIFace() {} ;
148  std::string create(RooFactoryWSTool& ft, const char* typeName, const char* instanceName, std::vector<std::string> args) ;
149  } ;
150 
151  static void registerSpecial(const char* typeName, RooFactoryWSTool::IFace* iface) ;
152 
153  void logError() { _errorCount++ ; }
154 
155  const char* autoClassNamePostFix() const { return _autoClassPostFix.c_str() ; }
156  void setAutoClassNamePostFix(const char* pfix) { _autoClassPostFix = pfix ; }
157 
158 protected:
159 
160  Bool_t checkSyntax(const char* arg) ;
161 
162  std::string varTag(std::string& func, std::vector<std::string>& args) ;
163 
164  std::stack<std::string> _autoNamePrefix ;
165  std::map<std::string,std::string> _typeAliases ;
166 
167  static void checkIndex(UInt_t index) ;
168 
169 
170  std::string processCompositeExpression(const char* arg) ;
171  std::string processSingleExpression(const char* arg) ;
172  std::string processListExpression(const char* arg) ;
173  std::string processAliasExpression(const char* arg) ;
174 
175  std::string processCreateVar(std::string& func, std::vector<std::string>& args) ;
176  std::string processCreateArg(std::string& func, std::vector<std::string>& args) ;
177  std::string processMetaArg(std::string& func, std::vector<std::string>& args) ;
178 
179  TClass* resolveClassName(const char* className) ;
180 
181  // CINT constructor interface back end
182  static RooFactoryWSTool* of() ;
183  static RooFactoryWSTool* _of ;
184  std::vector<std::string> _args ;
185 
186  // Hooks for other tools
187  static std::map<std::string,IFace*>& hooks() ;
188  static std::map<std::string,IFace*>* _hooks ;
189 
190  RooWorkspace* _ws ; //! Associated workspace
191 
192  void clearError() { _errorCount = 0 ; }
193  Int_t errorCount() { return _errorCount ; }
194 
195  Int_t _errorCount ; // Error counter for a given expression processing
196 
197  std::string _autoClassPostFix ;
198 
199  RooFactoryWSTool(const RooFactoryWSTool&) ;
200 
201  ClassDef(RooFactoryWSTool,0) // RooFit class code and instance factory
202 
203 } ;
204 
205 
206 
207 #endif