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>();
161 output->reserve(tracks->size());
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) {
255 LogDebug(
"CosmicTrackSplitter") <<
"ntracks: " << tracks->size();
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());
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) {
322 hits.push_back(hit->
clone());
331 hits.push_back(hit->
clone());
335 hits.push_back(hit->
clone());
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();
const edm::RefToBase< TrajectorySeed > & seedRef() const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
TrackCandidate makeCandidate(const reco::Track &tk, std::vector< TrackingRecHit * >::iterator hitsBegin, std::vector< TrackingRecHit * >::iterator hitsEnd)
friend struct const_iterator
bool getByToken(EDGetToken token, Handle< PROD > &result) const
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
#define DEFINE_FWK_MODULE(type)
edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > tokenGeometry
edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > tokenMagField
constexpr uint32_t rawId() const
get the raw id
edm::EDGetTokenT< reco::TrackCollection > tokenTracks
edm::ESHandle< TrackerGeometry > theGeometry
auto const & tracks
cannot be loose
const Vector & momentum() const
track momentum vector
const math::XYZPoint & outerPosition() const
position of the outermost hit
bool stripBackInvalidHits_
const math::XYZPoint & innerPosition() const
position of the innermost hit
DataContainer const & measurements() const
const GeomDet * det() const
bool stripAllInvalidHits_
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
unsigned int outerDetId() const
DetId of the detector on which surface the outermost state is located.
edm::ESHandle< MagneticField > theMagField
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
virtual TrackingRecHit * clone() const =0
const PropagationDirection & seedDirection() const
direction of how the hits were sorted in the original seed
T getParameter(std::string const &) const
bool stripFrontInvalidHits_
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< float >, ROOT::Math::GlobalCoordinateSystemTag > GlobalPoint
point in global coordinate system
CosmicTrackSplitter(const edm::ParameterSet &iConfig)
DetId geographicalId() const
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
virtual LocalPoint localPosition() const =0
unsigned int innerDetId() const
DetId of the detector on which surface the innermost state is located.
std::vector< uint32_t > detsToIgnore_
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
constexpr Detector det() const
get the detector field from this detid
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.