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

Last change on this file since 2350 was 2350, checked in by ansari, 23 years ago

Ajout nouvelles options pour trace d'axes ds le Help de baseexecut.cc
et ajout d'une nouvelle option (connectpoints) ds PINTupleDrawer (et 3D)

Reza 18 Mars 2003

File size: 9.7 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 ConnectPoints(false);
49 SelectXY(NULL, NULL);
50 SelectWt(NULL, 1);
51 SelectErrBar();
52 SelectLabel(NULL);
53 SetName("NTupleDrw");
54}
55
56PINTuple::~PINTuple()
57{
58 if (mAdDO && mNT) delete mNT;
59}
60
61//++
62// Titre Méthodes
63//--
64//++
65// void SelectXY(const char* px, const char* py)
66// Choix des noms de colonnes X,Y définissant les coordonnées des points.
67// Ces deux colonnes doivent être spécifiées pour obtenir un tracé.
68// void SelectErrBar(const char* erbx=NULL, const char* erby=NULL)
69// Choix des noms de colonnes pour le tracé des barres d'erreur.
70// void SelectWt(const char* pw=NULL, int nbins=10)
71// Choix du nom de colonne poids. Dans ce cas, la taille du signe
72// (marker) sera proportionnel à la valeur de cette colonne pour
73// chaque point.
74// void SelectLabel(const char* plabel=NULL)
75// Choix du nom de colonne correspondant à l'étiquette.
76//--
77
78/* --Methode-- */
79void PINTuple::SelectXY(const char* px, const char* py)
80{
81string name;
82if (mNT == NULL) xK = yK = -1;
83if (px == NULL) xK = -1;
84else { name = px; xK = mNT->ColumnIndex(name); }
85if (py == NULL) yK = -1;
86else { name = py; yK = mNT->ColumnIndex(name); }
87}
88
89/* --Methode-- */
90void PINTuple::SelectWt(const char* pw, int nbins)
91{
92nWbins = (nbins > 0) ? nbins : 10;
93if (pw == NULL) wK = -1;
94else { string name = pw; wK = mNT->ColumnIndex(name); }
95
96if (wK >= 0) mNT->GetMinMax(wK, wMin, wMax);
97else { wMin = 0.; wMax = 1.; }
98}
99
100/* --Methode-- */
101void PINTuple::SelectLabel(const char* plabel)
102{
103if (plabel == NULL) lK = -1;
104else { string name = plabel; lK = mNT->ColumnIndex(name); }
105}
106
107/* --Methode-- */
108void PINTuple::SelectErrBar(const char* erbx, const char* erby)
109{
110string name;
111if (mNT == NULL) xebK = yebK = -1;
112if (erbx == NULL) xebK = -1;
113else { name = erbx; xebK = mNT->ColumnIndex(name); }
114if (erby == NULL) yebK = -1;
115else { name = erby; yebK = mNT->ColumnIndex(name); }
116}
117
118
119/* --Methode-- */
120void PINTuple::UpdateLimits()
121{
122 if (!mNT) return;
123 if (mNT->NbLines() <= 0) return;
124 if ( (xK < 0) || (yK < 0) ) return;
125
126 // Commencer par trouver nos limites
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 PIAxes::ReSizeMinMax(isLogScaleX(),xmin,xmax);
133 PIAxes::ReSizeMinMax(isLogScaleY(),ymin,ymax);
134 SetLimits(xmin,xmax,ymin,ymax);
135// SetAxesFlags(kBoxAxes | kExtTicks | kLabels); Ne pas faire - Reza 11/99
136}
137
138
139/* --Methode-- */
140void PINTuple::Draw(PIGraphicUC* g, double xmin, double ymin, double xmax, double ymax)
141{
142double xp,yp,xer,yer,wp;
143double xl,yl;
144int nok;
145
146if (!mNT) return;
147if (axesFlags != kAxesNone) DrawAxes(g);
148if ( (xK < 0) || (yK < 0) ) return;
149if (GetGraphicAtt().GetLineAtt() == PI_NotDefLineAtt) g->SelLine(PI_ThinLine);
150
151// Pour tracer des markers avec taille fonction de Wt (poids)
152double dw = (wMax-wMin)/nWbins;
153if (dw < 1.e-19) dw = 1.e19;
154int msz,sz;
155
156PIMarker mmrk = GetGraphicAtt().GetMarker();
157PIMarker mrk;
158if (wK >= 0) mrk = (mmrk != PI_NotDefMarker) ? mmrk : PI_CircleMarker;
159else mrk = (mmrk != PI_NotDefMarker) ? mmrk : PI_DotMarker;
160 msz = GetGraphicAtt().GetMarkerSz();
161if (msz < 1) msz = 1;
162g->SelMarker(msz, mrk);
163
164PIGrCoord uxmin, uxmax, uymin, uymax;
165g->GetGrSpace(uxmin, uxmax, uymin, uymax);
166double xmin2 = uxmin;
167double ymin2 = uymin;
168double xmax2 = uxmax;
169double ymax2 = uymax;
170
171nok = 0;
172xp = yp = xl = yl = 0;
173for (long i=0; i<(long)mNT->NbLines(); i++) {
174 xl = xp; yl = yp;
175 xp = mNT->GetCell(i, xK);
176 yp = mNT->GetCell(i, yK);
177 if ( (xp < xmin2) || (xp > xmax2) || (yp < ymin2) || (yp > ymax2) ) continue;
178 nok++;
179 if ( (xp < xmin) || (xp > xmax) || (yp < ymin) || (yp > ymax) ) continue;
180 if ( (i > 0) && connectPts )
181 g->DrawLine(xl, yl, xp, yp); // On relie les points ...
182 if ( xebK >= 0 ) {
183 xer = mNT->GetCell(i, xebK);
184 if(xer>0.) g->DrawLine(xp-xer, yp, xp+xer, yp);
185 }
186 if ( yebK >= 0 ) {
187 yer = mNT->GetCell(i, yebK);
188 if(yer>0.) g->DrawLine(xp, yp-yer, xp, yp+yer);
189 }
190 if (wK >= 0) { // Taille de marker en fonction du poids
191 wp = mNT->GetCell(i, wK);
192 sz = (int)((wp-wMin)/dw);
193 if (sz < 0) sz = 0;
194 if (sz > nWbins) sz = nWbins;
195 sz += msz;
196 if (sz < 2) g->SelMarker(sz, PI_DotMarker);
197 else g->SelMarker(sz, mrk);
198 }
199 // Trace du marker
200 if ((wK >= 0)||(lK < 0)||(mmrk != PI_NotDefMarker)) g->DrawMarker(xp, yp);
201 // Trace eventuel du label
202 if (lK >= 0) g->DrawString(xp, yp, mNT->GetCelltoString(i, lK).c_str());
203
204}
205
206if (stats) { // Trace de stats
207 g->SelFontSz((YMax() - YMin())/30);
208 // La hauteur de la cellule
209 PIGrCoord a,d;
210 double cH = (double)g->GetFontHeight(a,d);
211 double cellHeight = 1.2 * cH;
212 // Les labels et leurs longueurs -> largeur de la cellule
213 char label[64];
214 sprintf(label, "Nd= %d / Ntot= %d", nok, mNT->NbLines());
215 double cellWidth = 1.1 * (double)g->CalcStringWidth(label);
216 double xu, yu, cw;
217 // Les limites du cadre
218 xu = g->DeltaUCX(XMax(), - cellWidth);
219 yu = g->DeltaUCY(YMax(), - cellHeight);
220 g->DrawLine(xu, YMax(), xu, yu);
221 g->DrawLine(xu, yu, XMax(), yu);
222 // L'ecriture des labels (attention aux inversions possibles des axes!)
223 cw = (g->isAxeXDirRtoL()) ? -0.05*cellWidth : -0.95*cellWidth;
224 xu = g->DeltaUCX(XMax(),cw);
225 cw = (g->isAxeYDirUpDown()) ? -0.1*cH : -1.1*cH;
226 yu = g->DeltaUCY(YMax(),cw);
227 g->DrawString(xu,yu,label);
228}
229
230return;
231}
232
233/* --Methode-- */
234void PINTuple::AppendTextInfo(string& info, double xmin, double ymin, double xmax, double ymax)
235{
236if (!mNT) return;
237if ( (xK < 0) || (yK < 0) ) return;
238
239int ncnt = 0;
240double xp,yp;
241char buff[128];
242sprintf(buff,"PINTuple: NLines= %d NCol= %d \n", mNT->NbLines(), mNT->NbColumns());
243info += buff;
244info += mNT->LineHeaderToString();
245for(long i=0; i<(long)mNT->NbLines(); i++) {
246 xp = mNT->GetCell(i, xK);
247 yp = mNT->GetCell(i, yK);
248 if ( (xp < xmin) || (xp > xmax) || (yp < ymin) || (yp > ymax) ) continue;
249 ncnt++;
250 if (ncnt > 101) continue;
251 info += mNT->LineToString(i);
252 }
253if (ncnt >= 101) info += " .... \n";
254sprintf(buff," %d points inside selected region \n", ncnt);
255info += buff;
256// printf("PINTuple::AppendTextInfo()-DBG %g %g %g %g - %d\n", xmin, ymin, xmax, ymax, ncnt);
257return;
258}
259
260/* La methode DecodeOptionString permet de decoder un ensemble d'options
261 et de parametre d'affichage specifie sous forme d'un vecteur de string.
262 Si rmdecopt == true, les options decodees sont supprimees du vecteur
263 de string fourni en entree - ce qui permet l'enchainement eventuel
264 de plusieurs decodages de string.
265 Les options peuvent etre sous forme de flag : "stat" "nostat"
266 ou plus complexes, par exemple "dynamic=-3,3"
267 Rc: La methode renvoie le nombre d'options decodees
268*/
269
270/* --Methode-- */
271int PINTuple::DecodeOptionString(vector<string> & opt, bool rmdecopt)
272{
273 int optsz1 = opt.size();
274 if(optsz1<1) return(0);
275 // On appelle d'abord le decodage de la classe PIDrawer de laquelle
276 // on herite. (Pas obligatoire) on decode donc ici les attributs de
277 // couleur, fontes ...
278 int ndec1 = PIDrawer::DecodeOptionString(opt, rmdecopt);
279 if(optsz1-ndec1<1) return(ndec1); // si tout a ete decode
280
281 vector<string> udopt; // On gardera ici les options non decodees
282 unsigned int k = 0;
283 int ndec = opt.size();
284 for( k=0; k<opt.size(); k++ ) {
285 string opts = opt[k];
286 if(opts=="sta" || opts=="stat" || opts=="stats") SetStats(true);
287 else if( opts=="nsta" || opts=="nstat"
288 || opts=="nostat" || opts=="nostats") SetStats(false);
289 else if (opts == "connectpoints") ConnectPoints(true);
290 else if (opts == "noconnectpoints") ConnectPoints(false);
291 else {
292 // Si option non decode
293 ndec--;
294 // S'il faut supprimer les options decodees
295 if (rmdecopt) udopt.push_back(opts);
296 }
297 }
298 // S'il faut supprimer les options decodees, on remplace l'argument opt
299 // par le vecteur des options non decodees.
300 if (rmdecopt) opt = udopt;
301 return(ndec+ndec1);
302}
303
304/* La methode GetOptionsHelpInfo(string& info) renvoie une chaine
305 avec la description des options comprises par ce drawer
306 Note: Il est preferable de ne pas initialiser la chaine
307 string info au depart, afin de permettre de mettre bout a
308 bout les aides de differents Drawer */
309
310/* --Methode-- */
311void PINTuple::GetOptionsHelpInfo(string& info)
312{
313// On recupere d'abord la chaine info de la classe de base
314PIDrawer::GetOptionsHelpInfo(info);
315info += " ---- PINTuple options help info : \n" ;
316info += " sta,stat,stats: activate statistic display\n";
317info += " nsta,nstat,nostat,nostats: deactivate statistic display\n";
318info += " connectpoints: The points are connected by a line \n";
319info += " noconnectpoints (this is the default) \n";
320info += " and usual color/line/marker/... attribute decoding \n";
321return;
322}
Note: See TracBrowser for help on using the repository browser.