コード例 #1
0
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
コード例 #2
0
ファイル: simulation.py プロジェクト: jamesmudd/diffcalc
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
コード例 #3
0
 def test__str__(self):
     cut = CrystalUnderTest("HCl", 1, 2, 3, 4, 5, 6)
     print cut.__str__()
コード例 #4
0
 def test__str__(self):
     cut = CrystalUnderTest("HCl", 1, 2, 3, 4, 5, 6)
     print cut.__str__()