source: Sophya/trunk/SophyaPI/PIext/pihisto.cc@ 544

Last change on this file since 544 was 544, checked in by ercodmgr, 26 years ago

Documentation + ameliorations DrawStats + vector->tvector pour Planck - Reza 3/11/99

File size: 4.4 KB
RevLine 
[544]1// Classe traceur d histogramme 96-99
2// CEA-DAPNIA LAL-IN2P3/CNRS
3
[165]4#include <stdio.h>
[295]5#include <typeinfo>
6
[165]7#include "pihisto.h"
8#include "hisprof.h"
9
[544]10//++
11// Class PIHisto
12// Lib PIext
13// include pihisto.h
14//
15// Classe traceur d'objet histogramme (classe *Histo*)
16//--
17//++
18// Links Parents
19// PIDrawer
20//--
21//++
22// Titre Constructeur, méthodes
23//--
24//++
25// PIHisto(Histo* histo, bool ad=false)
26// Constructeur. Si "ad == true", l'objet "histo" est détruit par
27// le destructeur de l'objet "PIHisto"
28// Note : "histo" doit être créé par new
29//
30// void SetStats(bool fg=true)
31// Active/ désactive l'indication des statistiques d'histogramme
32//--
33
34
[165]35PIHisto::PIHisto(Histo* histo, bool ad)
36: PIDrawer(), mHisto(histo)
37{
38 mAdDO = ad; // Flag pour suppression automatique de mHisto
[544]39 SetStats(true);
[165]40}
41
42PIHisto::~PIHisto()
43{
44 if (mAdDO) delete mHisto;
45}
46
47void
48PIHisto::UpdateLimits()
49{
50 if (!mHisto) return;
51 float hmin = mHisto->VMin();
52 float hmax = mHisto->VMax()+0.2*(mHisto->VMax()-mHisto->VMin());
53 // si HBProf min,max calcules en tenant compte des erreurs
[295]54 if( typeid(*mHisto) == typeid(HProf) ) {
[165]55 float v1,v2;
56 for (int i=1; i<mHisto->NBins(); i++) {
57 v1 = (*mHisto)(i) - mHisto->Error(i);
58 v2 = (*mHisto)(i) + mHisto->Error(i);
59 if(v1<hmin) hmin = v1;
60 if(v2>hmax) hmax = v2;
61 }
62 v1 = 0.1*(hmax-hmin);
63 hmin -= v1; hmax += v1;
64 }
65 if(hmax<=hmin) hmax += 1.;
66 SetLimits(mHisto->XMin(), mHisto->XMax(), hmin, hmax);
67 SetAxesFlags(kBoxAxes | kExtTicks | kLabels);
68}
69
70void
[205]71PIHisto::Draw(PIGraphicUC* g, double /*xmin*/, double /*ymin*/, double /*xmax*/, double /*ymax*/)
[165]72{
73 bool oktrace = false;
74 if (!mHisto) return;
[203]75
[295]76 if (mMrk != PI_NotDefMarker || ( typeid(*mHisto) == typeid(HProf) ) ) {
[165]77 // Marqeurs definis OU HBProf => marqueurs+Erreurs si il y en a
78 if (mLAtt == PI_NotDefLineAtt) g->SelLine(PI_ThinLine);
[205]79 double x1,y1, x2,y2;
80 double bw = mHisto->BinWidth();
[165]81 for (int i=0; i<mHisto->NBins(); i++) {
82 if(mHisto->Error(i)>0.) {
83 // barres d'erreur verticales
84 x1 = x2 = mHisto->BinCenter(i);
85 y1 = (*mHisto)(i) - mHisto->Error(i);
86 y2 = (*mHisto)(i) + mHisto->Error(i);
87 g->DrawLine(x1,y1, x1, y2);
88 // limites de barres d'erreurs (horizontales)
89 x1 -= bw/3.; x2 += bw/3.;
90 g->DrawLine(x1,y1, x2, y1);
91 g->DrawLine(x1,y2, x2, y2);
92 }
93 // le marqueur
94 x1 = mHisto->BinCenter(i);
95 y1 = (*mHisto)(i);
96 g->DrawMarker(x1,y1);
97 }
98 oktrace = true;
99 }
100 if (mLAtt != PI_NotDefLineAtt) {
[205]101 double x1,y1, x2, y2;
[165]102 x1 = mHisto->BinLowEdge(0);
103 y1 = 0;
104 for (int i=0; i<mHisto->NBins(); i++) {
105 x2 = x1;
106 y2 = (*mHisto)(i);
107 g->DrawLine(x1,y1, x2, y2);
108 y1 = y2;
109 x2 = mHisto->BinHighEdge(i);
110 g->DrawLine(x1,y1, x2, y2);
111 x1 = x2;
112 }
113 y2 = 0; g->DrawLine(x1,y1, x2, y2);
114 oktrace = true;
115 }
116 if( !oktrace ) {
117 for(int i=0; i<mHisto->NBins(); i++) {
[205]118 double left = mHisto->BinLowEdge(i);
119 double width = mHisto->BinWidth();
120 double bottom = 0;
121 double height = (*mHisto)(i);
[165]122 g->DrawFBox(left,bottom,width,height);
123 g->DrawLine(left, bottom, left, bottom + height); // Au moins une ligne...
124 }
125 }
[203]126 // A faire a la fin - DrawStats change l'attribut de ligne
[544]127 if (stats) DrawStats(g);
[165]128}
129
130void
131PIHisto::DrawStats(PIGraphicUC* g)
132{
133 if (!mHisto) return;
[203]134 // if (mLAtt == PI_NotDefLineAtt) g->SelLine(PI_ThinLine);
135 g->SelLine(PI_ThinLine);
[544]136 g->SelFontSz((YMax() - YMin())/25, mFAtt);
137// double cellHeight = (YMax() - YMin()) * 0.05;
138 PIGrCoord a, d;
139 double cH = (double)g->GetFontHeight(a,d);
140 double cellHeight = cH * 3.8;
141// double cellWidth = (XMax() - XMin()) * 0.23;
142 char label[50];
143 sprintf(label, "N= %.8g ", mHisto->NData());
144 label[11] ='\0';
145 double cellWidth = (double)g->CalcStringWidth(label) * 1.1;
[165]146 g->DrawLine(XMax() - cellWidth, YMax(),
147 XMax() - cellWidth, YMax() - cellHeight);
148 g->DrawLine(XMax() - cellWidth, YMax() - cellHeight,
149 XMax() , YMax() - cellHeight);
[544]150 g->DrawString(XMax() - cellWidth*0.95, YMax() - cH*1.2, label);
151 sprintf(label, "m= %.8g", mHisto->Mean());
152 g->DrawString(XMax() - cellWidth*0.95, YMax() - cH*2.4, label);
153 sprintf(label, "s= %.8g", mHisto->Sigma());
154 g->DrawString(XMax() - cellWidth*0.95, YMax() - cH*3.6, label);
[165]155
156}
157
Note: See TracBrowser for help on using the repository browser.