16 const std::vector<double>& anAnnealingProgram):
18 theHitPropagator(hitpropagator),
20 theAnnealingProgram(anAnnealingProgram){}
30 float annealing)
const{
36 std::vector<TransientTrackingRecHit::RecHitPointer> updatedcomponents =
updatecomponents(rhv, state, annealing);
42 double rowsum =
updaterow(rhv, state, updatedcomponents, annealing);
45 double c =
calculatecut(rhv, state, updatedcomponents, annealing);
50 std::vector<std::pair<TransientTrackingRecHit::RecHitPointer, double> > themap =
mapmaker(rhv, state, annealing);
58 return update(rowsum,mtm,c,themap,updatedcomponents,annealing);
66 float annealing)
const{
69 if (original->isValid())
70 LogTrace(
"SiTrackerMultiRecHitUpdator") <<
"Original Hit position " << original->localPosition() <<
" original error "
71 << original->parametersError();
72 else LogTrace(
"SiTrackerMultiRecHitUpdator") <<
"Invalid hit";
76 throw cms::Exception(
"SiTrackerMultiRecHitUpdator") <<
"!!! MultiRecHitUpdator::update(..): tsos NOT valid!!! ";
80 if (original->transientHits().empty())
return 0;
85 std::vector<TransientTrackingRecHit::RecHitPointer> updatedcomponents =
updatecomponents(tcomponents, tsos, annealing);
87 return updaterow(tcomponents, tsos, updatedcomponents, annealing);
97 std::vector<TransientTrackingRecHit::RecHitPointer>& updatedcomponents,
98 float annealing)
const{
100 if (tcomponents.empty()){
101 LogTrace(
"SiTrackerMultiRecHitUpdator") <<
"Empty components vector passed to SiTrackerMultiRecHitUpdator::updateraw";
106 LogTrace(
"SiTrackerMultiRecHitUpdator")<<
"SiTrackerMultiRecHitUpdator::updateraw: tsos NOT valid!!!";
124 for(std::vector<TransientTrackingRecHit::RecHitPointer>::iterator ihit = updatedcomponents.begin(); ihit != updatedcomponents.end(); ihit++) {
133 bool ierr2=!(V.Det2(det));
135 if(ierr != 0|| ierr2) {
136 LogTrace(
"SiTrackerMultiRecHitUpdatorMTF")<<
"MultiRecHitUpdator::update: W not valid!"<<std::endl;
137 LogTrace(
"SiTrackerMultiRecHitUpdatorMTF")<<
"V: "<<V<<
" AnnealingFactor: "<<annealing<<std::endl;
140 double Chi2 = ROOT::Math::Similarity(r,W);
154 float annealing)
const{
157 if(!trechit->isValid()) {
158 LogTrace(
"SiTrackerMultiRecHitUpdatorMTF")<<
"SiTrackerMultiRecHitUpdatorMTF::updatecolumn: rechit NOT valid!!!, returning an InvalidTransientRecHit";
178 bool ierr2=!(V.Det2(det));
182 if(ierr != 0 ||ierr2) {
183 edm::LogWarning(
"SiTrackerMultiRecHitUpdatorMTF")<<
"MultiRecHitUpdator::update: W not valid!"<<std::endl;
184 LogTrace(
"SiTrackerMultiRecHitUpdatorMTF")<<
"V: "<<V<<
" AnnealingFactor: "<<annealing<<std::endl;
200 tsospos[0]= imtm->second.localPosition().x();
201 tsospos[1]= imtm->second.localPosition().y();
212 double Chi2 = ROOT::Math::Similarity(r,W);
217 double a_i =
exp(-0.5*Chi2)/denom;
232 std::vector<TransientTrackingRecHit::RecHitPointer>& updatedcomponents,
233 float annealing)
const{
235 if (tcomponents.empty()){
236 LogTrace(
"SiTrackerMultiRecHitUpdator")
237 <<
"Empty components rechit vector passed to SiTrackerMultiRecHitUpdator::calculatecut";
242 LogTrace(
"SiTrackerMultiRecHitUpdator")<<
"SiTrackerMultiRecHitUpdator::calculatecut: tsos NOT valid!!!";
256 for(std::vector<TransientTrackingRecHit::RecHitPointer>::iterator ihit = updatedcomponents.begin(); ihit != updatedcomponents.end(); ihit++) {
263 bool ierr2=!(V.Det2(det));
265 if(ierr != 0||ierr2) {
266 LogTrace(
"SiTrackerMultiRecHitUpdator")<<
"MultiRecHitUpdator::calculatecut: W not valid!"<<std::endl;
267 LogTrace(
"SiTrackerMultiRecHitUpdator")<<
"V: "<<V<<
" AnnealingFactor: "<<annealing<<std::endl;
272 LogTrace(
"SiTrackerMultiRecHitUpdator")<<
"SiTrackerMultiRecHitUpdator::calculatecut: det= "<<det<<std::endl;
277 LogTrace(
"SiTrackerMultiRecHitUpdator")<<
"SiTrackerMultiRecHitUpdator::calculatecut: csum= "<<c_sum<<std::endl;
283 std::vector< std::pair<TransientTrackingRecHit::RecHitPointer, double> >
286 float annealing)
const{
287 if (tcomponents.empty()){
288 LogTrace(
"SiTrackerMultiRecHitUpdator")
289 <<
"Empty components vector passed to SiTrackerMultiRecHitUpdator::update, returning an InvalidTransientRecHit ";
294 LogTrace(
"SiTrackerMultiRecHitUpdator")<<
"SiTrackerMultiRecHitUpdator::update: tsos NOT valid!!!, returning an InvalidTransientRecHit";
298 std::vector<TransientTrackingRecHit::RecHitPointer> updatedcomponents =
updatecomponents(tcomponents, tsos,annealing);
301 std::vector<std::pair<TransientTrackingRecHit::RecHitPointer, double> > mymap;
308 for(std::vector<TransientTrackingRecHit::RecHitPointer>::iterator ihit = updatedcomponents.begin(); ihit != updatedcomponents.end(); ihit++) {
315 bool ierr2=!(V.Det2(det));
317 if(ierr != 0||ierr2) {
318 LogTrace(
"SiTrackerMultiRecHitUpdatorMTF")<<
"MultiRecHitUpdator::update: W not valid!"<<std::endl;
319 LogTrace(
"SiTrackerMultiRecHitUpdatorMTF")<<
"V: "<<V<<
" AnnealingFactor: "<<annealing<<std::endl;
323 double Chi2 =ROOT::Math::Similarity(r,W);
327 mymap.push_back(std::pair<TransientTrackingRecHit::RecHitPointer, float>((*ihit), a_i));
332 LogDebug(
"SiTrackerMultiRecHitUpdatorMTF") <<
"Map mymap size: " << mymap.size() << std::endl
333 <<
"Position 1st element: " << mymap.front().first->localPosition()<<std::endl;
339 std::vector<TransientTrackingRecHit::RecHitPointer>
342 float annealing)
const{
344 if (tcomponents.empty()){
345 LogTrace(
"SiTrackerMultiRecHitUpdator")
346 <<
"Empty components vector passed to SiTrackerMultiRecHitUpdatorMTF::updatecomponents, returning an InvalidTransientRecHit ";
352 LogTrace(
"SiTrackerMultiRecHitUpdatorMTF")
353 <<
"SiTrackerMultiRecHitUpdatorMTF::updatecomponents: tsos NOT valid!!!, returning an InvalidTransientRecHit";
357 std::vector<TransientTrackingRecHit::RecHitPointer> updatedcomponents;
359 for (TransientTrackingRecHit::ConstRecHitContainer::const_iterator iter = tcomponents.begin(); iter != tcomponents.end(); iter++){
360 if (iter == tcomponents.begin()) {
362 if (&((*iter)->det()->surface())!=&(tsos.
surface())){
364 <<
"the Trajectory state and the first rechit passed to the SiTrackerMultiRecHitUpdatorMTF lay on different surfaces!: state lays on surface "
367 << (*iter)->det()->geographicalId().rawId()
368 <<
"lays on surface "
369 << (*iter)->det()->surface().position();
371 geomdet = (*iter)->det();
374 if (&((*iter)->det()->surface())!=&(tsos.
surface())){
376 LogTrace(
"SiTrackerMultiRecHitUpdatorMTF") <<
"Projecting a hit from surface " << (*iter)->det()->surface().position()
377 <<
" to surface " << tsos.
surface().
position() <<
" original global position "
378 << (*iter)->globalPosition() <<
" projected position " << cloned->globalPosition();
379 if (cloned->isValid()) updatedcomponents.push_back(cloned);
385 LogTrace(
"SiTrackerMultiRecHitUpdatorMTF") <<
"about to clone the tracking rechit with the method clone " << std::endl;
387 LogTrace(
"SiTrackerMultiRecHitUpdatorMTF") <<
"cloned";
388 LogTrace(
"SiTrackerMultiRecHitUpdatorMTF") <<
"Original position: "<<(*iter)->localPosition()<<std::endl;
389 LogTrace(
"SiTrackerMultiRecHitUpdatorMTF") <<
"New position: "<<cloned->localPosition()<<std::endl;
391 if (cloned->isValid()) updatedcomponents.push_back(cloned);
395 return updatedcomponents;
403 std::vector<std::pair<TransientTrackingRecHit::RecHitPointer,double> >& mymap,
404 std::vector<TransientTrackingRecHit::RecHitPointer>& updatedcomponents,
405 float annealing)
const{
414 std::vector<std::pair<TransientTrackingRecHit::RecHitPointer, double> > normmap;
415 const GeomDet* geomdet = updatedcomponents.front()->det();
416 LogTrace(
"SiTrackerMultiRecHitUpdatorMTF")<<
"Multirechit size"<<updatedcomponents.size()<<std::endl;
417 for(std::vector<TransientTrackingRecHit::RecHitPointer>::iterator ihit = updatedcomponents.begin(); ihit != updatedcomponents.end(); ihit++) {
427 double total_sum = rowsum + colsum;
428 LogTrace(
"SiTrackerMultiRecHitUpdatorMTF")<<
"rowsum= "<<rowsum<<
", colsum= "<<colsum<<std::endl;
429 LogTrace(
"SiTrackerMultiRecHitUpdatorMTF")<<
"phi_i_j= "<<mymap[
counter].second<<
", c="<<c<<std::endl;
431 double p = ( (mymap[
counter].second)/(total_sum - mymap[counter].
second + c) > 1.e-6 ? (mymap[
counter].second)/(total_sum- mymap[counter].
second +c) : 1.e-6);
437 normmap.push_back(std::pair<TransientTrackingRecHit::RecHitPointer, double>(mymap[counter].
first, p) );
444 (*ihit)->setWeight(p);
447 (*ihit)->setAnnealingFactor(annealing);
450 finalcomponents.push_back(*ihit);
455 LogDebug(
"SiTrackerMultiRecHitUpdatorMTF")<<
"Component hit type "<<
typeid(*(normmap[
counter].first)).name() <<std::endl
457 <<
"position " << mymap[
counter].first->localPosition()<<std::endl
458 <<
"error " << mymap[
counter].first->localPositionError()<<std::endl
459 <<
"with weight " <<p<<std::endl;
474 std::vector<std::pair<const TrackingRecHit*,float> > newmap;
477 for(std::vector<std::pair<TransientTrackingRecHit::RecHitPointer,double> >::iterator imap=mymap.begin(); imap!=mymap.end(); imap++)
480 newmap.push_back(std::pair<const TrackingRecHit*, float>(imap->first->hit(),imap->second));
488 SiTrackerMultiRecHit updatedmrh(param.first,param.second, newmap.front().first->geographicalId(), newmap);
490 LogDebug(
"SiTrackerMultiRecHitUpdatorMTF") <<
"SiTrackerMultiRecHit built " << std::endl;
492 LogDebug(
"SiTrackerMultiRecHitUpdatorMTF") <<
"Updated Hit position "
493 << updatedmrh.localPosition() <<
" updated error "
494 << updatedmrh.parametersError() << std::endl;
506 for(TransientTrackingRecHit::ConstRecHitContainer::const_iterator ihit = map.begin(); ihit != map.end(); ihit ++) {
512 edm::LogError(
"SiTrackerMultiRecHitUpdator")<<
"MultiRecHit::checkParameters: W not valid!"<<std::endl;
516 W_sum += ((*ihit)->weight()*W);
517 m_sum += ((*ihit)->weight()*(W*
m));
524 return std::make_pair(position,error);
531 for(TransientTrackingRecHit::ConstRecHitContainer::const_iterator ihit = map.begin(); ihit != map.end(); ihit ++) {
536 std::cout<<
"MultiRecHit::checkParametersError: W not valid!"<<std::endl;
539 else W_sum += ((*ihit)->weight()*W);
542 return LocalError(parametersError(0,0), parametersError(0,1), parametersError(1,1));
548 for( TransientTrackingRecHit::ConstRecHitContainer::const_iterator ihit = map.begin(); ihit != map.end(); ihit ++) {
554 std::cout<<
"MultiRecHit::checkParameters: W not valid!"<<std::endl;
558 else m_sum += ((*ihit)->weight()*(W*
m));
562 V_sum(0,0) = er.
xx();
563 V_sum(0,1) = er.
xy();
564 V_sum(1,1) = er.
yy();
virtual std::vector< std::pair< TransientTrackingRecHit::RecHitPointer, double > > mapmaker(TransientTrackingRecHit::ConstRecHitContainer &tcomponents, TrajectoryStateOnSurface &tsos, float annealing) const
const TrackingRecHitPropagator * theHitPropagator
ROOT::Math::SMatrix< double, 2, 2, ROOT::Math::MatRepSym< double, 2 > > AlgebraicSymMatrix22
virtual double updaterow(TransientTrackingRecHit::ConstRecHitContainer &tcomponents, TrajectoryStateOnSurface &tsos, std::vector< TransientTrackingRecHit::RecHitPointer > &updatedcomponents, float annealing) const
LocalPoint localPosition() const
std::pair< LocalPoint, LocalError > LocalParameters
virtual double calculatecut(TransientTrackingRecHit::ConstRecHitContainer &trechit, TrajectoryStateOnSurface &vtsos, std::vector< TransientTrackingRecHit::RecHitPointer > &updatedcomponents, float annealing) const
Exp< T >::type exp(const T &t)
static int position[TOTALCHAMBERS][3]
LocalError calcParametersError(TransientTrackingRecHit::ConstRecHitContainer &map) const
std::map< int, TSOS > & filteredStates()
U second(std::pair< T, U > const &p)
virtual TransientTrackingRecHit::RecHitPointer buildMultiRecHit(TrajectoryStateOnSurface &tsos, TransientTrackingRecHit::ConstRecHitContainer &hits, MultiTrajectoryMeasurement *mtm, float annealing=1.) const
static RecHitPointer build(const GeomDet *geom, const SiTrackerMultiRecHit *rh, const ConstRecHitContainer &components, float annealing=1.)
std::vector< ConstRecHitPointer > ConstRecHitContainer
virtual double updatecolumn(TransientTrackingRecHit::ConstRecHitPointer trechit, MultiTrajectoryMeasurement *multi, float annealing) const
virtual std::vector< TransientTrackingRecHit::RecHitPointer > updatecomponents(TransientTrackingRecHit::ConstRecHitContainer &tcomponents, TrajectoryStateOnSurface &tsos, float annealing) const
virtual double update(TransientTrackingRecHit::ConstRecHitPointer original, TrajectoryStateOnSurface tsos, float annealing=1.) const
const Surface & surface() const
const PositionType & position() const
ROOT::Math::SVector< double, 2 > AlgebraicVector2
LocalPoint calcParameters(TransientTrackingRecHit::ConstRecHitContainer &map, const LocalError &er) const
SiTrackerMultiRecHitUpdatorMTF(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