CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TwoBodyDecayTrajectoryFactory.cc
Go to the documentation of this file.
9 
11 
13 
15 
18 
19 
22 
24 
31 {
32 public:
33 
37 
40 
44  const reco::BeamSpot &beamSpot) const override;
45 
48  const ExternalPredictionCollection &external,
49  const reco::BeamSpot &beamSpot) const override;
50 
51  virtual TwoBodyDecayTrajectoryFactory* clone() const override { return new TwoBodyDecayTrajectoryFactory(*this); }
52 
53 protected:
55  const TwoBodyDecay &tbd,
56  const MagneticField *magField,
57  const reco::BeamSpot &beamSpot,
58  bool setParameterErrors) const;
59 
60  bool match(const TrajectoryStateOnSurface &state,
62 
64 
68 
73 
74 };
75 
79 
81  : TrajectoryFactoryBase( config ),
82  theFitter( new TwoBodyDecayFitter( config ) )
83 {
84  const edm::ParameterSet ppc = config.getParameter< edm::ParameterSet >( "ParticleProperties" );
85  thePrimaryMass = ppc.getParameter< double >( "PrimaryMass" );
86  thePrimaryWidth = ppc.getParameter< double >( "PrimaryWidth" );
87  theSecondaryMass = ppc.getParameter< double >( "SecondaryMass" );
88 
89  theNSigmaCutValue = config.getParameter< double >( "NSigmaCut" );
90  theChi2CutValue = config.getParameter< double >( "Chi2Cut" );
91  theUseRefittedStateFlag = config.getParameter< bool >( "UseRefittedState" );
92  theConstructTsosWithErrorsFlag = config.getParameter< bool >( "ConstructTsosWithErrors" );
93 }
94 
96 {
97  delete theFitter;
98 }
99 
103  const reco::BeamSpot &beamSpot) const
104 {
106 
108  setup.get< IdealMagneticFieldRecord >().get( magneticField );
109 
110  if ( tracks.size() == 2 )
111  {
112  // produce transient tracks from persistent tracks
113  std::vector< reco::TransientTrack > transientTracks( 2 );
114 
115  transientTracks[0] = reco::TransientTrack( *tracks[0].second, magneticField.product() );
116  transientTracks[0].setES( setup );
117 
118  transientTracks[1] = reco::TransientTrack( *tracks[1].second, magneticField.product() );
119  transientTracks[1].setES( setup );
120 
121  // estimate the decay parameters
123  TwoBodyDecay tbd = theFitter->estimate( transientTracks, vm );
124 
125  if ( !tbd.isValid() || ( tbd.chi2() > theChi2CutValue ) )
126  {
127  trajectories.push_back( ReferenceTrajectoryPtr( new TwoBodyDecayTrajectory() ) );
128  return trajectories;
129  }
130 
131  return constructTrajectories( tracks, tbd, magneticField.product(), beamSpot, false );
132  }
133  else
134  {
135  edm::LogInfo( "ReferenceTrajectories" ) << "@SUB=TwoBodyDecayTrajectoryFactory::trajectories"
136  << "Need 2 tracks, got " << tracks.size() << ".\n";
137  }
138 
139  return trajectories;
140 }
141 
142 
146  const ExternalPredictionCollection &external,
147  const reco::BeamSpot &beamSpot) const
148 {
150 
152  setup.get< IdealMagneticFieldRecord >().get( magneticField );
153 
154  if ( tracks.size() == 2 && external.size() == 2 )
155  {
156  if ( external[0].isValid() && external[1].isValid() ) // Include external estimates
157  {
158  // produce transient tracks from persistent tracks
159  std::vector< reco::TransientTrack > transientTracks( 2 );
160 
161  transientTracks[0] = reco::TransientTrack( *tracks[0].second, magneticField.product() );
162  transientTracks[0].setES( setup );
163 
164  transientTracks[1] = reco::TransientTrack( *tracks[1].second, magneticField.product() );
165  transientTracks[1].setES( setup );
166 
167  // estimate the decay parameters. the transient tracks are not really associated to the
168  // the external tsos, but this is o.k., because the only information retrieved from them
169  // is the magnetic field.
171  TwoBodyDecay tbd = theFitter->estimate( transientTracks, external, vm );
172 
173  if ( !tbd.isValid() || ( tbd.chi2() > theChi2CutValue ) )
174  {
175  trajectories.push_back( ReferenceTrajectoryPtr( new TwoBodyDecayTrajectory() ) );
176  return trajectories;
177  }
178 
179  return constructTrajectories( tracks, tbd, magneticField.product(), beamSpot, true );
180  }
181  else
182  {
183  // Return without external estimate
184  trajectories = this->trajectories(setup, tracks, beamSpot);
185  }
186  }
187  else
188  {
189  edm::LogInfo( "ReferenceTrajectories" ) << "@SUB=TwoBodyDecayTrajectoryFactory::trajectories"
190  << "Need 2 tracks, got " << tracks.size() << ".\n";
191  }
192 
193  return trajectories;
194 }
195 
196 
199  const TwoBodyDecay& tbd,
200  const MagneticField* magField,
201  const reco::BeamSpot &beamSpot,
202  bool setParameterErrors ) const
203 {
205 
206  // get innermost valid trajectory state and hits from the tracks
207  TrajectoryInput input1 = this->innermostStateAndRecHits( tracks[0] );
208  TrajectoryInput input2 = this->innermostStateAndRecHits( tracks[1] );
209 
210  if ( !( input1.first.isValid() && input2.first.isValid() ) ) return trajectories;
211 
212  // produce TwoBodyDecayTrajectoryState (input for TwoBodyDecayTrajectory)
213  TsosContainer tsos( input1.first, input2.first );
214  ConstRecHitCollection recHits( input1.second, input2.second );
215  TwoBodyDecayTrajectoryState trajectoryState( tsos, tbd, theSecondaryMass, magField );
216 
217  if ( !trajectoryState.isValid() )
218  {
219  trajectories.push_back( ReferenceTrajectoryPtr( new TwoBodyDecayTrajectory() ) );
220  return trajectories;
221  }
222 
223  // always use the refitted trajectory state for matching
224  // FIXME FIXME CLONE
225  //TrackingRecHit::ConstRecHitPointer updatedRecHit1( recHits.first.front()->clone( tsos.first ) );
226  // TrackingRecHit::ConstRecHitPointer updatedRecHit2( recHits.second.front()->clone( tsos.second ) );
227 
228  TrackingRecHit::ConstRecHitPointer updatedRecHit1( recHits.first.front() );
229  TrackingRecHit::ConstRecHitPointer updatedRecHit2( recHits.second.front() );
230 
231 
232  bool valid1 = match( trajectoryState.trajectoryStates( true ).first,
233  updatedRecHit1 );
234 
235  bool valid2 = match( trajectoryState.trajectoryStates( true ).second,
236  updatedRecHit2 );
237 
238  if ( !valid1 || !valid2 )
239  {
240  trajectories.push_back( ReferenceTrajectoryPtr( new TwoBodyDecayTrajectory() ) );
241  return trajectories;
242  }
243 
244  // set the flag for reversing the RecHits to false, since they are already in the correct order.
245  TwoBodyDecayTrajectory* result = new TwoBodyDecayTrajectory( trajectoryState, recHits, magField,
247  false, beamSpot, theUseRefittedStateFlag,
249  if ( setParameterErrors && tbd.hasError() ) result->setParameterErrors( tbd.covariance() );
250  trajectories.push_back( ReferenceTrajectoryPtr( result ) );
251  return trajectories;
252 }
253 
254 
256  const TransientTrackingRecHit::ConstRecHitPointer& recHit ) const
257 {
258  LocalPoint lp1 = state.localPosition();
259  LocalPoint lp2 = recHit->localPosition();
260 
261  double deltaX = lp1.x() - lp2.x();
262  double deltaY = lp1.y() - lp2.y();
263 
264  LocalError le = recHit->localPositionError();
265 
266  double varX = le.xx();
267  double varY = le.yy();
268 
269  return ( ( fabs(deltaX)/sqrt(varX) < theNSigmaCutValue ) && ( fabs(deltaY)/sqrt(varY) < theNSigmaCutValue ) );
270 }
271 
272 
273 DEFINE_EDM_PLUGIN( TrajectoryFactoryPlugin, TwoBodyDecayTrajectoryFactory, "TwoBodyDecayTrajectoryFactory" );
T getParameter(std::string const &) const
float xx() const
Definition: LocalError.h:24
bool hasError(void) const
Definition: TwoBodyDecay.h:45
MaterialEffects materialEffects(void) const
TwoBodyDecayTrajectory::ConstRecHitCollection ConstRecHitCollection
TwoBodyDecayVirtualMeasurement VirtualMeasurement
void setParameterErrors(const AlgebraicSymMatrix &error)
const ReferenceTrajectoryCollection constructTrajectories(const ConstTrajTrackPairCollection &tracks, const TwoBodyDecay &tbd, const MagneticField *magField, const reco::BeamSpot &beamSpot, bool setParameterErrors) const
T y() const
Definition: PV3DBase.h:63
tuple magneticField
std::pair< ConstRecHitContainer, ConstRecHitContainer > ConstRecHitCollection
const TsosContainer & trajectoryStates(bool useRefittedState=true) const
#define input2
Definition: AMPTWrapper.h:149
bool match(const TrajectoryStateOnSurface &state, const TransientTrackingRecHit::ConstRecHitPointer &recHit) const
tuple result
Definition: mps_fire.py:95
virtual const TwoBodyDecay estimate(const std::vector< reco::TransientTrack > &tracks, const TwoBodyDecayVirtualMeasurement &vm) const
U second(std::pair< T, U > const &p)
virtual const ReferenceTrajectoryCollection trajectories(const edm::EventSetup &setup, const ConstTrajTrackPairCollection &tracks, const reco::BeamSpot &beamSpot) const override
Produce the trajectories.
const AlgebraicSymMatrix & covariance(void) const
Definition: TwoBodyDecay.h:37
float yy() const
Definition: LocalError.h:26
std::shared_ptr< TrackingRecHit const > ConstRecHitPointer
T sqrt(T t)
Definition: SSEVec.h:18
std::pair< TrajectoryStateOnSurface, TrajectoryStateOnSurface > TsosContainer
#define input1
Definition: AMPTWrapper.h:129
void setES(const edm::EventSetup &es)
bool isValid(void) const
Definition: TwoBodyDecay.h:49
virtual const TrajectoryInput innermostStateAndRecHits(const ConstTrajTrackPair &track) const
AlignmentAlgorithmBase::ConstTrajTrackPairCollection ConstTrajTrackPairCollection
std::vector< ReferenceTrajectoryPtr > ReferenceTrajectoryCollection
tuple tracks
Definition: testEve_cfg.py:39
const T & get() const
Definition: EventSetup.h:56
T const * product() const
Definition: ESHandle.h:86
double chi2(void) const
Definition: TwoBodyDecay.h:47
TwoBodyDecayTrajectoryFactory(const edm::ParameterSet &config)
PropagationDirection propagationDirection(void) const
#define DEFINE_EDM_PLUGIN(factory, type, name)
virtual TwoBodyDecayTrajectoryFactory * clone() const override
std::pair< TrajectoryStateOnSurface, TransientTrackingRecHit::ConstRecHitContainer > TrajectoryInput
volatile std::atomic< bool > shutdown_flag false
std::vector< TrajectoryStateOnSurface > ExternalPredictionCollection
T x() const
Definition: PV3DBase.h:62
ReferenceTrajectoryBase::ReferenceTrajectoryPtr ReferenceTrajectoryPtr
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
TwoBodyDecayTrajectoryState::TsosContainer TsosContainer