9 #include <boost/format.hpp> 35 if (strcasecmp(splitmode.c_str(),
"NearestLayer") == 0) {
37 }
else if (strcasecmp(splitmode.c_str(),
"InnerLayer") == 0) {
39 }
else if (strcasecmp(splitmode.c_str(),
"OuterLayer") == 0) {
51 if (m_saveSummaryPlot)
69 for (
unsigned int i = 0;
i <
m_groups.size(); ++
i) {
76 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")
92 std::ofstream xml(name);
93 xml <<
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" << std::endl;
94 xml <<
"<Groups>" << std::endl;
95 for (
unsigned int i = 0;
i <
m_groups.size(); ++
i) {
97 xml <<
" <Group name=\"" << layer.
name() <<
"\">\n" 99 <<
" <Parameter name=\"TrackerXi\" value=\"" << layer.
averageEnergyLoss() <<
"\"/>\n" 103 xml <<
"</Groups>" << std::endl;
109 for (
unsigned int i = 0;
i <
m_groups.size(); ++
i) {
128 m_plotter->normalize();
150 LogInfo(
"TrackingMaterialAnalyser")
151 <<
"TrackingMaterialAnalyser: List of the tracker groups: " << std::endl;
152 for (
unsigned int i = 0; i <
m_groups.size(); ++
i)
153 LogInfo(
"TrackingMaterialAnalyser")
154 << i <<
" TrackingMaterialAnalyser:\t" <<
m_groups[
i]->info() << std::endl;
159 for (std::vector<MaterialAccountingTrack>::const_iterator
t = h_tracks->begin(),
end = h_tracks->end();
t !=
end; ++
t) {
179 for (
unsigned int i = 0;
i < track.
detectors().size(); ++
i)
182 for (
unsigned int i = 0;
i <
group.size(); ++
i)
184 LogInfo(
"TrackingMaterialAnalyser") <<
"For detector i: " <<
i <<
" index: " 185 <<
group[
i] <<
" R-ranges: " 188 <<
group[
i] <<
" Z-ranges: " 194 if (detectors == 0) {
198 for (
unsigned int i = 1;
i < track.
steps().size(); ++
i)
201 const double TOLERANCE = 0.0001;
202 std::vector<double> limits(detectors + 2);
206 limits[0] = track.
detectors()[0].m_curvilinearIn - TOLERANCE;
208 limits[0] = - TOLERANCE;
213 limits[detectors+1] = INFINITY;
229 limits[
i] = track.
detectors()[
i].m_curvilinearIn - TOLERANCE;
236 limits[
i] = track.
detectors()[
i-1].m_curvilinearOut + TOLERANCE;
251 while (end < limits[0]) {
253 end = begin + step.
length();
262 unsigned int index = 0;
263 while (i < track.
steps().size()) {
266 end = begin + step.
length();
268 if (begin > limits[detectors]) {
280 if (begin < limits[index]
or end > limits[index+2]) {
282 std::cerr <<
"MaterialAccountingTrack::split(): ERROR: internal logic error, expected " << limits[
index] <<
" < " << begin <<
" < " << limits[index+1] << std::endl;
286 if (limits[index] <= begin and end <= limits[index+1]) {
294 assert(fraction < 1.);
295 std::pair<MaterialAccountingStep, MaterialAccountingStep>
parts = step.
split(fraction);
304 if (index+1 < detectors)
311 track.
detectors()[
index].account( parts.first, begin, limits[index+1] );
313 if (index < detectors)
314 track.
detectors()[
index].account( parts.second, limits[index+1], end );
322 for (
unsigned int i = 0;
i < track.
detectors().size(); ++
i)
346 std::cerr <<
"TrackingMaterialAnalyser::findLayer(...): ERROR: detector does not belong to any DetLayer" << std::endl;
348 <<
" (r: " << std::setprecision(1) << std::setw(5) << detector.
position().
perp()
349 <<
", z: " << std::setprecision(1) << std::setw(6) << detector.
position().
z()
350 <<
", phi: " << std::setprecision(3) << std::setw(6) << detector.
position().
phi() <<
")" 355 std::cerr <<
"TrackingMaterialAnalyser::findLayer(...): ERROR: detector belongs to " << inside <<
" DetLayers" << std::endl;
357 <<
" (r: " << std::setprecision(1) << std::setw(5) << detector.
position().
perp()
358 <<
", z: " << std::setprecision(1) << std::setw(6) << detector.
position().
z()
359 <<
", phi: " << std::setprecision(3) << std::setw(6) << detector.
position().
phi() <<
")"
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
#define DEFINE_FWK_MODULE(type)
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
def setup(process, global_tag, zero_tesla=False)
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)
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
format
Some error handling for the usage.
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