Skip to content

Commit

Permalink
First commit for TkDQM barycenter plots
Browse files Browse the repository at this point in the history
  • Loading branch information
dmeuser committed Jun 1, 2021
1 parent 601fbc5 commit 45d54f9
Show file tree
Hide file tree
Showing 7 changed files with 324 additions and 0 deletions.
Expand Up @@ -14,6 +14,7 @@
+ SiPixelPhase1RawDataHarvester
+ RunQTests_offline
+ SiPixelPhase1SummaryOffline
+ SiPixelPhase1BarycenterOffline
)

siPixelPhase1OfflineDQM_harvesting_cosmics = siPixelPhase1OfflineDQM_harvesting.copyAndExclude([
Expand Down
Expand Up @@ -19,6 +19,8 @@
from DQM.SiPixelPhase1Common.SiPixelPhase1RawData_cfi import *
#Summary maps
from DQM.SiPixelPhase1Summary.SiPixelPhase1Summary_cfi import *
#Barycenter plots
from DQM.SiPixelPhase1Summary.SiPixelPhase1Barycenter_cfi import *

from RecoPixelVertexing.PixelLowPtUtilities.ClusterShapeHitFilterESProducer_cfi import *
from RecoLocalTracker.SiStripClusterizer.SiStripClusterChargeCut_cfi import *
Expand Down
1 change: 1 addition & 0 deletions DQM/SiPixelPhase1Summary/BuildFile.xml
Expand Up @@ -5,5 +5,6 @@
<use name="Geometry/CommonDetUnit"/>
<use name="Geometry/Records"/>
<use name="Geometry/TrackerGeometryBuilder"/>
<use name="CalibTracker/StandaloneTrackerTopology"/>
<use name="boost"/>
<flags EDM_PLUGIN="1"/>
59 changes: 59 additions & 0 deletions DQM/SiPixelPhase1Summary/interface/SiPixelPhase1Barycenter.h
@@ -0,0 +1,59 @@
#ifndef SiPixelPhase1Barycenter_SiPixelPhase1Barycenter_h
#define SiPixelPhase1Barycenter_SiPixelPhase1Barycenter_h
// -*- C++ -*-
//
// Package: SiPixelPhase1Barycenter
// Class : SiPixelPhase1Barycenter
//
/**
Description: Barycenter plot generation for the Phase 1 pixel

This comment has been minimized.

Copy link
@mmusich

mmusich Jun 1, 2021

Contributor

this doesn't necessarily apply only to phase1 though, right?

This comment has been minimized.

Copy link
@dmeuser

dmeuser Jun 1, 2021

Author Contributor

Right. Are you just referring to the comment in line 10 or are there other changes needed to be able to recycle this for phase2?

This comment has been minimized.

Copy link
@mmusich

mmusich Jun 1, 2021

Contributor

Perhaps just remove "Phase-1" from the module name, and then someone will decide in future if to move it elsewhere.

Usage:
<usage>
*/
//
// Original Author: Danilo Meuser
// Created: 26th May 2021
//

// user include files
#include "FWCore/Framework/interface/MakerMacros.h"

#include "DQMServices/Core/interface/DQMStore.h"
#include "DQMServices/Core/interface/DQMEDHarvester.h"

#include "FWCore/Framework/interface/EventSetup.h"
#include "FWCore/Framework/interface/LuminosityBlock.h"

#include "CondFormats/AlignmentRecord/interface/TrackerAlignmentRcd.h"
#include "CondFormats/AlignmentRecord/interface/GlobalPositionRcd.h"
#include "CondFormats/Alignment/interface/Alignments.h"

class SiPixelPhase1Barycenter : public DQMEDHarvester {
public:
explicit SiPixelPhase1Barycenter(const edm::ParameterSet& conf);
~SiPixelPhase1Barycenter() override;

protected:
void beginRun(edm::Run const& run, edm::EventSetup const& eSetup) override;

void dqmEndLuminosityBlock(DQMStore::IBooker& iBooker,
DQMStore::IGetter& iGetter,
edm::LuminosityBlock const& lumiSeg,
edm::EventSetup const& c) override;
void dqmEndJob(DQMStore::IBooker& iBooker, DQMStore::IGetter& iGetter) override;

private:
std::map<std::string, MonitorElement*> barycenters_;

//book the barycenter histograms
void bookBarycenterHistograms(DQMStore::IBooker& iBooker);

//fill the barycenter histograms
void fillBarycenterHistograms(DQMStore::IBooker& iBooker, DQMStore::IGetter& iGetter, const std::vector<AlignTransform>& input, const std::vector<AlignTransform>& GPR);

};

#endif
141 changes: 141 additions & 0 deletions DQM/SiPixelPhase1Summary/interface/SiPixelPhase1BarycenterHelper.h
@@ -0,0 +1,141 @@
#ifndef SiPixelPhase1Barycenter_SiPixelPhase1BarycenterHelper_h
#define SiPixelPhase1Barycenter_SiPixelPhase1BarycenterHelper_h

This comment has been minimized.

Copy link
@mmusich

mmusich Jun 1, 2021

Contributor

usually one has Subsystem_Package_Class_h inclusion guards


#include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "CondFormats/Alignment/interface/Alignments.h"

// Helper mainly based on https://github.com/cms-sw/cmssw/blob/master/CondCore/AlignmentPlugins/interface/AlignmentPayloadInspectorHelper.h

namespace DQMBarycenter {

enum coordinate {
t_x = 1,
t_y = 2,
t_z = 3,
rot_alpha = 4,
rot_beta = 5,
rot_gamma = 6,
};

enum partitions { BPix = 1, FPix_p = 2, FPix_m = 3, };

enum class PARTITION {
BPIX, // 0 Barrel Pixel
FPIXp, // 1 Forward Pixel Plus
FPIXm, // 2 Forward Pixel Minus
LAST = FPIXm
};

extern const PARTITION PARTITIONS[(int)PARTITION::LAST + 1];
const PARTITION PARTITIONS[] = {PARTITION::BPIX,
PARTITION::FPIXp,
PARTITION::FPIXm,
};


struct TkAlBarycenters {

This comment has been minimized.

Copy link
@mmusich

mmusich Jun 1, 2021

Contributor

any reason why not a class?

This comment has been minimized.

Copy link
@dmeuser

dmeuser Jun 1, 2021

Author Contributor

Mainly because I used https://github.com/cms-sw/cmssw/blob/master/CondCore/AlignmentPlugins/interface/AlignmentPayloadInspectorHelper.h as a blueprint. But I can change it to a class if you prefer.

This comment has been minimized.

Copy link
@mmusich

mmusich Jun 1, 2021

Contributor

thinking it better, perhaps a class is more appropriate for something doing complicated operations as the TkAlBarycenters::computeBarycenter method is doing (critizing here my own choice of the past :))

std::map<DQMBarycenter::PARTITION, double> Xbarycenters;
std::map<DQMBarycenter::PARTITION, double> Ybarycenters;
std::map<DQMBarycenter::PARTITION, double> Zbarycenters;
std::map<DQMBarycenter::PARTITION, double> nmodules;

public:
void init();
void computeBarycenters(const std::vector<AlignTransform>& input,
const TrackerTopology& tTopo,
const std::map<DQMBarycenter::coordinate, float>& GPR);


/*--------------------------------------------------------------------*/
const std::array<double, 3> getX()
/*--------------------------------------------------------------------*/
{
return {{Xbarycenters[PARTITION::BPIX],
Xbarycenters[PARTITION::FPIXm],
Xbarycenters[PARTITION::FPIXp]
}};
};

/*--------------------------------------------------------------------*/
const std::array<double, 3> getY()
/*--------------------------------------------------------------------*/
{
return {{Ybarycenters[PARTITION::BPIX],
Ybarycenters[PARTITION::FPIXm],
Ybarycenters[PARTITION::FPIXp]
}};
};

/*--------------------------------------------------------------------*/
const std::array<double, 3> getZ()
/*--------------------------------------------------------------------*/
{
return {{Zbarycenters[PARTITION::BPIX],
Zbarycenters[PARTITION::FPIXm],
Zbarycenters[PARTITION::FPIXp]
}};
};
virtual ~TkAlBarycenters() {}
};

/*--------------------------------------------------------------------*/
void TkAlBarycenters::computeBarycenters(const std::vector<AlignTransform>& input,
const TrackerTopology& tTopo,
const std::map<DQMBarycenter::coordinate, float>& GPR)
/*--------------------------------------------------------------------*/
{
for (const auto& ali : input) {
if (DetId(ali.rawId()).det() != DetId::Tracker) {
edm::LogWarning("SiPixelPhase1Barycenters::computeBarycenters")
<< "Encountered invalid Tracker DetId:" << ali.rawId() << " " << DetId(ali.rawId()).det()
<< " is different from " << DetId::Tracker << " - terminating ";
assert(DetId(ali.rawId()).det() != DetId::Tracker);
}

int subid = DetId(ali.rawId()).subdetId();
if (subid==PixelSubdetector::PixelBarrel || subid==PixelSubdetector::PixelEndcap) { // use only pixel
switch (subid) {
case PixelSubdetector::PixelBarrel:
Xbarycenters[PARTITION::BPIX] += (ali.translation().x());
Ybarycenters[PARTITION::BPIX] += (ali.translation().y());
Zbarycenters[PARTITION::BPIX] += (ali.translation().z());
nmodules[PARTITION::BPIX]++;
break;
case PixelSubdetector::PixelEndcap:

// minus side
if (tTopo.pxfSide(DetId(ali.rawId())) == 1) {
Xbarycenters[PARTITION::FPIXm] += (ali.translation().x());
Ybarycenters[PARTITION::FPIXm] += (ali.translation().y());
Zbarycenters[PARTITION::FPIXm] += (ali.translation().z());
nmodules[PARTITION::FPIXm]++;
} // plus side
else {
Xbarycenters[PARTITION::FPIXp] += (ali.translation().x());
Ybarycenters[PARTITION::FPIXp] += (ali.translation().y());
Zbarycenters[PARTITION::FPIXp] += (ali.translation().z());
nmodules[PARTITION::FPIXp]++;
}
break;
default:
edm::LogError("PixelDQM") << "Unrecognized partition for barycenter computation " << subid << std::endl;
break;
}
}
}

for (const auto& p : PARTITIONS) {
Xbarycenters[p] /= nmodules[p];
Ybarycenters[p] /= nmodules[p];
Zbarycenters[p] /= nmodules[p];

Xbarycenters[p] += GPR.at(DQMBarycenter::t_x);
Ybarycenters[p] += GPR.at(DQMBarycenter::t_y);
Zbarycenters[p] += GPR.at(DQMBarycenter::t_z);

}
}
} // namespace DQMBarycenter

#endif
@@ -0,0 +1,8 @@
import FWCore.ParameterSet.Config as cms
from DQMServices.Core.DQMEDHarvester import DQMEDHarvester

#
# This object is used to make changes for different running scenarios
#

SiPixelPhase1BarycenterOffline = DQMEDHarvester("SiPixelPhase1Barycenter")
112 changes: 112 additions & 0 deletions DQM/SiPixelPhase1Summary/src/SiPixelPhase1Barycenter.cc
@@ -0,0 +1,112 @@
// -*- C++ -*-
//
// Package: SiPixelPhase1Barycenter
// Class: SiPixelPhase1Barycenter
//
/**\class
Description: Create the Phase 1 pixel barycenter plots
Implementation:
<Notes on implementation>
*/
//
// Original Author: Danilo Meuser
// Created: 26th May 2021
//
//
#include "DQM/SiPixelPhase1Summary/interface/SiPixelPhase1Barycenter.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "DQM/SiPixelPhase1Summary/interface/SiPixelPhase1BarycenterHelper.h"
#include "CalibTracker/StandaloneTrackerTopology/interface/StandaloneTrackerTopology.h"

#include <string>
#include <iostream>

using namespace std;
using namespace edm;

SiPixelPhase1Barycenter::SiPixelPhase1Barycenter(const edm::ParameterSet& iConfig)
: DQMEDHarvester(iConfig) {
LogInfo("PixelDQM") << "SiPixelPhase1Barycenter::SiPixelPhase1Barycenter: Got DQM BackEnd interface" << endl;

}

SiPixelPhase1Barycenter::~SiPixelPhase1Barycenter() {
// do anything here that needs to be done at desctruction time
// (e.g. close files, deallocate resources etc.)
LogInfo("PixelDQM") << "SiPixelPhase1Barycenter::~SiPixelPhase1Barycenter: Destructor" << endl;
}

void SiPixelPhase1Barycenter::beginRun(edm::Run const& run, edm::EventSetup const& eSetup) {}

void SiPixelPhase1Barycenter::dqmEndJob(DQMStore::IBooker& iBooker, DQMStore::IGetter& iGetter) {}

void SiPixelPhase1Barycenter::dqmEndLuminosityBlock(DQMStore::IBooker& iBooker,
DQMStore::IGetter& iGetter,
const edm::LuminosityBlock& lumiSeg,
edm::EventSetup const& c) {


bookBarycenterHistograms(iBooker);

edm::ESHandle<Alignments> alignment_Handle;
c.get<TrackerAlignmentRcd>().get(alignment_Handle);

This comment has been minimized.


edm::ESHandle<Alignments> gpr_Handle;

This comment has been minimized.

c.get<GlobalPositionRcd>().get(gpr_Handle);

fillBarycenterHistograms(iBooker, iGetter,alignment_Handle->m_align,gpr_Handle->m_align);

}
//------------------------------------------------------------------
// Used to book the barycenter histograms
//------------------------------------------------------------------
void SiPixelPhase1Barycenter::bookBarycenterHistograms(DQMStore::IBooker& iBooker) {
iBooker.cd();

iBooker.setCurrentFolder("PixelPhase1/Barycenter");
//Book one histogram for each subdetector
for (std::string subdetector : {"BPIX", "FPIXm", "FPIXp"}) {
barycenters_[subdetector] =
iBooker.book1D("barycenters_" + subdetector,
"Position of the barycenter for " + subdetector + ";Coordinate;Position [mm]",
3,
0.5,
3.5);
barycenters_[subdetector]->setBinLabel(1, "x");
barycenters_[subdetector]->setBinLabel(2, "y");
barycenters_[subdetector]->setBinLabel(3, "z");
}

//Reset the iBooker
iBooker.setCurrentFolder("PixelPhase1/");
}

//------------------------------------------------------------------
// Fill the Barycenter histograms
//------------------------------------------------------------------
void SiPixelPhase1Barycenter::fillBarycenterHistograms(DQMStore::IBooker& iBooker, DQMStore::IGetter& iGetter, const std::vector<AlignTransform>& input, const std::vector<AlignTransform>& GPR) {

const auto GPR_translation_pixel = GPR[0].translation();
const std::map<DQMBarycenter::coordinate, float> GPR_pixel = {{DQMBarycenter::t_x, GPR_translation_pixel.x()}, {DQMBarycenter::t_y, GPR_translation_pixel.y()}, {DQMBarycenter::t_z, GPR_translation_pixel.z()}};

DQMBarycenter::TkAlBarycenters barycenters;
TrackerTopology tTopo = StandaloneTrackerTopology::fromTrackerParametersXMLFile(edm::FileInPath("Geometry/TrackerCommonData/data/PhaseI/trackerParameters.xml").fullPath());

This comment has been minimized.

Copy link
@mmusich

mmusich Jun 1, 2021

Contributor

there's not need to hardcode the topology here, you can just take it from the eventSetup.

barycenters.computeBarycenters(input, tTopo, GPR_pixel);

auto Xbarycenters = barycenters.getX();
auto Ybarycenters = barycenters.getY();
auto Zbarycenters = barycenters.getZ();

//Fill histogram for each subdetector
std::vector<std::string> subdetectors = {"BPIX", "FPIXm", "FPIXp"};
for(std::size_t i = 0; i < subdetectors.size(); ++i) {
barycenters_[subdetectors[i]]->setBinContent(1,Xbarycenters[i]);
barycenters_[subdetectors[i]]->setBinContent(2,Ybarycenters[i]);
barycenters_[subdetectors[i]]->setBinContent(3,Zbarycenters[i]);
}
}

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

0 comments on commit 45d54f9

Please sign in to comment.