int TrdHSegmentR::Refit(int debug){ if(debug>0) cout<<"TrdHSegmentR::Refit-I-Number of RawHits "<<nTrdRawHit()<<endl; int lr=LinReg(debug); int lay[20];for(int l=0;l!=20;l++)lay[l]=0; float zmax=0.,zmin=200.; int nhits=0; for(int h=0;h!=nTrdRawHit();h++){ TRDHitRZD rzd=TRDHitRZD(*pTrdRawHit(h)); if(rzd.d!=d)continue; if(rzd.z>zmax)zmax=rzd.z; if(rzd.z<zmin)zmin=rzd.z; for(int l=0;l!=20;l++){ if(fabs((rzd.z-85.275)/2.9-(float)l)<0.01)lay[l]++; else if (fabs((rzd.z-85.275-1.45)/2.9 -(float)l)<0.01)lay[l]++; } nhits++; } int lsum=0; for(int l=0;l!=20;l++)if(lay[l]>0)lsum++; if(debug) cout<<"TrdHSegmentR::Refit-I-linreg stat "<<lr<<" dz "<<zmax-zmin<<" layers "<<lsum<<endl; if(lr==1&&zmax-zmin>8.&&lsum>2){ calChi2(); return 1; } else return 0; }
/** * Creates a pvl of various useful data obtained by the overlap statistics * class. The pvl is returned in an output stream * * @param os The output stream to write to * @param stats The OverlapStatistics object to write to os * @return ostream Pvl of useful statistics */ std::ostream& operator<<(std::ostream &os, Isis::OverlapStatistics &stats) { // Output the private variables try { PvlObject o ("OverlapStatistics"); PvlGroup gX ("File1"); PvlKeyword stsX ("StartSample", stats.StartSampleX()); PvlKeyword ensX ("EndSample", stats.EndSampleX()); PvlKeyword stlX ("StartLine", stats.StartLineX()); PvlKeyword enlX ("EndLine", stats.EndLineX()); PvlKeyword avgX ("Average"); PvlKeyword stdX ("StandardDeviation"); PvlKeyword varX ("Variance"); for (int band=1; band<=stats.Bands(); band++) { if (stats.HasOverlap(band)) { avgX += stats.GetMStats(band).X().Average(); stdX += stats.GetMStats(band).X().StandardDeviation(); varX += stats.GetMStats(band).X().Variance(); } } gX += stsX; gX += ensX; gX += stlX; gX += enlX; gX += avgX; gX += stdX; gX += varX; PvlGroup gY ("File2"); PvlKeyword stsY ("StartSample", stats.StartSampleY()); PvlKeyword ensY ("EndSample", stats.EndSampleY()); PvlKeyword stlY ("StartLine", stats.StartLineY()); PvlKeyword enlY ("EndLine", stats.EndLineY()); PvlKeyword avgY ("Average"); PvlKeyword stdY ("StandardDeviation"); PvlKeyword varY ("Variance"); for (int band=1; band<=stats.Bands(); band++) { if (stats.HasOverlap(band)) { avgY += stats.GetMStats(band).Y().Average(); stdY += stats.GetMStats(band).Y().StandardDeviation(); varY += stats.GetMStats(band).Y().Variance(); } } gY += stsY; gY += ensY; gY += stlY; gY += enlY; gY += avgY; gY += stdY; gY += varY; o += PvlKeyword("File1", stats.FilenameX().Name()); o += PvlKeyword("File2", stats.FilenameY().Name()); o += PvlKeyword("Width", stats.Samples()); o += PvlKeyword("Height", stats.Lines()); o += PvlKeyword("SamplingPercent", stats.SampPercent()); o.AddGroup(gX); o.AddGroup(gY); PvlKeyword cov ("Covariance"); PvlKeyword cor ("Correlation"); PvlKeyword valid ("ValidOverlap"); PvlKeyword val ("ValidPixels"); PvlKeyword inv ("InvalidPixels"); PvlKeyword tot ("TotalPixels"); for (int band=1; band<=stats.Bands(); band++) { if (stats.HasOverlap(band)) { std::string validStr = "false"; if (stats.IsValid(band)) validStr = "true"; valid += validStr; cov += stats.GetMStats(band).Covariance(); cor += stats.GetMStats(band).Correlation(); val += stats.GetMStats(band).ValidPixels(); inv += stats.GetMStats(band).InvalidPixels(); tot += stats.GetMStats(band).TotalPixels(); } } o += valid; o += cov; o += cor; o += val; o += inv; o += tot; for (int band=1; band<=stats.Bands(); band++) { if (stats.HasOverlap(band)) { iString bandNum (band); std::string bandStr = "LinearRegression" + bandNum; PvlKeyword LinReg(bandStr); double a,b; try { stats.GetMStats(band).LinearRegression(a,b); LinReg += a; LinReg += b; } catch (iException &e) { // It is possible one of the overlaps was constant and therefore // the regression would be a vertical line (x=c instead of y=ax+b) e.Clear(); } o += LinReg; } } os << o << endl; return os; } catch (iException &e) { string msg = "Trivial overlap between [" + stats.FilenameX().Name(); msg += "] and [" + stats.FilenameY().Name() + "]"; throw iException::Message(iException::User,msg,_FILEINFO_); } }