RooChangeTracker.cxx

Go to the documentation of this file.
00001 /*****************************************************************************
00002  * Project: RooFit                                                           *
00003  * Package: RooFitCore                                                       *
00004  * @(#)root/roofitcore:$Id: RooChangeTracker.cxx 26174 2008-11-13 08:25:25Z wouter $
00005  * Authors:                                                                  *
00006  *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
00007  *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
00008  *                                                                           *
00009  * Copyright (c) 2000-2005, Regents of the University of California          *
00010  *                          and Stanford University. All rights reserved.    *
00011  *                                                                           *
00012  * Redistribution and use in source and binary forms,                        *
00013  * with or without modification, are permitted according to the terms        *
00014  * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
00015  *****************************************************************************/
00016 
00017 //////////////////////////////////////////////////////////////////////////////
00018 // 
00019 // BEGIN_HTML 
00020 // RooChangeTracker is a meta object that tracks value
00021 // changes in a given set of RooAbsArgs by registering itself as value
00022 // client of these objects. The change tracker can perform an
00023 // additional validation step where it also compares the numeric
00024 // values of the tracked arguments with reference values to ensure
00025 // that values have actually changed. This may be useful in case some
00026 // of the tracked observables are in binned datasets where each
00027 // observable propates a valueDirty flag when an event is loaded even
00028 // though usually only one observable actually changes.
00029 // END_HTML
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   // Deault constructor
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   // Constructor. The set trackSet contains the observables to be
00070   // tracked for changes. If checkValues is true an additional
00071   // validation step is activated where the numeric values of the
00072   // tracked arguments are compared with reference values ensuring
00073   // that values have actually changed.
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   // Copy constructor
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   // Returns true if state has changes since last call with clearState=kTRUE
00132   // If clearState is true, changeState flag will be cleared.
00133 
00134 
00135   // If dirty flag did not change, object has not changed in any case
00136   if (!isValueDirty()) {
00137     return kFALSE ;
00138   }
00139 
00140   // If no value checking is required and dirty flag has changed, return true
00141   if (!_checkVal) {
00142 
00143     if (clearState) {
00144       // Clear dirty flag by calling getVal()
00145       //cout << "RooChangeTracker(" << GetName() << ") clearing isValueDirty" << endl ;
00146       clearValueDirty() ;
00147     }
00148 
00149     //cout << "RooChangeTracker(" << GetName() << ") isValueDirty = kTRUE, returning kTRUE" << endl ;
00150 
00151     return kTRUE ;
00152   }
00153   
00154   // Compare values against reference
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     // Check if any of the real values changed
00166     while ((real=(RooAbsReal*)_realSetIter->Next())) {
00167       if (real->getVal() != _realRef[i++]) {
00168         //cout << "RooChangeTracker(" << GetName() << ") value of " << real->GetName() << " has changed from " << _realRef[i-1] << " to " << real->getVal() << endl ;
00169         valuesChanged = kTRUE ;
00170         _realRef[i-1] = real->getVal() ;
00171       }
00172     }
00173     // Check if any of the categories changed
00174     i=0 ;
00175     while ((cat=(RooAbsCategory*)_catSetIter->Next())) {
00176       if (cat->getIndex() != _catRef[i++]) {
00177         //cout << "RooChangeTracker(" << GetName() << ") value of " << cat->GetName() << " has changed from " << _catRef[i-1] << " to " << cat->getIndex() << endl ;
00178         valuesChanged = kTRUE ;
00179         _catRef[i-1] = cat->getIndex() ;
00180       }
00181     }
00182 
00183     clearValueDirty() ;
00184 
00185     return valuesChanged ;
00186 
00187   } else {
00188     
00189     // Return true as soon as any input has changed
00190 
00191     // Check if any of the real values changed
00192     while ((real=(RooAbsReal*)_realSetIter->Next())) {
00193       if (real->getVal() != _realRef[i++]) {
00194         return kTRUE ;
00195       }
00196     }
00197     // Check if any of the categories changed
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   // Destructor
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 

Generated on Tue Jul 5 15:06:20 2011 for ROOT_528-00b_version by  doxygen 1.5.1