def findCenterOfSoma(self): ''' Method find start point for work main algorithm first point should be in soma. Soma is the biggest segment of cell. ''' iter = 0 temp_points = [] slices = [] for p in range(len(self.vertices)): temp_points.append(HelpPoint(p,0)) slice = Slice(temp_points,self.faces) slices.append(slice) while len(slice) != 0: temp_points = filter(lambda p: not slice.__contains__(p), temp_points) slice = None slice = Slice(temp_points,self.faces) if len(slice) != 0: slices.append(slice) print len(temp_points) #slice.printSlice() #print slice.getPerimetr(self.vertices) perimiter_coll = sorted(slices,key=lambda slice:slice.getPerimetr(self.vertices), reverse=True) startSlice = Slice(perimiter_coll[0],self.faces) self.start_center_point = self.__getCenterPoint(startSlice) self.start_center_point.diametr = 2 * self.start_center_point.len_between_point(self.vertices[perimiter_coll[0][0].point])
def __more4AdjacentPointCase(self, adjacentPoints, slice, isBrunch,iteration, current_point, center_point): ''' Work when algorithm find more that 4 adjacent points ''' branchesCollection = self.__fillUpBrachesCollection(adjacentPoints, slice) if len(branchesCollection) >= 2 : center_points = {} thirdBrunchCollection = [] for branch in branchesCollection: branch_center_point = self.__getCenterPoint(branch) center_points[branch_center_point] = branch for branch_center_point,branch in center_points.items(): self.find_point(branch_center_point,iteration,current_point,True,True, _slice=branch) if len(adjacentPoints) > 6: thirdBrunchCollection.extend(branch) thirdBrunchPoints = [HelpPoint(p.point,self.vertices[p.point].len_between_point(center_point)) \ for p in thirdBrunchCollection if not slice.__contains__(p)] slice_t = Slice(thirdBrunchPoints, self.faces) if len(slice_t) == 4: third_brunch_center_point = self.__getCenterPoint(slice_t) self.find_point(third_brunch_center_point,iteration, current_point,True,True, _slice=slice_t) return True elif len(branchesCollection) == 0 or (len(branchesCollection) == 1 and not isBrunch): sortedadjacentPoints = sorted(adjacentPoints,key=lambda p:p.lenght) first_slice = Slice(sortedadjacentPoints,self.faces) second_slice = Slice(filter(lambda p: first_slice.__contains__(p) == False, sortedadjacentPoints),self.faces) perimeter_1 = first_slice.getPerimetr(self.vertices) perimeter_2 = second_slice.getPerimetr(self.vertices) if perimeter_1 > perimeter_2 and perimeter_2 != 0: new_center_point = self.__getCenterPoint(second_slice) self.find_point(new_center_point,iteration, current_point,False,False, _slice=second_slice) return True elif perimeter_1 < perimeter_2 or perimeter_2 == 0: if perimeter_1 == 0: if len(branchesCollection) == 1: first_slice = branchesCollection[0] else: first_slice.getFaceFromColl(adjacentPoints,self.faces) new_center_point = self.__getCenterPoint(first_slice) self.find_point(new_center_point,iteration, current_point,isBrunch,False, _slice=first_slice) else: new_center_point = self.__getCenterPoint(first_slice) self.find_point(new_center_point,iteration, current_point,False,False, _slice=first_slice) return True elif len(branchesCollection) == 1 and isBrunch: slice = branchesCollection[0] if len(slice) == 0: slice = slice.getFaceFromColl(adjacentPoints,self.faces) new_center_point = self.__getCenterPoint(slice) self.find_point(new_center_point,iteration, parentPoint=current_point,isNeurite=True,isBrunchStart=False, _slice=slice) return True return False
def __checkDendrite(self, slice, center_point, vector_len, current_point): ''' Private Method. Check if soma has other output processes if it's contain than run find_point for it. ''' iteration = 1 vector_len = filter(lambda p: slice.__contains__(p) == False and self.checked_points.__contains__(p.point) == False, vector_len) vector_len = sorted(vector_len,key=lambda p:p.lenght) for i in range(5): slice2 = Slice(vector_len,self.faces) if (len(slice2) == 4 and int(slice.getPerimetr(self.vertices) / slice2.getPerimetr(self.vertices)) <= 1 and int(slice2.getPerimetr(self.vertices) / slice.getPerimetr(self.vertices)) <= 1): new_center_point = self.__getCenterPoint(slice2) iteration += 1 self.find_point(new_center_point,iteration,parentPoint=current_point,isNeurite=False,isBrunchStart=False, _slice=slice2) vector_len = filter(lambda p: slice2.__contains__(p) == False and self.checked_points.__contains__(p.point) == False, vector_len) vector_len = sorted(vector_len, key=lambda p:p.lenght)