source: Sophya/trunk/SophyaPI/PIext/pigfd1.cc@ 2605

Last change on this file since 2605 was 2517, checked in by cmv, 22 years ago

GetDistanceToPoint cmv 17/03/04

File size: 2.8 KB
Line 
1// Cette classe est maintenant obsolete: generaldata <==> ntuple pour le dessin
2
3#include <stdio.h>
4#include "pigfd1.h"
5
6/* --Methode-- */
7PIGenFitDat::PIGenFitDat(GeneralFitData* gfd, bool ad)
8: PIDrawer(), mGFD(gfd), mAdDO(ad), VarX(0), ErrX(false), ErrY(false)
9{
10SelectX(0);
11SelectErrBar(false,false);
12NptDraw = 0;
13}
14
15PIGenFitDat::~PIGenFitDat()
16{
17if(mAdDO && mGFD) delete mGFD;
18}
19
20/* --Methode-- */
21void PIGenFitDat::SelectX(int varx)
22{
23VarX = -1;
24if(mGFD == NULL) return;
25if(varx<0 || varx>=mGFD->NVar()) return;
26VarX = varx;
27}
28
29/* --Methode-- */
30void PIGenFitDat::SelectErrBar(bool erbx,bool erby)
31{
32ErrX = erbx; ErrY = erby;
33if(mGFD == NULL) {ErrX = ErrY = false; return;}
34if(!mGFD->HasXErrors()) ErrX = false;
35}
36
37/* --Methode-- */
38void PIGenFitDat::UpdateLimits()
39{
40if(!mGFD) return;
41if(mGFD->NData()<=0) return;
42if(VarX<0) return;
43double xmin=9.e19, xmax=-9.e19, ymin=9.e19, ymax=-9.e19;
44mGFD->GetMnMx(10*VarX+2,xmin,xmax);
45mGFD->GetMnMx(0,ymin, ymax);
46if(xmax<=xmin) xmax = xmin+1.;
47if(ymax<=ymin) ymax = ymin+1.;
48PIAxes::ReSizeMinMax(isLogScaleX(),xmin,xmax);
49PIAxes::ReSizeMinMax(isLogScaleY(),ymin,ymax);
50SetLimits(xmin,xmax,ymin,ymax);
51SetAxesFlags(kBoxAxes | kExtTicks | kLabels);
52}
53
54/* --Methode-- */
55void PIGenFitDat::Draw(PIGraphicUC* g, double xmin, double ymin, double xmax, double ymax)
56{
57if (!mGFD) return;
58if(mGFD->NData()<=0) return;
59if(VarX<0) return;
60// On plotte les barre d'erreurs ligne demandee explicitement
61if(GetGraphicAtt().GetLineAtt()!=PI_NotDefLineAtt) SelectErrBar(true,true);
62double xp,yp,er;
63NptDraw = 0;
64for (int i=0; i<mGFD->NData(); i++) {
65 xp = mGFD->Absc(VarX,i);
66 yp = mGFD->Val(i);
67 if(xp<xmin || xp>xmax || yp<ymin || yp>ymax) continue;
68 NptDraw++;
69 if(ErrX) {
70 er = mGFD->EAbsc(VarX,i);
71 if(er>0.) g->DrawLine(xp-er,yp,xp+er,yp);
72 }
73 if(ErrY) {
74 er = mGFD->EVal(i);
75 if(er>0.) g->DrawLine(xp,yp-er,xp,yp+er);
76 }
77 g->DrawMarker(xp, yp);
78}
79return;
80}
81
82/* --Methode-- */
83double PIGenFitDat::GetDistanceToPoint(double x, double y)
84{
85 if(!mGFD) return 1.e+9;
86 if(mGFD->NData()<=0) return 1.e+9;
87 if(VarX<0) return 1.e+9;
88
89 const int nessai = 100;
90 long inc = (NptDraw>nessai) ? (long)(NptDraw/nessai)+1 : 1;
91
92 double dist = -1.e+18;
93 long n = 0;
94 for(long i=0; i<mGFD->NData(); i++) {
95 double xp=mGFD->Absc(VarX,i);
96 if(xp<XMin() || xp>XMax()) continue;
97 double yp=mGFD->Val(i);
98 if(yp<YMin() || yp>YMax()) continue;
99 if(n%inc==0) {
100 xp = (xp-x)/(XMax()-XMin())/0.5;
101 yp = (yp-y)/(YMax()-YMin())/0.5;
102 xp = xp*xp+yp*yp;
103 if(dist<0. || xp<dist) dist = xp;
104 }
105 n++;
106 }
107 dist=sqrt(fabs(dist));
108 //cout<<"PIGenFitDat: xlim="<<XMin()<<","<<XMax()<<" ylim="<<YMin()<<","<<YMax()
109 // <<" NData="<<mGFD->NData()<<" inc="<<inc<<endl;
110 //cout<<"....d="<<dist<<" x="<<x<<" y="<<y<<" NptDraw="<<NptDraw<<endl;
111
112 return dist;
113}
Note: See TracBrowser for help on using the repository browser.