def simplify_lines_AllFrame(Input_MoleParentFolder_interval, GroupNum, MoleculeNum, threshold):

	fileContents = mfc.read_molecule_files_frominf(Input_MoleParentFolder_interval, GroupNum, MoleculeNum)
	connect_count, frames, cells = mfc.get_frame_count_mole(fileContents)

	straightness = []

	for FrameNum in frames:
		

		## readin molecule backbone information
		fileContents_setframe = mfc.get_content_setframe(fileContents, FrameNum)
		CellNumList_setframe = mfc.get_CellNumbers(fileContents_setframe)

		## create a list to store turning points of simplify polyline
		list_knots = [0, len(CellNumList_setframe)-1]

		## generate the simplify line
		simplify_test = simplify_line_test(CellNumList_setframe, threshold)
		while(simplify_test):

			## for first recursion
			if len(list_knots) == 2:
				re_time = [0]
				simplify_line(CellNumList_setframe, 0, len(CellNumList_setframe)-1, list_knots, threshold, re_time)
			## downstream recursion
			else:
				## for each segment
				for i in range(0, len(list_knots) - 2):
					## check whether this segment need more recursion
					if simplify_test_list[i]:
						re_time = [0]
						simplify_line(CellNumList_setframe, list_knots[i], list_knots[i+1], list_knots, threshold, re_time)
			list_knots = sorted(list(set(list_knots)))

			## check every segment, decide simplify polyline creation is finished or not
			simplify_test_list = []
			for i in range(0, len(list_knots) - 2):
				simplify_test_list.append(simplify_line_test(CellNumList_setframe[list_knots[i]:(list_knots[i+1] + 1)], threshold))
			simplify_test = max(simplify_test_list)
		
		## get turning positions
		turning_knots_cellnums = list(np.array(CellNumList_setframe)[list_knots])

		## get information related to turning angles
		theta_list = angle_list(turning_knots_cellnums)
		theta_max = max(map(abs, theta_list))
		theta_sum = sum(map(abs, theta_list))
		theta_net = sum(theta_list)
	
		## estimation
		test_score_sum = float(1 / math.exp((abs(theta_net) + theta_max) / 2))

		## result report
		straightness.append([FrameNum, theta_net, theta_max, test_score_sum])

	return straightness
def determine_within_forbackbone(BackbonefileContents, SurroundingfileContents, layer, threshold):
	CellNumList_backbone = mfc.get_CellNumbers(BackbonefileContents)
	EffectedList = effected_pixels(SurroundingfileContents, layer, threshold)
	
	ConditionList = []
	for test_cellnum in CellNumList_backbone:
		condition = determine_within_foronepoint(test_cellnum, EffectedList)
		ConditionList.append(condition)
	
	return ConditionList
def determine_within_forbackbone(BackbonefileContents, SurroundingfileContents,
                                 layer, threshold):
    CellNumList_backbone = mfc.get_CellNumbers(BackbonefileContents)
    EffectedList = effected_pixels(SurroundingfileContents, layer, threshold)

    ConditionList = []
    for test_cellnum in CellNumList_backbone:
        condition = determine_within_foronepoint(test_cellnum, EffectedList)
        ConditionList.append(condition)

    return ConditionList
def surrounding_OneMolecule_forframe(display_array, Input_MoleParentFolder, Output_moleParentFolder, Output_plotParentFolder, GroupNum, FrameNum, MoleculeNum = 0, backbone_range = 2, close = False, molecule_filename = " "):

	GroupNum = int(GroupNum)
	FrameNum = int(FrameNum) 
	MoleculeNum = int(MoleculeNum)

	### data input
	grayData_array = fi.get_grayData_frominf(GroupNum, FrameNum)
	
	if molecule_filename == " ":
		molecule_filename = "molecule" + MoleculeNum + ".txt"
	else:
		MoleculeNum = int(re.findall(r"molecule([0-9]*).txt", molecule_filename)[0])
	
	fileContents = mfc.read_molecule_files_fromname(Input_MoleParentFolder, GroupNum, molecule_filename)
	inframe = mfc.find_mole_setframe(fileContents, FrameNum)
	if(not(inframe)):
		print "the molecule is not in this frame! "
		exit(1)
	
	molecule_contents_setframe = mfc.get_content_setframe(fileContents, FrameNum)

	CellNumList_setframe = mfc.get_CellNumbers(molecule_contents_setframe)

	### surrounding intensity acquisition
	surrounding_intensity_circle_1 = surrounding_intensity_circle(CellNumList_setframe, grayData_array, display_array, 2, 1, close)
	surrounding_intensity_circle_2 = surrounding_intensity_circle(CellNumList_setframe, grayData_array, display_array, 2, 2, close)
	surrounding_intensity_circle_3 = surrounding_intensity_circle(CellNumList_setframe, grayData_array, display_array, 2, 3, close)

	surrounding_coordinate_1 = surrounding_circle(CellNumList_setframe, 2, 1, close)
	surrounding_coordinate_2 = surrounding_circle(CellNumList_setframe, 2, 2, close)
	surrounding_coordinate_3 = surrounding_circle(CellNumList_setframe, 2, 3, close)

	length = len(surrounding_coordinate_3)
	surrounding = np.zeros((length, 6), dtype = int)
	surrounding[0:(len(surrounding_intensity_circle_1)),0] = surrounding_intensity_circle_1
	surrounding[0:(len(surrounding_intensity_circle_2)),1] = surrounding_intensity_circle_2
	surrounding[0:(len(surrounding_intensity_circle_3)),2] = surrounding_intensity_circle_3
	surrounding[0:(len(surrounding_coordinate_1)),3] = surrounding_coordinate_1
	surrounding[0:(len(surrounding_coordinate_2)),4] = surrounding_coordinate_2
	surrounding[0:(len(surrounding_coordinate_3)),5] = surrounding_coordinate_3

	### data output
	GroupName = "group1-" + str(GroupNum) + "-inca34-outputs/"
	FrameName = "frame" + str(FrameNum)

	output_groupfolder = os.path.join(Output_moleParentFolder, GroupName)
	output_framefolder = os.path.join(output_groupfolder, FrameName)

	## for storing data
	if(not(os.path.exists(output_framefolder))):
		os.makedirs(output_framefolder)
	os.chdir(output_framefolder)

	molecule_filename_output = "molecule" + str(MoleculeNum) + "_frame" + str(FrameNum)
	fileid = open(molecule_filename_output, "w")
	fileid.write(" ".join(["intensity1", "intensity2", "intensity3", "coordinate1", "coordinate2", "coordinate3","\n"]))
	for line in range(0, length):
		line_str = map(str, surrounding[line, :])
		line_str.append("\n")
		fileid.write(" ".join(line_str))
	fileid.close()
	
	print "group", GroupNum, "_frame", FrameNum, "_",molecule_filename, ": surrounding file created!"
	
	## creating folder for successive plotting
	output_groupfolder_plot = os.path.join(Output_plotParentFolder, GroupName)
	output_framefolder_plot = os.path.join(output_groupfolder_plot, FrameName)
	if(not(os.path.exists(output_framefolder_plot))):
		os.makedirs(output_framefolder_plot)

	return CellNumList_setframe[0]  ## return the start cell of this molecule
def surrounding_OneMolecule(Input_MoleParentFolder, Output_moleParentFolder, Output_plotParentFolder, GroupNum, FrameNum, MoleculeNum, select_region = [-1,-1], backbone_range = 2, close = False):

	GroupNum = int(GroupNum)
	FrameNum = int(FrameNum) 
	MoleculeNum = int(MoleculeNum)
	
	### data input
	grayData_array = fi.get_grayData_frominf(GroupNum, FrameNum)
	display_array1 = copy.deepcopy(grayData_array)
	display_array2 = copy.deepcopy(grayData_array)
	display_array3 = copy.deepcopy(grayData_array)

	fileContents = mfc.read_molecule_files_frominf(Input_MoleParentFolder, GroupNum, MoleculeNum)
	inframe = mfc.find_mole_setframe(fileContents, FrameNum)
	if(not(inframe)):
		print "the molecule is not in this frame! "
		exit(1)
	
	molecule_contents_setframe = mfc.get_content_setframe(fileContents, FrameNum)

	CellNumList_setframe = mfc.get_CellNumbers(molecule_contents_setframe)
	
	heads, tails = mfc.boundary_x(ncol, CellNumList_setframe)
	x_min = mfc.get_coordinate(heads[0],ncol)[1]
	x_max = mfc.get_coordinate(tails[0],ncol)[1]

	if(select_region[0] == -1): select_region[0] = x_min
	if(select_region[1] == -1): select_region[1] = x_max 
	

	CellNumList_setframe_region = []
	for cellnum in CellNumList_setframe:
		inregion = mfc.find_cell_inregion_x(cellnum, select_region, ncol)
		if(inregion):
			CellNumList_setframe_region.append(cellnum)
	
	if(len(CellNumList_setframe) != 0):
		### surrounding intensity acquisition
		surrounding_intensity_circle_1 = surrounding_intensity_circle(CellNumList_setframe_region, grayData_array, display_array1, 2, 1, close)
		surrounding_intensity_circle_2 = surrounding_intensity_circle(CellNumList_setframe_region, grayData_array, display_array2, 2, 2, close)
		surrounding_intensity_circle_3 = surrounding_intensity_circle(CellNumList_setframe_region, grayData_array, display_array3, 2, 3, close)
		
		surrounding_coordinate_1 = surrounding_circle(CellNumList_setframe_region, 2, 1, close)
		surrounding_coordinate_2 = surrounding_circle(CellNumList_setframe_region, 2, 2, close)
		surrounding_coordinate_3 = surrounding_circle(CellNumList_setframe_region, 2, 3, close)

		length = len(surrounding_intensity_circle_3)
		surrounding = np.zeros((length, 6), dtype = int)
		surrounding[0:(len(surrounding_intensity_circle_1)),0] = surrounding_intensity_circle_1
		surrounding[0:(len(surrounding_intensity_circle_2)),1] = surrounding_intensity_circle_2
		surrounding[0:(len(surrounding_intensity_circle_3)),2] = surrounding_intensity_circle_3
		surrounding[0:(len(surrounding_coordinate_1)),3] = surrounding_coordinate_1
		surrounding[0:(len(surrounding_coordinate_2)),4] = surrounding_coordinate_2
		surrounding[0:(len(surrounding_coordinate_3)),5] = surrounding_coordinate_3
	
		### data output
		GroupName = "group1-" + str(GroupNum) + "-inca34-outputs/"
		FrameName = "frame" + str(FrameNum)
		output_groupfolder = os.path.join(Output_moleParentFolder, GroupName)

		## for storing data
		if(not(os.path.exists(output_groupfolder))):
			os.makedirs(output_groupfolder)
		os.chdir(output_groupfolder)
	
		filename = "molecule" + str(MoleculeNum) + "_frame" + str(FrameNum) + ".txt"
		fileid = open(filename, "w")
		fileid.write(" ".join(["intensity1", "intensity2", "intensity3", "coordinate1", "coordinate2", "coordinate3", "\n"]))
		for line in range(0, length):
			line_str = map(str, surrounding[line, :])
			line_str.append("\n")
			fileid.write(" ".join(line_str))
		fileid.close()
		
		print "group", GroupNum, "_frame", FrameNum, "_molecule", MoleculeNum, ": surrounding file created!"
	
		## plotting the frame
		mole_start_position = mfc.get_coordinate(CellNumList_setframe[0],ncol)
		text_position = [mole_start_position[0]-15, mole_start_position[1]]
		text = "mole_" + str(MoleculeNum)
		
		plt.figure(FrameNum, figsize=(16, 12), dpi = 100)
    		mergeplot = plt.imshow(display_array1)
    		mergeplot.set_cmap(colormap)
		plt.text(text_position[1], text_position[0], text, color = "yellow", size = 'medium', weight = 400)
    		plt.colorbar()
    		mergeplot.set_clim([np.min(display_array3), image_max])
	
		framename_pdf = "molecule" + str(MoleculeNum) + "_frame" + str(FrameNum) + ".pdf"
		framename_png = "molecule" + str(MoleculeNum) + "_frame" + str(FrameNum) + ".png"
		plt.savefig(framename_pdf)
		plt.savefig(framename_png)
#		plt.show()
		plt.close()


		## save plots to another folder
		output_groupfolder_plot = os.path.join(Output_plotParentFolder, GroupName)
		if(not(os.path.exists(output_groupfolder_plot))):
			os.makedirs(output_groupfolder_plot)
		framename_pdf_plot = framename_pdf
		framename_png_plot = framename_png
		shutil.copyfile(os.path.join(output_groupfolder,framename_pdf),os.path.join(output_groupfolder_plot,framename_pdf_plot))
		shutil.copyfile(os.path.join(output_groupfolder,framename_png),os.path.join(output_groupfolder_plot,framename_png_plot))
		os.remove(os.path.join(output_groupfolder,framename_pdf))
		os.remove(os.path.join(output_groupfolder,framename_png))


	else:
		print("selected region wrong! no pixel of the molecule in this region..")
def surrounding_OneMolecule_forframe(display_array,
                                     Input_MoleParentFolder,
                                     Output_moleParentFolder,
                                     Output_plotParentFolder,
                                     GroupNum,
                                     FrameNum,
                                     MoleculeNum=0,
                                     backbone_range=2,
                                     close=False,
                                     molecule_filename=" "):

    GroupNum = int(GroupNum)
    FrameNum = int(FrameNum)
    MoleculeNum = int(MoleculeNum)

    ### data input
    grayData_array = fi.get_grayData_frominf(GroupNum, FrameNum)

    if molecule_filename == " ":
        molecule_filename = "molecule" + MoleculeNum + ".txt"
    else:
        MoleculeNum = int(
            re.findall(r"molecule([0-9]*).txt", molecule_filename)[0])

    fileContents = mfc.read_molecule_files_fromname(Input_MoleParentFolder,
                                                    GroupNum,
                                                    molecule_filename)
    inframe = mfc.find_mole_setframe(fileContents, FrameNum)
    if (not (inframe)):
        print "the molecule is not in this frame! "
        exit(1)

    molecule_contents_setframe = mfc.get_content_setframe(
        fileContents, FrameNum)

    CellNumList_setframe = mfc.get_CellNumbers(molecule_contents_setframe)

    ### surrounding intensity acquisition
    surrounding_intensity_circle_1 = surrounding_intensity_circle(
        CellNumList_setframe, grayData_array, display_array, 2, 1, close)
    surrounding_intensity_circle_2 = surrounding_intensity_circle(
        CellNumList_setframe, grayData_array, display_array, 2, 2, close)
    surrounding_intensity_circle_3 = surrounding_intensity_circle(
        CellNumList_setframe, grayData_array, display_array, 2, 3, close)

    surrounding_coordinate_1 = surrounding_circle(CellNumList_setframe, 2, 1,
                                                  close)
    surrounding_coordinate_2 = surrounding_circle(CellNumList_setframe, 2, 2,
                                                  close)
    surrounding_coordinate_3 = surrounding_circle(CellNumList_setframe, 2, 3,
                                                  close)

    length = len(surrounding_coordinate_3)
    surrounding = np.zeros((length, 6), dtype=int)
    surrounding[0:(len(surrounding_intensity_circle_1)),
                0] = surrounding_intensity_circle_1
    surrounding[0:(len(surrounding_intensity_circle_2)),
                1] = surrounding_intensity_circle_2
    surrounding[0:(len(surrounding_intensity_circle_3)),
                2] = surrounding_intensity_circle_3
    surrounding[0:(len(surrounding_coordinate_1)),
                3] = surrounding_coordinate_1
    surrounding[0:(len(surrounding_coordinate_2)),
                4] = surrounding_coordinate_2
    surrounding[0:(len(surrounding_coordinate_3)),
                5] = surrounding_coordinate_3

    ### data output
    GroupName = "group1-" + str(GroupNum) + "-inca34-outputs/"
    FrameName = "frame" + str(FrameNum)

    output_groupfolder = os.path.join(Output_moleParentFolder, GroupName)
    output_framefolder = os.path.join(output_groupfolder, FrameName)

    ## for storing data
    if (not (os.path.exists(output_framefolder))):
        os.makedirs(output_framefolder)
    os.chdir(output_framefolder)

    molecule_filename_output = "molecule" + str(MoleculeNum) + "_frame" + str(
        FrameNum)
    fileid = open(molecule_filename_output, "w")
    fileid.write(" ".join([
        "intensity1", "intensity2", "intensity3", "coordinate1", "coordinate2",
        "coordinate3", "\n"
    ]))
    for line in range(0, length):
        line_str = map(str, surrounding[line, :])
        line_str.append("\n")
        fileid.write(" ".join(line_str))
    fileid.close()

    print "group", GroupNum, "_frame", FrameNum, "_", molecule_filename, ": surrounding file created!"

    ## creating folder for successive plotting
    output_groupfolder_plot = os.path.join(Output_plotParentFolder, GroupName)
    output_framefolder_plot = os.path.join(output_groupfolder_plot, FrameName)
    if (not (os.path.exists(output_framefolder_plot))):
        os.makedirs(output_framefolder_plot)

    return CellNumList_setframe[0]  ## return the start cell of this molecule
def surrounding_OneMolecule(Input_MoleParentFolder,
                            Output_moleParentFolder,
                            Output_plotParentFolder,
                            GroupNum,
                            FrameNum,
                            MoleculeNum,
                            select_region=[-1, -1],
                            backbone_range=2,
                            close=False):

    GroupNum = int(GroupNum)
    FrameNum = int(FrameNum)
    MoleculeNum = int(MoleculeNum)

    ### data input
    grayData_array = fi.get_grayData_frominf(GroupNum, FrameNum)
    display_array1 = copy.deepcopy(grayData_array)
    display_array2 = copy.deepcopy(grayData_array)
    display_array3 = copy.deepcopy(grayData_array)

    fileContents = mfc.read_molecule_files_frominf(Input_MoleParentFolder,
                                                   GroupNum, MoleculeNum)
    inframe = mfc.find_mole_setframe(fileContents, FrameNum)
    if (not (inframe)):
        print "the molecule is not in this frame! "
        exit(1)

    molecule_contents_setframe = mfc.get_content_setframe(
        fileContents, FrameNum)

    CellNumList_setframe = mfc.get_CellNumbers(molecule_contents_setframe)

    heads, tails = mfc.boundary_x(ncol, CellNumList_setframe)
    x_min = mfc.get_coordinate(heads[0], ncol)[1]
    x_max = mfc.get_coordinate(tails[0], ncol)[1]

    if (select_region[0] == -1): select_region[0] = x_min
    if (select_region[1] == -1): select_region[1] = x_max

    CellNumList_setframe_region = []
    for cellnum in CellNumList_setframe:
        inregion = mfc.find_cell_inregion_x(cellnum, select_region, ncol)
        if (inregion):
            CellNumList_setframe_region.append(cellnum)

    if (len(CellNumList_setframe) != 0):
        ### surrounding intensity acquisition
        surrounding_intensity_circle_1 = surrounding_intensity_circle(
            CellNumList_setframe_region, grayData_array, display_array1, 2, 1,
            close)
        surrounding_intensity_circle_2 = surrounding_intensity_circle(
            CellNumList_setframe_region, grayData_array, display_array2, 2, 2,
            close)
        surrounding_intensity_circle_3 = surrounding_intensity_circle(
            CellNumList_setframe_region, grayData_array, display_array3, 2, 3,
            close)

        surrounding_coordinate_1 = surrounding_circle(
            CellNumList_setframe_region, 2, 1, close)
        surrounding_coordinate_2 = surrounding_circle(
            CellNumList_setframe_region, 2, 2, close)
        surrounding_coordinate_3 = surrounding_circle(
            CellNumList_setframe_region, 2, 3, close)

        length = len(surrounding_intensity_circle_3)
        surrounding = np.zeros((length, 6), dtype=int)
        surrounding[0:(len(surrounding_intensity_circle_1)),
                    0] = surrounding_intensity_circle_1
        surrounding[0:(len(surrounding_intensity_circle_2)),
                    1] = surrounding_intensity_circle_2
        surrounding[0:(len(surrounding_intensity_circle_3)),
                    2] = surrounding_intensity_circle_3
        surrounding[0:(len(surrounding_coordinate_1)),
                    3] = surrounding_coordinate_1
        surrounding[0:(len(surrounding_coordinate_2)),
                    4] = surrounding_coordinate_2
        surrounding[0:(len(surrounding_coordinate_3)),
                    5] = surrounding_coordinate_3

        ### data output
        GroupName = "group1-" + str(GroupNum) + "-inca34-outputs/"
        FrameName = "frame" + str(FrameNum)
        output_groupfolder = os.path.join(Output_moleParentFolder, GroupName)

        ## for storing data
        if (not (os.path.exists(output_groupfolder))):
            os.makedirs(output_groupfolder)
        os.chdir(output_groupfolder)

        filename = "molecule" + str(MoleculeNum) + "_frame" + str(
            FrameNum) + ".txt"
        fileid = open(filename, "w")
        fileid.write(" ".join([
            "intensity1", "intensity2", "intensity3", "coordinate1",
            "coordinate2", "coordinate3", "\n"
        ]))
        for line in range(0, length):
            line_str = map(str, surrounding[line, :])
            line_str.append("\n")
            fileid.write(" ".join(line_str))
        fileid.close()

        print "group", GroupNum, "_frame", FrameNum, "_molecule", MoleculeNum, ": surrounding file created!"

        ## plotting the frame
        mole_start_position = mfc.get_coordinate(CellNumList_setframe[0], ncol)
        text_position = [mole_start_position[0] - 15, mole_start_position[1]]
        text = "mole_" + str(MoleculeNum)

        plt.figure(FrameNum, figsize=(16, 12), dpi=100)
        mergeplot = plt.imshow(display_array1)
        mergeplot.set_cmap(colormap)
        plt.text(text_position[1],
                 text_position[0],
                 text,
                 color="yellow",
                 size='medium',
                 weight=400)
        plt.colorbar()
        mergeplot.set_clim([np.min(display_array3), image_max])

        framename_pdf = "molecule" + str(MoleculeNum) + "_frame" + str(
            FrameNum) + ".pdf"
        framename_png = "molecule" + str(MoleculeNum) + "_frame" + str(
            FrameNum) + ".png"
        plt.savefig(framename_pdf)
        plt.savefig(framename_png)
        #		plt.show()
        plt.close()

        ## save plots to another folder
        output_groupfolder_plot = os.path.join(Output_plotParentFolder,
                                               GroupName)
        if (not (os.path.exists(output_groupfolder_plot))):
            os.makedirs(output_groupfolder_plot)
        framename_pdf_plot = framename_pdf
        framename_png_plot = framename_png
        shutil.copyfile(
            os.path.join(output_groupfolder, framename_pdf),
            os.path.join(output_groupfolder_plot, framename_pdf_plot))
        shutil.copyfile(
            os.path.join(output_groupfolder, framename_png),
            os.path.join(output_groupfolder_plot, framename_png_plot))
        os.remove(os.path.join(output_groupfolder, framename_pdf))
        os.remove(os.path.join(output_groupfolder, framename_png))

    else:
        print(
            "selected region wrong! no pixel of the molecule in this region..")
def simplify_lines_AllFrame(Input_MoleParentFolder_interval, GroupNum,
                            MoleculeNum, threshold):

    fileContents = mfc.read_molecule_files_frominf(
        Input_MoleParentFolder_interval, GroupNum, MoleculeNum)
    connect_count, frames, cells = mfc.get_frame_count_mole(fileContents)

    straightness = []

    for FrameNum in frames:

        ## readin molecule backbone information
        fileContents_setframe = mfc.get_content_setframe(
            fileContents, FrameNum)
        CellNumList_setframe = mfc.get_CellNumbers(fileContents_setframe)

        ## create a list to store turning points of simplify polyline
        list_knots = [0, len(CellNumList_setframe) - 1]

        ## generate the simplify line
        simplify_test = simplify_line_test(CellNumList_setframe, threshold)
        while (simplify_test):

            ## for first recursion
            if len(list_knots) == 2:
                re_time = [0]
                simplify_line(CellNumList_setframe, 0,
                              len(CellNumList_setframe) - 1, list_knots,
                              threshold, re_time)
            ## downstream recursion
            else:
                ## for each segment
                for i in range(0, len(list_knots) - 2):
                    ## check whether this segment need more recursion
                    if simplify_test_list[i]:
                        re_time = [0]
                        simplify_line(CellNumList_setframe, list_knots[i],
                                      list_knots[i + 1], list_knots, threshold,
                                      re_time)
            list_knots = sorted(list(set(list_knots)))

            ## check every segment, decide simplify polyline creation is finished or not
            simplify_test_list = []
            for i in range(0, len(list_knots) - 2):
                simplify_test_list.append(
                    simplify_line_test(
                        CellNumList_setframe[list_knots[i]:(list_knots[i + 1] +
                                                            1)], threshold))
            simplify_test = max(simplify_test_list)

        ## get turning positions
        turning_knots_cellnums = list(
            np.array(CellNumList_setframe)[list_knots])

        ## get information related to turning angles
        theta_list = angle_list(turning_knots_cellnums)
        theta_max = max(map(abs, theta_list))
        theta_sum = sum(map(abs, theta_list))
        theta_net = sum(theta_list)

        ## estimation
        test_score_sum = float(1 / math.exp((abs(theta_net) + theta_max) / 2))

        ## result report
        straightness.append([FrameNum, theta_net, theta_max, test_score_sum])

    return straightness