Skip to content

Commit

Permalink
Merge pull request #35306 from pieterdavid/addSiStripCalCosmicsNano_120X
Browse files Browse the repository at this point in the history
[12_0_X] Add SiStripCalCosmics ALCANANO
  • Loading branch information
cmsbuild authored Sep 19, 2021
2 parents 7920ff8 + 545b041 commit 72921c7
Show file tree
Hide file tree
Showing 16 changed files with 801 additions and 152 deletions.
3 changes: 3 additions & 0 deletions CalibTracker/SiStripCommon/BuildFile.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@
<use name="DataFormats/Common"/>
<use name="DataFormats/FEDRawData"/>
<use name="DataFormats/SiStripDetId"/>
<use name="DataFormats/TrackReco"/>
<use name="DataFormats/TrackerRecHit2D"/>
<use name="DataFormats/Scalers"/>
<use name="DataFormats/OnlineMetaData"/>
<use name="DataFormats/NanoAOD"/>
<use name="FWCore/Framework"/>
<use name="FWCore/MessageLogger"/>
<use name="FWCore/Utilities"/>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#include "FWCore/Framework/interface/stream/EDProducer.h"
#include "FWCore/Framework/interface/ConsumesCollector.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"

#include "DataFormats/NanoAOD/interface/FlatTable.h"
#include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
#include "DataFormats/TrackReco/interface/Track.h"
#include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h"

class SiStripOnTrackClusterTableProducerBase : public edm::stream::EDProducer<> {
public:
explicit SiStripOnTrackClusterTableProducerBase(const edm::ParameterSet& params)
: m_name(params.getParameter<std::string>("name")),
m_doc(params.existsAs<std::string>("doc") ? params.getParameter<std::string>("doc") : ""),
m_extension(params.existsAs<bool>("extension") ? params.getParameter<bool>("extension") : true),
m_tracks_token(consumes<edm::View<reco::Track>>(params.getParameter<edm::InputTag>("Tracks"))),
m_association_token(consumes<TrajTrackAssociationCollection>(params.getParameter<edm::InputTag>("Tracks"))) {
produces<nanoaod::FlatTable>();
}
~SiStripOnTrackClusterTableProducerBase() override;

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

struct OnTrackCluster {
uint32_t det;
const SiStripCluster* cluster;
const Trajectory* traj;
const reco::Track* track;
const TrajectoryMeasurement& measurement;
OnTrackCluster(uint32_t detId,
const SiStripCluster* stripCluster,
const Trajectory* trajectory,
const reco::Track* track_,
const TrajectoryMeasurement& measurement_)
: det{detId}, cluster{stripCluster}, traj{trajectory}, track{track_}, measurement{measurement_} {}
};

virtual void fillTable(const std::vector<OnTrackCluster>& clusters,
const edm::View<reco::Track>& tracks,
nanoaod::FlatTable* table,
const edm::EventSetup& iSetup) = 0;

template <typename VALUES>
static void addColumn(nanoaod::FlatTable* table, const std::string& name, VALUES&& values, const std::string& doc) {
using value_type = typename std::remove_reference<VALUES>::type::value_type;
table->template addColumn<value_type>(name, values, doc);
}

private:
const std::string m_name;
const std::string m_doc;
bool m_extension;

const edm::EDGetTokenT<edm::View<reco::Track>> m_tracks_token;
const edm::EDGetTokenT<TrajTrackAssociationCollection> m_association_token;
};
1 change: 1 addition & 0 deletions CalibTracker/SiStripCommon/plugins/BuildFile.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<use name="CondFormats/RunInfo"/>
<use name="RecoLocalTracker/SiStripClusterizer"/>
<use name="SimDataFormats/TrackingAnalysis"/>
<use name="DataFormats/NanoAOD"/>
<library file="*.cc" name="CalibTrackerSiStripCommonPlugins">
<flags EDM_PLUGIN="1"/>
</library>
4 changes: 4 additions & 0 deletions CalibTracker/SiStripCommon/plugins/SealModules.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,7 @@ DEFINE_FWK_MODULE(ShallowSimhitClustersProducer);
DEFINE_FWK_MODULE(ShallowTracksProducer);
DEFINE_FWK_MODULE(ShallowSimTracksProducer);
DEFINE_FWK_MODULE(ShallowGainCalibration);

#include "PhysicsTools/NanoAOD/interface/SimpleFlatTableProducer.h"
typedef SimpleFlatTableProducer<reco::Track> SimpleTrackFlatTableProducer;
DEFINE_FWK_MODULE(SimpleTrackFlatTableProducer);
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
#include "FWCore/Framework/interface/global/EDProducer.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/Framework/interface/ConsumesCollector.h"
#include "DataFormats/NanoAOD/interface/FlatTable.h"

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

#include "MagneticField/Engine/interface/MagneticField.h"
#include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
#include "CondFormats/SiStripObjects/interface/SiStripLorentzAngle.h"
#include "CalibTracker/Records/interface/SiStripDependentRecords.h"
#include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"

#include "CalibTracker/SiStripCommon/interface/ShallowTools.h"

class SiStripLorentzAngleRunInfoTableProducer : public edm::global::EDProducer<edm::BeginRunProducer> {
public:
explicit SiStripLorentzAngleRunInfoTableProducer(const edm::ParameterSet& params)
: m_name{params.getParameter<std::string>("name")},
m_magFieldName{params.getParameter<std::string>("magFieldName")},
m_doc{params.existsAs<std::string>("doc") ? params.getParameter<std::string>("doc") : ""},
m_tkGeomToken{esConsumes<edm::Transition::BeginRun>()},
m_magFieldToken{esConsumes<edm::Transition::BeginRun>()},
m_lorentzAngleToken{esConsumes<edm::Transition::BeginRun>()} {
produces<nanoaod::FlatTable, edm::Transition::BeginRun>();
produces<nanoaod::FlatTable, edm::Transition::BeginRun>("magField");
}

void produce(edm::StreamID, edm::Event&, edm::EventSetup const&) const override {}

static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
edm::ParameterSetDescription desc;
desc.add<std::string>("name", "Det");
desc.add<std::string>("magFieldName", "magField");
desc.add<std::string>("doc", "Run info for the Lorentz angle measurement");
descriptions.add("siStripLorentzAngleRunInfoTable", desc);
}

void globalBeginRunProduce(edm::Run& iRun, edm::EventSetup const& iSetup) const override;

private:
const std::string m_name, m_magFieldName;
const std::string m_doc;
edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> m_tkGeomToken;
edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> m_magFieldToken;
edm::ESGetToken<SiStripLorentzAngle, SiStripLorentzAngleDepRcd> m_lorentzAngleToken;
};

namespace {
template <typename VALUES>
void addColumn(nanoaod::FlatTable* table, const std::string& name, VALUES&& values, const std::string& doc) {
using value_type = typename std::remove_reference<VALUES>::type::value_type;
table->template addColumn<value_type>(name, values, doc);
}
} // namespace

void SiStripLorentzAngleRunInfoTableProducer::globalBeginRunProduce(edm::Run& iRun,
edm::EventSetup const& iSetup) const {
const auto& tkGeom = iSetup.getData(m_tkGeomToken);
const auto& magField = iSetup.getData(m_magFieldToken);
const auto& lorentzAngle = iSetup.getData(m_lorentzAngleToken);
std::vector<uint32_t> c_rawid;
std::vector<float> c_globalZofunitlocalY, c_localB, c_BdotY, c_driftx, c_drifty, c_driftz, c_lorentzAngle;

auto dets = tkGeom.detsTIB();
dets.insert(dets.end(), tkGeom.detsTID().begin(), tkGeom.detsTID().end());
dets.insert(dets.end(), tkGeom.detsTOB().begin(), tkGeom.detsTOB().end());
dets.insert(dets.end(), tkGeom.detsTEC().begin(), tkGeom.detsTEC().end());
for (auto det : dets) {
auto detid = det->geographicalId().rawId();
const StripGeomDetUnit* stripDet = dynamic_cast<const StripGeomDetUnit*>(tkGeom.idToDet(det->geographicalId()));
if (stripDet) {
c_rawid.push_back(detid);
c_globalZofunitlocalY.push_back(stripDet->toGlobal(LocalVector(0, 1, 0)).z());
const auto locB = magField.inTesla(stripDet->surface().position());
c_localB.push_back(locB.mag());
c_BdotY.push_back(stripDet->surface().toLocal(locB).y());
const auto drift = shallow::drift(stripDet, magField, lorentzAngle);
c_driftx.push_back(drift.x());
c_drifty.push_back(drift.y());
c_driftz.push_back(drift.z());
c_lorentzAngle.push_back(lorentzAngle.getLorentzAngle(detid));
}
}
auto out = std::make_unique<nanoaod::FlatTable>(c_rawid.size(), m_name, false, false);
addColumn(out.get(), "rawid", c_rawid, "DetId");
addColumn(out.get(), "globalZofunitlocalY", c_globalZofunitlocalY, "z component of a local unit vector along y");
addColumn(out.get(), "localB", c_localB, "Local magnitude of the magnetic field");
addColumn(out.get(), "BdotY", c_BdotY, "Magnetic field projection on the local y axis");
addColumn(out.get(), "driftx", c_driftx, "x component of the drift vector");
addColumn(out.get(), "drifty", c_drifty, "y component of the drift vector");
addColumn(out.get(), "driftz", c_driftz, "z component of the drift vector");
addColumn(out.get(), "lorentzAngle", c_lorentzAngle, "Lorentz angle from database");
iRun.put(std::move(out));

auto out2 = std::make_unique<nanoaod::FlatTable>(1, m_magFieldName, true, false);
out2->addColumnValue<float>(
"origin", magField.inTesla(GlobalPoint(0, 0, 0)).z(), "z-component of the magnetic field at (0,0,0) in Tesla");
iRun.put(std::move(out2), "magField");
}

#include "FWCore/PluginManager/interface/ModuleDef.h"
#include "FWCore/Framework/interface/MakerMacros.h"
DEFINE_FWK_MODULE(SiStripLorentzAngleRunInfoTableProducer);
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"

#include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"

#include "RecoLocalTracker/SiStripClusterizer/interface/SiStripClusterInfo.h"

#include "CalibTracker/SiStripCommon/interface/SiStripOnTrackClusterTableProducerBase.h"

class SiStripPositionCorrectionsTableProducer : public SiStripOnTrackClusterTableProducerBase {
public:
explicit SiStripPositionCorrectionsTableProducer(const edm::ParameterSet& params)
: SiStripOnTrackClusterTableProducerBase(params),
m_clusterInfo(consumesCollector()),
m_tkGeomToken{esConsumes<>()} {}

static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
edm::ParameterSetDescription desc;
desc.add<std::string>("name", "cluster");
desc.add<std::string>("doc", "On-track cluster properties for Lorentz angle and backplane correction measurement");
desc.add<bool>("extension", false);
desc.add<edm::InputTag>("Tracks", edm::InputTag{"generalTracks"});
descriptions.add("siStripPositionCorrectionsTable", desc);
}

void fillTable(const std::vector<OnTrackCluster>& clusters,
const edm::View<reco::Track>& tracks,
nanoaod::FlatTable* table,
const edm::EventSetup& iSetup) final;

private:
SiStripClusterInfo m_clusterInfo;
edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> m_tkGeomToken;
};

void SiStripPositionCorrectionsTableProducer::fillTable(const std::vector<OnTrackCluster>& clusters,
const edm::View<reco::Track>& tracks,
nanoaod::FlatTable* table,
const edm::EventSetup& iSetup) {
const auto& tkGeom = iSetup.getData(m_tkGeomToken);
std::vector<uint32_t> c_nstrips;
std::vector<float> c_barycenter, c_variance, c_localdirx, c_localdiry, c_localdirz, c_localx, c_rhlocalx,
c_rhlocalxerr;
for (const auto clus : clusters) {
c_nstrips.push_back(clus.cluster->amplitudes().size());
m_clusterInfo.setCluster(*clus.cluster, clus.det);
c_variance.push_back(m_clusterInfo.variance());
const auto& trajState = clus.measurement.updatedState();
const auto trackDir = trajState.localDirection();
c_localdirx.push_back(trackDir.x());
c_localdiry.push_back(trackDir.y());
c_localdirz.push_back(trackDir.z());
const auto hit = clus.measurement.recHit()->hit();
const auto stripDet = dynamic_cast<const StripGeomDetUnit*>(tkGeom.idToDet(hit->geographicalId()));
c_barycenter.push_back(stripDet->specificTopology().localPosition(clus.cluster->barycenter()).x());
c_localx.push_back(stripDet->toLocal(trajState.globalPosition()).x());
c_rhlocalx.push_back(hit->localPosition().x());
c_rhlocalxerr.push_back(hit->localPositionError().xx());
}
addColumn(table, "nstrips", c_nstrips, "cluster width");
addColumn(table, "variance", c_variance, "Cluster variance");
addColumn(table, "localdirx", c_localdirx, "x component of the local track direction");
addColumn(table, "localdiry", c_localdiry, "y component of the local track direction");
addColumn(table, "localdirz", c_localdirz, "z component of the local track direction");
addColumn(table, "barycenter", c_barycenter, "Cluster barycenter (local x without corrections)");
addColumn(table, "localx", c_localx, "Track local x");
addColumn(table, "rhlocalx", c_rhlocalx, "RecHit local x");
addColumn(table, "rhlocalxerr", c_rhlocalxerr, "RecHit local x uncertainty");
}

#include "FWCore/PluginManager/interface/ModuleDef.h"
#include "FWCore/Framework/interface/MakerMacros.h"
DEFINE_FWK_MODULE(SiStripPositionCorrectionsTableProducer);
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2D.h"
#include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2D.h"
#include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit1D.h"

#include "CalibTracker/SiStripCommon/interface/SiStripOnTrackClusterTableProducerBase.h"

SiStripOnTrackClusterTableProducerBase::~SiStripOnTrackClusterTableProducerBase() {}

namespace {
int findTrackIndex(const edm::View<reco::Track>& tracks, const reco::Track* track) {
for (auto iTr = tracks.begin(); iTr != tracks.end(); ++iTr) {
if (&(*iTr) == track) {
return iTr - tracks.begin();
}
}
return -2;
}
} // namespace

void SiStripOnTrackClusterTableProducerBase::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
edm::Handle<edm::View<reco::Track>> tracks;
iEvent.getByToken(m_tracks_token, tracks);
edm::Handle<TrajTrackAssociationCollection> trajTrackAssociations;
iEvent.getByToken(m_association_token, trajTrackAssociations);

std::vector<OnTrackCluster> clusters{};

for (const auto& assoc : *trajTrackAssociations) {
const auto traj = assoc.key.get();
const auto track = assoc.val.get();

for (const auto& meas : traj->measurements()) {
const auto& trajState = meas.updatedState();
if (!trajState.isValid())
continue;

// there can be 2 (stereo module), 1 (no stereo module), or 0 (no strip hit) clusters per measurement
const auto trechit = meas.recHit()->hit();
const auto simple1d = dynamic_cast<const SiStripRecHit1D*>(trechit);
const auto simple = dynamic_cast<const SiStripRecHit2D*>(trechit);
const auto matched = dynamic_cast<const SiStripMatchedRecHit2D*>(trechit);
if (matched) {
clusters.emplace_back(matched->monoId(), &matched->monoCluster(), traj, track, meas);
clusters.emplace_back(matched->stereoId(), &matched->stereoCluster(), traj, track, meas);
} else if (simple) {
clusters.emplace_back(simple->geographicalId().rawId(), simple->cluster().get(), traj, track, meas);
} else if (simple1d) {
clusters.emplace_back(simple1d->geographicalId().rawId(), simple1d->cluster().get(), traj, track, meas);
}
}
}

auto out = std::make_unique<nanoaod::FlatTable>(clusters.size(), m_name, false, m_extension);
if (!m_extension) {
std::vector<int> c_trackindex;
c_trackindex.reserve(clusters.size());
std::vector<uint32_t> c_rawid;
c_rawid.reserve(clusters.size());
for (const auto clus : clusters) {
c_trackindex.push_back(findTrackIndex(*tracks, clus.track));
c_rawid.push_back(clus.det);
}
addColumn(out.get(), "trackindex", c_trackindex, "Track index");
addColumn(out.get(), "rawid", c_rawid, "DetId");
}
fillTable(clusters, *tracks, out.get(), iSetup);
iEvent.put(std::move(out));
}
Loading

0 comments on commit 72921c7

Please sign in to comment.