From 358c0d615b95adcddcb3eea67aa6df6acb21cbf2 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Thu, 1 Dec 2022 16:20:29 -0600 Subject: [PATCH 01/24] add extract_utils.py for EXTRACT --- element_interface/extract_utils.py | 84 ++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 element_interface/extract_utils.py diff --git a/element_interface/extract_utils.py b/element_interface/extract_utils.py new file mode 100644 index 0000000..55204ed --- /dev/null +++ b/element_interface/extract_utils.py @@ -0,0 +1,84 @@ +import os +from pathlib import Path +from datetime import datetime + + +class EXTRACT: + m_template = r""" +% Load Data +data = load('{scanfile}'); +M = data.M; + +% Input Paramaters +config = struct(); +{parameters_list_string} + +% Perform Extraction +output = extractor(M, config); +write({output_fullpath}) +""" + + def __init__(self, scanfile_fullpath, parameters, output_dir) -> None: + assert isinstance(self.parameters, dict) + + self.scanfile = Path(scanfile_fullpath) + self.output_dir = Path(output_dir) + self.parameters = parameters + + def write_matlab_run_script(self): + """Compose the matlab script, run_extract.m, that would run the EXTRACT trigger.""" + + assert self.scanfile.exists() + + self.output_fullpath = ( + Path(self.output_dir) / f"{self.scanfile.stem}_extract_output.mat", + ) + + m_file_content = self.m_template.format( + **dict( + parameters_list_string="\n".join( + [ + f"config.{k} = '{v}';" + if isinstance(v, str) + else f"config.{k} = {str(v).lower()};" + if isinstance(v, bool) + else f"config.{k} = {v};" + for k, v in self.parameters.items() + ] + ), + scanfile=self.scanfile, + output_fullpath=self.output_fullpath, + ) + ) + + self.m_file_fp = self.output_dir / "run_extract.m" + + with open(self.m_file_fp, "w") as f: + f.write(m_file_content) + + def run(self): + """Run run_extract.m script.""" + + current_dir = Path.cwd() + os.chdir(self.output_dir) + + run_status = {"execution_time": datetime.utcnow()} + try: + import matlab.engine + + eng = matlab.engine.start_matlab() + eng.run_extract() + except Exception as e: + raise e + finally: + os.chdir(current_dir) + + run_status["execution_duration"] = ( + datetime.utcnow() - run_status["execution_time"] + ).total_seconds() + return run_status + + def load_results(self): + from scipy.io import loadmat + + self.results = loadmat(self.output_fullpath) From 87afa22e9fc617c58dbce68d5ef780fd2e9dbdc9 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Thu, 1 Dec 2022 16:35:54 -0600 Subject: [PATCH 02/24] add docstring --- element_interface/extract_utils.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/element_interface/extract_utils.py b/element_interface/extract_utils.py index 55204ed..3130b4a 100644 --- a/element_interface/extract_utils.py +++ b/element_interface/extract_utils.py @@ -1,4 +1,5 @@ import os +from typing import Union from pathlib import Path from datetime import datetime @@ -18,7 +19,19 @@ class EXTRACT: write({output_fullpath}) """ - def __init__(self, scanfile_fullpath, parameters, output_dir) -> None: + def __init__( + self, + scanfile_fullpath: Union[str, Path], + parameters: dict, + output_dir: Union[str, Path], + ) -> None: + """A helper class to trigger EXTRACT analysis as well as to load its results. + + Args: + scanfile_fullpath (Union[str, Path]): Full path of the scan + parameters (dict): EXTRACT input paramaters. + output_dir (Union[str, Path]): Directory to store the outputs of EXTRACT analysis. + """ assert isinstance(self.parameters, dict) self.scanfile = Path(scanfile_fullpath) @@ -26,7 +39,9 @@ def __init__(self, scanfile_fullpath, parameters, output_dir) -> None: self.parameters = parameters def write_matlab_run_script(self): - """Compose the matlab script, run_extract.m, that would run the EXTRACT trigger.""" + """Compose a matlab script and save in the run_extract.m file. + + The composed script is basically the formatted version of the m_template attrribute.""" assert self.scanfile.exists() @@ -79,6 +94,7 @@ def run(self): return run_status def load_results(self): + """Load the EXTRACT results""" from scipy.io import loadmat self.results = loadmat(self.output_fullpath) From 99c4fb874e49ddcd736bffaa61005a73e98add13 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Fri, 2 Dec 2022 09:20:22 -0600 Subject: [PATCH 03/24] fix ugly template style --- element_interface/extract_utils.py | 35 ++++++++++++++++-------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/element_interface/extract_utils.py b/element_interface/extract_utils.py index 3130b4a..d730e70 100644 --- a/element_interface/extract_utils.py +++ b/element_interface/extract_utils.py @@ -2,22 +2,25 @@ from typing import Union from pathlib import Path from datetime import datetime +from textwrap import dedent class EXTRACT: - m_template = r""" -% Load Data -data = load('{scanfile}'); -M = data.M; - -% Input Paramaters -config = struct(); -{parameters_list_string} - -% Perform Extraction -output = extractor(M, config); -write({output_fullpath}) -""" + m_template = dedent( + """ + % Load Data + data = load('{scanfile}'); + M = data.M; + + % Input Paramaters + config = struct(); + {parameters_list_string} + + % Perform Extraction + output = extractor(M, config); + write({output_fullpath}) + """ + ) def __init__( self, @@ -32,7 +35,7 @@ def __init__( parameters (dict): EXTRACT input paramaters. output_dir (Union[str, Path]): Directory to store the outputs of EXTRACT analysis. """ - assert isinstance(self.parameters, dict) + assert isinstance(parameters, dict) self.scanfile = Path(scanfile_fullpath) self.output_dir = Path(output_dir) @@ -43,7 +46,7 @@ def write_matlab_run_script(self): The composed script is basically the formatted version of the m_template attrribute.""" - assert self.scanfile.exists() + # assert self.scanfile.exists() self.output_fullpath = ( Path(self.output_dir) / f"{self.scanfile.stem}_extract_output.mat", @@ -64,7 +67,7 @@ def write_matlab_run_script(self): scanfile=self.scanfile, output_fullpath=self.output_fullpath, ) - ) + ).lstrip() self.m_file_fp = self.output_dir / "run_extract.m" From 4fd50a7922f588c9a62eefa422a375e02c0a500e Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Tue, 13 Dec 2022 10:39:54 -0600 Subject: [PATCH 04/24] remove return run_status --- element_interface/extract_utils.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/element_interface/extract_utils.py b/element_interface/extract_utils.py index d730e70..d946d9a 100644 --- a/element_interface/extract_utils.py +++ b/element_interface/extract_utils.py @@ -18,7 +18,7 @@ class EXTRACT: % Perform Extraction output = extractor(M, config); - write({output_fullpath}) + write({output_fullpath}); """ ) @@ -28,7 +28,7 @@ def __init__( parameters: dict, output_dir: Union[str, Path], ) -> None: - """A helper class to trigger EXTRACT analysis as well as to load its results. + """A helper class to trigger EXTRACT analysis in element-calcium-imaging. Args: scanfile_fullpath (Union[str, Path]): Full path of the scan @@ -65,7 +65,7 @@ def write_matlab_run_script(self): ] ), scanfile=self.scanfile, - output_fullpath=self.output_fullpath, + output_fullpath=self.output_fullpath.as_posix(), ) ).lstrip() @@ -77,10 +77,12 @@ def write_matlab_run_script(self): def run(self): """Run run_extract.m script.""" + self.write_matlab_run_script() + current_dir = Path.cwd() os.chdir(self.output_dir) - run_status = {"execution_time": datetime.utcnow()} + run_status = {"processing_time": datetime.utcnow()} try: import matlab.engine @@ -92,9 +94,8 @@ def run(self): os.chdir(current_dir) run_status["execution_duration"] = ( - datetime.utcnow() - run_status["execution_time"] + datetime.utcnow() - run_status["processing_time"] ).total_seconds() - return run_status def load_results(self): """Load the EXTRACT results""" From 6ebf019b58c182ef6ba63edda1ffd048b3762129 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Tue, 13 Dec 2022 13:36:19 -0600 Subject: [PATCH 05/24] switch from write to save --- element_interface/extract_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/element_interface/extract_utils.py b/element_interface/extract_utils.py index d946d9a..13e8873 100644 --- a/element_interface/extract_utils.py +++ b/element_interface/extract_utils.py @@ -18,7 +18,7 @@ class EXTRACT: % Perform Extraction output = extractor(M, config); - write({output_fullpath}); + save('{output_fullpath}', 'output'); """ ) @@ -49,7 +49,7 @@ def write_matlab_run_script(self): # assert self.scanfile.exists() self.output_fullpath = ( - Path(self.output_dir) / f"{self.scanfile.stem}_extract_output.mat", + self.output_dir / f"{self.scanfile.stem}_extract_output.mat" ) m_file_content = self.m_template.format( From 04b8f69cda177006bf84eed580366580da9c2b63 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Tue, 13 Dec 2022 18:49:23 -0600 Subject: [PATCH 06/24] add loader and trigger --- element_interface/extract_loader.py | 51 +++++++++++++++++++ .../{extract_utils.py => extract_trigger.py} | 18 ++----- 2 files changed, 56 insertions(+), 13 deletions(-) create mode 100644 element_interface/extract_loader.py rename element_interface/{extract_utils.py => extract_trigger.py} (88%) diff --git a/element_interface/extract_loader.py b/element_interface/extract_loader.py new file mode 100644 index 0000000..0bb6f0a --- /dev/null +++ b/element_interface/extract_loader.py @@ -0,0 +1,51 @@ +import numpy as np +from pathlib import Path + + +class EXTRACT_loader: + def __init__(self, extract_dir: str): + """Initialize EXTRACT loader class + + Args: + extract_dir (str): string, absolute file path to Extract directory + + Raises: + FileNotFoundError: Could not find EXTRACT results + """ + from scipy.io import loadmat + + output_file = list(Path(extract_dir).glob("*_extract_output.mat")) + + if not output_file: + raise FileNotFoundError( + "EXTRACT output result files not found at {}".format(extract_dir) + ) + + results = loadmat(output_file[0]) + self.S = results["output"][0]["spatial_weights"][0] # (Height, Width, Time) + self.T = results["output"][0]["temporal_weights"][0] # (Time, MaskId) + + def load_results(self): + """Load the EXTRACT results""" + from scipy.sparse import find + + S_tr = self.S.transpose([2, 0, 1]) # Mask_no, Height, Width + + masks = [] + + for mask_id, s in enumerate(S_tr): + ypixels, xpixels, weights = find(s) + masks.append( + dict( + mask_id=mask_id, + mask_npix=len(weights), + mask_weights=weights, + mask_center_x=int(np.average(xpixels, weights=weights) + 0.5), + mask_center_y=int(np.average(ypixels, weights=weights) + 0.5), + mask_center_z=None, + mask_xpix=xpixels, + mask_ypix=ypixels, + mask_zpix=None, + ) + ) + return masks diff --git a/element_interface/extract_utils.py b/element_interface/extract_trigger.py similarity index 88% rename from element_interface/extract_utils.py rename to element_interface/extract_trigger.py index 13e8873..885e306 100644 --- a/element_interface/extract_utils.py +++ b/element_interface/extract_trigger.py @@ -1,11 +1,11 @@ import os from typing import Union from pathlib import Path -from datetime import datetime from textwrap import dedent +from datetime import datetime -class EXTRACT: +class EXTRACT_trigger: m_template = dedent( """ % Load Data @@ -42,11 +42,9 @@ def __init__( self.parameters = parameters def write_matlab_run_script(self): - """Compose a matlab script and save in the run_extract.m file. - - The composed script is basically the formatted version of the m_template attrribute.""" + """Compose a matlab script and save it with the name run_extract.m. - # assert self.scanfile.exists() + The composed script is basically the formatted version of the m_template attribute.""" self.output_fullpath = ( self.output_dir / f"{self.scanfile.stem}_extract_output.mat" @@ -75,7 +73,7 @@ def write_matlab_run_script(self): f.write(m_file_content) def run(self): - """Run run_extract.m script.""" + """Run the matlab run_extract.m script.""" self.write_matlab_run_script() @@ -96,9 +94,3 @@ def run(self): run_status["execution_duration"] = ( datetime.utcnow() - run_status["processing_time"] ).total_seconds() - - def load_results(self): - """Load the EXTRACT results""" - from scipy.io import loadmat - - self.results = loadmat(self.output_fullpath) From e8d5b0a84c0dab7f77e02c619e54e4f9667877e3 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Tue, 13 Dec 2022 18:53:22 -0600 Subject: [PATCH 07/24] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20335e9..fd9822f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Observes [Semantic Versioning](https://semver.org/spec/v2.0.0.html) standard and + Add - mkdocs documentation + Add - improved docstrings for mkdocs ++ Add - EXTRACT trigger and loader tools ## [0.3.0] - 2022-10-7 From 7cffc25dbfa87fbd869025b432cade1c07a70af0 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Tue, 13 Dec 2022 19:12:07 -0600 Subject: [PATCH 08/24] add creation_time --- element_interface/extract_loader.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/element_interface/extract_loader.py b/element_interface/extract_loader.py index 0bb6f0a..ca5ca77 100644 --- a/element_interface/extract_loader.py +++ b/element_interface/extract_loader.py @@ -1,5 +1,6 @@ import numpy as np from pathlib import Path +from datetime import datetime class EXTRACT_loader: @@ -22,6 +23,8 @@ def __init__(self, extract_dir: str): ) results = loadmat(output_file[0]) + + self.creation_time = datetime.utcnow() self.S = results["output"][0]["spatial_weights"][0] # (Height, Width, Time) self.T = results["output"][0]["temporal_weights"][0] # (Time, MaskId) From d2eb1e82d2da9ddfeed6f401a9cfb9f0c0bbad13 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Wed, 14 Dec 2022 11:54:39 -0600 Subject: [PATCH 09/24] Update element_interface/extract_loader.py Co-authored-by: Kabilar Gunalan --- element_interface/extract_loader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/element_interface/extract_loader.py b/element_interface/extract_loader.py index ca5ca77..2b0a0e1 100644 --- a/element_interface/extract_loader.py +++ b/element_interface/extract_loader.py @@ -8,7 +8,7 @@ def __init__(self, extract_dir: str): """Initialize EXTRACT loader class Args: - extract_dir (str): string, absolute file path to Extract directory + extract_dir (str): string, absolute file path to EXTRACT directory Raises: FileNotFoundError: Could not find EXTRACT results From 2ab366daa1b6e66df67490e7c4371542c3986a74 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Wed, 14 Dec 2022 14:17:49 -0600 Subject: [PATCH 10/24] Update element_interface/extract_loader.py Co-authored-by: Kabilar Gunalan --- element_interface/extract_loader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/element_interface/extract_loader.py b/element_interface/extract_loader.py index 2b0a0e1..93f6381 100644 --- a/element_interface/extract_loader.py +++ b/element_interface/extract_loader.py @@ -25,7 +25,7 @@ def __init__(self, extract_dir: str): results = loadmat(output_file[0]) self.creation_time = datetime.utcnow() - self.S = results["output"][0]["spatial_weights"][0] # (Height, Width, Time) + self.S = results["output"][0]["spatial_weights"][0] # (Height, Width, MaskId) self.T = results["output"][0]["temporal_weights"][0] # (Time, MaskId) def load_results(self): From e3ff2adf5ba33854394848aea79a8308467574f0 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Wed, 14 Dec 2022 14:18:10 -0600 Subject: [PATCH 11/24] Update element_interface/extract_loader.py Co-authored-by: Kabilar Gunalan --- element_interface/extract_loader.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/element_interface/extract_loader.py b/element_interface/extract_loader.py index 93f6381..23b5c3e 100644 --- a/element_interface/extract_loader.py +++ b/element_interface/extract_loader.py @@ -29,7 +29,11 @@ def __init__(self, extract_dir: str): self.T = results["output"][0]["temporal_weights"][0] # (Time, MaskId) def load_results(self): - """Load the EXTRACT results""" + """Load the EXTRACT results + + Returns: + masks (dict): Details of the masks identified with the EXTRACT segmentation package. + """ from scipy.sparse import find S_tr = self.S.transpose([2, 0, 1]) # Mask_no, Height, Width From c18aa11adf37547cac446e899901f961dd206492 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Wed, 14 Dec 2022 14:18:35 -0600 Subject: [PATCH 12/24] Update element_interface/extract_loader.py Co-authored-by: Kabilar Gunalan --- element_interface/extract_loader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/element_interface/extract_loader.py b/element_interface/extract_loader.py index 23b5c3e..ac5aa0b 100644 --- a/element_interface/extract_loader.py +++ b/element_interface/extract_loader.py @@ -36,7 +36,7 @@ def load_results(self): """ from scipy.sparse import find - S_tr = self.S.transpose([2, 0, 1]) # Mask_no, Height, Width + S_transposed = self.S.transpose([2, 0, 1]) # MaskId, Height, Width masks = [] From e5ed418cec7df05a4c2998615ea2e445b5f41751 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Wed, 14 Dec 2022 14:18:55 -0600 Subject: [PATCH 13/24] Update element_interface/extract_trigger.py Co-authored-by: Kabilar Gunalan --- element_interface/extract_trigger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/element_interface/extract_trigger.py b/element_interface/extract_trigger.py index 885e306..01a78fc 100644 --- a/element_interface/extract_trigger.py +++ b/element_interface/extract_trigger.py @@ -31,7 +31,7 @@ def __init__( """A helper class to trigger EXTRACT analysis in element-calcium-imaging. Args: - scanfile_fullpath (Union[str, Path]): Full path of the scan + scanfile (Union[str, Path]): Full path of the scan parameters (dict): EXTRACT input paramaters. output_dir (Union[str, Path]): Directory to store the outputs of EXTRACT analysis. """ From d93c2de8e85356322356e7e5954e00475c4b743b Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Wed, 14 Dec 2022 14:19:03 -0600 Subject: [PATCH 14/24] Update element_interface/extract_loader.py Co-authored-by: Kabilar Gunalan --- element_interface/extract_loader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/element_interface/extract_loader.py b/element_interface/extract_loader.py index ac5aa0b..7bc6c8e 100644 --- a/element_interface/extract_loader.py +++ b/element_interface/extract_loader.py @@ -40,7 +40,7 @@ def load_results(self): masks = [] - for mask_id, s in enumerate(S_tr): + for mask_id, s in enumerate(S_transposed): ypixels, xpixels, weights = find(s) masks.append( dict( From 3517d139c53b817b74d52f70dbb2e8da49f645cc Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Wed, 14 Dec 2022 14:19:11 -0600 Subject: [PATCH 15/24] Update element_interface/extract_loader.py Co-authored-by: Kabilar Gunalan --- element_interface/extract_loader.py | 1 + 1 file changed, 1 insertion(+) diff --git a/element_interface/extract_loader.py b/element_interface/extract_loader.py index 7bc6c8e..3985198 100644 --- a/element_interface/extract_loader.py +++ b/element_interface/extract_loader.py @@ -1,3 +1,4 @@ +import os import numpy as np from pathlib import Path from datetime import datetime From 1796c521275819d19535ddd6ed1c71a63173c9c3 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Wed, 14 Dec 2022 14:19:36 -0600 Subject: [PATCH 16/24] Update element_interface/extract_trigger.py Co-authored-by: Kabilar Gunalan --- element_interface/extract_trigger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/element_interface/extract_trigger.py b/element_interface/extract_trigger.py index 01a78fc..5aeaf97 100644 --- a/element_interface/extract_trigger.py +++ b/element_interface/extract_trigger.py @@ -24,7 +24,7 @@ class EXTRACT_trigger: def __init__( self, - scanfile_fullpath: Union[str, Path], + scanfile: Union[str, Path], parameters: dict, output_dir: Union[str, Path], ) -> None: From 8554cc31a77093dcd8b2488dbc4c85c0bbf82080 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Wed, 14 Dec 2022 14:19:48 -0600 Subject: [PATCH 17/24] Update element_interface/extract_trigger.py Co-authored-by: Kabilar Gunalan --- element_interface/extract_trigger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/element_interface/extract_trigger.py b/element_interface/extract_trigger.py index 5aeaf97..2561926 100644 --- a/element_interface/extract_trigger.py +++ b/element_interface/extract_trigger.py @@ -37,7 +37,7 @@ def __init__( """ assert isinstance(parameters, dict) - self.scanfile = Path(scanfile_fullpath) + self.scanfile = Path(scanfile) self.output_dir = Path(output_dir) self.parameters = parameters From bca1a5a8f8a0efafc8367fc6f8f3d982ed4d170d Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Wed, 14 Dec 2022 14:29:51 -0600 Subject: [PATCH 18/24] Update element_interface/extract_trigger.py Co-authored-by: Kabilar Gunalan --- element_interface/extract_trigger.py | 1 - 1 file changed, 1 deletion(-) diff --git a/element_interface/extract_trigger.py b/element_interface/extract_trigger.py index 2561926..8e9a5ab 100644 --- a/element_interface/extract_trigger.py +++ b/element_interface/extract_trigger.py @@ -80,7 +80,6 @@ def run(self): current_dir = Path.cwd() os.chdir(self.output_dir) - run_status = {"processing_time": datetime.utcnow()} try: import matlab.engine From f25669ef7e3944a72886761cd6cd2ce58b6e3e0f Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Wed, 14 Dec 2022 14:40:45 -0600 Subject: [PATCH 19/24] Update element_interface/extract_loader.py Co-authored-by: Kabilar Gunalan --- element_interface/extract_loader.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/element_interface/extract_loader.py b/element_interface/extract_loader.py index 3985198..85f6f00 100644 --- a/element_interface/extract_loader.py +++ b/element_interface/extract_loader.py @@ -16,14 +16,14 @@ def __init__(self, extract_dir: str): """ from scipy.io import loadmat - output_file = list(Path(extract_dir).glob("*_extract_output.mat")) - - if not output_file: + try: + extract_file = next(Path(extract_dir).glob("*_extract_output.mat")) + except StopInteration: raise FileNotFoundError( - "EXTRACT output result files not found at {}".format(extract_dir) + f"EXTRACT output result file is not found at {extract_dir}." ) - results = loadmat(output_file[0]) + results = loadmat(extract_file) self.creation_time = datetime.utcnow() self.S = results["output"][0]["spatial_weights"][0] # (Height, Width, MaskId) From caa89c857d5f40c3b5bf51f5db000035238f2333 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Wed, 14 Dec 2022 14:41:46 -0600 Subject: [PATCH 20/24] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd9822f..83f13a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,7 @@ Observes [Semantic Versioning](https://semver.org/spec/v2.0.0.html) standard and + Add - Readers for: `ScanImage`, `Suite2p`, `CaImAn`. +[0.3.1]: https://github.com/datajoint/element-interface/releases/tag/0.3.1 [0.3.0]: https://github.com/datajoint/element-interface/releases/tag/0.3.0 [0.2.1]: https://github.com/datajoint/element-interface/releases/tag/0.2.1 [0.2.0]: https://github.com/datajoint/element-interface/releases/tag/0.2.0 From bb1f15f2dc5c650c59be40a957e250d2e6ffe511 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Wed, 14 Dec 2022 15:05:44 -0600 Subject: [PATCH 21/24] Update element_interface/extract_trigger.py Co-authored-by: Kabilar Gunalan --- element_interface/extract_trigger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/element_interface/extract_trigger.py b/element_interface/extract_trigger.py index 8e9a5ab..df9d84a 100644 --- a/element_interface/extract_trigger.py +++ b/element_interface/extract_trigger.py @@ -16,7 +16,7 @@ class EXTRACT_trigger: config = struct(); {parameters_list_string} - % Perform Extraction + % Run EXTRACT output = extractor(M, config); save('{output_fullpath}', 'output'); """ From 1bf75cc9513c57c56945ecf5e6c411b680dc40e0 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Wed, 14 Dec 2022 15:06:02 -0600 Subject: [PATCH 22/24] Update element_interface/extract_trigger.py Co-authored-by: Kabilar Gunalan --- element_interface/extract_trigger.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/element_interface/extract_trigger.py b/element_interface/extract_trigger.py index df9d84a..94db2e8 100644 --- a/element_interface/extract_trigger.py +++ b/element_interface/extract_trigger.py @@ -89,7 +89,3 @@ def run(self): raise e finally: os.chdir(current_dir) - - run_status["execution_duration"] = ( - datetime.utcnow() - run_status["processing_time"] - ).total_seconds() From 0b5dc06e2ff78b72d93ea5d9dab19c184723ca96 Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Wed, 14 Dec 2022 15:08:20 -0600 Subject: [PATCH 23/24] Update element_interface/extract_loader.py Co-authored-by: Kabilar Gunalan --- element_interface/extract_loader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/element_interface/extract_loader.py b/element_interface/extract_loader.py index 85f6f00..ca31949 100644 --- a/element_interface/extract_loader.py +++ b/element_interface/extract_loader.py @@ -25,7 +25,7 @@ def __init__(self, extract_dir: str): results = loadmat(extract_file) - self.creation_time = datetime.utcnow() + self.creation_time = datetime.fromtimestamp(os.stat(extract_file).st_ctime) self.S = results["output"][0]["spatial_weights"][0] # (Height, Width, MaskId) self.T = results["output"][0]["temporal_weights"][0] # (Time, MaskId) From e03c967db7ec80dc0391dfd654b92d7772ad1fca Mon Sep 17 00:00:00 2001 From: Tolga Dincer Date: Wed, 14 Dec 2022 15:09:48 -0600 Subject: [PATCH 24/24] final touches --- CHANGELOG.md | 4 ++-- element_interface/extract_trigger.py | 2 +- element_interface/version.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83f13a3..48b9186 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ Observes [Semantic Versioning](https://semver.org/spec/v2.0.0.html) standard and [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) convention. -## [0.3.1] - Unreleased +## [0.4.0] - 2022-12-14 + Add - mkdocs documentation + Add - improved docstrings for mkdocs @@ -37,7 +37,7 @@ Observes [Semantic Versioning](https://semver.org/spec/v2.0.0.html) standard and + Add - Readers for: `ScanImage`, `Suite2p`, `CaImAn`. -[0.3.1]: https://github.com/datajoint/element-interface/releases/tag/0.3.1 +[0.4.0]: https://github.com/datajoint/element-interface/releases/tag/0.4.0 [0.3.0]: https://github.com/datajoint/element-interface/releases/tag/0.3.0 [0.2.1]: https://github.com/datajoint/element-interface/releases/tag/0.2.1 [0.2.0]: https://github.com/datajoint/element-interface/releases/tag/0.2.0 diff --git a/element_interface/extract_trigger.py b/element_interface/extract_trigger.py index 94db2e8..7541204 100644 --- a/element_interface/extract_trigger.py +++ b/element_interface/extract_trigger.py @@ -62,7 +62,7 @@ def write_matlab_run_script(self): for k, v in self.parameters.items() ] ), - scanfile=self.scanfile, + scanfile=self.scanfile.as_posix(), output_fullpath=self.output_fullpath.as_posix(), ) ).lstrip() diff --git a/element_interface/version.py b/element_interface/version.py index 5c90a7e..eb3c802 100644 --- a/element_interface/version.py +++ b/element_interface/version.py @@ -1,3 +1,3 @@ """Package metadata""" -__version__ = "0.3.1" +__version__ = "0.4.0"