84 unsigned int planes_required,
98 verbosity(conf.getUntrackedParameter<unsigned
int>(
"verbosity", 0)),
103 conf.getParameter<double>(
"clusterSize_b"))),
104 threshold(conf.getParameter<double>(
"threshold")),
105 max_a_toFit(conf.getParameter<double>(
"max_a_toFit")) {
106 for (
const auto &ps : conf.
getParameter<vector<ParameterSet>>(
"exceptionalSettings")) {
107 unsigned int rpId = ps.getParameter<
unsigned int>(
"rpId");
111 settings.minPlanesPerProjectionToFit_V = ps.getParameter<
unsigned int>(
"minPlanesPerProjectionToFit_V");
112 settings.threshold_U = ps.getParameter<
double>(
"threshold_U");
113 settings.threshold_V = ps.getParameter<
double>(
"threshold_V");
120 produces<DetSetVector<TotemRPUVPattern>>();
131 double threshold_loc,
132 unsigned int planes_required,
140 for (
auto &
p : newPatterns) {
141 p.setProjection(proj);
145 set<unsigned int> planes;
146 for (
const auto &ds :
p.hits())
149 if (planes.size() < planes_required)
150 p.setFittable(
false);
153 p.setFittable(
false);
164 <<
">> TotemRPUVPatternFinder::produce " <<
event.id().run() <<
":" <<
event.id().event();
182 map<uint8_t, uint16_t> planeOccupancy_U, planeOccupancy_V;
184 map<unsigned int, RPData> rpData;
186 for (
auto &
ids : *input) {
188 unsigned int plane = detId.
plane();
189 bool uDir = detId.isStripsCoordinateUDirection();
193 RPData &
data = rpData[rpId];
195 for (
auto &
h :
ids) {
197 auto &ods = data.hits_U.find_or_insert(ids.detId());
199 data.planeOccupancy_U[plane]++;
201 auto &ods = data.hits_V.find_or_insert(ids.detId());
203 data.planeOccupancy_V[plane]++;
209 for (
auto it : rpData) {
211 RPData &
data = it.second;
221 minPlanesPerProjectionToFit_U = setIt->second.minPlanesPerProjectionToFit_U;
222 minPlanesPerProjectionToFit_V = setIt->second.minPlanesPerProjectionToFit_V;
223 threshold_U = setIt->second.threshold_U;
224 threshold_V = setIt->second.threshold_V;
227 auto &uColl = data.planeOccupancy_U;
228 auto &vColl = data.planeOccupancy_V;
232 <<
"\tRP " << rpId <<
"\n\t\tall planes: u = " << uColl.size() <<
", v = " << vColl.size();
236 unsigned int uPlanes = 0, vPlanes = 0;
237 for (
auto pit : uColl)
241 for (
auto pit : vColl)
246 LogVerbatim(
"TotemRPUVPatternFinder") <<
"\t\tplanes with clean data: u = " << uPlanes <<
", v = " << vPlanes;
264 LogVerbatim(
"TotemRPUVPatternFinder") <<
"\t\tpatterns:";
265 for (
const auto &
p : patterns) {
266 unsigned int n_hits = 0;
267 for (
auto &hds :
p.hits())
268 n_hits += hds.size();
272 <<
", b = " <<
p.b() <<
", w = " <<
p.w() <<
", fittable = " <<
p.fittable() <<
", hits = " << n_hits;
287 ->setComment(
"input rechits collection to retrieve");
289 desc.
add<
unsigned int>(
"maxHitsPerPlaneToSearch", 5)
290 ->setComment(
"minimum threshold of hits multiplicity to flag the pattern as dirty");
291 desc.
add<
unsigned int>(
"minPlanesPerProjectionToSearch", 3)
293 "minimal number of reasonable (= not empty and not dirty) planes per projection and per RP, to start the " 295 desc.
add<
double>(
"clusterSize_a", 0.02 )
296 ->setComment(
"(full) cluster size (in rad) in slope-intercept space");
297 desc.
add<
double>(
"clusterSize_b", 0.3 );
299 desc.
add<
double>(
"threshold", 2.99)
301 "minimal weight of (Hough) cluster to accept it as candidate\n" 302 " weight of cluster = sum of weights of contributing points\n" 303 " weight of point = sigma0 / sigma_of_point\n" 304 "most often: weight of point ~ 1, thus cluster weight is roughly number of contributing points");
306 desc.
add<
unsigned int>(
"minPlanesPerProjectionToFit", 3)
308 "minimal number of planes (in the recognised patterns) per projection and per RP, to tag the candidate as " 311 desc.
add<
bool>(
"allowAmbiguousCombination",
false)
313 "whether to allow combination of most significant U and V pattern, in case there several of them.\n" 314 "don't set it to True, unless you have reason");
316 desc.
add<
double>(
"max_a_toFit", 10.0)
318 "maximal angle (in any projection) to mark the candidate as fittable -> controls track parallelity with " 320 "huge value -> no constraint");
323 exceptions_validator.
add<
unsigned int>(
"rpId")->setComment(
"RP id according to CTPPSDetId");
324 exceptions_validator.
add<
unsigned int>(
"minPlanesPerProjectionToFit_U");
325 exceptions_validator.
add<
unsigned int>(
"minPlanesPerProjectionToFit_V");
326 exceptions_validator.
add<
double>(
"threshold_U");
327 exceptions_validator.
add<
double>(
"threshold_V");
329 std::vector<edm::ParameterSet> exceptions_default;
330 desc.
addVPSet(
"exceptionalSettings", exceptions_validator, exceptions_default);
332 descr.
add(
"totemRPUVPatternFinder", desc);
Detector ID class for TOTEM Si strip detectors.
T getParameter(std::string const &) const
void setComment(std::string const &value)
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
TotemRPUVPatternFinder(const edm::ParameterSet &conf)
~TotemRPUVPatternFinder() override
Translation translation() const
void push_back(const T &t)
ParameterDescriptionBase * addVPSet(U const &iLabel, ParameterSetDescription const &validator, std::vector< ParameterSet > const &defaults)
FastLineRecognition * lrcgn
the line recognition algorithm
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
const DetGeomDesc * rp(unsigned int id) const
returns geometry of a RP box
void getPatterns(const edm::DetSetVector< TotemRPRecHit > &input, double _z0, double threshold, edm::DetSet< TotemRPUVPattern > &patterns)
Event setup record containing the real (actual) geometry information.
static std::string const input
reference find_or_insert(det_id_type id)
block of (exceptional) settings for 1 RP
#define DEFINE_FWK_MODULE(type)
std::map< unsigned int, RPSettings > exceptionalSettings
exceptional settings: RP Id –> settings
double threshold
minimal weight of (Hough) cluster to accept it as candidate
void recognizeAndSelect(TotemRPUVPattern::ProjectionType proj, double z0, double threshold, unsigned int planes_required, const edm::DetSetVector< TotemRPRecHit > &hits, edm::DetSet< TotemRPUVPattern > &patterns)
executes line recognition in a projection
unsigned char minPlanesPerProjectionToFit
minimal required number of active planes per projection to mark track candidate as fittable ...
void resetGeometry(const CTPPSGeometry *_g)
unsigned char minPlanesPerProjectionToFit_V
edm::EDGetTokenT< edm::DetSetVector< TotemRPRecHit > > detSetVectorTotemRPRecHitToken
ParameterDescriptionBase * add(U const &iLabel, T const &value)
Class performing optimized hough transform to recognize lines.
edm::ESWatcher< VeryForwardRealGeometryRecord > geometryWatcher
void produce(edm::Event &e, const edm::EventSetup &c) override
void add(std::string const &label, ParameterSetDescription const &psetDescription)
bool check(const edm::EventSetup &iSetup)
Base class for CTPPS detector IDs.
unsigned char minPlanesPerProjectionToSearch
minimal required number of active planes per projection to even start track recognition ...
Class to recognize straight line tracks, based on optimized Hough trasform.
ESHandle< TrackerGeometry > geometry
char data[epos_bytes_allocation]
static void fillDescriptions(edm::ConfigurationDescriptions &)
unsigned int maxHitsPerPlaneToSearch
above this limit, planes are considered noisy
T const * product() const
unsigned char minPlanesPerProjectionToFit_U
double max_a_toFit
maximal angle (in any projection) to mark candidate as fittable - controls track parallelity ...