def optimizeAngles(self, msg=True):
		t0 = time.time()
		### run find theta
		na1 = numpy.array(self.currentpicks1, dtype=numpy.int32)
		na2 = numpy.array(self.currentpicks2, dtype=numpy.int32)
		fittheta = radermacher.tiltang(na1, na2)
		if not fittheta or not 'wtheta' in fittheta:
			return
		theta = fittheta['wtheta']
		thetadev = fittheta['wthetadev']
		if msg is True:
			thetastr = ("%3.3f +/- %2.2f" % (theta, thetadev))
			tristr = apDisplay.orderOfMag(fittheta['numtri'])+" of "+apDisplay.orderOfMag(fittheta['tottri'])
			tristr = (" (%3.1f " % (100.0 * fittheta['numtri'] / float(fittheta['tottri'])))+"%) "
			apDisplay.printMsg("Tilt angle "+thetastr+tristr)
		self.data['theta'] = fittheta['wtheta']
		### run optimize angles
		lastiter = [80,80,80]
		count = 0
		totaliter = 0
		while max(lastiter) > 75 and count < 30:
			count += 1
			lsfit = self.runLeastSquares()
			lastiter[2] = lastiter[1]
			lastiter[1] = lastiter[0]
			lastiter[0] = lsfit['iter']
			totaliter += lsfit['iter']
			if msg is True:
				apDisplay.printMsg("Least Squares: "+str(count)+" rounds, "+str(totaliter)
				+" iters, rmsd of "+str(round(lsfit['rmsd'],4))+" pixels in "+apDisplay.timeString(time.time()-t0))
		return
 def onRunTiltAng(self, evt):
         arealim = self.arealimit.GetValue()
         self.parent.data['arealim'] = arealim
         targets1 = self.parent.panel1.getTargets('Picked')
         a1 = self.parent.targetsToArray(targets1)
         targets2 = self.parent.panel2.getTargets('Picked')
         a2 = self.parent.targetsToArray(targets2)
         na1 = numpy.array(a1, dtype=numpy.int32)
         na2 = numpy.array(a2, dtype=numpy.int32)
         self.fittheta = radermacher.tiltang(na1, na2, arealim)
         #pprint.pprint(self.fittheta)
         if self.fittheta and 'wtheta' in self.fittheta:
                 self.fittheta['point1'], self.fittheta['point2'] = \
                         apTiltTransform.getPointsFromArrays(a1, a2, self.parent.data['shiftx'], self.parent.data['shifty'])
                 self.theta = self.fittheta['wtheta']
                 self.thetadev = self.fittheta['wthetadev']
                 thetastr = ("%3.3f +/- %2.2f" % (self.theta, self.thetadev))
                 self.tiltvalue.SetLabel(label=thetastr)
                 tristr = apDisplay.orderOfMag(self.fittheta['numtri'])+" of "+apDisplay.orderOfMag(self.fittheta['tottri'])
                 self.trilabel1.SetLabel(label=tristr)
                 percent = str("%")
                 tristr = (" (%3.1f " % (100.0 * self.fittheta['numtri'] / float(self.fittheta['tottri'])))+"%) "
                 self.trilabel2.SetLabel(label=tristr)
        untilt = numpy.array((
                (585,444),(603,473),(573,525),(676,1032),(613,963),
                (897,905),(972,936),(1044,876),(370,1319),(505,1121),
                (533,1103),(109,353),(149,321),(199,283),(265,314),
                (76,335),(298,390),(391,437),(52,647),(85,639),
                (15,653),(295,477),(310,447),(139,1052),(176,1091),
                (231,1110),(210,670),(265,680),(316,679),
        ))
        tilt = numpy.array((
                (483,180),(492,208),(469,261),(524,761),(480,694),
                (750,647),(697,619),(801,583),(286,1064),(391,856),
                (415,840),(134,122),(166,87),(205,43),(253,72),
                (106,103),(272,146),(337,185),(78,414),(102,405),
                (52,425),(267,234),(277,202),(122,817),(150,850),
                (193,864),(196,428),(236,439),(273,430),
        ))

        #print "untilt=",untilt
        #print "tilt=  ",tilt
        u = mem.used()
        for i in range(1):
                #sys.stderr.write(".")
                e = radermacher.tiltang(untilt,tilt,1.0)
                print e
                f = radermacher.willsq(untilt,tilt,e['wtheta'],0.0,0.0)
                print f
        print "mem=",mem.used()-u,"\n"
        print "done"
        #sys.exit(1)