import numpy as np import utils import sys if len( sys.argv ) < 2: raise Exception( 'this command must have a filename of an ETA fits as an argument' ) data = utils.load( sys.argv[1] ) """ find fill points """ points = [] points += utils.find_point( data[ : , 0 ] , 0 ) # x_min points += utils.find_point( data[ : , data.shape[1] - 1 ], data.shape[1] - 1 , ) # x_max index_min = 0 while data.shape[0] - 1 > index_min: index_min += 1 if len( utils.find_point( data[ index_min , : ] , index_min , 'y' ) ) == 3: break points.append( utils.find_point( data[ index_min , : ] , index_min , 'y' )[1] ) # y_min index_max = data.shape[0] - 1 while index_min < index_max: index_max -= 1 if len( utils.find_point( data[ index_max , : ] , index_max , 'y' ) ) == 3: break points.append( utils.find_point( data[ index_max , : ] , index_max , 'y' )[1] ) # y_max small_data = utils.compress( data , 5 ) points = utils.big_to_small( points , 5 ) # size - 1 points[ 1 ][ 1 ] -= 1 points[ 3 ][ 0 ] -= 1 # little shift to be inside the light points[ 2 ][ 1 ] += 3 points[ 3 ][ 1 ] += 3 """ fill data """ extremum = [] for point in points: if point[0] < points[2][0]: point[0] = points[2][0] if point[1] < points[0][1]: point[1] = points[0][1] taken_points = utils.small_to_big( np.array( [ points[2][0], points[0][1], ] ) + utils.fill( small_data[ points[2][0] : points[3][0] + 1, points[0][1] : points[1][1] + 1 ], [ point[0] - points[2][0], point[1] - points[0][1], ], 1000 ), 5 ) extremum.append( [ np.min( taken_points[ : , 1 ] ), np.max( taken_points[ : , 1 ] ), np.min( taken_points[ : , 0 ] ), np.max( taken_points[ : , 0 ] ), ] ) border = { 'x': { 'min': points[0][1] + extremum[0][1] + 1, 'max': points[0][1] + extremum[1][0] , }, 'y': { 'min': points[2][0] + extremum[2][3] + 1, 'max': points[2][0] + extremum[3][2] , }, } """ label deletion """ mean_data = np.convolve( np.gradient( np.mean( data[ border[ 'y' ][ 'min' ] : border[ 'y' ][ 'max' ], border[ 'x' ][ 'min' ] : border[ 'x' ][ 'max' ] ], axis = 0 ) ), np.ones( int( 0.01 * ( border[ 'x' ][ 'max' ] - border[ 'x' ][ 'min' ] ) ) ), 'same' ) mean_data -= np.min( mean_data ) mean_data /= np.max( mean_data ) top = utils.consecutive( np.where( mean_data > 0.75 )[0] ) down = utils.consecutive( np.where( mean_data < 0.25 )[0] ) size_top = [ len( list_ ) for list_ in top ] size_down = [ len( list_ ) for list_ in down ] label_x = { 'min': border[ 'x' ][ 'min' ] + top[ np.argmax( size_top ) ][0] , 'max': border[ 'x' ][ 'min' ] + down[ np.argmax( size_down ) ][-1] } if label_x[ 'min' ] < data.shape[1] // 2: if label_x[ 'max' ] < data.shape[1] // 2: border[ 'x' ][ 'min' ] = label_x[ 'max' ] else: raise Exception( 'the label seems to be in the middle of the picture' ) elif label_x[ 'max' ] > data.shape[1] // 2: border[ 'x' ][ 'max' ] = label_x[ 'min' ] else: raise Exception( 'for an unkown reason, label_x[ \'min\' ] > label_x[ \'max\' ]' ) import matplotlib.pyplot as plt plt.imshow( data[ border[ 'y' ][ 'min' ] : border[ 'y' ][ 'max' ], border[ 'x' ][ 'min' ] : border[ 'x' ][ 'max' ] ] ) plt.savefig( 'asset/test.png' )