2023-03-26 11:38:51 +03:00
import math
2023-03-19 22:14:11 +02:00
import sys
import os
# defining some constants
r = 3 # round to n digits
column_width = 11 # set column width of final table
# checking if the file is provided correctly
if len ( sys . argv ) != 2 :
print ( f "Please, provide data file \n Usage example: python3 { sys . argv [ 0 ] } sample_file.txt" )
sys . exit ( 1 )
if not os . path . exists ( sys . argv [ 1 ]):
print ( "File does not exist" )
sys . exit ( 1 )
# defining functions
def avg ( a ):
2023-03-26 11:38:51 +03:00
#print(a)
2023-03-19 22:14:11 +02:00
return sum ( a ) / len ( a )
def get_max_len ( a ):
return max ( list ( map ( lambda x : len ( str ( x )), a )))
# reading input data from the file
possible_units = { "mass" : { "kilogram" : 1 , "gram" : 0.001 }}
selected_table = 0
tables = { "1" : { "r2" : 0 , "r1" : 0 , "norms" : { "mass" : 1 }, "stats" : []},
"2" : { "r2" : 0 , "r1" : 0 , "norms" : { "mass" : 1 }, "stats" : []}}
with open ( sys . argv [ 1 ]) as source_file :
for raw_i in source_file :
i = raw_i . rstrip ( " \n\r " )
table_line = i . split ()
if len ( table_line ) > 0 :
if table_line [ 0 ] == "#" :
if table_line [ 1 ] == "table" :
selected_table = table_line [ 2 ]
elif table_line [ 1 ] == "r1" :
tables [ selected_table ][ "r1" ] = float ( table_line [ 2 ])
elif table_line [ 1 ] == "r2" :
tables [ selected_table ][ "r2" ] = float ( table_line [ 2 ])
elif table_line [ 1 ] == "set_unit" :
if table_line [ 2 ] in possible_units and table_line [ 3 ] in possible_units [ table_line [ 2 ]]:
tables [ selected_table ][ "norms" ][ table_line [ 2 ]] = possible_units [ table_line [ 2 ]][ table_line [ 3 ]]
else :
print ( f "Unsupported unit defined in line: ' { i } '" )
else :
if len ( table_line ) == 7 :
new_data = list ( map ( float , table_line ))
new_data [ 0 ] = round ( new_data [ 0 ] * tables [ selected_table ][ "norms" ][ "mass" ], r )
tables [ selected_table ][ "stats" ] . append ( new_data )
# processing inputs
required_data = { "1" : { "stats" : [], "Mt" : 0 , "Imin" : 0 },
"2" : { "stats" : [], "Mt" : 0 , "Imin" : 0 }}
for i in tables :
for j in tables [ i ][ 'stats' ]:
new_line = []
new_line . append ( round ( j [ 0 ] * tables [ i ][ 'r1' ] * 9.81 , r ))
new_line . append ( round ( avg ( j [ 1 : 4 ]), r ))
2023-03-26 11:38:51 +03:00
new_line . append ( round ( 2 / ( tables [ i ][ 'r1' ] * ( new_line [ 1 ] ** 2 )), r ))
2023-03-19 22:14:11 +02:00
new_line . append ( round ( j [ 0 ] * tables [ i ][ 'r2' ] * 9.81 , r ))
2023-03-26 11:38:51 +03:00
new_line . append ( round ( avg ( j [ 4 : 7 ]), r ))
new_line . append ( round ( 2 / ( tables [ i ][ 'r2' ] * ( new_line [ 4 ] ** 2 )), r ))
2023-03-19 22:14:11 +02:00
required_data [ i ][ "stats" ] . append ( new_line )
# printing out the results
'''
for i in tables:
table_widths = [get_max_len(list(zip(tables[i]['stats']))[0]),
get_max_len(list(zip(required_data[i]['stats']))[0]),
get_max_len(list(zip(tables[i]['stats']))[1]),
get_max_len(list(zip(tables[i]['stats']))[2]),
get_max_len(list(zip(tables[i]['stats']))[3]),
get_max_len(list(zip(required_data[i]['stats']))[1]),
get_max_len(list(zip(required_data[i]['stats']))[2]),
get_max_len(list(zip(tables[i]['stats']))[0]),
get_max_len(list(zip(required_data[i]['stats']))[3]),
get_max_len(list(zip(tables[i]['stats']))[4]),
get_max_len(list(zip(tables[i]['stats']))[5]),
get_max_len(list(zip(tables[i]['stats']))[6]),
get_max_len(list(zip(required_data[i]['stats']))[4]),
get_max_len(list(zip(required_data[i]['stats']))[5]),
]
print("|".join( list(map(lambda x: str(x[0].center(x[1])), zip(["m", "Mi", "t1", "t2", "t3", "❬t❭", "βi"]*2, table_widths)))))
for j in range(len(required_data[i]['stats'])):
print("|".join( list(map(lambda x: str(x[0].center(x[1])),
zip([tables[i]['stats'][j][0],
required_data[i]['stats'][j][0],
tables[i]['stats'][j][1],
tables[i]['stats'][j][2],
tables[i]['stats'][j][3],
required_data[i]['stats'][j][1],
required_data[i]['stats'][j][2],
tables[i]['stats'][j][0],
required_data[i]['stats'][j][3],
tables[i]['stats'][j][4],
tables[i]['stats'][j][5],
tables[i]['stats'][j][6],
required_data[i]['stats'][j][4],
required_data[i]['stats'][j][5]],
table_widths))) ))
'''
for i in tables :
print ( f "Table # { i } " )
print ( "|" . join ( list ( map ( lambda x : str ( x ) . center ( 11 ), [ "m" , "Mi" , "t1" , "t2" , "t3" , "❬t❭" , "βi" ] * 2 ))))
for j in range ( len ( required_data [ i ][ 'stats' ])):
print ( "|" . join ( list ( map ( lambda x : str ( x ) . center ( 11 ),
[ tables [ i ][ 'stats' ][ j ][ 0 ],
required_data [ i ][ 'stats' ][ j ][ 0 ],
tables [ i ][ 'stats' ][ j ][ 1 ],
tables [ i ][ 'stats' ][ j ][ 2 ],
tables [ i ][ 'stats' ][ j ][ 3 ],
required_data [ i ][ 'stats' ][ j ][ 1 ],
required_data [ i ][ 'stats' ][ j ][ 2 ],
tables [ i ][ 'stats' ][ j ][ 0 ],
required_data [ i ][ 'stats' ][ j ][ 3 ],
tables [ i ][ 'stats' ][ j ][ 4 ],
tables [ i ][ 'stats' ][ j ][ 5 ],
tables [ i ][ 'stats' ][ j ][ 6 ],
required_data [ i ][ 'stats' ][ j ][ 4 ],
required_data [ i ][ 'stats' ][ j ][ 5 ]])) ))
2023-03-26 11:38:51 +03:00
sigma_beta1 = round ( math . sqrt ( avg ( list ( map ( lambda x : x ** 2 , list ( zip ( * required_data [ "1" ][ 'stats' ]))[ 2 ]))) + avg ( list ( zip ( * required_data [ "1" ][ 'stats' ]))[ 2 ]) ** 2 ), r )
sigma_beta2 = round ( math . sqrt ( avg ( list ( map ( lambda x : x ** 2 , list ( zip ( * required_data [ "1" ][ 'stats' ]))[ 5 ]))) + avg ( list ( zip ( * required_data [ "1" ][ 'stats' ]))[ 5 ]) ** 2 ), r )
sigma_beta3 = round ( math . sqrt ( avg ( list ( map ( lambda x : x ** 2 , list ( zip ( * required_data [ "2" ][ 'stats' ]))[ 2 ]))) + avg ( list ( zip ( * required_data [ "2" ][ 'stats' ]))[ 2 ]) ** 2 ), r )
sigma_beta4 = round ( math . sqrt ( avg ( list ( map ( lambda x : x ** 2 , list ( zip ( * required_data [ "2" ][ 'stats' ]))[ 5 ]))) + avg ( list ( zip ( * required_data [ "2" ][ 'stats' ]))[ 5 ]) ** 2 ), r )
sigma_t1 = round ( math . sqrt ( avg ( list ( map ( lambda x : x ** 2 , list ( zip ( * required_data [ "1" ][ 'stats' ]))[ 1 ]))) + avg ( list ( zip ( * required_data [ "1" ][ 'stats' ]))[ 1 ]) ** 2 ), r )
sigma_t2 = round ( math . sqrt ( avg ( list ( map ( lambda x : x ** 2 , list ( zip ( * required_data [ "1" ][ 'stats' ]))[ 3 ]))) + avg ( list ( zip ( * required_data [ "1" ][ 'stats' ]))[ 3 ]) ** 2 ), r )
sigma_t3 = round ( math . sqrt ( avg ( list ( map ( lambda x : x ** 2 , list ( zip ( * required_data [ "2" ][ 'stats' ]))[ 1 ]))) + avg ( list ( zip ( * required_data [ "2" ][ 'stats' ]))[ 1 ]) ** 2 ), r )
sigma_t4 = round ( math . sqrt ( avg ( list ( map ( lambda x : x ** 2 , list ( zip ( * required_data [ "2" ][ 'stats' ]))[ 3 ]))) + avg ( list ( zip ( * required_data [ "2" ][ 'stats' ]))[ 3 ]) ** 2 ), r )
print ( "σβ (1-4) (DO NOT USE):" , sigma_beta1 / avg ( list ( zip ( * required_data [ "1" ][ 'stats' ]))[ 2 ]), sigma_beta2 / avg ( list ( zip ( * required_data [ "1" ][ 'stats' ]))[ 5 ]), sigma_beta3 / avg ( list ( zip ( * required_data [ "2" ][ 'stats' ]))[ 2 ]), sigma_beta4 / avg ( list ( zip ( * required_data [ "2" ][ 'stats' ]))[ 5 ]))
print ( "σ t (1-4) (DO NOT USE):" , sigma_t1 / avg ( list ( zip ( * required_data [ "1" ][ 'stats' ]))[ 1 ]), sigma_t2 / avg ( list ( zip ( * required_data [ "1" ][ 'stats' ]))[ 3 ]), sigma_t3 / avg ( list ( zip ( * required_data [ "2" ][ 'stats' ]))[ 1 ]), sigma_t4 / avg ( list ( zip ( * required_data [ "2" ][ 'stats' ]))[ 3 ]))