Skip to content

Commit

Permalink
Merge pull request #12779 from ghellwig/alignment-filters_75X
Browse files Browse the repository at this point in the history
Alignment filters 75X (Backport of #12776)
  • Loading branch information
cmsbuild committed Jan 5, 2016
2 parents 4dad8ab + a9023b1 commit 0713043
Show file tree
Hide file tree
Showing 4 changed files with 405 additions and 0 deletions.
158 changes: 158 additions & 0 deletions Alignment/CommonAlignment/plugins/APVModeFilter.cc
@@ -0,0 +1,158 @@
// -*- C++ -*-
//
// Package: Alignment/CommonAlignment
// Class: APVModeFilter
//
/**\class APVModeFilter APVModeFilter.cc Alignment/CommonAlignment/plugins/APVModeFilter.cc
Description: Plugin to filter events based on the APV mode
Implementation:
The filter checks the bit configuration used for a given run and selects
only events according to the configured APV mode.
General reference:
https://twiki.cern.ch/twiki/bin/view/CMS/SiStripConditionObjects#SiStripLatency
Document describing the bit configuration (section 5.5):
https://cds.cern.ch/record/1069892/files/cer-002725643.pdf
Summary given here:
https://hypernews.cern.ch/HyperNews/CMS/get/recoTracking/1590/1/1/1.html
bit 1: 0 = 3-sample, 1 = 1-sample
bit 3: 0 = deconvolution, 1 = peak
if both bits are zero: deco
if both bits are one: peak
if 1 is zero and bit 3 is one: multi (not used in actual data taking)
*/
//
// Original Author: Gregor Mittag
// Created: Thu, 03 Dec 2015 16:51:33 GMT
//
//


// system include files
#include <bitset>
#include <array>

// user include files
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "FWCore/Framework/interface/ESHandle.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/Utilities/interface/Exception.h"
#include "CondFormats/SiStripObjects/interface/SiStripLatency.h"
#include "CondFormats/DataRecord/interface/SiStripCondDataRecords.h"

//
// class declaration
//

class APVModeFilter : public edm::stream::EDFilter<> {
public:
explicit APVModeFilter(const edm::ParameterSet&);
~APVModeFilter() = default;

static void fillDescriptions(edm::ConfigurationDescriptions&);

private:
virtual bool filter(edm::Event&, const edm::EventSetup&) override;
virtual void beginRun(const edm::Run&, const edm::EventSetup&) override;

using BitMask = std::bitset<16>; /// APV mode is encoded in uin16_t

/// converts configuration parameter into type used for APV mode filtering
BitMask convertMode(const std::string& mode) const;

/// converts latency record content into type used for APV mode filtering
BitMask convertMode(const uint16_t& mode) const;


// ----------member data ---------------------------

/// bits of interest for the APV mode
static constexpr std::array<size_t, 2> bits_ = {{1, 3}};
static constexpr BitMask deco_ = BitMask(0); /// deco mode bit mask (0000)
static constexpr BitMask peak_ = BitMask(10); /// peak mode bit mask (1010)
static constexpr BitMask multi_ = BitMask(8); /// multi mode bit mask (1000)

const BitMask mode_; /// APV mode that is filtered
BitMask modeCurrentRun_; /// APV mode of the current run
};


//
// static data member definitions
//
constexpr std::array<size_t, 2> APVModeFilter::bits_;
constexpr APVModeFilter::BitMask APVModeFilter::deco_;
constexpr APVModeFilter::BitMask APVModeFilter::peak_;
constexpr APVModeFilter::BitMask APVModeFilter::multi_;


//
// constructors and destructor
//
APVModeFilter::APVModeFilter(const edm::ParameterSet& iConfig) :
mode_(convertMode(iConfig.getUntrackedParameter<std::string>("apvMode"))) {
}


//
// member functions
//

// ------------ method called on each new Event ------------
bool
APVModeFilter::filter(edm::Event&, const edm::EventSetup&) {
return mode_ == modeCurrentRun_;
}

// ------------ method called when starting to processes a run ------------
void
APVModeFilter::beginRun(const edm::Run&, const edm::EventSetup& iSetup) {
edm::ESHandle<SiStripLatency> siStripLatency;
iSetup.get<SiStripLatencyRcd>().get(siStripLatency);
auto product = siStripLatency.product();
modeCurrentRun_ = convertMode(product->singleMode());
}

APVModeFilter::BitMask
APVModeFilter::convertMode(const std::string& mode) const {
if (mode == "deco") {
return deco_;
} else if (mode == "peak") {
return peak_;
} else if (mode == "multi") {
return multi_;
} else {
throw cms::Exception("BadConfig")
<< "Your choice for the APV mode ('" << mode
<< "') is invalid.\nValid APV modes: deco, peak, multi" << std::endl;
}
}

APVModeFilter::BitMask
APVModeFilter::convertMode(const uint16_t& mode) const {
BitMask input(mode);
BitMask result;
for (const auto& bit: bits_) result.set(bit, input[bit]);
return result;
}

// ------------ method fills 'descriptions' with the allowed parameters for the module ------------
void
APVModeFilter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
edm::ParameterSetDescription desc;
desc.setComment("Filters events with the APV mode 'apvMode' (deco/peak/multi).");
desc.addUntracked<std::string>("apvMode", "deco");
descriptions.add("apvModeFilter", desc);
}

//define this as a plug-in
DEFINE_FWK_MODULE(APVModeFilter);
7 changes: 7 additions & 0 deletions Alignment/CommonAlignment/plugins/BuildFile.xml
@@ -0,0 +1,7 @@
<use name="FWCore/Framework"/>
<use name="FWCore/PluginManager"/>
<use name="FWCore/ParameterSet"/>
<use name="CondFormats/DataRecord"/>
<use name="CondFormats/RunInfo"/>
<use name="CondFormats/SiStripObjects"/>
<flags EDM_PLUGIN="1"/>
122 changes: 122 additions & 0 deletions Alignment/CommonAlignment/plugins/MagneticFieldFilter.cc
@@ -0,0 +1,122 @@
// -*- C++ -*-
//
// Package: Alignment/CommonAlignment
// Class: MagneticFieldFilter
//
/**\class MagneticFieldFilter MagneticFieldFilter.cc Alignment/CommonAlignment/plugins/MagneticFieldFilter.cc
Description: Plugin to filter events based on the magnetic field value
Implementation:
Takes the magnet current from the RunInfoRcd and translates it into a
magnetic field value using the parameterization given here:
https://hypernews.cern.ch/HyperNews/CMS/get/magnetic-field/63/1/1/1.html
Agrees within an accuracy of ~20 mT with results of:
https://cmswbm.web.cern.ch/cmswbm/cmsdb/servlet/RunSummary
*/
//
// Original Author: Gregor Mittag
// Created: Wed, 25 Nov 2015 12:59:02 GMT
//
//


// user include files
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "FWCore/Framework/interface/ESHandle.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "CondFormats/RunInfo/interface/RunInfo.h"
#include "CondFormats/DataRecord/interface/RunSummaryRcd.h"

//
// class declaration
//

class MagneticFieldFilter : public edm::stream::EDFilter<> {
public:
explicit MagneticFieldFilter(const edm::ParameterSet&);
~MagneticFieldFilter() = default;

static void fillDescriptions(edm::ConfigurationDescriptions&);

private:
virtual bool filter(edm::Event&, const edm::EventSetup&) override;
virtual void beginRun(const edm::Run&, const edm::EventSetup&) override;

/// convert Ampere (A) to Tesla (T)
float currentToField(const float& current) const;

// ----------member data ---------------------------
/// see: https://hypernews.cern.ch/HyperNews/CMS/get/magnetic-field/63/1/1/1.html
static constexpr float linearCoeffCurrentToField_ = 2.084287e-04;
/// see: https://hypernews.cern.ch/HyperNews/CMS/get/magnetic-field/63/1/1/1.html
static constexpr float constantTermCurrentToField_ = 1.704418e-02;

const int magneticField_; /// magnetic field that is filtered
int magneticFieldCurrentRun_; /// magnetic field estimate of the current run
};

//
// static data member definitions
//
constexpr float MagneticFieldFilter::linearCoeffCurrentToField_;
constexpr float MagneticFieldFilter::constantTermCurrentToField_;


//
// constructor
//
MagneticFieldFilter::MagneticFieldFilter(const edm::ParameterSet& iConfig) :
magneticField_(iConfig.getUntrackedParameter<int>("magneticField")),
magneticFieldCurrentRun_(-10000) {
}


//
// member functions
//

// ------------ method called on each new Event ------------
bool
MagneticFieldFilter::filter(edm::Event&, const edm::EventSetup&) {
return magneticField_ == magneticFieldCurrentRun_;
}

// ------------ method called when starting to processes a run ------------

void
MagneticFieldFilter::beginRun(const edm::Run&, const edm::EventSetup& iSetup) {
edm::ESHandle<RunInfo> sum;
iSetup.get<RunInfoRcd>().get(sum);
auto summary = sum.product();
// convert from Tesla to kGauss (multiply with 10) and
// round off to whole kGauss (add 0.5 and cast to int) as is done in
// 'MagneticField::computeNominalValue()':
magneticFieldCurrentRun_ =
static_cast<int>(currentToField(summary->m_avg_current)*10.0 + 0.5);
}


float
MagneticFieldFilter::currentToField(const float& current) const {
return linearCoeffCurrentToField_ * current + constantTermCurrentToField_;
}


// ------------ method fills 'descriptions' with the allowed parameters for the module ------------
void
MagneticFieldFilter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
edm::ParameterSetDescription desc;
desc.setComment("Filters events with a magnetic field of 'magneticField'.");
desc.addUntracked<int>("magneticField", 38)
->setComment("In units of kGauss (= 0.1 Tesla).");
descriptions.add("magneticFieldFilter", desc);
}

//define this as a plug-in
DEFINE_FWK_MODULE(MagneticFieldFilter);

0 comments on commit 0713043

Please sign in to comment.