7 #include <fmt/printf.h>
14 #include <TLegendEntry.h>
16 #include <TProfile2D.h>
40 std::vector<const DDsvalues_type *>
result;
42 for (std::vector<const DDsvalues_type *>::iterator it = result.begin(); it != result.end(); ++it) {
45 if (parameter.
strings().size() == 1) {
46 value = parameter.
strings().front();
49 throw cms::Exception(
"Configuration") <<
" ERROR: multiple " << name <<
" tags encountered";
95 std::vector<MaterialAccountingGroup *>
m_groups;
108 std::map<std::string, std::pair<float, float> >
m_diff;
109 std::map<std::string, std::pair<float, float> >
m_values;
113 : m_saveSummaryPlot(iPSet.getUntrackedParameter<bool>(
"SaveSummaryPlot")),
117 TColor::InitializeColors();
136 unsigned int steps = 100;
138 unsigned int index = ((TObjArray *)gROOT->GetListOfColors())->GetLast() + 1;
141 static_cast<TColor *
>(gROOT->GetListOfColors()->At(kBlue + 1))->GetRGB(r1, g1, b1);
142 static_cast<TColor *
>(gROOT->GetListOfColors()->At(kAzure + 10))->GetRGB(r2, g2, b2);
144 float delta_g = (g2 -
g1) / (steps - 1);
145 float delta_b = (b2 -
b1) / (steps - 1);
149 for (
unsigned int i = 0;
i <
steps; ++
i, ++
ii) {
150 new TColor(static_cast<Int_t>(index + ii), r1 + delta_r *
i, g1 + delta_g * i, b1 + delta_b * i);
156 static_cast<TColor *
>(gROOT->GetListOfColors()->At(kOrange))->GetRGB(r1, g1, b1);
157 static_cast<TColor *
>(gROOT->GetListOfColors()->At(kOrange + 7))->GetRGB(r2, g2, b2);
158 delta_r = (r2 -
r1) / (steps - 1);
159 delta_g = (g2 -
g1) / (steps - 1);
160 delta_b = (b2 -
b1) / (steps - 1);
161 for (
unsigned int i = 0;
i <
steps; ++
i, ++
ii) {
162 new TColor(static_cast<Int_t>(index + ii), r1 + delta_r *
i, g1 + delta_g * i, b1 + delta_b * i);
185 m_color.push_back(kSpring + 9);
186 m_color.push_back(kSpring + 4);
203 m_color.push_back(kMagenta - 2);
204 m_color.push_back(kMagenta - 3);
205 m_color.push_back(kMagenta - 4);
206 m_color.push_back(kMagenta - 5);
207 m_color.push_back(kMagenta - 6);
208 m_color.push_back(kMagenta - 7);
210 m_color.push_back(kMagenta - 9);
213 m_color.push_back(kOrange + 9);
214 m_color.push_back(kOrange + 7);
215 m_color.push_back(kOrange + 5);
216 m_color.push_back(kOrange - 2);
217 m_color.push_back(kOrange - 3);
218 m_color.push_back(kOrange - 6);
219 m_color.push_back(kOrange + 4);
220 m_color.push_back(kOrange - 7);
222 m_color.push_back(kOrange + 10);
224 m_color.push_back(kViolet + 10);
225 m_color.push_back(kViolet + 6);
226 m_color.push_back(kViolet + 3);
227 m_color.push_back(kViolet - 7);
228 m_color.push_back(kViolet - 1);
229 m_color.push_back(kViolet + 9);
230 m_color.push_back(kViolet - 5);
231 m_color.push_back(kViolet - 3);
261 std::vector<std::pair<std::shared_ptr<TLine>, std::shared_ptr<TText> > >
lines;
264 std::pair<float, float> deltaZ(293, 298);
265 std::pair<float, float>
deltaR(115, 118);
266 float text_size = 0.033;
268 for (
float eta = 0.;
eta <= 3.8;
eta += 0.2) {
271 lines.push_back(std::make_pair<std::shared_ptr<TLine>, std::shared_ptr<TText> >(
272 std::make_shared<TLine>(deltaZ.first, deltaZ.first *
tan(theta), deltaZ.second, deltaZ.second *
tan(theta)),
273 std::make_shared<TText>(deltaZ.first, deltaZ.first *
tan(theta), fmt::sprintf(
"%2.1f",
eta).c_str())));
274 lines.back().second->SetTextFont(42);
275 lines.back().second->SetTextSize(text_size);
276 lines.back().second->SetTextAlign(33);
277 lines.push_back(std::make_pair<std::shared_ptr<TLine>, std::shared_ptr<TText> >(
278 std::make_shared<TLine>(-deltaZ.first, deltaZ.first *
tan(theta), -deltaZ.second, deltaZ.second *
tan(theta)),
279 std::make_shared<TText>(-deltaZ.first, deltaZ.first *
tan(theta), fmt::sprintf(
"-%2.1f",
eta).c_str())));
280 lines.back().second->SetTextFont(42);
281 lines.back().second->SetTextSize(text_size);
282 lines.back().second->SetTextAlign(13);
284 lines.push_back(std::make_pair<std::shared_ptr<TLine>, std::shared_ptr<TText> >(
285 std::make_shared<TLine>(deltaR.first /
tan(theta), deltaR.first, deltaR.second /
tan(theta), deltaR.second),
286 std::make_shared<TText>(deltaR.first /
tan(theta), deltaR.first, fmt::sprintf(
"%2.1f",
eta).c_str())));
287 lines.back().second->SetTextFont(42);
288 lines.back().second->SetTextSize(text_size);
289 lines.back().second->SetTextAlign(23);
291 lines.push_back(std::make_pair<std::shared_ptr<TLine>, std::shared_ptr<TText> >(
292 std::make_shared<TLine>(
293 -deltaR.first /
tan(theta), deltaR.first, -deltaR.second /
tan(theta), deltaR.second),
294 std::make_shared<TText>(-deltaR.first /
tan(theta), deltaR.first, fmt::sprintf(
"-%2.1f",
eta).c_str())));
295 lines.back().second->SetTextFont(42);
296 lines.back().second->SetTextSize(text_size);
297 lines.back().second->SetTextAlign(23);
305 const double scale = 10.;
306 std::vector<TText *> nukem_text;
307 static int markerStyles[10] = {kFullCircle,
324 std::unique_ptr<TCanvas>
canvas(
325 new TCanvas(
"Grouping_rz",
"Grouping - RZ view", (
int)(600 * scale * 1.25), (
int)(120 * scale * 1.50)));
326 canvas->GetFrame()->SetFillColor(kWhite);
327 gStyle->SetOptStat(0);
329 unsigned int color_index = 1;
331 std::unique_ptr<TLegend> leg(
new TLegend(0.1, 0.1, 0.23, 0.34));
332 leg->SetHeader(
"Tracker Material Grouping");
333 leg->SetTextFont(42);
334 leg->SetTextSize(0.008);
336 std::unique_ptr<TProfile2D> radlen(
337 new TProfile2D(
"OverallRadLen",
"OverallRadLen", 600., -300., 300, 120., 0., 120.));
338 std::unique_ptr<TProfile2D> eneloss(
339 new TProfile2D(
"OverallEnergyLoss",
"OverallEnergyLoss", 600., -300., 300, 120., 0., 120.));
340 std::unique_ptr<TProfile2D> radlen_diff(
341 new TProfile2D(
"OverallDifferencesRadLen",
"OverallDifferencesRadLen", 600., -300., 300, 120., 0., 120.));
342 std::unique_ptr<TProfile2D> eneloss_diff(
343 new TProfile2D(
"OverallDifferencesEnergyLoss",
"OverallDifferencesEnergyLoss", 600., -300., 300, 120., 0., 120.));
347 new TH2F(
g->name().c_str(),
g->name().c_str(), 6000., -300., 300, 1200., 0., 120.));
348 TH2F ¤t = *
m_plots.back();
349 current.SetMarkerColor(
m_color[color_index]);
350 current.SetMarkerStyle(markerStyles[color_index % 10]);
351 current.SetMarkerSize(0.8);
352 current.SetLineWidth(1);
353 for (
const auto &element :
g->elements()) {
354 current.Fill(element.z(), element.perp());
355 radlen->Fill(element.z(), element.perp(),
m_values[
g->name()].first);
356 eneloss->Fill(element.z(), element.perp(),
m_values[
g->name()].second);
357 radlen_diff->Fill(element.z(), element.perp(),
m_diff[
g->name()].first);
358 eneloss_diff->Fill(element.z(), element.perp(),
m_diff[
g->name()].second);
361 if (color_index == 1)
364 current.Draw(
"SAME");
366 leg->AddEntry(¤t,
g->name().c_str(),
"lp")->SetTextColor(
m_color[color_index]);
371 color_index = color_index %
m_color.size();
374 canvas->SaveAs(
"Grouping.png");
379 radlen->SetMinimum(0);
380 radlen->SetMaximum(0.25);
381 radlen->Draw(
"COLZ");
382 for (
const auto &
line : lines) {
383 line.first->SetLineWidth(5);
387 canvas->SaveAs(
"RadLenValues.png");
390 eneloss->SetMinimum(0.00001);
391 eneloss->SetMaximum(0.0005);
392 eneloss->Draw(
"COLZ");
393 for (
const auto &
line : lines) {
394 line.first->SetLineWidth(5);
398 canvas->SaveAs(
"EnergyLossValues.png");
403 radlen_diff->SetMinimum(-100);
404 radlen_diff->SetMaximum(100);
405 radlen_diff->Draw(
"COLZ");
406 for (
const auto &
line : lines) {
407 line.first->SetLineWidth(5);
411 canvas->SaveAs(
"RadLenChanges.png");
414 eneloss_diff->SetMinimum(-100);
415 eneloss_diff->SetMaximum(100);
416 eneloss_diff->Draw(
"COLZ");
417 for (
const auto &
line : lines) {
418 line.first->SetLineWidth(5);
422 canvas->SaveAs(
"EnergyLossChanges.png");
424 for (
auto g : nukem_text)
442 for (
unsigned int h = 2;
h < history.size(); ++
h)
443 std::cout <<
'/' << history[
h].logicalPart().name().name() <<
'[' << history[
h].copyno() <<
']';
447 std::cout <<
"\t(" << position.x() <<
", " << position.y() <<
", " << position.z() <<
") "
448 <<
"[rho] " << position.Rho() << std::endl;
#define DEFINE_FWK_MODULE(type)
void analyze(const edm::Event &, const edm::EventSetup &) override
Geom::Theta< T > theta() const
Exp< T >::type exp(const T &t)
Compact representation of the geometrical detector hierarchy.
const DDGeoHistory & geoHistory() const
The list of ancestors up to the root-node of the current node.
std::vector< TH2F * > m_plots
bool DDfetch(const DDsvalues_type *, DDValue &)
helper for retrieving DDValues from DDsvalues_type *.
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
std::vector< unsigned int > m_color
std::vector< std::pair< std::shared_ptr< TLine >, std::shared_ptr< TText > > > overlayEtaReferences()
void produceAndSaveSummaryPlot(const edm::EventSetup &)
bool next()
set current node to the next node in the filtered tree
void fillMaterialDifferences()
double delta_r(const Fourvec &a, const Fourvec &b)
Find the distance between two four-vectors in the two-dimensional space .
Tan< T >::type tan(const T &t)
const std::vector< std::string > & strings() const
a reference to the std::string-valued values stored in the given instance of DDValue ...
std::map< std::string, std::pair< float, float > > m_diff
std::vector< DDExpandedNode > DDGeoHistory
Geometrical 'path' of the current node up to the root-node.
const edm::ESGetToken< DDCompactView, IdealGeometryRecord > ddToken_
XYZVectorD XYZVector
spatial vector with cartesian internal representation
const bool m_saveSummaryPlot
std::set< std::string > m_group_names
std::vector< MaterialAccountingGroup * > m_groups
static int position[264][3]
ListGroups(const edm::ParameterSet &)
ESTransientHandle< T > getTransientHandle(const ESGetToken< T, R > &iToken) const
std::vector< int > m_gradient
void specificsV(std::vector< const DDsvalues_type * > &result) const
User specific data attached to the current node.
static bool dddGetStringRaw(const DDFilteredView &view, const std::string &name, std::string &value)
const DDTranslation & translation() const
The absolute translation of the current node.
static constexpr float b2
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
static constexpr float b1
std::map< std::string, std::pair< float, float > > m_values
static std::string dddGetString(const std::string &s, DDFilteredView const &view)