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; }