Skip to content

Commit

Permalink
Merge pull request #26157 from Mourtz/timeLayerCluster
Browse files Browse the repository at this point in the history
Implemented time window selection for HGCalLayerClusters
  • Loading branch information
cmsbuild authored Mar 15, 2019
2 parents 7ab4659 + 2611f23 commit edf6f75
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 33 deletions.
4 changes: 2 additions & 2 deletions Fireworks/Calo/interface/FWHeatmapProxyBuilderTemplate.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ class FWHeatmapProxyBuilderTemplate : public FWSimpleProxyBuilder {
protected:
std::map<DetId, const HGCRecHit*> hitmap;

static const uint8_t gradient_steps = 9;
const float gradient[3][gradient_steps] = {
static constexpr uint8_t gradient_steps = 9;
static constexpr uint8_t gradient[3][gradient_steps] = {
{0.2082*255, 0.0592*255, 0.0780*255, 0.0232*255, 0.1802*255, 0.5301*255, 0.8186*255, 0.9956*255, 0.9764*255},
{0.1664*255, 0.3599*255, 0.5041*255, 0.6419*255, 0.7178*255, 0.7492*255, 0.7328*255, 0.7862*255, 0.9832*255},
{0.5293*255, 0.8684*255, 0.8385*255, 0.7914*255, 0.6425*255, 0.4662*255, 0.3499*255, 0.1968*255, 0.0539*255}
Expand Down
116 changes: 85 additions & 31 deletions Fireworks/Calo/plugins/FWCaloClusterProxyBuilder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
#include "Fireworks/Core/interface/FWEventItem.h"
#include "Fireworks/Core/interface/FWGeometry.h"
#include "Fireworks/Core/interface/BuilderUtils.h"
#include "DataFormats/CaloRecHit/interface/CaloCluster.h"
#include "DataFormats/CaloRecHit/interface/CaloClusterFwd.h"
#include "DataFormats/Common/interface/ValueMap.h"

#include "TEveBoxSet.h"
#include "TEveStraightLineSet.h"
Expand All @@ -16,33 +17,79 @@ class FWCaloClusterProxyBuilder : public FWHeatmapProxyBuilderTemplate<reco::Cal
REGISTER_PROXYBUILDER_METHODS();

private:
edm::Handle<edm::ValueMap<float>> TimeValueMapHandle;
double timeLowerBound, timeUpperBound;
long layer;
double saturation_energy;
bool heatmap;
bool z_plus;
bool z_minus;
bool enableTimeFilter;

FWCaloClusterProxyBuilder(const FWCaloClusterProxyBuilder &) = delete; // stop default
const FWCaloClusterProxyBuilder &operator=(const FWCaloClusterProxyBuilder &) = delete; // stop default


void setItem(const FWEventItem *iItem) override;

void build(const FWEventItem *iItem, TEveElementList *product, const FWViewContext *vc) override;
void build(const reco::CaloCluster &iData, unsigned int iIndex, TEveElement &oItemHolder, const FWViewContext *) override;
};

void FWCaloClusterProxyBuilder::setItem(const FWEventItem *iItem)
{
FWHeatmapProxyBuilderTemplate::setItem(iItem);
if (iItem)
{
iItem->getConfig()->assertParam("Cluster(0)/RecHit(1)", false);
iItem->getConfig()->assertParam("EnableTimeFilter", false);
iItem->getConfig()->assertParam("TimeLowerBound(ns)", 0.01, 0.0, 75.0);
iItem->getConfig()->assertParam("TimeUpperBound(ns)", 0.01, 0.0, 75.0);
}
}

void FWCaloClusterProxyBuilder::build(const FWEventItem *iItem, TEveElementList *product, const FWViewContext *vc)
{
iItem->getEvent()->getByLabel(edm::InputTag("hgcalLayerClusters", "timeLayerCluster"), TimeValueMapHandle);
if(TimeValueMapHandle.isValid()){
timeLowerBound = std::min(item()->getConfig()->value<double>("TimeLowerBound(ns)"), item()->getConfig()->value<double>("TimeUpperBound(ns)"));
timeUpperBound = std::max(item()->getConfig()->value<double>("TimeLowerBound(ns)"), item()->getConfig()->value<double>("TimeUpperBound(ns)"));
}
else {
std::cerr << "Warning: couldn't locate 'timeLayerCluster' ValueMap in root file." << std::endl;
}

layer = item()->getConfig()->value<long>("Layer");
saturation_energy = item()->getConfig()->value<double>("EnergyCutOff");
heatmap = item()->getConfig()->value<bool>("Heatmap");
z_plus = item()->getConfig()->value<bool>("Z+");
z_minus = item()->getConfig()->value<bool>("Z-");
enableTimeFilter = item()->getConfig()->value<bool>("EnableTimeFilter");

FWHeatmapProxyBuilderTemplate::build(iItem, product, vc);
}

void FWCaloClusterProxyBuilder::build(const reco::CaloCluster &iData, unsigned int iIndex, TEveElement &oItemHolder, const FWViewContext *)
{
const long layer = item()->getConfig()->value<long>("Layer");
const double saturation_energy = item()->getConfig()->value<double>("EnergyCutOff");
const bool heatmap = item()->getConfig()->value<bool>("Heatmap");
const bool z_plus = item()->getConfig()->value<bool>("Z+");
const bool z_minus = item()->getConfig()->value<bool>("Z-");
if (enableTimeFilter && TimeValueMapHandle.isValid())
{
const float time = TimeValueMapHandle->get(iIndex);
if (time < timeLowerBound || time > timeUpperBound)
return;
}

std::vector<std::pair<DetId, float>> clusterDetIds = iData.hitsAndFractions();

bool h_hex(false);
TEveBoxSet *hex_boxset = new TEveBoxSet();
if(!heatmap)
if (!heatmap)
hex_boxset->UseSingleColor();
hex_boxset->SetPickable(true);
hex_boxset->Reset(TEveBoxSet::kBT_Hex, true, 64);
hex_boxset->SetAntiFlick(true);

bool h_box(false);
TEveBoxSet *boxset = new TEveBoxSet();
if(!heatmap)
if (!heatmap)
boxset->UseSingleColor();
boxset->SetPickable(true);
boxset->Reset(TEveBoxSet::kBT_FreeBox, true, 64);
Expand All @@ -61,7 +108,7 @@ void FWCaloClusterProxyBuilder::build(const reco::CaloCluster &iData, unsigned i
if (iData.algo() == 8 || (type >= 8 && type <= 10))
{

if(heatmap && hitmap.find(it->first) == hitmap.end())
if (heatmap && hitmap.find(it->first) == hitmap.end())
continue;

const bool z = (it->first >> 25) & 0x1;
Expand Down Expand Up @@ -105,21 +152,24 @@ void FWCaloClusterProxyBuilder::build(const reco::CaloCluster &iData, unsigned i
}

// seed
if(iData.seed().rawId() == it->first.rawId()){
if (iData.seed().rawId() == it->first.rawId())
{
TEveStraightLineSet *marker = new TEveStraightLineSet;
marker->SetLineWidth( 1 );
marker->SetLineWidth(1);

// center of RecHit
float center[3] = {
corners[0], corners[1], corners[2]+shapes[3]*0.5f
};
corners[0], corners[1], corners[2] + shapes[3] * 0.5f};

if (isScintillator){
if (isScintillator)
{
constexpr int offset = 9;

center[0] = (corners[6] + corners[6 + offset]) / 2;
center[1] = (corners[7] + corners[7 + offset]) / 2;
} else {
}
else
{
float min[2] = {1e3f, 1e3f};
float max[2] = {-1e3f, -1e3f};

Expand All @@ -139,21 +189,21 @@ void FWCaloClusterProxyBuilder::build(const reco::CaloCluster &iData, unsigned i
// draw 3D cross
const float crossScale = 1.0f + fmin(iData.energy(), 5.0f);
marker->AddLine(
center[0]-crossScale, center[1], center[2],
center[0]+crossScale, center[1], center[2]
);
center[0] - crossScale, center[1], center[2],
center[0] + crossScale, center[1], center[2]);
marker->AddLine(
center[0], center[1]-crossScale, center[2],
center[0], center[1]+crossScale, center[2]
);
center[0], center[1] - crossScale, center[2],
center[0], center[1] + crossScale, center[2]);
marker->AddLine(
center[0], center[1], center[2]-crossScale,
center[0], center[1], center[2]+crossScale
);
center[0], center[1], center[2] - crossScale,
center[0], center[1], center[2] + crossScale);

oItemHolder.AddElement(marker);
}

const float energy = fmin((item()->getConfig()->value<bool>("Cluster(0)/RecHit(1)") ? hitmap[it->first]->energy() : iData.energy()) / saturation_energy, 1.0f);
const uint8_t colorFactor = gradient_steps*energy;

// Scintillator
if (isScintillator)
{
Expand All @@ -171,9 +221,11 @@ void FWCaloClusterProxyBuilder::build(const reco::CaloCluster &iData, unsigned i
pnts[(i * 3 + 2) + total_vertices] = corners[i * 3 + 2] + shapes[3];
}
boxset->AddBox(&pnts[0]);
if(heatmap) {
const uint8_t colorFactor = gradient_steps*(fmin(hitmap[it->first]->energy()/saturation_energy, 1.0f));
boxset->DigitColor(gradient[0][colorFactor], gradient[1][colorFactor], gradient[2][colorFactor]);
if (heatmap)
{
energy ?
boxset->DigitColor(gradient[0][colorFactor], gradient[1][colorFactor], gradient[2][colorFactor]) :
boxset->DigitColor(64, 64, 64);
}

h_box = true;
Expand All @@ -188,9 +240,11 @@ void FWCaloClusterProxyBuilder::build(const reco::CaloCluster &iData, unsigned i
float radius = fabs(corners[6] - corners[6 + offset]) / 2;
hex_boxset->AddHex(TEveVector(centerX, centerY, corners[2]),
radius, 90.0, shapes[3]);
if(heatmap) {
const uint8_t colorFactor = gradient_steps*(fmin(hitmap[it->first]->energy()/saturation_energy, 1.0f));
hex_boxset->DigitColor(gradient[0][colorFactor], gradient[1][colorFactor], gradient[2][colorFactor]);
if (heatmap)
{
energy ?
hex_boxset->DigitColor(gradient[0][colorFactor], gradient[1][colorFactor], gradient[2][colorFactor]) :
hex_boxset->DigitColor(64, 64, 64);
}

h_hex = true;
Expand Down

0 comments on commit edf6f75

Please sign in to comment.