source: Sophya/trunk/SophyaPI/PIext/pintuple.cc@ 1920

Last change on this file since 1920 was 1920, checked in by perderos, 24 years ago

1) ajout de commande pour trace de champ de vecteur
2) modif pour compil sous peida (pawexecut.cc) OP 06/03/2002

File size: 7.1 KB
Line 
1// Peida Interactive - PI R. Ansari 97-99
2// Traceur (Drawer) pour NTupleInterface
3// LAL (Orsay) / IN2P3-CNRS DAPNIA/SPP (Saclay) / CEA
4
5#include <stdio.h>
6#include "pintuple.h"
7
8//++
9// Class PINTuple
10// Lib PIext
11// include pintuple.h
12//
13// Classe de traceur 2D (dans un plan) à partir des données
14// d'un objet implémentant l'interface *NTupleInterface*.
15// Les objets "PINTuple" peuvent tracer des signes (markers)
16// éventuellement avec des barres d'erreur et une étiquette
17// pour chaque point. Si un attribut de ligne, autre que
18// "PI_NotDefLineAtt" est spécifié, les points sont connectés
19// par une ligne.
20//--
21//++
22// Links Parents
23// PIDrawer
24//--
25//++
26// Links Voir aussi
27// NTupleInterface
28// PINTuple3D
29//--
30
31//++
32// Titre Constructeur
33//--
34//++
35// PINTuple(NTupleInterface* nt, bool ad)
36// Constructeur. Si "ad == true", l'objet "nt" est détruit par
37// le destructeur de l'objet "PINTuple"
38// Note : "nt" doit être créé par new
39//--
40
41/* --Methode-- */
42PINTuple::PINTuple(NTupleInterface* nt, bool ad)
43: PIDrawer()
44{
45 mNT = nt;
46 mAdDO = ad;
47 SetStats(true);
48 SelectXY(NULL, NULL);
49 SelectWt(NULL, 1);
50 SelectErrBar();
51 SelectLabel(NULL);
52 SetName("NTupleDrw");
53}
54
55PINTuple::~PINTuple()
56{
57 if (mAdDO && mNT) delete mNT;
58}
59
60//++
61// Titre Méthodes
62//--
63//++
64// void SelectXY(const char* px, const char* py)
65// Choix des noms de colonnes X,Y définissant les coordonnées des points.
66// Ces deux colonnes doivent être spécifiées pour obtenir un tracé.
67// void SelectErrBar(const char* erbx=NULL, const char* erby=NULL)
68// Choix des noms de colonnes pour le tracé des barres d'erreur.
69// void SelectWt(const char* pw=NULL, int nbins=10)
70// Choix du nom de colonne poids. Dans ce cas, la taille du signe
71// (marker) sera proportionnel à la valeur de cette colonne pour
72// chaque point.
73// void SelectLabel(const char* plabel=NULL)
74// Choix du nom de colonne correspondant à l'étiquette.
75//--
76
77/* --Methode-- */
78void PINTuple::SelectXY(const char* px, const char* py)
79{
80string name;
81if (mNT == NULL) xK = yK = -1;
82if (px == NULL) xK = -1;
83else { name = px; xK = mNT->ColumnIndex(name); }
84if (py == NULL) yK = -1;
85else { name = py; yK = mNT->ColumnIndex(name); }
86}
87
88/* --Methode-- */
89void PINTuple::SelectWt(const char* pw, int nbins)
90{
91nWbins = (nbins > 0) ? nbins : 10;
92if (pw == NULL) wK = -1;
93else { string name = pw; wK = mNT->ColumnIndex(name); }
94
95if (wK >= 0) mNT->GetMinMax(wK, wMin, wMax);
96else { wMin = 0.; wMax = 1.; }
97}
98
99/* --Methode-- */
100void PINTuple::SelectLabel(const char* plabel)
101{
102if (plabel == NULL) lK = -1;
103else { string name = plabel; lK = mNT->ColumnIndex(name); }
104}
105
106/* --Methode-- */
107void PINTuple::SelectErrBar(const char* erbx, const char* erby)
108{
109string name;
110if (mNT == NULL) xebK = yebK = -1;
111if (erbx == NULL) xebK = -1;
112else { name = erbx; xebK = mNT->ColumnIndex(name); }
113if (erby == NULL) yebK = -1;
114else { name = erby; yebK = mNT->ColumnIndex(name); }
115}
116
117
118/* --Methode-- */
119void PINTuple::UpdateLimits()
120{
121 if (!mNT) return;
122 if (mNT->NbLines() <= 0) return;
123 if ( (xK < 0) || (yK < 0) ) return;
124
125 // Commencer par trouver nos limites
126 double dx, dy;
127 double xmin, xmax, ymin, ymax;
128 xmin = ymin = 9.e19;
129 xmax = ymax = -9.e19;
130 mNT->GetMinMax(xK, xmin, xmax);
131 mNT->GetMinMax(yK, ymin, ymax);
132
133 dx = 0.02*(xmax-xmin);
134 dy = 0.02*(ymax-ymin);
135
136 SetLimits(xmin-dx, xmax+dx, ymin-dy, ymax+dy);
137// SetAxesFlags(kBoxAxes | kExtTicks | kLabels); Ne pas faire - Reza 11/99
138}
139
140
141/* --Methode-- */
142void PINTuple::Draw(PIGraphicUC* g, double xmin, double ymin, double xmax, double ymax)
143{
144double xp,yp,xer,yer,wp;
145double xl,yl;
146int nok;
147
148if (!mNT) return;
149if (axesFlags != kAxesNone) DrawAxes(g);
150if ( (xK < 0) || (yK < 0) ) return;
151if (GetGraphicAtt().GetLineAtt() == PI_NotDefLineAtt) g->SelLine(PI_ThinLine);
152
153// Pour tracer des markers avec taille fonction de Wt (poids)
154double dw = (wMax-wMin)/nWbins;
155if (dw < 1.e-19) dw = 1.e19;
156int msz,sz;
157
158PIMarker mmrk = GetGraphicAtt().GetMarker();
159PIMarker mrk;
160if (wK >= 0) mrk = (mmrk != PI_NotDefMarker) ? mmrk : PI_CircleMarker;
161else mrk = (mmrk != PI_NotDefMarker) ? mmrk : PI_DotMarker;
162 msz = GetGraphicAtt().GetMarkerSz();
163if (msz < 1) msz = 1;
164g->SelMarker(msz, mrk);
165
166PIGrCoord uxmin, uxmax, uymin, uymax;
167g->GetGrSpace(uxmin, uxmax, uymin, uymax);
168double xmin2 = uxmin;
169double ymin2 = uymin;
170double xmax2 = uxmax;
171double ymax2 = uymax;
172
173nok = 0;
174xp = yp = xl = yl = 0;
175for (int i=0; i<mNT->NbLines(); i++) {
176 xl = xp; yl = yp;
177 xp = mNT->GetCell(i, xK);
178 yp = mNT->GetCell(i, yK);
179 if ( (xp < xmin2) || (xp > xmax2) || (yp < ymin2) || (yp > ymax2) ) continue;
180 nok++;
181 if ( (xp < xmin) || (xp > xmax) || (yp < ymin) || (yp > ymax) ) continue;
182 if ( (i > 0) && (GetGraphicAtt().GetLineAtt() != PI_NotDefLineAtt) )
183 g->DrawLine(xl, yl, xp, yp); // On relie les points ...
184 if ( xebK >= 0 ) {
185 xer = mNT->GetCell(i, xebK);
186 if(xer>0.) g->DrawLine(xp-xer, yp, xp+xer, yp);
187 }
188 if ( yebK >= 0 ) {
189 yer = mNT->GetCell(i, yebK);
190 if(yer>0.) g->DrawLine(xp, yp-yer, xp, yp+yer);
191 }
192 if (wK >= 0) { // Taille de marker en fonction du poids
193 wp = mNT->GetCell(i, wK);
194 sz = (int)((wp-wMin)/dw);
195 if (sz < 0) sz = 0;
196 if (sz > nWbins) sz = nWbins;
197 sz += msz;
198 if (sz < 2) g->SelMarker(sz, PI_DotMarker);
199 else g->SelMarker(sz, mrk);
200 }
201 // Trace du marker
202 if ((wK >= 0)||(lK < 0)||(mmrk != PI_NotDefMarker)) g->DrawMarker(xp, yp);
203 // Trace eventuel du label
204 if (lK >= 0) g->DrawString(xp, yp, mNT->GetCelltoString(i, lK).c_str());
205
206}
207
208if (stats) { // Trace de stats
209 g->SelFontSz((YMax() - YMin())/30);
210 // La hauteur de la cellule
211 PIGrCoord a,d;
212 double cH = (double)g->GetFontHeight(a,d);
213 double cellHeight = 1.2 * cH;
214 // Les labels et leurs longueurs -> largeur de la cellule
215 char label[64];
216 sprintf(label, "Nd= %d / Ntot= %d", nok, mNT->NbLines());
217 double cellWidth = 1.1 * (double)g->CalcStringWidth(label);
218 double xu, yu, cw;
219 // Les limites du cadre
220 xu = g->DeltaUCX(XMax(), - cellWidth);
221 yu = g->DeltaUCY(YMax(), - cellHeight);
222 g->DrawLine(xu, YMax(), xu, yu);
223 g->DrawLine(xu, yu, XMax(), yu);
224 // L'ecriture des labels (attention aux inversions possibles des axes!)
225 cw = (g->isAxeXDirRtoL()) ? -0.05*cellWidth : -0.95*cellWidth;
226 xu = g->DeltaUCX(XMax(),cw);
227 cw = (g->isAxeYDirUpDown()) ? -0.1*cH : -1.1*cH;
228 yu = g->DeltaUCY(YMax(),cw);
229 g->DrawString(xu,yu,label);
230}
231
232return;
233}
234
235/* --Methode-- */
236void PINTuple::AppendTextInfo(string& info, double xmin, double ymin, double xmax, double ymax)
237{
238if (!mNT) return;
239if ( (xK < 0) || (yK < 0) ) return;
240
241int ncnt = 0;
242double xp,yp;
243char buff[128];
244sprintf(buff,"PINTuple: NLines= %d NCol= %d \n", mNT->NbLines(), mNT->NbColumns());
245info += buff;
246info += mNT->LineHeaderToString();
247for (int i=0; i<mNT->NbLines(); i++) {
248 xp = mNT->GetCell(i, xK);
249 yp = mNT->GetCell(i, yK);
250 if ( (xp < xmin) || (xp > xmax) || (yp < ymin) || (yp > ymax) ) continue;
251 ncnt++;
252 if (ncnt > 101) continue;
253 info += mNT->LineToString(i);
254 }
255if (ncnt >= 101) info += " .... \n";
256sprintf(buff," %d points inside selected region \n", ncnt);
257info += buff;
258// printf("PINTuple::AppendTextInfo()-DBG %g %g %g %g - %d\n", xmin, ymin, xmax, ymax, ncnt);
259return;
260}
Note: See TracBrowser for help on using the repository browser.