def read_tape6(self, directory, filename): '''read_tape6 does currently not take any input parameters. It uses the directory and filename specified in the beginning of the function. They should point to a .tp6 modtran output file with MODTRAN format. The function returns the line numbers from the beginning and end of a block of data, as well as a list of parameters, which label each row of data in the .tp7 file''' modtran_functions = ModtranFunctions() results_directory = directory results_filename = filename tape6_directory = os.path.join(results_directory, results_filename) beginning_data = [] end_data = [] '''searches for keywords in tape 7 and determines the lines in which data begins and stops''' with open(tape6_directory, 'r') as tape6: searchlines = tape6.readlines() for i, line in enumerate(searchlines): if 'FREQ' in line: list_parameters = line.split(' ') modtran_functions.remove_from_list(list_parameters, '') if 'CM-1' in searchlines[i + 1]: beginning_data.append(i + 2) else: beginning_data.append(i + 1) elif 'WAVELENGTH' in line: list_parameters = line.split(' ') modtran_functions.remove_from_list(list_parameters, '') # needs to be verified, if 'NM' is the correct term used in tp7 files if 'NM' in searchlines[i + 1]: beginning_data.append(i + 2) else: beginning_data.append(i + 1) elif '-9999.' in line: end_data.append(i - 1) if len(beginning_data) != len(end_data): print( 'reading tape6: number of starting points is not equal to number of endpoints' ) #print (beginning_data) #print (end_data) #print (list_parameters) return ({ 'beginning_data': beginning_data, 'end_data': end_data, 'list_parameters': list_parameters })
def get_list_parameters(self, file_directory, filename, file_extension): modtran_functions = ModtranFunctions() filename = filename + file_extension universal_directory = os.path.join(file_directory, filename) beginning_data = [] end_data = [] '''searches for keywords in tape 7 and determines the lines in which data begins and stops''' with open(universal_directory, 'r') as universal: searchlines = universal.readlines() for i, line in enumerate(searchlines): if 'FREQ' in line: list_parameters = line.split(' ') print(list_parameters) modtran_functions.remove_from_list(list_parameters, '') if 'CM-1' in searchlines[i + 1]: beginning_data.append(i + 2) else: beginning_data.append(i + 1) elif 'WAVLEN (NM)' in line: list_parameters = line.split(' ') modtran_functions.remove_from_list(list_parameters, '') if 'NM' in searchlines[i + 1]: beginning_data.append(i + 2) else: beginning_data.append(i + 1) elif '-9999.' in line: end_data.append(i - 1) if len(beginning_data) != len(end_data): print( 'reading .7sc: number of starting points is not equal to number of endpoints' ) list_parameters2 = [] for string in list_parameters: tmp = string.strip('\n') list_parameters2.append(tmp) print(list(enumerate(list_parameters2)))
def __init__(self): self.stan_parm = StandardParameters() self.tp5_directory = self.stan_parm.output_directory self.filename = self.stan_parm.tp5_filename self.modtran_functions = ModtranFunctions()
class BuildTape5(object): def __init__(self): self.stan_parm = StandardParameters() self.tp5_directory = self.stan_parm.output_directory self.filename = self.stan_parm.tp5_filename self.modtran_functions = ModtranFunctions() def assemble_tape5(self, mat): self.card1 = self.modtran_functions.build_card1(self.modtran_functions.find_in_array(mat, 'MODTRN'), self.modtran_functions.find_in_array(mat, 'LYMOLC'), self.modtran_functions.find_in_array(mat, 'MODEL'), self.modtran_functions.find_in_array(mat, 'ITYPE'), self.modtran_functions.find_in_array(mat, 'IEMSCT'), self.modtran_functions.find_in_array(mat, 'IMULT'), self.modtran_functions.find_in_array(mat, 'I_RD2C'), self.modtran_functions.find_in_array(mat, 'NOPRNT')) self.card1a = self.modtran_functions.build_card1a(self.modtran_functions.find_in_array(mat, 'DIS'), self.modtran_functions.find_in_array(mat, 'NSTR'), self.modtran_functions.find_in_array(mat, 'CO2MX'), self.modtran_functions.find_in_array(mat, 'H2OSTR'), self.modtran_functions.find_in_array(mat, 'O3STR'), self.modtran_functions.find_in_array(mat, 'LBMNAM'), self.modtran_functions.find_in_array(mat, 'SOLCON'), self.modtran_functions.find_in_array(mat, 'CDASTM')) self.card1a2 = self.modtran_functions.build_card1a2(self.modtran_functions.find_in_array(mat, 'BMNAME')) self.card2 = self.modtran_functions.build_card2(self.modtran_functions.find_in_array(mat, 'IHAZE'), self.modtran_functions.find_in_array(mat, 'ICSTL'), self.modtran_functions.find_in_array(mat, 'ICLD'), self.modtran_functions.find_in_array(mat, 'VIS'), self.modtran_functions.find_in_array(mat, 'WSS'), self.modtran_functions.find_in_array(mat, 'WHH'), self.modtran_functions.find_in_array(mat, 'GNDALT')) self.card3sta = self.modtran_functions.build_card3_sta(self.modtran_functions.find_in_array(mat, 'H1_sta'), self.modtran_functions.find_in_array(mat, 'H2_sta'), self.modtran_functions.find_in_array(mat, 'ANGLE_sta'), self.modtran_functions.find_in_array(mat, 'RANGE_sta')) self.card3alt = self.modtran_functions.build_card3_alt(self.modtran_functions.find_in_array(mat, 'H1ALT'), self.modtran_functions.find_in_array(mat, 'H2_alt'), self.modtran_functions.find_in_array(mat, 'ANGLE_alt'), self.modtran_functions.find_in_array(mat, 'IDAY_alt')) self.card3a1 = self.modtran_functions.build_card3a1(self.modtran_functions.find_in_array(mat, 'IPARM'), self.modtran_functions.find_in_array(mat, 'IDAY')) self.card3a2 = self.modtran_functions.build_card3a2(self.modtran_functions.find_in_array(mat, 'PARM1'), self.modtran_functions.find_in_array(mat, 'PARM2')) self.card4 = self.modtran_functions.build_card4(self.modtran_functions.find_in_array(mat, 'V1'), self.modtran_functions.find_in_array(mat, 'V2'), self.modtran_functions.find_in_array(mat, 'DV'), self.modtran_functions.find_in_array(mat, 'FWHM'), self.modtran_functions.find_in_array(mat, 'YFLAG'), self.modtran_functions.find_in_array(mat, 'XFLAG'), self.modtran_functions.find_in_array(mat, 'DLIMIT'), self.modtran_functions.find_in_array(mat, 'FLAGS')) self.modtran_functions.check_tape5(self.card1, self.card1a, self.card2, self.card3sta, self.card3alt, self.card3a1, self.card3a2, self.card4, self.card5) def write_tape5(self, mat): '''Caution: the order in 'used_cards' is important for the correct assembly of tape5''' self.filename = self.stan_parm.tp5_filename self.assemble_tape5(mat) available_cards = {'card1': self.card1, 'card1a': self.card1a, 'card1a2': self.card1a2, 'card2': self.card2, 'card3sta': self.card3sta, 'card3alt': self.card3alt, 'card3a1': self.card3a1, 'card3a2': self.card3a2, 'card4': self.card4, 'card5': self.card5} used_cards = ['card1', 'card1a'] if any(str(self.stan_parm.LBMNAM) in s for s in ['T', 't', '2', '4']): used_cards.append('card1a2') used_cards.append('card2') if any(str(self.stan_parm.IEMSCT) in s for s in ['2', '4']): used_cards.extend(['card3sta', 'card3a1', 'card3a2']) elif str(self.stan_parm.IEMSCT) == '3': used_cards.extend(['card3alt', 'card3a1', 'card3a2']) else: used_cards.append('card3sta') used_cards.extend(['card4', 'card5']) tape5 = [] for card in used_cards: if card in available_cards: tape5.append(available_cards[card]) tape5.append('\n') tape5.extend(['\n', '\n', '\n']) new_tape5 = open(self.tp5_directory + '/' + self.filename + '.tp5', 'a') new_tape5.writelines(tape5) new_tape5.close() def execute_modtran(self, parameter, beginning, end, step, list_values): '''this function creates a .tp5 file and starts a MODTRAN run It has the ability to iterate over a specific parameter Needs to set tape5''' MODTRN = self.stan_parm.MODTRN MODEL = self.stan_parm.MODEL LYMOLC = self.stan_parm.LYMOLC ITYPE = self.stan_parm.ITYPE IEMSCT = self.stan_parm.IEMSCT IMULT = self.stan_parm.IMULT I_RD2C = self.stan_parm.I_RD2C NOPRNT = self.stan_parm.NOPRNT DIS = self.stan_parm.DIS NSTR = self.stan_parm.NSTR CO2MX = self.stan_parm.CO2MX H2OSTR = self.stan_parm.H2OSTR O3STR = self.stan_parm.O3STR LBMNAM = self.stan_parm.LBMNAM SOLCON = self.stan_parm.SOLCON CDASTM = self.stan_parm.CDASTM BMNAME = self.stan_parm.BMNAME IHAZE = self.stan_parm.IHAZE ICSTL = self.stan_parm.ICSTL ICLD = self.stan_parm.ICLD VIS = self.stan_parm.VIS WSS = self.stan_parm.WSS WHH = self.stan_parm.WHH GNDALT = self.stan_parm.GNDALT H1_sta = self.stan_parm.H1_sta H2_sta = self.stan_parm.H2_sta ANGLE_sta = self.stan_parm.ANGLE_sta RANGE_sta = self.stan_parm.RANGE_sta H1ALT = self.stan_parm.H1ALT H2_alt = self.stan_parm.H2_alt ANGLE_alt = self.stan_parm.ANGLE_alt IDAY_alt = self.stan_parm.IDAY_alt IPARM = self.stan_parm.IPARM IDAY = self.stan_parm.IDAY PARM1 = self.stan_parm.PARM1 PARM2 = self.stan_parm.PARM2 V1 = self.stan_parm.V1 V2 = self.stan_parm.V2 DV = self.stan_parm.DV FWHM = self.stan_parm.FWHM YFLAG = self.stan_parm.YFLAG XFLAG = self.stan_parm.XFLAG DLIMIT = self.stan_parm.DLIMIT FLAGS = self.stan_parm.FLAGS parameter_mat = [[MODTRN, 'MODTRN', 1], [LYMOLC, 'LYMOLC', 1], [MODEL, 'MODEL', 1], [ITYPE, 'ITYPE', 4], [IEMSCT, 'IEMSCT', 5], [IMULT, 'IMULT', 5], [I_RD2C, 'I_RD2C', 5], [NOPRNT, 'NOPRNT', 5], [DIS, 'DIS', 1], [NSTR, 'NSTR', 3], [CO2MX, 'CO2MX', 10], [H2OSTR, 'H2OSTR', 10], [O3STR, 'O3STR', 10], [LBMNAM, 'LBMNAM', 2], [SOLCON, 'SOLCON', 10], [CDASTM, 'CDASTM', 1], [BMNAME, 'BMNAME', 80], [IHAZE, 'IHAZE', 3], [ICSTL, 'ICSTL', 5], [ICLD, 'ICLD', 5], [VIS, 'VIS', 10], [WSS, 'WSS', 10], [WHH, 'WHH', 10], [GNDALT, 'GNDALT', 10], [H1_sta, 'H1_sta', 10], [H2_sta, 'H2_sta', 10], [ANGLE_sta, 'ANGLE_sta', 10], [RANGE_sta, 'RANGE_sta', 10], [H1ALT, 'H1ALT', 10], [H2_alt, 'H2_alt', 10], [ANGLE_alt, 'ANGLE_alt', 10], [IDAY_alt, 'IDAY_alt', 5], [IPARM, 'IPARM', 5], [IDAY, 'IDAY', 5], [PARM1, 'PARM1', 10], [PARM2, 'PARM2', 10], [V1, 'V1', 10], [V2, 'V2', 10], [DV, 'DV', 10], [FWHM, 'FWHM', 10], [YFLAG, 'YFLAG', 1], [XFLAG, 'XFLAG', 1], [DLIMIT, 'DLIMIT', 8], [FLAGS, 'FLAGS', 7]] for row in parameter_mat: self.modtran_functions.adjust_length(str(row[0]), row[2]) open(self.tp5_directory + '/' + self.filename + '.tp5', 'w').close() '''erases all contents from this file''' for key in parameter_mat: if key[1] == parameter: if list_values == []: key[0] = self.modtran_functions.adjust_length(str(beginning), key[2]) self.card5 = ' 1!card 5' self.write_tape5(mat = parameter_mat) i = beginning while i < end-step: i += step key[0] = self.modtran_functions.adjust_length(str(i), key[2]) self.card5 = ' 1!card 5' self.write_tape5(mat = parameter_mat) key[0] = self.modtran_functions.adjust_length(str(end), key[2]) self.card5 = ' 0!card 5' self.write_tape5(mat = parameter_mat) else: i2 = 1 while i2 < len(list_values): print (len(list_values)) i2 += 1 key[0] = self.modtran_functions.adjust_length(str(list_values[i2]), key[2]) self.card5 = ' 1!card 5' self.write_tape5(mat = parameter_mat) key[0] = self.modtran_functions.adjust_length(str(list_values[-1]), key[2]) self.card5 = ' 0!card 5' self.write_tape5(mat = parameter_mat) '''modtran_exe = (r'C:\Program Files SR\Spectral Sciences, Inc\MODTRAN(R)\5.2.1\Mod5.2.1qwin.exe') process = subprocess.Popen(modtran_exe, stdout=subprocess.PIPE) process.wait()''' #subprocess.call(os.path.join(self.stan_parm.output_directory + 'Mod5.2.1qwin.exe')) #subprocess.call(r'C:\Programme_SR\Spectral Sciences, Inc\MODTRAN(R)\5.2.1Mod5.2.1qwin.exe') #BuildTape5().execute_modtran(parameter = 'ITYPE', beginning = 1, end = 5, step = 0.5, list_values = [])
class TestModtranFunctions(unittest.TestCase): modtran_functions = ModtranFunctions() def test_build_card1(self): result = modtran_functions.build_card1(self, MODEL='2', LYMOLC='+', ITYPE='2', IEMSCT='2', IMULT='1') self.assertEqual( result, 'TM +2 2 2 1 0 0 0 0 0 0 0 0 1 0.300 0.00!Card 1', 'Card 1 is deficient') def test_build_card1a(self): result = modtran_functions.build_card1a(self, DIS='T', NSTR='8', CO2MX=' 365.00000', H2OSTR='', O3STR='') self.assertEqual( result, 'T 8 0. 365.00000 0F 4 F F F D !Card 1a', 'Card 1a is deficient') def test_build_card2(self): pass def test_build_card3_sta(self): pass def test_build_card3_alt(self): pass def test_build_card3a1(self): pass def test_build_card3a2(self): pass def test_build_card4(self): pass def test_check_tape5(self): result1 = modtran_functions.check_tape5( self, CARD_1= ' ', CARD_1A= ' ', CARD_2= ' ', CARD_3_STA= ' ', CARD_3_ALT= ' ', CARD_3A1=' ', CARD_3A2= ' ', CARD_4= ' ', CARD_5=' ') self.assertEqual(result1, 'Tape length OK', 'check_tape5 failed') result2 = modtran_functions.check_tape5( self, CARD_1= ' ', CARD_1A= ' ', CARD_2= ' ', CARD_3_STA= ' ', CARD_3_ALT= ' ', CARD_3A1=' ', CARD_3A2= ' ', CARD_4= ' ', CARD_5=' ') self.assertEqual(result2, 'Card 1 is deficient. Length 77 instead of 80\n', 'check_tape5 failed at card 1') result3 = modtran_functions.check_tape5( self, CARD_1= ' ', CARD_1A= ' ', CARD_2= ' ', CARD_3_STA= ' ', CARD_3_ALT= ' ', CARD_3A1=' ', CARD_3A2= ' ', CARD_4= ' ', CARD_5=' ') self.assertEqual(result3, 'Card 1A is deficient. Length 76 instead of 80\n', 'check_tape5 failed at card 1a') result4 = modtran_functions.check_tape5( self, CARD_1= ' ', CARD_1A= ' ', CARD_2= ' ', CARD_3_STA= ' ', CARD_3_ALT= ' ', CARD_3A1=' ', CARD_3A2= ' ', CARD_4= ' ', CARD_5=' ') self.assertEqual(result4, 'Card 2 is deficient. Length 75 instead of 80\n', 'check_tape5 failed at card 2') result5 = modtran_functions.check_tape5( self, CARD_1= ' ', CARD_1A= ' ', CARD_2= ' ', CARD_3_STA= ' ', CARD_3_ALT= ' ', CARD_3A1=' ', CARD_3A2= ' ', CARD_4= ' ', CARD_5=' ') self.assertEqual( result5, 'Card 3 (standart) is deficient. Length 74 instead of 80\n', 'check_tape5 failed at card 3 (standart)') result6 = modtran_functions.check_tape5( self, CARD_1= ' ', CARD_1A= ' ', CARD_2= ' ', CARD_3_STA= ' ', CARD_3_ALT= ' ', CARD_3A1=' ', CARD_3A2= ' ', CARD_4= ' ', CARD_5=' ') self.assertEqual( result6, 'Card 3 (alternative) is deficient. Length 62 instead of 65\n', 'check_tape5 failed at card 3 (alternative)') result7 = modtran_functions.check_tape5( self, CARD_1= ' ', CARD_1A= ' ', CARD_2= ' ', CARD_3_STA= ' ', CARD_3_ALT= ' ', CARD_3A1=' ', CARD_3A2= ' ', CARD_4= ' ', CARD_5=' ') self.assertEqual(result7, 'Card 3A1 is deficient. Length 17 instead of 20\n', 'check_tape5 failed at card 3a1') result8 = modtran_functions.check_tape5( self, CARD_1= ' ', CARD_1A= ' ', CARD_2= ' ', CARD_3_STA= ' ', CARD_3_ALT= ' ', CARD_3A1=' ', CARD_3A2= ' ', CARD_4= ' ', CARD_5=' ') self.assertEqual(result8, 'Card 3A2 is deficient. Length 77 instead of 80\n', 'check_tape5 failed at card 3a2') result9 = modtran_functions.check_tape5( self, CARD_1= ' ', CARD_1A= ' ', CARD_2= ' ', CARD_3_STA= ' ', CARD_3_ALT= ' ', CARD_3A1=' ', CARD_3A2= ' ', CARD_4= ' ', CARD_5=' ') self.assertEqual( result9, 'Card 4 is deficient. Length 73 instead of 70\nCard 2 is deficient. Length 82 instead of 80\nCard 3A1 is deficient. Length 17 instead of 20\n', 'check_tape5 failed at multiple cards') def test_adjust_length(self): result = modtran_functions.adjust_length(self, '', 10) self.assertEqual(result, ' ', 'adjust length failed') result2 = modtran_functions.adjust_length(self, '456', 8) self.assertEqual(result2, '456 ', 'adjust length failed')
def read_seven_sc(self, seven_sc_directory, filename): '''read_seven_sc does currently not take any input parameters. It uses the directory and filename specified in the beginning of the function. They should point to a .tp7 modtran output file with common format. The function returns the line numbers from the beginning and end of a block of data, as well as a list of parameters, which label each row of data in the .tp7 file''' modtran_functions = ModtranFunctions() #results_directory = r'C:\Users\ried_st\OneDrive\Austausch\Programming\TEST' #results_filename = 'ASCIIwrite.tp7' filename = filename + '.7sc' seven_sc_directory = os.path.join(seven_sc_directory, filename) beginning_data = [] end_data = [] '''searches for keywords in tape 7 and determines the lines in which data begins and stops''' with open(seven_sc_directory, 'r') as seven_sc: searchlines = seven_sc.readlines() for i, line in enumerate(searchlines): if 'FREQ' in line: list_parameters = line.split(' ') modtran_functions.remove_from_list(list_parameters, '') if 'CM-1' in searchlines[i + 1]: beginning_data.append(i + 2) else: beginning_data.append(i + 1) elif 'WAVLEN (NM)' in line: list_parameters = line.split(' ') modtran_functions.remove_from_list(list_parameters, '') if 'NM' in searchlines[i + 1]: beginning_data.append(i + 2) else: beginning_data.append(i + 1) elif '-9999.' in line: end_data.append(i - 1) if len(beginning_data) != len(end_data): print( 'reading .7sc: number of starting points is not equal to number of endpoints' ) list_parameters2 = [] for string in list_parameters: tmp = string.strip('\n') list_parameters2.append(tmp) complete_data = [] for i in range(0, len(beginning_data)): #if tape5 contains multiple input blocks, there are also multiple output blocks. len(beginning_data) is the number of output blocks block = [] for j in range(0, 2): #each parameter row need to be extracted separately tmp = [] for k in range(beginning_data[i], end_data[i] + 1): tmp2 = searchlines[k].split(' ') modtran_functions.remove_from_list(tmp2, '') tmp4 = [] for string in tmp2: tmp3 = string.strip('\n') tmp4.append(tmp3) tmp.append(tmp4[j]) block.append(tmp) complete_data.append(block) #print (beginning_data) #print (end_data) #print (list_parameters) return ([beginning_data, end_data, list_parameters2, complete_data])
def read_tape7(self, tape7_directory, filename, write_to_separate_files): '''Input: - tape7_directory: the path directory where the .tp7 is located - filename: filename of the .tp7 file The function returns the line numbers from the beginning and end of a block of data, as well as a list of parameters, which label each row of data in the .tp7 file The output is a list with the form: [beginning_data, end_data, list_parameters2, complete_data] complete_data contains all the data from the file in a matrix. The first index accesses the block, the second one the line inside a block (according to list_parameters, which can be accessed by Tape7_reader.get_list_parameters() Example: tape7 = Tape7.read_tape7(r'C:\\Users\\ried_st\\Desktop\\Temporal eclipse workspace\\PG_Alte Modtran Rechnungen\\neu gerechnet\\20160217_1', '20160217_1', 'y') tape7[3][0][2] would return the third line of the first block of complete_data''' modtran_functions = ModtranFunctions() #results_directory = r'C:\Users\ried_st\OneDrive\Austausch\Programming\TEST' #results_filename = 'ASCIIwrite.tp7' filename_ext = filename + '.tp7' tape7_path = os.path.join(tape7_directory, filename_ext) beginning_data = [] end_data = [] '''searches for keywords in tape 7 and determines the lines in which data begins and stops''' with open(tape7_path, 'r') as tape7: searchlines = tape7.readlines() for i, line in enumerate(searchlines): if 'FREQ' in line: list_parameters = line.split(' ') modtran_functions.remove_from_list(list_parameters, '') if 'CM-1' in searchlines[i + 1]: beginning_data.append(i + 2) else: beginning_data.append(i + 1) elif 'WAVLEN (NM)' in line: list_parameters = line.split(' ') modtran_functions.remove_from_list(list_parameters, '') if 'NM' in searchlines[i + 1]: beginning_data.append(i + 2) else: beginning_data.append(i + 1) elif '-9999.' in line: end_data.append(i - 1) if len(beginning_data) != len(end_data): print( 'reading tape 7: number of starting points is not equal to number of endpoints' ) list_parameters2 = [] for string in list_parameters: tmp = string.strip('\n') list_parameters2.append(tmp) complete_data = [] for i in range(0, len(beginning_data)): '''if tape7 contains multiple input blocks, there are also multiple output blocks. len(beginning_data) is the number of output blocks''' block = [] for j in range(0, len(list_parameters)): '''each parameter row needs to be extracted separately''' tmp = [] for k in range(beginning_data[i], end_data[i] + 1): '''iterates over all lines of one row in one block and writes the values into ''' tmp2 = searchlines[k].split(' ') modtran_functions.remove_from_list(tmp2, '') tmp4 = [] for string in tmp2: tmp3 = string.strip('\n') tmp4.append(tmp3) tmp.append(tmp4[j]) block.append(tmp) complete_data.append(block) #print (beginning_data) #print (end_data) #print (list_parameters) if write_to_separate_files == 'y': with open(tape7_path, 'r') as tape7: searchlines = tape7.readlines() for i in range(0, len(beginning_data)): data_write = searchlines[beginning_data[i - 1] - 1:end_data[i - 1] + 1] new_file = open( tape7_directory + '\\' + filename + '_' + str(i) + '.dat', 'w') new_file.writelines(data_write) new_file.close() # new_tape5 = open(input_directory + '/' + filename + '.dat', 'w') # new_tape5.writelines(output_file) # new_tape5.close() return ([beginning_data, end_data, list_parameters2, complete_data])
def __init__(self): self.stan_parm = StandardParameters() self.tp5_directory = self.stan_parm.output_directory self.filename = self.stan_parm.tp5_filename # This is the filename of the future tape5 self.mod_fun = ModtranFunctions()
class BuildTape5(object): def __init__(self): self.stan_parm = StandardParameters() self.tp5_directory = self.stan_parm.output_directory self.filename = self.stan_parm.tp5_filename # This is the filename of the future tape5 self.mod_fun = ModtranFunctions() def assemble_tape5(self, mat): # CARD_1 T_BEST = ' ' M1 = M2 = M3 = M4 = M5 = M6 = MDEF = ' 0' TPTEMP = ' .000' self.CARD_1 = (self.mod_fun.find_in_array(mat, 'MODTRN') + self.mod_fun.find_in_array(mat, 'SPEED') + self.mod_fun.find_in_array(mat, 'BINARY') + self.mod_fun.find_in_array(mat, 'LYMOLC') + self.mod_fun.find_in_array(mat, 'MODEL') + T_BEST + self.mod_fun.find_in_array(mat, 'ITYPE') + self.mod_fun.find_in_array(mat, 'IEMSCT') + self.mod_fun.find_in_array(mat, 'IMULT') + M1 + M2 + M3 + M4 + M5 + M6 + MDEF + self.mod_fun.find_in_array(mat, 'I_RD2C') + self.mod_fun.find_in_array(mat, 'NOPRNT') + TPTEMP + self.mod_fun.find_in_array(mat, 'SURREF') + '!card 1.') # CARD_1A DISAZM = ' ' DISALB = ' ' SFWHM = ' 0.' C_PROF = ' ' LSUNFL = ' ' LFLTNM = H2OAER = ' ' CDTDIR = ' ' self.CARD_1A = (self.mod_fun.find_in_array(mat, 'DIS') + DISAZM + DISALB + self.mod_fun.find_in_array(mat, 'NSTR') + SFWHM + self.mod_fun.find_in_array(mat, 'CO2MX') + self.mod_fun.find_in_array(mat, 'H2OSTR') + self.mod_fun.find_in_array(mat, 'O3STR') + C_PROF + LSUNFL + self.mod_fun.find_in_array(mat, 'LBMNAM') + LFLTNM + H2OAER + CDTDIR + self.mod_fun.find_in_array(mat, 'SOLCON') + self.mod_fun.find_in_array(mat, 'CDASTM') + self.mod_fun.find_in_array(mat, 'ASTMC') + self.mod_fun.find_in_array(mat, 'ASTMX') + self.mod_fun.find_in_array(mat, 'ASTMO') + self.mod_fun.find_in_array(mat, 'AERRH') + self.mod_fun.find_in_array(mat, 'NSSALB') + '!card 1a.') #CARD_1A2 BMNAME = self.mod_fun.find_in_array(mat, 'BMNAME') SPACER = self.mod_fun.adjust_length('', (256 - len(str(BMNAME)))) self.CARD_1A2 = (BMNAME + SPACER + '!card 1a2') #CARD_2 APLUS = ' ' CNOVAM = ' ' ISEASN = ' 0' ARUSS = ' ' IVULCN = ' 0' IVSA = ' 0' RAINRT = ' ' self.CARD_2 = (APLUS + self.mod_fun.find_in_array(mat, 'IHAZE') + CNOVAM + ISEASN + ARUSS + IVULCN + self.mod_fun.find_in_array(mat, 'ICSTL') + self.mod_fun.find_in_array(mat, 'ICLD') + IVSA + self.mod_fun.find_in_array(mat, 'VIS') + self.mod_fun.find_in_array(mat, 'WSS') + self.mod_fun.find_in_array(mat, 'WHH') + RAINRT + self.mod_fun.find_in_array(mat, 'GNDALT') + '!card 2.') #CARD3_Standard BETA = ' 0.' RO = ' 0.' LENN = ' 0' PHI = ' ' self.STA = (self.mod_fun.find_in_array(mat, 'H1_sta') + self.mod_fun.find_in_array(mat, 'H2_sta') + self.mod_fun.find_in_array(mat, 'ANGLE_sta') + self.mod_fun.find_in_array(mat, 'RANGE_sta') + BETA + RO + LENN + ' ' + PHI + '!card 3 standart') #CARD3_Alternative RO = ' ' ISOURC = ' 0' ANGLEM = ' 0' self.CARD3_ALT = (self.mod_fun.find_in_array(mat, 'H1ALT') + self.mod_fun.find_in_array(mat, 'H2_alt') + self.mod_fun.find_in_array(mat, 'ANGLE_alt') + self.mod_fun.find_in_array(mat, 'IDAY_alt') + ' ' + RO + ISOURC + ANGLEM + '!card 3 alternative' ) # no idea why I added the 5 spaces #A1 IPH = ' 2' ISOURC = ' 0' self.A1 = (self.mod_fun.find_in_array(mat, 'IPARM') + IPH + self.mod_fun.find_in_array(mat, 'IDAY') + ISOURC + '!card 3a1') #A2 PARM3 = ' 1' PARM4 = ' 2' TIME = ' 3' PSIPO = ' 4' ANGLEM = ' 5' G = ' 6' self.A2 = (self.mod_fun.find_in_array(mat, 'PARM1') + self.mod_fun.find_in_array(mat, 'PARM2') + PARM3 + PARM4 + TIME + PSIPO + ANGLEM + G + '!card 3a2') #CARD_4 MLFLX = ' ' VRFRAC = ' ' self.CARD_4 = (self.mod_fun.find_in_array(mat, 'V1') + self.mod_fun.find_in_array(mat, 'V2') + self.mod_fun.find_in_array(mat, 'DV') + self.mod_fun.find_in_array(mat, 'FWHM') + self.mod_fun.find_in_array(mat, 'YFLAG') + self.mod_fun.find_in_array(mat, 'XFLAG') + self.mod_fun.find_in_array(mat, 'DLIMIT') + self.mod_fun.find_in_array(mat, 'FLAGS') + MLFLX + VRFRAC + '!card 4.') #CARD_4A self.CARD_4A = (self.mod_fun.find_in_array(mat, 'NSURF') + self.mod_fun.find_in_array(mat, 'AATEMP') + self.mod_fun.find_in_array(mat, 'DH2O') + self.mod_fun.find_in_array(mat, 'MLTRFL') + '!card 4a') #CARD_4L1 SALBFL = self.mod_fun.find_in_array(mat, 'SALBFL') SPACER = self.mod_fun.adjust_length('', (256 - len(str(SALBFL)))) self.CARD_4L1 = (SALBFL + SPACER + '!card 4l1') #CARD_4L2 CSALB = self.mod_fun.find_in_array(mat, 'CSALB') SPACER = self.mod_fun.adjust_length('', (80 - len(str(CSALB)))) self.CARD_4L2 = (CSALB + SPACER + '!card 4l2') self.mod_fun.check_tape5(self.CARD_1, self.CARD_1A, self.CARD_2, self.STA, self.CARD3_ALT, self.A1, self.A2, self.CARD_4, self.CARD_4A, self.CARD_4L1, self.CARD_4L2, self.CARD_5) def write_tape5(self, mat): '''Caution: the order in 'used_cards' is important for the correct assembly of tape5''' self.assemble_tape5(mat) available_cards = { 'CARD_1': self.CARD_1, 'CARD_1A': self.CARD_1A, 'CARD_1A2': self.CARD_1A2, 'CARD_2': self.CARD_2, 'STA': self.STA, 'ALT': self.CARD3_ALT, 'A1': self.A1, 'A2': self.A2, 'CARD_4': self.CARD_4, 'CARD_4A': self.CARD_4A, 'CARD_4L1': self.CARD_4L1, 'CARD_4L2': self.CARD_4L2, 'CARD_5': self.CARD_5 } used_cards = ['CARD_1', 'CARD_1A'] if any( str(self.stan_parm.LBMNAM) in s for s in ['T', 't', '2', '4'] ): # should get value not from stan_parm, but from parameter_mat used_cards.append('CARD_1A2') used_cards.append('CARD_2') if any(str(self.stan_parm.IEMSCT) in s for s in ['2', '4']): used_cards.extend(['STA', 'A1', 'A2']) elif str(self.stan_parm.IEMSCT) == '3': used_cards.extend(['ALT', 'A1', 'A2']) else: used_cards.append('STA') if any( str(self.mod_fun.find_in_array(mat, 'PARM1')) in s for s in ['L', 'l']): used_cards.extend(['CARD_4A', 'CARD_4L1', 'CARD_4L2']) used_cards.extend(['CARD_4', 'CARD_5']) tape5 = [] for card in used_cards: if card in available_cards: tape5.append(available_cards[card]) tape5.append('\n') new_tape5 = open(self.tp5_directory + '/' + self.filename + '.tp5', 'a') new_tape5.writelines(tape5) new_tape5.close() def execute_modtran(self, parameter, beginning, end, step, list_values): '''this function creates a .tp5 file and starts a MODTRAN run It has the ability to iterate over a specific parameter Needs to set tape5 Possible improvement: modify function to perform a single run with all specified values if parameter = '' ''' MODTRN = str(self.stan_parm.MODTRN) SPEED = str(self.stan_parm.SPEED) BINARY = str(self.stan_parm.BINARY) MODEL = str(self.stan_parm.MODEL) LYMOLC = str(self.stan_parm.LYMOLC) ITYPE = str(self.stan_parm.ITYPE) IEMSCT = str(self.stan_parm.IEMSCT) IMULT = str(self.stan_parm.IMULT) I_RD2C = str(self.stan_parm.I_RD2C) NOPRNT = str(self.stan_parm.NOPRNT) SURREF = str(self.stan_parm.SURREF) DIS = str(self.stan_parm.DIS) NSTR = str(self.stan_parm.NSTR) CO2MX = str(self.stan_parm.CO2MX) H2OSTR = str(self.stan_parm.H2OSTR) O3STR = str(self.stan_parm.O3STR) LBMNAM = str(self.stan_parm.LBMNAM) SOLCON = str(self.stan_parm.SOLCON) CDASTM = str(self.stan_parm.CDASTM) BMNAME = str(self.stan_parm.BMNAME) IHAZE = str(self.stan_parm.IHAZE) ICSTL = str(self.stan_parm.ICSTL) ICLD = str(self.stan_parm.ICLD) VIS = str(self.stan_parm.VIS) WSS = str(self.stan_parm.WSS) WHH = str(self.stan_parm.WHH) GNDALT = str(self.stan_parm.GNDALT) H1_sta = str(self.stan_parm.H1_sta) H2_sta = str(self.stan_parm.H2_sta) ANGLE_sta = str(self.stan_parm.ANGLE_sta) RANGE_sta = str(self.stan_parm.RANGE_sta) H1ALT = str(self.stan_parm.H1ALT) H2_alt = str(self.stan_parm.H2_alt) ANGLE_alt = str(self.stan_parm.ANGLE_alt) IDAY_alt = str(self.stan_parm.IDAY_alt) IPARM = str(self.stan_parm.IPARM) IDAY = str(self.stan_parm.IDAY) PARM1 = str(self.stan_parm.PARM1) PARM2 = str(self.stan_parm.PARM2) V1 = str(self.stan_parm.V1) V2 = str(self.stan_parm.V2) DV = str(self.stan_parm.DV) FWHM = str(self.stan_parm.FWHM) YFLAG = str(self.stan_parm.YFLAG) XFLAG = str(self.stan_parm.XFLAG) DLIMIT = str(self.stan_parm.DLIMIT) FLAGS = str(self.stan_parm.FLAGS) ASTMC = str(self.stan_parm.ASTMC) ASTMX = str(self.stan_parm.ASTMX) ASTMO = str(self.stan_parm.ASTMO) AERRH = str(self.stan_parm.AERRH) NSSALB = str(self.stan_parm.NSSALB) # CARD_4A NSURF = str(self.stan_parm.NSURF) AATEMP = str(self.stan_parm.AATEMP) DH2O = str(self.stan_parm.DH2O) MLTRFL = str(self.stan_parm.MLTRFL) SALBFL = str(self.stan_parm.SALBFL) CSALB = str(self.stan_parm.CSALB) parameter_mat = [[MODTRN, 'MODTRN', 1], [SPEED, 'SPEED', 1], [BINARY, 'BINARY', 1], [LYMOLC, 'LYMOLC', 1], [MODEL, 'MODEL', 1], [ITYPE, 'ITYPE', 4], [IEMSCT, 'IEMSCT', 5], [IMULT, 'IMULT', 5], [I_RD2C, 'I_RD2C', 5], [NOPRNT, 'NOPRNT', 5], [SURREF, 'SURREF', 7], [DIS, 'DIS', 1], [NSTR, 'NSTR', 3], [CO2MX, 'CO2MX', 10], [H2OSTR, 'H2OSTR', 10], [O3STR, 'O3STR', 10], [LBMNAM, 'LBMNAM', 2], [SOLCON, 'SOLCON', 10], [CDASTM, 'CDASTM', 1], [BMNAME, 'BMNAME', 256], [IHAZE, 'IHAZE', 3], [ICSTL, 'ICSTL', 5], [ICLD, 'ICLD', 5], [VIS, 'VIS', 10], [WSS, 'WSS', 10], [WHH, 'WHH', 10], [GNDALT, 'GNDALT', 10], [H1_sta, 'H1_sta', 10], [H2_sta, 'H2_sta', 10], [ANGLE_sta, 'ANGLE_sta', 10], [RANGE_sta, 'RANGE_sta', 10], [H1ALT, 'H1ALT', 10], [H2_alt, 'H2_alt', 10], [ANGLE_alt, 'ANGLE_alt', 10], [IDAY_alt, 'IDAY_alt', 5], [IPARM, 'IPARM', 5], [IDAY, 'IDAY', 5], [PARM1, 'PARM1', 10], [PARM2, 'PARM2', 10], [V1, 'V1', 10], [V2, 'V2', 10], [DV, 'DV', 10], [FWHM, 'FWHM', 10], [YFLAG, 'YFLAG', 1], [XFLAG, 'XFLAG', 1], [DLIMIT, 'DLIMIT', 8], [FLAGS, 'FLAGS', 7], [ASTMC, 'ASTMC', 9], [ASTMX, 'ASTMX', 10], [ASTMO, 'ASTMO', 10], [AERRH, 'AERRH', 10], [NSSALB, 'NSSALB', 10], [NSURF, 'NSURF', 1], [AATEMP, 'AATEMP', 9], [DH2O, 'DH2O', 9], [MLTRFL, 'MLTRFL', 1], [SALBFL, 'SALBFL', 256], [CSALB, 'CSALB', 80]] for row in parameter_mat: row[0] = self.mod_fun.adjust_length(str(row[0]), row[2]) open(self.tp5_directory + '/' + self.filename + '.tp5', 'w').close() '''erases all contents from this file''' for key in parameter_mat: if key[1] == parameter: # checks if the parameter given as function input matches a parameter in parameter_mat if list_values == []: # only uses beginning/end/step if there is no parameter given in parameter_mat key[0] = self.mod_fun.adjust_length(str(beginning), key[2]) self.CARD_5 = ' 1!card 5.' self.write_tape5(mat=parameter_mat) i = beginning # here the values for the different steps are calculated and then a tape5 added to the .tp5 file while i < end - step: i = np.add(i, step) key[0] = self.mod_fun.adjust_length(str(i), key[2]) self.CARD_5 = ' 1!card 5.' self.write_tape5(mat=parameter_mat) key[0] = self.mod_fun.adjust_length(str(end), key[2]) self.CARD_5 = ' 0!card 5.' self.write_tape5(mat=parameter_mat) else: # if list_values contains values i2 = 0 while i2 < len( list_values ) - 1: # takes all values except for the last in list_values and writes a tape5 with each value to the .tp5 file key[0] = self.mod_fun.adjust_length( str(list_values[i2]), key[2]) self.CARD_5 = ' 1!card 5.' self.write_tape5(mat=parameter_mat) i2 += 1 key[0] = self.mod_fun.adjust_length( str(list_values[-1]), key[2] ) # takes the last value of list_values and writes the last tape5 to the file self.CARD_5 = ' 0!card 5.' self.write_tape5(mat=parameter_mat) filename_2 = r'C:\Program Files SR\Spectral Sciences, Inc\MODTRAN(R)\5.2.1\mod5root.in' # the mod5root.in file tells MODTRAN which tape5 should be processed input_line = 'TEST/' + self.filename self.mod_fun.line_prepender( filename_2, '\n' ) # the name of the current tape5 is added to the mod5root.in file self.mod_fun.line_prepender(filename_2, input_line) os.chdir( r'C:\Program Files SR\Spectral Sciences, Inc\MODTRAN(R)\5.2.1') subprocess.Popen('Mod5.2.1cons.exe') #BuildTape5().execute_modtran(parameter = 'ITYPE', beginning = 1, end = 5, step = 0.5, list_values = [])
''' Created on Feb 3, 2016 @author: ried_st ''' import matplotlib.pyplot as plt from Main.modtran_functions import ModtranFunctions from Main.tape7_reader import Tape7_reader from Main.seven_sc_reader import Seven_sc_reader from Main.universal_reader import Universal_reader from Main.plot_series import Plot_series Main = ModtranFunctions() Tape7 = Tape7_reader() Seven_sc = Seven_sc_reader() Universal = Universal_reader() Plot = Plot_series() #tape7 = Tape7.read_tape7(r'C:\Users\ried_st\Desktop\Temporal eclipse workspace\PG_Alte Modtran Rechnungen\neu gerechnet\20160217_1', '20160217_1', 'y') #plt.plot(tape7[3][0][0], tape7[3][0][2]) #plt.show() #nanometers = Main.convert_wn_nm(tape7[3][0][0]) seven_sc = Seven_sc.read_seven_sc( r'C:\Users\ried_st\Desktop\Temporal eclipse workspace\PG_Alte Modtran Rechnungen\neu gerechnet\20160218_4_H2OSTR Serie', '20160218_4') #plt.plot(seven_sc[3][0][0], seven_sc[3][0][1]) #plt.show()