def flatness_elekta(profile: SingleProfile): """The Elekta specification for calculating flatness""" try: dmax = profile.field_calculation(field_width=0.8, calculation='max') dmin = profile.field_calculation(field_width=0.8, calculation='min') except ValueError: raise ValueError( "An error was encountered in the flatness calculation. The image is likely inverted. Try inverting the image before analysis with <instance>.image.invert()." ) flatness = 100 * (dmax / dmin) lt_edge, rt_edge = profile.field_edges() return flatness, dmax, dmin, lt_edge, rt_edge
def symmetry_pdq_iec(profile: SingleProfile): """Symmetry calculation by way of PDQ IEC""" values = profile.field_values(field_width=0.8) lt_edge, rt_edge = profile.field_edges(field_width=0.8) max_val = 0 sym_array = [] for lt_pt, rt_pt in zip(values, values[::-1]): val = max(abs(lt_pt / rt_pt), abs(rt_pt / lt_pt)) sym_array.append(val) if val > max_val: max_val = val symmetry = 100 * max_val return symmetry, sym_array, lt_edge, rt_edge
def symmetry_point_difference(profile: SingleProfile): """Calculation of symmetry by way of point difference equidistant from the CAX""" values = profile.field_values(field_width=0.8) lt_edge, rt_edge = profile.field_edges(field_width=0.8) cax = profile.fwxm_center() dcax = profile.values[cax] max_val = 0 sym_array = [] for lt_pt, rt_pt in zip(values, values[::-1]): val = 100 * abs(lt_pt - rt_pt) / dcax sym_array.append(val) if val > max_val: max_val = val symmetry = max_val return symmetry, sym_array, lt_edge, rt_edge