9 #include <boost/format.hpp> 34 if (strcasecmp(splitmode.c_str(),
"NearestLayer") == 0) {
36 }
else if (strcasecmp(splitmode.c_str(),
"InnerLayer") == 0) {
38 }
else if (strcasecmp(splitmode.c_str(),
"OuterLayer") == 0) {
43 <<
"Invalid SplitMode \"" << splitmode
44 <<
"\". Acceptable values are \"NearestLayer\", \"InnerLayer\", \"OuterLayer\".";
54 if (m_saveSummaryPlot) {
57 }
else if (m_isHFNose) {
77 for (
unsigned int i = 0;
i <
m_groups.size(); ++
i) {
90 parameters <<
boost::format(
"%-20s\t%7d\t%5.1f ± %5.1f cm\t%6.4f ± %6.4f \t%6.4fe-03 ± %6.4fe-03 GeV") %
103 std::ofstream xml(name);
104 xml <<
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" << std::endl;
105 xml <<
"<Groups>" << std::endl;
106 for (
unsigned int i = 0;
i <
m_groups.size(); ++
i) {
108 xml <<
" <Group name=\"" << layer.
name() <<
"\">\n" 110 <<
" <Parameter name=\"TrackerXi\" value=\"" << layer.
averageEnergyLoss() <<
"\"/>\n" 114 xml <<
"</Groups>" << std::endl;
119 for (
unsigned int i = 0;
i <
m_groups.size(); ++
i) {
137 m_plotter->normalize();
158 LogInfo(
"TrackingMaterialAnalyser") <<
"TrackingMaterialAnalyser: List of the tracker groups: " << std::endl;
159 for (
unsigned int i = 0; i <
m_groups.size(); ++
i)
160 LogInfo(
"TrackingMaterialAnalyser") << i <<
" TrackingMaterialAnalyser:\t" <<
m_groups[
i]->info() << std::endl;
165 for (std::vector<MaterialAccountingTrack>::const_iterator
t = h_tracks->begin(),
end = h_tracks->end();
t !=
end;
185 for (
unsigned int i = 0;
i < track.
detectors().size(); ++
i)
188 for (
unsigned int i = 0;
i <
group.size(); ++
i)
190 LogInfo(
"TrackingMaterialAnalyser") <<
"For detector i: " <<
i <<
" index: " <<
group[
i]
191 <<
" R-ranges: " <<
m_groups[
group[
i] - 1]->getBoundingR().first <<
", " 193 <<
" Z-ranges: " <<
m_groups[
group[
i] - 1]->getBoundingZ().first <<
", " 197 if (detectors == 0) {
201 for (
unsigned int i = 1;
i < track.
steps().size(); ++
i)
204 const double TOLERANCE = 0.0001;
205 std::vector<double>
limits(detectors + 2);
209 limits[0] = track.
detectors()[0].m_curvilinearIn - TOLERANCE;
211 limits[0] = -TOLERANCE;
216 limits[detectors + 1] = INFINITY;
232 limits[
i] = track.
detectors()[
i].m_curvilinearIn - TOLERANCE;
239 limits[
i] = track.
detectors()[
i - 1].m_curvilinearOut + TOLERANCE;
255 while (end < limits[0]) {
257 end = begin + step.
length();
266 unsigned int index = 0;
267 while (i < track.
steps().size()) {
270 end = begin + step.
length();
272 if (begin > limits[detectors]) {
284 if (begin < limits[index]
or end > limits[index + 2]) {
286 std::cerr <<
"MaterialAccountingTrack::split(): ERROR: internal logic error, expected " << limits[
index]
287 <<
" < " << begin <<
" < " << limits[index + 1] << std::endl;
291 if (limits[index] <= begin and end <= limits[index + 1]) {
298 double fraction = (limits[index + 1] -
begin) / (end - begin);
299 assert(fraction < 1.);
300 std::pair<MaterialAccountingStep, MaterialAccountingStep>
parts = step.
split(fraction);
309 if (index + 1 < detectors)
316 track.
detectors()[
index].account(parts.first, begin, limits[index + 1]);
318 if (index < detectors)
319 track.
detectors()[
index].account(parts.second, limits[index + 1], end);
326 for (
unsigned int i = 0;
i < track.
detectors().size(); ++
i)
349 std::cerr <<
"TrackingMaterialAnalyser::findLayer(...): ERROR: detector does not belong to any DetLayer" 352 <<
" (r: " << std::setprecision(1) << std::setw(5) << detector.
position().
perp()
353 <<
", z: " << std::setprecision(1) << std::setw(6) << detector.
position().
z()
354 <<
", phi: " << std::setprecision(3) << std::setw(6) << detector.
position().
phi() <<
")" << std::endl;
358 std::cerr <<
"TrackingMaterialAnalyser::findLayer(...): ERROR: detector belongs to " << inside <<
" DetLayers" 361 <<
" (r: " << std::setprecision(1) << std::setw(5) << detector.
position().
perp()
362 <<
", z: " << std::setprecision(1) << std::setw(6) << detector.
position().
z()
363 <<
", phi: " << std::setprecision(3) << std::setw(6) << detector.
position().
phi() <<
")" << std::endl;
void plotSegmentUnassigned(const MaterialAccountingStep &step)
T getParameter(std::string const &) const
const std::vector< MaterialAccountingDetector > & detectors() const
bool m_skipAfterLastDetector
const std::vector< MaterialAccountingStep > & steps() const
double averageRadiationLengths(void) const
return the average normalized number of radiation lengths
double sigmaLength(void) const
return the sigma of the normalized layer thickness
double sigmaRadiationLengths(void) const
return the sigma of the normalized number of radiation lengths
~TrackingMaterialAnalyser() override
Geom::Phi< T > phi() const
double length(void) const
double sigmaEnergyLoss(void) const
return the sigma of the normalized energy loss density factor for Bethe-Bloch
void split(MaterialAccountingTrack &track)
unsigned int tracks(void) const
return the number of tracks that hit this layer
double averageLength(void) const
return the average normalized layer thickness
void saveXml(const char *name)
void saveParameters(const char *name)
int findLayer(const MaterialAccountingDetector &detector)
#define DEFINE_FWK_MODULE(type)
def detectors(dt=True, csc=True, me42=False, chambers=True, superlayers=False, layers=False)
double averageEnergyLoss(void) const
return the average normalized energy loss density factor for Bethe-Bloch
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< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
void analyze(const edm::Event &, const edm::EventSetup &) override
edm::EDGetTokenT< std::vector< MaterialAccountingTrack > > m_materialToken
const std::string & name(void) const
get the layer name
std::vector< std::string > m_groupNames
TrackingMaterialPlotter * m_plotter
std::vector< MaterialAccountingGroup * > m_groups
bool m_skipBeforeFirstDetector
void savePlots(void)
save the plots
std::pair< MaterialAccountingStep, MaterialAccountingStep > split(double fraction) const
split the step (0..1) in (0..f) + (f..1) using linear interpolation
const GlobalPoint & position() const
TrackingMaterialAnalyser(const edm::ParameterSet &)
void plotSegmentInLayer(const MaterialAccountingStep &step, int layer)
const MaterialAccountingStep & summary() const