15 const std::vector<double>& anAnnealingProgram):
17 theHitPropagator(hitpropagator),
19 theAnnealingProgram(anAnnealingProgram){}
26 float annealing)
const{
28 for (std::vector<const TrackingRecHit*>::const_iterator iter = rhv.begin(); iter != rhv.end(); iter++){
30 if (transient->isValid()) tcomponents.push_back(
transient);
33 return update(tcomponents, tsos, annealing);
39 double annealing)
const{
40 LogTrace(
"SiTrackerMultiRecHitUpdator") <<
"Calling SiTrackerMultiRecHitUpdator::update with AnnealingFactor: " << annealing;
41 if (original->isValid())
42 LogTrace(
"SiTrackerMultiRecHitUpdator") <<
"Original Hit position " << original->localPosition() <<
" original error "
43 << original->parametersError();
44 else LogTrace(
"SiTrackerMultiRecHitUpdator") <<
"Invalid hit";
48 throw cms::Exception(
"SiTrackerMultiRecHitUpdator") <<
"!!! MultiRecHitUpdator::update(..): tsos NOT valid!!! ";
52 if (original->transientHits().empty())
return original->clone(tsos);
55 return update(tcomponents, tsos, annealing);
60 double annealing)
const{
62 if (tcomponents.empty()){
63 LogTrace(
"SiTrackerMultiRecHitUpdator") <<
"Empty components vector passed to SiTrackerMultiRecHitUpdator::update, returning an InvalidTransientRecHit ";
68 LogTrace(
"SiTrackerMultiRecHitUpdator")<<
"SiTrackerMultiRecHitUpdator::update: tsos NOT valid!!!, returning an InvalidTransientRecHit";
72 std::vector<TransientTrackingRecHit::RecHitPointer> updatedcomponents;
74 for (TransientTrackingRecHit::ConstRecHitContainer::const_iterator iter = tcomponents.begin(); iter != tcomponents.end(); iter++){
75 if (iter == tcomponents.begin()) {
76 if (&((*iter)->det()->surface())!=&(tsos.
surface())){
77 throw cms::Exception(
"SiTrackerMultiRecHitUpdator") <<
"the Trajectory state and the first rechit passed to the SiTrackerMultiRecHitUpdator lay on different surfaces!: state lays on surface " << tsos.
surface().
position() <<
" hit with detid " << (*iter)->det()->geographicalId().rawId() <<
" lays on surface " << (*iter)->det()->surface().position();
79 geomdet = (*iter)->det();
80 LogTrace(
"SiTrackerMultiRecHitUpdator") <<
"Current reference surface located at " << geomdet->
surface().
position();
83 if (&((*iter)->det()->surface())!=&(tsos.
surface())){
87 if (cloned->isValid()) updatedcomponents.push_back(cloned);
90 if (cloned->isValid()) updatedcomponents.push_back(cloned);
95 std::vector<std::pair<const TrackingRecHit*, float> > mymap;
96 std::vector<std::pair<const TrackingRecHit*, float> > normmap;
98 double a_sum=0, c_sum=0;
104 for(std::vector<TransientTrackingRecHit::RecHitPointer>::iterator ihit = updatedcomponents.begin(); ihit != updatedcomponents.end(); ihit++) {
111 bool ierr2=!(V.Det2(det));
113 if(ierr != 0|| ierr2) {
114 LogTrace(
"SiTrackerMultiRecHitUpdator")<<
"MultiRecHitUpdator::update: W not valid!"<<std::endl;
115 LogTrace(
"SiTrackerMultiRecHitUpdator")<<
"V: "<<V<<
" AnnealingFactor: "<<annealing<<std::endl;
117 double Chi2 = ROOT::Math::Similarity(r,W);
119 mymap.push_back(std::pair<const TrackingRecHit*, float>((*ihit)->hit(), a_i));
124 double total_sum = a_sum + c_sum;
128 for(std::vector<TransientTrackingRecHit::RecHitPointer>::iterator ihit = updatedcomponents.begin(); ihit != updatedcomponents.end(); ihit++) {
130 double p = ((mymap[
counter].second)/total_sum > 1.
e-6 ? (mymap[counter].
second)/total_sum : 1.e-6);
132 normmap.push_back(std::pair<const TrackingRecHit*, float>(mymap[counter].
first, p));
134 (*ihit)->setWeight(p);
135 (*ihit)->setAnnealingFactor(annealing);
136 finalcomponents.push_back(*ihit);
137 LogTrace(
"SiTrackerMultiRecHitUpdator")<<
"Component hit type " <<
typeid(*mymap[
counter].first).
name()
138 <<
" position " << mymap[
counter].first->localPosition()
139 <<
" error " << mymap[
counter].first->localPositionError()
140 <<
" with weight " <<
p;
148 SiTrackerMultiRecHit updated(param.first, param.second, normmap.front().first->geographicalId(), normmap);
149 LogTrace(
"SiTrackerMultiRecHitUpdator") <<
"Updated Hit position " << updated.localPosition() <<
" updated error " << updated.parametersError() << std::endl;
159 for(TransientTrackingRecHit::ConstRecHitContainer::const_iterator ihit = map.begin(); ihit != map.end(); ihit ++) {
165 edm::LogError(
"SiTrackerMultiRecHitUpdator")<<
"MultiRecHit::checkParameters: W not valid!"<<std::endl;
169 W_sum += ((*ihit)->weight()*W);
170 m_sum += ((*ihit)->weight()*(W*
m));
177 return std::make_pair(position,error);
183 for(TransientTrackingRecHit::ConstRecHitContainer::const_iterator ihit = map.begin(); ihit != map.end(); ihit ++) {
188 edm::LogError(
"SiTrackerMultiRecHitUpdator")<<
"MultiRecHit::checkParametersError: W not valid!"<<std::endl;
191 else W_sum += ((*ihit)->weight()*W);
194 return LocalError(parametersError(0,0), parametersError(0,1), parametersError(1,1));
200 for( TransientTrackingRecHit::ConstRecHitContainer::const_iterator ihit = map.begin(); ihit != map.end(); ihit ++) {
206 edm::LogError(
"SiTrackerMultiRecHitUpdator")<<
"MultiRecHit::checkParameters: W not valid!"<<std::endl;
210 else m_sum += ((*ihit)->weight()*(W*
m));
214 V_sum(0,0) = er.
xx();
215 V_sum(0,1) = er.
xy();
216 V_sum(1,1) = er.
yy();
virtual TransientTrackingRecHit::RecHitPointer buildMultiRecHit(const std::vector< const TrackingRecHit * > &rhv, TrajectoryStateOnSurface tsos, float annealing=1.) const
ROOT::Math::SMatrix< double, 2, 2, ROOT::Math::MatRepSym< double, 2 > > AlgebraicSymMatrix22
static RecHitPointer build(const GeomDet *geom, Type type=TrackingRecHit::missing, const DetLayer *layer=0)
LocalPoint localPosition() const
LocalPoint calcParameters(TransientTrackingRecHit::ConstRecHitContainer &map, const LocalError &er) const
Exp< T >::type exp(const T &t)
std::pair< LocalPoint, LocalError > LocalParameters
const TrackingRecHitPropagator * theHitPropagator
static int position[TOTALCHAMBERS][3]
virtual TransientTrackingRecHit::RecHitPointer update(TransientTrackingRecHit::ConstRecHitPointer original, TrajectoryStateOnSurface tsos, double annealing=1.) const
U second(std::pair< T, U > const &p)
static RecHitPointer build(const GeomDet *geom, const SiTrackerMultiRecHit *rh, const ConstRecHitContainer &components, float annealing=1.)
virtual RecHitPointer build(const TrackingRecHit *p) const =0
build a tracking rechit from an existing rechit
const TransientTrackingRecHitBuilder * theBuilder
std::vector< ConstRecHitPointer > ConstRecHitContainer
const Surface & surface() const
LocalError calcParametersError(TransientTrackingRecHit::ConstRecHitContainer &map) const
const PositionType & position() const
virtual const BoundPlane & surface() const
The nominal surface of the GeomDet.
ROOT::Math::SVector< double, 2 > AlgebraicVector2
SiTrackerMultiRecHitUpdator(const TransientTrackingRecHitBuilder *builder, const TrackingRecHitPropagator *hitpropagator, const float Chi2Cut, const std::vector< double > &anAnnealingProgram)
TransientTrackingRecHit::RecHitPointer project(const TransientTrackingRecHit::ConstRecHitPointer hit, const GeomDet &det, const TrajectoryStateOnSurface ts) const