Beispiel #1
0
def create_general_top(fname):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = nwb.create_identifier("general top test")
    settings["overwrite"] = True
    settings["description"] = "test top-level elements in /general"
    neurodata = nwb.NWB(**settings)
    #
    neurodata.set_metadata(DATA_COLLECTION, "DATA_COLLECTION")
    neurodata.set_metadata(EXPERIMENT_DESCRIPTION, "EXPERIMENT_DESCRIPTION")
    neurodata.set_metadata(EXPERIMENTER, "EXPERIMENTER")
    neurodata.set_metadata(INSTITUTION, "INSTITUTION")
    neurodata.set_metadata(LAB, "LAB")
    neurodata.set_metadata(NOTES, "NOTES")
    neurodata.set_metadata(PROTOCOL, "PROTOCOL")
    neurodata.set_metadata(PHARMACOLOGY, "PHARMACOLOGY")
    neurodata.set_metadata(RELATED_PUBLICATIONS, "RELATED_PUBLICATIONS")
    neurodata.set_metadata(SESSION_ID, "SESSION_ID")
    neurodata.set_metadata(SLICES, "SLICES")
    neurodata.set_metadata(STIMULUS, "STIMULUS")
    neurodata.set_metadata(SURGERY, "SURGERY")
    neurodata.set_metadata(VIRUS, "VIRUS")
    #
    neurodata.set_metadata_from_file("source_script", __file__)
    #
    neurodata.close()
Beispiel #2
0
def create_isi_iface(fname, name):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = nwb.create_identifier("reference image test")
    settings["overwrite"] = True
    settings["description"] = "reference image test"
    neurodata = nwb.NWB(**settings)
    module = neurodata.create_module(name)
    iface = module.create_interface("ImagingRetinotopy")
    iface.add_axis_1_phase_map([[1.0, 1.1, 1.2], [2.0, 2.1, 2.2]], "altitude",
                               .1, .1)
    iface.add_axis_2_phase_map([[3.0, 3.1, 3.2], [4.0, 4.1, 4.2]],
                               "azimuth",
                               .1,
                               .1,
                               unit="degrees")
    iface.add_axis_1_power_map([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]], .1, .1)
    iface.add_sign_map([[-.1, .2, -.3], [.4, -.5, .6]])
    iface.add_vasculature_image([[1, 0, 129], [2, 144, 0]],
                                height=.22,
                                width=.35)
    iface.add_focal_depth_image([[1, 0, 129], [2, 144, 0]], bpp=8)
    iface.finalize()
    module.finalize()
    neurodata.close()
Beispiel #3
0
def create_general_extra(fname):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = nwb.create_identifier(
        "general extracellular test")
    settings["overwrite"] = True
    settings["description"] = "test elements in /general/extracellular_ephys"
    neurodata = nwb.NWB(**settings)
    #
    neurodata.set_metadata(EXTRA_ELECTRODE_MAP, [[1, 1, 1], [1, 2, 3]])
    neurodata.set_metadata(EXTRA_ELECTRODE_GROUP, ["p1", "p2"])
    neurodata.set_metadata(EXTRA_IMPEDANCE, [1.0e6, 2.0e6])
    neurodata.set_metadata(EXTRA_FILTERING, "EXTRA_FILTERING")
    neurodata.set_metadata(EXTRA_CUSTOM("EXTRA_CUSTOM"), "EXTRA_CUSTOM")

    neurodata.set_metadata(EXTRA_SHANK_DESCRIPTION("p1"), "DESCRIPTION")
    neurodata.set_metadata(EXTRA_SHANK_LOCATION("p1"), "LOCATION")
    neurodata.set_metadata(EXTRA_SHANK_DEVICE("p1"), "DEVICE")
    neurodata.set_metadata(EXTRA_SHANK_CUSTOM("p1", "extra_shank_custom"),
                           "EXTRA_SHANK_CUSTOM")
    #
    neurodata.set_metadata(EXTRA_SHANK_DESCRIPTION("p2"), "DESCRIPTION")
    neurodata.set_metadata(EXTRA_SHANK_LOCATION("p2"), "LOCATION")
    neurodata.set_metadata(EXTRA_SHANK_DEVICE("p2"), "DEVICE")
    neurodata.set_metadata(EXTRA_SHANK_CUSTOM("p2", "extra_shank_custom"),
                           "EXTRA_SHANK_CUSTOM")
    #
    neurodata.close()
Beispiel #4
0
def create_annotation_series(fname, name, target):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = nwb.create_identifier("annotation example")
    settings["overwrite"] = True
    settings["start_time"] = "Sat Jul 04 2015 3:14:16"
    settings["description"] = "Test file with AnnotationSeries"
    neurodata = nwb.NWB(**settings)
    #
    annot = neurodata.create_timeseries("AnnotationSeries", name, target)
    annot.set_description("This is an AnnotationSeries with sample data")
    annot.set_comment(
        "The comment and description fields can store arbitrary human-readable data"
    )
    annot.set_source("Observation of Dr. J Doe")
    #
    annot.add_annotation("Rat in bed, beginning sleep 1", 15.0)
    annot.add_annotation("Rat placed in enclosure, start run 1", 933.0)
    annot.add_annotation("Rat taken out of enclosure, end run 1", 1456.0)
    annot.add_annotation("Rat in bed, start sleep 2", 1461.0)
    annot.add_annotation("Rat placed in enclosure, start run 2", 2401.0)
    annot.add_annotation("Rat taken out of enclosure, end run 2", 3210.0)
    annot.add_annotation("Rat in bed, start sleep 3", 3218.0)
    annot.add_annotation("End sleep 3", 4193.0)
    #
    annot.finalize()
    neurodata.close()
Beispiel #5
0
def create_new_file(fname, identifier):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = nwb.create_identifier(identifier)
    settings["overwrite"] = True
    settings["description"] = "softlink test"
    return nwb.NWB(**settings)
Beispiel #6
0
def create_linked_series(fname, root):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = nwb.create_identifier("link test")
    settings["overwrite"] = True
    settings["description"] = "time series link test"
    settings["start_time"] = "Sat Jul 04 2015 3:14:16"
    neurodata = nwb.NWB(**settings)
    #
    first = neurodata.create_timeseries("TimeSeries", root+"1", "template")
    first.ignore_time()
    first.set_value("num_samples", 1)
    first.set_data([1], unit="parsec", conversion=1, resolution=1e-12)
    first.finalize()
    #
    second = neurodata.create_timeseries("TimeSeries", root+"2", "stimulus")
    second.set_time([2])
    second.set_value("num_samples", 1)
    second.set_data_as_link(first)
    second.finalize()
    #
    third = neurodata.create_timeseries("TimeSeries", root+"3", "acquisition")
    third.set_time_as_link(second)
    third.set_value("num_samples", 1)
    third.set_data([3], unit="parsec", conversion=1, resolution=1e-9)
    third.finalize()
    #
    neurodata.close()
Beispiel #7
0
def create_general_intra(fname):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = nwb.create_identifier("general optophysiology test")
    settings["overwrite"] = True
    settings["description"] = "test elements in /general/optophysiology"
    neurodata = nwb.NWB(**settings)
    #
    neurodata.set_metadata(IMAGE_CUSTOM("image_custom"), "IMAGE_CUSTOM")
    #
    neurodata.set_metadata(IMAGE_SITE_DESCRIPTION("p1"), "DESCRIPTION")
    # MANUAL CHECK
    # try storing string - -type system should balk
    #neurodata.set_metadata(IMAGE_SITE_MANIFOLD("p1"), "MANIFOLD")
    neurodata.set_metadata(IMAGE_SITE_MANIFOLD("p1"), [[[1,2,3],[2,3,4]],[[3,4,5],[4,5,6]]])
    neurodata.set_metadata(IMAGE_SITE_INDICATOR("p1"), "INDICATOR")
    neurodata.set_metadata(IMAGE_SITE_EXCITATION_LAMBDA("p1"), "EXCITATION_LAMBDA")
    neurodata.set_metadata(IMAGE_SITE_CHANNEL_LAMBDA("p1", "red"), "CHANNEL_LAMBDA")
    neurodata.set_metadata(IMAGE_SITE_CHANNEL_DESCRIPTION("p1", "red"), "DESCRIPTION")
    neurodata.set_metadata(IMAGE_SITE_CHANNEL_LAMBDA("p1", "green"), "CHANNEL_LAMBDA")
    neurodata.set_metadata(IMAGE_SITE_CHANNEL_DESCRIPTION("p1", "green"), "DESCRIPTION")
    neurodata.set_metadata(IMAGE_SITE_IMAGING_RATE("p1"), "IMAGING_RATE")
    neurodata.set_metadata(IMAGE_SITE_LOCATION("p1"), "LOCATION")
    neurodata.set_metadata(IMAGE_SITE_DEVICE("p1"), "DEVICE")
    neurodata.set_metadata(IMAGE_SITE_CUSTOM("p1", "image_site_custom"), "IMAGE_SITE_CUSTOM")
    #
    neurodata.close()
Beispiel #8
0
def create_iface_series(fname, newfile):
    settings = {}
    settings["filename"] = fname
    if newfile:
        settings["identifier"] = nwb.create_identifier(
            "interface timeseries example")
        settings["overwrite"] = True
        settings["start_time"] = "Sat Jul 04 2015 3:14:16"
        settings["description"] = "Test interface timeseries file"
    else:
        settings["modify"] = True
    neurodata = nwb.NWB(**settings)
    #
    mod = neurodata.create_module("test module")
    iface = mod.create_interface("BehavioralEvents")
    ts = neurodata.create_timeseries("TimeSeries", "Ones")
    ts.set_data(np.ones(10),
                unit="Event",
                conversion=1.0,
                resolution=float('nan'))
    ts.set_value("num_samples", 10)
    ts.set_time(np.arange(10))
    iface.add_timeseries(ts)
    iface.finalize()
    mod.finalize()
    #
    neurodata.close()
Beispiel #9
0
def create_empty_file(fname):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = nwb.create_identifier("UnitTimes example")
    settings["overwrite"] = True
    settings["start_time"] = "Sat Jul 04 2015 3:14:16"
    settings["description"] = "Test file with spike times in processing module"
    neurodata = nwb.NWB(**settings)
    return neurodata
Beispiel #10
0
def create_refimage(fname, name):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = nwb.create_identifier("reference image test")
    settings["overwrite"] = True
    settings["description"] = "reference image test"
    neurodata = nwb.NWB(**settings)
    neurodata.create_reference_image([1, 2, 3, 4, 5], name, "raw", "test")
    neurodata.close()
Beispiel #11
0
def create_refimage(fname, name):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = "vwx"
    settings["overwrite"] = True
    settings["description"] = "wxy"
    settings["start_time"] = "xyz"
    neurodata = nwb.NWB(**settings)
    neurodata.close()
Beispiel #12
0
def create_softlink_source(fname, name, target):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = nwb.create_identifier("softlink source")
    settings["overwrite"] = True
    settings["description"] = "time series no data test"
    settings["start_time"] = "Sat Jul 04 2015 3:14:16"
    neurodata = nwb.NWB(**settings)
    source = neurodata.create_timeseries("TimeSeries", name, target)
    source.set_data([234], unit="parsec", conversion=1, resolution=1e-3)
    source.set_time([123])
    source.finalize()
    neurodata.close()
Beispiel #13
0
def create_softlink_reader(fname, name, src_fname, src_name, target):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = nwb.create_identifier("softlink reader")
    settings["overwrite"] = True
    settings["description"] = "softlink test"
    neurodata = nwb.NWB(**settings)
    source = neurodata.create_timeseries("TimeSeries", name, target)
    source.set_data_as_remote_link(
        src_fname, "acquisition/timeseries/" + src_name + "/data")
    source.set_time([345])
    source.finalize()
    neurodata.close()
Beispiel #14
0
def create_notime_series(fname, name, target):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = nwb.create_identifier("notime example")
    settings["overwrite"] = True
    settings["start_time"] = "Sat Jul 04 2015 3:14:16"
    settings["description"] = "Test no time"
    neurodata = nwb.NWB(**settings)
    #
    notime = neurodata.create_timeseries("TimeSeries", name, target)
    notime.ignore_time()
    notime.set_data([0], unit="n/a", conversion=1, resolution=1)
    #
    notime.finalize()
    neurodata.close()
Beispiel #15
0
def create_startingtime_series(fname, name, target):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = nwb.create_identifier("starting time test")
    settings["overwrite"] = True
    settings["description"] = "time series starting time test"
    settings["start_time"] = "Sat Jul 04 2015 3:14:16"
    neurodata = nwb.NWB(**settings)
    #
    stime = neurodata.create_timeseries("TimeSeries", name, target)
    stime.set_data([0, 1, 2, 3], unit="n/a", conversion=1, resolution=1)
    stime.set_value("num_samples", 4)
    stime.set_time_by_rate(0.125, 2)
    #
    stime.finalize()
    neurodata.close()
Beispiel #16
0
def create_general_subject(fname):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = nwb.create_identifier("general top test")
    settings["overwrite"] = True
    settings["description"] = "test top-level elements in /general"
    neurodata = nwb.NWB(**settings)
    #
    neurodata.set_metadata(SUBJECT, "SUBJECT")
    neurodata.set_metadata(SUBJECT_ID, "SUBJECT_ID")
    neurodata.set_metadata(SPECIES, "SPECIES")
    neurodata.set_metadata(GENOTYPE, "GENOTYPE")
    neurodata.set_metadata(SEX, "SEX")
    neurodata.set_metadata(AGE, "AGE")
    neurodata.set_metadata(WEIGHT, "WEIGHT")
    #
    neurodata.close()
Beispiel #17
0
def create_general_optogen(fname):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = nwb.create_identifier("metadata optogenetic test")
    settings["overwrite"] = True
    settings["description"] = "test elements in /general/optogentics"
    neurodata = nwb.NWB(**settings)
    #
    neurodata.set_metadata(OPTOGEN_CUSTOM("optogen_custom"), "OPTOGEN_CUSTOM")
    #
    neurodata.set_metadata(OPTOGEN_SITE_DESCRIPTION("p1"), "DESCRIPTION")
    neurodata.set_metadata(OPTOGEN_SITE_DEVICE("p1"), "DEVICE")
    neurodata.set_metadata(OPTOGEN_SITE_LAMBDA("p1"), "LAMBDA")
    neurodata.set_metadata(OPTOGEN_SITE_LOCATION("p1"), "LOCATION")
    neurodata.set_metadata(OPTOGEN_SITE_CUSTOM("p1", "optogen_site_custom"),
                           "OPTOGEN_SITE_CUSTOM")
    #
    neurodata.close()
Beispiel #18
0
def openNWB(siteNWB):
    """ Open the given NWB file """

    outputNWB = deriveOutputNWB(siteNWB)

    if not os.path.isfile(outputNWB):
        shutil.copyfile(siteNWB, outputNWB)

    settings = {}

    settings["filename"] = outputNWB
    settings["auto_compress"] = True
    settings["modify"] = True

    try:
        return nwb.NWB(**settings)
    except:
        raise NameError("Could not open the NWB file \"%s\"." % outputNWB)
Beispiel #19
0
def create_general_intra(fname):
    settings = {}
    settings["filename"] = fname
    settings["identifier"] = nwb.create_identifier(
        "general intracellular test")
    settings["overwrite"] = True
    settings["description"] = "test elements in /general/intracellular_ephys"
    neurodata = nwb.NWB(**settings)
    #
    neurodata.set_metadata(INTRA_CUSTOM("intra_custom"), "INTRA_CUSTOM")
    #
    neurodata.set_metadata(INTRA_ELECTRODE_DESCRIPTION("p1"), "DESCRIPTION")
    neurodata.set_metadata(INTRA_ELECTRODE_FILTERING("p1"), "FILTERING")
    neurodata.set_metadata(INTRA_ELECTRODE_DEVICE("p1"), "DEVICE")
    neurodata.set_metadata(INTRA_ELECTRODE_LOCATION("p1"), "LOCATION")
    neurodata.set_metadata(INTRA_ELECTRODE_RESISTANCE("p1"), "RESISTANCE")
    neurodata.set_metadata(INTRA_ELECTRODE_SEAL("p1"), "SEAL")
    neurodata.set_metadata(INTRA_ELECTRODE_SLICE("p1"), "SLICE")
    neurodata.set_metadata(INTRA_ELECTRODE_INIT_ACCESS_RESISTANCE("p1"),
                           "INITIAL_ACCESS_RESISTANCE")
    neurodata.set_metadata(
        INTRA_ELECTRODE_CUSTOM("p1", "intra_electrode_custom"),
        "INTRA_ELECTRODE_CUSTOM")
    #
    neurodata.set_metadata(INTRA_ELECTRODE_DESCRIPTION("e2"), "DESCRIPTION")
    neurodata.set_metadata(INTRA_ELECTRODE_FILTERING("e2"), "FILTERING")
    neurodata.set_metadata(INTRA_ELECTRODE_DEVICE("e2"), "DEVICE")
    neurodata.set_metadata(INTRA_ELECTRODE_LOCATION("e2"), "LOCATION")
    neurodata.set_metadata(INTRA_ELECTRODE_RESISTANCE("e2"), "RESISTANCE")
    neurodata.set_metadata(INTRA_ELECTRODE_SEAL("e2"), "SEAL")
    neurodata.set_metadata(INTRA_ELECTRODE_SLICE("e2"), "SLICE")
    neurodata.set_metadata(INTRA_ELECTRODE_INIT_ACCESS_RESISTANCE("e2"),
                           "INITIAL_ACCESS_RESISTANCE")
    neurodata.set_metadata(
        INTRA_ELECTRODE_CUSTOM("e2", "intra_electrode_custom"),
        "INTRA_ELECTRODE_CUSTOM")
    #
    neurodata.close()
Beispiel #20
0
# indicate that it's OK to overwrite exting file
settings["overwrite"] = True

# specify the start time of the experiment. all times in the NWB file
#   are relative to experiment start time
# if the start time is not specified the present time will be used
settings["start_time"] = "Sat Jul 04 2015 3:14:16"

# provide one or two sentences that describe the experiment and what
#   data is in the file
settings["description"] = "Test file demonstrating a simple extracellular ephys recording"

# create the NWB object. this manages the file
print("Creating " + settings["filename"])
neurodata = nwb.NWB(**settings)

########################################################################
# create two electrical series, one with a single electrode and one with many
# then create a spike event series

# first create the electrode map
# example simulated recording is made from two 2-electrode probes named
#   'p0' and 'p1'. we need to define the locations of the electrodes
#   relative to each probe, and the location of the probes
# electrode coordinates are in meters and their positions 
#   are relative to each other. the location of the probe itself is
#   stored separately. using absolute coordinates here, if they are known, 
#   is still OK
electrode_map = [[0, 0, 0], [0, 1.5e-6, 0], [0, 0, 0], [0, 3.0e-5, 0]]
electrode_group = [ "p0", "p0", "p1", "p1" ]
Beispiel #21
0
def main():
    module = PipelineModule()
    jin = module.input_data()

    infile = jin["input_nwb"]
    outfile = jin["output_nwb"]

    # a temporary nwb file must be created. this is that file's name
    tmpfile = outfile + ".tmp"

    # create temp file and make modifications to it using h5py
    shutil.copy2(infile, tmpfile)
    f = h5py.File(tmpfile, "a")
    # change dataset names in acquisition time series to match that
    #   of existing ephys NWB files
    # also rescale the contents of 'data' fields to match the scaling
    #   in original files
    acq = f["acquisition/timeseries"]
    sweep_nums = []
    for k, v in iteritems(acq):
        # parse out sweep number
        try:
            num = int(k[5:10])
        except:
            print("Error - unexpected sweep name encountered in IGOR nwb file")
            print("Sweep called: '%s'" % k)
            print("Expecting 5-digit sweep number between chars 5 and 9")
            sys.exit(1)
        swp = "Sweep_%d" % num
        # rename objects
        try:
            acq.move(k, swp)
            ts = acq[swp]
            ts.move("stimulus_description", "aibs_stimulus_description")
        except:
            print("*** Error renaming HDF5 object in %s" % swp)
            type_, value_, traceback_ = sys.exc_info()
            print(traceback.print_tb(traceback_))
            sys.exit(1)
        # rescale contents of data so conversion is 1.0
        try:
            data = ts["data"]
            scale = float(data.attrs["conversion"])
            data[...] = data.value * scale
            data.attrs["conversion"] = 1.0
        except:
            print("*** Error rescaling data in %s" % swp)
            type_, value_, traceback_ = sys.exc_info()
            print(traceback.print_tb(traceback_))
            sys.exit(1)
        # keep track of sweep numbers
        sweep_nums.append("%d" % num)

    ###################################
    #... ditto for stimulus time series
    stim = f["stimulus/presentation"]
    for k, v in iteritems(stim):
        # parse out sweep number
        try:
            num = int(k[5:10])
        except:
            print("Error - unexpected sweep name encountered in IGOR nwb file")
            print("Sweep called: '%s'" % k)
            print("Expecting 5-digit sweep number between chars 5 and 9")
            sys.exit(1)
        swp = "Sweep_%d" % num
        try:
            stim.move(k, swp)
        except:
            print("Error renaming HDF5 group from %s to %s" % (k, swp))
            sys.exit(1)
        # rescale contents of data so conversion is 1.0
        try:
            ts = stim[swp]
            data = ts["data"]
            scale = float(data.attrs["conversion"])
            data[...] = data.value * scale
            data.attrs["conversion"] = 1.0
        except:
            print("*** Error rescaling data in %s" % swp)
            type_, value_, traceback_ = sys.exc_info()
            print(traceback.print_tb(traceback_))
            sys.exit(1)

    f.close()

    ####################################################################
    # re-open file w/ nwb library and add indexing (epochs)
    nd = nwb.NWB(filename=tmpfile, modify=True)
    for num in sweep_nums:
        ts = nd.file_pointer["acquisition/timeseries/Sweep_" + num]
        # sweep epoch
        t0 = ts["starting_time"].value
        rate = float(ts["starting_time"].attrs["rate"])
        n = float(ts["num_samples"].value)
        t1 = t0 + (n - 1) * rate
        ep = nd.create_epoch("Sweep_" + num, t0, t1)
        ep.add_timeseries("stimulus", "stimulus/presentation/Sweep_" + num)
        ep.add_timeseries("response", "acquisition/timeseries/Sweep_" + num)
        ep.finalize()
        if "CurrentClampSeries" in ts.attrs["ancestry"]:
            # test pulse epoch
            t0 = ts["starting_time"].value
            t1 = t0 + PULSE_LEN
            ep = nd.create_epoch("TestPulse_" + num, t0, t1)
            ep.add_timeseries("stimulus", "stimulus/presentation/Sweep_" + num)
            ep.add_timeseries("response",
                              "acquisition/timeseries/Sweep_" + num)
            ep.finalize()
            # experiment epoch
            t0 = ts["starting_time"].value
            t1 = t0 + (n - 1) * rate
            t0 += EXPERIMENT_START_TIME
            ep = nd.create_epoch("Experiment_" + num, t0, t1)
            ep.add_timeseries("stimulus", "stimulus/presentation/Sweep_" + num)
            ep.add_timeseries("response",
                              "acquisition/timeseries/Sweep_" + num)
            ep.finalize()
    nd.close()

    # rescaling the contents of the data arrays causes the file to grow
    # execute hdf5-repack to get it back to its original size
    try:
        print("Repacking hdf5 file with compression")
        process = subprocess.Popen(
            ["h5repack", "-f", "GZIP=4", tmpfile, outfile],
            stdout=subprocess.PIPE)
        process.wait()
    except:
        print("Unable to run h5repack on temporary nwb file")
        print("--------------------------------------------")
        raise

    try:
        print("Removing temporary file")
        os.remove(tmpfile)
    except:
        print("Unable to delete temporary file ('%s')" % tmpfile)
        raise

    # done (nothing to return)
    module.write_output_data({})