CMS 3D CMS Logo

List of all members | Public Member Functions | Protected Member Functions | Private Member Functions | Private Attributes
L1TOccupancyClient Class Reference

#include <L1TOccupancyClient.h>

Inheritance diagram for L1TOccupancyClient:
DQMEDHarvester edm::one::EDProducer< edm::EndLuminosityBlockProducer, edm::EndRunProducer, edm::EndProcessBlockProducer, edm::one::WatchLuminosityBlocks, edm::one::WatchRuns, edm::one::SharedResources, edm::Accumulator > edm::one::EDProducerBase edm::ProducerBase edm::EDConsumerBase edm::ProductRegistryHelper

Public Member Functions

 L1TOccupancyClient (const edm::ParameterSet &ps)
 Constructor. More...
 
 ~L1TOccupancyClient () override
 Destructor. More...
 
- Public Member Functions inherited from DQMEDHarvester
void accumulate (edm::Event const &ev, edm::EventSetup const &es) final
 
void beginJob () override
 
void beginLuminosityBlock (edm::LuminosityBlock const &lumi, edm::EventSetup const &) final
 
void beginRun (edm::Run const &run, edm::EventSetup const &) override
 
virtual void dqmAnalyze (DQMStore::IBooker &, DQMStore::IGetter &, edm::Event const &, edm::EventSetup const &)
 
 DQMEDHarvester (edm::ParameterSet const &iConfig)
 
 DQMEDHarvester ()
 
virtual void dqmEndRun (DQMStore::IBooker &, DQMStore::IGetter &, edm::Run const &, edm::EventSetup const &)
 
void endLuminosityBlock (edm::LuminosityBlock const &, edm::EventSetup const &) final
 
void endLuminosityBlockProduce (edm::LuminosityBlock &lumi, edm::EventSetup const &es) final
 
void endProcessBlockProduce (edm::ProcessBlock &) final
 
void endRun (edm::Run const &, edm::EventSetup const &) override
 
void endRunProduce (edm::Run &run, edm::EventSetup const &es) final
 
 ~DQMEDHarvester () override=default
 
- Public Member Functions inherited from edm::one::EDProducer< edm::EndLuminosityBlockProducer, edm::EndRunProducer, edm::EndProcessBlockProducer, edm::one::WatchLuminosityBlocks, edm::one::WatchRuns, edm::one::SharedResources, edm::Accumulator >
 EDProducer ()=default
 
 EDProducer (const EDProducer &)=delete
 
SerialTaskQueueglobalLuminosityBlocksQueue () final
 
SerialTaskQueueglobalRunsQueue () final
 
bool hasAbilityToProduceInBeginLumis () const final
 
bool hasAbilityToProduceInBeginProcessBlocks () const final
 
bool hasAbilityToProduceInBeginRuns () const final
 
bool hasAbilityToProduceInEndLumis () const final
 
bool hasAbilityToProduceInEndProcessBlocks () const final
 
bool hasAbilityToProduceInEndRuns () const final
 
const EDProduceroperator= (const EDProducer &)=delete
 
bool wantsGlobalLuminosityBlocks () const final
 
bool wantsGlobalRuns () const final
 
bool wantsInputProcessBlocks () const final
 
bool wantsProcessBlocks () const final
 
- Public Member Functions inherited from edm::one::EDProducerBase
 EDProducerBase ()
 
ModuleDescription const & moduleDescription () const
 
bool wantsStreamLuminosityBlocks () const
 
bool wantsStreamRuns () const
 
 ~EDProducerBase () override
 
- Public Member Functions inherited from edm::ProducerBase
void callWhenNewProductsRegistered (std::function< void(BranchDescription const &)> const &func)
 
std::vector< edm::ProductResolverIndex > const & indiciesForPutProducts (BranchType iBranchType) const
 
 ProducerBase ()
 
std::vector< edm::ProductResolverIndex > const & putTokenIndexToProductResolverIndex () const
 
std::vector< bool > const & recordProvenanceList () const
 
void registerProducts (ProducerBase *, ProductRegistry *, ModuleDescription const &)
 
std::function< void(BranchDescription const &)> registrationCallback () const
 used by the fwk to register list of products More...
 
void resolvePutIndicies (BranchType iBranchType, ModuleToResolverIndicies const &iIndicies, std::string const &moduleLabel)
 
TypeLabelList const & typeLabelList () const
 used by the fwk to register the list of products of this module More...
 
 ~ProducerBase () noexcept(false) override
 
- Public Member Functions inherited from edm::EDConsumerBase
std::vector< ConsumesInfoconsumesInfo () const
 
void convertCurrentProcessAlias (std::string const &processName)
 Convert "@currentProcess" in InputTag process names to the actual current process name. More...
 
 EDConsumerBase ()
 
 EDConsumerBase (EDConsumerBase const &)=delete
 
 EDConsumerBase (EDConsumerBase &&)=default
 
ESResolverIndex const * esGetTokenIndices (edm::Transition iTrans) const
 
std::vector< ESResolverIndex > const & esGetTokenIndicesVector (edm::Transition iTrans) const
 
std::vector< ESRecordIndex > const & esGetTokenRecordIndicesVector (edm::Transition iTrans) const
 
ProductResolverIndexAndSkipBit indexFrom (EDGetToken, BranchType, TypeID const &) const
 
void itemsMayGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
void itemsToGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
std::vector< ProductResolverIndexAndSkipBit > const & itemsToGetFrom (BranchType iType) const
 
void labelsForToken (EDGetToken iToken, Labels &oLabels) const
 
void modulesWhoseProductsAreConsumed (std::array< std::vector< ModuleDescription const *> *, NumBranchTypes > &modulesAll, std::vector< ModuleProcessName > &modulesInPreviousProcesses, ProductRegistry const &preg, std::map< std::string, ModuleDescription const *> const &labelsToDesc, std::string const &processName) const
 
EDConsumerBase const & operator= (EDConsumerBase const &)=delete
 
EDConsumerBaseoperator= (EDConsumerBase &&)=default
 
bool registeredToConsume (ProductResolverIndex, bool, BranchType) const
 
void selectInputProcessBlocks (ProductRegistry const &productRegistry, ProcessBlockHelperBase const &processBlockHelperBase)
 
ProductResolverIndexAndSkipBit uncheckedIndexFrom (EDGetToken) const
 
void updateLookup (BranchType iBranchType, ProductResolverIndexHelper const &, bool iPrefetchMayGet)
 
void updateLookup (eventsetup::ESRecordsToProductResolverIndices const &)
 
virtual ~EDConsumerBase () noexcept(false)
 

Protected Member Functions

void book (DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter)
 
void dqmEndJob (DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter) override
 
void dqmEndLuminosityBlock (DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, const edm::LuminosityBlock &lumiSeg, const edm::EventSetup &c) override
 
double xySymmetry (const edm::ParameterSet &ps, std::string test_name, std::vector< std::pair< int, double > > &deadChannels, std::vector< std::pair< int, double > > &statDev, bool &enoughStats)
 
- Protected Member Functions inherited from edm::ProducerBase
template<Transition Tr = Transition::Event>
auto produces (std::string instanceName) noexcept
 declare what type of product will make and with which optional label More...
 
template<Transition B>
BranchAliasSetter produces (const TypeID &id, std::string instanceName=std::string(), bool recordProvenance=true)
 
template<BranchType B>
BranchAliasSetter produces (const TypeID &id, std::string instanceName=std::string(), bool recordProvenance=true)
 
BranchAliasSetter produces (const TypeID &id, std::string instanceName=std::string(), bool recordProvenance=true)
 
template<typename ProductType , Transition B>
BranchAliasSetterT< ProductType > produces (std::string instanceName)
 
template<class ProductType >
BranchAliasSetterT< ProductType > produces ()
 
template<typename ProductType , BranchType B>
BranchAliasSetterT< ProductType > produces (std::string instanceName)
 
template<typename ProductType , BranchType B>
BranchAliasSetterT< ProductType > produces ()
 
template<class ProductType >
BranchAliasSetterT< ProductType > produces (std::string instanceName)
 
template<typename ProductType , Transition B>
BranchAliasSetterT< ProductType > produces ()
 
template<Transition Tr = Transition::Event>
auto produces () noexcept
 
ProducesCollector producesCollector ()
 
- Protected Member Functions inherited from edm::EDConsumerBase
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > consumes (edm::InputTag const &tag)
 
template<BranchType B = InEvent>
EDConsumerBaseAdaptor< Bconsumes (edm::InputTag tag) noexcept
 
EDGetToken consumes (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken consumes (TypeToGet const &id, edm::InputTag const &tag)
 
ConsumesCollector consumesCollector ()
 Use a ConsumesCollector to gather consumes information from helper functions. More...
 
template<typename ESProduct , typename ESRecord , Transition Tr = Transition::Event>
auto esConsumes ()
 
template<typename ESProduct , typename ESRecord , Transition Tr = Transition::Event>
auto esConsumes (ESInputTag const &tag)
 
template<Transition Tr = Transition::Event>
constexpr auto esConsumes ()
 
template<Transition Tr = Transition::Event>
auto esConsumes (ESInputTag tag)
 
template<Transition Tr = Transition::Event>
ESGetTokenGeneric esConsumes (eventsetup::EventSetupRecordKey const &iRecord, eventsetup::DataKey const &iKey)
 Used with EventSetupRecord::doGet. More...
 
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > mayConsume (edm::InputTag const &tag)
 
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 
void resetItemsToGetFrom (BranchType iType)
 

Private Member Functions

int compareWithStrip (TH2F *histo, std::string test, int binStrip, int nBins, int axis, double avg, const edm::ParameterSet &ps, std::vector< std::pair< int, double > > &deadChannels)
 
double getAvrg (TH2F *h2f, std::string test, int axis, int nBins, int binStrip, int avrgMode)
 
void getBinCoordinateOnAxisWithValue (TH2F *h2f, double content, int &coord, int axis)
 
void printDeadChannels (const std::vector< std::pair< int, double > > &deadChannels, TH2F *h2f, const std::vector< std::pair< int, double > > &statDev, std::string test_name)
 

Private Attributes

TFile * file_
 
L1TOccupancyClientHistogramServicehservice_
 
std::map< std::string, MonitorElement * > meCertification
 
std::map< std::string, MonitorElement * > meDifferential
 
std::map< std::string, MonitorElement * > meResults
 
std::vector< edm::ParameterSet * > mValidTests
 
edm::ParameterSet parameters_
 
std::vector< edm::ParameterSettests_
 
bool verbose_
 

Additional Inherited Members

- Public Types inherited from DQMEDHarvester
typedef dqm::harvesting::DQMStore DQMStore
 
typedef dqm::harvesting::MonitorElement MonitorElement
 
- Public Types inherited from edm::one::EDProducerBase
typedef EDProducerBase ModuleType
 
- Public Types inherited from edm::ProducerBase
template<typename T >
using BranchAliasSetterT = ProductRegistryHelper::BranchAliasSetterT< T >
 
using ModuleToResolverIndicies = std::unordered_multimap< std::string, std::tuple< edm::TypeID const *, const char *, edm::ProductResolverIndex > >
 
typedef ProductRegistryHelper::TypeLabelList TypeLabelList
 
- Public Types inherited from edm::EDConsumerBase
typedef ProductLabels Labels
 
- Static Public Member Functions inherited from edm::one::EDProducerBase
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &descriptions)
 
- Protected Attributes inherited from DQMEDHarvester
DQMStoredqmstore_
 
edm::GetterOfProducts< DQMTokenjobmegetter_
 
edm::EDPutTokenT< DQMTokenjobToken_
 
edm::GetterOfProducts< DQMTokenlumimegetter_
 
edm::EDPutTokenT< DQMTokenlumiToken_
 
edm::GetterOfProducts< DQMTokenrunmegetter_
 
edm::EDPutTokenT< DQMTokenrunToken_
 

Detailed Description

Definition at line 29 of file L1TOccupancyClient.h.

Constructor & Destructor Documentation

◆ L1TOccupancyClient()

L1TOccupancyClient::L1TOccupancyClient ( const edm::ParameterSet ps)

Constructor.

Definition at line 28 of file L1TOccupancyClient.cc.

References gather_cfg::cout, and edm::ParameterSet::getParameter().

28  {
29  // Get parameters
30  parameters_ = ps;
31  verbose_ = ps.getParameter<bool>("verbose");
32  tests_ = ps.getParameter<std::vector<ParameterSet> >("testParams");
33 
34  if (verbose_) {
35  cout << "[L1TOccupancyClient:] Called constructor" << endl;
36  }
37 }
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
edm::ParameterSet parameters_
std::vector< edm::ParameterSet > tests_

◆ ~L1TOccupancyClient()

L1TOccupancyClient::~L1TOccupancyClient ( )
override

Destructor.

Definition at line 43 of file L1TOccupancyClient.cc.

References gather_cfg::cout.

43  {
44  if (verbose_) {
45  cout << "[L1TOccupancyClient:] Called destructor" << endl;
46  }
47 }

Member Function Documentation

◆ book()

void L1TOccupancyClient::book ( DQMStore::IBooker ibooker,
DQMStore::IGetter igetter 
)
protected

Definition at line 56 of file L1TOccupancyClient.cc.

References dqm::implementation::IBooker::book1D(), dqm::implementation::IBooker::book2D(), gather_cfg::cout, edm::ParameterSet::getParameter(), L1TOccupancyClient_cfi::histPath, ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder::it, visualization-live-secondInstance_cfg::m, dqm::implementation::NavigatorBase::setCurrentFolder(), L1TBPTX_cfi::testName, and runGCPTkAlMap::title.

56  {
58 
59  if (verbose_) {
60  cout << "[L1TOccupancyClient:] Called beginRun" << endl;
61 
62  // In verbose mode we will produce an extra output file with several tests
63  file_ = TFile::Open("DQM_L1TOccupancyClient_Snapshots_LS.root", "RECREATE");
64  }
65 
66  ibooker.setCurrentFolder("L1T/L1TOccupancy/");
67  //dbe_->setCurrentFolder("L1T/L1TOccupancy/Results");
68  //dbe_->setCurrentFolder("L1T/L1TOccupancy/BadCellValues");
69  //dbe_->setCurrentFolder("L1T/L1TOccupancy/Certification");
70 
71  // Loop over all tests in defined
72  for (vector<ParameterSet>::iterator it = tests_.begin(); it != tests_.end(); it++) {
73  // If the test algorithm is XYSymmetry we create the necessary histograms
74  if ((*it).getUntrackedParameter<string>("algoName", "XYSymmetry") == "XYSymmetry") {
75  // Getting Parameters for the test
76  string testName = (*it).getParameter<string>("testName");
77  ParameterSet algoParameters = (*it).getParameter<ParameterSet>("algoParams");
78  string histPath = algoParameters.getParameter<string>("histPath");
79 
80  if (verbose_) {
81  cout << "[L1TOccupancyClient:] Monitored histogram path: " << histPath << endl;
82 
83  // Creating verbose file directory structure
84  // test_name/test_name_Results,
85  // test_name/test_name_Histos
86  // TDirectory *td = file_->mkdir(testName.c_str() ,testName.c_str());
87  //FIXME: sub never used gcc361 warning
88  //TDirectory *sub = td ->mkdir((testName+"_Results").c_str(),string("_Results").c_str());
89 
90  //sub = td->mkdir((testName+"_Histos").c_str() ,(testName+"_Histos").c_str());
91  //sub = td->mkdir((testName+"_Histos_AllLS").c_str(),(testName+"_Histos_AllLS").c_str());
92  }
93 
94  // Load histograms in service instance
95  if (hservice_->loadHisto(igetter, testName, histPath)) {
96  // Mask channels specified in python file
97  hservice_->setMaskedBins(testName, algoParameters.getParameter<vector<ParameterSet> >("maskedAreas"));
98 
99  // Book MonitorElements
100  // * Test results
101  ibooker.setCurrentFolder("L1T/L1TOccupancy/Results");
102  string title = testName;
104  m->setTitle(title);
105  m->Reset();
106  meResults[title] = m;
107 
108  // * Which cells are masked as bad
109  ibooker.setCurrentFolder("L1T/L1TOccupancy/HistogramDiff");
110  title = testName;
112  m->Reset();
113  m->setTitle(title);
115 
116  // * Fraction of bad cells
117  ibooker.setCurrentFolder("L1T/L1TOccupancy/Certification");
118  title = testName;
119  m = ibooker.book1D(title.c_str(), title.c_str(), 2500, -.5, 2500. - .5);
120  m->setTitle(title);
122 
123  mValidTests.push_back(&(*it));
124  }
125  }
126  }
127 }
std::map< std::string, MonitorElement * > meCertification
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
TH2F * loadHisto(DQMStore::IGetter &igetter, std::string test, std::string histo)
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
void setMaskedBins(std::string test, const std::vector< edm::ParameterSet > &mask)
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
Definition: DQMStore.h:212
std::map< std::string, MonitorElement * > meDifferential
edm::ParameterSet parameters_
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
std::vector< edm::ParameterSet * > mValidTests
std::map< std::string, MonitorElement * > meResults
std::vector< edm::ParameterSet > tests_
L1TOccupancyClientHistogramService * hservice_

◆ compareWithStrip()

int L1TOccupancyClient::compareWithStrip ( TH2F *  histo,
std::string  test,
int  binStrip,
int  nBins,
int  axis,
double  avg,
const edm::ParameterSet ps,
std::vector< std::pair< int, double > > &  deadChannels 
)
private

Definition at line 715 of file L1TOccupancyClient.cc.

References funct::abs(), gather_cfg::cout, MillePedeFileConverter_cfg::e, edm::ParameterSet::getUntrackedParameter(), mps_fire::i, infinity, and submitPVValidationJobs::params.

722  {
723  int dead = 0;
724 
725  //
726  if (iAxis == 1) {
727  // Get and set parameters for working curves
728  TF1* fmuup = new TF1("fmuup", "TMath::Log(TMath::PoissonI(x,[0])/TMath::PoissonI(x,[1]))", -10000., 10000.);
729  TF1* fmulow = new TF1("fmulow", "TMath::Log(TMath::PoissonI(x,[0])/TMath::PoissonI(x,[1]))", -10000., 10000.);
730  fmuup->SetParameter(0, iAvg * iPS.getUntrackedParameter<double>("factorup", 2.0));
731  fmuup->SetParameter(1, iAvg);
732  fmulow->SetParameter(0, iAvg * iPS.getUntrackedParameter<double>("factorlow", 0.1));
733  fmulow->SetParameter(1, iAvg);
734 
735  TF1* fchi = new TF1("fchi", "[0]*x**2+[1]*x+[2]", 0., 1500.);
736 
737  // Evaluate sigma up
738  vector<double> defaultChi2up;
739  defaultChi2up.push_back(5.45058e-05);
740  defaultChi2up.push_back(0.268756);
741  defaultChi2up.push_back(-11.7515);
742 
743  vector<double> params = iPS.getUntrackedParameter<vector<double> >("params_chi2_up", defaultChi2up);
744  for (unsigned int i = 0; i < params.size(); i++) {
745  fchi->SetParameter(i, params[i]);
746  }
747  double sigma_up = fchi->Eval(iAvg);
748 
749  // Evaluate sigma low
750  vector<double> defaultChi2low;
751  defaultChi2low.push_back(4.11095e-05);
752  defaultChi2low.push_back(0.577451);
753  defaultChi2low.push_back(-10.378);
754 
755  params = iPS.getUntrackedParameter<vector<double> >("params_chi2_low", defaultChi2low);
756  for (unsigned int i = 0; i < params.size(); i++) {
757  fchi->SetParameter(i, params[i]);
758  }
759  double sigma_low = fchi->Eval(iAvg);
760 
761  if (verbose_) {
762  cout << "binstrip= " << iBinStrip << ", sigmaup= " << sigma_up << ", sigmalow= " << sigma_low << endl;
763  }
764 
765  for (int i = 1; i <= iNBins; i++) {
766  if (verbose_) {
767  cout << " " << i << " binContent: up:" << fmuup->Eval(iHist->GetBinContent(iBinStrip, i))
768  << " low: " << fmulow->Eval(iHist->GetBinContent(iBinStrip, i)) << endl;
769  }
770 
771  // Evaluate chi2 for cells
772  double muup = fmuup->Eval(iHist->GetBinContent(iBinStrip, i));
773  double mulow = fmulow->Eval(iHist->GetBinContent(iBinStrip, i));
774 
775  // If channel is masked -> set it to value -1
776  if (hservice_->isMasked(iTestName, iBinStrip, i)) {
777  oChannels.push_back(pair<int, double>(iHist->GetBin(iBinStrip, i), -1.0));
778  }
779  //else perform test
780  else if (muup > sigma_up || mulow > sigma_low ||
781  ((fabs(muup) == std::numeric_limits<double>::infinity()) &&
782  (fabs(mulow) == std::numeric_limits<double>::infinity()))) {
783  dead++;
784  oChannels.push_back(
785  pair<int, double>(iHist->GetBin(iBinStrip, i), abs(iHist->GetBinContent(iBinStrip, i) - iAvg) / iAvg));
786  }
787  }
788  }
789  //
790  else if (iAxis == 2) {
791  //get and set parameters for working curves
792  TF1* fmuup = new TF1("fmuup", "TMath::Log(TMath::PoissonI(x,[0])/TMath::PoissonI(x,[1]))", -10000., 10000.);
793  TF1* fmulow = new TF1("fmulow", "TMath::Log(TMath::PoissonI(x,[0])/TMath::PoissonI(x,[1]))", -10000., 10000.);
794  fmuup->SetParameter(0, iAvg * iPS.getUntrackedParameter<double>("factorup", 2.0));
795  fmuup->SetParameter(1, iAvg);
796  fmulow->SetParameter(0, iAvg * iPS.getUntrackedParameter<double>("factorlow", 0.1));
797  fmulow->SetParameter(1, iAvg);
798 
799  TF1* fchi = new TF1("fchi", "[0]*x**2+[1]*x+[2]", 0., 1500.);
800 
801  // Evaluate sigma up
802  vector<double> defaultChi2up;
803  defaultChi2up.push_back(5.45058e-05);
804  defaultChi2up.push_back(0.268756);
805  defaultChi2up.push_back(-11.7515);
806 
807  vector<double> params = iPS.getUntrackedParameter<vector<double> >("params_chi2_up", defaultChi2up);
808  for (unsigned int i = 0; i < params.size(); i++) {
809  fchi->SetParameter(i, params[i]);
810  }
811  double sigma_up = fchi->Eval(iAvg);
812 
813  // Evaluate sigma low
814  vector<double> defaultChi2low;
815  defaultChi2low.push_back(4.11095e-05);
816  defaultChi2low.push_back(0.577451);
817  defaultChi2low.push_back(-10.378);
818 
819  params = iPS.getUntrackedParameter<vector<double> >("params_chi2_low", defaultChi2low);
820  for (unsigned int i = 0; i < params.size(); i++) {
821  fchi->SetParameter(i, params[i]);
822  }
823  double sigma_low = fchi->Eval(iAvg);
824 
825  if (verbose_) {
826  cout << "binstrip= " << iBinStrip << ", sigmaup= " << sigma_up << ", sigmalow= " << sigma_low << endl;
827  }
828 
829  for (int i = 1; i <= iNBins; i++) {
830  if (verbose_) {
831  cout << " " << i << " binContent: up:" << fmuup->Eval(iHist->GetBinContent(i, iBinStrip))
832  << " low: " << fmulow->Eval(iHist->GetBinContent(i, iBinStrip)) << endl;
833  }
834 
835  //evaluate chi2 for cells
836  double muup = fmuup->Eval(iHist->GetBinContent(i, iBinStrip));
837  double mulow = fmulow->Eval(iHist->GetBinContent(i, iBinStrip));
838 
839  //if channel is masked -> set it to value -1
840  if (hservice_->isMasked(iTestName, i, iBinStrip)) {
841  oChannels.push_back(pair<int, double>(iHist->GetBin(iBinStrip, i), -1.0));
842  }
843  //else perform test
844  else if (muup > sigma_up || mulow > sigma_low ||
845  ((fabs(muup) == std::numeric_limits<double>::infinity()) &&
846  (fabs(mulow) == std::numeric_limits<double>::infinity()))) {
847  dead++;
848  oChannels.push_back(
849  pair<int, double>(iHist->GetBin(i, iBinStrip), abs(iHist->GetBinContent(i, iBinStrip) - iAvg) / iAvg));
850  }
851  }
852  } else {
853  if (verbose_) {
854  cout << "invalid axis" << endl;
855  }
856  }
857 
858  return dead;
859 }
const double infinity
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
bool isMasked(std::string test, int x, int y)
L1TOccupancyClientHistogramService * hservice_

◆ dqmEndJob()

void L1TOccupancyClient::dqmEndJob ( DQMStore::IBooker ibooker,
DQMStore::IGetter igetter 
)
overrideprotectedvirtual

Implements DQMEDHarvester.

Definition at line 136 of file L1TOccupancyClient.cc.

References HLT_2024v12_cff::algo_name, newFWLiteAna::bin, gather_cfg::cout, edm::ParameterSet::getParameter(), L1TOccupancyClient_cfi::histPath, mps_fire::i, ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder::it, and str.

136  {
137  book(ibooker, igetter);
138 
139  if (verbose_) {
140  cout << "[L1TOccupancyClient:] Called endRun()" << endl;
141  }
142 
143  // Loop over every test in python
144  for (std::vector<ParameterSet*>::iterator it = mValidTests.begin(); it != mValidTests.end(); it++) {
145  ParameterSet& test = (**it);
146  string algo_name = test.getUntrackedParameter<string>("algoName", "XYSymmetry");
147  string test_name = test.getParameter<string>("testName");
148 
149  if (verbose_) {
150  cout << "[L1TOccupancyClient:] Starting calculations for: " << algo_name << " on: " << test_name << endl;
151  }
152 
153  if (algo_name == "XYSymmetry") {
154  ParameterSet ps = (**it).getParameter<ParameterSet>("algoParams");
155  string histPath = ps.getParameter<string>("histPath");
156 
157  vector<pair<int, double> > deadChannels;
158  vector<pair<int, double> > statDev;
159  bool enoughStats = false;
160 
161  // Make final block
162  hservice_->updateHistogramEndRun(test_name);
163 
164  // Perform the test
165  double dead = xySymmetry(ps, test_name, deadChannels, statDev, enoughStats);
166  stringstream str;
167  str << test_name << "_cumu_LS_EndRun";
168 
169  if (verbose_) {
170  TH2F* cumulative_save = (TH2F*)hservice_->getDifferentialHistogram(test_name)->Clone(str.str().c_str());
171 
172  cumulative_save->SetTitle(str.str().c_str());
173 
174  TDirectory* td = file_->GetDirectory(test_name.c_str());
175 
176  td->cd(string(test_name + "_Histos_AllLS").c_str());
177 
178  cumulative_save->Write();
179  }
180  // If we have enough statistics, we can write test result
181  if (enoughStats) {
182  // Make the result histogram
183  printDeadChannels(deadChannels, meResults[test_name]->getTH2F(), statDev, test_name);
184 
185  if (verbose_) {
186  TH2F* cumulative_save = (TH2F*)hservice_->getDifferentialHistogram(test_name)->Clone(str.str().c_str());
187  cumulative_save->SetTitle(str.str().c_str());
188  TDirectory* td = file_->GetDirectory(("DQM_L1TOccupancyClient_Snapshots_LS.root:/" + test_name).c_str());
189  td->cd(string(test_name + "_Histos").c_str());
190  cumulative_save->Write();
191 
192  // save the result histo
193  TH2F* h2f = meResults[test_name]->getTH2F();
194  stringstream str2;
195  str2 << test_name << "_result_LS_EndRun";
196  TH2F* dead_save = (TH2F*)h2f->Clone(str2.str().c_str());
197 
198  td->cd(string(test_name + "_Results").c_str());
199  dead_save->SetTitle(str2.str().c_str());
200  dead_save->Write();
201  }
202 
203  // Updating test results
204  meDifferential[test_name]->Reset();
205  meDifferential[test_name]->getTH2F()->Add(hservice_->getDifferentialHistogram(test_name));
206 
207  vector<int> lsCertification = hservice_->getLSCertification(test_name);
208 
209  // Fill fraction of dead channels
210  for (unsigned int i = 0; i < lsCertification.size(); i++) {
211  int bin = meCertification[test_name]->getTH1()->FindBin(lsCertification[i]);
212  meCertification[test_name]->getTH1()->SetBinContent(bin, 1 - dead);
213  }
214 
215  // Reset differential histo
216  hservice_->resetHisto(test_name);
217 
218  if (verbose_) {
219  cout << "Now we have enough statstics for " << test_name << endl;
220  }
221 
222  } else {
223  if (verbose_) {
224  cout << "we don't have enough statstics for " << test_name << endl;
225  }
226 
227  // Getting LS which this test monitored
228  vector<int> lsCertification = hservice_->getLSCertification(test_name);
229 
230  // Fill fraction of dead channels
231  for (unsigned int i = 0; i < lsCertification.size(); i++) {
232  int bin = meCertification[test_name]->getTH1()->FindBin(lsCertification[i]);
233  meCertification[test_name]->getTH1()->SetBinContent(bin, -1);
234  }
235  }
236  } else {
237  if (verbose_) {
238  cout << "No valid algorithm" << std::endl;
239  }
240  }
241  }
242 
243  if (verbose_) {
244  file_->Close();
245  }
246 
247  delete hservice_;
248 }
std::map< std::string, MonitorElement * > meCertification
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
std::vector< int > getLSCertification(std::string iHistName)
void printDeadChannels(const std::vector< std::pair< int, double > > &deadChannels, TH2F *h2f, const std::vector< std::pair< int, double > > &statDev, std::string test_name)
double xySymmetry(const edm::ParameterSet &ps, std::string test_name, std::vector< std::pair< int, double > > &deadChannels, std::vector< std::pair< int, double > > &statDev, bool &enoughStats)
void book(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter)
std::map< std::string, MonitorElement * > meDifferential
std::vector< edm::ParameterSet * > mValidTests
#define str(s)
std::map< std::string, MonitorElement * > meResults
L1TOccupancyClientHistogramService * hservice_

◆ dqmEndLuminosityBlock()

void L1TOccupancyClient::dqmEndLuminosityBlock ( DQMStore::IBooker ibooker,
DQMStore::IGetter igetter,
const edm::LuminosityBlock lumiSeg,
const edm::EventSetup c 
)
overrideprotectedvirtual

Reimplemented from DQMEDHarvester.

Definition at line 257 of file L1TOccupancyClient.cc.

References HLT_2024v12_cff::algo_name, newFWLiteAna::bin, gather_cfg::cout, edm::ParameterSet::getParameter(), L1TOccupancyClient_cfi::histPath, mps_fire::i, edm::LuminosityBlockBase::id(), ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder::it, edm::LuminosityBlockID::luminosityBlock(), and str.

260  {
261  book(ibooker, igetter);
262 
263  int eventLS = lumiSeg.id().luminosityBlock();
264 
265  if (verbose_) {
266  cout << "[L1TOccupancyClient:] Called endLuminosityBlock()" << endl;
267  cout << "[L1TOccupancyClient:] Lumisection: " << eventLS << endl;
268  }
269 
270  // Loop over every test in python
271  for (std::vector<ParameterSet*>::const_iterator it = mValidTests.begin(); it != mValidTests.end(); it++) {
272  ParameterSet& test = (**it);
273  string algo_name = test.getUntrackedParameter<string>("algoName", "XYSymmetry");
274  string test_name = test.getParameter<string>("testName");
275 
276  if (verbose_) {
277  cout << "[L1TOccupancyClient:] Starting calculations for " << algo_name << " on:" << test_name << endl;
278  }
279 
280  if (algo_name == "XYSymmetry") {
281  ParameterSet ps = (**it).getParameter<ParameterSet>("algoParams");
282  string histPath = ps.getParameter<string>("histPath");
283 
284  vector<pair<int, double> > deadChannels;
285  vector<pair<int, double> > statDev;
286  bool enoughStats = false;
287 
288  // Update histo's data with data of this LS
289  hservice_->updateHistogramEndLS(igetter, test_name, histPath, eventLS);
290 
291  // Perform the test
292  double dead = xySymmetry(ps, test_name, deadChannels, statDev, enoughStats);
293  stringstream str;
294  str << test_name << "_cumu_LS_" << eventLS;
295 
296  if (verbose_) {
297  TH2F* cumulative_save = (TH2F*)hservice_->getDifferentialHistogram(test_name)->Clone(str.str().c_str());
298  cumulative_save->SetTitle(str.str().c_str());
299  TDirectory* td = file_->GetDirectory(test_name.c_str());
300  td->cd(string(test_name + "_Histos_AllLS").c_str());
301  cumulative_save->Write();
302  }
303 
304  // If we have enough statistics, we can write test result
305  if (enoughStats) {
306  // Make the result histogram
307  printDeadChannels(deadChannels, meResults[test_name]->getTH2F(), statDev, test_name);
308 
309  if (verbose_) {
310  TH2F* cumulative_save = (TH2F*)hservice_->getDifferentialHistogram(test_name)->Clone(str.str().c_str());
311  cumulative_save->SetTitle(str.str().c_str());
312  TDirectory* td = file_->GetDirectory(("DQM_L1TOccupancyClient_Snapshots_LS.root:/" + test_name).c_str());
313  td->cd(string(test_name + "_Histos").c_str());
314  cumulative_save->Write();
315 
316  // save the result histo
317  TH2F* h2f = meResults[test_name]->getTH2F();
318  stringstream str2;
319  str2 << test_name << "_result_LS_" << eventLS;
320  TH2F* dead_save = (TH2F*)h2f->Clone(str2.str().c_str());
321 
322  td->cd(string(test_name + "_Results").c_str());
323  dead_save->SetTitle(str2.str().c_str());
324  dead_save->Write();
325  }
326 
327  // Updating test results
328  meDifferential[test_name]->Reset();
329  meDifferential[test_name]->getTH2F()->Add(hservice_->getDifferentialHistogram(test_name));
330 
331  vector<int> lsCertification = hservice_->getLSCertification(test_name);
332 
333  // Fill fraction of dead channels
334  for (unsigned int i = 0; i < lsCertification.size(); i++) {
335  int bin = meCertification[test_name]->getTH1()->FindBin(lsCertification[i]);
336  meCertification[test_name]->getTH1()->SetBinContent(bin, 1 - dead);
337  }
338 
339  // Reset differential histo
340  hservice_->resetHisto(test_name);
341 
342  if (verbose_) {
343  cout << "Now we have enough statstics for " << test_name << endl;
344  }
345 
346  } else {
347  if (verbose_) {
348  cout << "we don't have enough statstics for " << test_name << endl;
349  }
350  }
351  } else {
352  if (verbose_) {
353  cout << "No valid algorithm" << std::endl;
354  }
355  }
356  }
357 }
std::map< std::string, MonitorElement * > meCertification
LuminosityBlockNumber_t luminosityBlock() const
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
std::vector< int > getLSCertification(std::string iHistName)
void printDeadChannels(const std::vector< std::pair< int, double > > &deadChannels, TH2F *h2f, const std::vector< std::pair< int, double > > &statDev, std::string test_name)
double xySymmetry(const edm::ParameterSet &ps, std::string test_name, std::vector< std::pair< int, double > > &deadChannels, std::vector< std::pair< int, double > > &statDev, bool &enoughStats)
void book(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter)
LuminosityBlockID id() const
std::map< std::string, MonitorElement * > meDifferential
void updateHistogramEndLS(DQMStore::IGetter &igetter, std::string test, std::string histo, int iLS)
std::vector< edm::ParameterSet * > mValidTests
#define str(s)
std::map< std::string, MonitorElement * > meResults
L1TOccupancyClientHistogramService * hservice_

◆ getAvrg()

double L1TOccupancyClient::getAvrg ( TH2F *  h2f,
std::string  test,
int  axis,
int  nBins,
int  binStrip,
int  avrgMode 
)
private

Definition at line 589 of file L1TOccupancyClient.cc.

References gather_cfg::cout, timingPdfMaker::histo, mps_fire::i, amptDefault_cfi::proj, and contentValuesCheck::values.

589  {
590  double avg = 0.0;
591  TH1D* proj = nullptr;
592  TH2F* histo = new TH2F(*iHist);
593 
594  std::vector<double> values;
595  int marked;
596 
597  if (iAxis == 1) {
598  switch (iAvgMode) {
599  // arithmetic average
600  case 1:
601  marked = hservice_->maskBins(iTestName, histo, iBinStrip, iAxis);
602  proj = histo->ProjectionX();
603  avg = proj->GetBinContent(iBinStrip) / (iNBins - marked);
604  break;
605 
606  // median
607  case 2:
608  marked = hservice_->maskBins(iTestName, histo, iBinStrip, iAxis);
609  proj = histo->ProjectionY("_py", iBinStrip, iBinStrip);
610  for (int i = 0; i < iNBins; i++) {
611  values.push_back(proj->GetBinContent(i + 1));
612  }
613  avg = TMath::Median(iNBins, &values[0]);
614  break;
615  default:
616  if (verbose_) {
617  cout << "Invalid averaging mode!" << endl;
618  }
619  break;
620  }
621  } else if (iAxis == 2) {
622  switch (iAvgMode) {
623  // arithmetic average
624  case 1:
625  marked = hservice_->maskBins(iTestName, histo, iBinStrip, iAxis);
626  proj = histo->ProjectionY();
627  avg = proj->GetBinContent(iBinStrip) / (iNBins - marked);
628  break;
629  // median
630  case 2:
631  marked = hservice_->maskBins(iTestName, histo, iBinStrip, iAxis);
632  proj = histo->ProjectionX("_px", iBinStrip, iBinStrip);
633  for (int i = 0; i < iNBins; i++) {
634  values.push_back(proj->GetBinContent(i + 1));
635  }
636 
637  avg = TMath::Median(iNBins, &values[0]);
638  break;
639  default:
640  if (verbose_) {
641  cout << "invalid averaging mode!" << endl;
642  }
643  break;
644  }
645  } else {
646  if (verbose_) {
647  cout << "invalid axis" << endl;
648  }
649  }
650  delete proj;
651  delete histo;
652  return avg;
653 }
int maskBins(std::string test, TH2F *histo, int strip, int axis)
L1TOccupancyClientHistogramService * hservice_

◆ getBinCoordinateOnAxisWithValue()

void L1TOccupancyClient::getBinCoordinateOnAxisWithValue ( TH2F *  h2f,
double  content,
int &  coord,
int  axis 
)
private

Definition at line 870 of file L1TOccupancyClient.cc.

References x.

870  {
871  int nBinsX = iHist->GetNbinsX(); //actual number of bins x
872  int nBinsY = iHist->GetNbinsY(); //actual number of bins y
873 
874  if (iAxis == 1) {
875  int global = iHist->GetXaxis()->FindFixBin(iValue);
876 
877  // If parameter exceeds axis' value: set to maximum number of bins in x-axis
878  if (global > nBinsX * nBinsY) {
879  global = iHist->GetXaxis()->GetLast();
880  }
881 
882  // Get coordinates of bin
883  int y, z;
884  iHist->GetBinXYZ(global, oBinCoordinate, y, z);
885  } else if (iAxis == 2) {
886  int global = iHist->GetYaxis()->FindFixBin(iValue);
887 
888  // If parameter exceeds axis' value: set to maximum number of bins in x-axis
889  if (global > nBinsX * nBinsY) {
890  global = iHist->GetYaxis()->GetLast();
891  }
892 
893  // Get coordinates of bin
894  int x, z;
895  iHist->GetBinXYZ(global, x, oBinCoordinate, z);
896  }
897 }

◆ printDeadChannels()

void L1TOccupancyClient::printDeadChannels ( const std::vector< std::pair< int, double > > &  deadChannels,
TH2F *  h2f,
const std::vector< std::pair< int, double > > &  statDev,
std::string  test_name 
)
private

Definition at line 664 of file L1TOccupancyClient.cc.

References newFWLiteAna::bin, gather_cfg::cout, ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder::it, trackerHitRTTI::vector, and x.

667  {
668  // Reset the dead channels histogram
669  oHistDeadChannels->Reset();
670  if (verbose_) {
671  cout << "suspect or masked channels of " << iTestName << ": ";
672  }
673 
674  int x, y, z;
675 
676  // put all bad (value=1) and masked (value=-1) cells in histo
677  for (std::vector<pair<int, double> >::const_iterator it = iDeadChannels.begin(); it != iDeadChannels.end(); it++) {
678  int bin = (*it).first;
679  oHistDeadChannels->GetBinXYZ(bin, x, y, z);
680 
681  if (hservice_->isMasked(iTestName, x, y)) {
682  oHistDeadChannels->SetBinContent(bin, -1);
683  if (verbose_) {
684  printf("(%4i,%4i) Masked\n", x, y);
685  }
686  } else {
687  oHistDeadChannels->SetBinContent(bin, 1);
688  if (verbose_) {
689  printf("(%4i,%4i) Failed test\n", x, y);
690  }
691  }
692  }
693 
694  if (verbose_) {
695  cout << "total number of suspect channels: " << (iDeadChannels.size() - (hservice_->getNBinsMasked(iTestName)))
696  << endl;
697  }
698 }
bool isMasked(std::string test, int x, int y)
L1TOccupancyClientHistogramService * hservice_

◆ xySymmetry()

double L1TOccupancyClient::xySymmetry ( const edm::ParameterSet ps,
std::string  test_name,
std::vector< std::pair< int, double > > &  deadChannels,
std::vector< std::pair< int, double > > &  statDev,
bool &  enoughStats 
)
protected

Definition at line 380 of file L1TOccupancyClient.cc.

References gather_cfg::cout, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), mps_fire::i, createfilelist::int, dqmiolumiharvest::j, dqmdumpme::k, METSkim_cff::Max, and submitPVValidationJobs::params.

384  {
385  // Getting differential histogram for this this thes
386  TH2F* diffHist = hservice_->getDifferentialHistogram(iTestName);
387 
388  int pAxis = ps.getUntrackedParameter<int>("axis", 1);
389  int pAverageMode = ps.getUntrackedParameter<int>("averageMode", 2); // 1=arith. mean, 2=median
390  int nBinsX = diffHist->GetNbinsX(); // actual number of bins x
391  int nBinsY = diffHist->GetNbinsY(); // actual number of bins y
392 
393  // Axis==1 : Means symmetry axis is vertical
394  if (pAxis == 1) {
395  int maxBinStrip, centralBinStrip; // x-coordinate of strips
396 
397  maxBinStrip = nBinsX;
398 
399  // If takeCenter=true determine central bin of the pAxis
400  // If takeCenter=false determine the bin to use based user input
401  if (ps.getUntrackedParameter<bool>("takeCenter", true)) {
402  centralBinStrip = nBinsX / 2 + 1;
403  } else {
404  double pAxisSymmetryValue = ps.getParameter<double>("axisSymmetryValue");
405  getBinCoordinateOnAxisWithValue(diffHist, pAxisSymmetryValue, centralBinStrip, 1);
406  }
407 
408  // Assuming odd number of strips --> first comparison is middle strip to itself
409  int upBinStrip = centralBinStrip;
410  int lowBinStrip = centralBinStrip;
411 
412  // If even number decrease lowBinstrip by one
413  if (nBinsX % 2 == 0) {
414  lowBinStrip--;
415  }
416 
417  // Do we have enough statistics? Min(Max(strip_i,strip_j))>threshold
418  std::unique_ptr<double[]> maxAvgs(new double[maxBinStrip - upBinStrip + 1]);
419 
420  int nActualStrips = 0; //number of strips that are not fully masked
421  for (int i = 0, j = upBinStrip, k = lowBinStrip; j <= maxBinStrip; i++, j++, k--) {
422  double avg1 = getAvrg(diffHist, iTestName, pAxis, nBinsY, j, pAverageMode);
423  double avg2 = getAvrg(diffHist, iTestName, pAxis, nBinsY, k, pAverageMode);
424 
425  // Protection for when both strips are masked
426  if (!hservice_->isStripMasked(iTestName, j, pAxis) && !hservice_->isStripMasked(iTestName, k, pAxis)) {
427  maxAvgs[i] = TMath::Max(avg1, avg2);
428  nActualStrips++;
429  }
430  }
431 
432  vector<double> defaultMu0up;
433  defaultMu0up.push_back(13.7655);
434  defaultMu0up.push_back(184.742);
435  defaultMu0up.push_back(50735.3);
436  defaultMu0up.push_back(-97.6793);
437 
438  TF1 tf("myFunc", "[0]*(TMath::Log(x*[1]+[2]))+[3]", 10., 11000.);
439  vector<double> params = ps.getUntrackedParameter<vector<double> >("params_mu0_up", defaultMu0up);
440  for (unsigned int i = 0; i < params.size(); i++) {
441  tf.SetParameter(i, params[i]);
442  }
443  int statsup = (int)tf.Eval(hservice_->getNBinsHistogram(iTestName));
444 
445  vector<double> defaultMu0low;
446  defaultMu0low.push_back(2.19664);
447  defaultMu0low.push_back(1.94546);
448  defaultMu0low.push_back(-99.3263);
449  defaultMu0low.push_back(19.388);
450 
451  params = ps.getUntrackedParameter<vector<double> >("params_mu0_low", defaultMu0low);
452  for (unsigned int i = 0; i < params.size(); i++) {
453  tf.SetParameter(i, params[i]);
454  }
455  int statslow = (int)tf.Eval(hservice_->getNBinsHistogram(iTestName));
456 
457  if (verbose_) {
458  cout << "nbins: " << hservice_->getNBinsHistogram(iTestName) << endl;
459  cout << "statsup= " << statsup << ", statslow= " << statslow << endl;
460  }
461 
462  enoughStats = TMath::MinElement(nActualStrips, maxAvgs.get()) > TMath::Max(statsup, statslow);
463  if (verbose_) {
464  cout << "stats: " << TMath::MinElement(nActualStrips, maxAvgs.get())
465  << ", statsAvg: " << diffHist->GetEntries() / hservice_->getNBinsHistogram(iTestName)
466  << ", threshold: " << TMath::Max(statsup, statslow) << endl;
467  }
468 
469  //if enough statistics
470  //make the test
471  if (enoughStats) {
472  for (; upBinStrip <= maxBinStrip; upBinStrip++, lowBinStrip--) {
473  double avg = getAvrg(diffHist, iTestName, pAxis, nBinsY, upBinStrip, pAverageMode);
475  diffHist, iTestName, lowBinStrip, nBinsY, pAxis, avg, ps, deadChannels); //compare with lower side
476 
477  avg = getAvrg(diffHist, iTestName, pAxis, nBinsY, lowBinStrip, pAverageMode);
479  diffHist, iTestName, upBinStrip, nBinsY, pAxis, avg, ps, deadChannels); //compare with upper side
480  }
481  }
482  }
483 
484  // pAxis==2 : Means symetry pAxis is horizontal
485  else if (pAxis == 2) {
486  int maxBinStrip, centralBinStrip; //x-coordinate of strips
487 
488  maxBinStrip = nBinsY;
489 
490  // Determine center of diagram: either with set pAxis or middle of diagram
491  if (ps.getUntrackedParameter<bool>("takeCenter", true)) {
492  centralBinStrip = nBinsY / 2 + 1;
493  } else {
494  double pAxisSymmetryValue = ps.getParameter<double>("axisSymmetryValue");
495  getBinCoordinateOnAxisWithValue(diffHist, pAxisSymmetryValue, centralBinStrip, 2);
496  }
497 
498  //assuming odd number of strips --> first comparison is middle strip to itself
499  int lowBinStrip = centralBinStrip, upBinStrip = centralBinStrip;
500 
501  //if even number
502  if (nBinsX % 2 == 0) {
503  //decrease lowBinstrip by one
504  lowBinStrip--;
505  }
506 
507  //do we have enough statistics? Min(Max(strip_i,strip_j))>threshold
508  std::unique_ptr<double[]> maxAvgs(new double[maxBinStrip - upBinStrip + 1]);
509  int nActualStrips = 0;
510  for (int i = 0, j = upBinStrip, k = lowBinStrip; j <= maxBinStrip; i++, j++, k--) {
511  double avg1 = getAvrg(diffHist, iTestName, pAxis, nBinsX, j, pAverageMode);
512  double avg2 = getAvrg(diffHist, iTestName, pAxis, nBinsX, k, pAverageMode);
513  if (!hservice_->isStripMasked(iTestName, j, pAxis) && !hservice_->isStripMasked(iTestName, k, pAxis)) {
514  maxAvgs[i] = TMath::Max(avg1, avg2);
515  nActualStrips++;
516  }
517  }
518 
519  vector<double> defaultMu0up;
520  defaultMu0up.push_back(13.7655);
521  defaultMu0up.push_back(184.742);
522  defaultMu0up.push_back(50735.3);
523  defaultMu0up.push_back(-97.6793);
524 
525  vector<double> params = ps.getUntrackedParameter<std::vector<double> >("params_mu0_up", defaultMu0up);
526  TF1 tf("myFunc", "[0]*(TMath::Log(x*[1]+[2]))+[3]", 10., 11000.);
527  for (unsigned int i = 0; i < params.size(); i++) {
528  tf.SetParameter(i, params[i]);
529  }
530  int statsup = (int)tf.Eval(hservice_->getNBinsHistogram(iTestName));
531 
532  vector<double> defaultMu0low;
533  defaultMu0low.push_back(2.19664);
534  defaultMu0low.push_back(1.94546);
535  defaultMu0low.push_back(-99.3263);
536  defaultMu0low.push_back(19.388);
537 
538  params = ps.getUntrackedParameter<std::vector<double> >("params_mu0_low", defaultMu0low);
539  for (unsigned int i = 0; i < params.size(); i++) {
540  tf.SetParameter(i, params[i]);
541  }
542  int statslow = (int)tf.Eval(hservice_->getNBinsHistogram(iTestName));
543  if (verbose_) {
544  cout << "statsup= " << statsup << ", statslow= " << statslow << endl;
545  }
546  enoughStats = TMath::MinElement(nActualStrips, maxAvgs.get()) > TMath::Max(statsup, statslow);
547  if (verbose_) {
548  cout << "stats: " << TMath::MinElement(nActualStrips, maxAvgs.get())
549  << ", statsAvg: " << diffHist->GetEntries() / hservice_->getNBinsHistogram(iTestName)
550  << ", threshold: " << TMath::Max(statsup, statslow) << endl;
551  }
552 
553  //if we have enough statistics
554  //make the test
555  if (enoughStats) {
556  for (; upBinStrip <= maxBinStrip; upBinStrip++, lowBinStrip--) {
557  double avg = getAvrg(diffHist, iTestName, pAxis, nBinsX, upBinStrip, pAverageMode);
559  diffHist, iTestName, lowBinStrip, nBinsX, pAxis, avg, ps, deadChannels); //compare with lower side
560 
561  avg = getAvrg(diffHist, iTestName, pAxis, nBinsX, lowBinStrip, pAverageMode);
563  diffHist, iTestName, upBinStrip, nBinsX, pAxis, avg, ps, deadChannels); //compare with upper side
564  }
565  }
566  } else {
567  if (verbose_) {
568  cout << "Invalid axis" << endl;
569  }
570  }
571 
572  return (deadChannels.size() - hservice_->getNBinsMasked(iTestName)) * 1.0 / hservice_->getNBinsHistogram(iTestName);
573 }
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
void getBinCoordinateOnAxisWithValue(TH2F *h2f, double content, int &coord, int axis)
double getAvrg(TH2F *h2f, std::string test, int axis, int nBins, int binStrip, int avrgMode)
T getUntrackedParameter(std::string const &, T const &) const
bool isStripMasked(std::string test, int binStrip, int axis)
int compareWithStrip(TH2F *histo, std::string test, int binStrip, int nBins, int axis, double avg, const edm::ParameterSet &ps, std::vector< std::pair< int, double > > &deadChannels)
L1TOccupancyClientHistogramService * hservice_

Member Data Documentation

◆ file_

TFile* L1TOccupancyClient::file_
private

Definition at line 55 of file L1TOccupancyClient.h.

◆ hservice_

L1TOccupancyClientHistogramService* L1TOccupancyClient::hservice_
private

Definition at line 54 of file L1TOccupancyClient.h.

◆ meCertification

std::map<std::string, MonitorElement*> L1TOccupancyClient::meCertification
private

Definition at line 66 of file L1TOccupancyClient.h.

◆ meDifferential

std::map<std::string, MonitorElement*> L1TOccupancyClient::meDifferential
private

Definition at line 65 of file L1TOccupancyClient.h.

◆ meResults

std::map<std::string, MonitorElement*> L1TOccupancyClient::meResults
private

Definition at line 64 of file L1TOccupancyClient.h.

◆ mValidTests

std::vector<edm::ParameterSet*> L1TOccupancyClient::mValidTests
private

Definition at line 62 of file L1TOccupancyClient.h.

◆ parameters_

edm::ParameterSet L1TOccupancyClient::parameters_
private

◆ tests_

std::vector<edm::ParameterSet> L1TOccupancyClient::tests_
private

Definition at line 61 of file L1TOccupancyClient.h.

◆ verbose_

bool L1TOccupancyClient::verbose_
private

Definition at line 58 of file L1TOccupancyClient.h.