import os import sys import time import traceback import numpy as np import tigre from matplotlib import pyplot as plt from tigre.demos.Test_data.data_loader import load_head_phantom from tigre.utilities.Measure_Quality import Measure_Quality class AlgorithmTest(object): def __init__(self, configuration, algorithm, **kwargs): """ :param configuration: (str) which predefined Configuration to use :param algorithm: (str) which algorithm to test """ self.dirname = os.path.dirname(__file__) self.targetdir = str( np.load(os.path.join(self.dirname, "targetdir.npy"), allow_pickle=True) ) configdict = np.load(os.path.join(self.dirname, configuration), allow_pickle=True).item() for key in configdict: """contains: [nproj,geo,angles,niter,kwargs]""" setattr(self, key, configdict[key]) self.algorithm = algorithm self.testpassed = False self.algorithm_finished = False self.rmse = 1.0 self.confignumber = os.path.splitext(configuration)[0] self.output = None self.timestarted = time.asctime() self.timeended = time.asctime() def test(self): head = load_head_phantom(self.geo.nVoxel) proj = tigre.Ax(head, self.geo, self.angles) if self.algorithm in ["FDK", "fbp"]: self.output = getattr(tigre.algorithms, self.algorithm)(proj, self.geo, self.angles) self.rmse = Measure_Quality(self.output, head, ["nRMSE"]) self.algorithm_finished = True return self.timestarted = time.asctime() self.output = getattr(tigre.algorithms, self.algorithm)( proj, self.geo, self.angles, self.niter, **self.kwargs ) self.timeended = time.asctime() self.algorithm_finished = True self.rmse = Measure_Quality(self.output, head, ["nRMSE"]) def unit_test_call(self): self.test() self.compound_results() return self.testpassed def compound_results(self, verbose=True): if self.algorithm_finished and self.rmse < 0.2: self.testpassed = True elif self.algorithm == "sirt" and self.algorithm_finished and self.rmse < 0.3: self.testpassed = True else: print("===================================================") print("TEST FAILED") print("Algorithm: " + self.algorithm) print("Algorithm ran: " + str(self.algorithm_finished)) print("configuration number: " + str(self.confignumber)) print("RMSE:" + str(self.rmse)) print("===================================================") def save_output(self): resultfilename = self.confignumber + ".npy" try: resultsdata = np.load( os.path.join(self.targetdir, resultfilename), allow_pickle=True ).item() except Exception: resultsdata = {} resultsdata.update({self.algorithm: self.testpassed}) np.save(os.path.join(self.targetdir, resultfilename), resultsdata) if not self.testpassed: self.write_to_log() def save_fig(self): res = self.output geo = self.geo plt.figure() plt.subplot(3, 1, 1) plt.imshow(res[geo.nVoxel[0] / 2]) plt.title("results for " + self.algorithm) plt.ylabel("dim 0") plt.subplot(3, 1, 2) plt.imshow(res[:, geo.nVoxel[1] / 2]) plt.ylabel("dim 1") plt.subplot(3, 1, 3) plt.imshow(res[:, :, geo.nVoxel[2] / 2]) plt.ylabel("dim 2") plt.savefig(os.path.join(self.targetdir, self.algorithm + self.confignumber)) def write_to_log(self): configlogfile = self.confignumber + ".log" logflist = [] if configlogfile not in os.listdir(self.targetdir): logflist.append("GEOMETRY used for instance of testandlog: \n") for item in self.geo.__dict__: logflist.append(item + ": " + str(getattr(self.geo, item)) + "\n") logflist.append( "nproj: " + str(self.angles.shape[0]) + " niter: " + str(self.niter) + "\n" ) logflist.append("------------------------------------------------\n") else: logflist.extend(open(os.path.join(self.targetdir, configlogfile), "r").readlines()) logflist.append(str(self.algorithm).upper() + " " + str(self.timestarted) + "\n") logflist.append("RMSE: " + str(self.rmse) + "\n") logflist.append("Algorithm ran: " + str(self.algorithm_finished) + "\n") if self.algorithm_finished: logflist.append("ENDED: " + str(self.timeended) + "\n") logflist.append("------------------------------------------------\n") with open(os.path.join(self.targetdir, configlogfile), "w") as logf: logf.write("".join(logflist)) if __name__ == "__main__": configuration = sys.argv[1] algorithm = sys.argv[2] test = AlgorithmTest(configuration, algorithm) try: test.test() except Exception: formatedlines = traceback.format_exc() print(formatedlines) test.compound_results() test.save_output()