Commit 7e2b93d4 authored by Giovanni La Mura's avatar Giovanni La Mura
Browse files

Implement scan resources for SPHERE, CLUSTER, and INCLUSION

parent af7434e7
Loading
Loading
Loading
Loading
+322 −10
Original line number Diff line number Diff line
@@ -24,13 +24,14 @@
#  The script requires python3.

import math
import pdb
import re
from sys import argv

## \cond
__version__ = "0.10.10"
int_reg = re.compile(r'[-+]?[0-9]')
number_reg = re.compile(r'[-+]?[0-9]\.[0-9]+E?[-+][0-9]{2,5}')
int_reg = re.compile(r'[-+]?[0-9]+')
number_reg = re.compile(r'[-+]?[0-9]+\.[0-9]+(E[-+]?[0-9]+)?')
## \endcond

## \brief Main execution code.
@@ -47,7 +48,6 @@ def main():
    elif (config['help_mode']):
        print_help()
    else:
        # Will do something here.
        if (config['edfb_file'] == ''):
            print("ERROR: missing scatterer configuration file (--edfb EDFB_FILE).")
            result = 1
@@ -55,10 +55,23 @@ def main():
            print("ERROR: missing geometry configuration file (--geom GEOM_FILE).")
            result = 1
        else:
            print("Would finally run the script.")
            model = scan_model(config['edfb_file'], config['geom_file'])
            if (model is not None):
                print(model)
            else:
                result = 1
    return result

## \brief Transform a callable iterator object into an array.
#
#  \param[in,out] my_iter: `callable_iterator` Iterator to be transformed (gets consumed).
#  \returns array: `array`-like An array of items from the iterator.
def iter_to_array(my_iter):
    array = []
    for item in my_iter:
        array.append(item)
    return array

## \brief Parse the command line arguments.
#
#  The script behaviour can be modified through a set of optional arguments.
@@ -124,7 +137,6 @@ def print_help():
#  \returns model: `dict` A dictionary containing the model description.
def scan_model(edfb_name, geom_name):
    file_line = "INIT"
    read_lines = 0
    model = {
        'app': "",
        'nsph': 0,
@@ -137,26 +149,326 @@ def scan_model(edfb_name, geom_name):
        'vec_y': [],
        'vec_z': []
    }
    # PARSING OF SCATTERER CONFIGURATION
    read_lines = 0
    edfb_file = open(edfb_name, "r")
    file_line = edfb_file.readline()
    read_lines += 1
    iter_values = int_reg.finditer(file_line)
    if (len(iter_values) != 2):
    array_values = iter_to_array(iter_values)
    if (len(array_values) != 2):
        print("ERROR: %s is not a valid scatterer configuration file!"%edfb_name)
        print("   INVALID LINE: \"%s\""%file_line)
        print("   at line %d in %s."%(read_lines, file_line))
        print("   INVALID LINE: \"%s\""%file_line[:-1])
        print("   at line %d in %s."%(read_lines, edfb_name))
        edfb_file.close()
        return None
    model['nsph'] = int(iter_values[0].group())
    model['ies'] = int(iter_values[1].group())
    model['nsph'] = int(array_values[0].group())
    model['ies'] = int(array_values[1].group())
    if (model['ies'] > 0):
        model['app'] = "INCLUSION"
        file_line = edfb_file.readline()
        read_lines += 1
        str_line = file_line.replace('D', 'E').replace('d', 'E')
        iter_values = number_reg.finditer(str_line)
        array_values = iter_to_array(iter_values)
        if (len(array_values) != 3):
            print("ERROR: %s is not a valid scatterer configuration file!"%edfb_name)
            print("   INVALID LINE: \"%s\""%file_line[:-1])
            print("   at line %d in %s."%(read_lines, edfb_name))
            edfb_file.close()
            return None
        str_line = str_line[array_values[2].end():]
        iter_values = int_reg.finditer(str_line)
        array_values = iter_to_array(iter_values)
        if (len(array_values) != 4):
            print("ERROR: %s is not a valid scatterer configuration file!"%edfb_name)
            print("   INVALID LINE: \"%s\""%file_line[:-1])
            print("   at line %d in %s."%(read_lines, edfb_name))
            edfb_file.close()
            return None
        idfc = int(array_values[0].group())
        nxi = int(array_values[1].group())
        instpc = int(array_values[2].group())
        insn = int(array_values[3].group())
        if (instpc != 0):
            file_line.readline()
            file_line.readline()
            read_lines += 2
        else:
            for fi in range(nxi):
                edfb_file.readline()
            read_lines += nxi
        # end of if(instpc) block
        found_spheres = 0
        configurations = 0
        last_configuration = 0
        while (found_spheres < model['nsph']):
            file_line = edfb_file.readline()
            read_lines += 1
            iter_values = int_reg.finditer(file_line)
            array_values = iter_to_array(iter_values)
            if (len(array_values) < 1):
                print("ERROR: %s is not a valid scatterer configuration file!"%edfb_name)
                print("   INVALID LINE: \"%s\""%file_line[:-1])
                print("   at line %d in %s."%(read_lines, edfb_name))
                edfb_file.close()
                return None
            found_spheres += len(array_values)
            for ci in range(len(array_values)):
                type_id = int(array_values[ci].group())
                if (type_id > last_configuration):
                    last_configuration = type_id
                    configurations += 1
            # end for ci block
        # end while(found_spheres) block
        model['configurations'] = configurations
        for ci in range(configurations):
            file_line = edfb_file.readline()
            read_lines += 1
            iter_values = int_reg.finditer(file_line)
            array_values = iter_to_array(iter_values)
            if (len(array_values) < 1):
                print("ERROR: %s is not a valid scatterer configuration file!"%edfb_name)
                print("   INVALID LINE: \"%s\""%file_line[:-1])
                print("   at line %d in %s."%(read_lines, edfb_name))
                edfb_file.close()
                return None
            nsh = int(array_values[0].group())
            if (ci == 0): nsh += 1
            str_line = file_line[array_values[0].end():].replace('D', 'E').replace('d', 'E')
            iter_values = number_reg.finditer(str_line)
            array_values = iter_to_array(iter_values)
            if (len(array_values) != 1):
                print("ERROR: %s is not a valid scatterer configuration file!"%edfb_name)
                print("   INVALID LINE: \"%s\""%file_line[:-1])
                print("   at line %d in %s."%(read_lines, edfb_name))
                edfb_file.close()
                return None
            radius = float(array_values[0].group())
            for ish in range(nsh):
                file_line = edfb_file.readline()
                read_lines += 1
            if (ci == 0):
                str_line = file_line.replace('D', 'E').replace('d', 'E')
                iter_values = number_reg.finditer(str_line)
                array_values = iter_to_array(iter_values)
                if (len(array_values) != 1):
                    print("ERROR: %s is not a valid scatterer configuration file!"%edfb_name)
                    print("   INVALID LINE: \"%s\""%file_line[:-1])
                    print("   at line %d in %s."%(read_lines, edfb_name))
                    edfb_file.close()
                    return None
                factor = float(array_values[0].group())
                radius *= factor
            # end of if (ci == 0) block
            model['ros'].append(radius)
        # end of for ci block
    else:
        # ies == 0
        if model['nsph'] == 1:
            model['app'] = "SPHERE"
            file_line = edfb_file.readline()
            str_line = file_line.replace('D', 'E').replace('d', 'E')
            iter_values = number_reg.finditer(str_line)
            array_values = iter_to_array(iter_values)
            if (len(array_values) != 3):
                print("ERROR: %s is not a valid scatterer configuration file!"%edfb_name)
                print("   INVALID LINE: \"%s\""%file_line[:-1])
                print("   at line %d in %s."%(read_lines, edfb_name))
                edfb_file.close()
                return None
            str_line = str_line[array_values[2].end():]
            iter_values = int_reg.finditer(str_line)
            array_values = iter_to_array(iter_values)
            if (len(array_values) != 4):
                print("ERROR: %s is not a valid scatterer configuration file!"%edfb_name)
                print("   INVALID LINE: \"%s\""%file_line[:-1])
                print("   at line %d in %s."%(read_lines, edfb_name))
                edfb_file.close()
                return None
            idfc = int(array_values[0].group())
            nxi = int(array_values[1].group())
            instpc = int(array_values[2].group())
            insn = int(array_values[3].group())
            if (instpc != 0):
                file_line.readline()
                file_line.readline()
                read_lines += 2
            else:
                for fi in range(nxi):
                    edfb_file.readline()
                read_lines += nxi
            # end of if(instpc) block
            file_line = edfb_file.readline()
            file_line = edfb_file.readline()
            read_lines += 2
            iter_values = int_reg.finditer(file_line)
            array_values = iter_to_array(iter_values)
            if (len(array_values) < 1):
                print("ERROR: %s is not a valid scatterer configuration file!"%edfb_name)
                print("   INVALID LINE: \"%s\""%file_line[:-1])
                print("   at line %d in %s."%(read_lines, edfb_name))
                edfb_file.close()
                return None
            str_line = file_line[array_values[0].end():].replace('D', 'E').replace('d', 'E')
            iter_values = number_reg.finditer(str_line)
            array_values = iter_to_array(iter_values)
            if (len(array_values) != 1):
                print("ERROR: %s is not a valid scatterer configuration file!"%edfb_name)
                print("   INVALID LINE: \"%s\""%file_line[:-1])
                print("   at line %d in %s."%(read_lines, edfb_name))
                edfb_file.close()
                return None
            radius = float(array_values[0].group())
            model['ros'].append(radius)
        else:
            model['app'] = "CLUSTER"
            file_line = edfb_file.readline()
            read_lines += 1
            str_line = file_line.replace('D', 'E').replace('d', 'E')
            iter_values = number_reg.finditer(str_line)
            array_values = iter_to_array(iter_values)
            if (len(array_values) != 3):
                print("ERROR: %s is not a valid scatterer configuration file!"%edfb_name)
                print("   INVALID LINE: \"%s\""%file_line[:-1])
                print("   at line %d in %s."%(read_lines, edfb_name))
                edfb_file.close()
                return None
            str_line = str_line[array_values[2].end():]
            iter_values = int_reg.finditer(str_line)
            array_values = iter_to_array(iter_values)
            if (len(array_values) != 4):
                print("ERROR: %s is not a valid scatterer configuration file!"%edfb_name)
                print("   INVALID LINE: \"%s\""%file_line[:-1])
                print("   at line %d in %s."%(read_lines, edfb_name))
                edfb_file.close()
                return None
            idfc = int(array_values[0].group())
            nxi = int(array_values[1].group())
            instpc = int(array_values[2].group())
            insn = int(array_values[3].group())
            if (instpc != 0):
                file_line.readline()
                file_line.readline()
                read_lines += 2
            else:
                for fi in range(nxi):
                    edfb_file.readline()
                read_lines += nxi
            # end of if(instpc) block
            found_spheres = 0
            configurations = 0
            last_configuration = 0
            while (found_spheres < model['nsph']):
                file_line = edfb_file.readline()
                read_lines += 1
                iter_values = int_reg.finditer(file_line)
                array_values = iter_to_array(iter_values)
                if (len(array_values) < 1):
                    print("ERROR: %s is not a valid scatterer configuration file!"%edfb_name)
                    print("   INVALID LINE: \"%s\""%file_line[:-1])
                    print("   at line %d in %s."%(read_lines, edfb_name))
                    edfb_file.close()
                    return None
                found_spheres += len(array_values)
                for ci in range(len(array_values)):
                    type_id = int(array_values[ci].group())
                    if (type_id > last_configuration):
                        last_configuration = type_id
                        configurations += 1
                # end for ci block
            # end while(found_spheres) block
            model['configurations'] = configurations
            for ci in range(configurations):
                file_line = edfb_file.readline()
                read_lines += 1
                iter_values = int_reg.finditer(file_line)
                array_values = iter_to_array(iter_values)
                if (len(array_values) < 1):
                    print("ERROR: %s is not a valid scatterer configuration file!"%edfb_name)
                    print("   INVALID LINE: \"%s\""%file_line[:-1])
                    print("   at line %d in %s."%(read_lines, edfb_name))
                    edfb_file.close()
                    return None
                nsh = int(array_values[0].group())
                str_line = file_line[array_values[0].end():].replace('D', 'E').replace('d', 'E')
                iter_values = number_reg.finditer(str_line)
                array_values = iter_to_array(iter_values)
                if (len(array_values) != 1):
                    print("ERROR: %s is not a valid scatterer configuration file!"%edfb_name)
                    print("   INVALID LINE: \"%s\""%file_line[:-1])
                    print("   at line %d in %s."%(read_lines, edfb_name))
                    edfb_file.close()
                    return None
                radius = float(array_values[0].group())
                for ish in range(nsh):
                    file_line = edfb_file.readline()
                    read_lines += 1
                model['ros'].append(radius)
            # end of for ci block
        # end if model['nsph'] block
    # end if model['ies'] block
    edfb_file.close()
    
    # PARSING OF GEOMETRY CONFIGURATION
    read_lines = 0
    geom_file = open(geom_name, "r")
    file_line = geom_file.readline()
    read_lines += 1
    if (model['app'] != "SPHERE"):
        iter_values = int_reg.finditer(file_line)
        array_values = iter_to_array(iter_values)
        if (len(array_values) != 9):
            print("ERROR: %s is not a valid geometry configuration file!"%geom_name)
            geom_file.close()
            return None
        nsph = int(array_values[0].group())
        if (nsph != model['nsph']):
            print("ERROR: %s is not consistent with %s!"%(geom_name, edfb_name))
            print("   INVALID LINE: \"%s\""%file_line[:-1])
            print("   at line %d in %s."%(read_lines, geom_name))
            geom_file.close()
            return None
        model['li'] = int(array_values[1].group())
        model['le'] = int(array_values[2].group())
        for si in range(nsph):
            file_line = geom_file.readline()
            read_lines += 1
            str_line = file_line.replace('D', 'E').replace('d', 'E')
            iter_values = number_reg.finditer(str_line)
            array_values = iter_to_array(iter_values)
            if (len(array_values) != 3):
                print("ERROR: %s is not consistent with %s!"%(geom_name, edfb_name))
                print("   INVALID LINE: \"%s\""%file_line[:-1])
                print("   at line %d in %s."%(read_lines, geom_name))
                geom_file.close()
                return None
            x = float(array_values[0].group())
            y = float(array_values[1].group())
            z = float(array_values[2].group())
            model['vec_x'].append(x)
            model['vec_y'].append(y)
            model['vec_z'].append(z)
    else:
        # model['app'] == "SPHERE"
        iter_values = int_reg.finditer(file_line)
        array_values = iter_to_array(iter_values)
        if (len(array_values) != 6):
            print("ERROR: %s is not a valid geometry configuration file!"%geom_name)
            print("   INVALID LINE: \"%s\""%file_line[:-1])
            print("   at line %d in %s."%(read_lines, geom_name))
            geom_file.close()
            return None
        nsph = int(array_values[0].group())
        if (nsph != model['nsph']):
            print("ERROR: %s is not consistent with %s!"%(geom_name, edfb_name))
            geom_file.close()
            return None
        model['li'] = int(array_values[1].group())
        model['vec_x'].append(0.0)
        model['vec_y'].append(0.0)
        model['vec_z'].append(0.0)
    geom_file.close()
    return model

## \brief Exit code (0 for success).