CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SeedTransformer.cc
Go to the documentation of this file.
1 /*
2  * See header file for a description of this class.
3  *
4  * $Date: 2011/12/22 18:45:08 $
5  * $Revision: 1.9 $
6  * \author D. Trocino - University and INFN Torino
7  */
8 
10 
11 // System include files
12 #include <memory>
13 #include <Riostream.h>
14 
15 // Framework
23 
24 // Services and Tools
25 
26 // Geometry and Magnetic field
31 
32 // Other include files
41 
42 
44 
45 using namespace std;
46 using namespace edm;
47 using namespace reco;
48 
49 
51 
52  LogTrace("Reco|TrackingTools|SeedTransformer") << "SeedTransformer constructor called." << endl << endl;
53 
54  theFitterName = iConfig.getParameter<string>("Fitter");
55  theMuonRecHitBuilderName = iConfig.getParameter<string>("MuonRecHitBuilder");
56  thePropagatorName = iConfig.getParameter<string>("Propagator");
57 
58  nMinRecHits = iConfig.getParameter<unsigned int>("NMinRecHits");
59  errorRescale = iConfig.getParameter<double>("RescaleError");
60  useSubRecHits = iConfig.getParameter<bool>("UseSubRecHits");
61 }
62 
64 
65  LogTrace("Reco|TrackingTools|SeedTransformer") << "SeedTransformer destructor called." << endl << endl;
66 
67 }
68 
70 
71  iSetup.get<GlobalTrackingGeometryRecord>().get(theTrackingGeometry);
72  iSetup.get<IdealMagneticFieldRecord>().get(theMagneticField);
73  iSetup.get<TrajectoryFitter::Record>().get(theFitterName,theFitter);
74  iSetup.get<TransientRecHitRecord>().get(theMuonRecHitBuilderName,theMuonRecHitBuilder);
75  iSetup.get<TrackingComponentsRecord>().get(thePropagatorName,thePropagator);
76 
77 }
78 
79 vector<Trajectory> SeedTransformer::seedTransform(const TrajectorySeed& aSeed) const {
80 
81  const string metname = "Reco|TrackingTools|SeedTransformer";
82 
83  LogTrace(metname) << " Number of valid RecHits: " << aSeed.nHits() << endl;
84 
85  if( aSeed.nHits() < nMinRecHits ) {
86  LogTrace(metname) << " --- Too few RecHits, no refit performed! ---" << endl;
87  return vector<Trajectory>();
88  }
89 
90  TrajectoryStateOnSurface aTSOS(seedTransientState(aSeed));
91 
92  // Rescale errors before refit, not to bias the result
93  aTSOS.rescaleError(errorRescale);
94 
95  vector<TransientTrackingRecHit::ConstRecHitPointer> recHits;
96  unsigned int countRH = 0;
97 
98  for(TrajectorySeed::recHitContainer::const_iterator itRecHits=aSeed.recHits().first; itRecHits!=aSeed.recHits().second; ++itRecHits, ++countRH) {
99  if((*itRecHits).isValid()) {
100  TransientTrackingRecHit::ConstRecHitPointer ttrh(theMuonRecHitBuilder->build(&(*itRecHits)));
101 
102  if(useSubRecHits){
105  copy(subHits.begin(),subHits.end(),back_inserter(recHits));
106  }
107  else{
108  recHits.push_back(ttrh);
109  }
110  }
111  } // end for(TrajectorySeed::recHitContainer::const_iterator itRecHits=aSeed.recHits().first; itRecHits!=aSeed.recHits().second; ++itRecHits, ++countRH)
112 
113  TrajectoryStateOnSurface aInitTSOS = thePropagator->propagate(aTSOS, recHits.front()->det()->surface());
114 
115  if(!aInitTSOS.isValid()) {
116  LogTrace(metname) << " --- Initial state for refit not valid! ---" << endl;
117  return vector<Trajectory>();
118  }
119 
120  vector<Trajectory> refittedSeed = theFitter->fit(aSeed, recHits, aInitTSOS);
121 
122  if(refittedSeed.empty()) {
123  LogTrace(metname) << " --- Seed fit failed! ---" << endl;
124  return vector<Trajectory>();
125  }
126 
127  else if(!refittedSeed.front().isValid()) {
128  LogTrace(metname) << " --- Seed fitted, but trajectory not valid! ---" << endl;
129  return vector<Trajectory>();
130  }
131 
132  else
133  LogTrace(metname) << " +++ Seed fit succeded! +++" << endl;
134 
135  return refittedSeed;
136 
137 }
138 
140 
141  PTrajectoryStateOnDet tmpTSOD = tmpSeed.startingState();
142  DetId tmpDetId(tmpTSOD.detId());
143  const GeomDet* tmpGeomDet = theTrackingGeometry->idToDet(tmpDetId);
144 
145 
146  TrajectoryStateOnSurface tmpTSOS = trajectoryStateTransform::transientState(tmpTSOD, &(tmpGeomDet->surface()), &(*theMagneticField));
147 
148  return tmpTSOS;
149 
150 }
T getParameter(std::string const &) const
const std::string metname
void setServices(const edm::EventSetup &)
Set the services needed by the SeedTransformer.
virtual ~SeedTransformer()
Destructor.
static TransientTrackingRecHit::ConstRecHitContainer breakInSubRecHits(TransientTrackingRecHit::ConstRecHitPointer, int granularity)
takes a muon rechit and returns its sub-rechits given a certain granularity
std::vector< Trajectory > seedTransform(const TrajectorySeed &) const
Performs the fit.
SeedTransformer(const edm::ParameterSet &)
Constructor.
unsigned int detId() const
#define LogTrace(id)
std::vector< ConstRecHitPointer > ConstRecHitContainer
Definition: DetId.h:20
PTrajectoryStateOnDet const & startingState() const
TrajectoryStateOnSurface transientState(const PTrajectoryStateOnDet &ts, const Surface *surface, const MagneticField *field)
const T & get() const
Definition: EventSetup.h:55
range recHits() const
TrajectoryStateOnSurface seedTransientState(const TrajectorySeed &) const
unsigned int nHits() const
const Surface & surface() const