Exemple #1
0
 def readIdxrefLp(pathToIdxrefLp, resultXDSIndexing=None):
     if resultXDSIndexing is None:
         resultXDSIndexing = {}
     if pathToIdxrefLp.exists():
         with open(str(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]:
                     resultXDSIndexing['mosaicity'] = float(
                         listLines[indexLine].split()[-1])
                 elif "DETECTOR COORDINATES (PIXELS) OF DIRECT BEAM" in listLines[
                         indexLine]:
                     resultXDSIndexing['xBeam'] = float(
                         listLines[indexLine].split()[-1])
                     resultXDSIndexing['yBeam'] = float(
                         listLines[indexLine].split()[-2])
                 elif "CRYSTAL TO DETECTOR DISTANCE" in listLines[
                         indexLine]:
                     resultXDSIndexing['distance'] = float(
                         listLines[indexLine].split()[-1])
             elif doParseLattice:
                 if listLines[indexLine].startswith(
                         " * ") and not listLines[indexLine +
                                                  1].startswith(" * "):
                     listLine = listLines[indexLine].split()
                     latticeCharacter = int(listLine[1])
                     bravaisLattice = listLine[2]
                     spaceGroup = UtilsSymmetry.getMinimumSymmetrySpaceGroupFromBravaisLattice(
                         bravaisLattice)
                     spaceGroupNumber = UtilsSymmetry.getITNumberFromSpaceGroupName(
                         spaceGroup)
                     qualityOfFit = float(listLine[3])
                     resultXDSIndexing.update({
                         'latticeCharacter': latticeCharacter,
                         'spaceGroupNumber': spaceGroupNumber,
                         'qualityOfFit': qualityOfFit,
                         'a': float(listLine[4]),
                         'b': float(listLine[5]),
                         'c': float(listLine[6]),
                         'alpha': float(listLine[7]),
                         'beta': float(listLine[8]),
                         'gamma': float(listLine[9])
                     })
             indexLine += 1
     return resultXDSIndexing
 def test_getMinimumSymmetrySpaceGroupFromBravaisLattice(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 index in range(len(listBravaisLattice)):
         self.assertEqual(
             listSpaceGroup[index],
             UtilsSymmetry.getMinimumSymmetrySpaceGroupFromBravaisLattice(
                 listBravaisLattice[index]),
         )
Exemple #3
0
 def parseLattice(indexLine, listLines, resultXDSIndexing):
     if listLines[indexLine].startswith(
             " * ") and not listLines[indexLine + 1].startswith(" * "):
         listLine = listLines[indexLine].split()
         latticeCharacter = int(listLine[1])
         bravaisLattice = listLine[2]
         spaceGroup = UtilsSymmetry.getMinimumSymmetrySpaceGroupFromBravaisLattice(
             bravaisLattice)
         spaceGroupNumber = UtilsSymmetry.getITNumberFromSpaceGroupName(
             spaceGroup)
         qualityOfFit = float(listLine[3])
         resultXDSIndexing.update({
             "latticeCharacter": latticeCharacter,
             "spaceGroupNumber": spaceGroupNumber,
             "qualityOfFit": qualityOfFit,
             "a": float(listLine[4]),
             "b": float(listLine[5]),
             "c": float(listLine[6]),
             "alpha": float(listLine[7]),
             "beta": float(listLine[8]),
             "gamma": float(listLine[9]),
         })
Exemple #4
0
 def testGetSpaceGroupNameFromITNumber(self):
     self.assertEqual("P1", UtilsSymmetry.getSpaceGroupNameFromITNumber(1),
                      "Space group from from it number 1")
     self.assertEqual("P2", UtilsSymmetry.getSpaceGroupNameFromITNumber(3),
                      "Space group from from it number 3")
     self.assertEqual("C2", UtilsSymmetry.getSpaceGroupNameFromITNumber(5),
                      "Space group from from it number 5")
     self.assertEqual("P222",
                      UtilsSymmetry.getSpaceGroupNameFromITNumber(16),
                      "Space group from from it number 16")
     self.assertEqual("C222",
                      UtilsSymmetry.getSpaceGroupNameFromITNumber(21),
                      "Space group from from it number 21")
     self.assertEqual("F222",
                      UtilsSymmetry.getSpaceGroupNameFromITNumber(22),
                      "Space group from from it number 22")
     self.assertEqual("P4", UtilsSymmetry.getSpaceGroupNameFromITNumber(75),
                      "Space group from from it number 75")
     self.assertEqual("I4", UtilsSymmetry.getSpaceGroupNameFromITNumber(79),
                      "Space group from from it number 79")
     self.assertEqual("P3",
                      UtilsSymmetry.getSpaceGroupNameFromITNumber(143),
                      "Space group from from it number 143")
     self.assertEqual("H3",
                      UtilsSymmetry.getSpaceGroupNameFromITNumber(146),
                      "Space group from from it number 146")
     self.assertEqual("P23",
                      UtilsSymmetry.getSpaceGroupNameFromITNumber(195),
                      "Space group from from it number 195")
     self.assertEqual("F23",
                      UtilsSymmetry.getSpaceGroupNameFromITNumber(196),
                      "Space group from from it number 196")
Exemple #5
0
 def test_getITNumberFromSpaceGroupName(self):
     self.assertEqual(1, UtilsSymmetry.getITNumberFromSpaceGroupName("P1"),
                      "ITNumber from space group P1")
     self.assertEqual(3, UtilsSymmetry.getITNumberFromSpaceGroupName("P2"),
                      "ITNumber from space group P2")
     self.assertEqual(5, UtilsSymmetry.getITNumberFromSpaceGroupName("C2"),
                      "ITNumber from space group C2")
     self.assertEqual(16,
                      UtilsSymmetry.getITNumberFromSpaceGroupName("P222"),
                      "ITNumber from space group P222")
     self.assertEqual(21,
                      UtilsSymmetry.getITNumberFromSpaceGroupName("C222"),
                      "ITNumber from space group C222")
     self.assertEqual(22,
                      UtilsSymmetry.getITNumberFromSpaceGroupName("F222"),
                      "ITNumber from space group F222")
     self.assertEqual(75, UtilsSymmetry.getITNumberFromSpaceGroupName("P4"),
                      "ITNumber from space group P4")
     self.assertEqual(79, UtilsSymmetry.getITNumberFromSpaceGroupName("I4"),
                      "ITNumber from space group I4")
     self.assertEqual(143,
                      UtilsSymmetry.getITNumberFromSpaceGroupName("P3"),
                      "ITNumber from space group P3")
     self.assertEqual(146,
                      UtilsSymmetry.getITNumberFromSpaceGroupName("H3"),
                      "ITNumber from space group H3")
     self.assertEqual(195,
                      UtilsSymmetry.getITNumberFromSpaceGroupName("P23"),
                      "ITNumber from space group P23")
     self.assertEqual(196,
                      UtilsSymmetry.getITNumberFromSpaceGroupName("F23"),
                      "ITNumber from space group F23")
Exemple #6
0
    def run(self, inData):
        listImagePath = inData["imagePath"]
        prefix = UtilsImage.getPrefix(listImagePath[0])
        listSubWedge = self.getListSubWedge(inData)
        diffractionPlan = inData.get("diffractionPlan", {})
        sample = inData.get("sample", {})
        # Check if flux is present
        flux = None
        absorbedDoseRate = None
        experimentalCondition = inData.get("experimentalCondition", None)
        if experimentalCondition is not None:
            beam = experimentalCondition.get("beam", None)
            if beam is not None:
                flux = beam.get("flux", None)
                # if not "size" in beam:
                #     beam["size"] = listSubWedge[0]["experimentalCondition"]["beam"]["size"]
                beam["exposureTime"] = listSubWedge[0][
                    "experimentalCondition"]["beam"]["exposureTime"]
                beam["wavelength"] = listSubWedge[0]["experimentalCondition"][
                    "beam"]["wavelength"]
        # Convert images to CBF
        firstImage = listSubWedge[0]["image"][0]["path"]
        import os
        import pprint

        listH5ToCBF = []
        suffix = os.path.splitext(firstImage)[1]
        if suffix == ".h5":
            for subWedge in listSubWedge:
                imageList = subWedge["image"]
                for image in imageList:
                    imagePath = image["path"]
                    hdf5ImageNumber = UtilsImage.getImageNumber(imagePath)
                    inDataH5ToCBF = {
                        "hdf5File": imagePath,
                        "hdf5ImageNumber": hdf5ImageNumber,
                        "imageNumber": 1,
                        "forcedOutputDirectory":
                        str(self.getWorkingDirectory()),
                        "forcedOutputImageNumber": hdf5ImageNumber,
                    }
                    h5ToCBF = H5ToCBFTask(inData=inDataH5ToCBF)
                    h5ToCBF.start()
                    listH5ToCBF.append((image, h5ToCBF))
        # Join CBF creation
        for image, h5ToCBF in listH5ToCBF:
            h5ToCBF.join()
            image["path"] = h5ToCBF.outData["outputCBFFile"]
        pprint.pprint(listSubWedge)
        # Start indexing
        outDataIndexing, outDataGB, listSubWedge = self.indexing(
            prefix, listSubWedge, self.getWorkingDirectory())
        if outDataIndexing is not None and outDataGB is not None:
            listXdsAsciiHkl, correctLp, bkgpixCbf = self.integration(
                prefix, listSubWedge, outDataIndexing, outDataGB)
            if listXdsAsciiHkl is not None:
                # Check if Raddose should be run
                estimateRadiationDamage = self.checkEstimateRadiationDamage(
                    inData, flux)
                if estimateRadiationDamage:
                    # Check if forced space group
                    forcedSpaceGroup = None
                    numOperators = None
                    cell = None
                    if ("diffractionPlan" in inData and "forcedSpaceGroup"
                            in inData["diffractionPlan"]):
                        forcedSpaceGroup = inData["diffractionPlan"][
                            "forcedSpaceGroup"]
                        if forcedSpaceGroup is not None:
                            if forcedSpaceGroup != "":
                                forcedSpaceGroup = forcedSpaceGroup.replace(
                                    " ", "")
                                numOperators = UtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName(
                                    forcedSpaceGroup)
                            else:
                                forcedSpaceGroup = None
                    if forcedSpaceGroup is None:
                        # Get indexing space group IT number
                        if "resultIndexing" in outDataIndexing:
                            resultIndexing = outDataIndexing["resultIndexing"]
                            cell = resultIndexing["cell"]
                            if "spaceGroupNumber" in resultIndexing:
                                spaceGroupNumber = resultIndexing[
                                    "spaceGroupNumber"]
                                numOperators = UtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupITNumber(
                                    spaceGroupNumber)
                    if numOperators is None:
                        raise RuntimeError(
                            "Error when trying to determine number of symmetry operators!"
                        )
                    chemicalComposition = self.getDefaultChemicalComposition(
                        cell, numOperators)
                    numberOfImages = self.getNumberOfImages(listSubWedge)
                    sample = inData["sample"]
                    inDataRaddose = {
                        "experimentalCondition": experimentalCondition,
                        "chemicalComposition": chemicalComposition,
                        "sample": sample,
                        "cell": cell,
                        "numberOfImages": numberOfImages,
                        "numOperators": numOperators,
                    }
                    # import pprint
                    # pprint.pprint(inDataRaddose)
                    raddose = Raddose(inData=inDataRaddose,
                                      workingDirectorySuffix=prefix)
                    raddose.execute()
                    if raddose.isSuccess():
                        absorbedDoseRate = raddose.outData["absorbedDoseRate"]
                inDataBest = {
                    "diffractionPlan": diffractionPlan,
                    "sample": sample,
                    "subWedge": listSubWedge,
                    "xdsAsciiHkl": listXdsAsciiHkl,
                    "bkgpixCbf": bkgpixCbf,
                    "correctLp": correctLp,
                    "crystalAbsorbedDoseRate": absorbedDoseRate,
                }
                bestTask = Best(inData=inDataBest,
                                workingDirectorySuffix=prefix)
                bestTask.execute()
Exemple #7
0
 def run(self, inData):
     outData = {}
     listImagePath = inData["imagePath"]
     prefix = UtilsImage.getPrefix(listImagePath[0])
     listSubWedge = self.getListSubWedge(inData)
     diffractionPlan = inData.get("diffractionPlan", {})
     sample = inData.get("sample", {})
     # Check if flux is present
     flux = None
     absorbedDoseRate = None
     experimentalCondition = inData.get("experimentalCondition", None)
     if experimentalCondition is not None:
         beam = experimentalCondition.get("beam", None)
         if beam is not None:
             flux = beam.get("flux", None)
             # if not "size" in beam:
             #     beam["size"] = listSubWedge[0]["experimentalCondition"]["beam"]["size"]
             beam["exposureTime"] = listSubWedge[0]["experimentalCondition"]["beam"]["exposureTime"]
             beam["wavelength"] = listSubWedge[0]["experimentalCondition"]["beam"]["wavelength"]
     # Start indexing
     outDataIndexing, outDataGB = self.indexing(prefix, listSubWedge)
     if outDataIndexing is not None and outDataGB is not None:
         listXdsAsciiHkl, correctLp, bkgpixCbf = self.integration(
             prefix, listSubWedge, outDataIndexing, outDataGB)
         if listXdsAsciiHkl is not None:
             # Check if Raddose should be run
             estimateRadiationDamage = self.checkEstimateRadiationDamage(inData, flux)
             if estimateRadiationDamage:
                 # Check if forced space group
                 forcedSpaceGroup = None
                 numOperators = None
                 cell = None
                 if "diffractionPlan" in inData and "forcedSpaceGroup" in inData["diffractionPlan"]:
                     forcedSpaceGroup = inData["diffractionPlan"]["forcedSpaceGroup"]
                     if forcedSpaceGroup is not None:
                         if forcedSpaceGroup != "":
                             forcedSpaceGroup = forcedSpaceGroup.replace(" ", "")
                             numOperators = UtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupName(forcedSpaceGroup)
                         else:
                             forcedSpaceGroup = None
                 if forcedSpaceGroup is None:
                     # Get indexing space group IT number
                     if "resultIndexing" in outDataIndexing:
                         resultIndexing = outDataIndexing["resultIndexing"]
                         cell = resultIndexing["cell"]
                         if "spaceGroupNumber" in resultIndexing:
                             spaceGroupNumber = resultIndexing["spaceGroupNumber"]
                             numOperators = UtilsSymmetry.getNumberOfSymmetryOperatorsFromSpaceGroupITNumber(spaceGroupNumber)
                 if numOperators is None:
                     raise RuntimeError("Error when trying to determine number of symmetry operators!")
                 chemicalComposition = self.getDefaultChemicalComposition(cell, numOperators)
                 numberOfImages = self.getNumberOfImages(listSubWedge)
                 sample = inData["sample"]
                 inDataRaddose = {
                     "experimentalCondition": experimentalCondition,
                     "chemicalComposition": chemicalComposition,
                     "sample": sample,
                     "cell": cell,
                     "numberOfImages": numberOfImages,
                     "numOperators": numOperators
                 }
                 # import pprint
                 # pprint.pprint(inDataRaddose)
                 raddose = Raddose(
                     inData=inDataRaddose,
                     workingDirectorySuffix=prefix)
                 raddose.execute()
                 if raddose.isSuccess():
                     absorbedDoseRate = raddose.outData["absorbedDoseRate"]
             inDataBest = {
                 "diffractionPlan": diffractionPlan,
                 "sample": sample,
                 "subWedge": listSubWedge,
                 "xdsAsciiHkl": listXdsAsciiHkl,
                 "bkgpixCbf": bkgpixCbf,
                 "correctLp": correctLp,
                 "crystalAbsorbedDoseRate": absorbedDoseRate
             }
             bestTask = Best(
                 inData=inDataBest,
                 workingDirectorySuffix=prefix
             )
             bestTask.execute()