Exemple #1
0
    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])
Exemple #7
0
    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])
Exemple #8
0
    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()
Exemple #9
0
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 = [])
Exemple #10
0
'''
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()