diff --git a/ReleaseNotes/release_notes.md b/ReleaseNotes/release_notes.md index 7542e5a9..9df0e8aa 100644 --- a/ReleaseNotes/release_notes.md +++ b/ReleaseNotes/release_notes.md @@ -13,6 +13,7 @@ 1. add conversion to int for `RooAbsCategory` 1. add iterator/contains/len functions for `RooAbsDataStore` 1. add some simple utilities for goodness-of-fit studies `ostap.stats.gof` + 1. simplify `Ostap::Utils:::getWeight` for 6.26<=ROOT ## Backward incompatible: diff --git a/source/include/Ostap/GetWeight.h b/source/include/Ostap/GetWeight.h index 4e198fcb..0e142de7 100644 --- a/source/include/Ostap/GetWeight.h +++ b/source/include/Ostap/GetWeight.h @@ -11,6 +11,7 @@ // ============================================================================ // Forward declarations // ============================================================================ +class RooAbsReal ; class RooAbsData ; class RooDataSet ; // ============================================================================ @@ -24,7 +25,13 @@ namespace Ostap * @param data (INPUT) dataset * @return the name of weigth variable, if and when possible */ - std::string getWeight ( const RooAbsData* data ) ; + std::string getWeight ( const RooAbsData* data ) ; + // ======================================================================== + /** get the weight variable from data set (if and when possible) + * @param data (INPUT) dataset + * @return the weigth variable, if and when possible + */ + const RooAbsReal* getWeightVar ( const RooAbsData* data ) ; // ======================================================================== /** weight errors are stored for the weighted data set? * @param data (INPUT) dataset @@ -34,7 +41,7 @@ namespace Ostap * @see RooAbsData * @see RooAbsArg::getAttribute */ - bool storeError ( const RooAbsData* data ) ; + bool storeError ( const RooAbsData* data ) ; // ======================================================================== /** weigth errors are stored for the weighted data set? * @param data (INPUT) dataset @@ -43,7 +50,7 @@ namespace Ostap * @see RooAbsData * @see RooAbsArg::getAttribute */ - bool storeAsymError ( const RooAbsData* data ) ; + bool storeAsymError ( const RooAbsData* data ) ; // ======================================================================== /** make un unweighted dataset from weighted one * @param weighted_data (INPUT) input dataset @@ -51,8 +58,9 @@ namespace Ostap * @return unweighted dataset + name of weight variable, if and when possible */ std::pair - unweight ( const RooAbsData* weighted_data , - const std::string& weight_var = "" ) ; + unweight + ( const RooAbsData* weighted_data , + const std::string& weight_var = "" ) ; // ======================================================================== } // The end of namespace Ostap::Utils // ========================================================================== diff --git a/source/src/GetWeight.cpp b/source/src/GetWeight.cpp index 8c803318..01bb1a72 100644 --- a/source/src/GetWeight.cpp +++ b/source/src/GetWeight.cpp @@ -28,6 +28,8 @@ namespace { // ========================================================================== +#if ROOT_VERSION_CODE < ROOT_VERSION ( 6 , 26 , 0 ) + // ========================================================================== /// helper class to get the protected info class AuxDataSet : public RooDataSet { @@ -40,7 +42,7 @@ namespace public: // ======================================================================= /// get the weight variable - std::string wgtVar() const + std::string wgtName () const { return RooDataSet::_wgtVar ? RooDataSet::_wgtVar->GetName() : "" ; } // ======================================================================== /// store error on weight ? @@ -52,8 +54,12 @@ namespace bool storeAsymError () const { return RooDataSet::_wgtVar ? RooDataSet::_wgtVar->getAttribute ( "StoreAsymError" ) : false ; } // ======================================================================== + const RooAbsReal* wgtVar () const { return _wgtVar ; } + // ======================================================================== } ; // ========================================================================== +#endif + // ========================================================================== static_assert ( std::numeric_limits::is_specialized , "std::numeric_limits is not specialized" ) ; // ========================================================================== @@ -67,16 +73,38 @@ namespace * @return weigth variable, when possible */ // ============================================================================ -std::string Ostap::Utils::getWeight ( const RooAbsData* data ) +const RooAbsReal* Ostap::Utils::getWeightVar ( const RooAbsData* data ) { - if ( nullptr == data || !data->isWeighted() ) { return "" ; } + if ( nullptr == data || !data->isWeighted() ) { return nullptr ; } const RooDataSet* ds = dynamic_cast( data ) ; - if ( nullptr == ds ) { return "" ; } + if ( nullptr == ds ) { return nullptr ; } + // +#if ROOT_VERSION_CODE < ROOT_VERSION ( 6 , 26 , 0 ) // std::unique_ptr cloned { ds->emptyClone() } ; AuxDataSet aux { *dynamic_cast( cloned.get() ) } ; // return aux.wgtVar() ; + // +#else + // + return ds->weightVar() ; + // +#endif + // +} +// ============================================================================ +/* get the weight variable from data set (if possible) + * @param data (INPUT) dataset + * @return weigth variable, when possible + */ +// ============================================================================ +std::string Ostap::Utils::getWeight ( const RooAbsData* data ) +{ + // weight var + const RooAbsReal* wvar = getWeightVar ( data ) ; + if ( nullptr == wvar ) { return "" ; } + return wvar->GetName() ; } // ============================================================================ /* weight errors are stored for the weighted data set? @@ -88,16 +116,14 @@ std::string Ostap::Utils::getWeight ( const RooAbsData* data ) * @see RooAbsArg::getAttribute */ // ============================================================================ -bool Ostap::Utils::storeError ( const RooAbsData* data ) +bool Ostap::Utils::storeError ( const RooAbsData* data ) { - if ( nullptr == data || !data->isWeighted() ) { return false ; } - const RooDataSet* ds = dynamic_cast( data ) ; - if ( nullptr == ds ) { return false ; } - // - std::unique_ptr cloned { ds->emptyClone() } ; - AuxDataSet aux { *dynamic_cast( cloned.get() ) } ; - // - return aux.storeError() ; + // weight var + const RooAbsReal* wvar = getWeightVar ( data ) ; + if ( nullptr == wvar ) { return false ; } + return + wvar->getAttribute ( "StoreError" ) || + wvar->getAttribute ( "StoreAsymError" ) ; } // ============================================================================ /* weigth errors are stored for the weighted data set? @@ -109,17 +135,13 @@ bool Ostap::Utils::storeError ( const RooAbsData* data ) */ // ============================================================================ bool Ostap::Utils::storeAsymError ( const RooAbsData* data ) -{ - if ( nullptr == data || !data->isWeighted() ) { return false ; } - const RooDataSet* ds = dynamic_cast( data ) ; - if ( nullptr == ds ) { return false ; } - // - std::unique_ptr cloned { ds->emptyClone() } ; - AuxDataSet aux { *dynamic_cast( cloned.get() ) } ; + { + // weight var + const RooAbsReal* wvar = getWeightVar ( data ) ; + if ( nullptr == wvar ) { return false ; } + return wvar->getAttribute ( "StoreAsymError" ) ; // - return aux.storeAsymError() ; } - // ============================================================================ /* make un unweighted dataset from weighted one * @param weighted_data (INPUT) input dataset @@ -131,8 +153,8 @@ Ostap::Utils::unweight ( const RooAbsData* weighted_data , const std::string& weight_var ) { - if ( nullptr == weighted_data ) { return std::make_pair ( nullptr, "" ) ; } // RETURN - if ( ! weighted_data->isWeighted() ) { return std::make_pair ( nullptr, "" ) ; } // RETURN + if ( nullptr == weighted_data ) { return std::make_pair ( nullptr, "" ) ; } // RETURN + if ( !weighted_data->isWeighted() ) { return std::make_pair ( nullptr, "" ) ; } // RETURN // std::string wvar = weight_var ; //