52 #include <boost/regex.hpp> 105 std::vector<TrackingRecHit *>::iterator hitsBegin,
106 std::vector<TrackingRecHit *>::iterator hitsEnd);
111 : minimumHits_(iConfig.getParameter<uint32_t>(
"minimumHits")),
112 replaceWithInactiveHits_(iConfig.getParameter<
bool>(
"replaceWithInactiveHits")),
113 stripFrontInvalidHits_(iConfig.getParameter<
bool>(
"stripFrontInvalidHits")),
114 stripBackInvalidHits_(iConfig.getParameter<
bool>(
"stripBackInvalidHits")),
115 stripAllInvalidHits_(iConfig.getParameter<
bool>(
"stripAllInvalidHits")),
116 excludePixelHits_(iConfig.getParameter<
bool>(
"excludePixelHits")),
117 dZcut_(iConfig.getParameter<double>(
"dzCut")),
118 dXYcut_(iConfig.getParameter<double>(
"dxyCut")),
119 detsToIgnore_(iConfig.getParameter<
std::
vector<uint32_t> >(
"detsToIgnore")) {
122 throw cms::Exception(
"Configuration") <<
"Inconsistent Configuration: you can't set both 'stripAllInvalidHits' " 123 "and 'replaceWithInactiveHits' to true\n";
128 tokenGeometry = esConsumes<TrackerGeometry, TrackerDigiGeometryRecord>();
129 tokenMagField = esConsumes<MagneticField, IdealMagneticFieldRecord>();
131 LogDebug(
"CosmicTrackSplitter") <<
"sanity check";
139 produces<TrackCandidateCollection>();
143 LogDebug(
"CosmicTrackSplitter") <<
"IN THE SPLITTER!!!!!";
160 auto output = std::make_unique<TrackCandidateCollection>();
164 std::vector<TrackingRecHit *>
hits;
168 LogDebug(
"CosmicTrackSplitter") <<
"size of map: " << m_TrajTracksMap->
size();
169 int HITTOSPLITFROM = 0;
171 iPair != m_TrajTracksMap->
end();
173 const Trajectory *trajFromMap = &(*(*iPair).key);
174 const reco::Track *trackFromMap = &(*(*iPair).val);
177 std::vector<TrajectoryMeasurement> measurements = trajFromMap->
measurements();
178 int totalNumberOfHits = measurements.size();
179 int numberOfHits = 0;
180 double previousDotProduct = 0;
183 GlobalVector stateMomentum = measurements[numberOfHits].forwardPredictedState().globalMomentum();
184 GlobalPoint statePosition = measurements[numberOfHits].forwardPredictedState().globalPosition();
185 double dotProduct = stateMomentum.x() * statePosition.x() + stateMomentum.y() * statePosition.y();
186 if (dotProduct * previousDotProduct < 0) {
188 HITTOSPLITFROM = numberOfHits;
191 previousDotProduct = dotProduct;
194 LogDebug(
"CosmicTrackSplitter") <<
"number of rechits: " << numberOfHits;
228 GlobalPoint bPosState = measurements[0].updatedState().globalPosition();
229 GlobalPoint fPosState = measurements[measurements.size() - 1].updatedState().globalPosition();
230 bool trajReversedFlag =
false;
240 if (((bPosHit - bPosState).
mag() > (bPosHit - fPosState).
mag()) &&
241 ((fPosHit - fPosState).
mag() > (fPosHit - bPosState).
mag())) {
242 trajReversedFlag =
true;
244 if (trajReversedFlag) {
245 int temp = HITTOSPLITFROM;
246 HITTOSPLITFROM = totalNumberOfHits -
temp;
252 for (std::vector<reco::Track>::const_iterator itt =
tracks->begin(), edt =
tracks->end(); itt != edt; ++itt) {
261 bool continueWithTrack =
true;
263 continueWithTrack =
false;
265 continueWithTrack =
false;
266 if (continueWithTrack ==
false)
270 for (
int i = 0;
i < 2; ++
i) {
272 LogDebug(
"CosmicTrackSplitter") <<
" loop on hits of track #" << (itt -
tracks->begin());
278 LogDebug(
"CosmicTrackSplitter") <<
" hit number " << (ith - itt->recHitsBegin());
280 if (
hit->isValid()) {
281 LogDebug(
"CosmicTrackSplitter") <<
" valid, detid = " <<
hit->geographicalId().rawId();
282 DetId detid =
hit->geographicalId();
285 LogDebug(
"CosmicTrackSplitter") <<
" valid, tracker ";
286 bool verdict =
false;
292 LogDebug(
"CosmicTrackSplitter") <<
"hit pos: " <<
pos <<
", dca pos: " <<
v;
295 if ((
i == 0) && (hitCtr < HITTOSPLITFROM)) {
297 LogDebug(
"CosmicTrackSplitter") <<
"tophalf";
300 if ((
i == 1) && (hitCtr >= HITTOSPLITFROM)) {
302 LogDebug(
"CosmicTrackSplitter") <<
"bottomhalf";
319 <<
" verdict after module list: " << (verdict ?
"ok" :
"no");
320 if (verdict ==
true) {
338 LogDebug(
"CosmicTrackSplitter") <<
" end of hit " << (ith - itt->recHitsBegin());
341 LogDebug(
"CosmicTrackSplitter") <<
" end of loop on hits of track #" << (itt -
tracks->begin());
343 std::vector<TrackingRecHit *>::iterator begin =
hits.begin(), end =
hits.end();
345 LogDebug(
"CosmicTrackSplitter") <<
" selected " <<
hits.size() <<
" hits ";
349 while ((begin != end) && ((*begin)->isValid() ==
false))
353 LogDebug(
"CosmicTrackSplitter") <<
" after front stripping we have " << (end - begin) <<
" hits ";
358 while ((begin != end) && ((*end)->isValid() ==
false))
363 LogDebug(
"CosmicTrackSplitter") <<
" after back stripping we have " << (end - begin) <<
" hits ";
369 LogDebug(
"CosmicTrackSplitter") <<
"we made a candidate of " <<
hits.size() <<
" hits!";
372 for (begin =
hits.begin(), end =
hits.end(); begin != end; ++begin) {
377 <<
"loop: " <<
i <<
" has " << usedHitCtr <<
" active hits and " <<
hits.size() <<
" total hits...";
386 std::vector<TrackingRecHit *>::iterator hitsBegin,
387 std::vector<TrackingRecHit *>::iterator hitsEnd) {
388 LogDebug(
"CosmicTrackSplitter") <<
"Making a candidate!";
393 throw cms::Exception(
"UnimplementedFeature") <<
"Cannot work with tracks that have 'anyDirecton' \n";
410 ownHits.
reserve(hitsEnd - hitsBegin);
411 for (; hitsBegin != hitsEnd; ++hitsBegin) {
418 LogDebug(
"CosmicTrackSplitter") <<
" dumping the hits now: ";
419 for (
auto const &
hit :
cand.recHits()) {
420 LogTrace(
"CosmicTrackSplitter") <<
" hit detid = " <<
hit.geographicalId().rawId()
421 <<
", type = " <<
typeid(
hit).
name();
T getParameter(std::string const &) const
const TrackerGeomDet * idToDetUnit(DetId) const override
Return the pointer to the GeomDetUnit corresponding to a given DetId.
const math::XYZPoint & outerPosition() const
position of the outermost hit
edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > tokenGeometry
edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > tokenMagField
edm::EDGetTokenT< reco::TrackCollection > tokenTracks
TrackCandidate makeCandidate(const reco::Track &tk, std::vector< TrackingRecHit *>::iterator hitsBegin, std::vector< TrackingRecHit *>::iterator hitsEnd)
edm::ESHandle< TrackerGeometry > theGeometry
const edm::RefToBase< TrajectorySeed > & seedRef() const
constexpr Detector det() const
get the detector field from this detid
bool stripBackInvalidHits_
DataContainer const & measurements() const
const_iterator end() const
last iterator over the map (read only)
size_type size() const
map size
bool stripAllInvalidHits_
edm::ESHandle< MagneticField > theMagField
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.
#define DEFINE_FWK_MODULE(type)
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
unsigned int innerDetId() const
DetId of the detector on which surface the innermost state is located.
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
bool replaceWithInactiveHits_
edm::EDGetTokenT< TrajTrackAssociationCollection > tokenTrajTrack
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< float >, ROOT::Math::GlobalCoordinateSystemTag > GlobalVector
vector in glovbal coordinate system
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
const PropagationDirection & seedDirection() const
direction of how the hits were sorted in the original seed
const Plane & surface() const
The nominal surface of the GeomDet.
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
DetId geographicalId() const
constexpr uint32_t rawId() const
get the raw id
unsigned int outerDetId() const
DetId of the detector on which surface the outermost state is located.
bool stripFrontInvalidHits_
const Vector & momentum() const
track momentum vector
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< float >, ROOT::Math::GlobalCoordinateSystemTag > GlobalPoint
point in global coordinate system
const_iterator begin() const
first iterator over the map (read only)
CosmicTrackSplitter(const edm::ParameterSet &iConfig)
virtual LocalPoint localPosition() const =0
const math::XYZPoint & innerPosition() const
position of the innermost hit
std::vector< uint32_t > detsToIgnore_
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override