def run(input_dir, phantom, suffix=".raw", output_dir="../data/simresults"): """ Compute the variance in three ROIs of several volumes in the given input directory. Pass a suffix if desired. Run this in in scripts/ if no output_dir specified. phantom | string, prefix to output filename """ from constants import NOISELEVEL_FILE OUTPUT_FNAME = NOISELEVEL_FILE.format(phantom) raw_files = [f for f in os.listdir(input_dir) if f.endswith(suffix)] d = OrderedDict() for f in tqdm(sorted(raw_files)): img = np.fromfile( os.path.join(input_dir, f), dtype=np.float16).reshape((250, 512, 311)) variances = compute_var_from_volume(img) # Fetch frame and flux info from filename. filtermode = find_filtermode(f) frms = f[:3] flux = f[8:13] d[f] = (filtermode, frms, flux) + variances if d: outpath = os.path.join(output_dir, OUTPUT_FNAME) # output file will be sorted because first loop runs over sorted filenames. write_header = not os.path.exists(outpath) with open(outpath, 'a+') as f: if write_header: f.write("#fmode,fmrs,flux,var1,var2,var3\n") for vtuple in d.values(): # CSV style f.write("{},{},{},{},{},{}\n".format(*vtuple))
EDGESHARPNESS_INPUT_DIR = VOLUME_OUTPUT_DIR EDGESHARPNESS_OUTPUT_DIR = "../data/simresults" EDGESHARPNESS_FILEPATH = os.path.join( EDGESHARPNESS_OUTPUT_DIR, EDGESHARPNESS_FILE.format( PHANTOM_NAME+"-tv", EDGESHARPNESS_ROI_NAME, EDGESHARPNESS_PREFILTER_SIGMA ) ) NOISELEVEL_OUTPUT_DIR = "../data/simresults" NOISELEVEL_FILEPATH = os.path.join( NOISELEVEL_OUTPUT_DIR, NOISELEVEL_FILE.format(PHANTOM_NAME+"-tv") ) RMSE_INPUT_DIR = PHANTOM_INPUT_DIR RMSE_OUTPUT_DIR = "../data/simresults" RMSE_GROUND_TRUTH_PATH = os.path.join(RMSE_INPUT_DIR, RMSE_GROUND_TRUTH_FILE) RMSE_MASK_PATH = os.path.join(RMSE_INPUT_DIR, RMSE_MASK_FILE) # Ground truth and mask data needs to be loaded only once. RMSE_GROUND_TRUTH = np.fromfile(RMSE_GROUND_TRUTH_PATH, dtype=np.float32) RMSE_MASK = np.fromfile(RMSE_MASK_PATH, dtype=np.uint8) RMSE_FILEPATH = os.path.join( RMSE_OUTPUT_DIR, RMSE_FILE.format(PHANTOM_NAME+"-tv") ) # For single test run.
def run(input_dir, phantom, save_volume, suffix="_0filter_fdk.raw", es_params=None, compute_noise_level=False, output_dir="../data/simresults", **bf_kwargs ): """ Run postfilter routine on all files in input_dir that have the specified suffix. phantom | str, prefix for analysis files save_volume | bool, whether to save the postfiltered volume or not es_params | None or tuple(roi_name, sigma) output_dir | Run this in scripts/ if not specified bf_kwargs | sigmaISq, sigmaP, spacing, kernelScaling """ raw_nofilter_files = [f for f in listdir(input_dir) if f.endswith(suffix)] COMPUTE_EDGESHARPNESS = es_params is not None COMPUTE_ROI_VARIANCE = compute_noise_level if COMPUTE_EDGESHARPNESS: EDGESHARPNESS_FILEPATH = os.path.join(output_dir, EDGESHARPNESS_FILE.format(phantom, *es_params)) ROI_VARIANCES_FILEPATH = os.path.join(output_dir, NOISELEVEL_FILE.format(phantom)) for i,file in tqdm(enumerate(raw_nofilter_files)): # convert to float32 because pyopencl cannot handle float16. img_in = np.fromfile( os.path.join(input_dir, file), dtype=np.float16).reshape((250,512,311)).astype(np.float32) img_out = _apply_bilateral_filter(img_in, queue, **bf_kwargs) # Analysis if COMPUTE_ROI_VARIANCE: variances = compute_var_from_volume(img_out) write_header = not os.path.exists(ROI_VARIANCES_FILEPATH) with open(ROI_VARIANCES_FILEPATH, 'a+') as rvf: if write_header: rvf.write("#fmode,fmrs,flux,var1,var2,var3\n") rvf.write("{},{},{},{},{},{}\n".format( 2, file[:3], file[8:13], *variances ) ) if COMPUTE_EDGESHARPNESS: es, esd = compute_es_from_volume(img_out, *es_params[::-1]) write_header = not os.path.exists(EDGESHARPNESS_FILEPATH) with open(EDGESHARPNESS_FILEPATH, 'a+') as esf: if write_header: esf.write("#fmode,frms,flux,shrpns,uncrty\n") esf.write("{},{},{},{},{}\n".format( 2, # post filtermode file[:3], file[8:13], es, esd ) ) if save_volume: # volume output directory is the input directory, i.e. on the server. img_out.astype(np.float16).tofile( os.path.join( input_dir, file.replace(suffix, "_2filter_fdk.raw")))
PHANTOM_FILE = PHANTOMS[PHANTOM_NAME]["rawfile"] PHANTOM_FILEPATH = os.path.join(PHANTOM_INPUT_DIR, PHANTOM_FILE) IR_SCALING = PHANTOMS[PHANTOM_NAME]["ir_scaling"] FDK_SCALING_FILE = "fdk_postscaling.dat" FDK_SCALING_FILEPATH = os.path.join(VOLUME_OUTPUT_DIR, FDK_SCALING_FILE) EDGESHARPNESS_INPUT_DIR = VOLUME_OUTPUT_DIR EDGESHARPNESS_OUTPUT_DIR = "../data/simresults" EDGESHARPNESS_FILEPATH = os.path.join( EDGESHARPNESS_OUTPUT_DIR, EDGESHARPNESS_FILE.format(PHANTOM_NAME, EDGESHARPNESS_ROI_NAME, EDGESHARPNESS_PREFILTER_SIGMA), ) NOISELEVEL_OUTPUT_DIR = "../data/simresults" NOISELEVEL_FILEPATH = os.path.join(NOISELEVEL_OUTPUT_DIR, NOISELEVEL_FILE.format(PHANTOM_NAME)) # For single test run. """ PARAMETERS = { "CBSIMULATION": { "FRAMES": (479,), "FLUX": (5e7,), "NOISE": (True, ) }, "FILTERING": { "MODE": ("no",) }, "RECO": { "MODE": ("FDK", ),
EDGESHARPNESS_INPUT_DIR = VOLUME_OUTPUT_DIR EDGESHARPNESS_OUTPUT_DIR = "../data/simresults" EDGESHARPNESS_FILEPATH = os.path.join( EDGESHARPNESS_OUTPUT_DIR, EDGESHARPNESS_FILE.format( PHANTOM_NAME+"-mlem", EDGESHARPNESS_ROI_NAME, EDGESHARPNESS_PREFILTER_SIGMA ) ) NOISELEVEL_OUTPUT_DIR = "../data/simresults" NOISELEVEL_FILEPATH = os.path.join( NOISELEVEL_OUTPUT_DIR, NOISELEVEL_FILE.format(PHANTOM_NAME+"-mlem") ) # For single test run. """ PARAMETERS = { "CBSIMULATION": { "FRAMES": (479,), "FLUX": (5e7,), "NOISE": (True, ) }, "FILTERING": { "MODE": ("no",) }, "RECO": {
EDGESHARPNESS_INPUT_DIR = VOLUME_OUTPUT_DIR EDGESHARPNESS_OUTPUT_DIR = "../data/simresults" EDGESHARPNESS_FILEPATH = os.path.join( EDGESHARPNESS_OUTPUT_DIR, EDGESHARPNESS_FILE.format( PHANTOM_NAME+"-sirt", EDGESHARPNESS_ROI_NAME, EDGESHARPNESS_PREFILTER_SIGMA ) ) NOISELEVEL_OUTPUT_DIR = "../data/simresults" NOISELEVEL_FILEPATH = os.path.join( NOISELEVEL_OUTPUT_DIR, NOISELEVEL_FILE.format(PHANTOM_NAME+"-sirt") ) RMSE_INPUT_DIR = PHANTOM_INPUT_DIR RMSE_OUTPUT_DIR = "../data/simresults" RMSE_GROUND_TRUTH_PATH = os.path.join(RMSE_INPUT_DIR, RMSE_GROUND_TRUTH_FILE) RMSE_MASK_PATH = os.path.join(RMSE_INPUT_DIR, RMSE_MASK_FILE) # Ground truth and mask data needs to be loaded only once. RMSE_GROUND_TRUTH = np.fromfile(RMSE_GROUND_TRUTH_PATH, dtype=np.float32) RMSE_MASK = np.fromfile(RMSE_MASK_PATH, dtype=np.uint8) RMSE_FILEPATH = os.path.join( RMSE_OUTPUT_DIR, RMSE_FILE.format(PHANTOM_NAME+"-sirt") ) # For single test run.