class SimulatedCrystalCounter(PseudoDevice): def __init__(self, name, diffractometerScannable, geometryPlugin, wavelengthScannable, equation=Gaussian(.01), engine='you'): self.setName(name) self.setInputNames([name + '_count']) self.setOutputFormat(['%7.5f']) self.exposureTime = 1 self.pause = True self.diffractometerScannable = diffractometerScannable self.geometry = geometryPlugin self.wavelengthScannable = wavelengthScannable self.equation = equation self.engine = engine self.cut = None self.UB = None self.chiMissmount = 0. self.phiMissmount = 0. self.setCrystal('cubic', 1, 1, 1, 90, 90, 90) def setCrystal(self, name, a, b, c, alpha, beta, gamma): self.cut = CrystalUnderTest(name, a, b, c, alpha, beta, gamma) self.calcUB() def setChiMissmount(self, chi): self.chiMissmount = chi self.calcUB() def setPhiMissmount(self, phi): self.phiMissmount = phi self.calcUB() def calcUB(self): CHI = calcCHI(self.chiMissmount * TORAD) PHI = calcPHI(self.phiMissmount * TORAD) self.UB = CHI * PHI * self.cut.B def asynchronousMoveTo(self, exposureTime): self.exposureTime = exposureTime if self.pause: time.sleep(exposureTime) # Should not technically block! def getPosition(self): h, k, l = self.getHkl() dh, dk, dl = h - round(h), k - round(k), l - round(l) count = self.equation(dh, dk, dl) #return self.exposureTime, count*self.exposureTime return count * self.exposureTime def getHkl(self): pos = self.geometry.physical_angles_to_internal_position( self.diffractometerScannable.getPosition()) pos.changeToRadians() wavelength = self.wavelengthScannable.getPosition() if self.engine.lower() == 'vlieg': return vliegAnglesToHkl(pos, wavelength, self.UB) elif self.engine.lower() == 'you': return youAnglesToHkl(pos, wavelength, self.UB) else: raise ValueError(self.engine) def isBusy(self): return False def __str__(self): return self.__repr__() def __repr__(self): s = 'simulated crystal detector: %s\n' % self.getName() h, k, l = self.getHkl() s += ' h : %f\n' % h s += ' k : %f\n' % k s += ' l : %f\n' % l s += self.cut.__str__() + '\n' s += "chi orientation: %s\n" % self.chiMissmount s += "phi orientation: %s\n" % self.phiMissmount ub = self.UB.tolist() s += "UB:\n" s += " % 18.13f% 18.13f% 18.12f\n" % (ub[0][0], ub[0][1], ub[0][2]) s += " % 18.13f% 18.13f% 18.12f\n" % (ub[1][0], ub[1][1], ub[1][2]) s += " % 18.13f% 18.13f% 18.12f\n" % (ub[2][0], ub[2][1], ub[2][2]) return s
def test__str__(self): cut = CrystalUnderTest("HCl", 1, 2, 3, 4, 5, 6) print cut.__str__()