40 propagator = theService.propagator(
"SmartPropagatorAny");
41 propagatorPF = theService.propagator(
"SmartPropagatorAny");
42 propagatorCompatibleDet = theService.propagator(
"SmartPropagatorAny");
43 theG = theService.trackingGeometry();
53 if (useDBforThr) dytThresholds = thrManager->getInitialThresholds();
54 doUpdateOfKFStates =
true;
65 if (temp.
isValid()) tsos = updatorHandle->
update(tsos, *rechit);
70 vector<const TrackingRecHit*> DTrh = bestDTSeg.
recHits();
71 for (vector<const TrackingRecHit*>::iterator it = DTrh.begin(); it != DTrh.end(); it++) {
72 tmprecHits.push_back(theMuonRecHitBuilder->build(*it));
75 for (ConstRecHitContainer::const_iterator it = tmprecHits.begin(); it != tmprecHits.end(); ++it) {
76 DTLayerId layid((*it)->det()->geographicalId());
78 if (temp.isValid()) tsos = updatorHandle->
update(temp, **it);
85 for (vector<CSCRecHit2D>::iterator it = CSCrh.begin(); it != CSCrh.end(); ++it) {
86 tmprecHits.push_back(theMuonRecHitBuilder->build(&*it));
89 for (ConstRecHitContainer::const_iterator it = tmprecHits.begin(); it != tmprecHits.end(); ++it) {
90 const CSCLayer* cscLayer = cscGeom->layer((*it)->det()->geographicalId());
101 if (selector < 0 || selector > 2)
throw cms::Exception(
"NotAvailable") <<
"DYT selector: wrong option!" << endl;
105 DYTselector = selector;
114 doUpdateOfKFStates = upState;
118 if (thr.size() == 2) {
119 for (
unsigned int i = 0;
i < thr.size();
i++)
120 if (thr[
i] >= 0) Thrs.push_back(thr[
i]);
124 throw cms::Exception(
"NotAvailable") <<
"WARNING: wrong size for the threshold vector!\nExpected size: 2\n Found size: " << thr.size();
138 dtApeMap = thrManager->GetDTApeMap();
139 cscApeMap = thrManager->GetCSCApeMap();
142 vector<TrajectoryMeasurement> muonMeasurements = traj.
measurements();
144 for (vector<TrajectoryMeasurement>::const_iterator imT = muonMeasurements.begin(); imT != muonMeasurements.end(); imT++ ) {
145 if ( !(*imT).recHit()->isValid() )
continue;
148 result.push_back((*imT).recHit());
149 if (!(*imT).forwardPredictedState().isValid())
continue;
150 if ((*imT).forwardPredictedState().globalPosition().mag() >
170 map<int, vector<DetId> > compatibleIds;
171 map<int, vector<DTRecSegment4D> > dtSegMap;
172 map<int, vector<CSCSegment> > cscSegMap;
173 int incompConLay = 0;
177 compatibleDets(currentState, compatibleIds);
180 fillSegmentMaps(compatibleIds, dtSegMap, cscSegMap);
183 if (useDBforThr) preliminaryFit(compatibleIds, dtSegMap, cscSegMap);
186 for (
map<
int, vector<DetId> >::iterator it=compatibleIds.begin(); it!=compatibleIds.end(); ++it) {
187 int stLayer = stationfromDet(it->second.front());
190 double bestDTEstimator =
MAX_THR;
191 double bestCSCEstimator =
MAX_THR;
192 vector<DTRecSegment4D> dtSegs = dtSegMap[it->first];
193 vector<CSCSegment> cscSegs = cscSegMap[it->first];
197 testDTstation(currentState, dtSegs, bestDTEstimator, bestDTSeg, tsosDTlayer);
201 testCSCstation(currentState, cscSegs, bestCSCEstimator, bestCSCSeg, tsosCSClayer);
204 bool chosenLayer = chooseLayers(incompConLay, bestDTEstimator, bestDTSeg, tsosDTlayer, bestCSCEstimator, bestCSCSeg, tsosCSClayer);
205 fillDYTInfos(stLayer, chosenLayer, incompConLay, bestDTEstimator, bestCSCEstimator, bestDTSeg, bestCSCSeg);
227 double const &bestDTEstimator,
double const &bestCSCEstimator,
232 if (bestDTEstimator <= bestCSCEstimator) {
233 estimatorMap[st] = bestDTEstimator;
235 idChamberMap[st] = id;
238 idChamberMap[st] = id;
239 estimatorMap[st] = bestCSCEstimator;
241 usedStationMap[st] =
true;
244 estimatorMap[st] = -1;
245 usedStationMap[st] =
false;
254 vector<const DetLayer *> navLayers;
255 navLayers = navigation->compatibleLayers(*(currentState.freeState()),
alongMomentum);
256 unsigned int ilayerCorrected = 0;
257 for (
unsigned int ilayer=0; ilayer<navLayers.size(); ilayer++ ) {
262 vector<DetLayer::DetWithState> comps = navLayers[ilayer]->compatibleDets(currentState, *propagatorCompatibleDet, *theEstimator);
265 if (comps.size() > 0) {
266 for (
unsigned int icomp=0; icomp<comps.size(); icomp++ ) {
267 DetId id(comps[icomp].
first->geographicalId().rawId());
268 detMap[ilayerCorrected].push_back(
id);
272 if (theEstimator)
delete theEstimator;
278 map<
int, vector<DTRecSegment4D> > &dtSegMap,
279 map<
int, vector<CSCSegment> > &cscSegMap) {
280 for (
map<
int, vector<DetId> >::iterator it=compatibleIds.begin(); it!=compatibleIds.end(); ++it) {
281 vector<DetId> ids = compatibleIds[it->first];
282 for (
unsigned j = 0;
j < ids.size();
j++) {
285 vector<CSCSegment>
tmp = getSegs->getCSCSegmentsInChamber(ch);
286 for (
unsigned int k = 0;
k < tmp.size();
k++) cscSegMap[it->first].push_back(tmp[
k]);
290 vector<DTRecSegment4D>
tmp = getSegs->getDTSegmentsInChamber(ch);
291 for (
unsigned int k = 0;
k < tmp.size();
k++) dtSegMap[it->first].push_back(tmp[
k]);
301 if (segments.size() == 0)
return;
302 for (
unsigned int iSeg = 0; iSeg < segments.size(); iSeg++) {
304 if (!
propagator->propagate(startingState, theG->idToDet(chamber)->
surface()).isValid())
continue;
305 tsosdt =
propagator->propagate(startingState, theG->idToDet(chamber)->
surface());
312 if (estimator >= bestEstimator)
continue;
314 bestSeg = segments[iSeg];
322 if (segments.size() == 0)
return;
323 for (
unsigned int iSeg = 0; iSeg < segments.size(); iSeg++) {
324 CSCDetId chamber(segments[iSeg].cscDetId());
325 if (!
propagator->propagate(startingState, theG->idToDet(chamber)->
surface()).isValid())
continue;
326 tsoscsc =
propagator->propagate(startingState, theG->idToDet(chamber)->
surface());
333 if (estimator >= bestEstimator)
continue;
335 bestSeg = segments[iSeg];
342 result.push_back(theMuonRecHitBuilder->build(&bestDTSeg));
343 if (doUpdateOfKFStates) updateWithDThits(currentState, bestDTSeg);
344 else currentState = tsosDT;
350 result.push_back(theMuonRecHitBuilder->build(&bestCSCSeg));
351 if (doUpdateOfKFStates) updateWithCSChits(currentState, bestCSCSeg);
352 else currentState = tsosCSC;
358 map<
int, vector<CSCSegment> > cscSegMap) {
359 for (
map<
int, vector<DetId> >::iterator it=compatibleIds.begin(); it!=compatibleIds.end(); ++it) {
362 double bestDTEstimator =
MAX_THR;
363 double bestCSCEstimator =
MAX_THR;
365 vector<DTRecSegment4D> dtSegs = dtSegMap[it->first];
366 vector<CSCSegment> cscSegs = cscSegMap[it->first];
370 testDTstation(prelFitState, dtSegs, bestDTEstimator, bestDTSeg, tsosDTlayer);
374 testCSCstation(prelFitState, cscSegs, bestCSCEstimator, bestCSCSeg, tsosCSClayer);
377 if (bestDTEstimator ==
MAX_THR && bestCSCEstimator ==
MAX_THR)
continue;
378 if (bestDTEstimator <= bestCSCEstimator) {
380 if (bestDTEstimator >= initThr)
continue;
381 prelFitMeas.push_back(theMuonRecHitBuilder->build(&bestDTSeg));
382 prelFitState = updatorHandle->update(tsosDTlayer, *theMuonRecHitBuilder->build(&bestDTSeg));
385 if (bestCSCEstimator >= initThr)
continue;
386 prelFitMeas.push_back(theMuonRecHitBuilder->build(&bestCSCSeg));
387 prelFitState = updatorHandle->update(tsosCSClayer, *theMuonRecHitBuilder->build(&bestCSCSeg));
390 if (!prelFitMeas.empty()) prelFitMeas.pop_back();
391 for (
auto imrh = prelFitMeas.rbegin(); imrh != prelFitMeas.rend(); ++imrh) {
392 DetId id = (*imrh)->geographicalId();
394 if (tmp.
isValid()) prelFitState = tmp;
397 muonETAest = prelFitState.globalMomentum().eta();
405 if (bestDTEstimator ==
MAX_THR && bestCSCEstimator ==
MAX_THR)
return false;
406 if (bestDTEstimator <= bestCSCEstimator) {
408 if (useDBforThr) getThresholdFromDB(initThr,
DetId(bestDTSeg.
chamberId()));
410 if (DYTselector == 0 || (DYTselector == 1 && bestDTEstimator < initThr) ||
411 (DYTselector == 2 && incompLayers < 2 && bestDTEstimator < initThr)) {
412 useSegment(bestDTSeg, tsosDT);
417 if (useDBforThr) getThresholdFromDB(initThr,
DetId(bestCSCSeg.
cscDetId()));
418 else getThresholdFromCFG(initThr,
DetId(bestCSCSeg.
cscDetId()));
419 if (DYTselector == 0 || (DYTselector == 1 && bestCSCEstimator < initThr) ||
420 (DYTselector == 2 && incompLayers < 2 && bestCSCEstimator < initThr)) {
421 useSegment(bestCSCSeg, tsosCSC);
431 vector<DYTThrObject::DytThrStruct> thrvector = dytThresholds->thrsVec;
432 for (vector<DYTThrObject::DytThrStruct>::const_iterator it = thrvector.begin(); it != thrvector.end(); it++) {
439 correctThrByPtAndEta(thr);
471 for(j=n-1; j>=
i; --
j)
472 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
tuple Chi2MeasurementEstimator
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 &)