def readIdxrefLp(self, _pathToIdxrefLp, _xsDataResultXDSIndexing=None): self.DEBUG("EDPluginXDSIndexingv1_0.readIdxrefLp") if _xsDataResultXDSIndexing is None: xsDataResultXDSIndexing = XSDataResultXDSIndexing() else: xsDataResultXDSIndexing = _xsDataResultXDSIndexing if os.path.exists(_pathToIdxrefLp): xsDataResultXDSIndexing.pathToLogFile = XSDataFile(XSDataString(_pathToIdxrefLp)) with open(_pathToIdxrefLp) as f: listLines = f.readlines() indexLine = 0 doParseParameters = False doParseLattice = False while (indexLine < len(listLines)): if "DIFFRACTION PARAMETERS USED AT START OF INTEGRATION" in listLines[indexLine]: doParseParameters = True doParseLattice = False elif "DETERMINATION OF LATTICE CHARACTER AND BRAVAIS LATTICE" in listLines[indexLine]: doParseParameters = False doParseLattice = True if doParseParameters: if "MOSAICITY" in listLines[indexLine]: mosaicity = float(listLines[indexLine].split()[-1]) xsDataResultXDSIndexing.mosaicity = XSDataAngle(mosaicity) elif "DETECTOR COORDINATES (PIXELS) OF DIRECT BEAM" in listLines[indexLine]: xBeam = float(listLines[indexLine].split()[-2]) yBeam = float(listLines[indexLine].split()[-1]) xsDataResultXDSIndexing.beamCentreX = XSDataFloat(xBeam) xsDataResultXDSIndexing.beamCentreY = XSDataFloat(yBeam) elif "CRYSTAL TO DETECTOR DISTANCE" in listLines[indexLine]: distance = float(listLines[indexLine].split()[-1]) xsDataResultXDSIndexing.distance = XSDataLength(distance) elif doParseLattice: if listLines[indexLine].startswith(" * ") and not listLines[indexLine + 1].startswith(" * "): listLine = listLines[indexLine].split() xsDataResultXDSIndexing.latticeCharacter = XSDataInteger(int(listLine[1])) bravaisLattice = listLine[2] xsDataResultXDSIndexing.bravaisLattice = XSDataString(bravaisLattice) spaceGroup = EDUtilsSymmetry.getMinimumSymmetrySpaceGroupFromBravaisLattice(bravaisLattice) xsDataResultXDSIndexing.spaceGroup = XSDataString(spaceGroup) spaceGroupNumber = EDUtilsSymmetry.getITNumberFromSpaceGroupName(spaceGroup) xsDataResultXDSIndexing.spaceGroupNumber = XSDataInteger(spaceGroupNumber) xsDataResultXDSIndexing.qualityOfFit = XSDataFloat(float(listLine[3])) xsDataXDSCell = XSDataXDSCell() xsDataXDSCell.length_a = XSDataLength(float(listLine[4])) xsDataXDSCell.length_b = XSDataLength(float(listLine[5])) xsDataXDSCell.length_c = XSDataLength(float(listLine[6])) xsDataXDSCell.angle_alpha = XSDataAngle(float(listLine[7])) xsDataXDSCell.angle_beta = XSDataAngle(float(listLine[8])) xsDataXDSCell.angle_gamma = XSDataAngle(float(listLine[9])) xsDataResultXDSIndexing.unitCell = xsDataXDSCell indexLine += 1 return xsDataResultXDSIndexing
def testGetMinimumSymmetrySpaceGroupFromBravaisLattice(self): """ Testing retrieving the lowest symmetry space group from all Bravais Lattices """ listBravaisLattice = [ "aP", "mP", "mC", "mI", "oP", "oA", "oB", "oC", "oS", "oF", "oI", "tP", "tC", "tI", "tF", "hP", "hR", "cP", "cF", "cI" ] listSpaceGroup = [ "P1", "P2", "C2", "C2", "P222", "C222", "C222", "C222", "C222", "F222", "I222", "P4", "P4", "I4", "I4", "P3", "H3", "P23", "F23", "I23" ] for iIndex in range(len(listBravaisLattice)): EDAssert.equal(listSpaceGroup[ iIndex ], EDUtilsSymmetry.getMinimumSymmetrySpaceGroupFromBravaisLattice(listBravaisLattice[ iIndex]))
def generateXSDataIndexingResult(_xsDataResultXDSIndexing, _xsDataExperimentalCondition=None): xsDataIndexingResult = XSDataIndexingResult() xsDataIndexingSolutionSelected = XSDataIndexingSolutionSelected() xsDataCrystalSelected = XSDataCrystal() # xsDataIndexingSolutionSelected.setNumber(XSDataInteger(iIndex)) # xsDataCellSelected = xsDataLabelitSolution.getUnitCell() spaceGroupName = EDUtilsSymmetry.getMinimumSymmetrySpaceGroupFromBravaisLattice(_xsDataResultXDSIndexing.bravaisLattice.value) xsDataCrystalSelected = XSDataCrystal() xsDataSpaceGroupSelected = XSDataSpaceGroup() xsDataSpaceGroupSelected.setName(XSDataString(spaceGroupName)) xsDataCrystalSelected.setSpaceGroup(xsDataSpaceGroupSelected) # xsDataCrystalSelected.setCell(xsDataCellSelected) xsDataCrystalSelected.setMosaicity(XSDataDouble(_xsDataResultXDSIndexing.mosaicity.value)) xsDataCrystalSelected.setCell(XSDataCell.parseString(_xsDataResultXDSIndexing.unitCell.marshal())) xsDataIndexingSolutionSelected.setCrystal(xsDataCrystalSelected) xsDataOrientation = XSDataOrientation() xsDataOrientation.setMatrixA(_xsDataResultXDSIndexing.getAMatrix()) xsDataOrientation.setMatrixU(_xsDataResultXDSIndexing.getUMatrix()) xsDataIndexingSolutionSelected.setOrientation(xsDataOrientation) xsDataStatisticsIndexing = XSDataStatisticsIndexing() if (_xsDataExperimentalCondition is not None): fBeamPositionXOrig = _xsDataExperimentalCondition.getDetector().getBeamPositionX().getValue() fBeamPositionYOrig = _xsDataExperimentalCondition.getDetector().getBeamPositionY().getValue() fBeamPositionXNew = _xsDataResultXDSIndexing.getBeamCentreX().getValue() fBeamPositionYNew = _xsDataResultXDSIndexing.getBeamCentreY().getValue() xsDataStatisticsIndexing.setBeamPositionShiftX(XSDataLength(fBeamPositionXOrig - fBeamPositionXNew)) xsDataStatisticsIndexing.setBeamPositionShiftY(XSDataLength(fBeamPositionYOrig - fBeamPositionYNew)) xsDataExperimentalConditionRefined = None if (_xsDataExperimentalCondition is None): xsDataExperimentalConditionRefined = XSDataExperimentalCondition() else: # Copy the incoming experimental condition xmlExperimentalCondition = _xsDataExperimentalCondition.marshal() xsDataExperimentalConditionRefined = XSDataExperimentalCondition.parseString(xmlExperimentalCondition) xsDataDetector = xsDataExperimentalConditionRefined.getDetector() if (xsDataDetector is None): xsDataDetector = XSDataDetector() xsDataDetector.setBeamPositionX(XSDataLength(_xsDataResultXDSIndexing.getBeamCentreX().value)) xsDataDetector.setBeamPositionY(XSDataLength(_xsDataResultXDSIndexing.getBeamCentreY().value)) xsDataDetector.setDistance(_xsDataResultXDSIndexing.getDistance()) xsDataExperimentalConditionRefined.setDetector(xsDataDetector) xsDataIndexingSolutionSelected.setExperimentalConditionRefined(xsDataExperimentalConditionRefined) xsDataIndexingResult.setSelectedSolution(xsDataIndexingSolutionSelected) return xsDataIndexingResult
def preProcess(self, _edObject=None): EDPluginControl.preProcess(self) self.DEBUG("EDPluginControlXDSAPPv1_0.preProcess") self.screen("XDSAPP processing started") if self.dataInput.reprocess is not None: self.reprocess = self.dataInput.reprocess.value self.processingCommandLine = ' '.join(sys.argv) self.processingPrograms = "XDSAPP" if self.reprocess: self.processingPrograms += " reprocess" if self.dataInput.useXdsAsciiToXml is not None: if self.dataInput.useXdsAsciiToXml.value: self.useXdsAsciiToXml = True if self.useXdsAsciiToXml: self.doAnomAndNonanom = False elif self.dataInput.doAnomAndNonanom is not None: self.doAnomAndNonanom = self.dataInput.doAnomAndNonanom.value if self.doAnomAndNonanom: self.doAnom = True self.doNoanom = True else: if self.dataInput.doAnom is not None: self.doAnom = self.dataInput.doAnom.value self.doNoanom = not self.doAnom self.strHost = socket.gethostname() self.screen("Running on {0}".format(self.strHost)) try: strLoad = os.getloadavg() self.screen("System load avg: {0}".format(strLoad)) except OSError: pass self.edPluginWaitFileFirst = self.loadPlugin("EDPluginMXWaitFilev1_1", "MXWaitFileFirst") self.edPluginWaitFileLast = self.loadPlugin("EDPluginMXWaitFilev1_1", "MXWaitFileLast") self.edPluginRetrieveDataCollection = self.loadPlugin("EDPluginISPyBRetrieveDataCollectionv1_4") if self.doAnom: self.edPluginExecXDSAPPAnom = self.loadPlugin("EDPluginExecXDSAPPv1_0", "EDPluginExecXDSAPPv1_0_anom") if self.doNoanom: self.edPluginExecXDSAPPNoanom = self.loadPlugin("EDPluginExecXDSAPPv1_0", "EDPluginExecXDSAPPv1_0_noanom") # Check for space group and cell if self.dataInput.spaceGroup is not None and self.dataInput.unitCell is not None: spaceGroup = self.dataInput.spaceGroup.value spaceGroupNumber = EDUtilsSymmetry.getITNumberFromSpaceGroupName(spaceGroup) self.screen("Forcing space group {0} number {1}".format(spaceGroup, spaceGroupNumber)) unitCell = self.dataInput.unitCell.value self.screen("Forcing unit cell {0}".format(unitCell)) self.xdsAppSpacegroup = "{0} {1}".format(spaceGroupNumber, unitCell)
def testGetMinimumSymmetrySpaceGroupFromBravaisLattice(self): """ Testing retrieving the lowest symmetry space group from all Bravais Lattices """ listBravaisLattice = [ "aP", "mP", "mC", "mI", "oP", "oA", "oB", "oC", "oS", "oF", "oI", "tP", "tC", "tI", "tF", "hP", "hR", "cP", "cF", "cI" ] listSpaceGroup = [ "P1", "P2", "C2", "C2", "P222", "C222", "C222", "C222", "C222", "F222", "I222", "P4", "P4", "I4", "I4", "P3", "H3", "P23", "F23", "I23" ] for iIndex in range(len(listBravaisLattice)): EDAssert.equal( listSpaceGroup[iIndex], EDUtilsSymmetry.getMinimumSymmetrySpaceGroupFromBravaisLattice( listBravaisLattice[iIndex]))
def preProcess(self, _edObject=None): EDPluginControl.preProcess(self) self.DEBUG("EDPluginControlXDSAPPv1_0.preProcess") self.screen("XDSAPP processing started") self.processingCommandLine = ' '.join(sys.argv) self.processingPrograms = "XDSAPP" if self.useXdsAsciiToXml: self.doAnomAndNonanom = False elif self.dataInput.doAnomAndNonanom is not None: if self.dataInput.doAnomAndNonanom.value: self.doAnomAndNonanom = True else: self.doAnomAndNonanom = False self.strHost = socket.gethostname() self.screen("Running on {0}".format(self.strHost)) try: strLoad = os.getloadavg() self.screen("System load avg: {0}".format(strLoad)) except OSError: pass self.edPluginWaitFileFirst = self.loadPlugin("EDPluginMXWaitFilev1_1", "MXWaitFileFirst") self.edPluginWaitFileLast = self.loadPlugin("EDPluginMXWaitFilev1_1", "MXWaitFileLast") self.edPluginRetrieveDataCollection = self.loadPlugin("EDPluginISPyBRetrieveDataCollectionv1_4") self.edPluginExecXDSAPPAnom = self.loadPlugin("EDPluginExecXDSAPPv1_0", "EDPluginExecXDSAPPv1_0_anom") if self.doAnomAndNonanom: self.edPluginExecXDSAPPNoanom = self.loadPlugin("EDPluginExecXDSAPPv1_0", "EDPluginExecXDSAPPv1_0_noanom") # Check for space group and cell if self.dataInput.spaceGroup is not None and self.dataInput.unitCell is not None: spaceGroup = self.dataInput.spaceGroup.value spaceGroupNumber = EDUtilsSymmetry.getITNumberFromSpaceGroupName(spaceGroup) self.screen("Forcing space group {0} number {1}".format(spaceGroup, spaceGroupNumber)) unitCell = self.dataInput.unitCell.value self.screen("Forcing unit cell {0}".format(unitCell)) self.xdsAppSpacegroup = "{0} {1}".format(spaceGroupNumber, unitCell)
def generateXSDataIndexingResult(_xsDataLabelitScreenOutput, _xsDataLabelitMosflmScriptsOutput, \ _xsDataExperimentalCondition=None): EDVerbose.DEBUG( "EDHandlerXSDataLabelitv1_1.generateXSDataIndexingOutput") iSelectedSolutionNumber = _xsDataLabelitScreenOutput.getSelectedSolutionNumber( ).getValue() xsDataIndexingResult = XSDataIndexingResult() xsDataIndexingSolutionSelected = None for xsDataLabelitSolution in _xsDataLabelitScreenOutput.getLabelitScreenSolution( ): xsDataCrystal = XSDataCrystal() xsDataSpaceGroup = XSDataSpaceGroup() edStringSpaceGroupName = EDUtilsSymmetry.getMinimumSymmetrySpaceGroupFromBravaisLattice( xsDataLabelitSolution.getBravaisLattice().getValue()) xsDataSpaceGroup.setName(XSDataString(edStringSpaceGroupName)) xsDataCrystal.setSpaceGroup(xsDataSpaceGroup) xsDataCrystal.setCell(xsDataLabelitSolution.getUnitCell()) xsDataIndexingSolution = XSDataIndexingSolution() xsDataIndexingSolution.setCrystal(xsDataCrystal) iIndex = xsDataLabelitSolution.getSolutionNumber().getValue() xsDataIndexingSolution.setNumber(XSDataInteger(iIndex)) xsDataIndexingResult.addSolution(xsDataIndexingSolution) if (iIndex == iSelectedSolutionNumber): xsDataIndexingSolutionSelected = XSDataIndexingSolutionSelected( ) xsDataIndexingSolutionSelected.setNumber(XSDataInteger(iIndex)) edStringSelectedSpaceGroupName = edStringSpaceGroupName xsDataCellSelected = xsDataLabelitSolution.getUnitCell() fRmsdSelected = xsDataLabelitSolution.getRmsd().getValue() iNumberOfSpotsSelected = xsDataLabelitSolution.getNumberOfSpots( ).getValue() xsDataCrystalSelected = XSDataCrystal() xsDataSpaceGroupSelected = XSDataSpaceGroup() xsDataSpaceGroupSelected.setName( XSDataString(edStringSelectedSpaceGroupName)) #xsDataSpaceGroupSelected.setITNumber( XSDataInteger( iSelectedSpaceGroupNumber ) ) xsDataCrystalSelected.setSpaceGroup(xsDataSpaceGroupSelected) xsDataCrystalSelected.setCell(xsDataCellSelected) xsDataCrystalSelected.setMosaicity( XSDataDouble(_xsDataLabelitScreenOutput.getMosaicity().getValue())) xsDataIndexingSolutionSelected.setCrystal(xsDataCrystalSelected) xsDataOrientation = XSDataOrientation() xsDataOrientation.setMatrixA( _xsDataLabelitMosflmScriptsOutput.getAMatrix()) xsDataOrientation.setMatrixU( _xsDataLabelitMosflmScriptsOutput.getUMatrix()) xsDataIndexingSolutionSelected.setOrientation(xsDataOrientation) xsDataStatisticsIndexing = XSDataStatisticsIndexing() if (_xsDataExperimentalCondition is not None): fBeamPositionXOrig = _xsDataExperimentalCondition.getDetector( ).getBeamPositionX().getValue() fBeamPositionYOrig = _xsDataExperimentalCondition.getDetector( ).getBeamPositionY().getValue() fBeamPositionXNew = _xsDataLabelitScreenOutput.getBeamCentreX( ).getValue() fBeamPositionYNew = _xsDataLabelitScreenOutput.getBeamCentreY( ).getValue() xsDataStatisticsIndexing.setBeamPositionShiftX( XSDataLength(fBeamPositionXOrig - fBeamPositionXNew)) xsDataStatisticsIndexing.setBeamPositionShiftY( XSDataLength(fBeamPositionYOrig - fBeamPositionYNew)) #xsDataStatisticsIndexing.setSpotDeviXSDataLength( dDistanceRefinedationAngular( XSDataAngle( dDeviationAngular ) ) xsDataStatisticsIndexing.setSpotDeviationPositional( XSDataLength(fRmsdSelected)) xsDataStatisticsIndexing.setSpotsUsed( XSDataInteger(iNumberOfSpotsSelected)) xsDataStatisticsIndexing.setSpotsTotal( XSDataInteger(iNumberOfSpotsSelected)) xsDataIndexingSolutionSelected.setStatistics(xsDataStatisticsIndexing) xsDataExperimentalConditionRefined = None if (_xsDataExperimentalCondition is None): xsDataExperimentalConditionRefined = XSDataExperimentalCondition() else: # Copy the incoming experimental condition xmlExperimentalCondition = _xsDataExperimentalCondition.marshal() xsDataExperimentalConditionRefined = XSDataExperimentalCondition.parseString( xmlExperimentalCondition) xsDataDetector = xsDataExperimentalConditionRefined.getDetector() if (xsDataDetector is None): xsDataDetector = XSDataDetector() xsDataDetector.setBeamPositionX( _xsDataLabelitScreenOutput.getBeamCentreX()) xsDataDetector.setBeamPositionY( _xsDataLabelitScreenOutput.getBeamCentreY()) xsDataDetector.setDistance(_xsDataLabelitScreenOutput.getDistance()) xsDataExperimentalConditionRefined.setDetector(xsDataDetector) xsDataIndexingSolutionSelected.setExperimentalConditionRefined( xsDataExperimentalConditionRefined) xsDataIndexingResult.setSelectedSolution( xsDataIndexingSolutionSelected) xsDataIndexingResult.setIndexingLogFile( _xsDataLabelitScreenOutput.getPathToLogFile()) return xsDataIndexingResult
def generateXSDataIndexingResult(_xsDataResultLabelitIndexing, _xsDataExperimentalCondition=None): EDVerbose.DEBUG("EDHandlerXSDataLabelitv1_1.generateXSDataIndexingOutput") xsDataLabelitScreenOutput = _xsDataResultLabelitIndexing.screenOutput xsDataLabelitMosflmScriptsOutput = _xsDataResultLabelitIndexing.mosflmScriptsOutput iSelectedSolutionNumber = xsDataLabelitScreenOutput.getSelectedSolutionNumber().getValue() xsDataIndexingResult = XSDataIndexingResult() xsDataIndexingSolutionSelected = None for xsDataLabelitSolution in xsDataLabelitScreenOutput.getLabelitScreenSolution(): xsDataCrystal = XSDataCrystal() xsDataSpaceGroup = XSDataSpaceGroup() edStringSpaceGroupName = EDUtilsSymmetry.getMinimumSymmetrySpaceGroupFromBravaisLattice(xsDataLabelitSolution.getBravaisLattice().getValue()) xsDataSpaceGroup.setName(XSDataString(edStringSpaceGroupName)) xsDataCrystal.setSpaceGroup(xsDataSpaceGroup) xsDataCrystal.setCell(xsDataLabelitSolution.getUnitCell()) xsDataIndexingSolution = XSDataIndexingSolution() xsDataIndexingSolution.setCrystal(xsDataCrystal) iIndex = xsDataLabelitSolution.getSolutionNumber().getValue() xsDataIndexingSolution.setNumber(XSDataInteger(iIndex)) xsDataIndexingResult.addSolution(xsDataIndexingSolution) if (iIndex == iSelectedSolutionNumber): xsDataIndexingSolutionSelected = XSDataIndexingSolutionSelected() xsDataIndexingSolutionSelected.setNumber(XSDataInteger(iIndex)) edStringSelectedSpaceGroupName = edStringSpaceGroupName xsDataCellSelected = xsDataLabelitSolution.getUnitCell() fRmsdSelected = xsDataLabelitSolution.getRmsd().getValue() iNumberOfSpotsSelected = xsDataLabelitSolution.getNumberOfSpots().getValue() xsDataCrystalSelected = XSDataCrystal() xsDataSpaceGroupSelected = XSDataSpaceGroup() xsDataSpaceGroupSelected.setName(XSDataString(edStringSelectedSpaceGroupName)) xsDataSpaceGroupSelected.setITNumber(XSDataInteger(EDUtilsSymmetry.getITNumberFromSpaceGroupName(edStringSelectedSpaceGroupName))) xsDataCrystalSelected.setSpaceGroup(xsDataSpaceGroupSelected) xsDataCrystalSelected.setCell(xsDataCellSelected) xsDataCrystalSelected.setMosaicity(XSDataDouble(xsDataLabelitScreenOutput.getMosaicity().getValue())) xsDataIndexingSolutionSelected.setCrystal(xsDataCrystalSelected) xsDataOrientation = XSDataOrientation() xsDataOrientation.setMatrixA(xsDataLabelitMosflmScriptsOutput.getAMatrix()) xsDataOrientation.setMatrixU(xsDataLabelitMosflmScriptsOutput.getUMatrix()) xsDataIndexingSolutionSelected.setOrientation(xsDataOrientation) xsDataStatisticsIndexing = XSDataStatisticsIndexing() if (_xsDataExperimentalCondition is not None): fBeamPositionXOrig = _xsDataExperimentalCondition.getDetector().getBeamPositionX().getValue() fBeamPositionYOrig = _xsDataExperimentalCondition.getDetector().getBeamPositionY().getValue() fBeamPositionXNew = xsDataLabelitScreenOutput.getBeamCentreX().getValue() fBeamPositionYNew = xsDataLabelitScreenOutput.getBeamCentreY().getValue() xsDataStatisticsIndexing.setBeamPositionShiftX(XSDataLength(fBeamPositionXOrig - fBeamPositionXNew)) xsDataStatisticsIndexing.setBeamPositionShiftY(XSDataLength(fBeamPositionYOrig - fBeamPositionYNew)) # xsDataStatisticsIndexing.setSpotDeviXSDataLength( dDistanceRefinedationAngular( XSDataAngle( dDeviationAngular ) ) xsDataStatisticsIndexing.setSpotDeviationPositional(XSDataLength(fRmsdSelected)) xsDataStatisticsIndexing.setSpotsUsed(XSDataInteger(iNumberOfSpotsSelected)) xsDataStatisticsIndexing.setSpotsTotal(XSDataInteger(iNumberOfSpotsSelected)) xsDataIndexingSolutionSelected.setStatistics(xsDataStatisticsIndexing) xsDataExperimentalConditionRefined = None if (_xsDataExperimentalCondition is None): xsDataExperimentalConditionRefined = XSDataExperimentalCondition() else: # Copy the incoming experimental condition xmlExperimentalCondition = _xsDataExperimentalCondition.marshal() xsDataExperimentalConditionRefined = XSDataExperimentalCondition.parseString(xmlExperimentalCondition) xsDataDetector = xsDataExperimentalConditionRefined.getDetector() if (xsDataDetector is None): xsDataDetector = XSDataDetector() xsDataDetector.setBeamPositionX(xsDataLabelitScreenOutput.getBeamCentreX()) xsDataDetector.setBeamPositionY(xsDataLabelitScreenOutput.getBeamCentreY()) xsDataDetector.setDistance(xsDataLabelitScreenOutput.getDistance()) xsDataExperimentalConditionRefined.setDetector(xsDataDetector) xsDataIndexingSolutionSelected.setExperimentalConditionRefined(xsDataExperimentalConditionRefined) xsDataIndexingResult.setSelectedSolution(xsDataIndexingSolutionSelected) xsDataIndexingResult.setIndexingLogFile(xsDataLabelitScreenOutput.getPathToLogFile()) return xsDataIndexingResult
def testGetITNumberFromSpaceGroupName(self): strSymopFileName = "/opt/pxsoft/ccp4/v6.3.0/linux-x86_64/lib/data/symop.lib" if os.path.exists(strSymopFileName): EDAssert.equal( 1, EDUtilsSymmetry.getITNumberFromSpaceGroupName( "P1", strSymopFileName), "ITNumber from space group P1") EDAssert.equal( 3, EDUtilsSymmetry.getITNumberFromSpaceGroupName( "P2", strSymopFileName), "ITNumber from space group P2") EDAssert.equal( 5, EDUtilsSymmetry.getITNumberFromSpaceGroupName( "C2", strSymopFileName), "ITNumber from space group C2") EDAssert.equal( 16, EDUtilsSymmetry.getITNumberFromSpaceGroupName( "P222", strSymopFileName), "ITNumber from space group P222") EDAssert.equal( 21, EDUtilsSymmetry.getITNumberFromSpaceGroupName( "C222", strSymopFileName), "ITNumber from space group C222") EDAssert.equal( 22, EDUtilsSymmetry.getITNumberFromSpaceGroupName( "F222", strSymopFileName), "ITNumber from space group F222") EDAssert.equal( 75, EDUtilsSymmetry.getITNumberFromSpaceGroupName( "P4", strSymopFileName), "ITNumber from space group P4") EDAssert.equal( 79, EDUtilsSymmetry.getITNumberFromSpaceGroupName( "I4", strSymopFileName), "ITNumber from space group I4") EDAssert.equal( 143, EDUtilsSymmetry.getITNumberFromSpaceGroupName( "P3", strSymopFileName), "ITNumber from space group P3") EDAssert.equal( 146, EDUtilsSymmetry.getITNumberFromSpaceGroupName( "H3", strSymopFileName), "ITNumber from space group H3") EDAssert.equal( 195, EDUtilsSymmetry.getITNumberFromSpaceGroupName( "P23", strSymopFileName), "ITNumber from space group P23") EDAssert.equal( 196, EDUtilsSymmetry.getITNumberFromSpaceGroupName( "F23", strSymopFileName), "ITNumber from space group F23")
class EDPluginControlStrategyv1_1(EDPluginControl): """ The Plugin that controls the strategy step """ def __init__(self): EDPluginControl.__init__(self) self.setXSDataInputClass(XSDataInputStrategy) self.__strPluginRaddoseName = "EDPluginRaddosev10" self.__edPluginRaddose = None self.__edHandlerXSDataRaddose = None self.__strPluginBestName = "EDPluginBestv1_1" self.__edPluginBest = None self.__edHandlerXSDataBest = None self.__strCONF_SYMOP_HOME = "symopHome" # Default value for the location of the symop table self.__strSymopHome = "/opt/pxsoft/ccp4-6.0.2/lib/data" self.__xsDataSampleCopy = None # For default chemical composition self.__fAverageAminoAcidVolume = 135.49 self.__fAverageCrystalSolventContent = 0.47 self.__fAverageSulfurContentPerAminoacid = 0.05 self.__fAverageSulfurConcentration = 314 def setSymopHome(self, _strSymopHome): self.__strSymopHome = _strSymopHome def getSymopHome(self): return self.__strSymopHome def preProcess(self, _edObject=None): """ Gets the Configuration Parameters, if found, overrides default parameters """ EDPluginControl.preProcess(self, _edObject) EDVerbose.DEBUG("EDPluginControlStrategyv1_1.preProcess...") self.__edPluginRaddose = None xsDataSampleCrystalMM = self.getDataInput().getSample() if (xsDataSampleCrystalMM is None): self.__xsDataSampleCopy = XSDataSampleCrystalMM() else: strXmlStringDataSample = xsDataSampleCrystalMM.marshal() self.__xsDataSampleCopy = XSDataSampleCrystalMM.parseString( strXmlStringDataSample) xsDataCrystal = self.getDataInput().getCrystalRefined() if (xsDataCrystal is not None): self.__xsDataSampleCopy.setCrystal(xsDataCrystal) # Raddose is enabled only if the beam flux is set if (self.getDataInput().getExperimentalCondition().getBeam().getFlux() is None): pyStrWarningMessage = EDMessage.WARNING_CANNOT_USE_PLUGIN_03 % ( 'EDPluginControlStrategyv1_1.preProcess', self.__strPluginRaddoseName, "Beam Flux not set") EDVerbose.warning(pyStrWarningMessage) self.addWarningMessage(pyStrWarningMessage) else: self.__edPluginRaddose = self.loadPlugin( self.__strPluginRaddoseName) if (self.__edPluginRaddose is not None): EDVerbose.DEBUG("EDPluginControlStrategyv1_1.preProcess: " + self.__strPluginRaddoseName + " Found... setting Data Input") strFileSymop = os.path.join(self.getSymopHome(), "symop.lib") xsDataStringSpaceGroup = self.getDataInput( ).getDiffractionPlan().getForcedSpaceGroup() # Space Group has been forced # Prepare chemical composition calculation with the forced Space Group (Space Group Name) strNumOperators = None strSpaceGroup = None if (xsDataStringSpaceGroup is not None): strSpaceGroup = xsDataStringSpaceGroup.getValue().upper() EDVerbose.DEBUG( "EDPluginControlStrategyv1_1.preProcess: Forced Space Group Found: " + strSpaceGroup) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName( strSpaceGroup, strFileSymop) except Exception, detail: pyStrErrorMessage = EDMessage.ERROR_EXECUTION_03 % ( 'EDPluginControlStrategyv1_1.preProcess', "Problem to calculate Number of symmetry operators", detail) EDVerbose.error(pyStrErrorMessage) self.addErrorMessage(pyStrErrorMessage) self.setFailure() # Space Group has NOT been forced else: xsDataStringSpaceGroup = self.__xsDataSampleCopy.getCrystal( ).getSpaceGroup().getName() if (xsDataStringSpaceGroup is not None): # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group Name) strSpaceGroupName = self.__xsDataSampleCopy.getCrystal( ).getSpaceGroup().getName().getValue() EDVerbose.DEBUG( "EDPluginControlStrategyv1_1.preProcess: Space Group IT Name found by indexing: " + strSpaceGroupName) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName( strSpaceGroupName, strFileSymop) except Exception, detail: pyStrErrorMessage = EDMessage.ERROR_EXECUTION_03 % ( 'EDPluginControlStrategyv1_1.preProcess', "Problem to calculate Number of symmetry operators", detail) EDVerbose.error(pyStrErrorMessage) self.addErrorMessage(pyStrErrorMessage) self.setFailure() else: # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group IT number) iSpaceGroupITNumber = self.__xsDataSampleCopy.getCrystal( ).getSpaceGroup().getITNumber().getValue() EDVerbose.DEBUG( "EDPluginControlStrategyv1_1.preProcess: Space Group IT Number Found by indexing: " + str(iSpaceGroupITNumber)) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupITNumber( str(iSpaceGroupITNumber), strFileSymop) except Exception, detail: pyStrErrorMessage = EDMessage.ERROR_EXECUTION_03 % ( 'EDPluginControlStrategyv1_1.preProcess', "Problem to calculate Number of symmetry operators", detail) EDVerbose.error(pyStrErrorMessage) self.addErrorMessage(pyStrErrorMessage) self.setFailure()
def preProcess(self, _edObject=None): """ Gets the Configuration Parameters, if found, overrides default parameters """ EDPluginControl.preProcess(self, _edObject) self.DEBUG("EDPluginControlStrategyv1_2.preProcess...") self._edPluginRaddose = None xsDataSampleCrystalMM = self.getDataInput().getSample() if (xsDataSampleCrystalMM is None): self._xsDataSampleCopy = XSDataSampleCrystalMM() else: strXmlStringDataSample = xsDataSampleCrystalMM.marshal() self._xsDataSampleCopy = XSDataSampleCrystalMM.parseString( strXmlStringDataSample) xsDataCrystal = self.getDataInput().getCrystalRefined() if (xsDataCrystal is not None): self._xsDataSampleCopy.setCrystal(xsDataCrystal) # Load the Best plugin self._edPluginBest = self.loadPlugin(self._strPluginBestName) self._edPluginBest.setBaseDirectory(self.getWorkingDirectory()) self._edPluginBest.setBaseName(self._strPluginBestName) # Load the plot gle plugin self._edPluginPlotGle = self.loadPlugin(self._strPluginPlotGleName) # Check if radiation damage estimation is required or not in the diffraction plan xsDataDiffractionPlan = self.getDataInput().getDiffractionPlan() if xsDataDiffractionPlan is not None: if xsDataDiffractionPlan.getEstimateRadiationDamage(): if xsDataDiffractionPlan.getEstimateRadiationDamage().getValue( ): # Yes, is requested self._bEstimateRadiationDamage = True else: # No, is explicitly not requested self._bEstimateRadiationDamage = False elif xsDataDiffractionPlan.getStrategyOption() is not None: if xsDataDiffractionPlan.getStrategyOption().getValue().find( "-DamPar") != -1: # The "-DamPar" option requires estimation of radiation damage self._bEstimateRadiationDamage = True # Check if we know what to do with radiation damage if self._bEstimateRadiationDamage is None: # "Force" the estimation of radiation damage if the flux is present if self.getDataInput().getExperimentalCondition().getBeam( ).getFlux() is None: strWarningMessage = "EDPluginControlStrategyv1_2: Missing flux input - cannot estimate radiation damage." self.WARNING(strWarningMessage) self.addWarningMessage(strWarningMessage) self._bEstimateRadiationDamage = False else: self._bEstimateRadiationDamage = True if self._bEstimateRadiationDamage: if self.getDataInput().getExperimentalCondition().getBeam( ).getFlux() is None: strErrorMessage = "EDPluginControlStrategyv1_2: Missing flux input. Cannot estimate radiation damage" self.ERROR(strErrorMessage) self.addErrorMessage(strErrorMessage) self.setFailure() if not self.isFailure(): self._edPluginRaddose = self.loadPlugin(self._strPluginRaddoseName) if (self._edPluginRaddose is not None): self.DEBUG("EDPluginControlStrategyv1_2.preProcess: " + self._strPluginRaddoseName + " Found... setting Data Input") xsDataStringSpaceGroup = self.getDataInput( ).getDiffractionPlan().getForcedSpaceGroup() # Space Group has been forced # Prepare chemical composition calculation with the forced Space Group (Space Group Name) bSpaceGroupForced = False if (xsDataStringSpaceGroup is not None): strSpaceGroup = xsDataStringSpaceGroup.getValue().upper( ).replace(" ", "") if strSpaceGroup != "": self.DEBUG( "EDPluginControlStrategyv1_2.preProcess: Forced Space Group Found: " + strSpaceGroup) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName( strSpaceGroup) bSpaceGroupForced = True except Exception as detail: strErrorMessage = "EDPluginControlStrategyv1_2: Problem to calculate Number of symmetry operators: {0}".format( detail) self.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError(strErrorMessage) if not bSpaceGroupForced: # Space Group has NOT been forced xsDataStringSpaceGroup = self._xsDataSampleCopy.getCrystal( ).getSpaceGroup().getName() if (xsDataStringSpaceGroup is not None): # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group Name) strSpaceGroupName = self._xsDataSampleCopy.getCrystal( ).getSpaceGroup().getName().getValue() self.DEBUG( "EDPluginControlStrategyv1_2.preProcess: Space Group IT Name found by indexing: " + strSpaceGroupName) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName( strSpaceGroupName) except Exception as detail: strErrorMessage = "EDPluginControlStrategyv1_2: Problem to calculate Number of symmetry operators: {0}".format( detail) self.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError(strErrorMessage) else: # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group IT number) iSpaceGroupITNumber = self._xsDataSampleCopy.getCrystal( ).getSpaceGroup().getITNumber().getValue() self.DEBUG( "EDPluginControlStrategyv1_2.preProcess: Space Group IT Number Found by indexing: %d" % iSpaceGroupITNumber) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupITNumber( str(iSpaceGroupITNumber)) except Exception as detail: strErrorMessage = "EDPluginControlStrategyv1_2: Problem to calculate Number of symmetry operators: {0}".format( detail) self.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError(strErrorMessage) if (strNumOperators is not None): iNumOperators = int(strNumOperators) else: strErrorMessage = "EDPluginControlStrategyv1_2: No symmetry operators found for Space Group: {0}".format( strNumOperators) self.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError(strErrorMessage) xsDataChemicalComposition = self._xsDataSampleCopy.getChemicalComposition( ) if (xsDataChemicalComposition is None): # create a default chemical composition and assign it to the sample xsDataDefaultChemicalComposition = self.getDefaultChemicalComposition( self._xsDataSampleCopy, iNumOperators) self._xsDataSampleCopy.setChemicalComposition( xsDataDefaultChemicalComposition) else: # Check for Sulfur atoms, if none, add native sulfur atoms xsDataUpdatedChemicalComposition = self.updateChemicalComposition( xsDataChemicalComposition) self._xsDataSampleCopy.setChemicalComposition( xsDataUpdatedChemicalComposition) # create Data Input for Raddose from EDHandlerXSDataRaddosev10 import EDHandlerXSDataRaddosev10 self._edHandlerXSDataRaddose = EDHandlerXSDataRaddosev10() xsDataBeam = self.getDataInput().getExperimentalCondition( ).getBeam() # Calculate number of images (MXSUP-1616): iNumberOfImages = None xsDataCollection = self.dataInput.dataCollection if xsDataCollection is not None: iNumberOfImages = 0 for xsDataSubWedge in xsDataCollection.subWedge: xsDataGoniostat = xsDataSubWedge.experimentalCondition.goniostat iOscStart = xsDataGoniostat.rotationAxisStart.value iOscEnd = xsDataGoniostat.rotationAxisEnd.value iOscWidth = xsDataGoniostat.oscillationWidth.value iNumberOfImages += int( round((iOscEnd - iOscStart) / iOscWidth, 0)) if iNumberOfImages is None: iNumberOfImages = 1 self.WARNING( "No goniostat information, number of images for RADDOSE set to 1" ) xsDataRaddoseInput = self._edHandlerXSDataRaddose.getXSDataRaddoseInput( xsDataBeam, self._xsDataSampleCopy, iNumOperators, iNumberOfImages) if xsDataRaddoseInput is not None: self._edPluginRaddose.setDataInput(xsDataRaddoseInput) self._edPluginRaddose.setBaseDirectory( self.getWorkingDirectory()) self._edPluginRaddose.setBaseName( self._strPluginRaddoseName)
def preProcess(self, _edObject=None): """ Gets the Configuration Parameters, if found, overrides default parameters """ EDPluginControl.preProcess(self, _edObject) self.DEBUG("EDPluginControlKappaStrategyv2_0.preProcess...") self.edPluginRaddose = None xsDataSampleCrystalMM = self.getDataInput( "mxv1InputStrategy")[0].getSample() if (xsDataSampleCrystalMM is None): self.xsDataSampleCopy = XSDataSampleCrystalMM() else: strXmlStringDataSample = xsDataSampleCrystalMM.marshal() self.xsDataSampleCopy = XSDataSampleCrystalMM.parseString( strXmlStringDataSample) xsDataCrystal = self.getDataInput( "mxv1InputStrategy")[0].getCrystalRefined() if (xsDataCrystal is not None): self.xsDataSampleCopy.setCrystal(xsDataCrystal) # Raddose is enabled only if the beam flux is set if (self.getDataInput("mxv1InputStrategy") [0].getExperimentalCondition().getBeam().getFlux() is None): strWarningMessage = EDMessage.WARNING_CANNOT_USE_PLUGIN_03 % ( 'EDPluginControlKappaStrategyv2_0.preProcess', self.strPluginRaddoseName, "Beam Flux not set") self.warning(strWarningMessage) self.addWarningMessage(strWarningMessage) else: self.edPluginRaddose = self.loadPlugin(self.strPluginRaddoseName) if (self.edPluginRaddose is not None): self.DEBUG("EDPluginControlKappaStrategyv2_0.preProcess: " + self.strPluginRaddoseName + " Found... setting Data Input") xsDataStringSpaceGroup = self.getDataInput( "mxv1InputStrategy")[0].getDiffractionPlan( ).getForcedSpaceGroup() # Space Group has been forced # Prepare chemical composition calculation with the forced Space Group (Space Group Name) strNumOperators = None strSpaceGroup = None if (xsDataStringSpaceGroup is not None): strSpaceGroup = xsDataStringSpaceGroup.getValue() self.DEBUG( "EDPluginControlKappaStrategyv2_0.preProcess: Forced Space Group Found: " + strSpaceGroup) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName( strSpaceGroup) except Exception as detail: strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ( 'EDPluginControlKappaStrategyv2_0.preProcess', "Problem to calculate Number of symmetry operators", detail) self.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError(strErrorMessage) # Space Group has NOT been forced else: xsDataStringSpaceGroup = self.xsDataSampleCopy.getCrystal( ).getSpaceGroup().getName() if (xsDataStringSpaceGroup is not None): # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group Name) strSpaceGroup = self.xsDataSampleCopy.getCrystal( ).getSpaceGroup().getName().getValue() self.DEBUG( "EDPluginControlKappaStrategyv2_0.preProcess: Space Group IT Name found by indexing: " + strSpaceGroup) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName( strSpaceGroup) except Exception as detail: strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ( 'EDPluginControlKappaStrategyv2_0.preProcess', "Problem to calculate Number of symmetry operators", detail) self.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError(strErrorMessage) else: # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group IT number) dSpaceGroupITNumber = self.xsDataSampleCopy.getCrystal( ).getSpaceGroup().getITNumber().getValue() self.DEBUG( "EDPluginControlKappaStrategyv2_0.preProcess: Space Group IT Number Found by indexing: %d" % dSpaceGroupITNumber) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupITNumber( str(dSpaceGroupITNumber)) except Exception as detail: strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ( 'EDPluginControlKappaStrategyv2_0.preProcess', "Problem to calculate Number of symmetry operators", detail) self.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError(strErrorMessage) if (strNumOperators is not None): iNumOperators = int(strNumOperators) else: strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ( 'EDPluginControlKappaStrategyv2_0.preProcess', "No symmetry operators found for Space Group: ", strSpaceGroup) self.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError(strErrorMessage) xsDataChemicalComposition = self.xsDataSampleCopy.getChemicalComposition( ) if (xsDataChemicalComposition is None): # create a default chemical composition and assign it to the sample xsDataDefaultChemicalComposition = self.getDefaultChemicalComposition( self.xsDataSampleCopy, iNumOperators) self.xsDataSampleCopy.setChemicalComposition( xsDataDefaultChemicalComposition) else: # Check for Sulfur atoms, if none, add native sulfur atoms xsDataUpdatedChemicalComposition = self.updateChemicalComposition( xsDataChemicalComposition) self.xsDataSampleCopy.setChemicalComposition( xsDataUpdatedChemicalComposition) # create Data Input for Raddose from EDHandlerXSDataRaddosev10 import EDHandlerXSDataRaddosev10 self.edHandlerXSDataRaddose = EDHandlerXSDataRaddosev10() xsDataBeam = self.getDataInput("mxv1InputStrategy")[ 0].getExperimentalCondition().getBeam() xsDataRaddoseInput = None iNumberOfImages = 1 self.warning("Number of images for RADDOSE forced to 1") try: xsDataRaddoseInput = self.edHandlerXSDataRaddose.getXSDataRaddoseInput( xsDataBeam, self.xsDataSampleCopy, iNumOperators, iNumberOfImages) except Exception as detail: strWarningMessage = EDMessage.WARNING_CANNOT_USE_PLUGIN_03 % ( 'EDPluginControlKappaStrategyv2_0.preProcess', self.strPluginRaddoseName, "EDHandlerXSDataRaddose : " + detail) self.warning(strWarningMessage) self.addWarningMessage(strWarningMessage) if (xsDataRaddoseInput is not None): self.edPluginRaddose.setDataInput(xsDataRaddoseInput) self.edPluginRaddose.setBaseDirectory( self.getWorkingDirectory()) self.edPluginRaddose.setBaseName(self.strPluginRaddoseName) # More checks? # try: # self.edPluginRaddose.setDataInput( xsDataRaddoseInput ) # self.edPluginRaddose.setBaseDirectory( self.getWorkingDirectory() ) # self.edPluginRaddose.setBaseName( self.strPluginRaddoseName ) # # except Exception, detail: # strWarningMessage = EDMessage.WARNING_CANNOT_USE_PLUGIN_03 % ('EDPluginControlStrategyv1_1.preProcess', self.strPluginRaddoseName, detail ) ) # self.warning( strWarningMessage ) # self.addWarningMessage( strWarningMessage ) else: strErrorMessage = EDMessage.ERROR_PLUGIN_NOT_LOADED_02 % ( 'EDPluginControlKappaStrategyv2_0.preProcess', self.strPluginRaddoseName) self.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError(strErrorMessage) self.edPluginBest = self.loadPlugin(self.strPluginBestName) if (self.edPluginBest is None): strErrorMessage = EDMessage.ERROR_PLUGIN_NOT_LOADED_02 % ( 'EDPluginControlKappaStrategyv2_0.preProcess', self.strPluginBestName) self.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError(strErrorMessage) else: self.edPluginBest.setBaseDirectory(self.getWorkingDirectory()) self.edPluginBest.setBaseName(self.strPluginBestName) if (self.KappaStrategy): # Alignment self.edPluginAlignment = self.loadPlugin( self.strPluginAlignmentName) if (self.edPluginAlignment is None): errorMessage = EDMessage.ERROR_PLUGIN_NOT_LOADED_02 % ( 'EDPluginControlKappaStrategyv2_0.preProcess', self.strPluginAlignmentName) self.error(errorMessage) self.addErrorMessage(errorMessage) # do not kill the application just because this feature is not available # raise RuntimeError, errorMessage else: self.edPluginAlignment.setBaseDirectory( self.getWorkingDirectory()) self.edPluginAlignment.setBaseName(self.strPluginAlignmentName) # KappaStaregy self.edPluginKappaStrategy = self.loadPlugin( self.strPluginKappaStrategyName) if (self.edPluginKappaStrategy is None): errorMessage = EDMessage.ERROR_PLUGIN_NOT_LOADED_02 % ( 'EDPluginControlKappaStrategyv2_0.preProcess', self.strPluginKappaStrategyName) self.error(errorMessage) self.addErrorMessage(errorMessage) # raise RuntimeError, errorMessage else: self.edPluginKappaStrategy.setBaseDirectory( self.getWorkingDirectory()) self.edPluginKappaStrategy.setBaseName( self.strPluginKappaStrategyName)
class EDPluginControlKappaStrategyv2_0(EDPluginControl): """ The Plugin that controls the strategy step """ def __init__(self): EDPluginControl.__init__(self) #self.setXSDataInputClass(EDList) self.setRequiredToHaveConfiguration(True) self.strPluginRaddoseName = "EDPluginRaddosev10" self.edPluginRaddose = None self.edHandlerXSDataRaddose = None self.strPluginBestName = "EDPluginBestv1_2" self.edPluginBest = None from EDHandlerXSDataBestv1_2 import EDHandlerXSDataBestv1_2 self.edHandlerXSDataBest = EDHandlerXSDataBestv1_2() self.strPluginAlignmentName = "EDPluginSTACAlignmentv2_0" self.edPluginAlignment = None self.edHandlerXSDataAlignment = None self.strPluginKappaStrategyName = "EDPluginSTACStrategyv2_0" self.edPluginKappaStrategy = None self.edHandlerXSDataKappaStrategy = None self.setXSDataInputClass(XSDataInputStrategy, "mxv1InputStrategy") EDFactoryPluginStatic.loadModule("XSDataMXv2") import XSDataMXv2 self.setXSDataInputClass(XSDataMXv2.XSDataCollection, "mxv2DataCollection") import XSDataMXv1 self.setXSDataInputClass(XSDataMXv1.XSDataIndexingResult, "mxv1IndexingResult") #disable kappa by default self.KappaStrategy = 0 self.strCONF_SYMOP_HOME = "symopHome" # Default value for the location of the symop table self.strSymopHome = os.path.normpath("/opt/pxsoft/ccp4-6.0.2/lib/data") self.xsDataSampleCopy = None # For default chemical composition self.fAverageAminoAcidVolume = 135.49 self.fAverageCrystalSolventContent = 0.47 self.fAverageSulfurContentPerAminoacid = 0.05 self.fAverageSulfurConcentration = 314 def setSymopHome(self, _strSymopHome): self.strSymopHome = _strSymopHome def getSymopHome(self): return self.strSymopHome def preProcess(self, _edObject=None): """ Gets the Configuration Parameters, if found, overrides default parameters """ EDPluginControl.preProcess(self, _edObject) EDVerbose.DEBUG("EDPluginControlKappaStrategyv2_0.preProcess...") self.edPluginRaddose = None xsDataSampleCrystalMM = self.getDataInput( "mxv1InputStrategy")[0].getSample() if (xsDataSampleCrystalMM is None): self.xsDataSampleCopy = XSDataSampleCrystalMM() else: strXmlStringDataSample = xsDataSampleCrystalMM.marshal() self.xsDataSampleCopy = XSDataSampleCrystalMM.parseString( strXmlStringDataSample) xsDataCrystal = self.getDataInput( "mxv1InputStrategy")[0].getCrystalRefined() if (xsDataCrystal is not None): self.xsDataSampleCopy.setCrystal(xsDataCrystal) # Raddose is enabled only if the beam flux is set if (self.getDataInput("mxv1InputStrategy") [0].getExperimentalCondition().getBeam().getFlux() is None): strWarningMessage = EDMessage.WARNING_CANNOT_USE_PLUGIN_03 % ( 'EDPluginControlKappaStrategyv2_0.preProcess', self.strPluginRaddoseName, "Beam Flux not set") EDVerbose.warning(strWarningMessage) self.addWarningMessage(strWarningMessage) else: self.edPluginRaddose = self.loadPlugin(self.strPluginRaddoseName) if (self.edPluginRaddose is not None): EDVerbose.DEBUG( "EDPluginControlKappaStrategyv2_0.preProcess: " + self.strPluginRaddoseName + " Found... setting Data Input") strFileSymop = os.path.join(self.getSymopHome(), "symop.lib") xsDataStringSpaceGroup = self.getDataInput( "mxv1InputStrategy")[0].getDiffractionPlan( ).getForcedSpaceGroup() # Space Group has been forced # Prepare chemical composition calculation with the forced Space Group (Space Group Name) strNumOperators = None strSpaceGroup = None if (xsDataStringSpaceGroup is not None): strSpaceGroup = xsDataStringSpaceGroup.getValue() EDVerbose.DEBUG( "EDPluginControlKappaStrategyv2_0.preProcess: Forced Space Group Found: " + strSpaceGroup) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName( strSpaceGroup, strFileSymop) except Exception, detail: strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ( 'EDPluginControlKappaStrategyv2_0.preProcess', "Problem to calculate Number of symmetry operators", detail) EDVerbose.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError, strErrorMessage # Space Group has NOT been forced else: xsDataStringSpaceGroup = self.xsDataSampleCopy.getCrystal( ).getSpaceGroup().getName() if (xsDataStringSpaceGroup is not None): # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group Name) strSpaceGroup = self.xsDataSampleCopy.getCrystal( ).getSpaceGroup().getName().getValue() EDVerbose.DEBUG( "EDPluginControlKappaStrategyv2_0.preProcess: Space Group IT Name found by indexing: " + strSpaceGroup) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName( strSpaceGroup, strFileSymop) except Exception, detail: strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ( 'EDPluginControlKappaStrategyv2_0.preProcess', "Problem to calculate Number of symmetry operators", detail) EDVerbose.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError, strErrorMessage else: # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group IT number) dSpaceGroupITNumber = self.xsDataSampleCopy.getCrystal( ).getSpaceGroup().getITNumber().getValue() EDVerbose.DEBUG( "EDPluginControlKappaStrategyv2_0.preProcess: Space Group IT Number Found by indexing: %d" % dSpaceGroupITNumber) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupITNumber( str(dSpaceGroupITNumber), strFileSymop) except Exception, detail: strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ( 'EDPluginControlKappaStrategyv2_0.preProcess', "Problem to calculate Number of symmetry operators", detail) EDVerbose.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError, strErrorMessage
def testGetSpaceGroupNameFromITNumber(self): EDAssert.equal("P1", EDUtilsSymmetry.getSpaceGroupNameFromITNumber(1), "Space group from from it number 1") EDAssert.equal("P2", EDUtilsSymmetry.getSpaceGroupNameFromITNumber(3), "Space group from from it number 3") EDAssert.equal("C2", EDUtilsSymmetry.getSpaceGroupNameFromITNumber(5), "Space group from from it number 5") EDAssert.equal("P222", EDUtilsSymmetry.getSpaceGroupNameFromITNumber(16), "Space group from from it number 16") EDAssert.equal("C222", EDUtilsSymmetry.getSpaceGroupNameFromITNumber(21), "Space group from from it number 21") EDAssert.equal("F222", EDUtilsSymmetry.getSpaceGroupNameFromITNumber(22), "Space group from from it number 22") EDAssert.equal("P4", EDUtilsSymmetry.getSpaceGroupNameFromITNumber(75), "Space group from from it number 75") EDAssert.equal("I4", EDUtilsSymmetry.getSpaceGroupNameFromITNumber(79), "Space group from from it number 79") EDAssert.equal("P3", EDUtilsSymmetry.getSpaceGroupNameFromITNumber(143), "Space group from from it number 143") EDAssert.equal("H3", EDUtilsSymmetry.getSpaceGroupNameFromITNumber(146), "Space group from from it number 146") EDAssert.equal("P23", EDUtilsSymmetry.getSpaceGroupNameFromITNumber(195), "Space group from from it number 195") EDAssert.equal("F23", EDUtilsSymmetry.getSpaceGroupNameFromITNumber(196), "Space group from from it number 196")
def testGetITNumberFromSpaceGroupName(self): EDAssert.equal(1, EDUtilsSymmetry.getITNumberFromSpaceGroupName("P1"), "ITNumber from space group P1") EDAssert.equal(3, EDUtilsSymmetry.getITNumberFromSpaceGroupName("P2"), "ITNumber from space group P2") EDAssert.equal(5, EDUtilsSymmetry.getITNumberFromSpaceGroupName("C2"), "ITNumber from space group C2") EDAssert.equal(16, EDUtilsSymmetry.getITNumberFromSpaceGroupName("P222"), "ITNumber from space group P222") EDAssert.equal(21, EDUtilsSymmetry.getITNumberFromSpaceGroupName("C222"), "ITNumber from space group C222") EDAssert.equal(22, EDUtilsSymmetry.getITNumberFromSpaceGroupName("F222"), "ITNumber from space group F222") EDAssert.equal(75, EDUtilsSymmetry.getITNumberFromSpaceGroupName("P4"), "ITNumber from space group P4") EDAssert.equal(79, EDUtilsSymmetry.getITNumberFromSpaceGroupName("I4"), "ITNumber from space group I4") EDAssert.equal(143, EDUtilsSymmetry.getITNumberFromSpaceGroupName("P3"), "ITNumber from space group P3") EDAssert.equal(146, EDUtilsSymmetry.getITNumberFromSpaceGroupName("H3"), "ITNumber from space group H3") EDAssert.equal(195, EDUtilsSymmetry.getITNumberFromSpaceGroupName("P23"), "ITNumber from space group P23") EDAssert.equal(196, EDUtilsSymmetry.getITNumberFromSpaceGroupName("F23"), "ITNumber from space group F23")
def preProcess(self, _edObject=None): """ Gets the Configuration Parameters, if found, overrides default parameters """ EDPluginControl.preProcess(self, _edObject) EDVerbose.DEBUG("EDPluginControlStrategyv1_2.preProcess...") self._edPluginRaddose = None xsDataSampleCrystalMM = self.getDataInput().getSample() if(xsDataSampleCrystalMM is None): self._xsDataSampleCopy = XSDataSampleCrystalMM() else: strXmlStringDataSample = xsDataSampleCrystalMM.marshal() self._xsDataSampleCopy = XSDataSampleCrystalMM.parseString(strXmlStringDataSample) xsDataCrystal = self.getDataInput().getCrystalRefined() if(xsDataCrystal is not None): self._xsDataSampleCopy.setCrystal(xsDataCrystal) # Load the Best plugin self._edPluginBest = self.loadPlugin(self._strPluginBestName) self._edPluginBest.setBaseDirectory(self.getWorkingDirectory()) self._edPluginBest.setBaseName(self._strPluginBestName) # Load the plot gle plugin self._edPluginPlotGle = self.loadPlugin(self._strPluginPlotGleName) # Check if radiation damage estimation is required or not in the diffraction plan xsDataDiffractionPlan = self.getDataInput().getDiffractionPlan() if xsDataDiffractionPlan is not None: if xsDataDiffractionPlan.getEstimateRadiationDamage(): if xsDataDiffractionPlan.getEstimateRadiationDamage().getValue(): # Yes, is requested self._bEstimateRadiationDamage = True else: # No, is explicitly not requested self._bEstimateRadiationDamage = False elif xsDataDiffractionPlan.getStrategyOption() is not None: if xsDataDiffractionPlan.getStrategyOption().getValue().find("-DamPar") != -1: # The "-DamPar" option requires estimation of radiation damage self._bEstimateRadiationDamage = True # Check if we know what to do with radiation damage if self._bEstimateRadiationDamage is None: # "Force" the estimation of radiation damage if the flux is present if self.getDataInput().getExperimentalCondition().getBeam().getFlux() is None: strWarningMessage = "EDPluginControlStrategyv1_2: Missing flux input - cannot estimate radiation damage." EDVerbose.WARNING(strWarningMessage) self.addWarningMessage(strWarningMessage) self._bEstimateRadiationDamage = False else: self._bEstimateRadiationDamage = True if self._bEstimateRadiationDamage: if self.getDataInput().getExperimentalCondition().getBeam().getFlux() is None: strErrorMessage = "EDPluginControlStrategyv1_2: Missing flux input. Cannot estimate radiation damage" EDVerbose.ERROR(strErrorMessage) self.addErrorMessage(strErrorMessage) self.setFailure() if not self.isFailure(): self._edPluginRaddose = self.loadPlugin(self._strPluginRaddoseName) if (self._edPluginRaddose is not None): EDVerbose.DEBUG("EDPluginControlStrategyv1_2.preProcess: " + self._strPluginRaddoseName + " Found... setting Data Input") strFileSymop = os.path.join(self.getSymopHome(), "symop.lib") xsDataStringSpaceGroup = self.getDataInput().getDiffractionPlan().getForcedSpaceGroup() # Space Group has been forced # Prepare chemical composition calculation with the forced Space Group (Space Group Name) if(xsDataStringSpaceGroup is not None): strSpaceGroup = xsDataStringSpaceGroup.getValue().upper() EDVerbose.DEBUG("EDPluginControlStrategyv1_2.preProcess: Forced Space Group Found: " + strSpaceGroup) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName(strSpaceGroup, strFileSymop) except Exception, detail: strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ('EDPluginControlStrategyv1_2.preProcess', "Problem to calculate Number of symmetry operators", detail) EDVerbose.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError, strErrorMessage # Space Group has NOT been forced else: xsDataStringSpaceGroup = self._xsDataSampleCopy.getCrystal().getSpaceGroup().getName() if (xsDataStringSpaceGroup is not None): # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group Name) strSpaceGroupName = self._xsDataSampleCopy.getCrystal().getSpaceGroup().getName().getValue() EDVerbose.DEBUG("EDPluginControlStrategyv1_2.preProcess: Space Group IT Name found by indexing: " + strSpaceGroupName) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName(strSpaceGroupName, strFileSymop) except Exception, detail: strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ('EDPluginControlStrategyv1_2.preProcess', "Problem to calculate Number of symmetry operators", detail) EDVerbose.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError, strErrorMessage else: # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group IT number) iSpaceGroupITNumber = self._xsDataSampleCopy.getCrystal().getSpaceGroup().getITNumber().getValue() EDVerbose.DEBUG("EDPluginControlStrategyv1_2.preProcess: Space Group IT Number Found by indexing: %d" % iSpaceGroupITNumber) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupITNumber(str(iSpaceGroupITNumber), strFileSymop) except Exception, detail: strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ('EDPluginControlStrategyv1_2.preProcess', "Problem to calculate Number of symmetry operators", detail) EDVerbose.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError, strErrorMessage
def preProcess(self, _edObject=None): """ Gets the Configuration Parameters, if found, overrides default parameters """ EDPluginControl.preProcess(self, _edObject) self.DEBUG("EDPluginControlStrategyv1_2.preProcess...") self._edPluginRaddose = None xsDataSampleCrystalMM = self.getDataInput().getSample() if xsDataSampleCrystalMM is None: self._xsDataSampleCopy = XSDataSampleCrystalMM() else: strXmlStringDataSample = xsDataSampleCrystalMM.marshal() self._xsDataSampleCopy = XSDataSampleCrystalMM.parseString(strXmlStringDataSample) xsDataCrystal = self.getDataInput().getCrystalRefined() if xsDataCrystal is not None: self._xsDataSampleCopy.setCrystal(xsDataCrystal) # Load the Best plugin self._edPluginBest = self.loadPlugin(self._strPluginBestName) self._edPluginBest.setBaseDirectory(self.getWorkingDirectory()) self._edPluginBest.setBaseName(self._strPluginBestName) # Load the plot gle plugin self._edPluginPlotGle = self.loadPlugin(self._strPluginPlotGleName) # Check if radiation damage estimation is required or not in the diffraction plan xsDataDiffractionPlan = self.getDataInput().getDiffractionPlan() if xsDataDiffractionPlan is not None: if xsDataDiffractionPlan.getEstimateRadiationDamage(): if xsDataDiffractionPlan.getEstimateRadiationDamage().getValue(): # Yes, is requested self._bEstimateRadiationDamage = True else: # No, is explicitly not requested self._bEstimateRadiationDamage = False elif xsDataDiffractionPlan.getStrategyOption() is not None: if xsDataDiffractionPlan.getStrategyOption().getValue().find("-DamPar") != -1: # The "-DamPar" option requires estimation of radiation damage self._bEstimateRadiationDamage = True # Check if we know what to do with radiation damage if self._bEstimateRadiationDamage is None: # "Force" the estimation of radiation damage if the flux is present if self.getDataInput().getExperimentalCondition().getBeam().getFlux() is None: strWarningMessage = ( "EDPluginControlStrategyv1_2: Missing flux input - cannot estimate radiation damage." ) self.WARNING(strWarningMessage) self.addWarningMessage(strWarningMessage) self._bEstimateRadiationDamage = False else: self._bEstimateRadiationDamage = True if self._bEstimateRadiationDamage: if self.getDataInput().getExperimentalCondition().getBeam().getFlux() is None: strErrorMessage = "EDPluginControlStrategyv1_2: Missing flux input. Cannot estimate radiation damage" self.ERROR(strErrorMessage) self.addErrorMessage(strErrorMessage) self.setFailure() if not self.isFailure(): self._edPluginRaddose = self.loadPlugin(self._strPluginRaddoseName) if self._edPluginRaddose is not None: self.DEBUG( "EDPluginControlStrategyv1_2.preProcess: " + self._strPluginRaddoseName + " Found... setting Data Input" ) strFileSymop = os.path.join(self.getSymopHome(), "symop.lib") xsDataStringSpaceGroup = self.getDataInput().getDiffractionPlan().getForcedSpaceGroup() # Space Group has been forced # Prepare chemical composition calculation with the forced Space Group (Space Group Name) bSpaceGroupForced = False if xsDataStringSpaceGroup is not None: strSpaceGroup = xsDataStringSpaceGroup.getValue().upper().replace(" ", "") if strSpaceGroup != "": self.DEBUG("EDPluginControlStrategyv1_2.preProcess: Forced Space Group Found: " + strSpaceGroup) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName( strSpaceGroup, strFileSymop ) bSpaceGroupForced = True except Exception as detail: strErrorMessage = "EDPluginControlStrategyv1_2: Problem to calculate Number of symmetry operators: {0}".format( detail ) self.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError(strErrorMessage) if not bSpaceGroupForced: # Space Group has NOT been forced xsDataStringSpaceGroup = self._xsDataSampleCopy.getCrystal().getSpaceGroup().getName() if xsDataStringSpaceGroup is not None: # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group Name) strSpaceGroupName = self._xsDataSampleCopy.getCrystal().getSpaceGroup().getName().getValue() self.DEBUG( "EDPluginControlStrategyv1_2.preProcess: Space Group IT Name found by indexing: " + strSpaceGroupName ) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName( strSpaceGroupName, strFileSymop ) except Exception as detail: strErrorMessage = "EDPluginControlStrategyv1_2: Problem to calculate Number of symmetry operators: {0}".format( detail ) self.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError(strErrorMessage) else: # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group IT number) iSpaceGroupITNumber = ( self._xsDataSampleCopy.getCrystal().getSpaceGroup().getITNumber().getValue() ) self.DEBUG( "EDPluginControlStrategyv1_2.preProcess: Space Group IT Number Found by indexing: %d" % iSpaceGroupITNumber ) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupITNumber( str(iSpaceGroupITNumber), strFileSymop ) except Exception as detail: strErrorMessage = "EDPluginControlStrategyv1_2: Problem to calculate Number of symmetry operators: {0}".format( detail ) self.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError(strErrorMessage) if strNumOperators is not None: iNumOperators = int(strNumOperators) else: strErrorMessage = "EDPluginControlStrategyv1_2: No symmetry operators found for Space Group: {0}".format( strNumOperators ) self.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError(strErrorMessage) xsDataChemicalComposition = self._xsDataSampleCopy.getChemicalComposition() if xsDataChemicalComposition is None: # create a default chemical composition and assign it to the sample xsDataDefaultChemicalComposition = self.getDefaultChemicalComposition( self._xsDataSampleCopy, iNumOperators ) self._xsDataSampleCopy.setChemicalComposition(xsDataDefaultChemicalComposition) else: # Check for Sulfur atoms, if none, add native sulfur atoms xsDataUpdatedChemicalComposition = self.updateChemicalComposition(xsDataChemicalComposition) self._xsDataSampleCopy.setChemicalComposition(xsDataUpdatedChemicalComposition) # create Data Input for Raddose from EDHandlerXSDataRaddosev10 import EDHandlerXSDataRaddosev10 self._edHandlerXSDataRaddose = EDHandlerXSDataRaddosev10() xsDataBeam = self.getDataInput().getExperimentalCondition().getBeam() # Calculate number of images (MXSUP-1616): iNumberOfImages = None xsDataCollection = self.dataInput.dataCollection if xsDataCollection is not None: iNumberOfImages = 0 for xsDataSubWedge in xsDataCollection.subWedge: xsDataGoniostat = xsDataSubWedge.experimentalCondition.goniostat iOscStart = xsDataGoniostat.rotationAxisStart.value iOscEnd = xsDataGoniostat.rotationAxisEnd.value iOscWidth = xsDataGoniostat.oscillationWidth.value iNumberOfImages += int(round((iOscEnd - iOscStart) / iOscWidth, 0)) if iNumberOfImages is None: iNumberOfImages = 1 self.WARNING("No goniostat information, number of images for RADDOSE set to 1") xsDataRaddoseInput = self._edHandlerXSDataRaddose.getXSDataRaddoseInput( xsDataBeam, self._xsDataSampleCopy, iNumOperators, iNumberOfImages ) if xsDataRaddoseInput is not None: self._edPluginRaddose.setDataInput(xsDataRaddoseInput) self._edPluginRaddose.setBaseDirectory(self.getWorkingDirectory()) self._edPluginRaddose.setBaseName(self._strPluginRaddoseName)
def preProcess(self, _edObject=None): """ Gets the Configuration Parameters, if found, overrides default parameters """ EDPluginControl.preProcess(self, _edObject) EDVerbose.DEBUG("EDPluginControlStrategyv10.preProcess...") self.__edPluginRaddose = None xsDataSampleCrystalMM = self.getDataInput().getSample() if(xsDataSampleCrystalMM is None): self.__xsDataSampleCopy = XSDataSampleCrystalMM() else: strXmlStringDataSample = xsDataSampleCrystalMM.marshal() self.__xsDataSampleCopy = XSDataSampleCrystalMM.parseString(strXmlStringDataSample) xsDataCrystal = self.getDataInput().getCrystalRefined() if(xsDataCrystal is not None): self.__xsDataSampleCopy.setCrystal(xsDataCrystal) # Raddose is enabled only if the beam flux is set if(self.getDataInput().getExperimentalCondition().getBeam().getFlux() is None): warningMessage = EDMessage.WARNING_CANNOT_USE_PLUGIN_03 % ('EDPluginControlStrategyv10.preProcess', self.__strPluginRaddoseName, "Beam Flux not set") EDVerbose.warning(warningMessage) self.addWarningMessage(warningMessage) else: self.__edPluginRaddose = self.loadPlugin(self.__strPluginRaddoseName) if (self.__edPluginRaddose is not None): EDVerbose.DEBUG("EDPluginControlStrategyv10.preProcess: " + self.__strPluginRaddoseName + " Found... setting Data Input") strFileSymop = os.path.join(self.getSymopHome(), "symop.lib") xsDataStringSpaceGroup = self.getDataInput().getDiffractionPlan().getForcedSpaceGroup() # Space Group has been forced # Prepare chemical composition calculation with the forced Space Group (Space Group Name) if(xsDataStringSpaceGroup is not None): strSpaceGroup = xsDataStringSpaceGroup.getValue() EDVerbose.DEBUG("EDPluginControlStrategyv10.preProcess: Forced Space Group Found: " + strSpaceGroup) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName(strSpaceGroup, strFileSymop) except Exception, detail: errorMessage = EDMessage.ERROR_EXECUTION_03 % ('EDPluginControlStrategyv10.preProcess', "Problem to calculate Number of symmetry operators", detail) EDVerbose.error(errorMessage) self.addErrorMessage(errorMessage) raise RuntimeError, errorMessage # Space Group has NOT been forced else: xsDataStringSpaceGroup = self.__xsDataSampleCopy.getCrystal().getSpaceGroup().getName() if (xsDataStringSpaceGroup is not None): # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group Name) strSpaceGroupName = self.__xsDataSampleCopy.getCrystal().getSpaceGroup().getName().getValue() EDVerbose.DEBUG("EDPluginControlStrategyv10.preProcess: Space Group IT Name found by indexing: " + strSpaceGroupName) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName(strSpaceGroupName, strFileSymop) except Exception, detail: errorMessage = EDMessage.ERROR_EXECUTION_03 % ('EDPluginControlStrategyv10.preProcess', "Problem to calculate Number of symmetry operators", detail) EDVerbose.error(errorMessage) self.addErrorMessage(errorMessage) raise RuntimeError, errorMessage else: # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group IT number) strSpaceGroupITNumber = str(self.__xsDataSampleCopy.getCrystal().getSpaceGroup().getITNumber().getValue())
def preProcess(self, _edObject=None): """ Gets the Configuration Parameters, if found, overrides default parameters """ EDPluginControl.preProcess(self, _edObject) EDVerbose.DEBUG("EDPluginControlStrategyv1_2.preProcess...") self._edPluginRaddose = None xsDataSampleCrystalMM = self.getDataInput().getSample() if (xsDataSampleCrystalMM is None): self._xsDataSampleCopy = XSDataSampleCrystalMM() else: strXmlStringDataSample = xsDataSampleCrystalMM.marshal() self._xsDataSampleCopy = XSDataSampleCrystalMM.parseString( strXmlStringDataSample) xsDataCrystal = self.getDataInput().getCrystalRefined() if (xsDataCrystal is not None): self._xsDataSampleCopy.setCrystal(xsDataCrystal) # Load the Best plugin self._edPluginBest = self.loadPlugin(self._strPluginBestName) self._edPluginBest.setBaseDirectory(self.getWorkingDirectory()) self._edPluginBest.setBaseName(self._strPluginBestName) # Load the plot gle plugin self._edPluginPlotGle = self.loadPlugin(self._strPluginPlotGleName) # Check if radiation damage estimation is required or not in the diffraction plan xsDataDiffractionPlan = self.getDataInput().getDiffractionPlan() if xsDataDiffractionPlan is not None: if xsDataDiffractionPlan.getEstimateRadiationDamage(): if xsDataDiffractionPlan.getEstimateRadiationDamage().getValue( ): # Yes, is requested self._bEstimateRadiationDamage = True else: # No, is explicitly not requested self._bEstimateRadiationDamage = False elif xsDataDiffractionPlan.getStrategyOption() is not None: if xsDataDiffractionPlan.getStrategyOption().getValue().find( "-DamPar") != -1: # The "-DamPar" option requires estimation of radiation damage self._bEstimateRadiationDamage = True # Check if we know what to do with radiation damage if self._bEstimateRadiationDamage is None: # "Force" the estimation of radiation damage if the flux is present if self.getDataInput().getExperimentalCondition().getBeam( ).getFlux() is None: strWarningMessage = "EDPluginControlStrategyv1_2: Missing flux input - cannot estimate radiation damage." EDVerbose.WARNING(strWarningMessage) self.addWarningMessage(strWarningMessage) self._bEstimateRadiationDamage = False else: self._bEstimateRadiationDamage = True if self._bEstimateRadiationDamage: if self.getDataInput().getExperimentalCondition().getBeam( ).getFlux() is None: strErrorMessage = "EDPluginControlStrategyv1_2: Missing flux input. Cannot estimate radiation damage" EDVerbose.ERROR(strErrorMessage) self.addErrorMessage(strErrorMessage) self.setFailure() if not self.isFailure(): self._edPluginRaddose = self.loadPlugin(self._strPluginRaddoseName) if (self._edPluginRaddose is not None): EDVerbose.DEBUG("EDPluginControlStrategyv1_2.preProcess: " + self._strPluginRaddoseName + " Found... setting Data Input") strFileSymop = os.path.join(self.getSymopHome(), "symop.lib") xsDataStringSpaceGroup = self.getDataInput( ).getDiffractionPlan().getForcedSpaceGroup() # Space Group has been forced # Prepare chemical composition calculation with the forced Space Group (Space Group Name) if (xsDataStringSpaceGroup is not None): strSpaceGroup = xsDataStringSpaceGroup.getValue().upper() EDVerbose.DEBUG( "EDPluginControlStrategyv1_2.preProcess: Forced Space Group Found: " + strSpaceGroup) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName( strSpaceGroup, strFileSymop) except Exception, detail: strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ( 'EDPluginControlStrategyv1_2.preProcess', "Problem to calculate Number of symmetry operators", detail) EDVerbose.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError, strErrorMessage # Space Group has NOT been forced else: xsDataStringSpaceGroup = self._xsDataSampleCopy.getCrystal( ).getSpaceGroup().getName() if (xsDataStringSpaceGroup is not None): # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group Name) strSpaceGroupName = self._xsDataSampleCopy.getCrystal( ).getSpaceGroup().getName().getValue() EDVerbose.DEBUG( "EDPluginControlStrategyv1_2.preProcess: Space Group IT Name found by indexing: " + strSpaceGroupName) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName( strSpaceGroupName, strFileSymop) except Exception, detail: strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ( 'EDPluginControlStrategyv1_2.preProcess', "Problem to calculate Number of symmetry operators", detail) EDVerbose.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError, strErrorMessage else: # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group IT number) iSpaceGroupITNumber = self._xsDataSampleCopy.getCrystal( ).getSpaceGroup().getITNumber().getValue() EDVerbose.DEBUG( "EDPluginControlStrategyv1_2.preProcess: Space Group IT Number Found by indexing: %d" % iSpaceGroupITNumber) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupITNumber( str(iSpaceGroupITNumber), strFileSymop) except Exception, detail: strErrorMessage = EDMessage.ERROR_EXECUTION_03 % ( 'EDPluginControlStrategyv1_2.preProcess', "Problem to calculate Number of symmetry operators", detail) EDVerbose.error(strErrorMessage) self.addErrorMessage(strErrorMessage) raise RuntimeError, strErrorMessage
def preProcess(self, _edObject=None): """ Gets the Configuration Parameters, if found, overrides default parameters """ EDPluginControl.preProcess(self, _edObject) EDVerbose.DEBUG("EDPluginControlStrategyv1_1.preProcess...") self.__edPluginRaddose = None xsDataSampleCrystalMM = self.getDataInput().getSample() if (xsDataSampleCrystalMM is None): self.__xsDataSampleCopy = XSDataSampleCrystalMM() else: strXmlStringDataSample = xsDataSampleCrystalMM.marshal() self.__xsDataSampleCopy = XSDataSampleCrystalMM.parseString( strXmlStringDataSample) xsDataCrystal = self.getDataInput().getCrystalRefined() if (xsDataCrystal is not None): self.__xsDataSampleCopy.setCrystal(xsDataCrystal) # Raddose is enabled only if the beam flux is set if (self.getDataInput().getExperimentalCondition().getBeam().getFlux() is None): pyStrWarningMessage = EDMessage.WARNING_CANNOT_USE_PLUGIN_03 % ( 'EDPluginControlStrategyv1_1.preProcess', self.__strPluginRaddoseName, "Beam Flux not set") EDVerbose.warning(pyStrWarningMessage) self.addWarningMessage(pyStrWarningMessage) else: self.__edPluginRaddose = self.loadPlugin( self.__strPluginRaddoseName) if (self.__edPluginRaddose is not None): EDVerbose.DEBUG("EDPluginControlStrategyv1_1.preProcess: " + self.__strPluginRaddoseName + " Found... setting Data Input") strFileSymop = os.path.join(self.getSymopHome(), "symop.lib") xsDataStringSpaceGroup = self.getDataInput( ).getDiffractionPlan().getForcedSpaceGroup() # Space Group has been forced # Prepare chemical composition calculation with the forced Space Group (Space Group Name) strNumOperators = None strSpaceGroup = None if (xsDataStringSpaceGroup is not None): strSpaceGroup = xsDataStringSpaceGroup.getValue().upper() EDVerbose.DEBUG( "EDPluginControlStrategyv1_1.preProcess: Forced Space Group Found: " + strSpaceGroup) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName( strSpaceGroup, strFileSymop) except Exception, detail: pyStrErrorMessage = EDMessage.ERROR_EXECUTION_03 % ( 'EDPluginControlStrategyv1_1.preProcess', "Problem to calculate Number of symmetry operators", detail) EDVerbose.error(pyStrErrorMessage) self.addErrorMessage(pyStrErrorMessage) self.setFailure() # Space Group has NOT been forced else: xsDataStringSpaceGroup = self.__xsDataSampleCopy.getCrystal( ).getSpaceGroup().getName() if (xsDataStringSpaceGroup is not None): # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group Name) strSpaceGroupName = self.__xsDataSampleCopy.getCrystal( ).getSpaceGroup().getName().getValue() EDVerbose.DEBUG( "EDPluginControlStrategyv1_1.preProcess: Space Group IT Name found by indexing: " + strSpaceGroupName) try: strNumOperators = EDUtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName( strSpaceGroupName, strFileSymop) except Exception, detail: pyStrErrorMessage = EDMessage.ERROR_EXECUTION_03 % ( 'EDPluginControlStrategyv1_1.preProcess', "Problem to calculate Number of symmetry operators", detail) EDVerbose.error(pyStrErrorMessage) self.addErrorMessage(pyStrErrorMessage) self.setFailure() else: # Prepare chemical composition calculation with the Space Group calculated by indexing (Space Group IT number) iSpaceGroupITNumber = self.__xsDataSampleCopy.getCrystal(
def testGetITNumberFromSpaceGroupName(self): strSymopFileName = "/opt/pxsoft/ccp4/v6.3.0/linux-x86_64/lib/data/symop.lib" if os.path.exists(strSymopFileName): EDAssert.equal(1, EDUtilsSymmetry.getITNumberFromSpaceGroupName("P1", strSymopFileName), "ITNumber from space group P1") EDAssert.equal(3, EDUtilsSymmetry.getITNumberFromSpaceGroupName("P2", strSymopFileName), "ITNumber from space group P2") EDAssert.equal(5, EDUtilsSymmetry.getITNumberFromSpaceGroupName("C2", strSymopFileName), "ITNumber from space group C2") EDAssert.equal(16, EDUtilsSymmetry.getITNumberFromSpaceGroupName("P222", strSymopFileName), "ITNumber from space group P222") EDAssert.equal(21, EDUtilsSymmetry.getITNumberFromSpaceGroupName("C222", strSymopFileName), "ITNumber from space group C222") EDAssert.equal(22, EDUtilsSymmetry.getITNumberFromSpaceGroupName("F222", strSymopFileName), "ITNumber from space group F222") EDAssert.equal(75, EDUtilsSymmetry.getITNumberFromSpaceGroupName("P4", strSymopFileName), "ITNumber from space group P4") EDAssert.equal(79, EDUtilsSymmetry.getITNumberFromSpaceGroupName("I4", strSymopFileName), "ITNumber from space group I4") EDAssert.equal(143, EDUtilsSymmetry.getITNumberFromSpaceGroupName("P3", strSymopFileName), "ITNumber from space group P3") EDAssert.equal(146, EDUtilsSymmetry.getITNumberFromSpaceGroupName("H3", strSymopFileName), "ITNumber from space group H3") EDAssert.equal(195, EDUtilsSymmetry.getITNumberFromSpaceGroupName("P23", strSymopFileName), "ITNumber from space group P23") EDAssert.equal(196, EDUtilsSymmetry.getITNumberFromSpaceGroupName("F23", strSymopFileName), "ITNumber from space group F23")