23 return m_type < rhs.
m_type ||
55 return m_node->projectConstraint(m_type,fitpar,p) ;
63 std::cout <<
"Constraint::filter(FitParams*): unknown constraint: " << m_type
66 }
else if (m_type!=merged && !m_node) {
67 std::cout <<
"Constraint::filter(FitParams*): constraint without a node"
71 if(
vtxverbose>=3) { std::cout <<
"Constraint::filter(FitParams*): filtering " ;
print() ;}
74 const TVectorD* pred(0) ;
75 if(m_maxNIter>1) pred =
new TVectorD(fitpar->
par()) ;
81 bool finished(
false) ;
82 if(
vtxverbose>=5) { std::cout <<
"Constraint::filter(FitParams*): starting loop " ;
print() ;}
83 while (!finished && !status.
failure()) {
85 status |= project(fitpar,
p) ;
87 status |= kalman.init(
p.r(),
p.H(), fitpar,
p.V() ) ;
90 if(iter==0 || !pred) {
91 kalman.updatePar( fitpar ) ;
93 kalman.updatePar( *pred, fitpar ) ;
95 const double dchisqconverged = 0.001 ;
96 double newchisq = kalman.chisq() ;
97 double dchisq = newchisq - chisq ;
98 bool diverging = iter > 0 && dchisq>0 ;
99 bool converged =
fabs(dchisq) < dchisqconverged ;
100 finished = ++iter >= m_maxNIter || diverging || converged ;
103 std::cout <<
"chi2,niter: "
104 << iter <<
" "<< std::setprecision(7)
105 << std::setw(12) << chisq <<
" "
106 << std::setw(12)<< newchisq <<
" "
107 << std::setw(12)<< dchisq <<
" "
110 status.
Print(std::cout);
111 std::cout << std::endl ;
118 kalman.updateCov( fitpar ) ;
119 fitpar->
addChiSquare( kalman.chisq(), m_dim,
p.particle() ) ;
121 if(pred)
delete pred ;
123 m_node->mother() ) { m_node->mother()->print(fitpar) ; }
125 if(
vtxverbose>=5) { std::cout <<
"Constraint::filter(FitParams*): done" ;
print() ;}
136 std::cout <<
"Constraint::filter(FitParams*,FitParams*): unknown constraint: " << m_type
139 }
else if (m_type!=merged && !m_node) {
140 std::cout <<
"Constraint::filter(FitParams*,FitParams*): filter constraint without a node"
144 if(
vtxverbose>=3) { std::cout <<
"Constraint::filter(FitParams*,FitParams*): filtering (par&refpar) " ;
print() ;}
148 if(
vtxverbose>=5) { std::cout <<
"Constraint::filter(FitParams*,FitParams*): project"<<std::endl;}
149 status = project(reference,
p) ;
150 if(
vtxverbose>=5) { std::cout <<
"Constraint::filter(FitParams*,FitParams*): residual"<<std::endl;}
152 p.r() +=
p.H() * (fitpar->
par() - reference->
par()) ;
153 if(
vtxverbose>=5) { std::cout <<
"Constraint::filter(FitParams*,FitParams*): kalman"<<std::endl;}
156 status |= kalman.
init(
p.r(),
p.H(), fitpar,
p.V() ) ;
161 if(
vtxverbose>=3) { std::cout <<
"Constraint::filter(FitParams*,FitParams*): \""<<
name()<<
"\" Chisquare contribution: " <<kalman.
chisq()<<
" with "<<m_dim<<
" dimensions from particle "<<
p.particle()->name()<<std::endl;}
162 if(
vtxverbose>=5) { std::cout <<
"Constraint::filter(FitParams*,FitParams*): done"<<std::endl;}
165 std::cout <<
"Constraint::filter(FitParams*,FitParams*): error filtering constraint: "
166 <<
name() <<
" "; status.
Print(std::cout); std::cout << std::endl ;}
173 os <<
"node index = " << m_node->index()
174 <<
" name = " << m_node->name().c_str()
175 <<
" constraint type = " << m_type
176 <<
" depth = " << m_depth << std::endl ;
181 std::string rc =
"unknown constraint!" ;
184 case beamspot: rc =
"beamspot" ; break ;
185 case beamenergy: rc =
"beamenergy" ; break ;
186 case composite: rc =
"composite" ; break ;
187 case resonance: rc =
"resonance" ; break ;
188 case track: rc =
"track" ; break ;
189 case photon: rc =
"photon" ; break ;
190 case kinematic: rc =
"kinematic" ; break ;
191 case geometric: rc =
"geometric" ; break ;
192 case mass: rc =
"mass" ; break ;
193 case massEnergy: rc =
"massEnergy" ; break ;
194 case lifetime: rc =
"lifetime" ; break ;
195 case merged: rc =
"merged" ; break ;
196 case conversion: rc =
"conversion" ; break ;
virtual ErrCode filter(FitParams *fitpar) const
void addChiSquare(double chi2, int nconstraints, const ParticleBase *p)
void setParticle(const ParticleBase &p)
virtual void print(std::ostream &os=std::cout) const
void Print(std::ostream &os)
virtual ErrCode project(const FitParams *fitpar, Projection &p) const
void updatePar(FitParams *fitparams)
friend F32vec4 fabs(const F32vec4 &a)
bool operator<(const Constraint &rhs) const
void updateCov(FitParams *fitparams)
ErrCode init(const TVectorD &value, const TMatrixD &G, const FitParams *fitparams, const TMatrixDSym &V, int weight=1)