00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "RooFit.h"
00034
00035 #include "Riostream.h"
00036 #include <math.h>
00037
00038 #include "RooChangeTracker.h"
00039 #include "RooAbsReal.h"
00040 #include "RooAbsCategory.h"
00041 #include "RooArgSet.h"
00042 #include "RooMsgService.h"
00043
00044 using namespace std ;
00045
00046 ClassImp(RooChangeTracker)
00047 ;
00048
00049
00050 RooChangeTracker::RooChangeTracker()
00051 {
00052
00053
00054 _realSetIter = _realSet.createIterator() ;
00055 _catSetIter = _catSet.createIterator() ;
00056 }
00057
00058
00059
00060
00061 RooChangeTracker::RooChangeTracker(const char* name, const char* title, const RooArgSet& trackSet, Bool_t checkValues) :
00062 RooAbsReal(name, title),
00063 _realSet("realSet","Set of real-valued components to be tracked",this),
00064 _catSet("catSet","Set of discrete-valued components to be tracked",this),
00065 _realRef(trackSet.getSize()),
00066 _catRef(trackSet.getSize()),
00067 _checkVal(checkValues)
00068 {
00069
00070
00071
00072
00073
00074
00075 _realSetIter = _realSet.createIterator() ;
00076 _catSetIter = _catSet.createIterator() ;
00077
00078 TIterator* iter = trackSet.createIterator() ;
00079 RooAbsArg* arg ;
00080 while((arg=(RooAbsArg*)iter->Next())) {
00081 if (dynamic_cast<RooAbsReal*>(arg)) {
00082 _realSet.add(*arg) ;
00083 }
00084 if (dynamic_cast<RooAbsCategory*>(arg)) {
00085 _catSet.add(*arg) ;
00086 }
00087 }
00088 delete iter ;
00089
00090 if (_checkVal) {
00091 RooAbsReal* real ;
00092 RooAbsCategory* cat ;
00093 Int_t i(0) ;
00094 while((real=(RooAbsReal*)_realSetIter->Next())) {
00095 _realRef[i++] = real->getVal() ;
00096 }
00097 i=0 ;
00098 while((cat=(RooAbsCategory*)_catSetIter->Next())) {
00099 _catRef[i++] = cat->getIndex() ;
00100 }
00101 }
00102
00103 }
00104
00105
00106
00107
00108 RooChangeTracker::RooChangeTracker(const RooChangeTracker& other, const char* name) :
00109 RooAbsReal(other, name),
00110 _realSet("realSet",this,other._realSet),
00111 _catSet("catSet",this,other._catSet),
00112 _realRef(other._realRef),
00113 _catRef(other._catRef),
00114 _checkVal(other._checkVal)
00115 {
00116
00117
00118 _realSetIter = _realSet.createIterator() ;
00119 _catSetIter = _catSet.createIterator() ;
00120
00121 _realSet.add(other._realSet) ;
00122 _catSet.add(other._catSet) ;
00123
00124 }
00125
00126
00127
00128
00129 Bool_t RooChangeTracker::hasChanged(Bool_t clearState)
00130 {
00131
00132
00133
00134
00135
00136 if (!isValueDirty()) {
00137 return kFALSE ;
00138 }
00139
00140
00141 if (!_checkVal) {
00142
00143 if (clearState) {
00144
00145
00146 clearValueDirty() ;
00147 }
00148
00149
00150
00151 return kTRUE ;
00152 }
00153
00154
00155 _realSetIter->Reset() ;
00156 _catSetIter->Reset() ;
00157 RooAbsReal* real ;
00158 RooAbsCategory* cat ;
00159 Int_t i(0) ;
00160
00161 if (clearState) {
00162
00163 Bool_t valuesChanged(kFALSE) ;
00164
00165
00166 while ((real=(RooAbsReal*)_realSetIter->Next())) {
00167 if (real->getVal() != _realRef[i++]) {
00168
00169 valuesChanged = kTRUE ;
00170 _realRef[i-1] = real->getVal() ;
00171 }
00172 }
00173
00174 i=0 ;
00175 while ((cat=(RooAbsCategory*)_catSetIter->Next())) {
00176 if (cat->getIndex() != _catRef[i++]) {
00177
00178 valuesChanged = kTRUE ;
00179 _catRef[i-1] = cat->getIndex() ;
00180 }
00181 }
00182
00183 clearValueDirty() ;
00184
00185 return valuesChanged ;
00186
00187 } else {
00188
00189
00190
00191
00192 while ((real=(RooAbsReal*)_realSetIter->Next())) {
00193 if (real->getVal() != _realRef[i++]) {
00194 return kTRUE ;
00195 }
00196 }
00197
00198 i=0 ;
00199 while ((cat=(RooAbsCategory*)_catSetIter->Next())) {
00200 if (cat->getIndex() != _catRef[i++]) {
00201 return kTRUE ;
00202 }
00203 }
00204
00205 }
00206
00207 return kFALSE ;
00208 }
00209
00210
00211
00212
00213 RooChangeTracker::~RooChangeTracker()
00214 {
00215
00216 if (_realSetIter) delete _realSetIter ;
00217 if (_catSetIter) delete _catSetIter ;
00218 }
00219
00220
00221
00222
00223 RooArgSet RooChangeTracker::parameters() const
00224 {
00225 RooArgSet ret ;
00226 ret.add(_realSet) ;
00227 ret.add(_catSet) ;
00228 return ret ;
00229 }
00230
00231
00232