diff --git a/CondFormats/PPSObjects/interface/PPSAssociationCuts.h b/CondFormats/PPSObjects/interface/PPSAssociationCuts.h index 12bbcd6d01538..59a35e5372c05 100644 --- a/CondFormats/PPSObjects/interface/PPSAssociationCuts.h +++ b/CondFormats/PPSObjects/interface/PPSAssociationCuts.h @@ -36,6 +36,10 @@ class PPSAssociationCuts { double getTiTrMin() const { return ti_tr_min_; } double getTiTrMax() const { return ti_tr_max_; } + // build TF1 representations of the mean and threshold functions + // NB: declared as const as it only modifies mutable class fields + void buildFunctions() const; + // returns whether the specified cut is applied bool isApplied(Quantities quantity) const; @@ -48,8 +52,8 @@ class PPSAssociationCuts { std::vector s_thresholds_; // TF1 representation of the cut parameters - for run time evaluations - std::vector > f_means_ COND_TRANSIENT; - std::vector > f_thresholds_ COND_TRANSIENT; + mutable std::vector > f_means_ COND_TRANSIENT; + mutable std::vector > f_thresholds_ COND_TRANSIENT; // timing-tracking cuts double ti_tr_min_; diff --git a/CondFormats/PPSObjects/src/PPSAssociationCuts.cc b/CondFormats/PPSObjects/src/PPSAssociationCuts.cc index ca04123c98c06..294829d2179fe 100644 --- a/CondFormats/PPSObjects/src/PPSAssociationCuts.cc +++ b/CondFormats/PPSObjects/src/PPSAssociationCuts.cc @@ -23,13 +23,24 @@ PPSAssociationCuts::CutsPerArm::CutsPerArm(const edm::ParameterSet &iConfig, int std::string threshold = association_cuts.getParameter(names[i] + "_cut_threshold"); s_thresholds_.push_back(threshold); - - f_means_.push_back(std::make_shared("f", mean.c_str())); - f_thresholds_.push_back(std::make_shared("f", threshold.c_str())); } ti_tr_min_ = association_cuts.getParameter("ti_tr_min"); ti_tr_max_ = association_cuts.getParameter("ti_tr_max"); + + buildFunctions(); +} + +//---------------------------------------------------------------------------------------------------- + +void PPSAssociationCuts::CutsPerArm::buildFunctions() const { + f_means_.clear(); + for (const auto &s : s_means_) + f_means_.push_back(std::make_shared("f", s.c_str())); + + f_thresholds_.clear(); + for (const auto &s : s_thresholds_) + f_thresholds_.push_back(std::make_shared("f", s.c_str())); } //---------------------------------------------------------------------------------------------------- @@ -42,10 +53,20 @@ bool PPSAssociationCuts::CutsPerArm::isApplied(Quantities quantity) const { bool PPSAssociationCuts::CutsPerArm::isSatisfied( Quantities quantity, double x_near, double y_near, double xangle, double q_NF_diff) const { + // if cut not applied, then condition considered as satisfied if (!isApplied(quantity)) return true; + + // build functions if not already done + // (this may happen if data (string representation) are loaded from DB and the constructor is not executed) + if (f_means_.size() < s_means_.size()) + buildFunctions(); + + // evaluate mean and threshold const double mean = evaluateExpression(f_means_.at(quantity), x_near, y_near, xangle); const double threshold = evaluateExpression(f_thresholds_.at(quantity), x_near, y_near, xangle); + + // make comparison return fabs(q_NF_diff - mean) < threshold; } diff --git a/RecoPPS/ProtonReconstruction/python/ctppsProtons_cff.py b/RecoPPS/ProtonReconstruction/python/ctppsProtons_cff.py index e7a970c5a2781..392d72ab12c30 100644 --- a/RecoPPS/ProtonReconstruction/python/ctppsProtons_cff.py +++ b/RecoPPS/ProtonReconstruction/python/ctppsProtons_cff.py @@ -8,10 +8,8 @@ # import and adjust proton-reconstructions settings from RecoPPS.ProtonReconstruction.ctppsProtons_cfi import * -from CalibPPS.ESProducers.ppsAssociationCuts_non_DB_cff import * ctppsProtons.lhcInfoLabel = ctppsLHCInfoLabel -ctppsProtons.ppsAssociationCutsLabel = ppsAssociationCutsESSource.ppsAssociationCutsLabel ctppsProtons.pixelDiscardBXShiftedTracks = True ctppsProtons.default_time = -999. diff --git a/Validation/CTPPS/python/simu_config/year_2016_cff.py b/Validation/CTPPS/python/simu_config/year_2016_cff.py index 8eba83bef32c8..f78408778ddec 100644 --- a/Validation/CTPPS/python/simu_config/year_2016_cff.py +++ b/Validation/CTPPS/python/simu_config/year_2016_cff.py @@ -1,8 +1,10 @@ import FWCore.ParameterSet.Config as cms from Validation.CTPPS.simu_config.base_cff import * + import CalibPPS.ESProducers.ppsAssociationCuts_non_DB_cff as ac -ac.use_single_infinite_iov_entry(ac.ppsAssociationCutsESSource,ac.p2016) +ac.use_single_infinite_iov_entry(ac.ppsAssociationCutsESSource, ac.p2016) +ppsAssociationCutsESSource = ac.ppsAssociationCutsESSource # base profile settings for 2016 profile_base_2016 = profile_base.clone( diff --git a/Validation/CTPPS/python/simu_config/year_2017_cff.py b/Validation/CTPPS/python/simu_config/year_2017_cff.py index c2aeb1d626951..04283ea7fb137 100644 --- a/Validation/CTPPS/python/simu_config/year_2017_cff.py +++ b/Validation/CTPPS/python/simu_config/year_2017_cff.py @@ -1,8 +1,10 @@ import FWCore.ParameterSet.Config as cms from Validation.CTPPS.simu_config.base_cff import * + import CalibPPS.ESProducers.ppsAssociationCuts_non_DB_cff as ac -ac.use_single_infinite_iov_entry(ac.ppsAssociationCutsESSource,ac.p2017) +ac.use_single_infinite_iov_entry(ac.ppsAssociationCutsESSource, ac.p2017) +ppsAssociationCutsESSource = ac.ppsAssociationCutsESSource from CalibPPS.ESProducers.ctppsOpticalFunctions_non_DB_cff import optics_2017 as selected_optics diff --git a/Validation/CTPPS/python/simu_config/year_2018_cff.py b/Validation/CTPPS/python/simu_config/year_2018_cff.py index d77d1ba036c86..b34cf9f7999e1 100644 --- a/Validation/CTPPS/python/simu_config/year_2018_cff.py +++ b/Validation/CTPPS/python/simu_config/year_2018_cff.py @@ -1,8 +1,10 @@ import FWCore.ParameterSet.Config as cms from Validation.CTPPS.simu_config.base_cff import * + import CalibPPS.ESProducers.ppsAssociationCuts_non_DB_cff as ac -ac.use_single_infinite_iov_entry(ac.ppsAssociationCutsESSource,ac.p2018) +ac.use_single_infinite_iov_entry(ac.ppsAssociationCutsESSource, ac.p2018) +ppsAssociationCutsESSource = ac.ppsAssociationCutsESSource from CalibPPS.ESProducers.ctppsOpticalFunctions_non_DB_cff import optics_2018 as selected_optics diff --git a/Validation/CTPPS/python/simu_config/year_2021_cff.py b/Validation/CTPPS/python/simu_config/year_2021_cff.py index 9741664a064c1..bb27220a5c5ed 100644 --- a/Validation/CTPPS/python/simu_config/year_2021_cff.py +++ b/Validation/CTPPS/python/simu_config/year_2021_cff.py @@ -1,8 +1,10 @@ import FWCore.ParameterSet.Config as cms from Validation.CTPPS.simu_config.base_cff import * + import CalibPPS.ESProducers.ppsAssociationCuts_non_DB_cff as ac -ac.use_single_infinite_iov_entry(ac.ppsAssociationCutsESSource,ac.p2021) +ac.use_single_infinite_iov_entry(ac.ppsAssociationCutsESSource, ac.p2021) +ppsAssociationCutsESSource = ac.ppsAssociationCutsESSource from CalibPPS.ESProducers.ctppsOpticalFunctions_non_DB_cff import optics_2021 as selected_optics diff --git a/Validation/CTPPS/python/simu_config/year_2022_cff.py b/Validation/CTPPS/python/simu_config/year_2022_cff.py index 74bdfb7ad9333..8d72c09294f82 100644 --- a/Validation/CTPPS/python/simu_config/year_2022_cff.py +++ b/Validation/CTPPS/python/simu_config/year_2022_cff.py @@ -1,8 +1,10 @@ import FWCore.ParameterSet.Config as cms from Validation.CTPPS.simu_config.base_cff import * + import CalibPPS.ESProducers.ppsAssociationCuts_non_DB_cff as ac -ac.use_single_infinite_iov_entry(ac.ppsAssociationCutsESSource,ac.p2022) +ac.use_single_infinite_iov_entry(ac.ppsAssociationCutsESSource, ac.p2022) +ppsAssociationCutsESSource = ac.ppsAssociationCutsESSource from CalibPPS.ESProducers.ctppsOpticalFunctions_non_DB_cff import optics_2022 as selected_optics