Example #1
0
bool FakedSeeding::fitXProjection(PrSeedTrack * track)
{
  float mat[6];
  float rhs[3];
  //std::fill(rhs,rhs+3,0);
  std::vector<Hit> Hits = track->hits();

  for(int loop = 0;3>loop;++loop)
  {
    std::fill(mat,mat+6,0.);
    std::fill(rhs,rhs+3,0.);
    for( int i=0; i < Hits.size() ;i++ )
    {
      const float w =  Hits[i].w2();//squared
      //std::cout<<"W\t"<<w<<std::endl;
      const float dz = Hits[i].GetZ() - m_zReference;
      float deta = 0;
      deta = dz*dz*(1-m_dRatio*dz);
      Hit *hit = new Hit(Hits[i].GetX(),Hits[i].GetY(),Hits[i].GetZ());
      float dist = track->distance(hit);
      //always()<<"Loop \t"<<loop<<"\n Distance From Hit \t"<<dist<<endmsg;
      // if(loop>0)
      // dist = track.distance( *itH ); //try the effect
      mat[0]+= w     ;
      mat[1]+= w * dz;
      mat[2]+= w * dz * dz;
      mat[3]+= w * deta;
      mat[4]+= w * dz * deta;
      mat[5]+= w * deta * deta;
      //right hand side
      rhs[0]+= w * dist;
      rhs[1]+= w * dist * dz;
      rhs[2]+= w * dist * deta;
    }

    ROOT::Math::CholeskyDecomp<float,3> decomp(mat);
    if(!decomp)
    {
      //std::cout<<"Failed to decompose matrix"<<std::endl;
      return false;
    }
    decomp.Solve(rhs);
    track->updateParameters(rhs[0],rhs[1],rhs[2],0.,0.);
  }
  float chi2_track = 0.;
  float maxChi2 = 0.;
  float maxDistance = 0.;
  // int i = 0; unused
  //compute Chi2 of the fitted track and the single Hit chi2
  for ( int i=0;i<Hits.size(); i++)
  {
    Hit *hit = new Hit(Hits[i].GetX(),Hits[i].GetY(),Hits[i].GetZ());
    hit->SetW2(Hits[i].w2());

    float distance = track->distance(hit);
    float chi2_onHit = track->chi2( hit ); //\frac{dist^{2}}{\sigma^{2}}
    if (chi2_onHit>maxChi2)
    {
      maxChi2 = chi2_onHit;
    }
    track_distance->Fill(distance);
    track_pullHits->Fill(chi2_onHit);
    chi2_track += track->chi2( hit );
    track_pullHitsVsP->Fill(chi2_onHit,(float)P);
    // //All Hits in 3 sigma? to check externally too
  }
  float constanteC = (track->b() * m_zReference - track->a())/(track->c());
  //backward extrapolation
  float X0 = track->a() - track->b()*m_zReference +track->c()*m_ConstC;
  //track_chi2PerDoFVs
  track->setChi2(chi2_track,3);
  XBackProjVsChi2->Fill(track->chi2(),X0);

  track_chi2->Fill(track->chi2());
  track_chi2PerDoF->Fill(track->chi2()/(3.));
  //std::cout<<"Delta Chi2 (should be 0) \t"<<chi2_track-track->chi2()<<std::endl;
  //if(std::abs(maxDistance) < 2 && std::sqrt(maxChi2) < 4) return true;
  return true;
}