Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add timing VS lumi (for HLT monitoring) #14937

Merged
merged 2 commits into from Jul 18, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
219 changes: 219 additions & 0 deletions DQM/HLTEvF/plugins/LumiMonitor.cc
@@ -0,0 +1,219 @@
#include "DQM/HLTEvF/plugins/LumiMonitor.h"

#include "FWCore/MessageLogger/interface/MessageLogger.h"

#include "DQM/TrackingMonitor/interface/GetLumi.h"


// -----------------------------
// constructors and destructor
// -----------------------------

LumiMonitor::LumiMonitor( const edm::ParameterSet& iConfig ) :
folderName_ ( iConfig.getParameter<std::string>("FolderName") )
, lumiScalersToken_ ( consumes<LumiScalersCollection>(iConfig.getParameter<edm::InputTag>("scalers") ) )
, lumi_binning_ ( getHistoPSet (iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet>("lumiPSet")) )
, ls_binning_ ( getHistoLSPSet(iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet>("lsPSet")) )
, doPixelLumi_ ( iConfig.getParameter<bool>("doPixelLumi") )
, pixelClustersToken_ ( doPixelLumi_ ? consumes<edmNew::DetSetVector<SiPixelCluster> >(iConfig.getParameter<edm::InputTag>("pixelClusters") ) : edm::EDGetTokenT<edmNew::DetSetVector<SiPixelCluster>> () )
, useBPixLayer1_ ( doPixelLumi_ ? iConfig.getParameter<bool> ("useBPixLayer1") : false )
, minNumberOfPixelsPerCluster_ ( doPixelLumi_ ? iConfig.getParameter<int> ("minNumberOfPixelsPerCluster") : -1 )
, minPixelClusterCharge_ ( doPixelLumi_ ? iConfig.getParameter<double> ("minPixelClusterCharge") : -1. )
, pixelCluster_binning_ ( doPixelLumi_ ? getHistoPSet (iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet>("pixelClusterPSet")) : MEbinning {} )
, pixellumi_binning_ ( doPixelLumi_ ? getHistoPSet (iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet>("pixellumiPSet")) : MEbinning {} )
{

numberOfPixelClustersVsLS_ = nullptr;
numberOfPixelClustersVsLumi_ = nullptr;
lumiVsLS_ = nullptr;
pixelLumiVsLS_ = nullptr;
pixelLumiVsLumi_ = nullptr;

if(useBPixLayer1_)
lumi_factor_per_bx_ = GetLumi::FREQ_ORBIT * GetLumi::SECONDS_PER_LS / GetLumi::XSEC_PIXEL_CLUSTER ;
else
lumi_factor_per_bx_ = GetLumi::FREQ_ORBIT * GetLumi::SECONDS_PER_LS / GetLumi::rXSEC_PIXEL_CLUSTER ;

}

MEbinning LumiMonitor::getHistoPSet(edm::ParameterSet pset)
{
return MEbinning{
pset.getParameter<int32_t>("nbins"),
pset.getParameter<double>("xmin"),
pset.getParameter<double>("xmax"),
};
}

MEbinning LumiMonitor::getHistoLSPSet(edm::ParameterSet pset)
{
return MEbinning{
pset.getParameter<int32_t>("nbins"),
0.,
double(pset.getParameter<int32_t>("nbins"))
};
}

void LumiMonitor::bookHistograms(DQMStore::IBooker & ibooker,
edm::Run const & iRun,
edm::EventSetup const & iSetup)
{

std::string histname, histtitle;

std::string currentFolder = folderName_ ;
ibooker.setCurrentFolder(currentFolder.c_str());

if ( doPixelLumi_ ) {
histname = "numberOfPixelClustersVsLS"; histtitle = "number of pixel clusters vs LS";
numberOfPixelClustersVsLS_ = ibooker.book1D(histname, histtitle,
ls_binning_.nbins, ls_binning_.xmin, ls_binning_.xmax);
// numberOfPixelClustersVsLS_->getTH1()->SetCanExtend(TH1::kAllAxes);
numberOfPixelClustersVsLS_->setAxisTitle("LS",1);
numberOfPixelClustersVsLS_->setAxisTitle("number of pixel clusters",2);

histname = "numberOfPixelClustersVsLumi"; histtitle = "number of pixel clusters vs scal lumi";
numberOfPixelClustersVsLumi_ = ibooker.bookProfile(histname, histtitle,
lumi_binning_.nbins, lumi_binning_.xmin, lumi_binning_.xmax,
pixelCluster_binning_.xmin,pixelCluster_binning_.xmax);
numberOfPixelClustersVsLumi_->setAxisTitle("scal inst lumi E30 [Hz cm^{-2}]",1);
numberOfPixelClustersVsLumi_->setAxisTitle("number of pixel clusters",2);

histname = "pixelLumiVsLS"; histtitle = "pixel-lumi vs LS";
pixelLumiVsLS_ = ibooker.bookProfile(histname, histtitle,
ls_binning_.nbins, ls_binning_.xmin, ls_binning_.xmax,
pixellumi_binning_.xmin,pixellumi_binning_.xmax);
// pixelLumiVsLS_->getTH1()->SetCanExtend(TH1::kAllAxes);
pixelLumiVsLS_->setAxisTitle("LS",1);
pixelLumiVsLS_->setAxisTitle("pixel-based inst lumi E30 [Hz cm^{-2}]",2);

histname = "pixelLumiVsLumi"; histtitle = "pixel-lumi vs scal lumi";
pixelLumiVsLumi_ = ibooker.bookProfile(histname, histtitle,
lumi_binning_.nbins,lumi_binning_.xmin,lumi_binning_.xmax,
pixellumi_binning_.xmin,lumi_binning_.xmax);
pixelLumiVsLumi_->setAxisTitle("scal inst lumi E30 [Hz cm^{-2}]",1);
pixelLumiVsLumi_->setAxisTitle("pixel-based inst lumi E30 [Hz cm^{-2}]",2);
}

histname = "lumiVsLS"; histtitle = "scal lumi vs LS";
lumiVsLS_ = ibooker.bookProfile(histname, histtitle,
ls_binning_.nbins, ls_binning_.xmin, ls_binning_.xmax,
lumi_binning_.xmin, lumi_binning_.xmax);
// lumiVsLS_->getTH1()->SetCanExtend(TH1::kAllAxes);
lumiVsLS_->setAxisTitle("LS",1);
lumiVsLS_->setAxisTitle("scal inst lumi E30 [Hz cm^{-2}]",2);

}

#include "FWCore/Framework/interface/ESHandle.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
#include "Geometry/Records/interface/TrackerTopologyRcd.h"
void LumiMonitor::analyze(edm::Event const& iEvent, edm::EventSetup const& iSetup) {

// int bx = iEvent.bunchCrossing();
int ls = iEvent.id().luminosityBlock();

float scal_lumi = -1.;
edm::Handle<LumiScalersCollection> lumiScalers;
iEvent.getByToken(lumiScalersToken_, lumiScalers);
if ( lumiScalers.isValid() && lumiScalers->size() ) {
LumiScalersCollection::const_iterator scalit = lumiScalers->begin();
scal_lumi = scalit->instantLumi();
} else {
scal_lumi = -1.;
}
lumiVsLS_ -> Fill(ls, scal_lumi);

if ( doPixelLumi_ ) {
size_t pixel_clusters = 0;
float pixel_lumi = -1.;
edm::Handle< edmNew::DetSetVector<SiPixelCluster> > pixelClusters;
iEvent.getByToken(pixelClustersToken_, pixelClusters);
if ( pixelClusters.isValid() ) {

edm::ESHandle<TrackerTopology> tTopoHandle;
iSetup.get<TrackerTopologyRcd>().get(tTopoHandle);
const TrackerTopology* const tTopo = tTopoHandle.product();

// Count the number of clusters with at least a minimum
// number of pixels per cluster and at least a minimum charge.
size_t tot = 0;
edmNew::DetSetVector<SiPixelCluster>::const_iterator pixCluDet = pixelClusters->begin();
for ( ; pixCluDet!=pixelClusters->end(); ++pixCluDet) {

DetId detid = pixCluDet->detId();
size_t subdetid = detid.subdetId();
if ( subdetid == (int) PixelSubdetector::PixelBarrel )
if ( tTopo->layer(detid)==1 )
continue;

edmNew::DetSet<SiPixelCluster>::const_iterator pixClu = pixCluDet->begin();
for ( ; pixClu != pixCluDet->end(); ++pixClu ) {
++tot;
if ( (pixClu->size() >= minNumberOfPixelsPerCluster_) &&
(pixClu->charge() >= minPixelClusterCharge_ ) ) {
++pixel_clusters;
}
}
}
pixel_lumi = lumi_factor_per_bx_ * pixel_clusters / GetLumi::CM2_TO_NANOBARN ; // ?!?!
} else
pixel_lumi = -1.;

numberOfPixelClustersVsLS_ -> Fill(ls, pixel_clusters);
numberOfPixelClustersVsLumi_ -> Fill(scal_lumi,pixel_clusters);
pixelLumiVsLS_ -> Fill(ls, pixel_lumi);
pixelLumiVsLumi_ -> Fill(scal_lumi,pixel_lumi);
}

}

void LumiMonitor::fillHistoPSetDescription(edm::ParameterSetDescription & pset)
{
pset.add<int> ( "nbins");
pset.add<double>( "xmin" );
pset.add<double>( "xmax" );
}

void LumiMonitor::fillHistoLSPSetDescription(edm::ParameterSetDescription & pset)
{
pset.add<int> ( "nbins", 2500);
}

void LumiMonitor::fillDescriptions(edm::ConfigurationDescriptions & descriptions)
{
edm::ParameterSetDescription desc;
desc.add<edm::InputTag>( "pixelClusters", edm::InputTag("hltSiPixelClusters") );
desc.add<edm::InputTag>( "scalers", edm::InputTag("hltScalersRawToDigi"));
desc.add<std::string> ( "FolderName", "HLT/LumiMonitoring" );
desc.add<bool> ( "doPixelLumi", false );
desc.add<bool> ( "useBPixLayer1", false );
desc.add<int> ( "minNumberOfPixelsPerCluster", 2 ); // from DQM/PixelLumi/python/PixelLumiDQM_cfi.py
desc.add<double> ( "minPixelClusterCharge", 15000. );

edm::ParameterSetDescription histoPSet;
edm::ParameterSetDescription pixelClusterPSet;
LumiMonitor::fillHistoPSetDescription(pixelClusterPSet);
histoPSet.add("pixelClusterPSet", pixelClusterPSet);

edm::ParameterSetDescription lumiPSet;
fillHistoPSetDescription(lumiPSet);
histoPSet.add<edm::ParameterSetDescription>("lumiPSet", lumiPSet);

edm::ParameterSetDescription pixellumiPSet;
fillHistoPSetDescription(pixellumiPSet);
histoPSet.add<edm::ParameterSetDescription>("pixellumiPSet", pixellumiPSet);

edm::ParameterSetDescription lsPSet;
fillHistoLSPSetDescription(lsPSet);
histoPSet.add<edm::ParameterSetDescription>("lsPSet", lsPSet);

desc.add<edm::ParameterSetDescription>("histoPSet",histoPSet);

descriptions.add("lumiMonitor", desc);
}

// Define this as a plug-in
#include "FWCore/Framework/interface/MakerMacros.h"
DEFINE_FWK_MODULE(LumiMonitor);
86 changes: 86 additions & 0 deletions DQM/HLTEvF/plugins/LumiMonitor.h
@@ -0,0 +1,86 @@
#ifndef LUMIMONITOR_H
#define LUMIMONITOR_H

#include <string>
#include <vector>
#include <map>

#include "FWCore/Utilities/interface/EDGetToken.h"
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/ServiceRegistry/interface/Service.h"
#include "DQMServices/Core/interface/MonitorElement.h"
#include <DQMServices/Core/interface/DQMEDAnalyzer.h>

#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
#include "FWCore/ParameterSet/interface/Registry.h"

//DataFormats
#include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h"
#include "DataFormats/Scalers/interface/LumiScalers.h"
#include "DataFormats/Luminosity/interface/LumiDetails.h"
#include "DataFormats/Luminosity/interface/LumiSummary.h"


struct MEbinning {
int nbins;
double xmin;
double xmax;
// MEbinning() {};
// explicit MEbinning(int n, double min, double max) { nbins= n; xmin = min; xmax = max;}
};

//
// class declaration
//

class LumiMonitor : public DQMEDAnalyzer
{
public:
LumiMonitor( const edm::ParameterSet& );
~LumiMonitor() = default;
static void fillDescriptions(edm::ConfigurationDescriptions & descriptions);
static void fillHistoPSetDescription(edm::ParameterSetDescription & pset);
static void fillHistoLSPSetDescription(edm::ParameterSetDescription & pset);

protected:

void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override;
void analyze(edm::Event const& iEvent, edm::EventSetup const& iSetup);

private:

static MEbinning getHistoPSet (edm::ParameterSet pset);
static MEbinning getHistoLSPSet(edm::ParameterSet pset);

std::string folderName_;

edm::EDGetTokenT<LumiScalersCollection> lumiScalersToken_;
MEbinning lumi_binning_;
MEbinning ls_binning_;

bool doPixelLumi_;
edm::EDGetTokenT<edmNew::DetSetVector<SiPixelCluster> > pixelClustersToken_;
bool useBPixLayer1_;
int minNumberOfPixelsPerCluster_;
float minPixelClusterCharge_;
MEbinning pixelCluster_binning_;
MEbinning pixellumi_binning_;


edm::EDGetTokenT<LumiSummary> lumiSummaryToken_;

MonitorElement* numberOfPixelClustersVsLS_;
MonitorElement* numberOfPixelClustersVsLumi_;
MonitorElement* lumiVsLS_;
MonitorElement* pixelLumiVsLS_;
MonitorElement* pixelLumiVsLumi_;

float lumi_factor_per_bx_;

};

#endif // LUMIMONITOR_H
33 changes: 33 additions & 0 deletions DQM/HLTEvF/python/LumiMonitor_cff.py
@@ -0,0 +1,33 @@
import FWCore.ParameterSet.Config as cms

lumiMonitor = cms.EDAnalyzer("LumiMonitor",
FolderName = cms.string("HLT/LumiMonitoring"),
doPixelLumi = cms.bool(False),
useBPixLayer1 = cms.bool(False),
minNumberOfPixelsPerCluster = cms.int32(2), # from DQM/PixelLumi/python/PixelLumiDQM_cfi.py
minPixelClusterCharge = cms.double(15000.),
pixelClusters = cms.InputTag("hltSiPixelClusters"),
scalers = cms.InputTag('scalersRawToDigi'),
histoPSet = cms.PSet(
pixelClusterPSet = cms.PSet(
nbins = cms.int32 ( 200 ),
xmin = cms.double( -0.5),
xmax = cms.double(19999.5),
),
lumiPSet = cms.PSet(
nbins = cms.int32 ( 3600 ),
xmin = cms.double( 3000.),
xmax = cms.double(12000.),
),
pixellumiPSet = cms.PSet(
nbins = cms.int32 (300 ),
xmin = cms.double( 0.),
xmax = cms.double( 3.),
),
lsPSet = cms.PSet(
nbins = cms.int32 (2500 ),
xmin = cms.double( 0.),
xmax = cms.double(2500.),
),
),
)
10 changes: 10 additions & 0 deletions DQM/Integration/python/clients/hlt_dqm_clientPB-live_cfg.py
Expand Up @@ -26,5 +26,15 @@
# FastTimerService client
process.load('HLTrigger.Timer.fastTimerServiceClient_cfi')
process.fastTimerServiceClient.dqmPath = "HLT/TimerService"
# timing VS lumi
process.fastTimerServiceClient.doPlotsVsScalLumi = cms.bool(True)
process.fastTimerServiceClient.doPlotsVsPixelLumi = cms.bool(False)
process.fastTimerServiceClient.scalLumiME = cms.PSet(
folder = cms.string('HLT/LumiMonitoring'),
name = cms.string('lumiVsLS'),
nbins = cms.int32(6500),
xmin = cms.double(0),
xmax = cms.double(13000)
)

process.p = cms.EndPath( process.fastTimerServiceClient + process.dqmEnv + process.dqmSaver )
2 changes: 1 addition & 1 deletion DQM/TrackingMonitor/interface/GetLumi.h
Expand Up @@ -34,7 +34,7 @@ class GetLumi

static constexpr double INELASTIC_XSEC_7TeV = 68.0; // mb
static constexpr double INELASTIC_XSEC_8TeV = 69.3; // mb
static constexpr double INELASTIC_XSEC_13TeV = 71.0; // mb
static constexpr double INELASTIC_XSEC_13TeV = 71.3; // mb from http://inspirehep.net/record/1447965/files/FSQ-15-005-pas.pdf

// from http://cmslxr.fnal.gov/source/DQM/PixelLumi/plugins/PixelLumiDQM.h
// Using all pixel clusters:
Expand Down