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

New data format and producer for PCC objects/event #28807

Merged
merged 12 commits into from
Feb 12, 2020
101 changes: 101 additions & 0 deletions Calibration/LumiAlCaRecoProducers/plugins/AlcaPCCProducerEvent.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
/**_________________________________________________________________
class: AlcaPCCProducerEvent.cc



authors: Sam Higginbotham ([email protected]), Chris Palmer ([email protected]), Attila Radl ([email protected])

________________________________________________________________**/

// C++ standard
#include <string>
// CMS
#include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h"
#include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHitCollection.h"

#include "DataFormats/Luminosity/interface/PixelClusterCountsInEvent.h"

#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/Framework/interface/ConsumesCollector.h"
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/stream/EDProducer.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/Utilities/interface/EDGetToken.h"
#include "FWCore/ServiceRegistry/interface/Service.h"
#include "FWCore/Framework/interface/ESHandle.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "FWCore/Framework/interface/LuminosityBlock.h"

#include "TMath.h"
//The class
class AlcaPCCProducerEvent : public edm::stream::EDProducer<> {
public:
explicit AlcaPCCProducerEvent(const edm::ParameterSet&);
~AlcaPCCProducerEvent() override;

private:
void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;

edm::EDGetTokenT<edmNew::DetSetVector<SiPixelCluster> > pixelToken;
edm::InputTag fPixelClusterLabel;

std::string trigstring_; //specifies the trigger Rand or ZeroBias
int countEvt_; //counter
int countLumi_; //counter

std::unique_ptr<reco::PixelClusterCountsInEvent> thePCCob;
};

//--------------------------------------------------------------------------------------------------
AlcaPCCProducerEvent::AlcaPCCProducerEvent(const edm::ParameterSet& iConfig) {
fPixelClusterLabel = iConfig.getParameter<edm::ParameterSet>("AlcaPCCProducerEventParameters")
.getParameter<edm::InputTag>("pixelClusterLabel");
trigstring_ = iConfig.getParameter<edm::ParameterSet>("AlcaPCCProducerEventParameters")
.getUntrackedParameter<std::string>("trigstring", "alcaPCCEvent");

produces<reco::PixelClusterCountsInEvent, edm::Transition::Event>(trigstring_);
pixelToken = consumes<edmNew::DetSetVector<SiPixelCluster> >(fPixelClusterLabel);
}

//--------------------------------------------------------------------------------------------------
AlcaPCCProducerEvent::~AlcaPCCProducerEvent() {}

//--------------------------------------------------------------------------------------------------
void AlcaPCCProducerEvent::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
countEvt_++;
thePCCob = std::make_unique<reco::PixelClusterCountsInEvent>();

unsigned int bx = iEvent.bunchCrossing();

//Looping over the clusters and adding the counts up
edm::Handle<edmNew::DetSetVector<SiPixelCluster> > hClusterColl;
iEvent.getByToken(pixelToken, hClusterColl);

const edmNew::DetSetVector<SiPixelCluster>& clustColl = *(hClusterColl.product());
// ----------------------------------------------------------------------
// -- Clusters without tracks
for (auto const& mod : clustColl) {
if (mod.empty()) {
continue;
}
DetId detId = mod.id();

//--The following will be used when we make a theshold for the clusters.
//--Keeping this for features that may be implemented later.
// -- clusters on this det
//edmNew::DetSet<SiPixelCluster>::const_iterator di;
//int nClusterCount=0;
//for (di = mod.begin(); di != mod.end(); ++di) {
// nClusterCount++;
//}
int nCluster = mod.size();
thePCCob->increment(detId(), nCluster);
thePCCob->setbxID(bx);
}

iEvent.put(std::move(thePCCob), std::string(trigstring_));
}

DEFINE_FWK_MODULE(AlcaPCCProducerEvent);
4 changes: 3 additions & 1 deletion Calibration/LumiAlCaRecoProducers/plugins/BuildFile.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,6 @@
<library file="CorrPCCProducer.cc" name="CorrPCCProducer">
<flags EDM_PLUGIN="1"/>
</library>

<library file="AlcaPCCProducerEvent.cc" name="AlcaPCCProducerEvent">
<flags EDM_PLUGIN="1"/>
</library>
204 changes: 204 additions & 0 deletions Calibration/LumiAlCaRecoProducers/test/PCC_Random_Event_cfg.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
#########################
#Author: Attila Radl ([email protected])
#Purpose: To investigate the AlCaPCCProducerEvent input and output.
#########################
import FWCore.ParameterSet.Config as cms

process = cms.Process("ALCARECO")

process.source = cms.Source("PoolSource",
fileNames = cms.untracked.vstring('file:/eos/cms/store/data/Run2015D/AlCaLumiPixels/ALCARECO/LumiPixels-PromptReco-v4/000/260/039/00000/1CF2A210-5B7E-E511-8F4F-02163E014145.root','file:/eos/cms/store/data/Run2015D/AlCaLumiPixels/ALCARECO/LumiPixels-PromptReco-v4/000/260/039/00000/1E2B0829-707E-E511-B51B-02163E0145FE.root','file:/eos/cms/store/data/Run2015D/AlCaLumiPixels/ALCARECO/LumiPixels-PromptReco-v4/000/260/039/00000/2666E76A-707E-E511-92E4-02163E014689.root','file:/eos/cms/store/data/Run2015D/AlCaLumiPixels/ALCARECO/LumiPixels-PromptReco-v4/000/260/039/00000/2A1E3304-707E-E511-946C-02163E014241.root')
)

#Added process to select the appropriate events
process.OutALCARECOPromptCalibProdPCC = cms.PSet(
SelectEvents = cms.untracked.PSet(
SelectEvents = cms.vstring('pathALCARECOPromptCalibProdPCC')
),
outputCommands = cms.untracked.vstring('drop *',
'keep *_alcaPCCProducer_*_*',
'keep *_MEtoEDMConvertSiStrip_*_*')
)
#Make sure that variables match in producer.cc and .h
process.alcaPCCProducerEvent = cms.EDProducer("AlcaPCCProducerEvent",
AlcaPCCProducerEventParameters = cms.PSet(
WriteToDB = cms.bool(False),
pixelClusterLabel = cms.InputTag("siPixelClustersForLumi"),
#Mod factor to count lumi and the string to specify output
trigstring = cms.untracked.string("alcaPCCRandom")
),
)

process.OutALCARECOLumiPixels = cms.PSet(
SelectEvents = cms.untracked.PSet(
SelectEvents = cms.vstring('pathALCARECOLumiPixels')
),
outputCommands = cms.untracked.vstring('drop *',
'keep *_siPixelClustersForLumi_*_*',
'keep *_TriggerResults_*_HLT')
)


process.OutALCARECOLumiPixels_noDrop = cms.PSet(
SelectEvents = cms.untracked.PSet(
SelectEvents = cms.vstring('pathALCARECOLumiPixels')
),
outputCommands = cms.untracked.vstring('keep *_siPixelClustersForLumi_*_*',
'keep *_TriggerResults_*_HLT')
)

process.siPixelClustersForLumi = cms.EDProducer("SiPixelClusterProducer",
ChannelThreshold = cms.int32(1000),
ClusterThreshold = cms.double(4000.0),
MissCalibrate = cms.untracked.bool(True),
SeedThreshold = cms.int32(1000),
SplitClusters = cms.bool(False),
VCaltoElectronGain = cms.int32(65),
VCaltoElectronOffset = cms.int32(-414),
maxNumberOfClusters = cms.int32(-1),
payloadType = cms.string('Offline'),
src = cms.InputTag("siPixelDigisForLumi")
)


process.siPixelDigisForLumi = cms.EDProducer("SiPixelRawToDigi",
CablingMapLabel = cms.string(''),
ErrorList = cms.vint32(29),
IncludeErrors = cms.bool(True),
InputLabel = cms.InputTag("hltFEDSelectorLumiPixels"),
Regions = cms.PSet(

),
Timing = cms.untracked.bool(False),
UsePhase1 = cms.bool(False),
UsePilotBlade = cms.bool(False),
UseQualityInfo = cms.bool(False),
UserErrorList = cms.vint32(40)
)


#HLT filter for PCC
process.ALCARECOHltFilterForPCC = cms.EDFilter("HLTHighLevel",
HLTPaths = cms.vstring("*Random*"),
eventSetupPathsKey = cms.string(""),
TriggerResultsTag = cms.InputTag("TriggerResults","","HLT"),
andOr = cms.bool(True),
throw = cms.bool(False)
)
#From the end path, this is where we specify format for our output.
process.ALCARECOStreamPromptCalibProdPCC = cms.OutputModule("PoolOutputModule",
SelectEvents = cms.untracked.PSet(
SelectEvents = cms.vstring('pathALCARECOPromptCalibProdPCC')
),
dataset = cms.untracked.PSet(
dataTier = cms.untracked.string('ALCAPROMPT'),
filterName = cms.untracked.string('PromptCalibProdPCC')
),
eventAutoFlushCompressedSize = cms.untracked.int32(5242880),
fileName = cms.untracked.string('ProdPCC_Random_Event_100.root'),
outputCommands = cms.untracked.vstring('drop *',
'keep *_alcaPCCProducerEvent_*_*',
'keep *_MEtoEDMConvertSiStrip_*_*')
)

#This is the key sequence that we are adding first...
process.seqALCARECOPromptCalibProdPCC = cms.Sequence(process.ALCARECOHltFilterForPCC+process.alcaPCCProducerEvent)

process.pathALCARECOPromptCalibProdPCC = cms.Path(process.seqALCARECOPromptCalibProdPCC)

process.seqALCARECOLumiPixels = cms.Sequence(process.siPixelDigisForLumi+process.siPixelClustersForLumi)

process.pathALCARECOLumiPixels = cms.Path(process.seqALCARECOLumiPixels)

process.ALCARECOStreamPromptCalibProdOutPath = cms.EndPath(process.ALCARECOStreamPromptCalibProdPCC)

process.MessageLogger = cms.Service("MessageLogger",
FrameworkJobReport = cms.untracked.PSet(
FwkJob = cms.untracked.PSet(
limit = cms.untracked.int32(10000000),
optionalPSet = cms.untracked.bool(True)
),
default = cms.untracked.PSet(
limit = cms.untracked.int32(0)
),
optionalPSet = cms.untracked.bool(True)
),
categories = cms.untracked.vstring('FwkJob',
'FwkReport',
'FwkSummary',
'Root_NoDictionary'),
cerr = cms.untracked.PSet(
FwkJob = cms.untracked.PSet(
limit = cms.untracked.int32(0),
optionalPSet = cms.untracked.bool(True)
),
FwkReport = cms.untracked.PSet(
limit = cms.untracked.int32(10000000),
optionalPSet = cms.untracked.bool(True),
reportEvery = cms.untracked.int32(100000)
),
FwkSummary = cms.untracked.PSet(
limit = cms.untracked.int32(10000000),
optionalPSet = cms.untracked.bool(True),
reportEvery = cms.untracked.int32(1)
),
INFO = cms.untracked.PSet(
limit = cms.untracked.int32(0)
),
Root_NoDictionary = cms.untracked.PSet(
limit = cms.untracked.int32(0),
optionalPSet = cms.untracked.bool(True)
),
default = cms.untracked.PSet(
limit = cms.untracked.int32(10000000)
),
noTimeStamps = cms.untracked.bool(False),
optionalPSet = cms.untracked.bool(True),
threshold = cms.untracked.string('INFO')
),
cerr_stats = cms.untracked.PSet(
optionalPSet = cms.untracked.bool(True),
output = cms.untracked.string('cerr'),
threshold = cms.untracked.string('WARNING')
),
cout = cms.untracked.PSet(
placeholder = cms.untracked.bool(True)
),
debugModules = cms.untracked.vstring(),
debugs = cms.untracked.PSet(
placeholder = cms.untracked.bool(True)
),
default = cms.untracked.PSet(

),
destinations = cms.untracked.vstring('warnings',
'errors',
'infos',
'debugs',
'cout',
'cerr'),
errors = cms.untracked.PSet(
placeholder = cms.untracked.bool(True)
),
fwkJobReports = cms.untracked.vstring('FrameworkJobReport'),
infos = cms.untracked.PSet(
Root_NoDictionary = cms.untracked.PSet(
limit = cms.untracked.int32(0),
optionalPSet = cms.untracked.bool(True)
),
optionalPSet = cms.untracked.bool(True),
placeholder = cms.untracked.bool(True)
),
statistics = cms.untracked.vstring('cerr_stats'),
suppressDebug = cms.untracked.vstring(),
suppressInfo = cms.untracked.vstring(),
suppressWarning = cms.untracked.vstring(),
warnings = cms.untracked.PSet(
placeholder = cms.untracked.bool(True)
)
)
#added line for additional output summary `
process.options = cms.untracked.PSet( wantSummary = cms.untracked.bool(True) )


process.schedule = cms.Schedule(*[ process.pathALCARECOPromptCalibProdPCC, process.ALCARECOStreamPromptCalibProdOutPath ])
43 changes: 43 additions & 0 deletions DataFormats/Luminosity/interface/PixelClusterCountsInEvent.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#ifndef DataFormats_Luminosity_PixelClusterCountsInEvent_h
#define DataFormats_Luminosity_PixelClusterCountsInEvent_h
/** \class reco::PixelClusterCountsInEvent
*
* Reconstructed PixelClusterCountsInEvent object that will contain the moduleID, bxID, and counts per event.
*
* \authors: Sam Higginbotham ([email protected]), Chris Palmer ([email protected]), Attila Radl ([email protected])
*
*
*/
#include <algorithm>
#include <vector>

namespace reco {
class PixelClusterCountsInEvent {
public:
PixelClusterCountsInEvent() : m_bxID() {}

void increment(int mD, int count) {
size_t modIndex = std::distance(m_ModID.begin(), std::find(m_ModID.begin(), m_ModID.end(), mD));
if (modIndex == m_ModID.size()) {
m_ModID.push_back(mD);
m_counts.push_back(0);
}
m_counts[modIndex] += count;
}

void setbxID(unsigned int inputbxID) { m_bxID = inputbxID; }

std::vector<int> const& counts() const { return (m_counts); }

std::vector<int> const& modID() const { return (m_ModID); }

unsigned int const& bxID() const { return m_bxID; }

private:
std::vector<int> m_counts;
std::vector<int> m_ModID;
unsigned int m_bxID;
};

} // namespace reco
#endif
1 change: 1 addition & 0 deletions DataFormats/Luminosity/src/classes.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@
#include "DataFormats/Luminosity/interface/LumiInfo.h"
#include "DataFormats/Luminosity/interface/BeamCurrentInfo.h"
#include "DataFormats/Luminosity/interface/PixelClusterCounts.h"
#include "DataFormats/Luminosity/interface/PixelClusterCountsInEvent.h"
6 changes: 5 additions & 1 deletion DataFormats/Luminosity/src/classes_def.xml
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,9 @@
<class name="reco::PixelClusterCounts" ClassVersion="3">
<version ClassVersion="3" checksum="1474294271"/>
</class>
<class name="edm::Wrapper<reco::PixelClusterCounts>"/>
<class name="edm::Wrapper<reco::PixelClusterCounts>"/>
<class name="reco::PixelClusterCountsInEvent" ClassVersion="3">
<version ClassVersion="3" checksum="3776858548"/>
</class>
<class name="edm::Wrapper<reco::PixelClusterCountsInEvent>"/>
</lcgdict>