CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SimpleMetricsUpdator.cc
Go to the documentation of this file.
1 //#include "Alignment/KalmanAlignmentAlgorithm/plugins/SimpleMetricsUpdator.h"
2 #include "SimpleMetricsUpdator.h"
3 
6 
8 
9 
10 
12 {
13  short int maxDistance = config.getUntrackedParameter< int >( "MaxMetricsDistance", 3 );
14  theMetricsCalculator.setMaxDistance( maxDistance );
15 
16  std::vector< unsigned int > dummy;
17  theExcludedSubdetIds = config.getUntrackedParameter< std::vector<unsigned int> >( "ExcludedSubdetIds", dummy );
18 
19  theASCFlag = config.getUntrackedParameter< bool >( "ApplyAdditionalSelectionCriterion", false );
20  if ( theASCFlag )
21  {
22  theMinDeltaPerp = config.getParameter< double >( "MinDeltaPerp" );
23  theMaxDeltaPerp = config.getParameter< double >( "MaxDeltaPerp" );
24  theMinDeltaZ = config.getParameter< double >( "MinDeltaZ" );
25  theMaxDeltaZ = config.getParameter< double >( "MaxDeltaZ" );
26  theGeomDist = config.getParameter< double >( "GeomDist" );
27  theMetricalThreshold = config.getParameter< unsigned int >( "MetricalThreshold" );
28  }
29 
30  edm::LogInfo("Alignment") << "@SUB=SimpleMetricsUpdator::SimpleMetricsUpdator "
31  << "\nInstance of MetricsCalculator created (MaxMetricsDistance = " << maxDistance << ").";
32 }
33 
34 
35 void SimpleMetricsUpdator::update( const std::vector< Alignable* > & alignables )
36 {
37  std::vector< Alignable* > alignablesForUpdate;
38  std::vector< Alignable* >::const_iterator it;
39 
40  for ( it = alignables.begin(); it != alignables.end(); ++it )
41  {
42  unsigned int subdetId = static_cast< unsigned int >( (*it)->geomDetId().subdetId() );
43 
44  if ( std::find( theExcludedSubdetIds.begin(), theExcludedSubdetIds.end(), subdetId ) == theExcludedSubdetIds.end() )
45  {
46  alignablesForUpdate.push_back( *it );
47  }
48  }
49 
50  theMetricsCalculator.updateDistances( alignablesForUpdate );
51 }
52 
53 
54 const std::vector< Alignable* >
55 SimpleMetricsUpdator::additionalAlignables( const std::vector< Alignable* > & alignables )
56 {
57  std::vector< Alignable* > result;
58  std::vector< Alignable* >::const_iterator itAD;
59 
60  std::map< Alignable*, short int > updateList;
61  std::map< Alignable*, short int >::iterator itUL;
62 
63  std::set< Alignable* > alignablesFromUpdateList;
64  std::set< Alignable* >::iterator itAUL;
65 
66  // make union of all lists
67  for ( itAD = alignables.begin(); itAD != alignables.end(); itAD++ )
68  {
69  updateList = theMetricsCalculator.getDistances( *itAD );
70  for ( itUL = updateList.begin(); itUL != updateList.end(); itUL++ )
71  {
72  // extra selection criterion
73  if ( theASCFlag && !additionalSelectionCriterion( *itAD, itUL->first, itUL->second ) ) continue;
74 
75  alignablesFromUpdateList.insert( itUL->first );
76  }
77  updateList.clear();
78  }
79 
80  // make final list of modules for update
81  for ( itAUL = alignablesFromUpdateList.begin(); itAUL != alignablesFromUpdateList.end(); itAUL++ )
82  {
83  if ( find( alignables.begin(), alignables.end(), *itAUL ) == alignables.end() )
84  {
85  result.push_back( *itAUL );
86  }
87  }
88 
89  return result;
90 }
91 
92 
93 const std::map< Alignable*, short int >
94 SimpleMetricsUpdator::additionalAlignablesWithDistances( const std::vector< Alignable* > & alignables )
95 {
96  std::map< Alignable*, short int > result;
97  std::map< Alignable*, short int > updateList;
98  std::map< Alignable*, short int >::iterator itUL;
99  std::map< Alignable*, short int >::iterator itFind;
100 
101  std::vector< Alignable* >::const_iterator itAD;
102 
103  // make union of all lists
104  for ( itAD = alignables.begin(); itAD != alignables.end(); itAD++ )
105  {
106  updateList = theMetricsCalculator.getDistances( *itAD );
107  for ( itUL = updateList.begin(); itUL != updateList.end(); itUL++ )
108  {
109  itFind = result.find( itUL->first );
110  if ( itFind == result.end() )
111  {
112  result[itUL->first] = itUL->second;
113  }
114  else if ( itFind->second < itUL->second )
115  {
116  itFind->second = itUL->second;
117  }
118  }
119  }
120 
121  for ( itAD = alignables.begin(); itAD != alignables.end(); itAD++ )
122  {
123  itFind = result.find( *itAD );
124  if ( itFind != result.end() ) result.erase( itFind );
125  }
126 
127  return result;
128 }
129 
130 
131 bool
133  Alignable* const& additionalAli,
134  short int metricalDist ) const
135 {
136  if ( metricalDist <= theMetricalThreshold ) return true;
137 
138  const DetId detId( referenceAli->geomDetId() );
139 
140  const align::PositionType& pos1 = referenceAli->globalPosition();
141  const align::PositionType& pos2 = additionalAli->globalPosition();
142 
143  bool barrelRegion = ( detId.subdetId()%2 != 0 );
144 
145  if ( barrelRegion )
146  {
147  double perp1 = pos1.perp();
148  double perp2 = pos2.perp();
149  double deltaPerp = perp2 - perp1;
150 
151  if ( ( deltaPerp < theMinDeltaPerp ) || ( deltaPerp > theMaxDeltaPerp ) ) return false;
152  }
153  else
154  {
155  double z1 = pos1.z();
156  double z2 = pos2.z();
157  double signZ = ( z1 > 0. ) ? 1. : -1;
158  double deltaZ = signZ*( z2 - z1 );
159 
160  if ( ( deltaZ < theMinDeltaZ ) || ( deltaZ > theMaxDeltaZ ) ) return false;
161  }
162 
163  double r1 = pos1.mag();
164  double r2 = pos2.mag();
165  double sp = pos1.x()*pos2.x() + pos1.y()*pos2.y() + pos1.z()*pos2.z();
166 
167  double dist = sqrt( r2*r2 - sp*sp/r1/r1 );
168  return ( dist < theGeomDist );
169 }
170 
171 
virtual const std::map< Alignable *, short int > additionalAlignablesWithDistances(const std::vector< Alignable * > &alignables)
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
T perp() const
Definition: PV3DBase.h:66
T perp2() const
Squared magnitude of transverse component.
void setMaxDistance(short int maxDistance)
Set maximum distance to be stored.
virtual void update(const std::vector< Alignable * > &alignables)
T y() const
Definition: PV3DBase.h:57
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
T mag() const
Definition: PV3DBase.h:61
SimpleMetricsUpdator(const edm::ParameterSet &config)
T sqrt(T t)
Definition: SSEVec.h:28
T z() const
Definition: PV3DBase.h:58
tuple result
Definition: query.py:137
virtual const std::vector< Alignable * > additionalAlignables(const std::vector< Alignable * > &alignables)
bool additionalSelectionCriterion(Alignable *const &referenceAli, Alignable *const &additionalAli, short int metricalDist) const
Definition: DetId.h:20
std::vector< unsigned int > theExcludedSubdetIds
void updateDistances(const std::vector< Alignable * > &alignables)
Update list of distances with a set Alignables.
KalmanAlignmentMetricsCalculator theMetricsCalculator
tuple config
Definition: cmsDriver.py:17
const SingleDistancesList & getDistances(Alignable *i) const
#define DEFINE_EDM_PLUGIN(factory, type, name)
const PositionType & globalPosition() const
Return the global position of the object.
Definition: Alignable.h:129
T x() const
Definition: PV3DBase.h:56
const DetId & geomDetId() const
Definition: Alignable.h:177