14 using namespace DecayTreeFitter;
 
   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)