def testCheckParameters(self):
        xsDataInput = XSDataInputAlignStack()
        xsDataInput.setHDF5File(XSDataFile())
        xsDataInput.setInternalHDF5Path(XSDataString())
        edPluginExecAlignStack = self.createPlugin()

        edPluginExecAlignStack.setDataInput(xsDataInput)
        edPluginExecAlignStack.checkParameters()
Example #2
0
 def preProcess(self, _edObject=None):
     EDPluginControl.preProcess(self)
     self.DEBUG("EDPluginControlFullFieldXASv1_0.preProcess")
     sdi = self.dataInput
     self.index = sdi.index.value
     self.HDF5filename = sdi.HDF5File
     self.internalHDF5Path = sdi.internalHDF5Path
     self.xsdMeasureOffset = sdi.measureOffset
     if sdi.energy is not None:
         self.energy = sdi.energy.value
     if sdi.reference is not None:
         self.reference = sdi.reference.value
     self.xsdNormalizedFilename = sdi.saveNormalized
     self.xsdAlignStack = XSDataInputAlignStack()
     if sdi.dontAlign is not None:
         self.xsdAlignStack.dontAlign = sdi.dontAlign
Example #3
0
    def testCheckParameters(self):
        xsDataInput = XSDataInputAlignStack()
        xsDataInput.setHDF5File(XSDataFile())
        xsDataInput.setInternalHDF5Path(XSDataString())
        edPluginExecAlignStack = self.createPlugin()

        edPluginExecAlignStack.setDataInput(xsDataInput)
        edPluginExecAlignStack.checkParameters()
 def preProcess(self, _edObject=None):
     EDPluginControl.preProcess(self)
     self.DEBUG("EDPluginControlFullFieldXASv1_0.preProcess")
     sdi = self.dataInput
     self.index = sdi.index.value
     self.HDF5filename = sdi.HDF5File
     self.internalHDF5Path = sdi.internalHDF5Path
     self.xsdMeasureOffset = sdi.measureOffset
     if sdi.energy is not None:
         self.energy = sdi.energy.value
     if sdi.reference is not None:
         self.reference = sdi.reference.value
     self.xsdNormalizedFilename = sdi.saveNormalized
     self.xsdAlignStack = XSDataInputAlignStack()
     if sdi.dontAlign is not None:
         self.xsdAlignStack.dontAlign = sdi.dontAlign
class EDPluginControlFullFieldXASv1_0(EDPluginControl):
    """
    Plugin to control  Full Field XRay Absorption Spectroscopy Experiment, ID21 ESRF
    """
    _semaphore = Semaphore()
    TITLE = "FullField XANES mapping"
    start_time = time.time()
    DSenergy = "energy"
    DSstack = "data"
    energyAttr = {"unit":"keV",
                  "long_name": "Energy of the monochromated beam",
                  "interpretation": "scalar",
                  "axis" : "1"
                  }
    maxIntAttr = {"long_name": "Mean of the last percentil on the frame",
                  "interpretation": "scalar",
                  "monitor": "1"
                  }
    dataAttr = {"axes":DSenergy,
                "long_name":TITLE,
                "interpretation":"image",
                "signal":1}
    NXdataAttr = {"NX_class":"NXdata"}
    NXdata = "NXdata"
    NXentryAttr = {"NX_class":"NXentry",
                   "index":"1"}


    def __init__(self):
        """
        """
        EDPluginControl.__init__(self)
        self.setXSDataInputClass(XSDataInputFullFieldXAS)
        self.__strControlledNormalize = "EDPluginExecNormalizeImagev1_2"
        self.__strControlledAlign = "EDPluginControlAlignStackv1_0"
        self.index = None
        self.energy = None
        self.reference = 0
        self.HDF5filename = None
        self.internalHDF5Path = None
        self.xsdMeasureOffset = None
        self.xsdNormalizedFilename = None
        self.xsdAlignStack = None

    def checkParameters(self):
        """
        Checks the mandatory parameters.
        """
        self.DEBUG("EDPluginControlFullFieldXASv1_0.checkParameters")
        self.checkMandatoryParameters(self.dataInput, "Data Input is None")
        self.checkMandatoryParameters(self.dataInput.index, "No index given for data input ")
        self.checkMandatoryParameters(self.dataInput.HDF5File, "No HDF5 file given for data input")
        self.checkMandatoryParameters(self.dataInput.internalHDF5Path, "No HDF5 internal path given for data input")


    def preProcess(self, _edObject=None):
        EDPluginControl.preProcess(self)
        self.DEBUG("EDPluginControlFullFieldXASv1_0.preProcess")
        sdi = self.dataInput
        self.index = sdi.index.value
        self.HDF5filename = sdi.HDF5File
        self.internalHDF5Path = sdi.internalHDF5Path
        self.xsdMeasureOffset = sdi.measureOffset
        if sdi.energy is not None:
            self.energy = sdi.energy.value
        if sdi.reference is not None:
            self.reference = sdi.reference.value
        self.xsdNormalizedFilename = sdi.saveNormalized
        self.xsdAlignStack = XSDataInputAlignStack()
        if sdi.dontAlign is not None:
            self.xsdAlignStack.dontAlign = sdi.dontAlign


    def process(self, _edObject=None):
        EDPluginControl.process(self)
        h5Grp = EDPluginHDF5.createStructure(self.HDF5filename.path.value, self.internalHDF5Path.value)
        self.DEBUG("EDPluginControlFullFieldXASv1_0.process")
        self.makeHDF5OffsetStructure()
        if self.energy is not None:
            self.makeHDF5EnergyStructure()
        edPluginExecNormalize = self.loadPlugin(self.__strControlledNormalize)
        edPluginExecNormalize.connectSUCCESS(self.doSuccessExecNormalize)
        edPluginExecNormalize.connectFAILURE(self.doFailureExecNormalize)
        sdi = self.dataInput
        xsdInNorm = XSDataInputNormalize(data=sdi.data,
                                         flat=sdi.flat,
                                         dark=sdi.dark,
                                         dataScaleFactor=sdi.dataScaleFactor,
                                         darkScaleFactor=sdi.darkScaleFactor,
                                         flatScaleFactor=sdi.flatScaleFactor)
        if self.xsdNormalizedFilename is not None:
            xsdInNorm.output = XSDataImageExt(path=self.xsdNormalizedFilename.path)
        else:
            xsdInNorm.output = XSDataImageExt(shared=XSDataString("Normalized-%06i" % sdi.index.value))
        edPluginExecNormalize.dataInput = xsdInNorm
        edPluginExecNormalize.executeSynchronous()

        if self.xsdAlignStack is not None:
            edPluginAlign = self.loadPlugin(self.__strControlledAlign)
            edPluginAlign.dataInput = self.xsdAlignStack
            edPluginAlign.connectSUCCESS(self.doSuccessExecAlign)
            edPluginAlign.connectFAILURE(self.doFailureExecAlign)
            edPluginAlign.executeSynchronous()


    def postProcess(self, _edObject=None):
        EDPluginControl.postProcess(self)
        self.DEBUG("EDPluginControlFullFieldXASv1_0.postProcess")
        # Create some output data
        self.synchronizePlugins()
        self.makeHDF5NeXus()
        xsDataResult = XSDataResultFullFieldXAS()
        xsDataResult.setHDF5File(self.dataInput.getHDF5File())
        xsDataResult.setInternalHDF5Path(self.dataInput.getInternalHDF5Path())
        self.setDataOutput(xsDataResult)
        self.emptyListOfLoadedPlugin()
        self.xsdMeasureOffset = None
        self.xsdNormalizedFilename = None
        self.xsdAlignStack = None


    def doSuccessExecNormalize(self, _edPlugin=None):
        with self.locked():
            self.DEBUG("EDPluginControlFullFieldXASv1_0.doSuccessExecNormalize")
            self.retrieveSuccessMessages(_edPlugin, "EDPluginControlFullFieldXASv1_0.doSuccessExecNormalize")
            self.xsdAlignStack.setMeasureOffset(self.xsdMeasureOffset)
            output = _edPlugin.dataOutput.output
            self.xsdAlignStack.images = [output]
            data = EDUtilsArray.getArray(output)
            data.shape = -1

            self.xsdAlignStack.index = [XSDataInteger(self.index)]
            self.xsdAlignStack.frameReference = XSDataInteger(self.reference)
            self.xsdAlignStack.HDF5File = self.dataInput.getHDF5File()
            self.xsdAlignStack.internalHDF5Path = self.internalHDF5Path

            internalHDF5Path = self.internalHDF5Path.value
            if not internalHDF5Path.startswith("/"):
                internalHDF5Path = "/" + internalHDF5Path
            keyValuePair1 = XSDataKeyValuePair(key=XSDataString("axes"), value=XSDataString(self.DSenergy))
            keyValuePair2 = XSDataKeyValuePair(key=XSDataString("long_name"), value=XSDataString(self.TITLE))
            keyValuePair3 = XSDataKeyValuePair(key=XSDataString("interpretation"), value=XSDataString("image"))
            keyValuePair4 = XSDataKeyValuePair(key=XSDataString("signal"), value=XSDataString("1"))

            xsAttrDataset = XSDataHDF5Attributes(h5path=XSDataString(posixpath.join(internalHDF5Path, self.DSstack)),
                            metadata=XSDataDictionary([XSDataKeyValuePair(key=XSDataString(k), value=XSDataString(v)) for k, v in self.dataAttr.items()]))

#            NXdata is treated in this file not in HDF5 plugins
#            xsAttrNXdata = XSDataHDF5Attributes(h5path=XSDataString(posixpath.join(internalHDF5Path, "NXdata")), \
#                            metadata=XSDataDictionary([XSDataKeyValuePair(key=XSDataString(k), value=XSDataString(v)) for k, v in self.NXdataAttr.items()]))

            xsAttrEntry = XSDataHDF5Attributes(h5path=XSDataString(internalHDF5Path),
                            metadata=XSDataDictionary([XSDataKeyValuePair(key=XSDataString(k), value=XSDataString(v)) for k, v in self.NXentryAttr.items()]))

            self.xsdAlignStack.extraAttributes = [xsAttrDataset, xsAttrEntry]

            ########################################################################
            # Selecte the mean of last centile
            ########################################################################
            data.sort()
            fMaxSignal = data[int(0.99 * len(data)):].mean()
            self.makeHDF5MaxIntStructure(fMaxSignal)

    def doFailureExecNormalize(self, _edPlugin=None):
        self.DEBUG("EDPluginControlFullFieldXASv1_0.doFailureExecNormalize")
        self.retrieveFailureMessages(_edPlugin, "EDPluginControlFullFieldXASv1_0.doFailureExecNormalize")
        self.setFailure()


    def doSuccessExecAlign(self, _edPlugin=None):
        self.DEBUG("EDPluginControlFullFieldXASv1_0.doSuccessExecAlign")
        self.retrieveSuccessMessages(_edPlugin, "EDPluginControlFullFieldXASv1_0.doSuccessExecAlign")


    def doFailureExecAlign(self, _edPlugin=None):
        self.DEBUG("EDPluginControlFullFieldXASv1_0.doFailureExecAlign")
        self.retrieveFailureMessages(_edPlugin, "EDPluginControlFullFieldXASv1_0.doFailureExecAlign")
        self.setFailure()


    def makeHDF5EnergyStructure(self):
        self.DEBUG("EDPluginControlFullFieldXASv1_0.makeHDF5EnergyStructure")
        h5Grp = EDPluginHDF5.createStructure(self.HDF5filename.path.value, self.internalHDF5Path.value)
        with EDPluginHDF5.getFileLock(self.HDF5filename.path.value):
            if self.DSenergy in h5Grp:
                dataset = h5Grp[self.DSenergy]
            else:
                dataset = h5Grp.create_dataset(self.DSenergy, shape=(1 + max(self.index, self.reference),), dtype="float32", maxshape=(None,), chunks=(1,))
                for key in  EDPluginControlFullFieldXASv1_0.energyAttr:
                    dataset.attrs.create(key, EDPluginControlFullFieldXASv1_0.energyAttr[key])
            if self.index >= dataset.shape[0]:
                dataset.resize((self.index + 1,))
            dataset[self.index] = self.energy


    def makeHDF5MaxIntStructure(self, _fMaxIntensity):
        self.DEBUG("EDPluginControlFullFieldXASv1_0.makeHDF5MaxIntStructure")
        h5Grp = EDPluginHDF5.createStructure(self.HDF5filename.path.value, self.internalHDF5Path.value)
        with EDPluginHDF5.getFileLock(self.HDF5filename.path.value):
            #Seems strange to redefine h5Grp but if there is a flush in between: h5Grp could be closed 
            h5Grp = EDPluginHDF5.getHDF5File(self.HDF5filename.path.value)[self.internalHDF5Path.value]
            if "maxInt" in h5Grp:
                dataset = h5Grp["maxInt"]
            else:
                dataset = h5Grp.create_dataset("maxInt", shape=(1 + max(self.index, self.reference),), dtype="float32", maxshape=(None,), chunks=(1,))
                for key in  EDPluginControlFullFieldXASv1_0.maxIntAttr:
                    dataset.attrs.create(key, EDPluginControlFullFieldXASv1_0.maxIntAttr[key])
            if self.index >= dataset.shape[0]:
                dataset.resize((self.index + 1,))
            dataset[self.index] = _fMaxIntensity


    def makeHDF5NeXus(self):
        self.DEBUG("EDPluginControlFullFieldXASv1_0.makeHDF5NeXus")
        with EDPluginHDF5.getFileLock(self.HDF5filename.path.value):
            #Seems strange to redefine h5Grp but if there is a flush in between: h5Grp could be closed 
            entry = EDPluginHDF5.getHDF5File(self.HDF5filename.path.value)[self.internalHDF5Path.value]
            if not "title" in  entry:
                entry.create_dataset("title", data=self.TITLE)
            if not "program" in  entry:
                entry.create_dataset("program", data="EDNA EDPluginControlFullFieldXASv1_0")
            if not "start_time" in  entry:
                entry.create_dataset("start_time", data=EDPluginHDF5.getIsoTime(self.start_time))
            ########################################################################
            # Huge hack: for scalar modification: use [()] to refer to the data !!!
            ########################################################################
            if "end_time" in  entry:
                entry["end_time"][()] = EDPluginHDF5.getIsoTime()
            else:
                entry.create_dataset("end_time", data=EDPluginHDF5.getIsoTime())
            if "duration" in  entry:
                entry["duration"][()] = time.time() - self.start_time
            else:
                entry.create_dataset("duration", data=time.time() - self.start_time, dtype="float")
            if self.NXdata not in entry:
                nxdata = entry.create_group(self.NXdata)
                for k, v in self.NXdataAttr.items():
                     nxdata.attrs[k] = v
            else:
                nxdata = entry[self.NXdata]
            for ds in [self.DSstack, self.DSenergy]:
                if (ds in entry) and (ds not in  nxdata):
                    nxdata[ds] = entry[ds]



    def makeHDF5OffsetStructure(self):
        self.DEBUG("EDPluginControlFullFieldXASv1_0.makeHDF5OffsetStructure")
        with EDPluginHDF5.getFileLock(self.HDF5filename.path.value):
            h5Grp = EDPluginHDF5.getHDF5File(self.HDF5filename.path.value)[self.internalHDF5Path.value]
            if "Offsets" in h5Grp:
                dataset = h5Grp["Offsets"]
            else:
                dataset = h5Grp.create_dataset("Offsets", shape=(1 + max(self.index, self.reference), 2), dtype="float32", maxshape=(None, 2), chunks=(1, 2))
            if self.index >= dataset.shape[0]:
                dataset.resize((self.index + 1, 2))
Example #6
0
class EDPluginControlFullFieldXASv1_0(EDPluginControl):
    """
    Plugin to control  Full Field XRay Absorption Spectroscopy Experiment, ID21 ESRF
    """
    _semaphore = Semaphore()
    TITLE = "FullField XANES mapping"
    start_time = time.time()
    DSenergy = "energy"
    DSstack = "data"
    energyAttr = {
        "unit": "keV",
        "long_name": "Energy of the monochromated beam",
        "interpretation": "scalar",
        "axis": "1"
    }
    maxIntAttr = {
        "long_name": "Mean of the last percentil on the frame",
        "interpretation": "scalar",
        "monitor": "1"
    }
    dataAttr = {
        "axes": DSenergy,
        "long_name": TITLE,
        "interpretation": "image",
        "signal": 1
    }
    NXdataAttr = {"NX_class": "NXdata"}
    NXdata = "NXdata"
    NXentryAttr = {"NX_class": "NXentry", "index": "1"}

    def __init__(self):
        """
        """
        EDPluginControl.__init__(self)
        self.setXSDataInputClass(XSDataInputFullFieldXAS)
        self.__strControlledNormalize = "EDPluginExecNormalizeImagev1_2"
        self.__strControlledAlign = "EDPluginControlAlignStackv1_0"
        self.index = None
        self.energy = None
        self.reference = 0
        self.HDF5filename = None
        self.internalHDF5Path = None
        self.xsdMeasureOffset = None
        self.xsdNormalizedFilename = None
        self.xsdAlignStack = None

    def checkParameters(self):
        """
        Checks the mandatory parameters.
        """
        self.DEBUG("EDPluginControlFullFieldXASv1_0.checkParameters")
        self.checkMandatoryParameters(self.dataInput, "Data Input is None")
        self.checkMandatoryParameters(self.dataInput.index,
                                      "No index given for data input ")
        self.checkMandatoryParameters(self.dataInput.HDF5File,
                                      "No HDF5 file given for data input")
        self.checkMandatoryParameters(
            self.dataInput.internalHDF5Path,
            "No HDF5 internal path given for data input")

    def preProcess(self, _edObject=None):
        EDPluginControl.preProcess(self)
        self.DEBUG("EDPluginControlFullFieldXASv1_0.preProcess")
        sdi = self.dataInput
        self.index = sdi.index.value
        self.HDF5filename = sdi.HDF5File
        self.internalHDF5Path = sdi.internalHDF5Path
        self.xsdMeasureOffset = sdi.measureOffset
        if sdi.energy is not None:
            self.energy = sdi.energy.value
        if sdi.reference is not None:
            self.reference = sdi.reference.value
        self.xsdNormalizedFilename = sdi.saveNormalized
        self.xsdAlignStack = XSDataInputAlignStack()
        if sdi.dontAlign is not None:
            self.xsdAlignStack.dontAlign = sdi.dontAlign

    def process(self, _edObject=None):
        EDPluginControl.process(self)
        h5Grp = EDPluginHDF5.createStructure(self.HDF5filename.path.value,
                                             self.internalHDF5Path.value)
        self.DEBUG("EDPluginControlFullFieldXASv1_0.process")
        self.makeHDF5OffsetStructure()
        if self.energy is not None:
            self.makeHDF5EnergyStructure()
        edPluginExecNormalize = self.loadPlugin(self.__strControlledNormalize)
        edPluginExecNormalize.connectSUCCESS(self.doSuccessExecNormalize)
        edPluginExecNormalize.connectFAILURE(self.doFailureExecNormalize)
        sdi = self.dataInput
        xsdInNorm = XSDataInputNormalize(data=sdi.data,
                                         flat=sdi.flat,
                                         dark=sdi.dark,
                                         dataScaleFactor=sdi.dataScaleFactor,
                                         darkScaleFactor=sdi.darkScaleFactor,
                                         flatScaleFactor=sdi.flatScaleFactor)
        if self.xsdNormalizedFilename is not None:
            xsdInNorm.output = XSDataImageExt(
                path=self.xsdNormalizedFilename.path)
        else:
            xsdInNorm.output = XSDataImageExt(
                shared=XSDataString("Normalized-%06i" % sdi.index.value))
        edPluginExecNormalize.dataInput = xsdInNorm
        edPluginExecNormalize.executeSynchronous()

        if self.xsdAlignStack is not None:
            edPluginAlign = self.loadPlugin(self.__strControlledAlign)
            edPluginAlign.dataInput = self.xsdAlignStack
            edPluginAlign.connectSUCCESS(self.doSuccessExecAlign)
            edPluginAlign.connectFAILURE(self.doFailureExecAlign)
            edPluginAlign.executeSynchronous()

    def postProcess(self, _edObject=None):
        EDPluginControl.postProcess(self)
        self.DEBUG("EDPluginControlFullFieldXASv1_0.postProcess")
        # Create some output data
        self.synchronizePlugins()
        self.makeHDF5NeXus()
        xsDataResult = XSDataResultFullFieldXAS()
        xsDataResult.setHDF5File(self.dataInput.getHDF5File())
        xsDataResult.setInternalHDF5Path(self.dataInput.getInternalHDF5Path())
        self.setDataOutput(xsDataResult)
        self.emptyListOfLoadedPlugin()
        self.xsdMeasureOffset = None
        self.xsdNormalizedFilename = None
        self.xsdAlignStack = None

    def doSuccessExecNormalize(self, _edPlugin=None):
        with self.locked():
            self.DEBUG(
                "EDPluginControlFullFieldXASv1_0.doSuccessExecNormalize")
            self.retrieveSuccessMessages(
                _edPlugin,
                "EDPluginControlFullFieldXASv1_0.doSuccessExecNormalize")
            self.xsdAlignStack.setMeasureOffset(self.xsdMeasureOffset)
            output = _edPlugin.dataOutput.output
            self.xsdAlignStack.images = [output]
            data = EDUtilsArray.getArray(output)
            data.shape = -1

            self.xsdAlignStack.index = [XSDataInteger(self.index)]
            self.xsdAlignStack.frameReference = XSDataInteger(self.reference)
            self.xsdAlignStack.HDF5File = self.dataInput.getHDF5File()
            self.xsdAlignStack.internalHDF5Path = self.internalHDF5Path

            internalHDF5Path = self.internalHDF5Path.value
            if not internalHDF5Path.startswith("/"):
                internalHDF5Path = "/" + internalHDF5Path
            keyValuePair1 = XSDataKeyValuePair(key=XSDataString("axes"),
                                               value=XSDataString(
                                                   self.DSenergy))
            keyValuePair2 = XSDataKeyValuePair(key=XSDataString("long_name"),
                                               value=XSDataString(self.TITLE))
            keyValuePair3 = XSDataKeyValuePair(
                key=XSDataString("interpretation"),
                value=XSDataString("image"))
            keyValuePair4 = XSDataKeyValuePair(key=XSDataString("signal"),
                                               value=XSDataString("1"))

            xsAttrDataset = XSDataHDF5Attributes(
                h5path=XSDataString(
                    posixpath.join(internalHDF5Path, self.DSstack)),
                metadata=XSDataDictionary([
                    XSDataKeyValuePair(key=XSDataString(k),
                                       value=XSDataString(v))
                    for k, v in self.dataAttr.items()
                ]))

            #            NXdata is treated in this file not in HDF5 plugins
            #            xsAttrNXdata = XSDataHDF5Attributes(h5path=XSDataString(posixpath.join(internalHDF5Path, "NXdata")), \
            #                            metadata=XSDataDictionary([XSDataKeyValuePair(key=XSDataString(k), value=XSDataString(v)) for k, v in self.NXdataAttr.items()]))

            xsAttrEntry = XSDataHDF5Attributes(
                h5path=XSDataString(internalHDF5Path),
                metadata=XSDataDictionary([
                    XSDataKeyValuePair(key=XSDataString(k),
                                       value=XSDataString(v))
                    for k, v in self.NXentryAttr.items()
                ]))

            self.xsdAlignStack.extraAttributes = [xsAttrDataset, xsAttrEntry]

            ########################################################################
            # Selecte the mean of last centile
            ########################################################################
            data.sort()
            fMaxSignal = data[int(0.99 * len(data)):].mean()
            self.makeHDF5MaxIntStructure(fMaxSignal)

    def doFailureExecNormalize(self, _edPlugin=None):
        self.DEBUG("EDPluginControlFullFieldXASv1_0.doFailureExecNormalize")
        self.retrieveFailureMessages(
            _edPlugin,
            "EDPluginControlFullFieldXASv1_0.doFailureExecNormalize")
        self.setFailure()

    def doSuccessExecAlign(self, _edPlugin=None):
        self.DEBUG("EDPluginControlFullFieldXASv1_0.doSuccessExecAlign")
        self.retrieveSuccessMessages(
            _edPlugin, "EDPluginControlFullFieldXASv1_0.doSuccessExecAlign")

    def doFailureExecAlign(self, _edPlugin=None):
        self.DEBUG("EDPluginControlFullFieldXASv1_0.doFailureExecAlign")
        self.retrieveFailureMessages(
            _edPlugin, "EDPluginControlFullFieldXASv1_0.doFailureExecAlign")
        self.setFailure()

    def makeHDF5EnergyStructure(self):
        self.DEBUG("EDPluginControlFullFieldXASv1_0.makeHDF5EnergyStructure")
        h5Grp = EDPluginHDF5.createStructure(self.HDF5filename.path.value,
                                             self.internalHDF5Path.value)
        with EDPluginHDF5.getFileLock(self.HDF5filename.path.value):
            if self.DSenergy in h5Grp:
                dataset = h5Grp[self.DSenergy]
            else:
                dataset = h5Grp.create_dataset(
                    self.DSenergy,
                    shape=(1 + max(self.index, self.reference), ),
                    dtype="float32",
                    maxshape=(None, ),
                    chunks=(1, ))
                for key in EDPluginControlFullFieldXASv1_0.energyAttr:
                    dataset.attrs.create(
                        key, EDPluginControlFullFieldXASv1_0.energyAttr[key])
            if self.index >= dataset.shape[0]:
                dataset.resize((self.index + 1, ))
            dataset[self.index] = self.energy

    def makeHDF5MaxIntStructure(self, _fMaxIntensity):
        self.DEBUG("EDPluginControlFullFieldXASv1_0.makeHDF5MaxIntStructure")
        h5Grp = EDPluginHDF5.createStructure(self.HDF5filename.path.value,
                                             self.internalHDF5Path.value)
        with EDPluginHDF5.getFileLock(self.HDF5filename.path.value):
            #Seems strange to redefine h5Grp but if there is a flush in between: h5Grp could be closed
            h5Grp = EDPluginHDF5.getHDF5File(
                self.HDF5filename.path.value)[self.internalHDF5Path.value]
            if "maxInt" in h5Grp:
                dataset = h5Grp["maxInt"]
            else:
                dataset = h5Grp.create_dataset(
                    "maxInt",
                    shape=(1 + max(self.index, self.reference), ),
                    dtype="float32",
                    maxshape=(None, ),
                    chunks=(1, ))
                for key in EDPluginControlFullFieldXASv1_0.maxIntAttr:
                    dataset.attrs.create(
                        key, EDPluginControlFullFieldXASv1_0.maxIntAttr[key])
            if self.index >= dataset.shape[0]:
                dataset.resize((self.index + 1, ))
            dataset[self.index] = _fMaxIntensity

    def makeHDF5NeXus(self):
        self.DEBUG("EDPluginControlFullFieldXASv1_0.makeHDF5NeXus")
        with EDPluginHDF5.getFileLock(self.HDF5filename.path.value):
            #Seems strange to redefine h5Grp but if there is a flush in between: h5Grp could be closed
            entry = EDPluginHDF5.getHDF5File(
                self.HDF5filename.path.value)[self.internalHDF5Path.value]
            if not "title" in entry:
                entry.create_dataset("title", data=self.TITLE)
            if not "program" in entry:
                entry.create_dataset(
                    "program", data="EDNA EDPluginControlFullFieldXASv1_0")
            if not "start_time" in entry:
                entry.create_dataset("start_time",
                                     data=EDPluginHDF5.getIsoTime(
                                         self.start_time))
            ########################################################################
            # Huge hack: for scalar modification: use [()] to refer to the data !!!
            ########################################################################
            if "end_time" in entry:
                entry["end_time"][()] = EDPluginHDF5.getIsoTime()
            else:
                entry.create_dataset("end_time",
                                     data=EDPluginHDF5.getIsoTime())
            if "duration" in entry:
                entry["duration"][()] = time.time() - self.start_time
            else:
                entry.create_dataset("duration",
                                     data=time.time() - self.start_time,
                                     dtype="float")
            if self.NXdata not in entry:
                nxdata = entry.create_group(self.NXdata)
                for k, v in self.NXdataAttr.items():
                    nxdata.attrs[k] = v
            else:
                nxdata = entry[self.NXdata]
            for ds in [self.DSstack, self.DSenergy]:
                if (ds in entry) and (ds not in nxdata):
                    nxdata[ds] = entry[ds]

    def makeHDF5OffsetStructure(self):
        self.DEBUG("EDPluginControlFullFieldXASv1_0.makeHDF5OffsetStructure")
        with EDPluginHDF5.getFileLock(self.HDF5filename.path.value):
            h5Grp = EDPluginHDF5.getHDF5File(
                self.HDF5filename.path.value)[self.internalHDF5Path.value]
            if "Offsets" in h5Grp:
                dataset = h5Grp["Offsets"]
            else:
                dataset = h5Grp.create_dataset(
                    "Offsets",
                    shape=(1 + max(self.index, self.reference), 2),
                    dtype="float32",
                    maxshape=(None, 2),
                    chunks=(1, 2))
            if self.index >= dataset.shape[0]:
                dataset.resize((self.index + 1, 2))