39 propagator = theService.propagator(
"SmartPropagatorAny");
40 propagatorPF = theService.propagator(
"SmartPropagatorAny");
41 propagatorCompatibleDet = theService.propagator(
"SmartPropagatorAny");
42 theG = theService.trackingGeometry();
52 if (useDBforThr) dytThresholds = thrManager->getInitialThresholds();
53 doUpdateOfKFStates =
true;
64 if (temp.
isValid()) tsos = updatorHandle->
update(tsos, *rechit);
69 vector<const TrackingRecHit*> DTrh = bestDTSeg.
recHits();
70 for (vector<const TrackingRecHit*>::iterator it = DTrh.begin(); it != DTrh.end(); it++) {
71 tmprecHits.push_back(theMuonRecHitBuilder->build(*it));
74 for (ConstRecHitContainer::const_iterator it = tmprecHits.begin(); it != tmprecHits.end(); ++it) {
75 DTLayerId layid((*it)->det()->geographicalId());
79 if (tempTsos.
isValid() ) tsos = tempTsos;
87 for (vector<CSCRecHit2D>::iterator it = CSCrh.begin(); it != CSCrh.end(); ++it) {
88 tmprecHits.push_back(theMuonRecHitBuilder->build(&*it));
91 for (ConstRecHitContainer::const_iterator it = tmprecHits.begin(); it != tmprecHits.end(); ++it) {
92 const CSCLayer* cscLayer = cscGeom->layer((*it)->det()->geographicalId());
96 if (tempTsos.
isValid() ) tsos = tempTsos;
106 if (selector < 0 || selector > 2)
throw cms::Exception(
"NotAvailable") <<
"DYT selector: wrong option!" << endl;
110 DYTselector = selector;
119 doUpdateOfKFStates = upState;
123 if (thr.size() == 2) {
124 for (
unsigned int i = 0;
i < thr.size();
i++)
125 if (thr[
i] >= 0) Thrs.push_back(thr[
i]);
129 throw cms::Exception(
"NotAvailable") <<
"WARNING: wrong size for the threshold vector!\nExpected size: 2\n Found size: " << thr.size();
143 dtApeMap = thrManager->GetDTApeMap();
144 cscApeMap = thrManager->GetCSCApeMap();
147 vector<TrajectoryMeasurement> muonMeasurements = traj.
measurements();
149 for (vector<TrajectoryMeasurement>::const_iterator imT = muonMeasurements.begin(); imT != muonMeasurements.end(); imT++ ) {
150 if ( !(*imT).recHit()->isValid() )
continue;
153 result.push_back((*imT).recHit());
154 if (!(*imT).forwardPredictedState().isValid())
continue;
155 if ((*imT).forwardPredictedState().globalPosition().mag() >
175 map<int, vector<DetId> > compatibleIds;
176 map<int, vector<DTRecSegment4D> > dtSegMap;
177 map<int, vector<CSCSegment> > cscSegMap;
178 int incompConLay = 0;
182 compatibleDets(currentState, compatibleIds);
185 fillSegmentMaps(compatibleIds, dtSegMap, cscSegMap);
188 if (useDBforThr) preliminaryFit(compatibleIds, dtSegMap, cscSegMap);
191 for (map<
int, vector<DetId> >::iterator it=compatibleIds.begin(); it!=compatibleIds.end(); ++it) {
192 int stLayer = stationfromDet(it->second.front());
195 double bestDTEstimator =
MAX_THR;
196 double bestCSCEstimator =
MAX_THR;
197 vector<DTRecSegment4D> dtSegs = dtSegMap[it->first];
198 vector<CSCSegment> cscSegs = cscSegMap[it->first];
202 testDTstation(currentState, dtSegs, bestDTEstimator, bestDTSeg, tsosDTlayer);
206 testCSCstation(currentState, cscSegs, bestCSCEstimator, bestCSCSeg, tsosCSClayer);
209 bool chosenLayer = chooseLayers(incompConLay, bestDTEstimator, bestDTSeg, tsosDTlayer, bestCSCEstimator, bestCSCSeg, tsosCSClayer);
210 fillDYTInfos(stLayer, chosenLayer, incompConLay, bestDTEstimator, bestCSCEstimator, bestDTSeg, bestCSCSeg);
232 double const &bestDTEstimator,
double const &bestCSCEstimator,
237 if (bestDTEstimator <= bestCSCEstimator) {
238 estimatorMap[st] = bestDTEstimator;
240 idChamberMap[st] = id;
243 idChamberMap[st] = id;
244 estimatorMap[st] = bestCSCEstimator;
246 usedStationMap[st] =
true;
249 estimatorMap[st] = -1;
250 usedStationMap[st] =
false;
259 vector<const DetLayer *> navLayers;
260 navLayers = navigation->compatibleLayers(*(currentState.freeState()),
alongMomentum);
261 unsigned int ilayerCorrected = 0;
262 for (
unsigned int ilayer=0; ilayer<navLayers.size(); ilayer++ ) {
267 vector<DetLayer::DetWithState> comps = navLayers[ilayer]->compatibleDets(currentState, *propagatorCompatibleDet, *theEstimator);
270 if (comps.size() > 0) {
271 for (
unsigned int icomp=0; icomp<comps.size(); icomp++ ) {
272 DetId id(comps[icomp].
first->geographicalId().rawId());
273 detMap[ilayerCorrected].push_back(
id);
277 if (theEstimator)
delete theEstimator;
283 map<
int, vector<DTRecSegment4D> > &dtSegMap,
284 map<
int, vector<CSCSegment> > &cscSegMap) {
285 for (map<
int, vector<DetId> >::iterator it=compatibleIds.begin(); it!=compatibleIds.end(); ++it) {
286 vector<DetId> ids = compatibleIds[it->first];
287 for (
unsigned j = 0;
j < ids.size();
j++) {
290 vector<CSCSegment>
tmp = getSegs->getCSCSegmentsInChamber(ch);
291 for (
unsigned int k = 0;
k < tmp.size();
k++) cscSegMap[it->first].push_back(tmp[
k]);
295 vector<DTRecSegment4D>
tmp = getSegs->getDTSegmentsInChamber(ch);
296 for (
unsigned int k = 0;
k < tmp.size();
k++) dtSegMap[it->first].push_back(tmp[
k]);
306 if (segments.size() == 0)
return;
307 for (
unsigned int iSeg = 0; iSeg < segments.size(); iSeg++) {
309 if (!
propagator->propagate(startingState, theG->idToDet(chamber)->
surface()).isValid())
continue;
310 tsosdt =
propagator->propagate(startingState, theG->idToDet(chamber)->
surface());
317 if (estimator >= bestEstimator)
continue;
319 bestSeg = segments[iSeg];
327 if (segments.size() == 0)
return;
328 for (
unsigned int iSeg = 0; iSeg < segments.size(); iSeg++) {
329 CSCDetId chamber(segments[iSeg].cscDetId());
330 if (!
propagator->propagate(startingState, theG->idToDet(chamber)->
surface()).isValid())
continue;
331 tsoscsc =
propagator->propagate(startingState, theG->idToDet(chamber)->
surface());
338 if (estimator >= bestEstimator)
continue;
340 bestSeg = segments[iSeg];
347 result.push_back(theMuonRecHitBuilder->build(&bestDTSeg));
348 if (doUpdateOfKFStates) updateWithDThits(currentState, bestDTSeg);
349 else currentState = tsosDT;
355 result.push_back(theMuonRecHitBuilder->build(&bestCSCSeg));
356 if (doUpdateOfKFStates) updateWithCSChits(currentState, bestCSCSeg);
357 else currentState = tsosCSC;
363 map<
int, vector<CSCSegment> > cscSegMap) {
364 for (map<
int, vector<DetId> >::iterator it=compatibleIds.begin(); it!=compatibleIds.end(); ++it) {
367 double bestDTEstimator =
MAX_THR;
368 double bestCSCEstimator =
MAX_THR;
370 vector<DTRecSegment4D> dtSegs = dtSegMap[it->first];
371 vector<CSCSegment> cscSegs = cscSegMap[it->first];
375 testDTstation(prelFitState, dtSegs, bestDTEstimator, bestDTSeg, tsosDTlayer);
379 testCSCstation(prelFitState, cscSegs, bestCSCEstimator, bestCSCSeg, tsosCSClayer);
382 if (bestDTEstimator ==
MAX_THR && bestCSCEstimator ==
MAX_THR)
continue;
383 if (bestDTEstimator <= bestCSCEstimator) {
385 if (bestDTEstimator >= initThr)
continue;
386 prelFitMeas.push_back(theMuonRecHitBuilder->build(&bestDTSeg));
387 auto aSegRH = prelFitMeas.back();
388 auto uRes = updatorHandle->update(tsosDTlayer, *aSegRH);
392 prelFitMeas.pop_back();
396 if (bestCSCEstimator >= initThr)
continue;
397 prelFitMeas.push_back(theMuonRecHitBuilder->build(&bestCSCSeg));
398 auto aSegRH = prelFitMeas.back();
399 auto uRes = updatorHandle->update(tsosCSClayer, *aSegRH);
403 prelFitMeas.pop_back();
407 if (!prelFitMeas.empty()) prelFitMeas.pop_back();
408 for (
auto imrh = prelFitMeas.rbegin(); imrh != prelFitMeas.rend(); ++imrh) {
409 DetId id = (*imrh)->geographicalId();
411 if (tmp.
isValid()) prelFitState = tmp;
414 muonETAest = prelFitState.globalMomentum().eta();
422 if (bestDTEstimator ==
MAX_THR && bestCSCEstimator ==
MAX_THR)
return false;
423 if (bestDTEstimator <= bestCSCEstimator) {
425 if (useDBforThr) getThresholdFromDB(initThr,
DetId(bestDTSeg.
chamberId()));
427 if (DYTselector == 0 || (DYTselector == 1 && bestDTEstimator < initThr) ||
428 (DYTselector == 2 && incompLayers < 2 && bestDTEstimator < initThr)) {
429 useSegment(bestDTSeg, tsosDT);
434 if (useDBforThr) getThresholdFromDB(initThr,
DetId(bestCSCSeg.
cscDetId()));
435 else getThresholdFromCFG(initThr,
DetId(bestCSCSeg.
cscDetId()));
436 if (DYTselector == 0 || (DYTselector == 1 && bestCSCEstimator < initThr) ||
437 (DYTselector == 2 && incompLayers < 2 && bestCSCEstimator < initThr)) {
438 useSegment(bestCSCSeg, tsosCSC);
448 vector<DYTThrObject::DytThrStruct> thrvector = dytThresholds->thrsVec;
449 for (vector<DYTThrObject::DytThrStruct>::const_iterator it = thrvector.begin(); it != thrvector.end(); it++) {
456 correctThrByPtAndEta(thr);
488 for(j=n-1; j>=
i; --
j)
489 if(recHits[j-1]->globalPosition().
mag() > recHits[j]->globalPosition().
mag())
swap (recHits[j-1],recHits[j]);
virtual std::vector< const TrackingRecHit * > recHits() const
Access to component RecHits (if any)
void compatibleDets(TrajectoryStateOnSurface &, std::map< int, std::vector< DetId > > &)
CSCDetId cscDetId() const
ConstRecHitPointer const & recHit() const
void sort(ConstRecHitContainer &)
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
void fillSegmentMaps(std::map< int, std::vector< DetId > > &, std::map< int, std::vector< DTRecSegment4D > > &, std::map< int, std::vector< CSCSegment > > &)
void useSegment(DTRecSegment4D const &, TrajectoryStateOnSurface const &)
GlobalPoint globalPosition() const
void getThresholdFromDB(double &, DetId const &)
virtual DTChamberId chamberId() const
The (specific) DetId of the chamber on which the segment resides.
void updateWithCSChits(TrajectoryStateOnSurface &, CSCSegment const &)
void testDTstation(TrajectoryStateOnSurface &, std::vector< DTRecSegment4D > const &, double &, DTRecSegment4D &, TrajectoryStateOnSurface &)
const Plane & surface() const
The nominal surface of the GeomDet.
void swap(Association< C > &lhs, Association< C > &rhs)
DataContainer const & measurements() const
void correctThrByPtAndEta(double &)
const SurfaceType & surface() const
TransientTrackingRecHit::ConstRecHitContainer ConstRecHitContainer
void update(const LocalTrajectoryParameters &p, const SurfaceType &aSurface, const MagneticField *field, SurfaceSide side=SurfaceSideDefinition::atCenterOfSurface)
void testCSCstation(TrajectoryStateOnSurface &, std::vector< CSCSegment > const &, double &, CSCSegment &, TrajectoryStateOnSurface &)
const bool isValidThdDB()
TransientTrackingRecHit::ConstRecHitContainer filter(const Trajectory &)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
const std::vector< CSCRecHit2D > & specificRecHits() const
TrajectoryStateOnSurface const & forwardPredictedState() const
Access to forward predicted state (from fitter or builder)
std::vector< ConstRecHitPointer > ConstRecHitContainer
void preliminaryFit(std::map< int, std::vector< DetId > >, std::map< int, std::vector< DTRecSegment4D > >, std::map< int, std::vector< CSCSegment > >)
DynamicTruncation(const edm::Event &, const MuonServiceProxy &)
void update(TrajectoryStateOnSurface &, ConstRecHitPointer)
void fillDYTInfos(int const &, bool const &, int &, double const &, double const &, DTRecSegment4D const &, CSCSegment const &)
TransientTrackingRecHit::ConstRecHitPointer ConstRecHitPointer
std::vector< std::vector< double > > tmp
GlobalVector globalMomentum() const
bool chooseLayers(int &, double const &, DTRecSegment4D const &, TrajectoryStateOnSurface const &, double const &, CSCSegment const &, TrajectoryStateOnSurface const &)
int stationfromDet(DetId const &)
DetId geographicalId() const
int station() const
Return the station number.
Detector det() const
get the detector field from this detid
T first(std::pair< T, U > const &p)
void updateWithDThits(TrajectoryStateOnSurface &, DTRecSegment4D const &)
void setThr(const std::vector< int > &)
void setUpdateState(bool)
void getThresholdFromCFG(double &, DetId const &)