diff --git a/README.md b/README.md index e9b180d..bad76b7 100644 --- a/README.md +++ b/README.md @@ -18,18 +18,21 @@ Extract NIHM Data Archive compatible metadata from Brain Imaging Data Structure GUID_MAPPING Path to a text file with participant_id to GUID mapping. You will need to use the GUID Tool (https://ndar.nih.gov/contribute.html) to generate GUIDs - for your participants. + for your participants. Formatted as - OUTPUT_DIRECTORY Directory where NDA files will be stored + EXPERIMENT_ID experiment_id value assigned from NDA after setting the study up throught the NDA website (int) optional arguments: -h, --help show this help message and exit ## GUID_MAPPING file format -The is the file format produced by the GUID Tool: one line per subject in the format +The is the file format produced by the GUID Tool: one line per subject in the format: ` - ` +If your ids are in the format of `sub-sid001420`, be sure to not include 'sub-' in your `` e.g., ` - ` + ## Example outputs See [/examples](/examples) diff --git a/bids2nda/main.py b/bids2nda/main.py index 7017865..7ee1767 100644 --- a/bids2nda/main.py +++ b/bids2nda/main.py @@ -98,6 +98,9 @@ def cosine_to_orientation(iop): express the direction you move, in the DPCS, as you move from row to row, and therefore as the row index changes. + Notes: + Modified Yarik's original solution from https://stackoverflow.com/a/45469577 to use the argmax for increaesd flexibility. + Parameters ---------- iop: list of float @@ -107,21 +110,9 @@ def cosine_to_orientation(iop): ------- {'Axial', 'Coronal', 'Sagittal'} """ - # Solution based on https://stackoverflow.com/a/45469577 - iop_round = np.round(iop) - plane = np.cross(iop_round[0:3], iop_round[3:6]) - plane = np.abs(plane) - if plane[0] == 1: - return "Sagittal" - elif plane[1] == 1: - return "Coronal" - elif plane[2] == 1: - return "Axial" - else: - raise RuntimeError( - "Could not deduce the image orientation of %r. 'plane' value is %r" - % (iop, plane) - ) + planes = ['Sagittal', 'Coronal', 'Axial'] + plane = np.abs(np.cross(np.round(iop[0:3]), np.round(iop[3:6]))) + return planes[np.argmax(plane)] def run(args): @@ -204,10 +195,10 @@ def run(args): suffix = file.split("_")[-1].split(".")[0] if suffix == "bold": description = suffix + " " + metadata["TaskName"] - dict_append(image03_dict, 'experiment_id', metadata.get("ExperimentID", "")) + dict_append(image03_dict, 'experiment_id', args.experiment_id) else: description = suffix - dict_append(image03_dict, 'experiment_id', '') + dict_append(image03_dict, 'experiment_id', args.experiment_id) # Shortcut for the global.const section -- apparently might not be flattened fully metadata_const = metadata.get('global', {}).get('const', {}) dict_append(image03_dict, 'image_description', description) @@ -386,9 +377,9 @@ def run(args): image03_df = pd.DataFrame(image03_dict) - with open(os.path.join(args.output_directory, "image03.txt"), "w") as out_fp: - out_fp.write('"image"\t"3"\n') - image03_df.to_csv(out_fp, sep="\t", index=False, quoting=csv.QUOTE_ALL) + with open(os.path.join(args.output_directory, "image03.csv"), "w") as out_fp: + out_fp.write('"image","3"\n') + image03_df.to_csv(out_fp, sep=",", index=False, quoting=csv.QUOTE_ALL) def main(): class MyParser(argparse.ArgumentParser): @@ -414,6 +405,11 @@ def error(self, message): "output_directory", help="Directory where NDA files will be stored", metavar="OUTPUT_DIRECTORY") + parser.add_argument( + "experiment_id", + help="Experiment ID assigned by NDA for collection. Requred for fMRI studies", + metavar='EXPERIMENT_ID') + args = parser.parse_args() run(args)