CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Types | Public Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes
MuonTrackLoader Class Reference

#include <MuonTrackLoader.h>

Public Types

typedef
MuonCandidate::CandidateContainer 
CandidateContainer
 
typedef
MuonCandidate::TrajectoryContainer 
TrajectoryContainer
 

Public Member Functions

edm::OrphanHandle
< reco::TrackCollection
loadTracks (const TrajectoryContainer &, edm::Event &, const TrackerTopology &ttopo, const std::string &="", bool=true)
 Convert the trajectories into tracks and load the tracks in the event. More...
 
edm::OrphanHandle
< reco::TrackCollection
loadTracks (const TrajectoryContainer &, edm::Event &, std::vector< bool > &, const TrackerTopology &ttopo, const std::string &="", bool=true)
 Convert the trajectories into tracks and load the tracks in the event. More...
 
edm::OrphanHandle
< reco::TrackCollection
loadTracks (const TrajectoryContainer &, edm::Event &, const std::vector< std::pair< Trajectory *, reco::TrackRef > > &, edm::Handle< reco::TrackCollection > const &trackHandle, const TrackerTopology &ttopo, const std::string &="", bool=true)
 Convert the trajectories into tracks and load the tracks in the event. More...
 
edm::OrphanHandle
< reco::MuonTrackLinksCollection
loadTracks (const CandidateContainer &, edm::Event &, const TrackerTopology &ttopo)
 Convert the trajectories into tracks and load the tracks in the event. More...
 
 MuonTrackLoader (edm::ParameterSet &parameterSet, edm::ConsumesCollector &iC, const MuonServiceProxy *service=0)
 Constructor for the STA reco the args must be specify! More...
 
virtual ~MuonTrackLoader ()
 Destructor. More...
 

Private Member Functions

std::pair< bool, reco::TrackbuildTrackAtPCA (const Trajectory &trajectory, const reco::BeamSpot &) const
 Build a track at the PCA WITHOUT any vertex constriant. More...
 
reco::TrackExtra buildTrackExtra (const Trajectory &) const
 
std::pair< bool, reco::TrackbuildTrackUpdatedAtPCA (const reco::Track &trackAtPCA, const reco::BeamSpot &) const
 Takes a track at the PCA and applies the vertex constriant. More...
 

Static Private Member Functions

static std::vector< const
TrackingRecHit * > 
unpackHit (const TrackingRecHit &hit)
 

Private Attributes

TkClonerImpl hitCloner
 
bool theAllowNoVtxFlag
 
edm::InputTag theBeamSpotInputTag
 
edm::EDGetTokenT< reco::BeamSpottheBeamSpotToken
 
std::string theL2SeededTkLabel
 Label for L2SeededTracks. More...
 
bool thePutTkTrackFlag
 
const MuonServiceProxytheService
 
std::unique_ptr
< TrajectorySmoother
theSmoother
 
std::string theSmootherName
 
bool theSmoothingStep
 
bool theSmoothTkTrackFlag
 
std::string theTrackerRecHitBuilderName
 
bool theTrajectoryFlag
 
bool theUpdatingAtVtx
 
MuonUpdatorAtVertextheUpdatorAtVtx
 

Detailed Description

Class to load the tracks in the event, it provide some common functionalities both for all the RecoMuon producers.

Author
R. Bellan - INFN Torino ricca.nosp@m.rdo..nosp@m.bella.nosp@m.n@ce.nosp@m.rn.ch

Class to load the product in the event

Author
R. Bellan - INFN Torino ricca.nosp@m.rdo..nosp@m.bella.nosp@m.n@ce.nosp@m.rn.ch

Definition at line 40 of file MuonTrackLoader.h.

Member Typedef Documentation

Definition at line 44 of file MuonTrackLoader.h.

Definition at line 43 of file MuonTrackLoader.h.

Constructor & Destructor Documentation

MuonTrackLoader::MuonTrackLoader ( edm::ParameterSet parameterSet,
edm::ConsumesCollector iC,
const MuonServiceProxy service = 0 
)

Constructor for the STA reco the args must be specify!

Definition at line 87 of file MuonTrackLoader.cc.

References edm::ConsumesCollector::consumes(), edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), MuonUpdatorAtVertex_cff::MuonUpdatorAtVertex, AlCaHLTBitMon_QueryRunRegistry::string, theAllowNoVtxFlag, theBeamSpotInputTag, theBeamSpotToken, theL2SeededTkLabel, thePutTkTrackFlag, theSmootherName, theSmoothingStep, theSmoothTkTrackFlag, theTrackerRecHitBuilderName, theTrajectoryFlag, theUpdatingAtVtx, and theUpdatorAtVtx.

87  :
88  theService(service){
89 
90 
91  // option to do or not the smoothing step.
92  // the trajectories which are passed to the track loader are supposed to be non-smoothed
93  theSmoothingStep = parameterSet.getParameter<bool>("DoSmoothing");
95  theSmootherName = parameterSet.getParameter<string>("Smoother");
96 
97  theTrackerRecHitBuilderName = parameterSet.getParameter<std::string>("TTRHBuilder");
98 
99  // update at vertex
100  theUpdatingAtVtx = parameterSet.getParameter<bool>("VertexConstraint");
101 
102  // beam spot input tag
103  theBeamSpotInputTag = parameterSet.getParameter<edm::InputTag>("beamSpot");
105 
106 
107  // Flag to put the trajectory into the event
108  theTrajectoryFlag = parameterSet.getUntrackedParameter<bool>("PutTrajectoryIntoEvent",true);
109 
110  theL2SeededTkLabel = parameterSet.getUntrackedParameter<string>("MuonSeededTracksInstance",string());
111 
112  ParameterSet updatorPar = parameterSet.getParameter<ParameterSet>("MuonUpdatorAtVertexParameters");
113  theUpdatorAtVtx = new MuonUpdatorAtVertex(updatorPar,service);
114 
115  thePutTkTrackFlag = parameterSet.getUntrackedParameter<bool>("PutTkTrackIntoEvent",false);
116  theSmoothTkTrackFlag = parameterSet.getUntrackedParameter<bool>("SmoothTkTrack",false);
117  theAllowNoVtxFlag = parameterSet.getUntrackedParameter<bool>("AllowNoVertex",false);
118 }
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
T getParameter(std::string const &) const
edm::EDGetTokenT< reco::BeamSpot > theBeamSpotToken
T getUntrackedParameter(std::string const &, T const &) const
std::string theSmootherName
edm::InputTag theBeamSpotInputTag
std::string theTrackerRecHitBuilderName
MuonUpdatorAtVertex * theUpdatorAtVtx
std::string theL2SeededTkLabel
Label for L2SeededTracks.
const MuonServiceProxy * theService
MuonTrackLoader::~MuonTrackLoader ( )
virtual

Destructor.

Definition at line 120 of file MuonTrackLoader.cc.

References theUpdatorAtVtx.

120  {
121  if(theUpdatorAtVtx) delete theUpdatorAtVtx;
122 }
MuonUpdatorAtVertex * theUpdatorAtVtx

Member Function Documentation

pair< bool, reco::Track > MuonTrackLoader::buildTrackAtPCA ( const Trajectory trajectory,
const reco::BeamSpot beamSpot 
) const
private

Build a track at the PCA WITHOUT any vertex constriant.

Definition at line 697 of file MuonTrackLoader.cc.

References FreeTrajectoryState::charge(), Trajectory::chiSquared(), FreeTrajectoryState::curvilinearError(), debug, MuonPatternRecoDumper::dumpFTS(), TrajectoryStateOnSurface::freeState(), Trajectory::geometricalInnermostState(), TrajectoryStateOnSurface::globalPosition(), TrackerBounds::isInside(), LogTrace, FreeTrajectoryState::momentum(), ndof, Trajectory::ndof(), AlCaHLTBitMon_ParallelJobs::p, FreeTrajectoryState::position(), MuonUpdatorAtVertex::propagate(), theAllowNoVtxFlag, theService, theUpdatorAtVtx, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

697  {
698 
699  const string metname = "Muon|RecoMuon|MuonTrackLoader";
700 
702 
703  // FIXME: check the prop direction
704  TrajectoryStateOnSurface innerTSOS = trajectory.geometricalInnermostState();
705 
706  // This is needed to extrapolate the tsos at vertex
707  LogTrace(metname) << "Propagate to PCA...";
708  pair<bool,FreeTrajectoryState>
709  extrapolationResult = theUpdatorAtVtx->propagate(innerTSOS, beamSpot);
710  FreeTrajectoryState ftsAtVtx;
711 
712  if(extrapolationResult.first)
713  ftsAtVtx = extrapolationResult.second;
714  else{
715  if(TrackerBounds::isInside(innerTSOS.globalPosition())){
716  LogInfo(metname) << "Track in the Tracker: taking the innermost state instead of the state at PCA";
717  ftsAtVtx = *innerTSOS.freeState();
718  }
719  else{
720  if ( theAllowNoVtxFlag ) {
721  LogInfo(metname) << "Propagation to PCA failed, taking the innermost state instead of the state at PCA";
722  ftsAtVtx = *innerTSOS.freeState();
723  } else {
724  LogInfo(metname) << "Stand Alone track: this track will be rejected";
725  return pair<bool,reco::Track>(false,reco::Track());
726  }
727  }
728  }
729 
730  LogTrace(metname) << "TSOS after the extrapolation at vtx";
731  LogTrace(metname) << debug.dumpFTS(ftsAtVtx);
732 
733  GlobalPoint pca = ftsAtVtx.position();
734  math::XYZPoint persistentPCA(pca.x(),pca.y(),pca.z());
735  GlobalVector p = ftsAtVtx.momentum();
736  math::XYZVector persistentMomentum(p.x(),p.y(),p.z());
737 
738  bool bon = true;
739  if(fabs(theService->magneticField()->inTesla(GlobalPoint(0,0,0)).z()) < 0.01) bon=false;
740  double ndof = trajectory.ndof(bon);
741 
742  reco::Track track(trajectory.chiSquared(),
743  ndof,
744  persistentPCA,
745  persistentMomentum,
746  ftsAtVtx.charge(),
747  ftsAtVtx.curvilinearError());
748 
749  return pair<bool,reco::Track>(true,track);
750 }
static bool isInside(const GlobalPoint &)
const std::string metname
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
T y() const
Definition: PV3DBase.h:63
std::pair< bool, FreeTrajectoryState > propagate(const TrajectoryStateOnSurface &tsos, const reco::BeamSpot &beamSpot) const
Propagate the state to the 2D-PCA.
GlobalPoint globalPosition() const
TrackCharge charge() const
TrajectoryStateOnSurface geometricalInnermostState() const
Definition: Trajectory.cc:193
const CurvilinearTrajectoryError & curvilinearError() const
std::string dumpFTS(const FreeTrajectoryState &fts) const
FreeTrajectoryState const * freeState(bool withErrors=true) const
T z() const
Definition: PV3DBase.h:64
MuonUpdatorAtVertex * theUpdatorAtVtx
GlobalVector momentum() const
#define LogTrace(id)
GlobalPoint position() const
int ndof(bool bon=true) const
Definition: Trajectory.cc:85
#define debug
Definition: HDRShower.cc:19
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:30
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
float chiSquared() const
Definition: Trajectory.h:307
const MuonServiceProxy * theService
T x() const
Definition: PV3DBase.h:62
reco::TrackExtra MuonTrackLoader::buildTrackExtra ( const Trajectory trajectory) const
private

Definition at line 791 of file MuonTrackLoader.cc.

References alongMomentum, Surface::bounds(), TrajectoryStateOnSurface::curvilinearError(), Trajectory::direction(), Trajectory::firstMeasurement(), TrajectoryStateOnSurface::globalParameters(), Bounds::inside(), Trajectory::lastMeasurement(), LogTrace, GlobalTrajectoryParameters::momentum(), oppositeToMomentum, AlCaHLTBitMon_ParallelJobs::p, GlobalTrajectoryParameters::position(), TrajectoryMeasurement::recHit(), Trajectory::recHits(), Trajectory::seedRef(), GeomDet::surface(), theService, GeomDet::toLocal(), TrajectoryMeasurement::updatedState(), findQualityFiles::v, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

791  {
792 
793  const string metname = "Muon|RecoMuon|MuonTrackLoader";
794 
795  const Trajectory::RecHitContainer transRecHits = trajectory.recHits();
796 
797  // put the collection of TrackingRecHit in the event
798 
799  // sets the outermost and innermost TSOSs
800  // FIXME: check it!
801  TrajectoryStateOnSurface outerTSOS;
802  TrajectoryStateOnSurface innerTSOS;
803  unsigned int innerId=0, outerId=0;
805  DetId outerDetId;
806 
807  if (trajectory.direction() == alongMomentum) {
808  LogTrace(metname)<<"alongMomentum";
809  outerTSOS = trajectory.lastMeasurement().updatedState();
810  innerTSOS = trajectory.firstMeasurement().updatedState();
811  outerId = trajectory.lastMeasurement().recHit()->geographicalId().rawId();
812  innerId = trajectory.firstMeasurement().recHit()->geographicalId().rawId();
813  outerRecHit = trajectory.lastMeasurement().recHit();
814  outerDetId = trajectory.lastMeasurement().recHit()->geographicalId();
815  }
816  else if (trajectory.direction() == oppositeToMomentum) {
817  LogTrace(metname)<<"oppositeToMomentum";
818  outerTSOS = trajectory.firstMeasurement().updatedState();
819  innerTSOS = trajectory.lastMeasurement().updatedState();
820  outerId = trajectory.firstMeasurement().recHit()->geographicalId().rawId();
821  innerId = trajectory.lastMeasurement().recHit()->geographicalId().rawId();
822  outerRecHit = trajectory.firstMeasurement().recHit();
823  outerDetId = trajectory.firstMeasurement().recHit()->geographicalId();
824  }
825  else LogError(metname)<<"Wrong propagation direction!";
826 
827  const GeomDet *outerDet = theService->trackingGeometry()->idToDet(outerDetId);
828  GlobalPoint outerTSOSPos = outerTSOS.globalParameters().position();
829  bool inside = outerDet->surface().bounds().inside(outerDet->toLocal(outerTSOSPos));
830 
831 
832  GlobalPoint hitPos = (outerRecHit->isValid()) ? outerRecHit->globalPosition() : outerTSOS.globalParameters().position() ;
833 
834  if(!inside) {
835  LogTrace(metname)<<"The Global Muon outerMostMeasurementState is not compatible with the recHit detector! Setting outerMost postition to recHit position if recHit isValid: " << outerRecHit->isValid();
836  LogTrace(metname)<<"From " << outerTSOSPos << " to " << hitPos;
837  }
838 
839 
840  //build the TrackExtra
841  GlobalPoint v = (inside) ? outerTSOSPos : hitPos ;
842  GlobalVector p = outerTSOS.globalParameters().momentum();
843  math::XYZPoint outpos( v.x(), v.y(), v.z() );
844  math::XYZVector outmom( p.x(), p.y(), p.z() );
845 
846  v = innerTSOS.globalParameters().position();
847  p = innerTSOS.globalParameters().momentum();
848  math::XYZPoint inpos( v.x(), v.y(), v.z() );
849  math::XYZVector inmom( p.x(), p.y(), p.z() );
850 
851  reco::TrackExtra trackExtra(outpos, outmom, true, inpos, inmom, true,
852  outerTSOS.curvilinearError(), outerId,
853  innerTSOS.curvilinearError(), innerId,
854  trajectory.direction(),trajectory.seedRef());
855 
856  return trackExtra;
857 
858 }
ConstRecHitPointer const & recHit() const
virtual bool inside(const Local3DPoint &) const =0
Determine if the point is inside the bounds.
const std::string metname
const CurvilinearTrajectoryError & curvilinearError() const
T y() const
Definition: PV3DBase.h:63
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:67
ConstRecHitContainer recHits() const
Definition: Trajectory.h:258
const Bounds & bounds() const
Definition: Surface.h:120
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:40
PropagationDirection const & direction() const
Definition: Trajectory.cc:125
TrajectoryMeasurement const & lastMeasurement() const
Definition: Trajectory.h:228
T z() const
Definition: PV3DBase.h:64
edm::RefToBase< TrajectorySeed > seedRef(void) const
Definition: Trajectory.h:361
#define LogTrace(id)
Definition: DetId.h:18
TrajectoryMeasurement const & firstMeasurement() const
Definition: Trajectory.h:241
ConstRecHitContainer RecHitContainer
Definition: Trajectory.h:46
const GlobalTrajectoryParameters & globalParameters() const
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:30
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
TrackingRecHit::ConstRecHitPointer ConstRecHitPointer
const MuonServiceProxy * theService
TrajectoryStateOnSurface const & updatedState() const
T x() const
Definition: PV3DBase.h:62
pair< bool, reco::Track > MuonTrackLoader::buildTrackUpdatedAtPCA ( const reco::Track trackAtPCA,
const reco::BeamSpot beamSpot 
) const
private

Takes a track at the PCA and applies the vertex constriant.

Definition at line 753 of file MuonTrackLoader.cc.

References FreeTrajectoryState::charge(), reco::TrackBase::chi2(), FreeTrajectoryState::curvilinearError(), debug, MuonPatternRecoDumper::dumpFTS(), LogTrace, FreeTrajectoryState::momentum(), reco::TrackBase::ndof(), AlCaHLTBitMon_ParallelJobs::p, FreeTrajectoryState::position(), theService, theUpdatorAtVtx, MuonUpdatorAtVertex::update(), PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

753  {
754 
755  const string metname = "Muon|RecoMuon|MuonTrackLoader";
757 
758  // build the transient track
759  reco::TransientTrack transientTrack(track,
760  &*theService->magneticField(),
761  theService->trackingGeometry());
762 
763  LogTrace(metname) << "Apply the vertex constraint";
764  pair<bool,FreeTrajectoryState> updateResult = theUpdatorAtVtx->update(transientTrack,beamSpot);
765 
766  if(!updateResult.first){
767  return pair<bool,reco::Track>(false,reco::Track());
768  }
769 
770  LogTrace(metname) << "FTS after the vertex constraint";
771  FreeTrajectoryState &ftsAtVtx = updateResult.second;
772 
773  LogTrace(metname) << debug.dumpFTS(ftsAtVtx);
774 
775  GlobalPoint pca = ftsAtVtx.position();
776  math::XYZPoint persistentPCA(pca.x(),pca.y(),pca.z());
777  GlobalVector p = ftsAtVtx.momentum();
778  math::XYZVector persistentMomentum(p.x(),p.y(),p.z());
779 
780  reco::Track updatedTrack(track.chi2(),
781  track.ndof(),
782  persistentPCA,
783  persistentMomentum,
784  ftsAtVtx.charge(),
785  ftsAtVtx.curvilinearError());
786 
787  return pair<bool,reco::Track>(true,updatedTrack);
788 }
const std::string metname
T y() const
Definition: PV3DBase.h:63
TrackCharge charge() const
const CurvilinearTrajectoryError & curvilinearError() const
std::string dumpFTS(const FreeTrajectoryState &fts) const
std::pair< bool, FreeTrajectoryState > update(const reco::TransientTrack &track, const reco::BeamSpot &beamSpot) const
Applies the vertex constraint.
T z() const
Definition: PV3DBase.h:64
MuonUpdatorAtVertex * theUpdatorAtVtx
GlobalVector momentum() const
#define LogTrace(id)
GlobalPoint position() const
#define debug
Definition: HDRShower.cc:19
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:30
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
const MuonServiceProxy * theService
T x() const
Definition: PV3DBase.h:62
edm::OrphanHandle<reco::TrackCollection> MuonTrackLoader::loadTracks ( const TrajectoryContainer ,
edm::Event ,
const TrackerTopology ttopo,
const std::string &  = "",
bool  = true 
)

Convert the trajectories into tracks and load the tracks in the event.

Referenced by MuonTrackFinder::load(), and loadTracks().

edm::OrphanHandle<reco::TrackCollection> MuonTrackLoader::loadTracks ( const TrajectoryContainer ,
edm::Event ,
std::vector< bool > &  ,
const TrackerTopology ttopo,
const std::string &  = "",
bool  = true 
)

Convert the trajectories into tracks and load the tracks in the event.

edm::OrphanHandle<reco::TrackCollection> MuonTrackLoader::loadTracks ( const TrajectoryContainer ,
edm::Event ,
const std::vector< std::pair< Trajectory *, reco::TrackRef > > &  ,
edm::Handle< reco::TrackCollection > const &  trackHandle,
const TrackerTopology ttopo,
const std::string &  = "",
bool  = true 
)

Convert the trajectories into tracks and load the tracks in the event.

OrphanHandle< reco::MuonTrackLinksCollection > MuonTrackLoader::loadTracks ( const CandidateContainer muonCands,
edm::Event event,
const TrackerTopology ttopo 
)

Convert the trajectories into tracks and load the tracks in the event.

Definition at line 367 of file MuonTrackLoader.cc.

References edm::OrphanHandleBase::isValid(), electronStore::links, loadTracks(), LogDebug, LogTrace, position, reco::MuonTrackLinks::setGlobalTrack(), reco::MuonTrackLinks::setStandAloneTrack(), reco::MuonTrackLinks::setTrackerTrack(), theL2SeededTkLabel, thePutTkTrackFlag, theSmoothTkTrackFlag, and HLT_FULL_cff::trackCollection.

369  {
370 
371  const string metname = "Muon|RecoMuon|MuonTrackLoader";
372 
373  // the muon collection, it will be loaded in the event
374  auto_ptr<reco::MuonTrackLinksCollection> trackLinksCollection(new reco::MuonTrackLinksCollection());
375 
376  // don't waste any time...
377  if ( muonCands.empty() ) {
378  auto_ptr<reco::TrackExtraCollection> trackExtraCollection(new reco::TrackExtraCollection() );
379  auto_ptr<TrackingRecHitCollection> recHitCollection(new TrackingRecHitCollection() );
380  auto_ptr<reco::TrackCollection> trackCollection( new reco::TrackCollection() );
381 
382  event.put(recHitCollection);
383  event.put(trackExtraCollection);
384  event.put(trackCollection);
385 
386  //need to also put the tracker tracks collection if requested
387  if(thePutTkTrackFlag){
388  //will take care of putting nothing in the event but the empty collection
389  TrajectoryContainer trackerTrajs;
390  loadTracks(trackerTrajs, event, ttopo, theL2SeededTkLabel, theSmoothTkTrackFlag);
391  }
392 
393  return event.put(trackLinksCollection);
394  }
395 
396  // get combined Trajectories
397  TrajectoryContainer combinedTrajs;
398  TrajectoryContainer trackerTrajs;
399  for (CandidateContainer::const_iterator it = muonCands.begin(); it != muonCands.end(); ++it) {
400  LogDebug(metname) << "Loader glbSeedRef " << (*it)->trajectory()->seedRef().isNonnull();
401  if ((*it)->trackerTrajectory() ) LogDebug(metname) << " " << "tkSeedRef " << (*it)->trackerTrajectory()->seedRef().isNonnull();
402 
403  combinedTrajs.push_back((*it)->trajectory());
404  if ( thePutTkTrackFlag ) trackerTrajs.push_back((*it)->trackerTrajectory());
405 
406  else {
407  if ((*it)->trackerTrajectory()) delete ((*it)->trackerTrajectory());
408  }
409 
410  // // Create the links between sta and tracker tracks
411  // reco::MuonTrackLinks links;
412  // links.setStandAloneTrack((*it)->muonTrack());
413  // links.setTrackerTrack((*it)->trackerTrack());
414  // trackLinksCollection->push_back(links);
415  // delete *it;
416  }
417 
418  // create the TrackCollection of combined Trajectories
419  // FIXME: could this be done one track at a time in the previous loop?
420  LogTrace(metname) << "Build combinedTracks";
421  std::vector<bool> combTksVec(combinedTrajs.size(), false);
422  OrphanHandle<reco::TrackCollection> combinedTracks = loadTracks(combinedTrajs, event, combTksVec, ttopo);
423 
425  std::vector<bool> trackerTksVec(trackerTrajs.size(), false);
426  if(thePutTkTrackFlag) {
427  LogTrace(metname) << "Build trackerTracks: "
428  << trackerTrajs.size();
429  trackerTracks = loadTracks(trackerTrajs, event, trackerTksVec, ttopo, theL2SeededTkLabel, theSmoothTkTrackFlag);
430  } else {
431  for (TrajectoryContainer::iterator it = trackerTrajs.begin(); it != trackerTrajs.end(); ++it) {
432  if(*it) delete *it;
433  }
434  }
435 
436  LogTrace(metname) << "Set the final links in the MuonTrackLinks collection";
437 
438  unsigned int candposition(0), position(0), tkposition(0);
439  //reco::TrackCollection::const_iterator glIt = combinedTracks->begin(),
440  // glEnd = combinedTracks->end();
441 
442  for (CandidateContainer::const_iterator it = muonCands.begin(); it != muonCands.end(); ++it, ++candposition) {
443 
444  // The presence of the global track determines whether to fill the MuonTrackLinks or not
445  // N.B. We are assuming here that the global tracks in "combinedTracks"
446  // have the same order as the muon candidates in "muonCands"
447  // (except for possible missing tracks), which should always be the case...
448  //if( glIt == glEnd ) break;
449  if(combTksVec[candposition]) {
450  reco::TrackRef combinedTR(combinedTracks, position++);
451  //++glIt;
452 
453  // Create the links between sta and tracker tracks
455  links.setStandAloneTrack((*it)->muonTrack());
456  links.setTrackerTrack((*it)->trackerTrack());
457  links.setGlobalTrack(combinedTR);
458 
459  if(thePutTkTrackFlag && trackerTksVec[candposition]) {
460  reco::TrackRef trackerTR(trackerTracks, tkposition++);
461  links.setTrackerTrack(trackerTR);
462  }
463 
464  trackLinksCollection->push_back(links);
465  }
466 
467  else { // if no global track, still increment the tracker-track counter when appropriate
468  if(thePutTkTrackFlag && trackerTksVec[candposition]) tkposition++;
469  }
470 
471  delete *it;
472  }
473 
474  if( thePutTkTrackFlag && trackerTracks.isValid() && !(combinedTracks->size() > 0 && trackerTracks->size() > 0 ) )
475  LogWarning(metname)<<"The MuonTrackLinkCollection is incomplete";
476 
477  // put the MuonCollection in the event
478  LogTrace(metname) << "put the MuonCollection in the event" << "\n";
479 
480  return event.put(trackLinksCollection);
481 }
#define LogDebug(id)
const std::string metname
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:14
std::vector< MuonTrackLinks > MuonTrackLinksCollection
collection of MuonTrackLinks
Definition: MuonFwd.h:22
edm::OrphanHandle< reco::TrackCollection > loadTracks(const TrajectoryContainer &, edm::Event &, const TrackerTopology &ttopo, const std::string &="", bool=true)
Convert the trajectories into tracks and load the tracks in the event.
#define LogTrace(id)
MuonCandidate::TrajectoryContainer TrajectoryContainer
std::vector< TrackExtra > TrackExtraCollection
collection of TrackExtra objects
Definition: TrackExtraFwd.h:11
edm::OwnVector< TrackingRecHit > TrackingRecHitCollection
collection of TrackingRecHits
tuple trackCollection
std::string theL2SeededTkLabel
Label for L2SeededTracks.
static int position[264][3]
Definition: ReadPGInfo.cc:509
std::vector< const TrackingRecHit * > MuonTrackLoader::unpackHit ( const TrackingRecHit hit)
staticprivate

Definition at line 47 of file MuonTrackLoader.cc.

References filterCSVwithJSON::copy, MuonSubdetId::CSC, DetId::det(), TrackingRecHit::dimension(), MuonSubdetId::DT, TrackingRecHit::geographicalId(), DetId::Muon, TrackingRecHit::recHits(), MuonSubdetId::RPC, and DetId::Tracker.

48 {
49  // get rec hit det id and rec hit type
50  DetId id = hit.geographicalId();
51  uint16_t detid = id.det();
52 
53  std::vector<const TrackingRecHit*> hits;
54 
55  if (detid == DetId::Tracker) {
56  hits.push_back(&hit);
57  } else if (detid == DetId::Muon) {
58  uint16_t subdet = id.subdetId();
59  if (subdet == (uint16_t) MuonSubdetId::DT) {
60  if (hit.dimension() == 1) { // DT rechit (granularity 2)
61  hits.push_back(&hit);
62  } else if (hit.dimension() > 1) { // 4D segment (granularity 0).
63  // Both 2 and 4 dim cases. MB4s have 2D, but formatted in 4D segment
64  // 4D --> 2D
65  std::vector<const TrackingRecHit*> seg2D = hit.recHits();
66  // load 1D hits (2D --> 1D)
67  for (std::vector<const TrackingRecHit*>::const_iterator it = seg2D.begin(); it != seg2D.end(); ++it) {
68  std::vector<const TrackingRecHit*> hits1D = (*it)->recHits();
69  copy(hits1D.begin(), hits1D.end(), back_inserter(hits));
70  }
71  }
72  } else if (subdet == (uint16_t) MuonSubdetId::CSC) {
73  if (hit.dimension() == 2) { // CSC rechit (granularity 2)
74  hits.push_back(&hit);
75  } else if (hit.dimension() == 4) { // 4D segment (granularity 0)
76  // load 2D hits (4D --> 1D)
77  hits = hit.recHits();
78  }
79  } else if (subdet == (uint16_t) MuonSubdetId::RPC) {
80  hits.push_back(&hit);
81  }
82  }
83  return hits;
84 }
virtual int dimension() const =0
static const int CSC
Definition: MuonSubdetId.h:13
virtual std::vector< const TrackingRecHit * > recHits() const =0
Access to component RecHits (if any)
Definition: DetId.h:18
static const int RPC
Definition: MuonSubdetId.h:14
static const int DT
Definition: MuonSubdetId.h:12
DetId geographicalId() const
Detector det() const
get the detector field from this detid
Definition: DetId.h:35

Member Data Documentation

TkClonerImpl MuonTrackLoader::hitCloner
private

Definition at line 101 of file MuonTrackLoader.h.

bool MuonTrackLoader::theAllowNoVtxFlag
private

Definition at line 111 of file MuonTrackLoader.h.

Referenced by buildTrackAtPCA(), and MuonTrackLoader().

edm::InputTag MuonTrackLoader::theBeamSpotInputTag
private

Definition at line 104 of file MuonTrackLoader.h.

Referenced by MuonTrackLoader().

edm::EDGetTokenT<reco::BeamSpot> MuonTrackLoader::theBeamSpotToken
private

Definition at line 105 of file MuonTrackLoader.h.

Referenced by MuonTrackLoader().

std::string MuonTrackLoader::theL2SeededTkLabel
private

Label for L2SeededTracks.

Definition at line 108 of file MuonTrackLoader.h.

Referenced by loadTracks(), and MuonTrackLoader().

bool MuonTrackLoader::thePutTkTrackFlag
private

Definition at line 109 of file MuonTrackLoader.h.

Referenced by loadTracks(), and MuonTrackLoader().

const MuonServiceProxy* MuonTrackLoader::theService
private

Definition at line 90 of file MuonTrackLoader.h.

Referenced by buildTrackAtPCA(), buildTrackExtra(), and buildTrackUpdatedAtPCA().

std::unique_ptr<TrajectorySmoother> MuonTrackLoader::theSmoother
private

Definition at line 100 of file MuonTrackLoader.h.

std::string MuonTrackLoader::theSmootherName
private

Definition at line 98 of file MuonTrackLoader.h.

Referenced by MuonTrackLoader().

bool MuonTrackLoader::theSmoothingStep
private

Definition at line 97 of file MuonTrackLoader.h.

Referenced by MuonTrackLoader().

bool MuonTrackLoader::theSmoothTkTrackFlag
private

Definition at line 110 of file MuonTrackLoader.h.

Referenced by loadTracks(), and MuonTrackLoader().

std::string MuonTrackLoader::theTrackerRecHitBuilderName
private

Definition at line 99 of file MuonTrackLoader.h.

Referenced by MuonTrackLoader().

bool MuonTrackLoader::theTrajectoryFlag
private

Definition at line 95 of file MuonTrackLoader.h.

Referenced by MuonTrackLoader().

bool MuonTrackLoader::theUpdatingAtVtx
private

Definition at line 92 of file MuonTrackLoader.h.

Referenced by MuonTrackLoader().

MuonUpdatorAtVertex* MuonTrackLoader::theUpdatorAtVtx
private