00001 #!/usr/local/bin/python
00002 #
00003 # Copyright 2004
00004 # by
00005 # The Board of Trustees of the
00006 # Leland Stanford Junior University.
00007 # All rights reserved.
00008 #
00009
00010
00011 __facility__ = "Trigger"
00012 __abstract__ = "Histogram for trigger display"
00013 __author__ = "Martin Kocian, SLAC"
00014 __date__ = ("$Date: 2005/06/15 23:42:30 $").split(' ')[1]
00015 __version__ = "$Revision: 2.3 $"
00016 __release__ = "$Name: R04-12-00 $"
00017 __credits__ = "SLAC"
00018
00019 from qt import *
00020 import sys
00021 from math import *
00022 BORDERSIZE=10
00023 MARGINLEFT=15
00024 MARGINLOW=25
00025 NTICKMIN=10
00026 NTICKMAX=50
00027
00028 class doublehisto(QWidget):
00029 def __init__(self,parent=None,name=None,fl=0):
00030 QWidget.__init__(self,parent,name,fl)
00031 self.__firstsetup=True
00032 if not name:
00033 self.setName("doublehisto")
00034 self.clearWState(Qt.WState_Polished)
00035 def setup(self,nbins,lower,upper,logx,logy):
00036 self.__nbins=nbins
00037 self.__lower=float(lower)
00038 self.__upper=float(upper)
00039 self.__nhist=0
00040 self.__logx=logx
00041 self.__logy=logy
00042 self.__scale=1.
00043 self.__scalehaschanged=True
00044 self.fontsize=8
00045 self.bds=BORDERSIZE
00046 self.labelboxx=.05
00047 self.labelboxy=.04
00048 self.boxwidth=0.5
00049 if self.__logy==False:
00050 self.__scalelow=0.
00051 else:
00052 self.__scalelow=0.5
00053 self.__histtitle0="Hist 0"
00054 self.__histtitle1="Hist 1"
00055 self.__marginleft=MARGINLEFT
00056 self.__marginlow=MARGINLOW
00057 self.__ticksx=self.computeticks(self.__lower,self.__upper,self.__logx)
00058 self.__ticksy=self.computeticks(self.__scalelow,self.__scale,self.__logy)
00059 if self.__firstsetup==False:
00060 for it in self.__xlabels: it.deleteLater()
00061 for it in self.__ylabels: it.deleteLater()
00062 self.xaxislabel.deleteLater()
00063 self.__firstsetup=False
00064 self.__xlabels=self.makelabels(self.__ticksx[0],self.__logx,QLabel.AlignTop|QLabel.AlignHCenter)
00065 self.__ylabels=self.makelabels(self.__ticksy[0],self.__logy,QLabel.AlignVCenter|QLabel.AlignRight)
00066 self.xaxislabel=QLabel(self,"xaxis")
00067 font=QFont(self.xaxislabel.font())
00068 font.setPointSize(self.fontsize)
00069 self.xaxislabel.setFont(font)
00070 self.xaxislabel.setPaletteBackgroundColor(QColor("white"))
00071 self.xaxislabel.setAlignment(QLabel.AlignVCenter|QLabel.AlignRight)
00072 self.histolabel=[]
00073 self.__contents=[]
00074 self.style=[]
00075 self.color=[]
00076 self.uselabel=[]
00077 self.showhisto=[]
00078 self.histoname=[]
00079 self.setBinBoundaries()
00080 def addHisto(self,name="histo",color="black",style=0,uselabel=0,showhis=1):
00081 self.histoname.append(name)
00082 self.uselabel.append(uselabel)
00083 self.showhisto.append(showhis)
00084 self.color.append(color)
00085 self.style.append(style)
00086 self.histolabel.append(QLabel(self,"histo_%d"%self.__nhist))
00087 font=QFont(self.histolabel[-1].font())
00088 font.setPointSize(self.fontsize)
00089 self.histolabel[-1].setFont(font)
00090 self.histolabel[-1].setPaletteBackgroundColor(QColor("white"))
00091 self.histolabel[-1].setAlignment(QLabel.AlignVCenter|QLabel.AlignLeft)
00092 self.__contents.append([])
00093 for i in range(self.__nbins):
00094 self.__contents[self.__nhist].append(0.)
00095 self.__nhist+=1
00096 self.drawLabels()
00097 def find(self,name):
00098 try:
00099 ind=self.histoname.index(name)
00100 except:
00101 ind=-1
00102 return ind
00103 def setHistoLabel(self,name,lab):
00104 ind=self.histoname.index(name)
00105 self.histolabel[ind].setText(lab)
00106 def hideHisto(self,name):
00107 ind=self.histoname.index(name)
00108 self.showhisto[ind]=0
00109 newmax=1.
00110 for i in range(self.__nhist):
00111 if self.showhisto[i]==1:
00112 newmax=max(newmax,max(self.__contents[i]))
00113 if newmax<max(self.__contents[ind]):
00114 self.__scale=newmax*1.25
00115 self.__scalehaschanged=True
00116 self.updateHisto()
00117 self.drawLabels()
00118 def showHisto(self,name):
00119 ind=self.histoname.index(name)
00120 self.showhisto[ind]=1
00121 if max(self.__contents[ind])>self.__scale*.95:
00122 self.__scale=max(self.__contents[ind])*1.25
00123 self.__scalehaschanged=True
00124 self.updateHisto()
00125 self.drawLabels()
00126 def removeHisto(self,name):
00127 ind=self.histoname.index(name)
00128 newmax=1.
00129 for i in range(self.__nhist):
00130 if self.showhisto[i]==1:
00131 newmax=max(newmax,max(self.__contents[i]))
00132 if newmax<max(self.__contents[ind]):
00133 self.__scale=newmax*1.25
00134 self.__scalehaschanged=True
00135 self.__contents.pop(ind)
00136 self.histoname.pop(ind)
00137 self.uselabel.pop(ind)
00138 self.showhisto.pop(ind)
00139 self.color.pop(ind)
00140 self.style.pop(ind)
00141 self.histolabel.pop(ind).deleteLater()
00142 self.__nhist-=1
00143 self.updateHisto()
00144 self.drawLabels()
00145 def removeAllHistos(self):
00146 self.__contents=[]
00147 self.histoname=[]
00148 self.uselabel=[]
00149 self.showhisto=[]
00150 self.color=[]
00151 self.style=[]
00152 for i in self.histolabel:i.deleteLater()
00153 self.histolabel=[]
00154 self.__nhist=0
00155 self.updateHisto()
00156 self.drawLabels()
00157 self.__scale==1.
00158 def setBinBoundaries(self):
00159 self.__binboundary=[]
00160 for i in range (self.__nbins):
00161 if self.__logx:
00162 self.__binboundary.append(pow(10,(log10(self.__upper)-log10(self.__lower))/self.__nbins*i+log10(self.__lower)))
00163 else:
00164 self.__binboundary.append((self.__upper-self.__lower)/self.__nbins*(i)+self.__lower)
00165
00166 def resetHisto(self,number):
00167 for i in range(self.__nbins):
00168 self.__contents[number][i]=0.
00169 def resetAllHistos(self):
00170 for i in range (self.__nhist):
00171 self.resetHisto(i)
00172 self.__scale=1.
00173
00174 def setLogy(self, on):
00175 self.__logy=on
00176 if on:
00177 self.__marginleft=MARGINLEFT
00178 self.__scalelow=0.5
00179 else: self.__scalelow=0.
00180 self.__scalehaschanged=True
00181 self.updateHisto()
00182
00183 def makelabels(self,ticks,logs,alignment):
00184 labels=[]
00185 for tick in ticks:
00186 labels.append(QLabel(self,"tick_%d"%tick))
00187 font=QFont(labels[-1].font())
00188 font.setPointSize(self.fontsize)
00189 labels[-1].setFont(font)
00190 if logs==True:
00191 if floor(log10(tick)+.1)==0:labels[-1].setText("<b>1<sup> ")
00192 elif int(log10(tick)+.1)==1:labels[-1].setText("<b>10<sup> ")
00193 else: labels[-1].setText("<b>10<sup>%d"% floor(log10(tick)+.1))
00194 else:
00195 if remainder(tick)<1e-5 or tick==0:
00196 labels[-1].setText("<b>%d"%tick)
00197 else:
00198 labels[-1].setText("<b>"+str(tick))
00199 labels[-1].setPaletteBackgroundColor(QColor("white"))
00200 labels[-1].setAlignment(alignment)
00201 return labels
00202 def fill(self,name,xval,weight=1.):
00203 hist=self.histoname.index(name)
00204 if hist>=self.__nhist or xval>self.__upper:return
00205 for i in range(self.__nbins-1,-1,-1):
00206 if xval>self.__binboundary[i]:
00207 self.__contents[hist][i]+=weight
00208 if self.__contents[hist][i]>self.__scale*.95 and self.showhisto[hist]==1:
00209 self.__scale=self.__contents[hist][i]*1.25
00210 self.__scalehaschanged=True
00211 break
00212 def setBinContent(self,name,i,w):
00213 hist=self.histoname.index(name)
00214 self.__contents[hist][i]=w
00215 if self.__contents[hist][i]>self.__scale*.95 and self.showhisto[hist]==1:
00216 self.__scale=self.__contents[hist][i]*1.25
00217 self.__scalehaschanged=True
00218 def resetlin(self):
00219 newaxis=False
00220 if self.__logx==True:
00221 newaxis=True
00222 self.__logx=False
00223 self.resetxaxis(newaxis)
00224 def resetlog(self):
00225 newaxis=False
00226 if self.__logx==False:
00227 newaxis=True
00228 self.__logx=True
00229 self.resetxaxis(newaxis)
00230
00231 def resetxaxis(self,newaxis):
00232 for i in range (self.__nhist):
00233 self.resetHisto(i)
00234 if newaxis==True:
00235 self.__ticksx=self.computeticks(self.__lower,self.__upper,self.__logx)
00236 for j in self.__xlabels:j.deleteLater()
00237 self.__xlabels=self.makelabels(self.__ticksx[0],self.__logx,QLabel.AlignHCenter|QLabel.AlignTop)
00238 self.setBinBoundaries()
00239 self.__scale=1.
00240 self.__scalehaschanged=True
00241 self.updateHisto()
00242
00243 def updateHisto(self):
00244 if self.__scalehaschanged==True:
00245 self.__ticksy=self.computeticks(self.__scalelow,self.__scale,self.__logy)
00246 for j in self.__ylabels:j.deleteLater()
00247 self.__ylabels=self.makelabels(self.__ticksy[0],self.__logy,QLabel.AlignVCenter|QLabel.AlignRight)
00248 if len(self.__ylabels[-1].text())>6 and not self.__logy:self.__marginleft=(len(self.__ylabels[-1].text())-3)*6
00249 self.drawLabels()
00250 self.__scalehaschanged=False
00251 self.update()
00252 def computeticks(self,lower,upper,log):
00253 if log:
00254 l=floor(log10(float(lower)))
00255 tickval=ceil(float(lower)/pow(10,l))*pow(10,l)
00256 ticks=[[],[]]
00257 while tickval<=upper:
00258 if int(tickval/pow(10,l)+.1)==10:
00259 l+=1
00260 ticks[0].append(tickval)
00261 else:
00262 if int(tickval/pow(10,l)+.1)==1:
00263 ticks[0].append(tickval)
00264 else:
00265 ticks[1].append(tickval)
00266 tickval+=pow(10,l)
00267 else:
00268 l=pow(10,floor(log10(upper-lower)-.1))
00269 if (upper-lower)/l*10<=NTICKMAX:subd=10
00270 elif (upper-lower)/l*5<=NTICKMAX:subd=5
00271 elif (upper-lower)/l*2<=NTICKMAX:subd=2
00272 else: subd=1
00273 l2=float(l)/subd
00274 ticks=[[],[]]
00275 if lower%l==0:
00276 ticks[0].append(lower)
00277 for i in range(int((upper-(upper%l)-(lower-lower%l))/l)):
00278 ticks[0].append(lower+(i+1)*l-((lower)%l))
00279 if lower%l2==0:
00280 ticks[1].append(lower)
00281 for i in range(int((upper-(upper%l2)-(lower-lower%l2))/l2)):
00282 ticks[1].append(lower+(i+1)*l2-((lower)%l2))
00283 return ticks
00284
00285 def paintEvent(self,pe):
00286 try:
00287 r=pe.rect()
00288 painter=QPainter()
00289 painter.begin(self)
00290 painter.setBrush(QColor("white"))
00291 painter.drawRect(0,0,self.size().width(),self.size().height())
00292 widthx=float(self.size().width()-2*self.bds-self.__marginleft)
00293 widthy=float(self.size().height()-2*self.bds-self.__marginlow)
00294 pen=QPen()
00295 for j in range (self.__nhist):
00296 if self.showhisto[j]==0:continue
00297 if self.style[j]==1:
00298 painter.setBrush(QColor(self.color[j]))
00299 pen.setColor(QColor(self.color[j]))
00300 painter.setPen(pen)
00301 for i in range(self.__nbins):
00302 if self.__logy == True and self.__contents[j][i]>self.__scalelow:
00303 painter.drawRect(1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx,
00304 self.bds+widthy-(log10(self.__contents[j][i])-log10(self.__scalelow))
00305 /(log10(self.__scale)-log10(self.__scalelow))*widthy,
00306 int(float(i+1)*widthx/self.__nbins)-int(float(i)*widthx/self.__nbins),
00307 1+(log10(self.__contents[j][i])-log10(self.__scalelow))/
00308 (log10(self.__scale)-log10(self.__scalelow))*widthy)
00309 else:
00310 painter.drawRect(1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx,
00311 self.bds+widthy-(self.__contents[j][i]/self.__scale)*widthy,
00312 int(float(i+1)*widthx/self.__nbins)-int(float(i)*widthx/self.__nbins),
00313 1+(self.__contents[j][i]/self.__scale)*widthy)
00314 for j in range (self.__nhist):
00315 if self.showhisto[j]==0:continue
00316 if self.style[j]==0:
00317 pen.setColor(QColor(self.color[j]))
00318 painter.setPen(pen)
00319 for i in range(self.__nbins):
00320 if self.__logy==True :
00321 if self.__contents[j][i]>self.__scalelow :
00322 if i!=0:
00323 if self.__contents[j][i-1]>self.__scalelow:
00324 painter.drawLine(1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx,
00325 self.bds+widthy-(log10(self.__contents[j][i-1])-log10(self.__scalelow))
00326 /(log10(self.__scale)-log10(self.__scalelow))*widthy,
00327 1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx,
00328 self.bds+widthy-(log10(self.__contents[j][i])-log10(self.__scalelow))
00329 /(log10(self.__scale)-log10(self.__scalelow))*widthy)
00330 else:
00331 painter.drawLine(1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx,
00332 self.bds+widthy,
00333 1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx,
00334 self.bds+widthy-(log10(self.__contents[j][i])-log10(self.__scalelow))
00335 /(log10(self.__scale)-log10(self.__scalelow))*widthy)
00336 painter.drawLine(1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx,
00337 self.bds+widthy-(log10(self.__contents[j][i])-log10(self.__scalelow))
00338 /(log10(self.__scale)-log10(self.__scalelow))*widthy,
00339 self.bds+self.__marginleft+float(i)/self.__nbins*widthx+
00340 int(float(i+1)*widthx/self.__nbins)-int(float(i)*widthx/self.__nbins),
00341 self.bds+widthy-(log10(self.__contents[j][i])-log10(self.__scalelow))/
00342 (log10(self.__scale)-log10(self.__scalelow))*widthy)
00343 if i<self.__nbins-1:
00344 if self.__contents[j][i+1]<self.__scalelow:
00345 painter.drawLine(self.bds+self.__marginleft+float(i)/self.__nbins*widthx+
00346 int(float(i+1)*widthx/self.__nbins)-int(float(i)*widthx/self.__nbins),
00347 self.bds+widthy,
00348 self.bds+self.__marginleft+float(i)/self.__nbins*widthx+
00349 int(float(i+1)*widthx/self.__nbins)-int(float(i)*widthx/self.__nbins),
00350 self.bds+widthy-(log10(self.__contents[j][i])-log10(self.__scalelow))
00351 /(log10(self.__scale)-log10(self.__scalelow))*widthy)
00352
00353 else:
00354 if i!=0:
00355 painter.drawLine(1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx,
00356 self.bds+widthy-(self.__contents[j][i-1]/self.__scale)*widthy,
00357 1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx,
00358 self.bds+widthy-(self.__contents[j][i]/self.__scale)*widthy)
00359 painter.drawLine(1+self.bds+self.__marginleft+float(i)/self.__nbins*widthx,
00360 self.bds+widthy-(self.__contents[j][i]/self.__scale)*widthy,
00361 self.bds+self.__marginleft+float(i)/self.__nbins*widthx+
00362 int(float(i+1)*widthx/self.__nbins)-int(float(i)*widthx/self.__nbins),
00363 self.bds+widthy-(self.__contents[j][i]/self.__scale)*widthy)
00364 #done with histograms, now do ticks
00365 pen.setColor(QColor("black"))
00366 painter.setPen(pen)
00367 painter.setBrush(QBrush(Qt.NoBrush))
00368 painter.drawRect(self.bds+self.__marginleft,self.bds,widthx+1,widthy+1)
00369 for tick in self.__ticksx[0]:
00370 if self.__logx:
00371 painter.drawLine(self.bds+self.__marginleft+widthx/(log10(self.__upper)-log10(self.__lower))*(log10(tick)-
00372 log10(self.__lower)),widthy+self.bds-1,
00373 self.bds+self.__marginleft+widthx/(log10(self.__upper)-log10(self.__lower))*(log10(tick)-
00374 log10(self.__lower)),widthy+self.bds-6)
00375 else:
00376 painter.drawLine(self.bds+self.__marginleft+widthx/(self.__upper-self.__lower)*(tick-self.__lower),widthy+self.bds-1,
00377 self.bds+self.__marginleft+widthx/(self.__upper-self.__lower)*(tick-self.__lower),widthy+self.bds-6)
00378 for tick in self.__ticksx[1]:
00379 if self.__logx:
00380 painter.drawLine(self.bds+self.__marginleft+widthx/(log10(self.__upper)-log10(self.__lower))*(log10(tick)-
00381 log10(self.__lower)),widthy+self.bds-1,
00382 self.bds+self.__marginleft+widthx/(log10(self.__upper)-log10(self.__lower))*(log10(tick)-
00383 log10(self.__lower)),widthy+self.bds-4)
00384 else:
00385 painter.drawLine(self.bds+self.__marginleft+widthx/(self.__upper-self.__lower)*(tick-self.__lower),widthy+self.bds-1,
00386 self.bds+self.__marginleft+widthx/(self.__upper-self.__lower)*(tick-self.__lower),widthy+self.bds-4)
00387 for tick in self.__ticksy[0]:
00388 if self.__logy:
00389 painter.drawLine(self.bds+self.__marginleft,self.bds+widthy-widthy/(log10(self.__scale)-log10(self.__scalelow))*
00390 (log10(tick)-log10(self.__scalelow)),
00391 self.bds+6+self.__marginleft,self.bds+widthy-widthy/(log10(self.__scale)-log10(self.__scalelow))*
00392 (log10(tick)-log10(self.__scalelow)))
00393 else:
00394 painter.drawLine(self.bds+self.__marginleft,self.bds+widthy-widthy/(self.__scale)*tick,
00395 self.bds+6+self.__marginleft,self.bds+widthy-widthy/(self.__scale)*tick)
00396 for tick in self.__ticksy[1]:
00397 if self.__logy:
00398 painter.drawLine(self.bds+self.__marginleft,self.bds+widthy-widthy/(log10(self.__scale)-log10(self.__scalelow))*
00399 (log10(tick)-log10(self.__scalelow)),
00400 self.bds+3+self.__marginleft,self.bds+widthy-widthy/(log10(self.__scale)-log10(self.__scalelow))*
00401 (log10(tick)-log10(self.__scalelow)))
00402 else:
00403 painter.drawLine(self.bds+self.__marginleft,self.bds+widthy-widthy/(self.__scale)*tick,
00404 self.bds+3+self.__marginleft,self.bds+widthy-widthy/(self.__scale)*tick)
00405 #box with labels
00406 nlab=0
00407 textdist=self.fontsize*2
00408 for i in range(self.__nhist):
00409 if self.uselabel[i] and self.showhisto[i]:nlab+=1
00410 if nlab>0:
00411 painter.setBrush(QColor("white"))
00412 painter.drawRect(self.bds+self.__marginleft+widthx*self.labelboxx,self.bds+widthy*self.labelboxy,
00413 widthx*self.boxwidth,textdist*nlab+2)
00414 i=0
00415 for j in range (self.__nhist):
00416 if self.uselabel[j]==0 or self.showhisto[j]==0:continue
00417 if self.style[j]:
00418 painter.setBrush(QColor(self.color[j]))
00419 pen.setColor(QColor(self.color[j]))
00420 painter.setPen(pen)
00421 painter.drawRect(self.bds+self.__marginleft+widthx*(self.labelboxx+.02),
00422 self.bds+widthy*self.labelboxy+textdist*i+2,widthx*.04,textdist-2)
00423 else:
00424 painter.setBrush(QColor("white"))
00425 pen.setColor(QColor(self.color[j]))
00426 painter.setPen(pen)
00427 painter.drawLine(self.bds+self.__marginleft+widthx*(self.labelboxx+.02),
00428 self.bds+widthy*self.labelboxy+textdist*i+textdist/2,
00429 self.bds+self.__marginleft+widthx*(self.labelboxx+.06),
00430 self.bds+widthy*self.labelboxy+textdist*i+textdist/2)
00431 i+=1
00432 pen.setColor(QColor("black"))
00433 painter.setPen(pen)
00434 except :
00435 print "Unexpected error:", sys.exc_info()[1]
00436
00437
00438 def resizeEvent(self,rev):
00439 try:
00440 self.drawLabels()
00441 except:
00442 print "Unexpected Label error:", sys.exc_info()[1]
00443
00444
00445 def drawLabels(self):
00446 width=float(self.size().width()-2*self.bds-self.__marginleft)
00447 height=float(self.size().height()-2*self.bds-self.__marginlow)
00448 self.xaxislabel.setGeometry(self.bds+self.__marginleft,height+2*self.bds-2+self.__marginlow-15,width,13)
00449 #histogram labels
00450 i=0
00451 textdist=self.fontsize*2
00452 for j in range (self.__nhist):
00453 if self.uselabel[j]==0 or self.showhisto[j]==0:
00454 self.histolabel[j].hide()
00455 continue
00456 self.histolabel[j].setGeometry(self.bds+self.__marginleft+width*(self.labelboxx+.1),
00457 self.bds+height*self.labelboxy+textdist*i+1,width*(self.boxwidth-0.12),textdist-2)
00458 self.histolabel[j].show()
00459 i+=1
00460
00461 #axis labels
00462 i=0
00463 for tick in self.__ticksx[0]:
00464 if self.__logx:
00465 self.__xlabels[i].setGeometry(QRect(self.bds+self.__marginleft+width/(log10(self.__upper)-
00466 log10(self.__lower))*(log10(tick)
00467 -log10(self.__lower))-15, height+self.bds+2,30,self.bds+self.__marginlow-18))
00468 else:
00469 if len(self.__ticksx[0])>1:
00470 labelwidth=(self.__ticksx[0][1]-self.__ticksx[0][0])/2./(self.__upper-self.__lower)*width-2
00471 else:
00472 labelwidth=self.size().width()/2.
00473 while (self.bds+self.__marginleft+width/(self.__upper-self.__lower)*(tick-self.__lower)-labelwidth<1 or
00474 self.bds+self.__marginleft+width/(self.__upper-self.__lower)*(tick-self.__lower)+labelwidth>self.size().width()-1):
00475 labelwidth-=1
00476 if labelwidth<=6:break
00477 self.__xlabels[i].setGeometry(QRect(self.bds+self.__marginleft+width/(self.__upper-self.__lower)
00478 *(tick-self.__lower)-labelwidth, height+self.bds+2,2*labelwidth,
00479 self.bds+self.__marginlow-18))
00480
00481
00482 self.__xlabels[i].show()
00483 i+=1
00484 i=0
00485 for tick in self.__ticksy[0]:
00486 if self.__logy:
00487 self.__ylabels[i].setGeometry(QRect(1,self.bds+height-height/(log10(self.__scale)-log10(self.__scalelow))
00488 *(log10(tick)-log10(self.__scalelow))-8,self.bds+self.__marginleft-4,16))
00489 else:
00490 self.__ylabels[i].setGeometry(QRect(1,self.bds+height-height/self.__scale*tick-8,
00491 self.bds+self.__marginleft-4,16))
00492 self.__ylabels[i].show()
00493 i+=1
00494
00495
00496 def remainder(nr):
00497 remainder = ceil(nr) - nr
00498 if remainder>.5:
00499 remainder=nr-floor(nr)
00500 return remainder