-
Back
+ {% if context['hide_back'] %}
+ {% else %}
+
Back
+ {% endif %}
+
{% if context['steps']|length > context['current_step'] and not context.get('no_proceed') %}
{% if not form or context['override_form'] %}
Next
diff --git a/helix/templates/site_summary.html.jinja b/helix/templates/site_summary.html.jinja
index 94915f8..2547868 100644
--- a/helix/templates/site_summary.html.jinja
+++ b/helix/templates/site_summary.html.jinja
@@ -3,10 +3,11 @@
{% block contents %}
{% if context['site_data_available'] %}
+
{% endif %}
{% include "navigation_buttons.html.jinja" %}
+ {% if 'SFID' in session %}
+
Sales Force project (Logout)
+ {% endif %}
{% endblock %}
diff --git a/helix/user_values.py b/helix/user_values.py
index 477ad15..73a396e 100644
--- a/helix/user_values.py
+++ b/helix/user_values.py
@@ -8,7 +8,7 @@ from helix.constants.panel_type import PanelType
from helix.constants.system_type import SystemType
from helix.models.coordinate import Coordinate
from helix.models.panel import PanelData, Panel
-from helix.models.sql.inverter_brands import InverterBrand
+
class UserValues(object):
def __init__(self, store, site):
diff --git a/helix/validators/.file_validator.py.swp b/helix/validators/.file_validator.py.swp
new file mode 100644
index 0000000..b549661
Binary files /dev/null and b/helix/validators/.file_validator.py.swp differ
diff --git a/helix/validators/csv_input_validator.py b/helix/validators/csv_input_validator.py
index ef6c95f..b1bef04 100644
--- a/helix/validators/csv_input_validator.py
+++ b/helix/validators/csv_input_validator.py
@@ -30,7 +30,7 @@ class CsvInputValidator(object):
file_validation_chain = [
CsvInputValidator.validate_file_for_panel_types,
- CsvInputValidator.validate_for_spacing,
+ # CsvInputValidator.validate_for_spacing, # disabling this feature for the moment
]
result = self.run_validation_chain(headers, rows, file_validation_chain)
if result:
diff --git a/helix/validators/dxf_input_validator.py b/helix/validators/dxf_input_validator.py
index 215c368..9483800 100644
--- a/helix/validators/dxf_input_validator.py
+++ b/helix/validators/dxf_input_validator.py
@@ -1,5 +1,3 @@
-from helix.constants.file_validation_error import FileValidationMessage, FileValidationError
-
class DxfInputValidator(object):
def __init__(self, _):
diff --git a/requirements.test.txt b/requirements.test.txt
index f77851a..924173b 100644
--- a/requirements.test.txt
+++ b/requirements.test.txt
@@ -7,3 +7,7 @@ mockredispy==2.9.0.11
Flask-Testing==0.4.2
splinter[flask]
pillow==3.3.1
+eralchemy==1.1.0
+locust==0.8
+pylint==1.7.4
+pyopenssl==17.5.0
diff --git a/requirements.txt b/requirements.txt
index b0a4838..69eb292 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +1,5 @@
+gunicorn==19.7.1
+meinheld==0.6.1
Flask==0.10.1
itsdangerous==0.24
Jinja2==2.8
@@ -18,3 +20,6 @@ invoke==0.13.0
dxfgrabber==0.8.1
rollbar==0.13.11
blinker==1.4
+Flask-OAuthlib==0.9.4
+boto3==1.4.8
+ujson==1.3.5
diff --git a/tasks.py b/tasks.py
index 8ad1773..92f6281 100644
--- a/tasks.py
+++ b/tasks.py
@@ -1,4 +1,5 @@
from invoke import run, task
+import os
@task
@@ -34,9 +35,10 @@ def test_js(ctx):
def update_version(ctx):
run('echo "import os\n\n\ndef version():\n if os.getenv(\'VERSION\'):\n return os.getenv(\'VERSION\')\n return \'$(git describe --tags)\'" > helix/constants/version.py')
+
@task
def serve(ctx):
- run('PYTHONPATH=. SP_DOCGEN_API_KEY=DC97-20AF-567E python helix/main.py')
+ run('SP_DOCGEN_API_KEY=DC97-20AF-567E gunicorn -c gunicorn_config.py --pythonpath helix main:app')
@task
@@ -52,3 +54,23 @@ def db_migrate(ctx):
@task
def serve_debug(ctx):
run('PYTHONPATH=. FLASK_DEBUG=1 SP_DOCGEN_API_KEY=DC97-20AF-567E python helix/main.py')
+
+
+@task
+def db_diagram(ctx):
+ db_uri = os.getenv('DATABASE_URL', 'postgres://pivotal:@localhost:5432/pivotal')
+ run('eralchemy -i "{}" -o documentation/db_schema.png -x temp audit'.format(db_uri))
+
+@task
+def classes_diagrams(ctx):
+ run('pyreverse -k -o calculators-diagram.png helix/calculators')
+ run('pyreverse -k -o constants-diagram.png helix/constants')
+ run('pyreverse -k -o forms-diagram.png helix/forms')
+ run('pyreverse -k -o models-diagram.png helix/models')
+ run('pyreverse -k -o validators-diagram.png helix/validators')
+ run('rm -rf packages*.png ; mv classes.*-diagram.png documentation/')
+
+
+@task
+def serve_ssl(ctx):
+ run('FLASK_DEBUG_SSL=true PORT=8443 PYTHONPATH=. FLASK_DEBUG=1 SP_DOCGEN_API_KEY=DC97-20AF-567E python helix/main.py')
diff --git a/test/calculators/ballast/ballast_and_tray_count_test.py b/test/calculators/ballast/ballast_and_tray_count_test.py
index e8415ba..265c326 100644
--- a/test/calculators/ballast/ballast_and_tray_count_test.py
+++ b/test/calculators/ballast/ballast_and_tray_count_test.py
@@ -28,7 +28,7 @@ class BallastAndTrayCountTest(unittest.TestCase):
eq_(result.ballast_count, 0)
eq_(result.link_tray_count, 0)
eq_(result.cross_tray_count, 0)
- eq_(result.system_weight, 69.75)
+ eq_(result.system_weight, 65.87)
eq_(result.needs_anchor, False)
def test_ballast_no_trays(self):
@@ -38,27 +38,27 @@ class BallastAndTrayCountTest(unittest.TestCase):
eq_(result.ballast_count, 4)
eq_(result.link_tray_count, 0)
eq_(result.cross_tray_count, 0)
- eq_(result.system_weight, 69.75)
+ eq_(result.system_weight, 65.87)
eq_(result.needs_anchor, False)
def test_ballast_and_link_trays(self):
self.force_to_resist = 230
result = self.subject.ballast_and_tray_count(self.force_to_resist, self.panel_type, self.ballast_block_weight, self.anchor_count)
- eq_(result.ballast_count, 8)
+ eq_(result.ballast_count, 9)
eq_(result.link_tray_count, 1)
eq_(result.cross_tray_count, 0)
- eq_(result.system_weight, 72.05)
+ eq_(result.system_weight, 67.73)
eq_(result.needs_anchor, False)
def test_ballast_and_oscillate_between_0_and_1_link_trays(self):
self.force_to_resist = 210
result = self.subject.ballast_and_tray_count(self.force_to_resist, self.panel_type, self.ballast_block_weight, self.anchor_count)
- eq_(result.ballast_count, 7)
+ eq_(result.ballast_count, 8)
eq_(result.link_tray_count, 1)
eq_(result.cross_tray_count, 0)
- eq_(result.system_weight, 72.05)
+ eq_(result.system_weight, 67.73)
eq_(result.needs_anchor, False)
def test_ballast_and_link_tray_and_cross_tray(self):
@@ -68,17 +68,17 @@ class BallastAndTrayCountTest(unittest.TestCase):
eq_(result.ballast_count, 16)
eq_(result.link_tray_count, 1)
eq_(result.cross_tray_count, 1)
- eq_(result.system_weight, 75.23)
+ eq_(result.system_weight, 70.88)
eq_(result.needs_anchor, False)
def test_ballast_and_link_tray_and_oscillate_between_0_and_1_cross_trays(self):
self.force_to_resist = 330
result = self.subject.ballast_and_tray_count(self.force_to_resist, self.panel_type, self.ballast_block_weight, self.anchor_count)
- eq_(result.ballast_count, 13)
+ eq_(result.ballast_count, 14)
eq_(result.link_tray_count, 1)
eq_(result.cross_tray_count, 0)
- eq_(result.system_weight, 72.05)
+ eq_(result.system_weight, 67.73)
eq_(result.needs_anchor, False)
def test_ballast_and_link_tray_and_2_cross_trays(self):
@@ -88,17 +88,17 @@ class BallastAndTrayCountTest(unittest.TestCase):
eq_(result.ballast_count, 25)
eq_(result.link_tray_count, 1)
eq_(result.cross_tray_count, 2)
- eq_(result.system_weight, 78.41)
+ eq_(result.system_weight, 74.03)
eq_(result.needs_anchor, False)
def test_ballast_and_link_tray_and_at_first_2_then_1_cross_trays(self):
self.force_to_resist = 515
result = self.subject.ballast_and_tray_count(self.force_to_resist, self.panel_type, self.ballast_block_weight, self.anchor_count)
- eq_(result.ballast_count, 22)
+ eq_(result.ballast_count, 23)
eq_(result.link_tray_count, 1)
- eq_(result.cross_tray_count, 1)
- eq_(result.system_weight, 75.23)
+ eq_(result.cross_tray_count, 2)
+ eq_(result.system_weight, 74.03)
eq_(result.needs_anchor, False)
def test_ballast_and_all_trays_and_anchor(self):
@@ -108,15 +108,15 @@ class BallastAndTrayCountTest(unittest.TestCase):
eq_(result.ballast_count, 35)
eq_(result.link_tray_count, 1)
eq_(result.cross_tray_count, 2)
- eq_(result.system_weight, 78.41)
+ eq_(result.system_weight, 74.03)
eq_(result.needs_anchor, True)
def test_ballast_and_all_trays_and_at_first_anchor_then_no_anchor(self):
self.force_to_resist = 675
result = self.subject.ballast_and_tray_count(self.force_to_resist, self.panel_type, self.ballast_block_weight, self.anchor_count)
- eq_(result.ballast_count, 30)
+ eq_(result.ballast_count, 31)
eq_(result.link_tray_count, 1)
eq_(result.cross_tray_count, 2)
- eq_(result.system_weight, 78.41)
- eq_(result.needs_anchor, False)
+ eq_(result.system_weight, 74.03)
+ eq_(result.needs_anchor, True)
diff --git a/test/calculators/ballast/ballast_calculator_dual_tilt_128_cell_test.py b/test/calculators/ballast/ballast_calculator_dual_tilt_128_cell_test.py
index 0097a25..6671c44 100644
--- a/test/calculators/ballast/ballast_calculator_dual_tilt_128_cell_test.py
+++ b/test/calculators/ballast/ballast_calculator_dual_tilt_128_cell_test.py
@@ -48,23 +48,23 @@ class BallastCalculatorWhenDualTiltAnd128CellTest(unittest.TestCase):
expected_value = {
PanelType.Corner: {
'anchors': [3, 2, 0, 0, 0],
- 'ballast blocks': [15, 14, 25, 12, 0],
- 'pressure': ['8.14', '7.74', '12.11', '6.88', '2.12']
+ 'ballast blocks': [14, 13, 25, 12, 0],
+ 'pressure': ['8.00', '7.61', '12.36', '7.16', '2.40']
},
PanelType.NorthSouth: {
'anchors': [3, 2, 0, 0, 0],
- 'ballast blocks': [7, 8, 22, 10, 0],
- 'pressure': ['4.90', '5.29', '10.83', '6.05', '2.10']
+ 'ballast blocks': [6, 7, 21, 9, 0],
+ 'pressure': ['4.79', '5.18', '10.72', '5.93', '2.38']
},
PanelType.EastWest: {
'anchors': [3, 2, 0, 0, 0],
- 'ballast blocks': [8, 8, 22, 10, 0],
- 'pressure': ['5.25', '5.25', '10.78', '5.97', '2.02']
+ 'ballast blocks': [7, 7, 21, 10, 0],
+ 'pressure': ['5.18', '5.18', '10.71', '6.29', '2.31']
},
PanelType.Middle: {
'anchors': [2, 0, 0, 0, 0],
- 'ballast blocks': [15, 32, 18, 8, 0],
- 'pressure': ['8.02', '14.73', '9.13', '5.17', '1.99']
+ 'ballast blocks': [14, 31, 17, 7, 0],
+ 'pressure': ['7.89', '14.66', '9.07', '5.10', '2.29']
},
}
@@ -89,19 +89,19 @@ class BallastCalculatorWhenDualTiltAnd128CellTest(unittest.TestCase):
expected_value = [
Panel(wind_zone=2, panel_type=PanelType.Corner, ballast=25, link_tray=2, cross_tray=2, wind_anchors=0,
- pressure=12.11),
- Panel(wind_zone=2, panel_type=PanelType.NorthSouth, ballast=22, link_tray=2, cross_tray=1, wind_anchors=0,
- pressure=10.83),
+ pressure=12.360800772863891),
+ Panel(wind_zone=2, panel_type=PanelType.NorthSouth, ballast=21, link_tray=2, cross_tray=1, wind_anchors=0,
+ pressure=10.715259768140834),
Panel(wind_zone=4, panel_type=PanelType.EastWest, ballast=0, link_tray=0, cross_tray=0, wind_anchors=0,
- pressure=2.02),
- Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=15, link_tray=2, cross_tray=1, wind_anchors=3,
- pressure=8.14),
- Panel(wind_zone=1, panel_type=PanelType.Middle, ballast=32, link_tray=2, cross_tray=3, wind_anchors=0,
- pressure=14.73),
- Panel(wind_zone=3, panel_type=PanelType.NorthSouth, ballast=10, link_tray=1, cross_tray=0, wind_anchors=0,
- pressure=6.05),
+ pressure=2.3107513954486905),
+ Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=14, link_tray=2, cross_tray=1, wind_anchors=3,
+ pressure=8.001084156290254),
+ Panel(wind_zone=1, panel_type=PanelType.Middle, ballast=31, link_tray=2, cross_tray=3, wind_anchors=0,
+ pressure=14.659635036496352),
+ Panel(wind_zone=3, panel_type=PanelType.NorthSouth, ballast=9, link_tray=1, cross_tray=0, wind_anchors=0,
+ pressure=5.928870759982826),
Panel(wind_zone=1, panel_type=PanelType.Corner, ballast=44, link_tray=2, cross_tray=4, wind_anchors=0,
- pressure=19.65)
+ pressure=19.907666380420782)
]
assert_array_is_close(self.subject.ballast_and_trays_matrix(self.c_p_matrix, self.q_z, raw_data),
@@ -120,20 +120,20 @@ class BallastCalculatorWhenDualTiltAnd128CellTest(unittest.TestCase):
self.values.ballast_block_weight.return_value = 20
expected_value = [
- Panel(wind_zone=2, panel_type=PanelType.Corner, ballast=30, link_tray=2, cross_tray=2, wind_anchors=0,
- pressure=14.06, fuzzy_wind_zone=True),
+ Panel(wind_zone=2, panel_type=PanelType.Corner, ballast=29, link_tray=2, cross_tray=2, wind_anchors=0,
+ pressure=13.923703, fuzzy_wind_zone=True),
Panel(wind_zone=2, panel_type=PanelType.NorthSouth, ballast=25, link_tray=2, cross_tray=2, wind_anchors=0,
- pressure=12.06, fuzzy_wind_zone=True),
- Panel(wind_zone=4, panel_type=PanelType.EastWest, ballast=1, link_tray=0, cross_tray=0, wind_anchors=0,
- pressure=2.41, fuzzy_wind_zone=True),
- Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=10, link_tray=2, cross_tray=1, wind_anchors=4,
- pressure=6.18, fuzzy_wind_zone=True, warnings=[PanelWarnings.MaxPsf]),
- Panel(wind_zone=1, panel_type=PanelType.Middle, ballast=37, link_tray=2, cross_tray=4, wind_anchors=0,
- pressure=16.75, fuzzy_wind_zone=True),
+ pressure=12.339897, fuzzy_wind_zone=True),
+ Panel(wind_zone=4, panel_type=PanelType.EastWest, ballast=0, link_tray=0, cross_tray=0, wind_anchors=0,
+ pressure=2.310751, fuzzy_wind_zone=True),
+ Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=9, link_tray=2, cross_tray=1, wind_anchors=4,
+ pressure=6.047456, fuzzy_wind_zone=True, warnings=[PanelWarnings.MaxPsf]),
+ Panel(wind_zone=1, panel_type=PanelType.Middle, ballast=36, link_tray=2, cross_tray=4, wind_anchors=0,
+ pressure=16.674802, fuzzy_wind_zone=True),
Panel(wind_zone=3, panel_type=PanelType.NorthSouth, ballast=12, link_tray=2, cross_tray=0, wind_anchors=0,
- pressure=6.86, fuzzy_wind_zone=True),
- Panel(wind_zone=1, panel_type=PanelType.Corner, ballast=7, link_tray=2, cross_tray=0, wind_anchors=3,
- pressure=4.93, fuzzy_wind_zone=True)
+ pressure=7.137190, fuzzy_wind_zone=True),
+ Panel(wind_zone=1, panel_type=PanelType.Corner, ballast=6, link_tray=2, cross_tray=0, wind_anchors=3,
+ pressure=4.813740, fuzzy_wind_zone=True)
]
assert_array_is_close(self.subject.ballast_and_trays_matrix(self.c_p_matrix, self.q_z, raw_data),
@@ -155,19 +155,19 @@ class BallastCalculatorWhenDualTiltAnd128CellTest(unittest.TestCase):
expected = [
Panel(wind_zone=2, panel_type=PanelType.Corner, wind_anchors=0, seismic_anchors=1,
- ballast=11, link_tray=2, cross_tray=0, pressure=6.49),
+ ballast=10, link_tray=2, cross_tray=0, pressure=6.376642335766423),
Panel(wind_zone=2, panel_type=PanelType.NorthSouth, wind_anchors=0, seismic_anchors=1,
- ballast=6, link_tray=1, cross_tray=0, pressure=4.49),
+ ballast=6, link_tray=1, cross_tray=0, pressure=4.756693860025763),
Panel(wind_zone=4, panel_type=PanelType.EastWest, wind_anchors=0, seismic_anchors=1,
- ballast=0, link_tray=0, cross_tray=0, pressure=2.02),
+ ballast=0, link_tray=0, cross_tray=0, pressure=2.3107513954486905),
Panel(wind_zone=0, panel_type=PanelType.Corner, wind_anchors=3, seismic_anchors=0,
- ballast=15, link_tray=2, cross_tray=1, pressure=8.14),
+ ballast=14, link_tray=2, cross_tray=1, pressure=8.001084156290254),
Panel(wind_zone=1, panel_type=PanelType.Middle, wind_anchors=0, seismic_anchors=1,
- ballast=17, link_tray=2, cross_tray=2, pressure=8.81),
+ ballast=16, link_tray=2, cross_tray=1, pressure=8.675476599398884),
Panel(wind_zone=3, panel_type=PanelType.NorthSouth, wind_anchors=0, seismic_anchors=1,
- ballast=0, link_tray=0, cross_tray=0, pressure=2.10),
+ ballast=0, link_tray=0, cross_tray=0, pressure=2.3761979390296264),
Panel(wind_zone=1, panel_type=PanelType.Corner, wind_anchors=2, seismic_anchors=0,
- ballast=14, link_tray=2, cross_tray=1, pressure=7.74),
+ ballast=13, link_tray=2, cross_tray=1, pressure=7.610358522971233),
]
result = self.subject.update_ballast(self.c_p_matrix, self.q_z, panels)
@@ -211,35 +211,37 @@ class BallastCalculatorWhenDualTiltAnd128CellTest(unittest.TestCase):
]
expected_value = [
- Panel(wind_zone=2, panel_type=PanelType.Corner, ballast=25, link_tray=2, cross_tray=2, wind_anchors=0, pressure=12.11),
- Panel(wind_zone=2, panel_type=PanelType.NorthSouth, ballast=22, link_tray=2, cross_tray=1, wind_anchors=0, pressure=10.83),
- Panel(wind_zone=4, panel_type=PanelType.EastWest, ballast=0, link_tray=0, cross_tray=0, wind_anchors=0, pressure=2.02),
- Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=15, link_tray=2, cross_tray=1, wind_anchors=3, pressure=8.14),
- Panel(wind_zone=1, panel_type=PanelType.Middle, ballast=32, link_tray=2, cross_tray=3, wind_anchors=0, pressure=14.73),
- Panel(wind_zone=3, panel_type=PanelType.NorthSouth, ballast=10, link_tray=1, cross_tray=0, wind_anchors=0, pressure=6.05),
- Panel(wind_zone=1, panel_type=PanelType.Corner, ballast=14, link_tray=2, cross_tray=1, wind_anchors=2, pressure=7.74)
+ Panel(wind_zone=2, panel_type=PanelType.Corner, ballast=25, link_tray=2, cross_tray=2, wind_anchors=0, pressure=12.360800772863891),
+ Panel(wind_zone=2, panel_type=PanelType.NorthSouth, ballast=21, link_tray=2, cross_tray=1, wind_anchors=0, pressure=10.715259768140834),
+ Panel(wind_zone=4, panel_type=PanelType.EastWest, ballast=0, link_tray=0, cross_tray=0, wind_anchors=0, pressure=2.3107513954486905),
+ Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=14, link_tray=2, cross_tray=1, wind_anchors=3, pressure=8.001084156290254),
+ Panel(wind_zone=1, panel_type=PanelType.Middle, ballast=31, link_tray=2, cross_tray=3, wind_anchors=0, pressure=14.659635036496352),
+ Panel(wind_zone=3, panel_type=PanelType.NorthSouth, ballast=9, link_tray=1, cross_tray=0, wind_anchors=0, pressure=5.928870759982826),
+ Panel(wind_zone=1, panel_type=PanelType.Corner, ballast=13, link_tray=2, cross_tray=1, wind_anchors=2, pressure=7.610358522971233)
]
+ print("===\r\n")
+ print(self.subject.ballast_and_trays_matrix(self.c_p_matrix, self.q_z, panel_data))
assert_array_is_close(self.subject.ballast_and_trays_matrix(self.c_p_matrix, self.q_z, panel_data), expected_value, decimal=2)
def test_ballast_count_when_base_weight_greater_than_uplift(self):
- expected = Panel(wind_zone=4, panel_type=PanelType.Middle, ballast=0, link_tray=0, cross_tray=0, wind_anchors=0, pressure=1.99)
+ expected = Panel(wind_zone=4, panel_type=PanelType.Middle, ballast=0, link_tray=0, cross_tray=0, wind_anchors=0, pressure=2.289848)
assert self.subject.ballast_tray_and_anchor_count(4, PanelType.Middle, 14, 100, self.c_p_matrix, self.q_z).almost_equal(expected, decimal=2)
def test_individual_ballast_block_uplift_greater_than_base_weight(self):
- expected = Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=21, link_tray=2, cross_tray=2, wind_anchors=2, pressure=7.91)
+ expected = Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=19, link_tray=2, cross_tray=2, wind_anchors=2, pressure=7.682057)
assert self.subject.ballast_tray_and_anchor_count(0, PanelType.Middle, 14, 100, self.c_p_matrix, self.q_z).almost_equal(expected, decimal=2)
- expected = Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=15, link_tray=2, cross_tray=2, wind_anchors=2, pressure=8.02)
+ expected = Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=14, link_tray=2, cross_tray=1, wind_anchors=2, pressure=7.894025)
assert self.subject.ballast_tray_and_anchor_count(0, PanelType.Middle, 20, 100, self.c_p_matrix, self.q_z).almost_equal(expected, decimal=2)
def test_ballast_blocks_exceeding_tray_capacity(self):
- expected = Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=24, link_tray=2, cross_tray=3, wind_anchors=2, pressure=7.85)
+ expected = Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=22, link_tray=2, cross_tray=3, wind_anchors=2, pressure=7.704719)
assert self.subject.ballast_tray_and_anchor_count(0, PanelType.Middle, 12, 100, self.c_p_matrix, self.q_z).almost_equal(expected, decimal=2)
def test_when_max_system_pressure_is_lower_than_base_weight_pressure(self):
max_system_pressure = 0
- expected = Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=0, link_tray=0, cross_tray=0, wind_anchors=3, pressure=1.99)
+ expected = Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=0, link_tray=0, cross_tray=0, wind_anchors=3, pressure=2.289848)
assert self.subject.ballast_tray_and_anchor_count(0, PanelType.Middle, 12, max_system_pressure, self.c_p_matrix, self.q_z).almost_equal(
expected,
diff --git a/test/calculators/ballast/ballast_calculator_dual_tilt_96_cell_test.py b/test/calculators/ballast/ballast_calculator_dual_tilt_96_cell_test.py
index 7c0d468..b285f55 100644
--- a/test/calculators/ballast/ballast_calculator_dual_tilt_96_cell_test.py
+++ b/test/calculators/ballast/ballast_calculator_dual_tilt_96_cell_test.py
@@ -49,22 +49,22 @@ class BallastCalculatorWhenDualTiltAnd96CellTest(unittest.TestCase):
PanelType.Corner: {
'anchors': [3, 2, 0, 0, 0],
'ballast blocks': [2, 5, 20, 10, 0],
- 'pressure': ['3.48', '5.03', '12.90', '7.62', '2.40']
+ 'pressure': ['3.48', '5.03', '12.91', '7.62', '2.39']
},
PanelType.NorthSouth: {
'anchors': [2, 1, 0, 0, 0],
- 'ballast blocks': [11, 15, 17, 8, 0],
- 'pressure': ['8.24', '10.32', '11.35', '6.59', '2.40']
+ 'ballast blocks': [12, 15, 17, 8, 0],
+ 'pressure': ['8.75', '10.30', '11.34', '6.56', '2.37']
},
PanelType.EastWest: {
'anchors': [2, 1, 0, 0, 0],
'ballast blocks': [10, 14, 17, 8, 0],
- 'pressure': ['7.55', '9.63', '11.18', '6.46', '2.26']
+ 'pressure': ['7.62', '9.69', '11.24', '6.52', '2.28']
},
PanelType.Middle: {
'anchors': [2, 0, 0, 0, 0],
'ballast blocks': [2, 22, 12, 5, 0],
- 'pressure': ['3.34', '13.83', '8.59', '4.85', '2.26']
+ 'pressure': ['3.34', '13.87', '8.63', '4.85', '2.26']
},
}
@@ -90,15 +90,14 @@ class BallastCalculatorWhenDualTiltAnd96CellTest(unittest.TestCase):
# Ballast, link tray, cross tray, anchor count, psf
expected_value = [
- Panel(wind_zone=2, panel_type=PanelType.Corner, ballast=20, link_tray=2, cross_tray=1, wind_anchors=0, pressure=12.90),
- Panel(wind_zone=2, panel_type=PanelType.NorthSouth, ballast=17, link_tray=2, cross_tray=1, wind_anchors=0, pressure=11.35),
- Panel(wind_zone=4, panel_type=PanelType.EastWest, ballast=0, link_tray=0, cross_tray=0, wind_anchors=0, pressure=2.26),
- Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=47, link_tray=2, cross_tray=4, wind_anchors=0, pressure=27.07),
- Panel(wind_zone=1, panel_type=PanelType.Middle, ballast=22, link_tray=2, cross_tray=2, wind_anchors=0, pressure=13.82),
- Panel(wind_zone=3, panel_type=PanelType.NorthSouth, ballast=8, link_tray=1, cross_tray=0, wind_anchors=0, pressure=6.59),
- Panel(wind_zone=1, panel_type=PanelType.Corner, ballast=35, link_tray=2, cross_tray=3, wind_anchors=0, pressure=20.79)
+ Panel(wind_zone=2, panel_type=PanelType.Corner, ballast=20, link_tray=2, cross_tray=1, wind_anchors=0, pressure=12.910398406374503),
+ Panel(wind_zone=2, panel_type=PanelType.NorthSouth, ballast=17, link_tray=2, cross_tray=1, wind_anchors=0, pressure=11.336414342629482),
+ Panel(wind_zone=4, panel_type=PanelType.EastWest, ballast=0, link_tray=0, cross_tray=0, wind_anchors=0, pressure=2.2788844621513946),
+ Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=47, link_tray=2, cross_tray=4, wind_anchors=0, pressure=27.082988047808765),
+ Panel(wind_zone=1, panel_type=PanelType.Middle, ballast=22, link_tray=2, cross_tray=2, wind_anchors=0, pressure=13.874521912350598),
+ Panel(wind_zone=3, panel_type=PanelType.NorthSouth, ballast=8, link_tray=1, cross_tray=0, wind_anchors=0, pressure=6.564223107569722),
+ Panel(wind_zone=1, panel_type=PanelType.Corner, ballast=35, link_tray=2, cross_tray=3, wind_anchors=0, pressure=20.8049203187251)
]
-
assert_array_is_close(self.subject.ballast_and_trays_matrix(self.c_p_matrix, self.q_z, panels), expected_value, decimal=2)
def test_update_ballast(self):
@@ -116,16 +115,19 @@ class BallastCalculatorWhenDualTiltAnd96CellTest(unittest.TestCase):
]
expected_value = [
- Panel(wind_zone=2, panel_type=PanelType.Corner, wind_anchors=0, seismic_anchors=1, ballast=5, link_tray=0, cross_tray=0, pressure=4.99),
- Panel(wind_zone=2, panel_type=PanelType.NorthSouth, wind_anchors=0, seismic_anchors=1, ballast=2, link_tray=0, cross_tray=0, pressure=3.43),
- Panel(wind_zone=4, panel_type=PanelType.EastWest, wind_anchors=0, seismic_anchors=1, ballast=0, link_tray=0, cross_tray=0, pressure=2.26),
- Panel(wind_zone=0, panel_type=PanelType.Corner, wind_anchors=3, seismic_anchors=0, ballast=2, link_tray=1, cross_tray=0, pressure=3.48),
- Panel(wind_zone=1, panel_type=PanelType.Middle, wind_anchors=0, seismic_anchors=1, ballast=7, link_tray=2, cross_tray=0, pressure=5.94),
- Panel(wind_zone=3, panel_type=PanelType.NorthSouth, wind_anchors=0, seismic_anchors=1, ballast=0, link_tray=0, cross_tray=0, pressure=2.40),
- Panel(wind_zone=1, panel_type=PanelType.Corner, wind_anchors=2, seismic_anchors=0, ballast=5, link_tray=1, cross_tray=0, pressure=5.03)
+ Panel(wind_zone=2, panel_type=PanelType.Corner, wind_anchors=0, seismic_anchors=1, ballast=5, link_tray=0, cross_tray=0, pressure=4.982729083665339),
+ Panel(wind_zone=2, panel_type=PanelType.NorthSouth, wind_anchors=0, seismic_anchors=1, ballast=2, link_tray=0, cross_tray=0, pressure=3.408745019920319),
+ Panel(wind_zone=4, panel_type=PanelType.EastWest, wind_anchors=0, seismic_anchors=1, ballast=0, link_tray=0, cross_tray=0, pressure=2.2788844621513946),
+ Panel(wind_zone=0, panel_type=PanelType.Corner, wind_anchors=3, seismic_anchors=0, ballast=2, link_tray=1, cross_tray=0, pressure=3.4768525896414344),
+ Panel(wind_zone=1, panel_type=PanelType.Middle, wind_anchors=0, seismic_anchors=1, ballast=7, link_tray=2, cross_tray=0, pressure=5.98),
+ Panel(wind_zone=3, panel_type=PanelType.NorthSouth, wind_anchors=0, seismic_anchors=1, ballast=0, link_tray=0, cross_tray=0, pressure=2.3728884462151396),
+ Panel(wind_zone=1, panel_type=PanelType.Corner, wind_anchors=2, seismic_anchors=0, ballast=5, link_tray=1, cross_tray=0, pressure=5.030637450199203)
]
result = self.subject.update_ballast(self.c_p_matrix, self.q_z, panels)
+ print("===")
+ print(result)
+ print("===")
assert_array_is_close(result, expected_value, decimal=2)
def test_update_ballast_with_fuzzy_wind_zone(self):
@@ -143,13 +145,13 @@ class BallastCalculatorWhenDualTiltAnd96CellTest(unittest.TestCase):
]
expected_value = [
- Panel(wind_zone=2, panel_type=PanelType.Corner, wind_anchors=0, seismic_anchors=1, ballast=9, link_tray=2, cross_tray=0, pressure=7.15, fuzzy_wind_zone=True),
- Panel(wind_zone=2, panel_type=PanelType.NorthSouth, wind_anchors=0, seismic_anchors=1, ballast=5, link_tray=0, cross_tray=0, pressure=4.99, fuzzy_wind_zone=True),
- Panel(wind_zone=4, panel_type=PanelType.EastWest, wind_anchors=0, seismic_anchors=1, ballast=0, link_tray=0, cross_tray=0, pressure=2.26, fuzzy_wind_zone=True),
- Panel(wind_zone=0, panel_type=PanelType.Corner, wind_anchors=3, seismic_anchors=0, ballast=9, link_tray=2, cross_tray=0, pressure=7.15, fuzzy_wind_zone=True),
- Panel(wind_zone=1, panel_type=PanelType.Middle, wind_anchors=0, seismic_anchors=1, ballast=11, link_tray=2, cross_tray=1, pressure=8.07, fuzzy_wind_zone=True),
- Panel(wind_zone=3, panel_type=PanelType.NorthSouth, wind_anchors=0, seismic_anchors=1, ballast=0, link_tray=0, cross_tray=0, pressure=2.40, fuzzy_wind_zone=True),
- Panel(wind_zone=1, panel_type=PanelType.Corner, wind_anchors=2, seismic_anchors=0, ballast=11, link_tray=2, cross_tray=0, pressure=8.18, fuzzy_wind_zone=True)
+ Panel(wind_zone=2, panel_type=PanelType.Corner, wind_anchors=0, seismic_anchors=1, ballast=9, link_tray=2, cross_tray=0, pressure=7.150517928286853, fuzzy_wind_zone=True),
+ Panel(wind_zone=2, panel_type=PanelType.NorthSouth, wind_anchors=0, seismic_anchors=1, ballast=5, link_tray=0, cross_tray=0, pressure=4.962529880478088, fuzzy_wind_zone=True),
+ Panel(wind_zone=4, panel_type=PanelType.EastWest, wind_anchors=0, seismic_anchors=1, ballast=0, link_tray=0, cross_tray=0, pressure=2.2788844621513946, fuzzy_wind_zone=True),
+ Panel(wind_zone=0, panel_type=PanelType.Corner, wind_anchors=3, seismic_anchors=0, ballast=9, link_tray=2, cross_tray=0, pressure=7.150517928286853, fuzzy_wind_zone=True),
+ Panel(wind_zone=1, panel_type=PanelType.Middle, wind_anchors=0, seismic_anchors=1, ballast=11, link_tray=2, cross_tray=1, pressure=8.114382470119523, fuzzy_wind_zone=True),
+ Panel(wind_zone=3, panel_type=PanelType.NorthSouth, wind_anchors=0, seismic_anchors=1, ballast=0, link_tray=0, cross_tray=0, pressure=2.3728884462151396, fuzzy_wind_zone=True),
+ Panel(wind_zone=1, panel_type=PanelType.Corner, wind_anchors=2, seismic_anchors=0, ballast=11, link_tray=2, cross_tray=0, pressure=8.186374501992033, fuzzy_wind_zone=True)
]
result = self.subject.update_ballast(self.c_p_matrix, self.q_z, panels)
@@ -192,15 +194,14 @@ class BallastCalculatorWhenDualTiltAnd96CellTest(unittest.TestCase):
]
expected_value = [
- Panel(wind_zone=2, panel_type=PanelType.Corner, ballast=20, link_tray=2, cross_tray=1, wind_anchors=0, pressure=12.90),
- Panel(wind_zone=2, panel_type=PanelType.NorthSouth, ballast=17, link_tray=2, cross_tray=1, wind_anchors=0, pressure=11.35),
- Panel(wind_zone=4, panel_type=PanelType.EastWest, ballast=0, link_tray=0, cross_tray=0, wind_anchors=0, pressure=2.26),
- Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=2, link_tray=1, cross_tray=0, wind_anchors=3, pressure=3.48),
- Panel(wind_zone=1, panel_type=PanelType.Middle, ballast=22, link_tray=2, cross_tray=2, wind_anchors=0, pressure=13.83),
- Panel(wind_zone=3, panel_type=PanelType.NorthSouth, ballast=8, link_tray=1, cross_tray=0, wind_anchors=0, pressure=6.59),
- Panel(wind_zone=1, panel_type=PanelType.Corner, ballast=5, link_tray=1, cross_tray=0, wind_anchors=2, pressure=5.03)
+ Panel(wind_zone=2, panel_type=PanelType.Corner, ballast=20, link_tray=2, cross_tray=1, wind_anchors=0, pressure=12.910398406374503),
+ Panel(wind_zone=2, panel_type=PanelType.NorthSouth, ballast=17, link_tray=2, cross_tray=1, wind_anchors=0, pressure=11.336414342629482),
+ Panel(wind_zone=4, panel_type=PanelType.EastWest, ballast=0, link_tray=0, cross_tray=0, wind_anchors=0, pressure=2.2788844621513946),
+ Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=2, link_tray=1, cross_tray=0, wind_anchors=3, pressure=3.4768525896414344),
+ Panel(wind_zone=1, panel_type=PanelType.Middle, ballast=22, link_tray=2, cross_tray=2, wind_anchors=0, pressure=13.874521912350598),
+ Panel(wind_zone=3, panel_type=PanelType.NorthSouth, ballast=8, link_tray=1, cross_tray=0, wind_anchors=0, pressure=6.564223107569722),
+ Panel(wind_zone=1, panel_type=PanelType.Corner, ballast=5, link_tray=1, cross_tray=0, wind_anchors=2, pressure=5.030637450199203)
]
-
assert_array_is_close(self.subject.ballast_and_trays_matrix(self.c_p_matrix, self.q_z, panels), expected_value, decimal=2)
def test_ballast_count_when_base_weight_greater_than_uplift(self):
@@ -212,11 +213,11 @@ class BallastCalculatorWhenDualTiltAnd96CellTest(unittest.TestCase):
def test_individual_ballast_block_uplift_greater_than_base_weight(self):
assert self.subject.ballast_tray_and_anchor_count(0, PanelType.Middle, 14, 100, self.c_p_matrix,
self.q_z).almost_equal(
- Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=45, link_tray=2, cross_tray=4, wind_anchors=0, pressure=18.87),
+ Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=45, link_tray=2, cross_tray=4, wind_anchors=0, pressure=18.920438),
decimal=2)
assert self.subject.ballast_tray_and_anchor_count(0, PanelType.Middle, 20, 100, self.c_p_matrix,
self.q_z).almost_equal(
- Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=32, link_tray=2, cross_tray=3, wind_anchors=0, pressure=19.07),
+ Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=32, link_tray=2, cross_tray=3, wind_anchors=0, pressure=19.116474),
decimal=2)
def test_ballast_blocks_exceeding_tray_capacity(self):
diff --git a/test/calculators/ballast/ballast_calculator_dual_tilt_pseries_test.py b/test/calculators/ballast/ballast_calculator_dual_tilt_pseries_test.py
index 7fc2e97..f7e4bec 100644
--- a/test/calculators/ballast/ballast_calculator_dual_tilt_pseries_test.py
+++ b/test/calculators/ballast/ballast_calculator_dual_tilt_pseries_test.py
@@ -48,23 +48,23 @@ class BallastCalculatorWhenDualTiltAndPSeriesTest(unittest.TestCase):
expected_value = {
PanelType.Corner: {
'anchors': [4, 3, 0, 0, 0],
- 'ballast blocks': [15, 10, 33, 16, 0],
- 'pressure': ['8.43', '6.38', '15.93', '8.83', '2.12']
+ 'ballast blocks': [14, 10, 32, 16, 0],
+ 'pressure': ['8.26', '6.63', '15.76', '9.08', '2.39']
},
PanelType.NorthSouth: {
'anchors': [4, 3, 0, 0, 0],
- 'ballast blocks': [5, 2, 28, 14, 0],
- 'pressure': ['4.22', '2.97', '13.77', '7.90', '2.10']
+ 'ballast blocks': [4, 2, 27, 13, 0],
+ 'pressure': ['4.08', '3.22', '13.63', '7.77', '2.37']
},
PanelType.EastWest: {
'anchors': [4, 3, 0, 0, 0],
- 'ballast blocks': [6, 3, 28, 14, 0],
- 'pressure': ['4.58', '3.29', '13.72', '7.86', '2.01']
+ 'ballast blocks': [5, 2, 27, 13, 0],
+ 'pressure': ['4.49', '3.19', '13.63', '7.76', '2.30']
},
PanelType.Middle: {
'anchors': [3, 2, 0, 0, 0],
- 'ballast blocks': [11, 10, 23, 11, 0],
- 'pressure': ['6.61', '6.20', '11.59', '6.61', '1.99']
+ 'ballast blocks': [10, 10, 23, 11, 0],
+ 'pressure': ['6.51', '6.51', '11.90', '6.92', '2.28']
},
}
@@ -104,27 +104,28 @@ class BallastCalculatorWhenDualTiltAndPSeriesTest(unittest.TestCase):
expected_value = {
PanelType.Corner: {
'anchors': [0, 0, 0, 0, 0],
- 'ballast blocks': [8, 3, 0, 0, 0],
- 'pressure': ['4.79', '3.11', '2.12', '2.12', '2.12']
+ 'ballast blocks': [7, 3, 0, 0, 0],
+ 'pressure': ['4.68', '3.37', '2.39', '2.39', '2.39']
},
PanelType.NorthSouth: {
'anchors': [0, 0, 0, 0, 0],
'ballast blocks': [3, 0, 0, 0, 0],
- 'pressure': ['3.08', '2.10', '2.10', '2.10', '2.10']
+ 'pressure': ['3.35', '2.37', '2.37', '2.37', '2.37']
},
PanelType.EastWest: {
'anchors': [0, 0, 0, 0, 0],
- 'ballast blocks': [4, 0, 0, 0, 0],
- 'pressure': ['3.32', '2.01', '2.01', '2.01', '2.01']
+ 'ballast blocks': [3, 0, 0, 0, 0],
+ 'pressure': ['3.28', '2.30', '2.30', '2.30', '2.30']
},
PanelType.Middle: {
'anchors': [0, 0, 0, 0, 0],
- 'ballast blocks': [1, 0, 0, 0, 0],
- 'pressure': ['2.32', '1.99', '1.99', '1.99', '1.99']
+ 'ballast blocks': [0, 0, 0, 0, 0],
+ 'pressure': ['2.28', '2.28', '2.28', '2.28', '2.28']
},
}
received_table = self.subject.summary_table(self.c_p_matrix, self.q_z)
+ print("====\r\n", received_table)
eq_(received_table.keys(), expected_value.keys())
for key in expected_value.keys():
received_table[key].pop('warnings')
@@ -143,20 +144,20 @@ class BallastCalculatorWhenDualTiltAndPSeriesTest(unittest.TestCase):
self.values.ballast_block_weight.return_value = 20
expected_value = [
- Panel(wind_zone=2, panel_type=PanelType.Corner, ballast=33, link_tray=2, cross_tray=3, wind_anchors=0,
- pressure=15.93),
- Panel(wind_zone=2, panel_type=PanelType.NorthSouth, ballast=28, link_tray=2, cross_tray=2, wind_anchors=0,
- pressure=13.77),
+ Panel(wind_zone=2, panel_type=PanelType.Corner, ballast=32, link_tray=2, cross_tray=3, wind_anchors=0,
+ pressure=15.764460),
+ Panel(wind_zone=2, panel_type=PanelType.NorthSouth, ballast=27, link_tray=2, cross_tray=2, wind_anchors=0,
+ pressure=13.630342),
Panel(wind_zone=4, panel_type=PanelType.EastWest, ballast=0, link_tray=0, cross_tray=0, wind_anchors=0,
- pressure=2.01),
- Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=15, link_tray=2, cross_tray=1, wind_anchors=4,
- pressure=8.43, warnings=[PanelWarnings.MaxPsf]),
+ pressure=2.299163),
+ Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=14, link_tray=2, cross_tray=1, wind_anchors=4,
+ pressure=8.263513, warnings=[PanelWarnings.MaxPsf]),
Panel(wind_zone=1, panel_type=PanelType.Middle, ballast=40, link_tray=2, cross_tray=4, wind_anchors=0,
- pressure=18.68),
- Panel(wind_zone=3, panel_type=PanelType.NorthSouth, ballast=14, link_tray=2, cross_tray=0, wind_anchors=0,
- pressure=7.90),
+ pressure=18.993076),
+ Panel(wind_zone=3, panel_type=PanelType.NorthSouth, ballast=13, link_tray=2, cross_tray=0, wind_anchors=0,
+ pressure=7.767559),
Panel(wind_zone=1, panel_type=PanelType.Corner, ballast=10, link_tray=2, cross_tray=1, wind_anchors=3,
- pressure=6.38),
+ pressure=6.625349),
]
assert_array_is_close(self.subject.ballast_and_trays_matrix(self.c_p_matrix, self.q_z, raw_data),
@@ -178,19 +179,19 @@ class BallastCalculatorWhenDualTiltAndPSeriesTest(unittest.TestCase):
expected = [
Panel(wind_zone=2, panel_type=PanelType.Corner, wind_anchors=0, seismic_anchors=1,
- ballast=18, link_tray=2, cross_tray=1, pressure=9.65),
+ ballast=17, link_tray=2, cross_tray=1, pressure=9.492135463546356),
Panel(wind_zone=2, panel_type=PanelType.NorthSouth, wind_anchors=0, seismic_anchors=1,
- ballast=13, link_tray=2, cross_tray=0, pressure=7.50),
+ ballast=12, link_tray=2, cross_tray=0, pressure=7.358017551755176),
Panel(wind_zone=4, panel_type=PanelType.EastWest, wind_anchors=0, seismic_anchors=1,
- ballast=0, link_tray=0, cross_tray=0, pressure=2.01),
+ ballast=0, link_tray=0, cross_tray=0, pressure=2.299162916291629),
Panel(wind_zone=0, panel_type=PanelType.Corner, wind_anchors=4, seismic_anchors=0,
- ballast=15, link_tray=2, cross_tray=1, pressure=8.43),
+ ballast=14, link_tray=2, cross_tray=1, pressure=8.263512601260127),
Panel(wind_zone=1, panel_type=PanelType.Middle, wind_anchors=0, seismic_anchors=1,
- ballast=25, link_tray=2, cross_tray=3, pressure=12.47),
+ ballast=24, link_tray=2, cross_tray=3, pressure=12.375918091809181),
Panel(wind_zone=3, panel_type=PanelType.NorthSouth, wind_anchors=0, seismic_anchors=1,
- ballast=0, link_tray=0, cross_tray=0, pressure=2.10),
+ ballast=0, link_tray=0, cross_tray=0, pressure=2.3677610261026105),
Panel(wind_zone=1, panel_type=PanelType.Corner, wind_anchors=3, seismic_anchors=0,
- ballast=10, link_tray=2, cross_tray=1, pressure=6.38),
+ ballast=10, link_tray=2, cross_tray=1, pressure=6.625348784878488),
]
result = self.subject.update_ballast(self.c_p_matrix, self.q_z, panels)
@@ -234,13 +235,13 @@ class BallastCalculatorWhenDualTiltAndPSeriesTest(unittest.TestCase):
]
expected_value = [
- Panel(wind_zone=2, panel_type=PanelType.Corner, ballast=33, link_tray=2, cross_tray=3, wind_anchors=0, pressure=15.93),
- Panel(wind_zone=2, panel_type=PanelType.NorthSouth, ballast=28, link_tray=2, cross_tray=2, wind_anchors=0, pressure=13.77),
- Panel(wind_zone=4, panel_type=PanelType.EastWest, ballast=0, link_tray=0, cross_tray=0, wind_anchors=0, pressure=2.01),
- Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=15, link_tray=2, cross_tray=1, wind_anchors=4, pressure=8.43, warnings=[PanelWarnings.MaxPsf]),
- Panel(wind_zone=1, panel_type=PanelType.Middle, ballast=10, link_tray=2, cross_tray=1, wind_anchors=2, pressure=6.20),
- Panel(wind_zone=3, panel_type=PanelType.NorthSouth, ballast=14, link_tray=2, cross_tray=0, wind_anchors=0, pressure=7.90),
- Panel(wind_zone=1, panel_type=PanelType.Corner, ballast=10, link_tray=2, cross_tray=1, wind_anchors=3, pressure=6.38)
+ Panel(wind_zone=2, panel_type=PanelType.Corner, ballast=32, link_tray=2, cross_tray=3, wind_anchors=0, pressure=15.764460),
+ Panel(wind_zone=2, panel_type=PanelType.NorthSouth, ballast=27, link_tray=2, cross_tray=2, wind_anchors=0, pressure=13.630342),
+ Panel(wind_zone=4, panel_type=PanelType.EastWest, ballast=0, link_tray=0, cross_tray=0, wind_anchors=0, pressure=2.299163),
+ Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=14, link_tray=2, cross_tray=1, wind_anchors=4, pressure= 8.263513, warnings=[PanelWarnings.MaxPsf]),
+ Panel(wind_zone=1, panel_type=PanelType.Middle, ballast=10, link_tray=2, cross_tray=1, wind_anchors=2, pressure=6.513135),
+ Panel(wind_zone=3, panel_type=PanelType.NorthSouth, ballast=13, link_tray=2, cross_tray=0, wind_anchors=0, pressure=7.767559),
+ Panel(wind_zone=1, panel_type=PanelType.Corner, ballast=10, link_tray=2, cross_tray=1, wind_anchors=3, pressure=6.625349)
]
assert_array_is_close(self.subject.ballast_and_trays_matrix(self.c_p_matrix, self.q_z, panel_data), expected_value, decimal=2)
@@ -272,28 +273,28 @@ class BallastCalculatorWhenDualTiltAndPSeriesTest(unittest.TestCase):
self.q_z = 18.43072
self.subject = BallastCalculator(self.values)
- expected = Panel(wind_zone=0, panel_type=PanelType.NorthSouth, ballast=3, link_tray=0, cross_tray=0, wind_anchors=0, pressure=3.08)
+ expected = Panel(wind_zone=0, panel_type=PanelType.NorthSouth, ballast=3, link_tray=0, cross_tray=0, wind_anchors=0, pressure=3.350659)
received = self.subject.ballast_tray_and_anchor_count(0, PanelType.NorthSouth, 16, 8, self.c_p_matrix, self.q_z)
assert received.almost_equal(expected, decimal=2)
def test_ballast_count_when_base_weight_greater_than_uplift(self):
- expected = Panel(wind_zone=4, panel_type=PanelType.Middle, ballast=0, link_tray=0, cross_tray=0, wind_anchors=0, pressure=1.99)
+ expected = Panel(wind_zone=4, panel_type=PanelType.Middle, ballast=0, link_tray=0, cross_tray=0, wind_anchors=0, pressure=2.277252)
assert self.subject.ballast_tray_and_anchor_count(4, PanelType.Middle, 14, 100, self.c_p_matrix, self.q_z).almost_equal(expected, decimal=2)
def test_individual_ballast_block_uplift_greater_than_base_weight(self):
- expected = Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=15, link_tray=2, cross_tray=2, wind_anchors=3, pressure=6.47)
+ expected = Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=14, link_tray=2, cross_tray=2, wind_anchors=3, pressure=6.495729)
assert self.subject.ballast_tray_and_anchor_count(0, PanelType.Middle, 14, 100, self.c_p_matrix, self.q_z).almost_equal(expected, decimal=2)
- expected = Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=11, link_tray=2, cross_tray=1, wind_anchors=3, pressure=6.61)
+ expected = Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=10, link_tray=2, cross_tray=1, wind_anchors=3, pressure=6.513135)
assert self.subject.ballast_tray_and_anchor_count(0, PanelType.Middle, 20, 100, self.c_p_matrix, self.q_z).almost_equal(expected, decimal=2)
def test_ballast_blocks_exceeding_tray_capacity(self):
- expected = Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=18, link_tray=2, cross_tray=2, wind_anchors=3, pressure=6.59)
+ expected = Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=17, link_tray=2, cross_tray=2, wind_anchors=3, pressure=6.659545)
assert self.subject.ballast_tray_and_anchor_count(0, PanelType.Middle, 12, 100, self.c_p_matrix, self.q_z).almost_equal(expected, decimal=2)
def test_when_max_system_pressure_is_lower_than_base_weight_pressure(self):
max_system_pressure = 0
- expected = Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=0, link_tray=0, cross_tray=0, wind_anchors=4, pressure=1.99)
+ expected = Panel(wind_zone=0, panel_type=PanelType.Middle, ballast=0, link_tray=0, cross_tray=0, wind_anchors=4, pressure=2.277252)
assert self.subject.ballast_tray_and_anchor_count(0, PanelType.Middle, 12, max_system_pressure, self.c_p_matrix, self.q_z).almost_equal(
expected,
diff --git a/test/calculators/ballast/ballast_calculator_single_tilt_128_cell_test.py b/test/calculators/ballast/ballast_calculator_single_tilt_128_cell_test.py
index b7415a4..92b0b7b 100644
--- a/test/calculators/ballast/ballast_calculator_single_tilt_128_cell_test.py
+++ b/test/calculators/ballast/ballast_calculator_single_tilt_128_cell_test.py
@@ -54,23 +54,23 @@ class BallastCalculatorWhenSingleTiltAnd128CellTest(unittest.TestCase):
expected_value = {
PanelType.Corner: {
'anchors': [7, 5, 3, 3, 2, 2, 0, 2, 7, 4, 0],
- 'ballast blocks': [9, 14, 5, 5, 3, 1, 13, 11, 11, 8, 11],
- 'pressure': ['7.43', '10.31', '4.95', '4.95', '3.79', '2.64', '9.55', '8.49', '8.58', '6.76', '8.40']
+ 'ballast blocks': [10, 15, 5, 6, 3, 1, 13, 11, 12, 9, 11],
+ 'pressure': ['7.89', '10.77', '4.83', '5.41', '3.68', '2.53', '9.53', '8.38', '9.04', '7.23', '8.29']
},
PanelType.NorthSouth: {
'anchors': [6, 5, 3, 2, 0, 1, 0, 2, 6, 4, 0],
'ballast blocks': [14, 6, 1, 15, 19, 13, 12, 6, 12, 1, 10],
- 'pressure': ['10.13', '5.44', '2.47', '10.71', '13.01', '9.46', '8.89', '5.35', '8.98', '2.47', '7.65']
+ 'pressure': ['10.11', '5.41', '2.45', '10.68', '12.98', '9.44', '8.87', '5.32', '8.96', '2.45', '7.62']
},
PanelType.EastWest: {
'anchors': [5, 4, 2, 2, 1, 0, 0, 2, 6, 1, 0],
- 'ballast blocks': [11, 7, 2, 1, 15, 21, 12, 6, 11, 14, 6],
- 'pressure': ['8.49', '6.19', '3.16', '2.58', '10.79', '14.25', '8.98', '5.52', '8.58', '10.22', '5.46']
+ 'ballast blocks': [12, 7, 2, 1, 15, 21, 12, 6, 12, 14, 6],
+ 'pressure': ['8.94', '6.07', '3.05', '2.47', '10.67', '14.12', '8.85', '5.40', '9.03', '10.09', '5.35']
},
PanelType.Middle: {
'anchors': [5, 4, 2, 1, 0, 0, 0, 2, 6, 1, 0],
'ballast blocks': [9, 5, 2, 15, 18, 20, 12, 5, 7, 13, 6],
- 'pressure': ['7.21', '4.91', '3.02', '10.66', '12.39', '13.63', '8.93', '4.82', '6.06', '9.51', '5.32']
+ 'pressure': ['7.14', '4.84', '2.97', '10.59', '12.32', '13.56', '8.87', '4.75', '5.99', '9.44', '5.27']
},
}
@@ -96,21 +96,21 @@ class BallastCalculatorWhenSingleTiltAnd128CellTest(unittest.TestCase):
expected_value = [
Panel(wind_zone=5, panel_type=PanelType.Corner, ballast=1, link_tray=0, cross_tray=0, wind_anchors=2,
- pressure=2.64),
+ pressure=2.532134),
Panel(wind_zone=6, panel_type=PanelType.NorthSouth, ballast=12, link_tray=0, cross_tray=1, wind_anchors=0,
- pressure=8.89),
+ pressure=8.866209),
Panel(wind_zone=7, panel_type=PanelType.EastWest, ballast=6, link_tray=2, cross_tray=0, wind_anchors=2,
- pressure=5.52, warnings=[PanelWarnings.MaxPsf]),
- Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=9, link_tray=0, cross_tray=2, wind_anchors=7,
- pressure=7.43, warnings=[PanelWarnings.MaxPsf]),
+ pressure=5.400562, warnings=[PanelWarnings.MaxPsf]),
+ Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=10, link_tray=0, cross_tray=2, wind_anchors=7,
+ pressure=7.891559, warnings=[PanelWarnings.MaxPsf]),
Panel(wind_zone=8, panel_type=PanelType.Middle, ballast=7, link_tray=1, cross_tray=1, wind_anchors=6,
- pressure=6.06, warnings=[PanelWarnings.MaxPsf]),
+ pressure=5.991164, warnings=[PanelWarnings.MaxPsf]),
Panel(wind_zone=9, panel_type=PanelType.NorthSouth, ballast=1, link_tray=0, cross_tray=0, wind_anchors=4,
- pressure=2.47, warnings=[PanelWarnings.MaxPsf]),
- Panel(wind_zone=6, panel_type=PanelType.Corner, ballast=13, link_tray=0, cross_tray=0, wind_anchors=0,
- pressure=9.55),
+ pressure=2.446694, warnings=[PanelWarnings.MaxPsf]),
+ Panel(wind_zone=6, panel_type=PanelType.Corner, ballast=13, link_tray=0, cross_tray=1, wind_anchors=0,
+ pressure=9.527003),
Panel(wind_zone=6, panel_type=PanelType.EastWest, ballast=12, link_tray=2, cross_tray=0, wind_anchors=0,
- pressure=8.98)
+ pressure=8.852688)
]
assert_array_is_close(self.subject.ballast_and_trays_matrix(self.c_p_matrix, self.q_z, panels),
@@ -169,19 +169,19 @@ class BallastCalculatorWhenSingleTiltAnd128CellTest(unittest.TestCase):
expected_value = [
Panel(wind_zone=7, panel_type=PanelType.Corner, ballast=11, link_tray=0, cross_tray=1,
- wind_anchors=2, pressure=8.49, warnings=[PanelWarnings.MaxPsf]),
+ wind_anchors=2, pressure=8.376295, warnings=[PanelWarnings.MaxPsf]),
Panel(wind_zone=7, panel_type=PanelType.NorthSouth, ballast=6, link_tray=0, cross_tray=0,
- wind_anchors=2, pressure=5.35, warnings=[PanelWarnings.MaxPsf]),
+ wind_anchors=2, pressure=5.323465, warnings=[PanelWarnings.MaxPsf]),
Panel(wind_zone=9, panel_type=PanelType.EastWest, ballast=29, link_tray=2, cross_tray=2,
- wind_anchors=0, pressure=18.94),
+ wind_anchors=0, pressure=18.814946),
Panel(wind_zone=5, panel_type=PanelType.Corner, ballast=1, link_tray=0, cross_tray=0,
- wind_anchors=2, pressure=2.64),
+ wind_anchors=2, pressure=2.532134),
Panel(wind_zone=6, panel_type=PanelType.Middle, ballast=12, link_tray=1, cross_tray=1,
- wind_anchors=0, pressure=8.93),
+ wind_anchors=0, pressure=8.867935),
Panel(wind_zone=8, panel_type=PanelType.NorthSouth, ballast=12, link_tray=0, cross_tray=2,
- wind_anchors=6, pressure=8.98, warnings=[PanelWarnings.MaxPsf]),
- Panel(wind_zone=6, panel_type=PanelType.Corner, ballast=13, link_tray=0, cross_tray=0,
- wind_anchors=0, pressure=9.55)
+ wind_anchors=6, pressure=8.956827, warnings=[PanelWarnings.MaxPsf]),
+ Panel(wind_zone=6, panel_type=PanelType.Corner, ballast=13, link_tray=0, cross_tray=1,
+ wind_anchors=0, pressure=9.527003)
]
assert_array_is_close(self.subject.ballast_and_trays_matrix(self.c_p_matrix, self.q_z, panel_data),
@@ -213,41 +213,41 @@ class BallastCalculatorWhenSingleTiltAnd128CellTest(unittest.TestCase):
self.q_z = 18.446284
expected = Panel(wind_zone=10, panel_type=PanelType.Middle, ballast=0, link_tray=0, cross_tray=0,
- wind_anchors=0, pressure=1.87)
+ wind_anchors=0, pressure=1.819845)
assert self.subject.ballast_tray_and_anchor_count(10, PanelType.Middle, 14, 1000, self.c_p_matrix,
self.q_z).almost_equal(expected, decimal=2)
def test_individual_ballast_block_uplift_greater_than_base_weight(self):
- expected = Panel(wind_zone=6, panel_type=PanelType.Middle, ballast=16, link_tray=1, cross_tray=1,
- wind_anchors=0, pressure=8.47)
+ expected = Panel(wind_zone=6, panel_type=PanelType.Middle, ballast=17, link_tray=1, cross_tray=1,
+ wind_anchors=0, pressure=8.810399)
assert self.subject.ballast_tray_and_anchor_count(6, PanelType.Middle, 14, 1000, self.c_p_matrix,
self.q_z).almost_equal(expected, decimal=2)
expected = Panel(wind_zone=6, panel_type=PanelType.Middle, ballast=12, link_tray=1, cross_tray=1,
- wind_anchors=0, pressure=8.93)
+ wind_anchors=0, pressure=8.867935)
assert self.subject.ballast_tray_and_anchor_count(6, PanelType.Middle, 20, 1000, self.c_p_matrix,
self.q_z).almost_equal(expected, decimal=2)
def test_ballast_blocks_exceeding_tray_capacity(self):
- expected = Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=9, link_tray=0, cross_tray=2,
- wind_anchors=7, pressure=7.43, warnings=[PanelWarnings.MaxPsf])
+ expected = Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=10, link_tray=0, cross_tray=2,
+ wind_anchors=7, pressure=7.891559, warnings=[PanelWarnings.MaxPsf])
assert self.subject.ballast_tray_and_anchor_count(0, PanelType.Corner, 20, 1000, self.c_p_matrix,
self.q_z).almost_equal(expected, decimal=2)
expected = Panel(wind_zone=8, panel_type=PanelType.Middle, ballast=7, link_tray=1, cross_tray=1,
- wind_anchors=6, pressure=6.06, warnings=[PanelWarnings.MaxPsf])
+ wind_anchors=6, pressure=5.991164, warnings=[PanelWarnings.MaxPsf])
assert self.subject.ballast_tray_and_anchor_count(8, PanelType.Middle, 20, 1000, self.c_p_matrix,
self.q_z).almost_equal(expected, decimal=2)
def test_ballast_blocks_when_panel_exceeds_max_system_pressure(self):
expected = Panel(wind_zone=5, panel_type=PanelType.Middle, ballast=7, link_tray=1, cross_tray=0,
- wind_anchors=1, pressure=4.76)
+ wind_anchors=1, pressure=4.692301)
assert self.subject.ballast_tray_and_anchor_count(5, PanelType.Middle, 14, 10, self.c_p_matrix,
self.q_z).almost_equal(expected, decimal=2)
- expected = Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=13, link_tray=0, cross_tray=2,
- wind_anchors=7, pressure=7.49, warnings=[PanelWarnings.MaxPsf])
+ expected = Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=14, link_tray=0, cross_tray=2,
+ wind_anchors=7, pressure=7.776488, warnings=[PanelWarnings.MaxPsf])
assert self.subject.ballast_tray_and_anchor_count(0, PanelType.Corner, 14, 10, self.c_p_matrix,
self.q_z).almost_equal(expected, decimal=2)
@@ -255,7 +255,7 @@ class BallastCalculatorWhenSingleTiltAnd128CellTest(unittest.TestCase):
max_system_pressure = 0
expected = Panel(wind_zone=5, panel_type=PanelType.Middle, ballast=0, link_tray=0, cross_tray=0,
- wind_anchors=2, pressure=1.87)
+ wind_anchors=2, pressure=1.819845)
assert self.subject.ballast_tray_and_anchor_count(5, PanelType.Middle, 12, max_system_pressure,
self.c_p_matrix, self.q_z).almost_equal(
expected,
diff --git a/test/calculators/ballast/ballast_calculator_single_tilt_96_cell_test.py b/test/calculators/ballast/ballast_calculator_single_tilt_96_cell_test.py
index d2da445..71b8a9a 100644
--- a/test/calculators/ballast/ballast_calculator_single_tilt_96_cell_test.py
+++ b/test/calculators/ballast/ballast_calculator_single_tilt_96_cell_test.py
@@ -54,24 +54,23 @@ class BallastCalculatorWhenSingleTiltAnd96CellTest(unittest.TestCase):
expected_value = {
PanelType.Corner: {
'anchors': [5, 4, 2, 2, 1, 1, 0, 2, 6, 3, 0],
- 'ballast blocks': [14, 10, 9, 9, 11, 10, 10, 2, 2, 9, 8],
- 'pressure': ['12.93', '9.79', '9.03', '9.03', '10.56', '9.70', '9.70', '3.60', '3.69', '9.03', '8.18']
+ 'ballast blocks': [14, 10, 9, 10, 11, 10, 11, 2, 2, 9, 8],
+ 'pressure': ['12.81', '9.67', '8.90', '9.67', '10.43', '9.58', '10.34', '3.47', '3.57', '8.90', '8.05']
},
PanelType.NorthSouth: {
'anchors': [5, 4, 2, 2, 0, 1, 0, 1, 5, 3, 0],
'ballast blocks': [5, 2, 5, 5, 15, 7, 9, 13, 3, 2, 7],
- 'pressure': ['5.79', '3.50', '5.70', '5.70', '13.41', '7.23', '8.84', '11.89', '4.26', '3.41', '7.23']
+ 'pressure': ['5.74', '3.45', '5.74', '5.65', '13.37', '7.17', '8.79', '11.84', '4.22', '3.36', '7.17']
},
PanelType.EastWest: {
'anchors': [4, 3, 1, 1, 1, 0, 0, 1, 5, 1, 0],
'ballast blocks': [6, 6, 10, 9, 8, 16, 9, 13, 3, 7, 4],
- 'pressure': ['6.79', '6.70', '9.75', '8.99', '8.23', '14.42', '8.99', '12.13', '4.41', '7.46', '5.09']
+ 'pressure': ['6.62', '6.52', '9.57', '8.81', '8.05', '14.24', '8.81', '11.96', '4.24', '7.29', '4.93']
},
PanelType.Middle: {
'anchors': [3, 2, 1, 0, 0, 0, 0, 1, 3, 0, 0],
- 'ballast blocks': [11, 13, 6, 19, 12, 13, 8, 7, 15, 18, 3],
- 'pressure': ['10.42', '11.95', '6.52', '16.61', '11.19', '11.95', '8.05', '7.29', '13.56', '15.76',
- '4.15']
+ 'ballast blocks': [11, 13, 6, 19, 12, 13, 8, 8, 15, 18, 3],
+ 'pressure': ['10.40', '11.92', '6.49', '16.59', '11.16', '11.92', '8.02', '8.02', '13.54', '15.73', '4.13']
},
}
@@ -96,14 +95,14 @@ class BallastCalculatorWhenSingleTiltAnd96CellTest(unittest.TestCase):
self.values.ballast_block_weight.return_value = 20
expected_value = [
- Panel(wind_zone=5, panel_type=PanelType.Corner, ballast=25, link_tray=0, cross_tray=2, wind_anchors=0, pressure=21.32),
- Panel(wind_zone=6, panel_type=PanelType.NorthSouth, ballast=9, link_tray=0, cross_tray=1, wind_anchors=0, pressure=8.84),
- Panel(wind_zone=7, panel_type=PanelType.EastWest, ballast=28, link_tray=2, cross_tray=2, wind_anchors=0, pressure=23.65),
- Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=14, link_tray=0, cross_tray=2, wind_anchors=5, pressure=12.93, warnings=[PanelWarnings.MaxPsf]),
- Panel(wind_zone=8, panel_type=PanelType.Middle, ballast=15, link_tray=1, cross_tray=2, wind_anchors=3, pressure=13.56, warnings=[PanelWarnings.MaxPsf]),
- Panel(wind_zone=9, panel_type=PanelType.NorthSouth, ballast=2, link_tray=0, cross_tray=0, wind_anchors=3, pressure=3.41, warnings=[PanelWarnings.MaxPsf]),
- Panel(wind_zone=6, panel_type=PanelType.Corner, ballast=10, link_tray=0, cross_tray=0, wind_anchors=0, pressure=9.70),
- Panel(wind_zone=6, panel_type=PanelType.EastWest, ballast=9, link_tray=2, cross_tray=0, wind_anchors=0, pressure=8.99)
+ Panel(wind_zone=5, panel_type=PanelType.Corner, ballast=25, link_tray=0, cross_tray=2, wind_anchors=0, pressure=21.200142),
+ Panel(wind_zone=6, panel_type=PanelType.NorthSouth, ballast=9, link_tray=0, cross_tray=1, wind_anchors=0, pressure=8.791605),
+ Panel(wind_zone=7, panel_type=PanelType.EastWest, ballast=28, link_tray=2, cross_tray=2, wind_anchors=0, pressure=23.487752),
+ Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=14, link_tray=0, cross_tray=2, wind_anchors=5, pressure=12.810842, warnings=[PanelWarnings.MaxPsf]),
+ Panel(wind_zone=8, panel_type=PanelType.Middle, ballast=15, link_tray=1, cross_tray=2, wind_anchors=3, pressure=13.538805, warnings=[PanelWarnings.MaxPsf]),
+ Panel(wind_zone=9, panel_type=PanelType.NorthSouth, ballast=2, link_tray=0, cross_tray=0, wind_anchors=3, pressure=3.360677, warnings=[PanelWarnings.MaxPsf]),
+ Panel(wind_zone=6, panel_type=PanelType.Corner, ballast=11, link_tray=0, cross_tray=0, wind_anchors=0, pressure=10.337906),
+ Panel(wind_zone=6, panel_type=PanelType.EastWest, ballast=9, link_tray=2, cross_tray=0, wind_anchors=0, pressure=8.812197)
]
assert_array_is_close(self.subject.ballast_and_trays_matrix(self.c_p_matrix, self.q_z, panels), expected_value, decimal=2)
@@ -160,13 +159,13 @@ class BallastCalculatorWhenSingleTiltAnd96CellTest(unittest.TestCase):
]
expected_value = array([
- Panel(wind_zone=7, panel_type=PanelType.Corner, ballast=2, link_tray=0, cross_tray=0, wind_anchors=2, pressure=3.60),
- Panel(wind_zone=7, panel_type=PanelType.NorthSouth, ballast=13, link_tray=0, cross_tray=1, wind_anchors=1, pressure=11.89),
- Panel(wind_zone=9, panel_type=PanelType.EastWest, ballast=22, link_tray=2, cross_tray=1, wind_anchors=0, pressure=18.99),
- Panel(wind_zone=5, panel_type=PanelType.Corner, ballast=25, link_tray=0, cross_tray=2, wind_anchors=0, pressure=21.32),
- Panel(wind_zone=6, panel_type=PanelType.Middle, ballast=8, link_tray=1, cross_tray=0, wind_anchors=0, pressure=8.05),
- Panel(wind_zone=8, panel_type=PanelType.NorthSouth, ballast=3, link_tray=0, cross_tray=1, wind_anchors=5, pressure=4.26, warnings=[PanelWarnings.MaxPsf]),
- Panel(wind_zone=6, panel_type=PanelType.Corner, ballast=10, link_tray=0, cross_tray=0, wind_anchors=0, pressure=9.70),
+ Panel(wind_zone=7, panel_type=PanelType.Corner, ballast=2, link_tray=0, cross_tray=0, wind_anchors=2, pressure=3.473933),
+ Panel(wind_zone=7, panel_type=PanelType.NorthSouth, ballast=13, link_tray=0, cross_tray=1, wind_anchors=1, pressure=11.842260),
+ Panel(wind_zone=9, panel_type=PanelType.EastWest, ballast=22, link_tray=2, cross_tray=1, wind_anchors=0, pressure=18.819488),
+ Panel(wind_zone=5, panel_type=PanelType.Corner, ballast=25, link_tray=0, cross_tray=2, wind_anchors=0, pressure=21.200142),
+ Panel(wind_zone=6, panel_type=PanelType.Middle, ballast=8, link_tray=1, cross_tray=0, wind_anchors=0, pressure=8.015213),
+ Panel(wind_zone=8, panel_type=PanelType.NorthSouth, ballast=3, link_tray=0, cross_tray=1, wind_anchors=5, pressure=4.215623, warnings=[PanelWarnings.MaxPsf]),
+ Panel(wind_zone=6, panel_type=PanelType.Corner, ballast=11, link_tray=0, cross_tray=0, wind_anchors=0, pressure=10.337906),
])
assert_array_is_close(self.subject.ballast_and_trays_matrix(self.c_p_matrix, self.q_z, panels), expected_value, decimal=2)
@@ -175,43 +174,43 @@ class BallastCalculatorWhenSingleTiltAnd96CellTest(unittest.TestCase):
assert self.subject.ballast_tray_and_anchor_count(10, PanelType.Middle, 14, 1000, self.c_p_matrix,
30.155851).almost_equal(
Panel(wind_zone=10, panel_type=PanelType.Middle, ballast=0, link_tray=0, cross_tray=0,
- wind_anchors=0, pressure=1.86),
+ wind_anchors=0, pressure=1.842977),
decimal=2)
def test_individual_ballast_block_uplift_greater_than_base_weight(self):
assert self.subject.ballast_tray_and_anchor_count(6, PanelType.Middle, 14, 1000, self.c_p_matrix,
self.q_z).almost_equal(
Panel(wind_zone=6, panel_type=PanelType.Middle, ballast=11, link_tray=1, cross_tray=1,
- wind_anchors=0, pressure=7.91),
+ wind_anchors=0, pressure=7.878697),
decimal=2)
assert self.subject.ballast_tray_and_anchor_count(6, PanelType.Middle, 20, 1000, self.c_p_matrix,
self.q_z).almost_equal(
Panel(wind_zone=6, panel_type=PanelType.Middle, ballast=8, link_tray=1, cross_tray=0,
- wind_anchors=0, pressure=8.05),
+ wind_anchors=0, pressure=8.015213),
decimal=2)
def test_ballast_blocks_exceeding_tray_capacity(self):
assert self.subject.ballast_tray_and_anchor_count(0, PanelType.Corner, 20, 1000, self.c_p_matrix,
self.q_z).almost_equal(
Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=14, link_tray=0, cross_tray=2,
- wind_anchors=5, pressure=12.93, warnings=[PanelWarnings.MaxPsf]),
+ wind_anchors=5, pressure=12.810842, warnings=[PanelWarnings.MaxPsf]),
decimal=2)
assert self.subject.ballast_tray_and_anchor_count(8, PanelType.Middle, 20, 1000, self.c_p_matrix,
self.q_z).almost_equal(
Panel(wind_zone=8, panel_type=PanelType.Middle, ballast=15, link_tray=1, cross_tray=2,
- wind_anchors=3, pressure=13.56, warnings=[PanelWarnings.MaxPsf]),
+ wind_anchors=3, pressure=13.538805, warnings=[PanelWarnings.MaxPsf]),
decimal=2)
def test_ballast_blocks_when_panel_exceeds_max_system_pressure(self):
assert self.subject.ballast_tray_and_anchor_count(5, PanelType.Middle, 14, 10, self.c_p_matrix,
self.q_z).almost_equal(
Panel(wind_zone=5, panel_type=PanelType.Middle, ballast=0, link_tray=0, cross_tray=0,
- wind_anchors=1, pressure=1.86),
+ wind_anchors=1, pressure=1.842977),
decimal=2)
assert self.subject.ballast_tray_and_anchor_count(0, PanelType.Corner, 14, 10, self.c_p_matrix,
self.q_z).almost_equal(
Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=0, link_tray=0, cross_tray=0,
- wind_anchors=6, pressure=2.08, warnings=[PanelWarnings.MaxPsf]),
+ wind_anchors=6, pressure=1.948606, warnings=[PanelWarnings.MaxPsf]),
decimal=2)
def test_when_max_system_pressure_is_lower_than_base_weight_pressure(self):
@@ -220,7 +219,7 @@ class BallastCalculatorWhenSingleTiltAnd96CellTest(unittest.TestCase):
assert self.subject.ballast_tray_and_anchor_count(5, PanelType.Middle, 12, max_system_pressure, self.c_p_matrix,
self.q_z).almost_equal(
Panel(wind_zone=5, panel_type=PanelType.Middle, ballast=0, link_tray=0, cross_tray=0,
- wind_anchors=1, pressure=1.86),
+ wind_anchors=1, pressure=1.842977),
decimal=2)
def test_uplift(self):
diff --git a/test/calculators/ballast/ballast_calculator_single_tilt_pseries_test.py b/test/calculators/ballast/ballast_calculator_single_tilt_pseries_test.py
index 62e0f4f..a9a1a25 100644
--- a/test/calculators/ballast/ballast_calculator_single_tilt_pseries_test.py
+++ b/test/calculators/ballast/ballast_calculator_single_tilt_pseries_test.py
@@ -55,27 +55,27 @@ class BallastCalculatorWhenSingleTiltAndPSeriesTest(unittest.TestCase):
PanelType.Corner: {
'anchors': [7, 5, 3, 3, 2, 1, 0, 2, 7, 4, 0],
'ballast blocks': [5, 11, 3, 4, 2, 15, 13, 9, 7, 6, 11],
- 'pressure': ['5.13', '8.75', '3.83', '4.43', '3.22', '11.16', '9.86', '7.45', '6.33', '5.73', '8.65']
+ 'pressure': ['5.07', '8.69', '3.77', '4.37', '3.17', '11.10', '9.80', '7.39', '6.37', '5.67', '8.59']
},
PanelType.NorthSouth: {
'anchors': [6, 5, 2, 2, 0, 1, 0, 2, 6, 3, 0],
'ballast blocks': [10, 3, 15, 14, 18, 12, 12, 5, 8, 14, 9],
- 'pressure': ['8.06', '3.74', '11.07', '10.37', '12.88', '9.17', '9.17', '4.85', '6.85', '10.47', '7.26']
+ 'pressure': ['8.09', '3.78', '11.11', '10.41', '12.82', '9.20', '9.20', '4.89', '6.89', '10.50', '7.30']
},
PanelType.EastWest: {
'anchors': [5, 4, 2, 1, 1, 0, 0, 2, 6, 1, 0],
'ballast blocks': [8, 5, 1, 15, 14, 20, 12, 5, 8, 13, 6],
- 'pressure': ['6.94', '5.04', '2.56', '11.16', '10.56', '14.18', '9.26', '5.04', '6.94', '9.96', '5.57']
+ 'pressure': ['6.87', '4.97', '2.50', '11.09', '10.49', '14.11', '9.19', '4.97', '6.87', '9.89', '5.51']
},
PanelType.Middle: {
'anchors': [5, 4, 1, 1, 0, 0, 0, 2, 6, 1, 0],
'ballast blocks': [6, 3, 15, 14, 18, 20, 11, 4, 4, 12, 6],
- 'pressure': ['5.60', '3.69', '11.02', '10.42', '12.83', '14.13', '8.51', '4.29', '4.39', '9.21', '5.43']
+ 'pressure': ['5.59', '3.68', '11.01', '10.41', '12.82', '14.12', '8.60', '4.29', '4.38', '9.20', '5.44']
},
}
received_table = self.subject.summary_table(self.c_p_matrix, self.q_z)
-
+ print("===\r\n",received_table)
eq_(received_table.keys(), expected_value.keys())
for key in expected_value.keys():
received_table[key].pop('warnings')
@@ -97,21 +97,21 @@ class BallastCalculatorWhenSingleTiltAndPSeriesTest(unittest.TestCase):
expected_value = [
Panel(wind_zone=5, panel_type=PanelType.Corner, ballast=15, link_tray=0, cross_tray=1, wind_anchors=1,
- pressure=11.16),
+ pressure=11.101436),
Panel(wind_zone=6, panel_type=PanelType.NorthSouth, ballast=12, link_tray=0, cross_tray=1, wind_anchors=0,
- pressure=9.17),
+ pressure=9.202700),
Panel(wind_zone=7, panel_type=PanelType.EastWest, ballast=5, link_tray=2, cross_tray=0, wind_anchors=2,
- pressure=5.04, warnings=[PanelWarnings.MaxPsf]),
+ pressure=4.967106, warnings=[PanelWarnings.MaxPsf]),
Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=5, link_tray=0, cross_tray=1, wind_anchors=7,
- pressure=5.13, warnings=[PanelWarnings.MaxPsf]),
+ pressure=5.070833, warnings=[PanelWarnings.MaxPsf]),
Panel(wind_zone=8, panel_type=PanelType.Middle, ballast=4, link_tray=1, cross_tray=1, wind_anchors=6,
- pressure=4.39, warnings=[PanelWarnings.MaxPsf]),
+ pressure=4.380027, warnings=[PanelWarnings.MaxPsf]),
Panel(wind_zone=9, panel_type=PanelType.NorthSouth, ballast=14, link_tray=0, cross_tray=2, wind_anchors=3,
- pressure=10.47, warnings=[PanelWarnings.MaxPsf]),
+ pressure=10.503803, warnings=[PanelWarnings.MaxPsf]),
Panel(wind_zone=6, panel_type=PanelType.Corner, ballast=13, link_tray=0, cross_tray=0, wind_anchors=0,
- pressure=9.86),
+ pressure=9.800333),
Panel(wind_zone=6, panel_type=PanelType.EastWest, ballast=12, link_tray=2, cross_tray=0, wind_anchors=0,
- pressure=9.26)
+ pressure=9.188528)
]
assert_array_is_close(self.subject.ballast_and_trays_matrix(self.c_p_matrix, self.q_z, panels),
@@ -170,19 +170,19 @@ class BallastCalculatorWhenSingleTiltAndPSeriesTest(unittest.TestCase):
expected_value = [
Panel(wind_zone=7, panel_type=PanelType.Corner, ballast=9, link_tray=0, cross_tray=0,
- wind_anchors=2, pressure=7.44, warnings=[PanelWarnings.MaxPsf]),
+ wind_anchors=2, pressure=7.388092, warnings=[PanelWarnings.MaxPsf]),
Panel(wind_zone=7, panel_type=PanelType.NorthSouth, ballast=5, link_tray=0, cross_tray=0,
- wind_anchors=2, pressure=4.85, warnings=[PanelWarnings.MaxPsf]),
+ wind_anchors=2, pressure=4.886296, warnings=[PanelWarnings.MaxPsf]),
Panel(wind_zone=9, panel_type=PanelType.EastWest, ballast=28, link_tray=2, cross_tray=2,
- wind_anchors=0, pressure=19.10),
+ wind_anchors=0, pressure=19.027457),
Panel(wind_zone=5, panel_type=PanelType.Corner, ballast=15, link_tray=0, cross_tray=1,
- wind_anchors=1, pressure=11.16),
- Panel(wind_zone=6, panel_type=PanelType.Middle, ballast=11, link_tray=1, cross_tray=0,
- wind_anchors=0, pressure=8.51),
+ wind_anchors=1, pressure=11.101436),
+ Panel(wind_zone=6, panel_type=PanelType.Middle, ballast=11, link_tray=1, cross_tray=1,
+ wind_anchors=0, pressure= 8.601449),
Panel(wind_zone=8, panel_type=PanelType.NorthSouth, ballast=8, link_tray=0, cross_tray=2,
- wind_anchors=6, pressure=6.85, warnings=[PanelWarnings.MaxPsf]),
+ wind_anchors=6, pressure=6.885441, warnings=[PanelWarnings.MaxPsf]),
Panel(wind_zone=6, panel_type=PanelType.Corner, ballast=13, link_tray=0, cross_tray=0,
- wind_anchors=0, pressure=9.86)
+ wind_anchors=0, pressure=9.800333)
]
assert_array_is_close(self.subject.ballast_and_trays_matrix(self.c_p_matrix, self.q_z, panel_data),
@@ -221,22 +221,22 @@ class BallastCalculatorWhenSingleTiltAndPSeriesTest(unittest.TestCase):
def test_ballast_and_tray_count_iterates_on_link_and_cross_trays_changing_weight_and_ballast_requirements(self):
panel = self.subject.ballast_tray_and_anchor_count(3, PanelType.NorthSouth, 20, 17, self.c_p_matrix, self.q_z)
- assert_almost_equal(panel.pressure, 10.37, 2)
+ assert_almost_equal(panel.pressure, 10.408820882088209, 2)
def test_individual_ballast_block_uplift_greater_than_base_weight(self):
expected = Panel(wind_zone=6, panel_type=PanelType.Middle, ballast=16, link_tray=1, cross_tray=1,
- wind_anchors=0, pressure=8.73)
+ wind_anchors=0, pressure=8.722061)
assert self.subject.ballast_tray_and_anchor_count(6, PanelType.Middle, 14, 1000, self.c_p_matrix,
self.q_z).almost_equal(expected, decimal=2)
- expected = Panel(wind_zone=6, panel_type=PanelType.Middle, ballast=11, link_tray=1, cross_tray=0,
- wind_anchors=0, pressure=8.51)
+ expected = Panel(wind_zone=6, panel_type=PanelType.Middle, ballast=11, link_tray=1, cross_tray=1,
+ wind_anchors=0, pressure=8.601449)
assert self.subject.ballast_tray_and_anchor_count(6, PanelType.Middle, 20, 1000, self.c_p_matrix,
self.q_z).almost_equal(expected, decimal=2)
def test_ballast_blocks_exceeding_tray_capacity(self):
expected = Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=5, link_tray=0, cross_tray=1,
- wind_anchors=7, pressure=5.13, warnings=[PanelWarnings.MaxPsf])
+ wind_anchors=7, pressure=5.070833, warnings=[PanelWarnings.MaxPsf])
assert self.subject.ballast_tray_and_anchor_count(0, PanelType.Corner, 20, 1000, self.c_p_matrix,
self.q_z).almost_equal(expected, decimal=2)
@@ -253,7 +253,7 @@ class BallastCalculatorWhenSingleTiltAndPSeriesTest(unittest.TestCase):
self.q_z).almost_equal(expected, decimal=2)
expected = Panel(wind_zone=0, panel_type=PanelType.Corner, ballast=7, link_tray=0, cross_tray=1,
- wind_anchors=7, pressure=5.07, warnings=[PanelWarnings.MaxPsf])
+ wind_anchors=7, pressure=5.010527, warnings=[PanelWarnings.MaxPsf])
assert self.subject.ballast_tray_and_anchor_count(0, PanelType.Corner, 14, 10, self.c_p_matrix,
self.q_z).almost_equal(expected, decimal=2)
diff --git a/test/calculators/calculator_test.py b/test/calculators/calculator_test.py
index 78c6423..495a9b3 100644
--- a/test/calculators/calculator_test.py
+++ b/test/calculators/calculator_test.py
@@ -56,7 +56,7 @@ class CalculatorTest(unittest.TestCase):
self.subject = Calculator(self.values)
expected = [
- Subarray(subarray_number=1, origin=Coordinate(0, 0), required_seismic_anchors=435, weight=170237,
+ Subarray(subarray_number=1, origin=Coordinate(0, 0), required_seismic_anchors=436, weight=170698.330000,
start_row=0, size=863, column_counted_geometrically=False, row_counted_geometrically=False,
row_count=130.5, column_count=98)
]
@@ -70,43 +70,43 @@ class CalculatorTest(unittest.TestCase):
self.subject = Calculator(self.values)
expected = [
- Subarray(subarray_number=1, origin=Coordinate(0, 0), required_seismic_anchors=11, weight=23783, start_row=0,
+ Subarray(subarray_number=1, origin=Coordinate(0, 0), required_seismic_anchors=11, weight=23804, start_row=0,
size=192, column_counted_geometrically=False, row_counted_geometrically=False,
row_count=18, column_count=20),
- Subarray(subarray_number=2, origin=Coordinate(0, 0), required_seismic_anchors=0, weight=13113,
+ Subarray(subarray_number=2, origin=Coordinate(0, 0), required_seismic_anchors=0, weight=13271,
start_row=192, size=96, column_counted_geometrically=False, row_counted_geometrically=False,
row_count=4, column_count=24),
- Subarray(subarray_number=3, origin=Coordinate(0, 0), required_seismic_anchors=110, weight=40406,
+ Subarray(subarray_number=3, origin=Coordinate(0, 0), required_seismic_anchors=110, weight=40328,
start_row=288, size=312, column_counted_geometrically=False, row_counted_geometrically=False,
row_count=25, column_count=29),
- Subarray(subarray_number=4, origin=Coordinate(0, 0), required_seismic_anchors=72, weight=23404,
+ Subarray(subarray_number=4, origin=Coordinate(0, 0), required_seismic_anchors=71, weight=23324,
start_row=600, size=168, column_counted_geometrically=False, row_counted_geometrically=False,
row_count=22, column_count=13),
- Subarray(subarray_number=5, origin=Coordinate(0, 0), required_seismic_anchors=75, weight=35365,
+ Subarray(subarray_number=5, origin=Coordinate(0, 0), required_seismic_anchors=74, weight=35170,
start_row=768, size=234, column_counted_geometrically=False, row_counted_geometrically=False,
row_count=26, column_count=14),
- Subarray(subarray_number=6, origin=Coordinate(0, 0), required_seismic_anchors=0, weight=10897,
+ Subarray(subarray_number=6, origin=Coordinate(0, 0), required_seismic_anchors=1, weight=11461,
start_row=1002, size=96, column_counted_geometrically=False, row_counted_geometrically=False,
row_count=10, column_count=12),
- Subarray(subarray_number=7, origin=Coordinate(0, 0), required_seismic_anchors=29, weight=10951,
+ Subarray(subarray_number=7, origin=Coordinate(0, 0), required_seismic_anchors=28, weight=10865,
start_row=1098, size=96, column_counted_geometrically=False, row_counted_geometrically=False,
row_count=8, column_count=16),
- Subarray(subarray_number=8, origin=Coordinate(0, 0), required_seismic_anchors=11, weight=10596,
+ Subarray(subarray_number=8, origin=Coordinate(0, 0), required_seismic_anchors=12, weight=10780,
start_row=1194, size=96, column_counted_geometrically=False, row_counted_geometrically=False,
row_count=15, column_count=17.5),
- Subarray(subarray_number=9, origin=Coordinate(0, 0), required_seismic_anchors=0, weight=10544,
+ Subarray(subarray_number=9, origin=Coordinate(0, 0), required_seismic_anchors=0, weight= 10989,
start_row=1290, size=96, column_counted_geometrically=False, row_counted_geometrically=False,
row_count=8, column_count=16),
- Subarray(subarray_number=10, origin=Coordinate(0, 0), required_seismic_anchors=0, weight=4819,
+ Subarray(subarray_number=10, origin=Coordinate(0, 0), required_seismic_anchors=0, weight=4901,
start_row=1386, size=48, column_counted_geometrically=False, row_counted_geometrically=False,
row_count=8, column_count=6),
- Subarray(subarray_number=11, origin=Coordinate(0, 0), required_seismic_anchors=0, weight=10857,
+ Subarray(subarray_number=11, origin=Coordinate(0, 0), required_seismic_anchors=0, weight=10766,
start_row=1434, size=96, column_counted_geometrically=False, row_counted_geometrically=False,
row_count=13, column_count=13),
- Subarray(subarray_number=12, origin=Coordinate(0, 0), required_seismic_anchors=0, weight=6330,
+ Subarray(subarray_number=12, origin=Coordinate(0, 0), required_seismic_anchors=0, weight=6350,
start_row=1530, size=54, column_counted_geometrically=False, row_counted_geometrically=False,
row_count=8, column_count=8),
- Subarray(subarray_number=13, origin=Coordinate(0, 0), required_seismic_anchors=0, weight=4201,
+ Subarray(subarray_number=13, origin=Coordinate(0, 0), required_seismic_anchors=0, weight=4239,
start_row=1584, size=48, column_counted_geometrically=False, row_counted_geometrically=False,
row_count=6, column_count=8)
]
@@ -140,15 +140,15 @@ class CalculatorTest(unittest.TestCase):
self.subject = Calculator(self.values)
received_values = self.subject.summary_values()
-
+
expected_values = array([
- {'label': 'Total System Weight (lbs)', 'value': 2684},
- {'label': 'Max PSF', 'value': 8.03},
- {'label': 'Avg PSF', 'value': 5.39},
+ {'label': 'Total System Weight (lbs)', 'value': 2694},
+ {'label': 'Max PSF', 'value': 7.9},
+ {'label': 'Avg PSF', 'value': 5.41},
{'label': 'Total Anchors', 'value': 5},
- {'label': 'Total Ballast', 'value': 131},
- {'label': 'Max Possible System Weight', 'value': 2789.0},
- {'label': 'Max System Weight Ballast Block', 'value': 16},
+ {'label': 'Total Ballast', 'value': 135},
+ {'label': 'Max Possible System Weight', 'value': 2792.0},
+ {'label': 'Max System Weight Ballast Block', 'value': 17},
{'label': 'Seismic Anchor Max. Spacing', 'value': 12},
])
assert_array_equal(received_values, expected_values)
@@ -173,13 +173,13 @@ class CalculatorTest(unittest.TestCase):
received_values = self.subject.documentation_summary_values()
expected_values = {
- 'total_system_weight': 2684,
- 'max_psf': 8.03,
- 'ave_psf': 5.39,
+ 'total_system_weight': 2694,
+ 'max_psf': 7.9,
+ 'ave_psf': 5.41,
'total_anchors': 5,
- 'total_ballast': 131,
- 'max_possible_system_weight': 2789.0,
- 'max_system_weight_ballast_block': 16,
+ 'total_ballast': 135,
+ 'max_possible_system_weight': 2792.0,
+ 'max_system_weight_ballast_block': 17,
'seismic_anchor_max_spacing': 12
}
eq_(received_values, expected_values)
@@ -326,6 +326,8 @@ class CalculatorTest(unittest.TestCase):
expected_csv = expected_file.read()
reader = csv.reader(expected_csv.splitlines(), dialect='excel-tab')
expected = array([row for row in reader])
+ print("EXPECTED")
+ print(expected)
power_station_1 = PowerStation(
description='1',
@@ -367,6 +369,8 @@ class CalculatorTest(unittest.TestCase):
)
self.site.power_stations = [power_station_1, power_station_2]
+ print("COMPUTE")
+ print(self.subject.compute_bom())
assert_array_equal(self.subject.compute_bom(), expected)
def test_documentation_bom(self):
@@ -404,91 +408,90 @@ class CalculatorTest(unittest.TestCase):
self.site.cad_file = csv_content
self.subject = Calculator(self.values)
- expected = [
- ('104813', 50),
- ('105317', 0),
- ('106925', 50),
- ('107538', 0),
- ('107549', 100),
- ('107551', 50),
- ('107586', 100),
- ('111147', 0),
- ('114961', 50),
- ('507985', 0),
- ('512021', 9),
- ('512199', 140),
- ('512200', 3480),
- ('512510', 196),
- ('512511', 196),
- ('512575', 1),
- ('512660', 2),
- ('512661', 2),
- ('512662', 4),
- ('512663', 2),
- ('523923', 0),
- ('512910', 1),
- ('513007', 50),
- ('513299', 0),
- ('513300', 0),
- ('513301', 0),
- ('513302', 0),
- ('513303', 1),
- ('513304', 0),
- ('513586', 0),
- ('513831', 0),
- ('513832', 0),
- ('513833', 670),
- ('513836', 0),
- ('513843', 262),
- ('513844', 214),
- ('514056', 1000),
- ('514057', 1000),
- ('514265', 179),
- ('514435', 0),
- ('514436', 0),
- ('514437', 2),
- ('514438', 2),
- ('514439', 0),
- ('514440', 0),
- ('514477', 2),
- ('514478', 0),
- ('523924', 0),
- ('523921', 1),
- ('523922', 0),
- ('514697', 1),
- ('514698', 1),
- ('514865', 50),
- ('515059', 2),
- ('515063', 4000),
- ('515928', 261),
- ('515929', 0),
- ('516043', 0),
- ('516045', 0),
- ('517463', 0),
- ('517871', 139),
- ('518058', 2),
- ('518059', 0),
- ('518331', 2),
- ('518477', 275),
- ('519008', 0),
- ('520301', 0),
- ('520302', 0),
- ('520303', 0),
- ('520306', 0),
- ('521031', 2),
- ('521363', 0),
- ('521797', 0),
- ('521798', 0),
- ('522020', 0),
- ('805615', 2),
- ('521794', 196),
- ('521795', 196),
-
- ('anchors', 262),
- ('ballast', 6786),
- ('modules', 1726)
- ]
+ expected = [('521794', 196),
+ ('521795', 196),
+ ('514056', 1000),
+ ('modules', 1726),
+ ('513843', 263),
+ ('anchors', 263),
+ ('518477', 275),
+ ('513833', 670),
+ ('513844', 214),
+ ('ballast', 6777),
+ ('515928', 261),
+ ('517871', 139),
+ ('514057', 1000),
+ ('515063', 4000),
+ ('512200', 3480),
+ ('514265', 179),
+ ('513303', 1),
+ ('512660', 2),
+ ('512661', 2),
+ ('512662', 4),
+ ('512663', 2),
+ ('518331', 2),
+ ('518058', 2),
+ ('104813', 50),
+ ('107551', 50),
+ ('514865', 50),
+ ('106925', 50),
+ ('523921', 1),
+ ('514438', 2),
+ ('514437', 2),
+ ('512910', 1),
+ ('805615', 2),
+ ('521031', 2),
+ ('512575', 1),
+ ('514698', 1),
+ ('513007', 50),
+ ('114961', 50),
+ ('107549', 100),
+ ('107586', 100),
+ ('512021', 9),
+ ('512199', 140),
+ ('512511', 196),
+ ('512510', 196),
+ ('515929', 0),
+ ('514477', 2),
+ ('515059', 2),
+ ('514697', 1),
+ ('513831', 0),
+ ('513836', 0),
+ ('520301', 0),
+ ('520302', 0),
+ ('520303', 0),
+ ('520306', 0),
+ ('513832', 0),
+ ('514435', 0),
+ ('514436', 0),
+ ('514439', 0),
+ ('514440', 0),
+ ('523922', 0),
+ ('523923', 0),
+ ('523924', 0),
+ ('513299', 0),
+ ('513301', 0),
+ ('514478', 0),
+ ('513300', 0),
+ ('513302', 0),
+ ('513304', 0),
+ ('519008', 0),
+ ('518059', 0),
+ ('105317', 0),
+ ('111147', 0),
+ ('107538', 0),
+ ('516045', 0),
+ ('516043', 0),
+ ('513586', 0),
+ ('507985', 0),
+ ('522020', 0),
+ ('521798', 0),
+ ('521797', 0),
+ ('521363', 0),
+ ('517463', 0)]
+ print("===")
+ print(self.subject.documentation_bom())
assert_array_equal(sorted(self.subject.documentation_bom()), sorted(expected))
# Performance Tests
diff --git a/test/calculators/ebom_calculator_test.py b/test/calculators/ebom_calculator_test.py
index 271c3b4..dcf3fc5 100644
--- a/test/calculators/ebom_calculator_test.py
+++ b/test/calculators/ebom_calculator_test.py
@@ -118,7 +118,7 @@ class EbomCalculatorTest(unittest.TestCase):
wire_clip_large: 2907,
cable_support_lid: 368,
cable_support: 368,
- rear_skirt: -140,
+ rear_skirt_1_1: -140,
dc_switch_bracket: 2,
front_legs: 23,
back_legs: 23,
@@ -193,10 +193,10 @@ class EbomCalculatorTest(unittest.TestCase):
self.user_values.module_type.return_value = ModuleType.Cell96
expected_output = {
stump: 65,
- wire_clip_large: 513,
+ wire_clip_large: 590,
cable_support_lid: 0,
cable_support: 0,
- rear_skirt: 0,
+ rear_skirt_1_1: 0,
rubber_foot: 9,
delta_inverter_leg: 9,
harness_4_string_mf: 4,
@@ -228,10 +228,10 @@ class EbomCalculatorTest(unittest.TestCase):
self.user_values.module_type.return_value = ModuleType.Cell96
expected_output = {
stump: 0,
- wire_clip_large: 171,
+ wire_clip_large: 200,
cable_support_lid: 0,
cable_support: 0,
- rear_skirt: 0,
+ rear_skirt_1_1: 0,
rubber_foot: 3,
delta_inverter_leg: 3,
harness_4_string_mf: 2,
@@ -380,7 +380,7 @@ class EbomCalculatorTest(unittest.TestCase):
wire_clip_large: 2394,
cable_support: 270,
cable_support_lid: 270,
- rear_skirt: -103,
+ rear_skirt_1_1: -103,
ethernet_plug: 7.2,
monitor_power_plug: 1,
sunshade_bolt: 12,
@@ -492,7 +492,7 @@ class EbomCalculatorTest(unittest.TestCase):
wire_clip_large: 2394,
cable_support: 270,
cable_support_lid: 270,
- rear_skirt: -103,
+ rear_skirt_1_1: -103,
ethernet_plug: 7.2,
monitor_power_plug: 1,
sunshade_bolt: 12,
@@ -604,7 +604,7 @@ class EbomCalculatorTest(unittest.TestCase):
wire_clip_large: 2394,
cable_support: 270,
cable_support_lid: 270,
- rear_skirt: -103,
+ rear_skirt_1_1: -103,
ethernet_plug: 7.2,
monitor_power_plug: 1,
fuseshade: 14,
@@ -624,13 +624,13 @@ class EbomCalculatorTest(unittest.TestCase):
}]
self.user_values.system_type.return_value = SystemType.singleTilt
self.user_values.module_type.return_value = ModuleType.Cell96
-
+
expected_output = {
monitor_power_plug: 1,
stump: 0,
cable_support: 0,
cable_support_lid: 0,
- rear_skirt: 0,
+ rear_skirt_1_1: 0,
monitor_controller_480_v:1,
}
@@ -644,13 +644,13 @@ class EbomCalculatorTest(unittest.TestCase):
}]
self.user_values.system_type.return_value = SystemType.singleTilt
self.user_values.module_type.return_value = ModuleType.Cell96
-
+
expected_output = {
monitor_power_plug: 1,
stump: 0,
cable_support: 0,
cable_support_lid: 0,
- rear_skirt: 0,
+ rear_skirt_1_1: 0,
monitor_controller_480_v:1,
flat_washer: 4,
channel_nut: 4,
@@ -771,7 +771,7 @@ class EbomCalculatorTest(unittest.TestCase):
wire_clip_large: 2394,
cable_support: 694,
cable_support_lid: 694,
- rear_skirt: -264,
+ rear_skirt_1_1: -264,
ethernet_plug: 7.2,
monitor_power_plug: 1,
fuseshade: 14,
@@ -922,7 +922,7 @@ class EbomCalculatorTest(unittest.TestCase):
wire_clip_large: 2394,
cable_support: 270,
cable_support_lid: 270,
- rear_skirt: -103,
+ rear_skirt_1_1: -103,
ethernet_plug: 7.2,
monitor_power_plug: 1,
sunshade_bolt: 12,
@@ -968,7 +968,7 @@ class EbomCalculatorTest(unittest.TestCase):
wire_clip_large: 2394,
cable_support: 270,
cable_support_lid: 270,
- rear_skirt: -103,
+ rear_skirt_1_1: -103,
ethernet_plug: 7.2,
sunshade_bolt: 12,
sunshade_washer: 12,
@@ -1027,7 +1027,7 @@ class EbomCalculatorTest(unittest.TestCase):
mounting_back_plate: 1,
cable_support: 0,
cable_support_lid: 0,
- rear_skirt: 0,
+ rear_skirt_1_1: 0,
monitor_power_plug: 1,
}
@@ -1046,7 +1046,7 @@ class EbomCalculatorTest(unittest.TestCase):
mounting_back_plate: 1,
cable_support: 0,
cable_support_lid: 0,
- rear_skirt: 0,
+ rear_skirt_1_1: 0,
monitor_power_plug: 1,
}
@@ -1055,14 +1055,14 @@ class EbomCalculatorTest(unittest.TestCase):
stump: 0,
cable_support: 0,
cable_support_lid: 0,
- rear_skirt: 0
+ rear_skirt_1_1: 0
}
expected_output_240_pseries = {
stump: 0,
cable_support_lid: 0,
cable_support: 0,
- rear_skirt: 0,
+ rear_skirt_1_1: 0,
monitor_controller_240_v: 1,
}
@@ -1116,14 +1116,14 @@ class EbomCalculatorTest(unittest.TestCase):
stump: 0,
cable_support: 0,
cable_support_lid: 0,
- rear_skirt: 0,
+ rear_skirt_1_1: 0,
monitor_controller_480_v: 1,
ethernet_plug: 2,
}
assert_dictionary_equal(self.subject.compute_ebom(), expected_output)
- def test_computes_ebom_with_power_monitor_SMA_brand(self):
+ def test_computes_ebom_with_power_monitor_SMA_brand(self):
self.user_values.inverter_brands.return_value = [{'inverter_brand_id':1}]
self.user_values.power_monitors.return_value = [{
'monitor_id': 'foo',
@@ -1131,13 +1131,13 @@ class EbomCalculatorTest(unittest.TestCase):
}]
self.user_values.system_type.return_value = SystemType.singleTilt
self.user_values.module_type.return_value = ModuleType.Cell96
-
+
expected_output = {
monitor_power_plug: 1,
stump: 0,
cable_support: 0,
cable_support_lid: 0,
- rear_skirt: 0,
+ rear_skirt_1_1: 0,
monitor_controller_480_v:1,
flat_washer: 4,
channel_nut: 4,
@@ -1152,7 +1152,3 @@ class EbomCalculatorTest(unittest.TestCase):
}
assert_dictionary_equal(self.subject.compute_ebom(), expected_output)
-
-
-
-
\ No newline at end of file
diff --git a/test/calculators/mechanical_bom/.mechanical_bom_calculator_single_tilt_96_cell_test.py.swp b/test/calculators/mechanical_bom/.mechanical_bom_calculator_single_tilt_96_cell_test.py.swp
new file mode 100644
index 0000000..30a0986
Binary files /dev/null and b/test/calculators/mechanical_bom/.mechanical_bom_calculator_single_tilt_96_cell_test.py.swp differ
diff --git a/test/calculators/mechanical_bom/mechanical_bom_calculator_single_tilt_96_cell_test.py b/test/calculators/mechanical_bom/mechanical_bom_calculator_single_tilt_96_cell_test.py
index f838021..8dbd990 100644
--- a/test/calculators/mechanical_bom/mechanical_bom_calculator_single_tilt_96_cell_test.py
+++ b/test/calculators/mechanical_bom/mechanical_bom_calculator_single_tilt_96_cell_test.py
@@ -99,7 +99,7 @@ class MechanicalBomCalculatorWhenSingleTilt96CellTest(unittest.TestCase):
cross_tray: 5,
rubber_foot: 4.4,
front_skirt: 24,
- rear_skirt: 44,
+ rear_skirt_1_1: 44,
leading_tray: 25,
ballast: 192,
anchor: 15, # 12 + the 3 seismic anchors
diff --git a/test/calculators/summary_values_test.py b/test/calculators/summary_values_test.py
index 7bd3b58..8bee234 100644
--- a/test/calculators/summary_values_test.py
+++ b/test/calculators/summary_values_test.py
@@ -54,8 +54,8 @@ class SummaryValuesTest(unittest.TestCase):
{'label': 'Avg PSF', 'value': 10.06},
{'label': 'Total Anchors', 'value': 7},
{'label': 'Total Ballast', 'value': 8},
- {'label': 'Max Possible System Weight', 'value': 1568.0},
- {'label': 'Max System Weight Ballast Block', 'value': 14},
+ {'label': 'Max Possible System Weight', 'value': 1563.0},
+ {'label': 'Max System Weight Ballast Block', 'value': 16},
{'label': 'Seismic Anchor Max. Spacing', 'value': seismic_interval}
]
eq_(result, expected)
@@ -83,8 +83,8 @@ class SummaryValuesTest(unittest.TestCase):
'ave_psf': 10.06,
'total_anchors': 7,
'total_ballast': 8,
- 'max_possible_system_weight': 1568.0,
- 'max_system_weight_ballast_block': 14,
+ 'max_possible_system_weight': 1563.0,
+ 'max_system_weight_ballast_block': 16,
'seismic_anchor_max_spacing': 10
}
@@ -111,7 +111,7 @@ class SummaryValuesTest(unittest.TestCase):
result = self.subject.find_max_system_weight(panels, self.c_p_matrix, self.q_z, self.ballast_calculator)
- assert_almost_equal(result, (1568, 14), decimal=0)
+ assert_almost_equal(result, (1563, 16), decimal=0)
def test_find_max_system_weight_does_not_modify_panels_list(self):
panels = [
diff --git a/test/fixtures/expected_dual_tilt.csv b/test/fixtures/expected_dual_tilt.csv
index 3926948..9db3fad 100644
--- a/test/fixtures/expected_dual_tilt.csv
+++ b/test/fixtures/expected_dual_tilt.csv
@@ -1,8 +1,8 @@
HANDLE BLOCKNAME WIND POS SUBARRAY PSF BAL LTRAY XTRAY ANC ID XCOORD YCOORD ANGLE
-'21EEE0 *U593 C 1 1 12.9 20 2 1 - 1 0 0 0
-'21EECC *U824 C 2 1 11.35 17 2 1 - 2 0 0 0
-'21EEB8 *U824 E 3 1 2.26 0 1 - - 3 0 0 0
+'21EEE0 *U593 C 1 1 12.91 20 2 1 - 1 0 0 0
+'21EECC *U824 C 2 1 11.34 17 2 1 - 2 0 0 0
+'21EEB8 *U824 E 3 1 2.28 0 1 - - 3 0 0 0
'21EEA4 *U593 A 1 1 5.55 6 2 - 2 4 0 0 0
-'21E940 *U171 B 4 1 13.83 22 1 2 - 5 0 0 0
+'21E940 *U171 B 4 1 13.87 22 1 2 - 5 0 0 0
'21E92C *U824 D 1 1 7.1 9 2 - - 6 0 0 0
'21E918 *U593 B 1 1 9.8 14 2 1 1 7 0 0 0
diff --git a/test/fixtures/expected_dual_tilt_bom.csv b/test/fixtures/expected_dual_tilt_bom.csv
index 98ef875..7749d14 100644
--- a/test/fixtures/expected_dual_tilt_bom.csv
+++ b/test/fixtures/expected_dual_tilt_bom.csv
@@ -1,7 +1,7 @@
Part # Description Total
512200 CLIP, WIRE FORMED, CABLE MANAGEMENT, INSIDE, 352MM ^ 2 3480
513833 TRAY, LINK, HELIX ROOF 670
-513843 PLATE, ANCHOR, HELIX ROOF 262
+513843 PLATE, ANCHOR, HELIX ROOF 263
513844 TRAY, OPTIONAL BALLAST, HELIX ROOF 214
514056 BASE, CHASSIS, DUAL TILT, HELIX ROOF 1000
514057 PLATFORM, CHASSIS, DUAL TILT, HELIX ROOF 1000
@@ -12,6 +12,6 @@ Part # Description Total
518477 WASHER, FLAT, 3/8, 1.00 OD, 18-8 SS 275
521794 DEFLECTOR, LH, HELIX ROOF V1.1 196
521795 DEFLECTOR, RH, HELIX ROOF V1.1 196
-Contractor Supplied Ballast Blocks 6786
-TBD Anchors 262
+Contractor Supplied Ballast Blocks 6777
+TBD Anchors 263
TBD Modules 1726
diff --git a/test/fixtures/expected_dual_tilt_ebom.csv b/test/fixtures/expected_dual_tilt_ebom.csv
index f9e09e4..43f7c39 100644
--- a/test/fixtures/expected_dual_tilt_ebom.csv
+++ b/test/fixtures/expected_dual_tilt_ebom.csv
@@ -14,7 +14,7 @@
513299 COMBINER BOX, AC, 4 INPUT, NO AUX, W/ CONNECTOR 3
513303 COMBINER BOX, AC, 2 INPUT, NO AUX, W/ CONNECTOR 1
513833 TRAY, LINK, HELIX ROOF 670
-513843 PLATE, ANCHOR, HELIX ROOF 262
+513843 PLATE, ANCHOR, HELIX ROOF 263
513844 TRAY, OPTIONAL BALLAST, HELIX ROOF 214
514056 BASE, CHASSIS, DUAL TILT, HELIX ROOF 1000
514057 PLATFORM, CHASSIS, DUAL TILT, HELIX ROOF 1000
@@ -42,6 +42,6 @@
523922 INVERTER, SMA, STP, 24000TL-US-10 (SPR-24000m-3-H), AFCI, CONNECTORIZED, UTX XL REV D DC CONNECTORS 1
523923 INVERTER, SMA, STP, 12000TL-US-10 (SPR-12000m-3-H), AFCI, CONNECTORIZED, UTX XL REV D DC CONNECTORS 3
523924 INVERTER, SMA, STP, 15000TL-US-10 (SPR-15000m-3-H), AFCI, CONNECTORIZED, UTX XL REV D DC CONNECTORS 9
-Contractor Supplied Ballast Blocks 6786
-TBD Anchors 262
+Contractor Supplied Ballast Blocks 6777
+TBD Anchors 263
TBD Modules 1726
diff --git a/test/fixtures/expected_single_tilt.csv b/test/fixtures/expected_single_tilt.csv
index 1a33550..5383526 100644
--- a/test/fixtures/expected_single_tilt.csv
+++ b/test/fixtures/expected_single_tilt.csv
@@ -1,20 +1,20 @@
HANDLE BLOCKNAME WIND POS SUBARRAY PSF BAL LTRAY XTRAY ANC ID XCOORD YCOORD ANGLE
-'40EC39 *U5399 H 1 8 14.37 16 - 1 - 1 0 0 0
-'40EC22 *U5402 H 3 8 12.89 14 2 1 - 2 0 0 0
-'40EC0B *U5402 H 1 8 14.37 16 - 1 - 3 0 0 0
-'40EBF4 *U5402 H 1 8 14.37 16 - 1 - 4 0 0 0
-'40EBDD *U5402 H 3 8 12.89 14 2 1 - 5 0 0 0
-'40EBC6 *U5402 H 3 8 12.89 14 2 1 - 6 0 0 0
-'40EBAF *U5402 H 3 8 12.89 14 2 1 - 7 0 0 0
-'40EB98 *U5399 H 1 8 14.37 16 - 1 - 8 0 0 0
-'40EB81 *U5401 H 2 8 12.65 14 - 1 - 9 0 0 0
-'40E8B8 *U5401 H 2 8 12.65 14 - 1 - 10 0 0 0
-'40E8A1 *U5401 I 2 8 1.89 0 - - 2 11 0 0 0
-'40E88A *U5400 H 4 8 10.42 11 1 1 - 12 0 0 0
-'40E873 *U5400 H 4 8 10.42 11 1 1 - 13 0 0 0
-'40E85C *U5400 H 4 8 10.42 11 1 1 - 14 0 0 0
-'40E845 *U5400 H 4 8 10.42 11 1 1 - 15 0 0 0
-'40E82E *U5400 H 4 8 10.42 11 1 1 - 16 0 0 0
-'40E817 *U5400 H 4 8 10.42 11 1 1 - 17 0 0 0
-'40E800 *U5401 H 2 8 12.65 14 - 1 - 18 0 0 0
-'40E7E9 *U5401 I 2 8 1.89 0 - - 2 19 0 0 0
+'40EC39 *U5399 H 1 8 14.24 16 - 1 - 1 0 0 0
+'40EC22 *U5402 H 3 8 12.72 14 2 1 - 2 0 0 0
+'40EC0B *U5402 H 1 8 14.24 16 - 1 - 3 0 0 0
+'40EBF4 *U5402 H 1 8 14.24 16 - 1 - 4 0 0 0
+'40EBDD *U5402 H 3 8 12.72 14 2 1 - 5 0 0 0
+'40EBC6 *U5402 H 3 8 12.72 14 2 1 - 6 0 0 0
+'40EBAF *U5402 H 3 8 12.72 14 2 1 - 7 0 0 0
+'40EB98 *U5399 H 1 8 14.24 16 - 1 - 8 0 0 0
+'40EB81 *U5401 H 2 8 12.6 14 - 1 - 9 0 0 0
+'40E8B8 *U5401 H 2 8 12.6 14 - 1 - 10 0 0 0
+'40E8A1 *U5401 I 2 8 1.84 0 - - 2 11 0 0 0
+'40E88A *U5400 H 4 8 10.4 11 1 1 - 12 0 0 0
+'40E873 *U5400 H 4 8 10.4 11 1 1 - 13 0 0 0
+'40E85C *U5400 H 4 8 10.4 11 1 1 - 14 0 0 0
+'40E845 *U5400 H 4 8 10.4 11 1 1 - 15 0 0 0
+'40E82E *U5400 H 4 8 10.4 11 1 1 - 16 0 0 0
+'40E817 *U5400 H 4 8 10.4 11 1 1 - 17 0 0 0
+'40E800 *U5401 H 2 8 12.6 14 - 1 - 18 0 0 0
+'40E7E9 *U5401 I 2 8 1.84 0 - - 2 19 0 0 0
diff --git a/test/fixtures/expected_single_tilt_bom.csv b/test/fixtures/expected_single_tilt_bom.csv
index 3338b53..a7523b6 100644
--- a/test/fixtures/expected_single_tilt_bom.csv
+++ b/test/fixtures/expected_single_tilt_bom.csv
@@ -27,7 +27,7 @@ Part # Description Total
513832 TRAY, FOLLOWING, HELIX ROOF 210
513833 TRAY, LINK, HELIX ROOF 1271
513836 SPOILER, SINGLE TILT, HELIX ROOF 1632
-513843 PLATE, ANCHOR, HELIX ROOF 414
+513843 PLATE, ANCHOR, HELIX ROOF 416
513844 TRAY, OPTIONAL BALLAST, HELIX ROOF 274
514265 FOOT, RECYCLED RUBBER, HELIX ROOF 230
514435 HARNESS, DC COMBINATION, W/ FUSE, 3 STRING, FEMALES TO MALE, HELIX 4
@@ -43,13 +43,13 @@ Part # Description Total
514865 BOLT, HH, 3/8-16 X 1/2, 18-8 SS 350
515059 ASSY, WHIP TRAY W/FUSE CLIPS, INVERTER, HELIX 16
515928 FRONT SKIRT, HELIX ROOF 197
-515929 REAR SKIRT, HELIX ROOF 1469
516043 AC SWITCH, CONNECTORIZED, HELIX ROOF 2
516045 AC SPLICE BOX, CONNECTORIZED, HELIX ROOF 1
517871 TRAY, LEADING, HELIX ROOF, RIVETED VERSION 210
518058 CONNECTOR, ETHERNET, PLUG, RJ-45, WEATHERPROOF, SHIELDED 15
518331 MOUNTING BACK PLATE, INVERTER/PANEL BOARD, HELIX ROOF/TRACKER 22
518477 WASHER, FLAT, 3/8, 1.00 OD, 18-8 SS 425
+520301 REAR SKIRT, HELIX ROOF V1.1 1469
521031 WASHER, FLAT, M10 X 20MM OD, SS 10
521794 DEFLECTOR, LH, HELIX ROOF V1.1 171
521795 DEFLECTOR, RH, HELIX ROOF V1.1 171
@@ -57,6 +57,6 @@ Part # Description Total
523922 INVERTER, SMA, STP, 24000TL-US-10 (SPR-24000m-3-H), AFCI, CONNECTORIZED, UTX XL REV D DC CONNECTORS 3
523924 INVERTER, SMA, STP, 15000TL-US-10 (SPR-15000m-3-H), AFCI, CONNECTORIZED, UTX XL REV D DC CONNECTORS 6
805615 SCREW, HEXAGONAL HEAD, M10X20, SS A2 10
-Contractor Supplied Ballast Blocks 10150
-TBD Anchors 414
+Contractor Supplied Ballast Blocks 10448
+TBD Anchors 416
TBD Modules 1632
diff --git a/test/fixtures/expected_small_dual_tilt.txt b/test/fixtures/expected_small_dual_tilt.txt
index c805f49..2d21c80 100644
--- a/test/fixtures/expected_small_dual_tilt.txt
+++ b/test/fixtures/expected_small_dual_tilt.txt
@@ -1,3 +1,3 @@
HANDLE BLOCKNAME WIND POS SUBARRAY PSF BAL LTRAY XTRAY ANC ID XCOORD YCOORD ANGLE
-'40EC39 *U5399 A 1 1 2.4 0 2 - 1 1 0 0 0
-'40EC22 *U5402 A 1 1 2.4 0 2 - 1 2 0 0 0
+'40EC39 *U5399 A 1 1 2.39 0 2 - 1 1 0 0 0
+'40EC22 *U5402 A 1 1 2.39 0 2 - 1 2 0 0 0
diff --git a/test/fixtures/irvine_fortune_result.txt b/test/fixtures/irvine_fortune_result.txt
new file mode 100644
index 0000000..d194e73
--- /dev/null
+++ b/test/fixtures/irvine_fortune_result.txt
@@ -0,0 +1,1073 @@
+HANDLE BLOCKNAME WIND POS SUBARRAY PSF BAL LTRAY XTRAY ANC ID XCOORD YCOORD ANGLE
+'4F4F78F1 *U60 K 1 6 2.44 1 - - - 1 28003.953 -9190.671 0.0
+'4F4F7915 *U59 K 3 6 1.95 0 2 - - 2 28003.953 -9250.671 0.0
+'4F4F7939 *U59 K 3 6 1.95 0 2 - - 3 28003.953 -9310.671 0.0
+'4F4F795D *U58 K 2 6 2.26 1 - - - 4 28086.203 -9190.671 0.0
+'4F4F7981 *U57 K 4 6 1.81 0 - - - 5 28086.203 -9250.671 0.0
+'4F4F79A5 *U57 K 4 6 1.81 0 - - - 6 28086.203 -9310.671 0.0
+'4F4F79C9 *U57 K 4 6 1.81 0 - - - 7 28003.953 -9370.671 0.0
+'4F4F79ED *U57 K 4 6 1.81 0 - - - 8 28003.953 -9430.671 0.0
+'4F4F7A11 *U57 K 4 6 1.81 0 - - - 9 28003.953 -9490.671 0.0
+'4F4F7A35 *U57 K 4 6 1.81 0 - - - 10 28086.203 -9370.671 0.0
+'4F4F7A59 *U57 K 4 6 1.81 0 - - - 11 28086.203 -9430.671 0.0
+'4F4F7A7D *U57 K 4 6 1.81 0 - - - 12 28086.203 -9490.671 0.0
+'4F4F7AA1 *U57 K 4 6 1.81 0 - - - 13 28003.953 -9550.671 0.0
+'4F4F7AC5 *U57 K 4 6 1.81 0 - - - 14 28003.953 -9610.671 0.0
+'4F4F7AE9 *U57 F 4 6 2.23 1 - - - 15 28003.953 -9670.671 0.0
+'4F4F7B0D *U57 K 4 6 1.81 0 - - - 16 28086.203 -9550.671 0.0
+'4F4F7B31 *U57 K 4 6 1.81 0 - - - 17 28086.203 -9610.671 0.0
+'4F4F7B55 *U57 K 4 6 1.81 0 - - - 18 28086.203 -9670.671 0.0
+'4F4F7B79 *U57 F 4 6 2.23 1 - - - 19 28003.953 -9730.671 0.0
+'4F4F7B9D *U57 F 4 6 2.23 1 - - - 20 28003.953 -9790.671 0.0
+'4F4F7BC1 *U57 F 4 6 2.23 1 - - - 21 28003.953 -9850.671 0.0
+'4F4F7BE5 *U57 K 4 6 1.81 0 - - - 22 28086.203 -9730.671 0.0
+'4F4F7C09 *U57 G 4 6 1.81 0 - - - 23 28086.203 -9790.671 0.0
+'4F4F7C2D *U57 G 4 6 1.81 0 - - - 24 28086.203 -9850.671 0.0
+'4F4F7C51 *U57 F 4 6 2.23 1 - - - 25 28003.953 -9910.671 0.0
+'4F4F7C75 *U57 G 4 6 1.81 0 - - - 26 28086.203 -9910.671 0.0
+'4F4F7C99 *U58 K 2 6 2.26 1 - - - 27 28168.453 -9190.671 0.0
+'4F4F7CBD *U57 K 4 6 1.81 0 - - - 28 28168.453 -9250.671 0.0
+'4F4F7CE1 *U57 K 4 6 1.81 0 - - - 29 28168.453 -9310.671 0.0
+'4F4F7D05 *U58 K 2 6 2.26 1 - - - 30 28250.703 -9190.671 0.0
+'4F4F7D29 *U57 K 4 6 1.81 0 - - - 31 28250.703 -9250.671 0.0
+'4F4F7D4D *U57 K 4 6 1.81 0 - - - 32 28250.703 -9310.671 0.0
+'4F4F7D71 *U57 K 4 6 1.81 0 - - - 33 28168.453 -9370.671 0.0
+'4F4F7D95 *U57 K 4 6 1.81 0 - - - 34 28168.453 -9430.671 0.0
+'4F4F7DB9 *U57 K 4 6 1.81 0 - - - 35 28168.453 -9490.671 0.0
+'4F4F7DDD *U57 K 4 6 1.81 0 - - - 36 28250.703 -9370.671 0.0
+'4F4F7E01 *U57 K 4 6 1.81 0 - - - 37 28250.703 -9430.671 0.0
+'4F4F7E25 *U57 K 4 6 1.81 0 - - - 38 28250.703 -9490.671 0.0
+'4F4F7E49 *U57 K 4 6 1.81 0 - - - 39 28168.453 -9550.671 0.0
+'4F4F7E6D *U57 K 4 6 1.81 0 - - - 40 28168.453 -9610.671 0.0
+'4F4F7E91 *U57 K 4 6 1.81 0 - - - 41 28168.453 -9670.671 0.0
+'4F4F7EB5 *U57 K 4 6 1.81 0 - - - 42 28250.703 -9550.671 0.0
+'4F4F7ED9 *U57 K 4 6 1.81 0 - - - 43 28250.703 -9610.671 0.0
+'4F4F7EFD *U57 K 4 6 1.81 0 - - - 44 28250.703 -9670.671 0.0
+'4F4F7F21 *U57 K 4 6 1.81 0 - - - 45 28168.453 -9730.671 0.0
+'4F4F7F45 *U57 G 4 6 1.81 0 - - - 46 28168.453 -9790.671 0.0
+'4F4F7F69 *U57 G 4 6 1.81 0 - - - 47 28168.453 -9850.671 0.0
+'4F4F7F8D *U57 K 4 6 1.81 0 - - - 48 28250.703 -9730.671 0.0
+'4F4F7FB1 *U57 G 4 6 1.81 0 - - - 49 28250.703 -9790.671 0.0
+'4F4F7FD5 *U57 G 4 6 1.81 0 - - - 50 28250.703 -9850.671 0.0
+'4F4F7FF9 *U57 G 4 6 1.81 0 - - - 51 28168.453 -9910.671 0.0
+'4F4F801D *U57 G 4 6 1.81 0 - - - 52 28250.703 -9910.671 0.0
+'4F4F8041 *U58 K 2 6 2.26 1 - - - 53 28332.953 -9190.671 0.0
+'4F4F8065 *U57 K 4 6 1.81 0 - - - 54 28332.953 -9250.671 0.0
+'4F4F8089 *U57 K 4 6 1.81 0 - - - 55 28332.953 -9310.671 0.0
+'4F4F80AD *U58 K 2 6 2.26 1 - - - 56 28415.203 -9190.671 0.0
+'4F4F80D1 *U57 K 4 6 1.81 0 - - - 57 28415.203 -9250.671 0.0
+'4F4F80F5 *U57 K 4 6 1.81 0 - - - 58 28415.203 -9310.671 0.0
+'4F4F8119 *U57 K 4 6 1.81 0 - - - 59 28332.953 -9370.671 0.0
+'4F4F813D *U57 K 4 6 1.81 0 - - - 60 28332.953 -9430.671 0.0
+'4F4F8161 *U57 K 4 6 1.81 0 - - - 61 28332.953 -9490.671 0.0
+'4F4F8185 *U57 K 4 6 1.81 0 - - - 62 28415.203 -9370.671 0.0
+'4F4F81A9 *U57 K 4 6 1.81 0 - - - 63 28415.203 -9430.671 0.0
+'4F4F81CD *U57 K 4 6 1.81 0 - - - 64 28415.203 -9490.671 0.0
+'4F4F81F1 *U57 K 4 6 1.81 0 - - - 65 28332.953 -9550.671 0.0
+'4F4F8215 *U57 K 4 6 1.81 0 - - - 66 28332.953 -9610.671 0.0
+'4F4F8239 *U57 K 4 6 1.81 0 - - - 67 28332.953 -9670.671 0.0
+'4F4F825D *U57 K 4 6 1.81 0 - - - 68 28415.203 -9550.671 0.0
+'4F4F8281 *U57 K 4 6 1.81 0 - - - 69 28415.203 -9610.671 0.0
+'4F4F82A5 *U57 K 4 6 1.81 0 - - - 70 28415.203 -9670.671 0.0
+'4F4F82C9 *U57 K 4 6 1.81 0 - - - 71 28332.953 -9730.671 0.0
+'4F4F82ED *U57 G 4 6 1.81 0 - - - 72 28332.953 -9790.671 0.0
+'4F4F8311 *U57 G 4 6 1.81 0 - - - 73 28332.953 -9850.671 0.0
+'4F4F8335 *U57 K 4 6 1.81 0 - - - 74 28415.203 -9730.671 0.0
+'4F4F8359 *U57 G 4 6 1.81 0 - - - 75 28415.203 -9790.671 0.0
+'4F4F837D *U57 G 4 6 1.81 0 - - - 76 28415.203 -9850.671 0.0
+'4F4F83A1 *U57 G 4 6 1.81 0 - - - 77 28332.953 -9910.671 0.0
+'4F4F83C5 *U57 G 4 6 1.81 0 - - - 78 28415.203 -9910.671 0.0
+'4F4F83E9 *U60 K 1 6 2.44 1 - - - 79 28497.453 -9190.671 0.0
+'4F4F840D *U59 K 3 6 1.95 0 2 - - 80 28497.453 -9250.671 0.0
+'4F4F8431 *U59 K 3 6 1.95 0 2 - - 81 28497.453 -9310.671 0.0
+'4F4F8455 *U59 K 3 6 1.95 0 2 - - 82 28497.453 -9370.671 0.0
+'4F4F8479 *U59 K 3 6 1.95 0 2 - - 83 28497.453 -9430.671 0.0
+'4F4F849D *U59 K 3 6 1.95 0 2 - - 84 28497.453 -9490.671 0.0
+'4F4F84C1 *U59 K 3 6 1.95 0 2 - - 85 28497.453 -9550.671 0.0
+'4F4F84E5 *U59 K 3 6 1.95 0 2 - - 86 28497.453 -9610.671 0.0
+'4F4F8509 *U59 K 3 6 1.95 0 2 - - 87 28497.453 -9670.671 0.0
+'4F4F852D *U59 K 3 6 1.95 0 2 - - 88 28497.453 -9730.671 0.0
+'4F4F8551 *U59 G 3 6 1.95 0 2 - - 89 28497.453 -9790.671 0.0
+'4F4F8575 *U59 G 3 6 1.95 0 2 - - 90 28497.453 -9850.671 0.0
+'4F4F8599 *U59 G 3 6 1.95 0 2 - - 91 28497.453 -9910.671 0.0
+'4F4F85BD *U57 F 4 6 2.23 1 - - - 92 28003.953 -9970.671 0.0
+'4F4F85E1 *U57 F 4 6 2.23 1 - - - 93 28003.953 -10030.671 0.0
+'4F4F8605 *U57 F 4 6 2.23 1 - - - 94 28003.953 -10090.671 0.0
+'4F4F8629 *U57 G 4 6 1.81 0 - - - 95 28086.203 -9970.671 0.0
+'4F4F864D *U57 G 4 6 1.81 0 - - - 96 28086.203 -10030.671 0.0
+'4F4F8671 *U57 G 4 6 1.81 0 - - - 97 28086.203 -10090.671 0.0
+'4F4F8695 *U57 F 4 6 2.23 1 - - - 98 28003.953 -10150.671 0.0
+'4F4F86B9 *U57 F 4 6 2.23 1 - - - 99 28003.953 -10210.671 0.0
+'4F4F86DD *U57 F 4 6 2.23 1 - - - 100 28003.953 -10270.671 0.0
+'4F4F8701 *U57 G 4 6 1.81 0 - - - 101 28086.203 -10150.671 0.0
+'4F4F8725 *U57 G 4 6 1.81 0 - - - 102 28086.203 -10210.671 0.0
+'4F4F8749 *U57 G 4 6 1.81 0 - - - 103 28086.203 -10270.671 0.0
+'4F4F876D *U57 F 4 6 2.23 1 - - - 104 28003.953 -10330.671 0.0
+'4F4F8791 *U57 G 4 6 1.81 0 - - - 105 28086.203 -10330.671 0.0
+'4F4F87B5 *U57 G 4 6 1.81 0 - - - 106 28168.453 -9970.671 0.0
+'4F4F87D9 *U57 G 4 6 1.81 0 - - - 107 28168.453 -10030.671 0.0
+'4F4F87FD *U57 G 4 6 1.81 0 - - - 108 28168.453 -10090.671 0.0
+'4F4F8821 *U57 G 4 6 1.81 0 - - - 109 28250.703 -9970.671 0.0
+'4F4F8845 *U57 G 4 6 1.81 0 - - - 110 28250.703 -10030.671 0.0
+'4F4F8869 *U57 G 4 6 1.81 0 - - - 111 28250.703 -10090.671 0.0
+'4F4F888D *U57 G 4 6 1.81 0 - - - 112 28168.453 -10150.671 0.0
+'4F4F88B1 *U57 G 4 6 1.81 0 - - - 113 28168.453 -10210.671 0.0
+'4F4F88D5 *U57 G 4 6 1.81 0 - - - 114 28168.453 -10270.671 0.0
+'4F4F88F9 *U57 G 4 6 1.81 0 - - - 115 28250.703 -10150.671 0.0
+'4F4F891D *U57 G 4 6 1.81 0 - - - 116 28250.703 -10210.671 0.0
+'4F4F8941 *U57 G 4 6 1.81 0 - - - 117 28250.703 -10270.671 0.0
+'4F4F8965 *U57 G 4 6 1.81 0 - - - 118 28168.453 -10330.671 0.0
+'4F4F8989 *U57 G 4 6 1.81 0 - - - 119 28250.703 -10330.671 0.0
+'4F4F89AD *U57 G 4 6 1.81 0 - - - 120 28332.953 -9970.671 0.0
+'4F4F89D1 *U57 G 4 6 1.81 0 - - - 121 28332.953 -10030.671 0.0
+'4F4F89F5 *U57 G 4 6 1.81 0 - - - 122 28332.953 -10090.671 0.0
+'4F4F8A19 *U57 G 4 6 1.81 0 - - - 123 28415.203 -9970.671 0.0
+'4F4F8A3D *U57 G 4 6 1.81 0 - - - 124 28415.203 -10030.671 0.0
+'4F4F8A61 *U57 G 4 6 1.81 0 - - - 125 28415.203 -10090.671 0.0
+'4F4F8A85 *U57 G 4 6 1.81 0 - - - 126 28332.953 -10150.671 0.0
+'4F4F8AA9 *U57 G 4 6 1.81 0 - - - 127 28332.953 -10210.671 0.0
+'4F4F8ACD *U57 G 4 6 1.81 0 - - - 128 28332.953 -10270.671 0.0
+'4F4F8AF1 *U57 G 4 6 1.81 0 - - - 129 28415.203 -10150.671 0.0
+'4F4F8B15 *U57 G 4 6 1.81 0 - - - 130 28415.203 -10210.671 0.0
+'4F4F8B39 *U57 G 4 6 1.81 0 - - - 131 28415.203 -10270.671 0.0
+'4F4F8B5D *U57 G 4 6 1.81 0 - - - 132 28332.953 -10330.671 0.0
+'4F4F8B81 *U57 G 4 6 1.81 0 - - - 133 28415.203 -10330.671 0.0
+'4F4F8BA5 *U59 G 3 6 1.95 0 2 - - 134 28497.453 -9970.671 0.0
+'4F4F8BC9 *U59 G 3 6 1.95 0 2 - - 135 28497.453 -10030.671 0.0
+'4F4F8BED *U59 G 3 6 1.95 0 2 - - 136 28497.453 -10090.671 0.0
+'4F4F8C11 *U59 G 3 6 1.95 0 2 - - 137 28497.453 -10150.671 0.0
+'4F4F8C35 *U59 G 3 6 1.95 0 2 - - 138 28497.453 -10210.671 0.0
+'4F4F8C59 *U59 G 3 6 1.95 0 2 - - 139 28497.453 -10270.671 0.0
+'4F4F8C7D *U59 G 3 6 1.95 0 2 - - 140 28497.453 -10330.671 0.0
+'4F4F8CA1 *U57 F 4 6 2.23 1 - - - 141 28003.953 -10390.671 0.0
+'4F4F8CC5 *U57 G 4 6 1.81 0 - - - 142 28086.203 -10390.671 0.0
+'4F4F8CE9 *U58 F 2 6 2.68 2 - - - 143 28003.953 -10450.671 0.0
+'4F4F8D0D *U58 G 2 6 2.26 1 - - - 144 28086.203 -10450.671 0.0
+'4F4F8D31 *U57 G 4 6 1.81 0 - - - 145 28168.453 -10390.671 0.0
+'4F4F8D55 *U57 G 4 6 1.81 0 - - - 146 28250.703 -10390.671 0.0
+'4F4F8D79 *U58 G 2 6 2.26 1 - - - 147 28168.453 -10450.671 0.0
+'4F4F8D9D *U58 G 2 6 2.26 1 - - - 148 28250.703 -10450.671 0.0
+'4F4F8DC1 *U57 G 4 6 1.81 0 - - - 149 28332.953 -10390.671 0.0
+'4F4F8DE5 *U57 G 4 6 1.81 0 - - - 150 28415.203 -10390.671 0.0
+'4F4F8E09 *U58 G 2 6 2.26 1 - - - 151 28332.953 -10450.671 0.0
+'4F4F8E2D *U58 G 2 6 2.26 1 - - - 152 28415.203 -10450.671 0.0
+'4F4F8E51 *U59 G 3 6 1.95 0 2 - - 153 28497.453 -10390.671 0.0
+'4F4F8E75 *U60 G 1 6 2.44 1 - - - 154 28497.453 -10450.671 0.0
+'4F4F8F09 *U60 K 1 6 2.44 1 - - - 155 27839.453 -9370.671 0.0
+'4F4F8F2D *U59 K 3 6 1.95 0 2 - - 156 27839.453 -9430.671 0.0
+'4F4F8F51 *U59 K 3 6 1.95 0 2 - - 157 27839.453 -9490.671 0.0
+'4F4F8FE1 *U58 K 2 6 2.26 1 - - - 158 27921.703 -9370.671 0.0
+'4F4F9005 *U57 K 4 6 1.81 0 - - - 159 27921.703 -9430.671 0.0
+'4F4F9029 *U57 K 4 6 1.81 0 - - - 160 27921.703 -9490.671 0.0
+'4F4F904D *U59 K 3 6 1.95 0 2 - - 161 27839.453 -9550.671 0.0
+'4F4F9071 *U59 K 3 6 1.95 0 2 - - 162 27839.453 -9610.671 0.0
+'4F4F9095 *U59 F 3 6 2.37 1 2 - - 163 27839.453 -9670.671 0.0
+'4F4F90B9 *U57 K 4 6 1.81 0 - - - 164 27921.703 -9550.671 0.0
+'4F4F90DD *U57 K 4 6 1.81 0 - - - 165 27921.703 -9610.671 0.0
+'4F4F9101 *U57 F 4 6 2.23 1 - - - 166 27921.703 -9670.671 0.0
+'4F4F9125 *U59 F 3 6 2.37 1 2 - - 167 27839.453 -9730.671 0.0
+'4F4F9149 *U59 F 3 6 2.37 1 2 - - 168 27839.453 -9790.671 0.0
+'4F4F916D *U59 F 3 6 2.37 1 2 - - 169 27839.453 -9850.671 0.0
+'4F4F9191 *U57 F 4 6 2.23 1 - - - 170 27921.703 -9730.671 0.0
+'4F4F91B5 *U57 F 4 6 2.23 1 - - - 171 27921.703 -9790.671 0.0
+'4F4F91D9 *U57 F 4 6 2.23 1 - - - 172 27921.703 -9850.671 0.0
+'4F4F91FD *U59 F 3 6 2.37 1 2 - - 173 27839.453 -9910.671 0.0
+'4F4F9221 *U57 F 4 6 2.23 1 - - - 174 27921.703 -9910.671 0.0
+'4F4F9245 *U59 F 3 6 2.37 1 2 - - 175 27839.453 -9970.671 0.0
+'4F4F9269 *U59 F 3 6 2.37 1 2 - - 176 27839.453 -10030.671 0.0
+'4F4F928D *U59 F 3 6 2.37 1 2 - - 177 27839.453 -10090.671 0.0
+'4F4F92B1 *U57 F 4 6 2.23 1 - - - 178 27921.703 -9970.671 0.0
+'4F4F92D5 *U57 F 4 6 2.23 1 - - - 179 27921.703 -10030.671 0.0
+'4F4F92F9 *U57 F 4 6 2.23 1 - - - 180 27921.703 -10090.671 0.0
+'4F4F931D *U59 F 3 6 2.37 1 2 - - 181 27839.453 -10150.671 0.0
+'4F4F9341 *U59 F 3 6 2.37 1 2 - - 182 27839.453 -10210.671 0.0
+'4F4F9365 *U59 F 3 6 2.37 1 2 - - 183 27839.453 -10270.671 0.0
+'4F4F9389 *U57 F 4 6 2.23 1 - - - 184 27921.703 -10150.671 0.0
+'4F4F93AD *U57 F 4 6 2.23 1 - - - 185 27921.703 -10210.671 0.0
+'4F4F93D1 *U57 F 4 6 2.23 1 - - - 186 27921.703 -10270.671 0.0
+'4F4F93F5 *U59 F 3 6 2.37 1 2 - - 187 27839.453 -10330.671 0.0
+'4F4F9419 *U57 F 4 6 2.23 1 - - - 188 27921.703 -10330.671 0.0
+'4F4F943D *U59 F 3 6 2.37 1 2 - - 189 27839.453 -10390.671 0.0
+'4F4F9461 *U57 F 4 6 2.23 1 - - - 190 27921.703 -10390.671 0.0
+'4F4F9485 *U60 F 1 6 3.28 3 - - - 191 27839.453 -10450.671 0.0
+'4F4F94A9 *U58 F 2 6 2.68 2 - - - 192 27921.703 -10450.671 0.0
+'4F4F97E5 *U57 K 4 5 1.81 0 - - - 193 27567.136 -9432.275 0.0
+'4F4F9809 *U57 K 4 5 1.81 0 - - - 194 27649.386 -9432.275 0.0
+'4F4F982D *U57 K 4 5 1.81 0 - - - 195 27567.136 -9492.275 0.0
+'4F4F9851 *U57 K 4 5 1.81 0 - - - 196 27567.136 -9552.275 0.0
+'4F4F9875 *U57 K 4 5 1.81 0 - - - 197 27567.136 -9612.275 0.0
+'4F4F9899 *U57 K 4 5 1.81 0 - - - 198 27649.386 -9492.275 0.0
+'4F4F98BD *U57 K 4 5 1.81 0 - - - 199 27649.386 -9552.275 0.0
+'4F4F98E1 *U57 K 4 5 1.81 0 - - - 200 27649.386 -9612.275 0.0
+'4F4F9905 *U57 F 4 5 2.23 1 - - - 201 27567.136 -9672.275 0.0
+'4F4F9929 *U57 F 4 5 2.23 1 - - - 202 27649.386 -9672.275 0.0
+'4F4F994D *U59 K 3 5 1.95 0 2 - - 203 27731.636 -7977.66 0.0
+'4F4F9971 *U59 K 3 5 1.95 0 2 - - 204 27731.636 -8037.66 0.0
+'4F4F9995 *U59 K 3 5 1.95 0 2 - - 205 27731.636 -8097.66 0.0
+'4F4F99B9 *U59 K 3 5 1.95 0 2 - - 206 27731.636 -8157.66 0.0
+'4F4F99DD *U59 F 3 5 2.37 1 2 - - 207 27731.636 -8217.66 0.0
+'4F4F9A01 *U57 F 4 5 2.23 1 - - - 208 27567.136 -9732.275 0.0
+'4F4F9A25 *U57 F 4 5 2.23 1 - - - 209 27567.136 -9792.275 0.0
+'4F4F9A49 *U57 F 4 5 2.23 1 - - - 210 27567.136 -9852.275 0.0
+'4F4F9A6D *U57 F 4 5 2.23 1 - - - 211 27649.386 -9732.275 0.0
+'4F4F9A91 *U57 F 4 5 2.23 1 - - - 212 27649.386 -9792.275 0.0
+'4F4F9AB5 *U57 F 4 5 2.23 1 - - - 213 27649.386 -9852.275 0.0
+'4F4F9AD9 *U57 F 4 5 2.23 1 - - - 214 27567.135 -9912.275 0.0
+'4F4F9AFD *U57 F 4 5 2.23 1 - - - 215 27567.135 -9972.275 0.0
+'4F4F9B21 *U57 F 4 5 2.23 1 - - - 216 27567.135 -10032.275 0.0
+'4F4F9B45 *U57 F 4 5 2.23 1 - - - 217 27649.385 -9912.275 0.0
+'4F4F9B69 *U57 F 4 5 2.23 1 - - - 218 27649.385 -9972.275 0.0
+'4F4F9B8D *U57 F 4 5 2.23 1 - - - 219 27649.385 -10032.275 0.0
+'4F4F9BB1 *U57 F 4 5 2.23 1 - - - 220 27567.135 -10092.275 0.0
+'4F4F9BD5 *U57 F 4 5 2.23 1 - - - 221 27649.385 -10092.275 0.0
+'4F4F9BF9 *U59 F 3 5 2.37 1 2 - - 222 27731.636 -8277.66 0.0
+'4F4F9C1D *U59 F 3 5 2.37 1 2 - - 223 27731.636 -8337.66 0.0
+'4F4F9C41 *U59 F 3 5 2.37 1 2 - - 224 27731.636 -8397.66 0.0
+'4F4F9C65 *U59 F 3 5 2.37 1 2 - - 225 27731.635 -8457.66 0.0
+'4F4F9C89 *U59 F 3 5 2.37 1 2 - - 226 27731.635 -8517.66 0.0
+'4F4F9CAD *U59 F 3 5 2.37 1 2 - - 227 27731.635 -8577.66 0.0
+'4F4F9CD1 *U59 F 3 5 2.37 1 2 - - 228 27731.635 -8637.66 0.0
+'4F4F9CF5 *U57 K 4 5 1.81 0 - - - 229 27402.636 -9432.275 0.0
+'4F4F9D19 *U57 K 4 5 1.81 0 - - - 230 27484.886 -9432.275 0.0
+'4F4F9D3D *U57 K 4 5 1.81 0 - - - 231 27402.636 -9492.275 0.0
+'4F4F9D61 *U57 K 4 5 1.81 0 - - - 232 27402.636 -9552.275 0.0
+'4F4F9D85 *U57 K 4 5 1.81 0 - - - 233 27402.636 -9612.275 0.0
+'4F4F9DA9 *U57 K 4 5 1.81 0 - - - 234 27484.886 -9492.275 0.0
+'4F4F9DCD *U57 K 4 5 1.81 0 - - - 235 27484.886 -9552.275 0.0
+'4F4F9DF1 *U57 K 4 5 1.81 0 - - - 236 27484.886 -9612.275 0.0
+'4F4F9E15 *U57 F 4 5 2.23 1 - - - 237 27402.636 -9672.275 0.0
+'4F4F9E39 *U57 F 4 5 2.23 1 - - - 238 27484.886 -9672.275 0.0
+'4F4F9E5D *U57 F 4 5 2.23 1 - - - 239 27402.636 -9732.275 0.0
+'4F4F9E81 *U57 F 4 5 2.23 1 - - - 240 27402.636 -9792.275 0.0
+'4F4F9EA5 *U57 F 4 5 2.23 1 - - - 241 27402.636 -9852.275 0.0
+'4F4F9EC9 *U57 F 4 5 2.23 1 - - - 242 27484.886 -9732.275 0.0
+'4F4F9EED *U57 F 4 5 2.23 1 - - - 243 27484.886 -9792.275 0.0
+'4F4F9F11 *U57 F 4 5 2.23 1 - - - 244 27484.886 -9852.275 0.0
+'4F4F9F35 *U57 F 4 5 2.23 1 - - - 245 27402.635 -9912.275 0.0
+'4F4F9F59 *U57 F 4 5 2.23 1 - - - 246 27402.635 -9972.275 0.0
+'4F4F9F7D *U57 F 4 5 2.23 1 - - - 247 27402.635 -10032.275 0.0
+'4F4F9FA1 *U57 F 4 5 2.23 1 - - - 248 27484.885 -9912.275 0.0
+'4F4F9FC5 *U57 F 4 5 2.23 1 - - - 249 27484.885 -9972.275 0.0
+'4F4F9FE9 *U57 F 4 5 2.23 1 - - - 250 27484.885 -10032.275 0.0
+'4F4FA00D *U58 F 2 5 2.68 2 - - - 251 27402.635 -10092.275 0.0
+'4F4FA031 *U58 F 2 5 2.68 2 - - - 252 27484.885 -10092.275 0.0
+'4F4FA09D *U58 K 2 5 2.26 1 - - - 253 27567.136 -9372.275 0.0
+'4F4FA0C1 *U58 K 2 5 2.26 1 - - - 254 27649.386 -9372.275 0.0
+'4F4FA109 *U60 K 1 5 2.44 1 - - - 255 27731.636 -7917.66 0.0
+'4F4FA175 *U58 K 2 5 2.26 1 - - - 256 27402.636 -9372.275 0.0
+'4F4FA199 *U58 K 2 5 2.26 1 - - - 257 27484.886 -9372.275 0.0
+'4F4FA1BD *U60 F 1 5 3.28 3 - - - 258 27567.135 -10152.275 0.0
+'4F4FA1E1 *U58 F 2 5 2.68 2 - - - 259 27649.385 -10152.275 0.0
+'4F4FA205 *U60 F 1 5 3.28 3 - - - 260 27731.635 -8697.66 0.0
+'4F4FA229 *U59 K 3 5 1.95 0 2 - - 261 27238.136 -9432.275 0.0
+'4F4FA24D *U57 K 4 5 1.81 0 - - - 262 27320.386 -9432.275 0.0
+'4F4FA271 *U59 K 3 5 1.95 0 2 - - 263 27238.136 -9492.275 0.0
+'4F4FA295 *U59 K 3 5 1.95 0 2 - - 264 27238.136 -9552.275 0.0
+'4F4FA2B9 *U59 K 3 5 1.95 0 2 - - 265 27238.136 -9612.275 0.0
+'4F4FA2DD *U57 K 4 5 1.81 0 - - - 266 27320.386 -9492.275 0.0
+'4F4FA301 *U57 K 4 5 1.81 0 - - - 267 27320.386 -9552.275 0.0
+'4F4FA325 *U57 K 4 5 1.81 0 - - - 268 27320.386 -9612.275 0.0
+'4F4FA349 *U59 K 3 5 1.95 0 2 - - 269 27238.136 -9672.275 0.0
+'4F4FA36D *U57 K 4 5 1.81 0 - - - 270 27320.386 -9672.275 0.0
+'4F4FA391 *U59 K 3 5 1.95 0 2 - - 271 27238.136 -9732.275 0.0
+'4F4FA3B5 *U59 G 3 5 1.95 0 2 - - 272 27238.136 -9792.275 0.0
+'4F4FA3D9 *U59 F 3 5 2.37 1 2 - - 273 27238.136 -9852.275 0.0
+'4F4FA3FD *U57 F 4 5 2.23 1 - - - 274 27320.386 -9732.275 0.0
+'4F4FA421 *U57 F 4 5 2.23 1 - - - 275 27320.386 -9792.275 0.0
+'4F4FA445 *U57 F 4 5 2.23 1 - - - 276 27320.386 -9852.275 0.0
+'4F4FA469 *U59 F 3 5 2.37 1 2 - - 277 27238.135 -9912.275 0.0
+'4F4FA48D *U59 F 3 5 2.37 1 2 - - 278 27238.135 -9972.275 0.0
+'4F4FA4B1 *U59 F 3 5 2.37 1 2 - - 279 27238.135 -10032.275 0.0
+'4F4FA4D5 *U57 F 4 5 2.23 1 - - - 280 27320.385 -9912.275 0.0
+'4F4FA4F9 *U57 F 4 5 2.23 1 - - - 281 27320.385 -9972.275 0.0
+'4F4FA51D *U57 F 4 5 2.23 1 - - - 282 27320.385 -10032.275 0.0
+'4F4FA541 *U60 F 1 5 3.28 3 - - - 283 27238.135 -10092.275 0.0
+'4F4FA565 *U58 F 2 5 2.68 2 - - - 284 27320.385 -10092.275 0.0
+'4F4FA589 *U59 K 3 5 1.95 0 2 - - 285 27238.136 -9252.275 0.0
+'4F4FA5AD *U59 K 3 5 1.95 0 2 - - 286 27320.386 -9252.275 0.0
+'4F4FA619 *U60 D 1 5 4.97 7 - - - 287 27238.136 -9192.275 0.0
+'4F4FA63D *U60 K 1 5 2.44 1 - - - 288 27320.386 -9192.275 0.0
+'4F4FA711 *U58 K 2 10 2.26 1 - - - 289 28003.18 -8734.478 0.0
+'4F4FA77D *U58 K 2 10 2.26 1 - - - 290 28085.43 -8734.478 0.0
+'4F4FA7A1 *U57 K 4 10 1.81 0 - - - 291 28003.181 -8794.478 0.0
+'4F4FA7C5 *U57 K 4 10 1.81 0 - - - 292 28003.181 -8854.478 0.0
+'4F4FA7E9 *U57 K 4 10 1.81 0 - - - 293 28003.181 -8914.478 0.0
+'4F4FA80D *U57 K 4 10 1.81 0 - - - 294 28085.431 -8794.478 0.0
+'4F4FA831 *U57 K 4 10 1.81 0 - - - 295 28085.431 -8854.478 0.0
+'4F4FA855 *U57 K 4 10 1.81 0 - - - 296 28085.431 -8914.478 0.0
+'4F4FA879 *U57 K 4 10 1.81 0 - - - 297 28003.181 -8974.478 0.0
+'4F4FA89D *U58 K 2 10 2.26 1 - - - 298 28003.181 -9034.478 0.0
+'4F4FA8C1 *U57 K 4 10 1.81 0 - - - 299 28085.431 -8974.478 0.0
+'4F4FA8E5 *U58 K 2 10 2.26 1 - - - 300 28085.431 -9034.478 0.0
+'4F4FA909 *U59 K 3 10 1.95 0 2 - - 301 28167.68 -8614.478 0.0
+'4F4FA92D *U59 K 3 10 1.95 0 2 - - 302 28167.68 -8674.478 0.0
+'4F4FA951 *U57 K 4 10 1.81 0 - - - 303 28167.68 -8734.478 0.0
+'4F4FA975 *U57 K 4 10 1.81 0 - - - 304 28249.93 -8614.478 0.0
+'4F4FA999 *U57 K 4 10 1.81 0 - - - 305 28249.93 -8674.478 0.0
+'4F4FA9BD *U57 K 4 10 1.81 0 - - - 306 28249.93 -8734.478 0.0
+'4F4FA9E1 *U57 K 4 10 1.81 0 - - - 307 28167.681 -8794.478 0.0
+'4F4FAA05 *U57 K 4 10 1.81 0 - - - 308 28167.681 -8854.478 0.0
+'4F4FAA29 *U57 K 4 10 1.81 0 - - - 309 28167.681 -8914.478 0.0
+'4F4FAA4D *U57 K 4 10 1.81 0 - - - 310 28249.931 -8794.478 0.0
+'4F4FAA71 *U57 K 4 10 1.81 0 - - - 311 28249.931 -8854.478 0.0
+'4F4FAA95 *U57 K 4 10 1.81 0 - - - 312 28249.931 -8914.478 0.0
+'4F4FAAB9 *U57 K 4 10 1.81 0 - - - 313 28167.681 -8974.478 0.0
+'4F4FAADD *U58 K 2 10 2.26 1 - - - 314 28167.681 -9034.478 0.0
+'4F4FAB01 *U57 K 4 10 1.81 0 - - - 315 28249.931 -8974.478 0.0
+'4F4FAB25 *U58 K 2 10 2.26 1 - - - 316 28249.931 -9034.478 0.0
+'4F4FAB49 *U57 K 4 10 1.81 0 - - - 317 28332.18 -8614.478 0.0
+'4F4FAB6D *U57 K 4 10 1.81 0 - - - 318 28332.18 -8674.478 0.0
+'4F4FAB91 *U57 K 4 10 1.81 0 - - - 319 28332.18 -8734.478 0.0
+'4F4FABB5 *U57 K 4 10 1.81 0 - - - 320 28414.43 -8614.478 0.0
+'4F4FABD9 *U57 K 4 10 1.81 0 - - - 321 28414.43 -8674.478 0.0
+'4F4FABFD *U57 K 4 10 1.81 0 - - - 322 28414.43 -8734.478 0.0
+'4F4FAC21 *U57 K 4 10 1.81 0 - - - 323 28332.181 -8794.478 0.0
+'4F4FAC45 *U57 K 4 10 1.81 0 - - - 324 28332.181 -8854.478 0.0
+'4F4FAC69 *U57 K 4 10 1.81 0 - - - 325 28332.181 -8914.478 0.0
+'4F4FAC8D *U57 K 4 10 1.81 0 - - - 326 28414.431 -8794.478 0.0
+'4F4FACB1 *U57 K 4 10 1.81 0 - - - 327 28414.431 -8854.478 0.0
+'4F4FACD5 *U57 K 4 10 1.81 0 - - - 328 28414.431 -8914.478 0.0
+'4F4FACF9 *U57 K 4 10 1.81 0 - - - 329 28332.181 -8974.478 0.0
+'4F4FAD1D *U58 K 2 10 2.26 1 - - - 330 28332.181 -9034.478 0.0
+'4F4FAD41 *U57 K 4 10 1.81 0 - - - 331 28414.431 -8974.478 0.0
+'4F4FAD65 *U58 K 2 10 2.26 1 - - - 332 28414.431 -9034.478 0.0
+'4F4FAD89 *U59 K 3 10 1.95 0 2 - - 333 28496.68 -8614.478 0.0
+'4F4FADAD *U59 K 3 10 1.95 0 2 - - 334 28496.68 -8674.478 0.0
+'4F4FADD1 *U59 K 3 10 1.95 0 2 - - 335 28496.68 -8734.478 0.0
+'4F4FADF5 *U59 K 3 10 1.95 0 2 - - 336 28496.681 -8794.478 0.0
+'4F4FAE19 *U59 K 3 10 1.95 0 2 - - 337 28496.681 -8854.478 0.0
+'4F4FAE3D *U59 K 3 10 1.95 0 2 - - 338 28496.681 -8914.478 0.0
+'4F4FAE61 *U59 K 3 10 1.95 0 2 - - 339 28496.681 -8974.478 0.0
+'4F4FAE85 *U60 K 1 10 2.44 1 - - - 340 28496.681 -9034.478 0.0
+'4F4FAEA9 *U60 K 1 10 2.44 1 - - - 341 27838.68 -8734.478 0.0
+'4F4FAECD *U58 K 2 10 2.26 1 - - - 342 27920.93 -8734.478 0.0
+'4F4FAEF1 *U59 K 3 10 1.95 0 2 - - 343 27838.681 -8794.478 0.0
+'4F4FAF15 *U59 K 3 10 1.95 0 2 - - 344 27838.681 -8854.478 0.0
+'4F4FAF39 *U59 K 3 10 1.95 0 2 - - 345 27838.681 -8914.478 0.0
+'4F4FAF5D *U57 K 4 10 1.81 0 - - - 346 27920.931 -8794.478 0.0
+'4F4FAF81 *U57 K 4 10 1.81 0 - - - 347 27920.931 -8854.478 0.0
+'4F4FAFA5 *U57 K 4 10 1.81 0 - - - 348 27920.931 -8914.478 0.0
+'4F4FAFC9 *U59 K 3 10 1.95 0 2 - - 349 27838.681 -8974.478 0.0
+'4F4FAFED *U60 K 1 10 2.44 1 - - - 350 27838.681 -9034.478 0.0
+'4F4FB011 *U57 K 4 10 1.81 0 - - - 351 27920.931 -8974.478 0.0
+'4F4FB035 *U58 K 2 10 2.26 1 - - - 352 27920.931 -9034.478 0.0
+'4F4FB059 *U59 K 3 10 1.95 0 2 - - 353 28167.68 -8494.478 0.0
+'4F4FB07D *U59 K 3 10 1.95 0 2 - - 354 28167.68 -8554.478 0.0
+'4F4FB0A1 *U57 K 4 10 1.81 0 - - - 355 28249.93 -8494.478 0.0
+'4F4FB0C5 *U57 K 4 10 1.81 0 - - - 356 28249.93 -8554.478 0.0
+'4F4FB0E9 *U57 K 4 10 1.81 0 - - - 357 28332.18 -8494.478 0.0
+'4F4FB10D *U57 K 4 10 1.81 0 - - - 358 28332.18 -8554.478 0.0
+'4F4FB131 *U57 K 4 10 1.81 0 - - - 359 28414.43 -8494.478 0.0
+'4F4FB155 *U57 K 4 10 1.81 0 - - - 360 28414.43 -8554.478 0.0
+'4F4FB179 *U59 K 3 10 1.95 0 2 - - 361 28496.68 -8494.478 0.0
+'4F4FB19D *U59 K 3 10 1.95 0 2 - - 362 28496.68 -8554.478 0.0
+'4F4FB1C1 *U59 K 3 10 1.95 0 2 - - 363 28167.68 -8434.478 0.0
+'4F4FB1E5 *U57 K 4 10 1.81 0 - - - 364 28249.93 -8434.478 0.0
+'4F4FB209 *U58 K 2 10 2.26 1 - - - 365 28332.18 -8434.478 0.0
+'4F4FB22D *U58 K 2 10 2.26 1 - - - 366 28414.43 -8434.478 0.0
+'4F4FB251 *U60 K 1 10 2.44 1 - - - 367 28496.68 -8434.478 0.0
+'4F4FB275 *U57 K 4 10 1.81 0 - - - 368 28167.68 -8314.478 0.0
+'4F4FB299 *U57 K 4 10 1.81 0 - - - 369 28167.68 -8374.478 0.0
+'4F4FB2BD *U59 K 3 10 1.95 0 2 - - 370 28249.93 -8314.478 0.0
+'4F4FB2E1 *U59 K 3 10 1.95 0 2 - - 371 28249.93 -8374.478 0.0
+'4F4FB305 *U57 K 4 10 1.81 0 - - - 372 28167.68 -8254.478 0.0
+'4F4FB329 *U59 K 3 10 1.95 0 2 - - 373 28249.93 -8254.478 0.0
+'4F4FB34D *U57 K 4 10 1.81 0 - - - 374 28167.68 -8134.478 0.0
+'4F4FB371 *U57 K 4 10 1.81 0 - - - 375 28167.68 -8194.478 0.0
+'4F4FB395 *U57 K 4 10 1.81 0 - - - 376 28249.93 -8134.478 0.0
+'4F4FB3B9 *U59 K 3 10 1.95 0 2 - - 377 28249.93 -8194.478 0.0
+'4F4FB3DD *U60 K 1 10 2.44 1 - - - 378 28167.68 -8074.478 0.0
+'4F4FB401 *U57 K 4 10 1.81 0 - - - 379 28249.93 -8074.478 0.0
+'4F4FB425 *U58 K 2 10 2.26 1 - - - 380 28332.18 -8134.478 0.0
+'4F4FB449 *U57 K 4 10 1.81 0 - - - 381 28332.18 -8074.478 0.0
+'4F4FB46D *U58 K 2 10 2.26 1 - - - 382 28414.43 -8134.478 0.0
+'4F4FB491 *U57 K 4 10 1.81 0 - - - 383 28414.43 -8074.478 0.0
+'4F4FB4B5 *U60 K 1 10 2.44 1 - - - 384 28496.68 -8134.478 0.0
+'4F4FB4D9 *U59 K 3 10 1.95 0 2 - - 385 28496.68 -8074.478 0.0
+'4F4FB4FD *U59 K 3 10 1.95 0 2 - - 386 28085.43 -8314.478 0.0
+'4F4FB521 *U60 K 1 10 2.44 1 - - - 387 28085.43 -8374.478 0.0
+'4F4FB545 *U59 K 3 10 1.95 0 2 - - 388 28085.43 -8254.478 0.0
+'4F4FB569 *U60 K 1 10 2.44 1 - - - 389 28085.43 -8134.478 0.0
+'4F4FB58D *U59 K 3 10 1.95 0 2 - - 390 28085.43 -8194.478 0.0
+'4F4FB6AD *U60 K 1 11 2.44 1 - - - 391 27920.93 -8314.478 0.0
+'4F4FB6F5 *U59 K 3 11 1.95 0 2 - - 392 27920.93 -8254.478 0.0
+'4F4FB719 *U59 K 3 11 1.95 0 2 - - 393 27920.93 -8134.478 0.0
+'4F4FB73D *U59 K 3 11 1.95 0 2 - - 394 27920.93 -8194.478 0.0
+'4F4FB761 *U59 K 3 11 1.95 0 2 - - 395 27920.93 -8074.478 0.0
+'4F4FB785 *U60 K 1 11 2.44 1 - - - 396 27838.68 -8314.478 0.0
+'4F4FB7CD *U57 K 4 11 1.81 0 - - - 397 27838.68 -8254.478 0.0
+'4F4FB7F1 *U57 K 4 11 1.81 0 - - - 398 27838.68 -8134.478 0.0
+'4F4FB815 *U57 K 4 11 1.81 0 - - - 399 27838.68 -8194.478 0.0
+'4F4FB839 *U57 K 4 11 1.81 0 - - - 400 27838.68 -8074.478 0.0
+'4F4FB85D *U59 K 3 10 1.95 0 2 - - 401 28249.93 -8014.478 0.0
+'4F4FB881 *U57 K 4 10 1.81 0 - - - 402 28332.18 -8014.478 0.0
+'4F4FB8A5 *U57 K 4 10 1.81 0 - - - 403 28414.43 -8014.478 0.0
+'4F4FB8C9 *U59 K 3 10 1.95 0 2 - - 404 28496.68 -8014.478 0.0
+'4F4FB911 *U58 K 2 10 2.26 1 - - - 405 28332.18 -7954.478 0.0
+'4F4FB935 *U57 K 4 10 1.81 0 - - - 406 28414.43 -7954.478 0.0
+'4F4FB959 *U59 K 3 10 1.95 0 2 - - 407 28496.68 -7954.478 0.0
+'4F4FB9C5 *U60 K 1 10 2.44 1 - - - 408 28414.43 -7894.478 0.0
+'4F4FB9E9 *U60 K 1 10 2.44 1 - - - 409 28496.68 -7894.478 0.0
+'4F4FBA9D *U59 K 3 11 1.95 0 2 - - 410 27920.93 -7954.478 0.0
+'4F4FBAC1 *U59 K 3 11 1.95 0 2 - - 411 27920.93 -8014.478 0.0
+'4F4FBAE5 *U60 K 1 11 2.44 1 - - - 412 27920.93 -7894.478 0.0
+'4F4FBB09 *U57 K 4 11 1.81 0 - - - 413 27838.68 -7954.478 0.0
+'4F4FBB2D *U57 K 4 11 1.81 0 - - - 414 27838.68 -8014.478 0.0
+'4F4FBB51 *U58 K 2 11 2.26 1 - - - 415 27838.68 -7894.478 0.0
+'4F4FBBBD *U58 K 2 11 2.26 1 - - - 416 27756.43 -8254.478 0.0
+'4F4FBBE1 *U57 K 4 11 1.81 0 - - - 417 27756.43 -8134.478 0.0
+'4F4FBC05 *U57 K 4 11 1.81 0 - - - 418 27756.43 -8194.478 0.0
+'4F4FBC29 *U57 K 4 11 1.81 0 - - - 419 27756.43 -8074.478 0.0
+'4F4FBC4D *U57 K 4 11 1.81 0 - - - 420 27756.43 -7954.478 0.0
+'4F4FBC71 *U57 K 4 11 1.81 0 - - - 421 27756.43 -8014.478 0.0
+'4F4FBC95 *U58 K 2 11 2.26 1 - - - 422 27756.43 -7894.478 0.0
+'4F4FBCDD *U60 K 1 11 2.44 1 - - - 423 27674.18 -8254.478 0.0
+'4F4FBD01 *U59 K 3 11 1.95 0 2 - - 424 27674.18 -8134.478 0.0
+'4F4FBD25 *U59 K 3 11 1.95 0 2 - - 425 27674.18 -8194.478 0.0
+'4F4FBD49 *U59 K 3 11 1.95 0 2 - - 426 27674.18 -8074.478 0.0
+'4F4FBD6D *U57 K 4 11 1.81 0 - - - 427 27674.18 -7954.478 0.0
+'4F4FBD91 *U59 K 3 11 1.95 0 2 - - 428 27674.18 -8014.478 0.0
+'4F4FBDB5 *U58 K 2 11 2.26 1 - - - 429 27674.18 -7894.478 0.0
+'4F4FBE8D *U60 K 1 11 2.44 1 - - - 430 27591.93 -7954.478 0.0
+'4F4FBED5 *U60 K 1 11 2.44 1 - - - 431 27591.93 -7894.478 0.0
+'4F4FC15D *U59 K 3 12 1.95 0 2 - - 432 27722.598 -8735.446 0.0
+'4F4FC181 *U59 K 3 12 1.95 0 2 - - 433 27722.598 -8795.446 0.0
+'4F4FC1A5 *U60 K 1 12 2.44 1 - - - 434 27722.598 -8855.446 0.0
+'4F4FC235 *U57 K 4 12 1.81 0 - - - 435 27558.098 -8735.446 0.0
+'4F4FC259 *U57 K 4 12 1.81 0 - - - 436 27640.348 -8735.446 0.0
+'4F4FC27D *U57 K 4 12 1.81 0 - - - 437 27558.098 -8795.446 0.0
+'4F4FC2A1 *U58 K 2 12 2.26 1 - - - 438 27558.098 -8855.446 0.0
+'4F4FC2E9 *U57 K 4 12 1.81 0 - - - 439 27640.348 -8795.446 0.0
+'4F4FC30D *U58 K 2 12 2.26 1 - - - 440 27640.348 -8855.446 0.0
+'4F4FC3E5 *U59 K 3 12 1.95 0 2 - - 441 27722.598 -8555.446 0.0
+'4F4FC409 *U59 K 3 12 1.95 0 2 - - 442 27722.598 -8615.446 0.0
+'4F4FC42D *U59 K 3 12 1.95 0 2 - - 443 27722.598 -8675.446 0.0
+'4F4FC451 *U57 K 4 12 1.81 0 - - - 444 27558.098 -8555.446 0.0
+'4F4FC475 *U57 K 4 12 1.81 0 - - - 445 27640.348 -8555.446 0.0
+'4F4FC499 *U57 K 4 12 1.81 0 - - - 446 27558.098 -8615.446 0.0
+'4F4FC4BD *U57 K 4 12 1.81 0 - - - 447 27558.098 -8675.446 0.0
+'4F4FC4E1 *U57 K 4 12 1.81 0 - - - 448 27640.348 -8615.446 0.0
+'4F4FC505 *U57 K 4 12 1.81 0 - - - 449 27640.348 -8675.446 0.0
+'4F4FC54D *U60 K 1 12 2.44 1 - - - 450 27722.598 -8435.446 0.0
+'4F4FC571 *U59 K 3 12 1.95 0 2 - - 451 27722.598 -8495.446 0.0
+'4F4FC5DD *U58 K 2 12 2.26 1 - - - 452 27558.098 -8435.446 0.0
+'4F4FC601 *U57 K 4 12 1.81 0 - - - 453 27558.098 -8495.446 0.0
+'4F4FC625 *U58 K 2 12 2.26 1 - - - 454 27640.348 -8435.446 0.0
+'4F4FC649 *U57 K 4 12 1.81 0 - - - 455 27640.348 -8495.446 0.0
+'4F4FC66D *U57 K 4 12 1.81 0 - - - 456 27393.598 -8735.446 0.0
+'4F4FC691 *U57 K 4 12 1.81 0 - - - 457 27475.848 -8735.446 0.0
+'4F4FC6B5 *U57 K 4 12 1.81 0 - - - 458 27393.598 -8795.446 0.0
+'4F4FC6D9 *U57 K 4 12 1.81 0 - - - 459 27393.598 -8855.446 0.0
+'4F4FC6FD *U57 K 4 12 1.81 0 - - - 460 27393.598 -8915.446 0.0
+'4F4FC721 *U57 K 4 12 1.81 0 - - - 461 27475.848 -8795.446 0.0
+'4F4FC745 *U57 K 4 12 1.81 0 - - - 462 27475.848 -8855.446 0.0
+'4F4FC769 *U59 K 3 12 1.95 0 2 - - 463 27475.848 -8915.446 0.0
+'4F4FC78D *U58 K 2 12 2.26 1 - - - 464 27393.598 -8975.446 0.0
+'4F4FC7B1 *U60 K 1 12 2.44 1 - - - 465 27475.848 -8975.446 0.0
+'4F4FC7D5 *U57 K 4 12 1.81 0 - - - 466 27393.598 -8555.446 0.0
+'4F4FC7F9 *U57 K 4 12 1.81 0 - - - 467 27475.848 -8555.446 0.0
+'4F4FC81D *U57 K 4 12 1.81 0 - - - 468 27393.598 -8615.446 0.0
+'4F4FC841 *U57 K 4 12 1.81 0 - - - 469 27393.598 -8675.446 0.0
+'4F4FC865 *U57 K 4 12 1.81 0 - - - 470 27475.848 -8615.446 0.0
+'4F4FC889 *U57 K 4 12 1.81 0 - - - 471 27475.848 -8675.446 0.0
+'4F4FC8AD *U58 K 2 12 2.26 1 - - - 472 27393.598 -8435.446 0.0
+'4F4FC8D1 *U57 K 4 12 1.81 0 - - - 473 27393.598 -8495.446 0.0
+'4F4FC8F5 *U58 K 2 12 2.26 1 - - - 474 27475.848 -8435.446 0.0
+'4F4FC919 *U57 K 4 12 1.81 0 - - - 475 27475.848 -8495.446 0.0
+'4F4FC93D *U59 D 3 12 2.8 2 2 - - 476 27229.098 -8735.446 0.0
+'4F4FC961 *U57 K 4 12 1.81 0 - - - 477 27311.348 -8735.446 0.0
+'4F4FC985 *U59 D 3 12 2.8 2 2 - - 478 27229.098 -8795.446 0.0
+'4F4FC9A9 *U59 D 3 12 2.8 2 2 - - 479 27229.098 -8855.446 0.0
+'4F4FC9CD *U59 D 3 12 2.8 2 2 - - 480 27229.098 -8915.446 0.0
+'4F4FC9F1 *U57 K 4 12 1.81 0 - - - 481 27311.348 -8795.446 0.0
+'4F4FCA15 *U57 K 4 12 1.81 0 - - - 482 27311.348 -8855.446 0.0
+'4F4FCA39 *U57 K 4 12 1.81 0 - - - 483 27311.348 -8915.446 0.0
+'4F4FCA5D *U60 D 1 12 4.97 7 - - - 484 27229.098 -8975.446 0.0
+'4F4FCA81 *U58 K 2 12 2.26 1 - - - 485 27311.348 -8975.446 0.0
+'4F4FCAA5 *U59 D 3 12 2.8 2 2 - - 486 27229.098 -8555.446 0.0
+'4F4FCAC9 *U57 K 4 12 1.81 0 - - - 487 27311.348 -8555.446 0.0
+'4F4FCAED *U59 D 3 12 2.8 2 2 - - 488 27229.098 -8615.446 0.0
+'4F4FCB11 *U59 D 3 12 2.8 2 2 - - 489 27229.098 -8675.446 0.0
+'4F4FCB35 *U57 K 4 12 1.81 0 - - - 490 27311.348 -8615.446 0.0
+'4F4FCB59 *U57 K 4 12 1.81 0 - - - 491 27311.348 -8675.446 0.0
+'4F4FCB7D *U60 D 1 12 4.97 7 - - - 492 27229.098 -8435.446 0.0
+'4F4FCBA1 *U59 D 3 12 2.8 2 2 - - 493 27229.098 -8495.446 0.0
+'4F4FCBC5 *U58 K 2 12 2.26 1 - - - 494 27311.348 -8435.446 0.0
+'4F4FCBE9 *U57 K 4 12 1.81 0 - - - 495 27311.348 -8495.446 0.0
+'4F4FCC0D *U57 D 4 13 2.66 2 - - - 496 27023.014 -8735.446 0.0
+'4F4FCC31 *U59 D 3 13 2.8 2 2 - - 497 27105.264 -8735.446 0.0
+'4F4FCC55 *U57 D 4 13 2.66 2 - - - 498 27023.015 -8795.446 0.0
+'4F4FCC79 *U57 D 4 13 2.66 2 - - - 499 27023.015 -8855.446 0.0
+'4F4FCC9D *U57 D 4 13 2.66 2 - - - 500 27023.015 -8915.446 0.0
+'4F4FCCC1 *U59 D 3 13 2.8 2 2 - - 501 27105.265 -8795.446 0.0
+'4F4FCCE5 *U59 D 3 13 2.8 2 2 - - 502 27105.265 -8855.446 0.0
+'4F4FCD09 *U59 D 3 13 2.8 2 2 - - 503 27105.265 -8915.446 0.0
+'4F4FCD2D *U57 D 4 13 2.66 2 - - - 504 27023.015 -8975.446 0.0
+'4F4FCD51 *U59 D 3 13 2.8 2 2 - - 505 27105.265 -8975.446 0.0
+'4F4FCD75 *U57 D 4 13 2.66 2 - - - 506 27023.014 -8555.446 0.0
+'4F4FCD99 *U59 D 3 13 2.8 2 2 - - 507 27105.264 -8555.446 0.0
+'4F4FCDBD *U57 D 4 13 2.66 2 - - - 508 27023.014 -8615.446 0.0
+'4F4FCDE1 *U57 D 4 13 2.66 2 - - - 509 27023.014 -8675.446 0.0
+'4F4FCE05 *U59 D 3 13 2.8 2 2 - - 510 27105.264 -8615.446 0.0
+'4F4FCE29 *U59 D 3 13 2.8 2 2 - - 511 27105.264 -8675.446 0.0
+'4F4FCE4D *U57 D 4 13 2.66 2 - - - 512 27023.014 -8435.446 0.0
+'4F4FCE71 *U57 D 4 13 2.66 2 - - - 513 27023.014 -8495.446 0.0
+'4F4FCE95 *U59 D 3 13 2.8 2 2 - - 514 27105.264 -8435.446 0.0
+'4F4FCEB9 *U59 D 3 13 2.8 2 2 - - 515 27105.264 -8495.446 0.0
+'4F4FCEDD *U58 D 2 13 3.94 5 - - - 516 27023.015 -9035.446 0.0
+'4F4FCF01 *U60 D 1 13 4.97 7 - - - 517 27105.265 -9035.446 0.0
+'4F4FCF25 *U59 D 3 13 2.8 2 2 - - 518 26940.764 -8735.446 0.0
+'4F4FCF49 *U59 D 3 13 2.8 2 2 - - 519 26940.765 -8795.446 0.0
+'4F4FCF6D *U59 D 3 13 2.8 2 2 - - 520 26940.765 -8855.446 0.0
+'4F4FCF91 *U59 D 3 13 2.8 2 2 - - 521 26940.765 -8915.446 0.0
+'4F4FCFB5 *U59 D 3 13 2.8 2 2 - - 522 26940.765 -8975.446 0.0
+'4F4FCFD9 *U57 D 4 13 2.66 2 - - - 523 26940.764 -8555.446 0.0
+'4F4FCFFD *U59 D 3 13 2.8 2 2 - - 524 26940.764 -8615.446 0.0
+'4F4FD021 *U59 D 3 13 2.8 2 2 - - 525 26940.764 -8675.446 0.0
+'4F4FD069 *U57 D 4 13 2.66 2 - - - 526 26940.764 -8495.446 0.0
+'4F4FD08D *U60 D 1 13 4.97 7 - - - 527 26940.765 -9035.446 0.0
+'4F4FD949 *U58 D 2 7 3.94 5 - - - 528 29251.348 -9248.805 0.0
+'4F4FD9B5 *U58 D 2 7 3.94 5 - - - 529 29333.598 -9248.805 0.0
+'4F4FD9D9 *U57 D 4 7 2.66 2 - - - 530 29251.348 -9308.805 0.0
+'4F4FD9FD *U57 D 4 7 2.66 2 - - - 531 29251.348 -9368.805 0.0
+'4F4FDA21 *U57 D 4 7 2.66 2 - - - 532 29251.348 -9428.805 0.0
+'4F4FDA45 *U57 D 4 7 2.66 2 - - - 533 29333.598 -9308.805 0.0
+'4F4FDA69 *U57 D 4 7 2.66 2 - - - 534 29333.598 -9368.805 0.0
+'4F4FDA8D *U57 D 4 7 2.66 2 - - - 535 29333.598 -9428.805 0.0
+'4F4FDAB1 *U57 D 4 7 2.66 2 - - - 536 29251.348 -9488.805 0.0
+'4F4FDAD5 *U57 F 4 7 2.23 1 - - - 537 29251.348 -9548.805 0.0
+'4F4FDAF9 *U57 F 4 7 2.23 1 - - - 538 29251.348 -9608.805 0.0
+'4F4FDB1D *U57 D 4 7 2.66 2 - - - 539 29333.598 -9488.805 0.0
+'4F4FDB41 *U57 D 4 7 2.66 2 - - - 540 29333.598 -9548.805 0.0
+'4F4FDB65 *U57 F 4 7 2.23 1 - - - 541 29333.598 -9608.805 0.0
+'4F4FDB89 *U57 F 4 7 2.23 1 - - - 542 29251.348 -9668.805 0.0
+'4F4FDBAD *U57 F 4 7 2.23 1 - - - 543 29251.348 -9728.805 0.0
+'4F4FDBD1 *U57 F 4 7 2.23 1 - - - 544 29251.348 -9788.805 0.0
+'4F4FDBF5 *U57 F 4 7 2.23 1 - - - 545 29333.598 -9668.805 0.0
+'4F4FDC19 *U57 F 4 7 2.23 1 - - - 546 29333.598 -9728.805 0.0
+'4F4FDC3D *U57 F 4 7 2.23 1 - - - 547 29333.598 -9788.805 0.0
+'4F4FDC61 *U57 F 4 7 2.23 1 - - - 548 29251.348 -9848.805 0.0
+'4F4FDC85 *U57 F 4 7 2.23 1 - - - 549 29333.598 -9848.805 0.0
+'4F4FDCCD *U60 D 1 7 4.97 7 - - - 550 29415.848 -9188.805 0.0
+'4F4FDCF1 *U57 D 4 7 2.66 2 - - - 551 29415.848 -9248.805 0.0
+'4F4FDD39 *U58 D 2 7 3.94 5 - - - 552 29498.098 -9188.805 0.0
+'4F4FDD5D *U57 D 4 7 2.66 2 - - - 553 29498.098 -9248.805 0.0
+'4F4FDD81 *U57 D 4 7 2.66 2 - - - 554 29415.848 -9308.805 0.0
+'4F4FDDA5 *U57 D 4 7 2.66 2 - - - 555 29415.848 -9368.805 0.0
+'4F4FDDC9 *U57 D 4 7 2.66 2 - - - 556 29415.848 -9428.805 0.0
+'4F4FDDED *U57 D 4 7 2.66 2 - - - 557 29498.098 -9308.805 0.0
+'4F4FDE11 *U57 D 4 7 2.66 2 - - - 558 29498.098 -9368.805 0.0
+'4F4FDE35 *U57 D 4 7 2.66 2 - - - 559 29498.098 -9428.805 0.0
+'4F4FDE59 *U57 D 4 7 2.66 2 - - - 560 29415.848 -9488.805 0.0
+'4F4FDE7D *U57 D 4 7 2.66 2 - - - 561 29415.848 -9548.805 0.0
+'4F4FDEA1 *U57 D 4 7 2.66 2 - - - 562 29415.848 -9608.805 0.0
+'4F4FDEC5 *U57 D 4 7 2.66 2 - - - 563 29498.098 -9488.805 0.0
+'4F4FDEE9 *U57 D 4 7 2.66 2 - - - 564 29498.098 -9548.805 0.0
+'4F4FDF0D *U57 D 4 7 2.66 2 - - - 565 29498.098 -9608.805 0.0
+'4F4FDF31 *U57 F 4 7 2.23 1 - - - 566 29415.848 -9668.805 0.0
+'4F4FDF55 *U57 F 4 7 2.23 1 - - - 567 29415.848 -9728.805 0.0
+'4F4FDF79 *U57 F 4 7 2.23 1 - - - 568 29415.848 -9788.805 0.0
+'4F4FDF9D *U57 D 4 7 2.66 2 - - - 569 29498.098 -9668.805 0.0
+'4F4FDFC1 *U57 D 4 7 2.66 2 - - - 570 29498.098 -9728.805 0.0
+'4F4FDFE5 *U57 F 4 7 2.23 1 - - - 571 29498.098 -9788.805 0.0
+'4F4FE009 *U57 F 4 7 2.23 1 - - - 572 29415.848 -9848.805 0.0
+'4F4FE02D *U57 F 4 7 2.23 1 - - - 573 29498.098 -9848.805 0.0
+'4F4FE075 *U58 D 2 7 3.94 5 - - - 574 29580.348 -9188.805 0.0
+'4F4FE099 *U57 D 4 7 2.66 2 - - - 575 29580.348 -9248.805 0.0
+'4F4FE0E1 *U58 D 2 7 3.94 5 - - - 576 29662.598 -9188.805 0.0
+'4F4FE105 *U57 D 4 7 2.66 2 - - - 577 29662.598 -9248.805 0.0
+'4F4FE129 *U57 D 4 7 2.66 2 - - - 578 29580.348 -9308.805 0.0
+'4F4FE14D *U57 D 4 7 2.66 2 - - - 579 29580.348 -9368.805 0.0
+'4F4FE171 *U57 D 4 7 2.66 2 - - - 580 29580.348 -9428.805 0.0
+'4F4FE195 *U57 D 4 7 2.66 2 - - - 581 29662.598 -9308.805 0.0
+'4F4FE1B9 *U57 D 4 7 2.66 2 - - - 582 29662.598 -9368.805 0.0
+'4F4FE1DD *U57 D 4 7 2.66 2 - - - 583 29662.598 -9428.805 0.0
+'4F4FE201 *U57 D 4 7 2.66 2 - - - 584 29580.348 -9488.805 0.0
+'4F4FE225 *U57 D 4 7 2.66 2 - - - 585 29580.348 -9548.805 0.0
+'4F4FE249 *U57 D 4 7 2.66 2 - - - 586 29580.348 -9608.805 0.0
+'4F4FE26D *U57 D 4 7 2.66 2 - - - 587 29662.598 -9488.805 0.0
+'4F4FE291 *U57 D 4 7 2.66 2 - - - 588 29662.598 -9548.805 0.0
+'4F4FE2B5 *U57 D 4 7 2.66 2 - - - 589 29662.598 -9608.805 0.0
+'4F4FE2D9 *U57 D 4 7 2.66 2 - - - 590 29580.348 -9668.805 0.0
+'4F4FE2FD *U57 D 4 7 2.66 2 - - - 591 29580.348 -9728.805 0.0
+'4F4FE321 *U57 F 4 7 2.23 1 - - - 592 29580.348 -9788.805 0.0
+'4F4FE345 *U57 D 4 7 2.66 2 - - - 593 29662.598 -9668.805 0.0
+'4F4FE369 *U57 D 4 7 2.66 2 - - - 594 29662.598 -9728.805 0.0
+'4F4FE38D *U57 F 4 7 2.23 1 - - - 595 29662.598 -9788.805 0.0
+'4F4FE3B1 *U57 F 4 7 2.23 1 - - - 596 29580.348 -9848.805 0.0
+'4F4FE3D5 *U57 F 4 7 2.23 1 - - - 597 29662.598 -9848.805 0.0
+'4F4FE41D *U60 D 1 7 4.97 7 - - - 598 29744.848 -9188.805 0.0
+'4F4FE441 *U59 D 3 7 2.8 2 2 - - 599 29744.848 -9248.805 0.0
+'4F4FE465 *U59 D 3 7 2.8 2 2 - - 600 29744.848 -9308.805 0.0
+'4F4FE489 *U59 D 3 7 2.8 2 2 - - 601 29744.848 -9368.805 0.0
+'4F4FE4AD *U59 D 3 7 2.8 2 2 - - 602 29744.848 -9428.805 0.0
+'4F4FE4D1 *U59 D 3 7 2.8 2 2 - - 603 29744.848 -9488.805 0.0
+'4F4FE4F5 *U59 D 3 7 2.8 2 2 - - 604 29744.848 -9548.805 0.0
+'4F4FE519 *U59 D 3 7 2.8 2 2 - - 605 29744.848 -9608.805 0.0
+'4F4FE53D *U59 D 3 7 2.8 2 2 - - 606 29744.848 -9668.805 0.0
+'4F4FE561 *U59 D 3 7 2.8 2 2 - - 607 29744.848 -9728.805 0.0
+'4F4FE585 *U59 F 3 7 2.37 1 2 - - 608 29744.848 -9788.805 0.0
+'4F4FE5A9 *U59 F 3 7 2.37 1 2 - - 609 29744.848 -9848.805 0.0
+'4F4FE5CD *U57 F 4 7 2.23 1 - - - 610 29251.348 -9908.805 0.0
+'4F4FE5F1 *U57 F 4 7 2.23 1 - - - 611 29251.348 -9968.805 0.0
+'4F4FE615 *U57 F 4 7 2.23 1 - - - 612 29251.348 -10028.805 0.0
+'4F4FE639 *U57 F 4 7 2.23 1 - - - 613 29333.598 -9908.805 0.0
+'4F4FE65D *U57 F 4 7 2.23 1 - - - 614 29333.598 -9968.805 0.0
+'4F4FE681 *U57 F 4 7 2.23 1 - - - 615 29333.598 -10028.805 0.0
+'4F4FE6A5 *U57 F 4 7 2.23 1 - - - 616 29251.348 -10088.805 0.0
+'4F4FE6C9 *U57 F 4 7 2.23 1 - - - 617 29251.348 -10148.805 0.0
+'4F4FE6ED *U57 F 4 7 2.23 1 - - - 618 29251.348 -10208.805 0.0
+'4F4FE711 *U57 F 4 7 2.23 1 - - - 619 29333.598 -10088.805 0.0
+'4F4FE735 *U57 F 4 7 2.23 1 - - - 620 29333.598 -10148.805 0.0
+'4F4FE759 *U57 F 4 7 2.23 1 - - - 621 29333.598 -10208.805 0.0
+'4F4FE77D *U57 E 4 7 1.81 0 - - - 622 29251.348 -10268.805 0.0
+'4F4FE7A1 *U57 F 4 7 2.23 1 - - - 623 29333.598 -10268.805 0.0
+'4F4FE7C5 *U57 F 4 7 2.23 1 - - - 624 29415.848 -9908.805 0.0
+'4F4FE7E9 *U57 F 4 7 2.23 1 - - - 625 29415.848 -9968.805 0.0
+'4F4FE80D *U57 F 4 7 2.23 1 - - - 626 29415.848 -10028.805 0.0
+'4F4FE831 *U57 F 4 7 2.23 1 - - - 627 29498.098 -9908.805 0.0
+'4F4FE855 *U57 F 4 7 2.23 1 - - - 628 29498.098 -9968.805 0.0
+'4F4FE879 *U57 F 4 7 2.23 1 - - - 629 29498.098 -10028.805 0.0
+'4F4FE89D *U57 F 4 7 2.23 1 - - - 630 29415.848 -10088.805 0.0
+'4F4FE8C1 *U57 F 4 7 2.23 1 - - - 631 29415.848 -10148.805 0.0
+'4F4FE8E5 *U57 F 4 7 2.23 1 - - - 632 29415.848 -10208.805 0.0
+'4F4FE909 *U57 F 4 7 2.23 1 - - - 633 29498.098 -10088.805 0.0
+'4F4FE92D *U57 F 4 7 2.23 1 - - - 634 29498.098 -10148.805 0.0
+'4F4FE951 *U57 F 4 7 2.23 1 - - - 635 29498.098 -10208.805 0.0
+'4F4FE975 *U57 F 4 7 2.23 1 - - - 636 29415.848 -10268.805 0.0
+'4F4FE999 *U57 F 4 7 2.23 1 - - - 637 29498.098 -10268.805 0.0
+'4F4FE9BD *U57 F 4 7 2.23 1 - - - 638 29580.348 -9908.805 0.0
+'4F4FE9E1 *U57 F 4 7 2.23 1 - - - 639 29580.348 -9968.805 0.0
+'4F4FEA05 *U57 F 4 7 2.23 1 - - - 640 29580.348 -10028.805 0.0
+'4F4FEA29 *U57 F 4 7 2.23 1 - - - 641 29662.598 -9908.805 0.0
+'4F4FEA4D *U57 F 4 7 2.23 1 - - - 642 29662.598 -9968.805 0.0
+'4F4FEA71 *U57 F 4 7 2.23 1 - - - 643 29662.598 -10028.805 0.0
+'4F4FEA95 *U57 F 4 7 2.23 1 - - - 644 29580.348 -10088.805 0.0
+'4F4FEAB9 *U57 F 4 7 2.23 1 - - - 645 29580.348 -10148.805 0.0
+'4F4FEADD *U57 F 4 7 2.23 1 - - - 646 29580.348 -10208.805 0.0
+'4F4FEB01 *U57 F 4 7 2.23 1 - - - 647 29662.598 -10088.805 0.0
+'4F4FEB25 *U57 F 4 7 2.23 1 - - - 648 29662.598 -10148.805 0.0
+'4F4FEB49 *U57 F 4 7 2.23 1 - - - 649 29662.598 -10208.805 0.0
+'4F4FEB6D *U57 F 4 7 2.23 1 - - - 650 29580.348 -10268.805 0.0
+'4F4FEB91 *U57 F 4 7 2.23 1 - - - 651 29662.598 -10268.805 0.0
+'4F4FEBB5 *U59 F 3 7 2.37 1 2 - - 652 29744.848 -9908.805 0.0
+'4F4FEBD9 *U59 F 3 7 2.37 1 2 - - 653 29744.848 -9968.805 0.0
+'4F4FEBFD *U59 F 3 7 2.37 1 2 - - 654 29744.848 -10028.805 0.0
+'4F4FEC21 *U59 F 3 7 2.37 1 2 - - 655 29744.848 -10088.805 0.0
+'4F4FEC45 *U59 F 3 7 2.37 1 2 - - 656 29744.848 -10148.805 0.0
+'4F4FEC69 *U59 F 3 7 2.37 1 2 - - 657 29744.848 -10208.805 0.0
+'4F4FEC8D *U59 F 3 7 2.37 1 2 - - 658 29744.848 -10268.805 0.0
+'4F4FECB1 *U58 E 2 7 2.26 1 - - - 659 29251.348 -10328.805 0.0
+'4F4FECD5 *U58 E 2 7 2.26 1 - - - 660 29333.598 -10328.805 0.0
+'4F4FED41 *U58 H 2 7 3.1 3 - - - 661 29415.848 -10328.805 0.0
+'4F4FED65 *U58 F 2 7 2.68 2 - - - 662 29498.098 -10328.805 0.0
+'4F4FEDD1 *U58 F 2 7 2.68 2 - - - 663 29580.348 -10328.805 0.0
+'4F4FEDF5 *U58 F 2 7 2.68 2 - - - 664 29662.598 -10328.805 0.0
+'4F4FEE61 *U60 F 1 7 3.28 3 - - - 665 29744.848 -10328.805 0.0
+'4F4FEEA9 *U59 D 3 7 2.8 2 2 - - 666 29086.848 -9308.805 0.0
+'4F4FEECD *U59 K 3 7 1.95 0 2 - - 667 29086.848 -9368.805 0.0
+'4F4FEEF1 *U59 K 3 7 1.95 0 2 - - 668 29086.848 -9428.805 0.0
+'4F4FEF15 *U57 D 4 7 2.66 2 - - - 669 29169.098 -9308.805 0.0
+'4F4FEF39 *U57 D 4 7 2.66 2 - - - 670 29169.098 -9368.805 0.0
+'4F4FEF5D *U57 K 4 7 1.81 0 - - - 671 29169.098 -9428.805 0.0
+'4F4FEF81 *U59 K 3 7 1.95 0 2 - - 672 29086.848 -9488.805 0.0
+'4F4FEFA5 *U59 F 3 7 2.37 1 2 - - 673 29086.848 -9548.805 0.0
+'4F4FEFC9 *U59 F 3 7 2.37 1 2 - - 674 29086.848 -9608.805 0.0
+'4F4FEFED *U57 F 4 7 2.23 1 - - - 675 29169.098 -9488.805 0.0
+'4F4FF011 *U57 F 4 7 2.23 1 - - - 676 29169.098 -9548.805 0.0
+'4F4FF035 *U57 F 4 7 2.23 1 - - - 677 29169.098 -9608.805 0.0
+'4F4FF059 *U59 F 3 7 2.37 1 2 - - 678 29086.848 -9668.805 0.0
+'4F4FF07D *U59 F 3 7 2.37 1 2 - - 679 29086.848 -9728.805 0.0
+'4F4FF0A1 *U59 F 3 7 2.37 1 2 - - 680 29086.848 -9788.805 0.0
+'4F4FF0C5 *U57 F 4 7 2.23 1 - - - 681 29169.098 -9668.805 0.0
+'4F4FF0E9 *U57 F 4 7 2.23 1 - - - 682 29169.098 -9728.805 0.0
+'4F4FF10D *U57 F 4 7 2.23 1 - - - 683 29169.098 -9788.805 0.0
+'4F4FF131 *U59 F 3 7 2.37 1 2 - - 684 29086.848 -9848.805 0.0
+'4F4FF155 *U57 F 4 7 2.23 1 - - - 685 29169.098 -9848.805 0.0
+'4F4FF179 *U59 F 3 7 2.37 1 2 - - 686 29086.848 -9908.805 0.0
+'4F4FF19D *U59 F 3 7 2.37 1 2 - - 687 29086.848 -9968.805 0.0
+'4F4FF1C1 *U59 F 3 7 2.37 1 2 - - 688 29086.848 -10028.805 0.0
+'4F4FF1E5 *U57 F 4 7 2.23 1 - - - 689 29169.098 -9908.805 0.0
+'4F4FF209 *U57 F 4 7 2.23 1 - - - 690 29169.098 -9968.805 0.0
+'4F4FF22D *U57 F 4 7 2.23 1 - - - 691 29169.098 -10028.805 0.0
+'4F4FF251 *U59 F 3 7 2.37 1 2 - - 692 29086.848 -10088.805 0.0
+'4F4FF275 *U59 F 3 7 2.37 1 2 - - 693 29086.848 -10148.805 0.0
+'4F4FF299 *U59 E 3 7 3.22 3 2 - - 694 29086.848 -10208.805 0.0
+'4F4FF2BD *U57 F 4 7 2.23 1 - - - 695 29169.098 -10088.805 0.0
+'4F4FF2E1 *U57 F 4 7 2.23 1 - - - 696 29169.098 -10148.805 0.0
+'4F4FF305 *U57 F 4 7 2.23 1 - - - 697 29169.098 -10208.805 0.0
+'4F4FF329 *U59 E 3 7 3.22 3 2 - - 698 29086.848 -10268.805 0.0
+'4F4FF34D *U57 E 4 7 1.81 0 - - - 699 29169.098 -10268.805 0.0
+'4F4FF371 *U60 E 1 7 3.71 4 - - - 700 29086.848 -10328.805 0.0
+'4F4FF395 *U58 E 2 7 2.26 1 - - - 701 29169.098 -10328.805 0.0
+'4F4FFE45 *U57 D 4 8 2.66 2 - - - 702 29250.897 -8732.749 0.0
+'4F4FFE69 *U57 D 4 8 2.66 2 - - - 703 29333.147 -8732.749 0.0
+'4F4FFE8D *U57 D 4 8 2.66 2 - - - 704 29250.897 -8792.749 0.0
+'4F4FFEB1 *U57 D 4 8 2.66 2 - - - 705 29250.897 -8852.749 0.0
+'4F4FFED5 *U57 D 4 8 2.66 2 - - - 706 29250.897 -8912.749 0.0
+'4F4FFEF9 *U57 D 4 8 2.66 2 - - - 707 29333.147 -8792.749 0.0
+'4F4FFF1D *U57 D 4 8 2.66 2 - - - 708 29333.147 -8852.749 0.0
+'4F4FFF41 *U57 D 4 8 2.66 2 - - - 709 29333.147 -8912.749 0.0
+'4F4FFF65 *U57 D 4 8 2.66 2 - - - 710 29250.897 -8972.749 0.0
+'4F4FFF89 *U58 D 2 8 3.94 5 - - - 711 29250.897 -9032.749 0.0
+'4F4FFFAD *U57 D 4 8 2.66 2 - - - 712 29333.147 -8972.749 0.0
+'4F4FFFD1 *U58 D 2 8 3.94 5 - - - 713 29333.147 -9032.749 0.0
+'4F4FFFF5 *U57 D 4 8 2.66 2 - - - 714 29415.397 -8732.749 0.0
+'50500019 *U57 D 4 8 2.66 2 - - - 715 29497.647 -8732.749 0.0
+'5050003D *U57 D 4 8 2.66 2 - - - 716 29415.397 -8792.749 0.0
+'50500061 *U57 D 4 8 2.66 2 - - - 717 29415.397 -8852.749 0.0
+'50500085 *U57 D 4 8 2.66 2 - - - 718 29415.397 -8912.749 0.0
+'505000A9 *U57 D 4 8 2.66 2 - - - 719 29497.647 -8792.749 0.0
+'505000CD *U57 D 4 8 2.66 2 - - - 720 29497.647 -8852.749 0.0
+'505000F1 *U57 D 4 8 2.66 2 - - - 721 29497.647 -8912.749 0.0
+'50500115 *U57 D 4 8 2.66 2 - - - 722 29415.397 -8972.749 0.0
+'50500139 *U58 D 2 8 3.94 5 - - - 723 29415.397 -9032.749 0.0
+'5050015D *U57 D 4 8 2.66 2 - - - 724 29497.647 -8972.749 0.0
+'50500181 *U58 D 2 8 3.94 5 - - - 725 29497.647 -9032.749 0.0
+'5050042D *U59 D 3 8 2.8 2 2 - - 726 29086.397 -8732.749 0.0
+'50500451 *U57 D 4 8 2.66 2 - - - 727 29168.647 -8732.749 0.0
+'50500475 *U59 D 3 8 2.8 2 2 - - 728 29086.397 -8792.749 0.0
+'50500499 *U59 D 3 8 2.8 2 2 - - 729 29086.397 -8852.749 0.0
+'505004BD *U59 D 3 8 2.8 2 2 - - 730 29086.397 -8912.749 0.0
+'505004E1 *U57 D 4 8 2.66 2 - - - 731 29168.647 -8792.749 0.0
+'50500505 *U57 D 4 8 2.66 2 - - - 732 29168.647 -8852.749 0.0
+'50500529 *U57 D 4 8 2.66 2 - - - 733 29168.647 -8912.749 0.0
+'5050054D *U59 D 3 8 2.8 2 2 - - 734 29086.397 -8972.749 0.0
+'50500571 *U60 D 1 8 4.97 7 - - - 735 29086.397 -9032.749 0.0
+'50500595 *U57 D 4 8 2.66 2 - - - 736 29168.647 -8972.749 0.0
+'505005B9 *U58 D 2 8 3.94 5 - - - 737 29168.647 -9032.749 0.0
+'505005DD *U57 D 4 8 2.66 2 - - - 738 29250.897 -8672.749 0.0
+'50500601 *U57 D 4 8 2.66 2 - - - 739 29333.147 -8672.749 0.0
+'50500625 *U57 D 4 8 2.66 2 - - - 740 29415.397 -8672.749 0.0
+'50500649 *U59 D 3 8 2.8 2 2 - - 741 29497.647 -8672.749 0.0
+'5050066D *U59 D 3 8 2.8 2 2 - - 742 29086.397 -8672.749 0.0
+'50500691 *U57 D 4 8 2.66 2 - - - 743 29168.647 -8672.749 0.0
+'505006B5 *U57 D 4 8 2.66 2 - - - 744 29250.896 -8612.749 0.0
+'505006D9 *U57 D 4 8 2.66 2 - - - 745 29333.146 -8612.749 0.0
+'505006FD *U57 D 4 8 2.66 2 - - - 746 29415.396 -8612.749 0.0
+'50500721 *U59 D 3 8 2.8 2 2 - - 747 29497.646 -8612.749 0.0
+'50500745 *U59 D 3 8 2.8 2 2 - - 748 29086.396 -8612.749 0.0
+'50500769 *U57 D 4 8 2.66 2 - - - 749 29168.646 -8612.749 0.0
+'5050078D *U57 D 4 8 2.66 2 - - - 750 29250.896 -8552.749 0.0
+'505007B1 *U57 D 4 8 2.66 2 - - - 751 29333.146 -8552.749 0.0
+'505007D5 *U57 D 4 8 2.66 2 - - - 752 29415.396 -8552.749 0.0
+'505007F9 *U59 D 3 8 2.8 2 2 - - 753 29497.646 -8552.749 0.0
+'5050081D *U59 D 3 8 2.8 2 2 - - 754 29086.396 -8552.749 0.0
+'50500841 *U57 D 4 8 2.66 2 - - - 755 29168.646 -8552.749 0.0
+'50500865 *U57 D 4 8 2.66 2 - - - 756 29250.896 -8492.749 0.0
+'50500889 *U57 D 4 8 2.66 2 - - - 757 29333.146 -8492.749 0.0
+'505008AD *U57 D 4 8 2.66 2 - - - 758 29415.396 -8492.749 0.0
+'505008D1 *U59 D 3 8 2.8 2 2 - - 759 29497.646 -8492.749 0.0
+'505008F5 *U59 D 3 8 2.8 2 2 - - 760 29086.396 -8492.749 0.0
+'50500919 *U57 D 4 8 2.66 2 - - - 761 29168.646 -8492.749 0.0
+'5050093D *U57 D 4 8 2.66 2 - - - 762 29250.896 -8432.749 0.0
+'50500961 *U57 D 4 8 2.66 2 - - - 763 29333.146 -8432.749 0.0
+'50500985 *U57 D 4 8 2.66 2 - - - 764 29415.396 -8432.749 0.0
+'505009A9 *U59 D 3 8 2.8 2 2 - - 765 29497.646 -8432.749 0.0
+'505009CD *U59 D 3 8 2.8 2 2 - - 766 29086.396 -8432.749 0.0
+'505009F1 *U57 D 4 8 2.66 2 - - - 767 29168.646 -8432.749 0.0
+'50500A15 *U57 D 4 8 2.66 2 - - - 768 29250.897 -8372.749 0.0
+'50500A39 *U57 D 4 8 2.66 2 - - - 769 29333.147 -8372.749 0.0
+'50500A5D *U57 D 4 8 2.66 2 - - - 770 29415.397 -8372.749 0.0
+'50500A81 *U59 D 3 8 2.8 2 2 - - 771 29497.647 -8372.749 0.0
+'50500AA5 *U59 D 3 8 2.8 2 2 - - 772 29086.397 -8372.749 0.0
+'50500AC9 *U57 D 4 8 2.66 2 - - - 773 29168.647 -8372.749 0.0
+'50500AED *U57 D 4 8 2.66 2 - - - 774 29250.897 -8312.749 0.0
+'50500B11 *U57 D 4 8 2.66 2 - - - 775 29333.147 -8312.749 0.0
+'50500B35 *U57 D 4 8 2.66 2 - - - 776 29415.397 -8312.749 0.0
+'50500B59 *U59 D 3 8 2.8 2 2 - - 777 29497.647 -8312.749 0.0
+'50500B7D *U59 D 3 8 2.8 2 2 - - 778 29086.397 -8312.749 0.0
+'50500BA1 *U57 D 4 8 2.66 2 - - - 779 29168.647 -8312.749 0.0
+'50500BC5 *U57 D 4 8 2.66 2 - - - 780 29250.897 -8252.749 0.0
+'50500BE9 *U57 D 4 8 2.66 2 - - - 781 29333.147 -8252.749 0.0
+'50500C0D *U57 D 4 8 2.66 2 - - - 782 29415.397 -8252.749 0.0
+'50500C31 *U59 D 3 8 2.8 2 2 - - 783 29497.647 -8252.749 0.0
+'50500C55 *U59 D 3 8 2.8 2 2 - - 784 29086.397 -8252.749 0.0
+'50500C79 *U57 D 4 8 2.66 2 - - - 785 29168.647 -8252.749 0.0
+'50500C9D *U57 D 4 8 2.66 2 - - - 786 29250.897 -8192.749 0.0
+'50500CC1 *U57 D 4 8 2.66 2 - - - 787 29333.147 -8192.749 0.0
+'50500CE5 *U57 D 4 8 2.66 2 - - - 788 29415.397 -8192.749 0.0
+'50500D09 *U59 D 3 8 2.8 2 2 - - 789 29497.647 -8192.749 0.0
+'50500D2D *U59 D 3 8 2.8 2 2 - - 790 29086.397 -8192.749 0.0
+'50500D51 *U57 D 4 8 2.66 2 - - - 791 29168.647 -8192.749 0.0
+'50500D75 *U57 D 4 8 2.66 2 - - - 792 29250.897 -8132.749 0.0
+'50500D99 *U57 D 4 8 2.66 2 - - - 793 29333.147 -8132.749 0.0
+'50500DBD *U57 D 4 8 2.66 2 - - - 794 29415.397 -8132.749 0.0
+'50500DE1 *U60 D 1 8 4.97 7 - - - 795 29497.647 -8132.749 0.0
+'50500E05 *U59 D 3 8 2.8 2 2 - - 796 29086.397 -8132.749 0.0
+'50500E29 *U57 D 4 8 2.66 2 - - - 797 29168.647 -8132.749 0.0
+'50500E4D *U58 D 2 8 3.94 5 - - - 798 29250.897 -8072.749 0.0
+'50500E71 *U58 D 2 8 3.94 5 - - - 799 29333.147 -8072.749 0.0
+'50500E95 *U60 D 1 8 4.97 7 - - - 800 29415.397 -8072.749 0.0
+'50500EDD *U60 D 1 8 4.97 7 - - - 801 29086.397 -8072.749 0.0
+'50500F01 *U58 D 2 8 3.94 5 - - - 802 29168.647 -8072.749 0.0
+'505010EC *U57 D 4 3 2.66 2 - - - 803 26921.747 -9252.336 0.0
+'50501110 *U58 D 2 3 3.94 5 - - - 804 27003.997 -9252.336 0.0
+'50501134 *U57 D 4 3 2.66 2 - - - 805 26921.747 -9312.336 0.0
+'50501158 *U57 D 4 3 2.66 2 - - - 806 26921.747 -9372.336 0.0
+'5050117C *U57 D 4 3 2.66 2 - - - 807 26921.747 -9432.336 0.0
+'505011A0 *U57 D 4 3 2.66 2 - - - 808 27003.997 -9312.336 0.0
+'505011C4 *U57 D 4 3 2.66 2 - - - 809 27003.997 -9372.336 0.0
+'505011E8 *U57 D 4 3 2.66 2 - - - 810 27003.997 -9432.336 0.0
+'5050120C *U57 D 4 3 2.66 2 - - - 811 26921.747 -9492.336 0.0
+'50501230 *U57 K 4 3 1.81 0 - - - 812 27003.997 -9492.336 0.0
+'50501254 *U60 D 1 3 4.97 7 - - - 813 27086.247 -9252.336 0.0
+'50501278 *U59 D 3 3 2.8 2 2 - - 814 27086.247 -9312.336 0.0
+'5050129C *U59 D 3 3 2.8 2 2 - - 815 27086.247 -9372.336 0.0
+'505012C0 *U59 K 3 3 1.95 0 2 - - 816 27086.247 -9432.336 0.0
+'505012E4 *U59 K 3 3 1.95 0 2 - - 817 27086.247 -9492.336 0.0
+'50501308 *U57 K 4 3 1.81 0 - - - 818 26921.747 -9552.336 0.0
+'5050132C *U57 K 4 3 1.81 0 - - - 819 26921.747 -9612.336 0.0
+'50501350 *U57 K 4 3 1.81 0 - - - 820 26921.747 -9672.336 0.0
+'50501374 *U57 K 4 3 1.81 0 - - - 821 27003.997 -9552.336 0.0
+'50501398 *U57 K 4 3 1.81 0 - - - 822 27003.997 -9612.336 0.0
+'505013BC *U57 K 4 3 1.81 0 - - - 823 27003.997 -9672.336 0.0
+'505013E0 *U57 K 4 3 1.81 0 - - - 824 26921.747 -9732.336 0.0
+'50501404 *U57 G 4 3 1.81 0 - - - 825 26921.747 -9792.336 0.0
+'50501428 *U57 G 4 3 1.81 0 - - - 826 26921.747 -9852.336 0.0
+'5050144C *U57 K 4 3 1.81 0 - - - 827 27003.997 -9732.336 0.0
+'50501470 *U57 G 4 3 1.81 0 - - - 828 27003.997 -9792.336 0.0
+'50501494 *U57 G 4 3 1.81 0 - - - 829 27003.997 -9852.336 0.0
+'505014B8 *U57 G 4 3 1.81 0 - - - 830 26921.747 -9912.336 0.0
+'505014DC *U57 G 4 3 1.81 0 - - - 831 27003.997 -9912.336 0.0
+'50501500 *U59 K 3 3 1.95 0 2 - - 832 27086.247 -9552.336 0.0
+'50501524 *U59 K 3 3 1.95 0 2 - - 833 27086.247 -9612.336 0.0
+'50501548 *U59 K 3 3 1.95 0 2 - - 834 27086.247 -9672.336 0.0
+'5050156C *U59 K 3 3 1.95 0 2 - - 835 27086.247 -9732.336 0.0
+'50501590 *U59 G 3 3 1.95 0 2 - - 836 27086.247 -9792.336 0.0
+'505015B4 *U59 G 3 3 1.95 0 2 - - 837 27086.247 -9852.336 0.0
+'505015D8 *U59 G 3 3 1.95 0 2 - - 838 27086.247 -9912.336 0.0
+'505015FC *U57 D 4 3 2.66 2 - - - 839 26757.247 -9252.336 0.0
+'50501620 *U57 D 4 3 2.66 2 - - - 840 26839.497 -9252.336 0.0
+'50501644 *U57 D 4 3 2.66 2 - - - 841 26757.247 -9312.336 0.0
+'50501668 *U57 D 4 3 2.66 2 - - - 842 26757.247 -9372.336 0.0
+'5050168C *U57 D 4 3 2.66 2 - - - 843 26757.247 -9432.336 0.0
+'505016B0 *U57 D 4 3 2.66 2 - - - 844 26839.497 -9312.336 0.0
+'505016D4 *U57 D 4 3 2.66 2 - - - 845 26839.497 -9372.336 0.0
+'505016F8 *U57 D 4 3 2.66 2 - - - 846 26839.497 -9432.336 0.0
+'5050171C *U57 D 4 3 2.66 2 - - - 847 26757.247 -9492.336 0.0
+'50501740 *U57 D 4 3 2.66 2 - - - 848 26839.497 -9492.336 0.0
+'50501764 *U57 D 4 3 2.66 2 - - - 849 26757.247 -9552.336 0.0
+'50501788 *U57 D 4 3 2.66 2 - - - 850 26757.247 -9612.336 0.0
+'505017AC *U57 D 4 3 2.66 2 - - - 851 26757.247 -9672.336 0.0
+'505017D0 *U57 D 4 3 2.66 2 - - - 852 26839.497 -9552.336 0.0
+'505017F4 *U57 D 4 3 2.66 2 - - - 853 26839.497 -9612.336 0.0
+'50501818 *U57 K 4 3 1.81 0 - - - 854 26839.497 -9672.336 0.0
+'5050183C *U57 K 4 3 1.81 0 - - - 855 26757.247 -9732.336 0.0
+'50501860 *U57 G 4 3 1.81 0 - - - 856 26757.247 -9792.336 0.0
+'50501884 *U57 G 4 3 1.81 0 - - - 857 26757.247 -9852.336 0.0
+'505018A8 *U57 K 4 3 1.81 0 - - - 858 26839.497 -9732.336 0.0
+'505018CC *U57 G 4 3 1.81 0 - - - 859 26839.497 -9792.336 0.0
+'505018F0 *U57 G 4 3 1.81 0 - - - 860 26839.497 -9852.336 0.0
+'50501914 *U57 G 4 3 1.81 0 - - - 861 26757.247 -9912.336 0.0
+'50501938 *U57 G 4 3 1.81 0 - - - 862 26839.497 -9912.336 0.0
+'5050195C *U60 D 1 3 4.97 7 - - - 863 26921.747 -9192.336 0.0
+'505019C8 *U58 D 2 3 3.94 5 - - - 864 26757.247 -9192.336 0.0
+'505019EC *U58 D 2 3 3.94 5 - - - 865 26839.497 -9192.336 0.0
+'50501A34 *U59 D 3 3 2.8 2 2 - - 866 26674.997 -9252.336 0.0
+'50501A7C *U60 D 1 3 4.97 7 - - - 867 26592.747 -9372.336 0.0
+'50501AA0 *U59 D 3 3 2.8 2 2 - - 868 26592.747 -9432.336 0.0
+'50501AC4 *U59 D 3 3 2.8 2 2 - - 869 26674.997 -9312.336 0.0
+'50501AE8 *U57 D 4 3 2.66 2 - - - 870 26674.997 -9372.336 0.0
+'50501B0C *U57 D 4 3 2.66 2 - - - 871 26674.997 -9432.336 0.0
+'50501B30 *U59 D 3 3 2.8 2 2 - - 872 26592.747 -9492.336 0.0
+'50501B54 *U57 D 4 3 2.66 2 - - - 873 26674.997 -9492.336 0.0
+'50501B78 *U59 D 3 3 2.8 2 2 - - 874 26592.747 -9552.336 0.0
+'50501B9C *U59 D 3 3 2.8 2 2 - - 875 26592.747 -9612.336 0.0
+'50501BC0 *U59 D 3 3 2.8 2 2 - - 876 26592.747 -9672.336 0.0
+'50501BE4 *U57 D 4 3 2.66 2 - - - 877 26674.997 -9552.336 0.0
+'50501C08 *U57 D 4 3 2.66 2 - - - 878 26674.997 -9612.336 0.0
+'50501C2C *U57 D 4 3 2.66 2 - - - 879 26674.997 -9672.336 0.0
+'50501C50 *U59 D 3 3 2.8 2 2 - - 880 26592.747 -9732.336 0.0
+'50501C74 *U59 G 3 3 1.95 0 2 - - 881 26592.747 -9792.336 0.0
+'50501C98 *U59 G 3 3 1.95 0 2 - - 882 26592.747 -9852.336 0.0
+'50501CBC *U57 D 4 3 2.66 2 - - - 883 26674.997 -9732.336 0.0
+'50501CE0 *U57 G 4 3 1.81 0 - - - 884 26674.997 -9792.336 0.0
+'50501D04 *U57 G 4 3 1.81 0 - - - 885 26674.997 -9852.336 0.0
+'50501D28 *U59 G 3 3 1.95 0 2 - - 886 26592.747 -9912.336 0.0
+'50501D4C *U57 G 4 3 1.81 0 - - - 887 26674.997 -9912.336 0.0
+'50501D94 *U60 D 1 3 4.97 7 - - - 888 26674.997 -9192.336 0.0
+'50501DB8 *U57 G 4 3 1.81 0 - - - 889 26921.747 -9972.336 0.0
+'50501DDC *U57 G 4 3 1.81 0 - - - 890 26921.747 -10032.336 0.0
+'50501E00 *U57 G 4 3 1.81 0 - - - 891 27003.997 -9972.336 0.0
+'50501E24 *U57 G 4 3 1.81 0 - - - 892 27003.997 -10032.336 0.0
+'50501E48 *U57 G 4 3 1.81 0 - - - 893 26921.747 -10092.336 0.0
+'50501E6C *U57 F 4 3 2.23 1 - - - 894 27003.997 -10092.336 0.0
+'50501E90 *U59 F 3 3 2.37 1 2 - - 895 27086.247 -9972.336 0.0
+'50501EB4 *U59 F 3 3 2.37 1 2 - - 896 27086.247 -10032.336 0.0
+'50501ED8 *U59 F 3 3 2.37 1 2 - - 897 27086.247 -10092.336 0.0
+'50501EFC *U57 G 4 3 1.81 0 - - - 898 26757.247 -9972.336 0.0
+'50501F20 *U57 G 4 3 1.81 0 - - - 899 26757.247 -10032.336 0.0
+'50501F44 *U57 G 4 3 1.81 0 - - - 900 26839.497 -9972.336 0.0
+'50501F68 *U57 G 4 3 1.81 0 - - - 901 26839.497 -10032.336 0.0
+'50501F8C *U57 G 4 3 1.81 0 - - - 902 26757.247 -10092.336 0.0
+'50501FB0 *U57 G 4 3 1.81 0 - - - 903 26839.497 -10092.336 0.0
+'50501FD4 *U59 G 3 3 1.95 0 2 - - 904 26592.747 -9972.336 0.0
+'50501FF8 *U59 G 3 3 1.95 0 2 - - 905 26592.747 -10032.336 0.0
+'5050201C *U57 G 4 3 1.81 0 - - - 906 26674.997 -9972.336 0.0
+'50502040 *U57 G 4 3 1.81 0 - - - 907 26674.997 -10032.336 0.0
+'50502064 *U59 G 3 3 1.95 0 2 - - 908 26592.747 -10092.336 0.0
+'50502088 *U57 G 4 3 1.81 0 - - - 909 26674.997 -10092.336 0.0
+'505020AC *U57 F 4 3 2.23 1 - - - 910 26921.747 -10152.336 0.0
+'505020D0 *U57 F 4 3 2.23 1 - - - 911 26921.747 -10212.336 0.0
+'505020F4 *U57 F 4 3 2.23 1 - - - 912 27003.997 -10152.336 0.0
+'50502118 *U57 F 4 3 2.23 1 - - - 913 27003.997 -10212.336 0.0
+'5050213C *U57 F 4 3 2.23 1 - - - 914 26921.747 -10272.336 0.0
+'50502160 *U57 F 4 3 2.23 1 - - - 915 27003.997 -10272.336 0.0
+'50502184 *U59 F 3 3 2.37 1 2 - - 916 27086.247 -10152.336 0.0
+'505021A8 *U59 F 3 3 2.37 1 2 - - 917 27086.247 -10212.336 0.0
+'505021CC *U59 F 3 3 2.37 1 2 - - 918 27086.247 -10272.336 0.0
+'505021F0 *U57 G 4 3 1.81 0 - - - 919 26757.247 -10152.336 0.0
+'50502214 *U57 G 4 3 1.81 0 - - - 920 26757.247 -10212.336 0.0
+'50502238 *U57 G 4 3 1.81 0 - - - 921 26839.497 -10152.336 0.0
+'5050225C *U57 G 4 3 1.81 0 - - - 922 26839.497 -10212.336 0.0
+'50502280 *U57 G 4 3 1.81 0 - - - 923 26757.247 -10272.336 0.0
+'505022A4 *U57 F 4 3 2.23 1 - - - 924 26839.497 -10272.336 0.0
+'505022C8 *U60 G 1 3 2.44 1 - - - 925 26592.747 -10152.336 0.0
+'50502310 *U57 G 4 3 1.81 0 - - - 926 26674.997 -10152.336 0.0
+'50502334 *U59 G 3 3 1.95 0 2 - - 927 26674.997 -10212.336 0.0
+'5050237C *U59 G 3 3 1.95 0 2 - - 928 26674.997 -10272.336 0.0
+'50502628 *U57 F 4 3 2.23 1 - - - 929 26921.747 -10332.336 0.0
+'5050264C *U57 F 4 3 2.23 1 - - - 930 26921.747 -10392.336 0.0
+'50502670 *U57 F 4 3 2.23 1 - - - 931 27003.997 -10332.336 0.0
+'50502694 *U57 F 4 3 2.23 1 - - - 932 27003.997 -10392.336 0.0
+'505026B8 *U58 F 2 3 2.68 2 - - - 933 26921.747 -10452.336 0.0
+'505026DC *U58 F 2 3 2.68 2 - - - 934 27003.997 -10452.336 0.0
+'50502700 *U59 F 3 3 2.37 1 2 - - 935 27086.247 -10332.336 0.0
+'50502724 *U59 F 3 3 2.37 1 2 - - 936 27086.247 -10392.336 0.0
+'50502748 *U60 F 1 3 3.28 3 - - - 937 27086.247 -10452.336 0.0
+'5050276C *U57 F 4 3 2.23 1 - - - 938 26757.247 -10332.336 0.0
+'50502790 *U57 F 4 3 2.23 1 - - - 939 26757.247 -10392.336 0.0
+'505027B4 *U57 F 4 3 2.23 1 - - - 940 26839.497 -10332.336 0.0
+'505027D8 *U57 F 4 3 2.23 1 - - - 941 26839.497 -10392.336 0.0
+'505027FC *U58 F 2 3 2.68 2 - - - 942 26757.247 -10452.336 0.0
+'50502820 *U58 F 2 3 2.68 2 - - - 943 26839.497 -10452.336 0.0
+'5050288C *U59 G 3 3 1.95 0 2 - - 944 26674.997 -10332.336 0.0
+'505028B0 *U59 G 3 3 1.95 0 2 - - 945 26674.997 -10392.336 0.0
+'505028F8 *U60 F 1 3 3.28 3 - - - 946 26674.997 -10452.336 0.0
+'50502EE0 *U58 F 2 1 2.68 2 - - - 947 26971.692 -10548.683 0.0
+'50502F04 *U58 F 2 1 2.68 2 - - - 948 26971.692 -10608.683 0.0
+'50502F28 *U58 F 2 1 2.68 2 - - - 949 27053.942 -10548.683 0.0
+'50502F4C *U58 F 2 1 2.68 2 - - - 950 27053.942 -10608.683 0.0
+'50502FB8 *U58 F 2 1 2.68 2 - - - 951 27136.192 -10548.682 0.0
+'50502FDC *U58 F 2 1 2.68 2 - - - 952 27136.192 -10608.682 0.0
+'50503024 *U58 F 2 1 2.68 2 - - - 953 26807.192 -10548.683 0.0
+'50503048 *U58 F 2 1 2.68 2 - - - 954 26807.192 -10608.683 0.0
+'5050306C *U58 F 2 1 2.68 2 - - - 955 26889.442 -10548.683 0.0
+'50503090 *U58 F 2 1 2.68 2 - - - 956 26889.442 -10608.683 0.0
+'505030FC *U60 F 1 1 3.28 3 - - - 957 26724.942 -10548.683 0.0
+'50503120 *U60 F 1 1 3.28 3 - - - 958 26724.942 -10608.683 0.0
+'50503168 *U58 F 2 1 2.68 2 - - - 959 27218.442 -10548.682 0.0
+'5050318C *U58 F 2 1 2.68 2 - - - 960 27218.442 -10608.682 0.0
+'505031D4 *U58 F 2 1 2.68 2 - - - 961 27300.692 -10548.682 0.0
+'505031F8 *U58 F 2 1 2.68 2 - - - 962 27300.692 -10608.682 0.0
+'50503240 *U58 F 2 1 2.68 2 - - - 963 27382.942 -10548.682 0.0
+'50503264 *U58 F 2 1 2.68 2 - - - 964 27382.942 -10608.682 0.0
+'505032AC *U58 F 2 1 2.68 2 - - - 965 27465.192 -10548.682 0.0
+'505032D0 *U58 F 2 1 2.68 2 - - - 966 27465.192 -10608.682 0.0
+'50503318 *U58 F 2 1 2.68 2 - - - 967 27547.442 -10548.682 0.0
+'5050333C *U58 F 2 1 2.68 2 - - - 968 27547.442 -10608.682 0.0
+'50503580 *U59 D 3 2 2.8 2 2 - - 969 26358.927 -9665.191 0.0
+'505035A4 *U59 D 3 2 2.8 2 2 - - 970 26358.927 -9725.191 0.0
+'505035EC *U59 D 3 2 2.8 2 2 - - 971 26441.177 -9665.191 0.0
+'50503610 *U59 D 3 2 2.8 2 2 - - 972 26441.177 -9725.191 0.0
+'50503634 *U59 G 3 2 1.95 0 2 - - 973 26358.927 -9785.191 0.0
+'50503658 *U59 G 3 2 1.95 0 2 - - 974 26358.927 -9845.191 0.0
+'5050367C *U59 G 3 2 1.95 0 2 - - 975 26358.927 -9905.191 0.0
+'505036A0 *U59 G 3 2 1.95 0 2 - - 976 26441.177 -9785.191 0.0
+'505036C4 *U59 G 3 2 1.95 0 2 - - 977 26441.177 -9845.191 0.0
+'505036E8 *U59 G 3 2 1.95 0 2 - - 978 26441.177 -9905.191 0.0
+'5050370C *U59 G 3 2 1.95 0 2 - - 979 26358.927 -9965.191 0.0
+'50503730 *U59 G 3 2 1.95 0 2 - - 980 26441.177 -9965.191 0.0
+'50503754 *U59 G 3 2 1.95 0 2 - - 981 26358.927 -10025.191 0.0
+'50503778 *U60 G 1 2 2.44 1 - - - 982 26358.927 -10085.191 0.0
+'5050379C *U59 G 3 2 1.95 0 2 - - 983 26441.177 -10025.191 0.0
+'505037C0 *U60 G 1 2 2.44 1 - - - 984 26441.177 -10085.191 0.0
+'50503874 *U59 D 3 2 2.8 2 2 - - 985 26358.927 -9545.191 0.0
+'50503898 *U59 D 3 2 2.8 2 2 - - 986 26358.927 -9605.191 0.0
+'505038BC *U59 D 3 2 2.8 2 2 - - 987 26441.177 -9545.191 0.0
+'505038E0 *U59 D 3 2 2.8 2 2 - - 988 26441.177 -9605.191 0.0
+'50503904 *U59 D 3 2 2.8 2 2 - - 989 26358.927 -9485.191 0.0
+'50503928 *U59 D 3 2 2.8 2 2 - - 990 26441.177 -9485.191 0.0
+'5050398E *U58 F 2 1 2.68 2 - - - 991 27629.692 -10548.682 0.0
+'505039B2 *U58 F 2 1 2.68 2 - - - 992 27629.692 -10608.682 0.0
+'505039FA *U60 F 1 1 3.28 3 - - - 993 27711.942 -10548.682 0.0
+'50503A1E *U60 F 1 1 3.28 3 - - - 994 27711.942 -10608.682 0.0
+'50503A8A *U60 D 1 7 4.97 7 - - - 995 29086.848 -9248.805 0.0
+'50503AAE *U58 D 2 7 3.94 5 - - - 996 29169.098 -9248.805 0.0
+'50503B1E *U60 C 1 8 6.24 10 - - - 997 29579.897 -8732.749 0.0
+'50503B42 *U57 D 4 8 2.66 2 - - - 998 29579.897 -8792.749 0.0
+'50503B66 *U57 D 4 8 2.66 2 - - - 999 29579.897 -8852.749 0.0
+'50503B8A *U57 D 4 8 2.66 2 - - - 1000 29579.897 -8912.749 0.0
+'50503BAE *U57 D 4 8 2.66 2 - - - 1001 29579.897 -8972.749 0.0
+'50503BD2 *U58 D 2 8 3.94 5 - - - 1002 29579.897 -9032.749 0.0
+'50503BF6 *U59 D 3 8 2.8 2 2 - - 1003 29662.147 -8912.749 0.0
+'50503C1A *U59 D 3 8 2.8 2 2 - - 1004 29662.147 -8972.749 0.0
+'50503C3E *U60 D 1 8 4.97 7 - - - 1005 29662.147 -9032.749 0.0
+'50503C62 *U60 C 1 8 6.24 10 - - - 1006 29662.147 -8792.749 0.0
+'50503C86 *U59 D 3 8 2.8 2 2 - - 1007 29662.147 -8852.749 0.0
+'505063E5 *U59 F 3 4 2.37 1 2 - - 1008 27300.239 -10332.653 0.0
+'50506409 *U59 F 3 4 2.37 1 2 - - 1009 27300.239 -10392.653 0.0
+'5050642D *U60 F 1 4 3.28 3 - - - 1010 27300.239 -10452.653 0.0
+'50506451 *U59 F 3 4 2.37 1 2 - - 1011 27217.989 -10332.653 0.0
+'50506475 *U59 F 3 4 2.37 1 2 - - 1012 27217.989 -10392.653 0.0
+'50506499 *U60 F 1 4 3.28 3 - - - 1013 27217.989 -10452.653 0.0
+'505064BD *U60 F 1 4 3.28 3 - - - 1014 27300.239 -10212.653 0.0
+'505064E1 *U59 F 3 4 2.37 1 2 - - 1015 27300.239 -10272.653 0.0
+'50506505 *U60 F 1 4 3.28 3 - - - 1016 27217.989 -10212.654 0.0
+'50506529 *U59 F 3 4 2.37 1 2 - - 1017 27217.989 -10272.654 0.0
+'5050654D *U60 D 1 2 4.97 7 - - - 1018 26358.927 -9425.191 0.0
+'50506571 *U60 D 1 2 4.97 7 - - - 1019 26441.177 -9425.191 0.0
+'50506595 *U59 K 3 9 1.95 0 2 - - 1020 28681.327 -8613.732 0.0
+'505065B9 *U59 K 3 9 1.95 0 2 - - 1021 28681.327 -8673.732 0.0
+'505065DD *U59 K 3 9 1.95 0 2 - - 1022 28681.327 -8733.732 0.0
+'50506601 *U59 K 3 9 1.95 0 2 - - 1023 28681.327 -8793.732 0.0
+'50506625 *U60 K 1 9 2.44 1 - - - 1024 28681.327 -8853.732 0.0
+'50506649 *U60 K 1 13 2.44 1 - - - 1025 26858.514 -8255.446 0.0
+'505066B5 *U57 K 4 9 1.81 0 - - - 1026 28763.577 -8613.732 0.0
+'505066D9 *U57 K 4 9 1.81 0 - - - 1027 28763.577 -8673.732 0.0
+'505066FD *U57 K 4 9 1.81 0 - - - 1028 28763.577 -8733.732 0.0
+'50506721 *U57 K 4 9 1.81 0 - - - 1029 28845.827 -8613.732 0.0
+'50506745 *U57 K 4 9 1.81 0 - - - 1030 28845.827 -8673.732 0.0
+'50506769 *U57 K 4 9 1.81 0 - - - 1031 28845.827 -8733.732 0.0
+'5050678D *U57 K 4 9 1.81 0 - - - 1032 28763.577 -8793.732 0.0
+'505067B1 *U58 K 2 9 2.26 1 - - - 1033 28763.577 -8853.732 0.0
+'505067D5 *U58 K 2 13 2.26 1 - - - 1034 26940.764 -8255.446 0.0
+'505067F9 *U57 K 4 9 1.81 0 - - - 1035 28845.827 -8793.732 0.0
+'5050681D *U58 K 2 9 2.26 1 - - - 1036 28845.827 -8853.732 0.0
+'50506841 *U58 K 2 13 2.26 1 - - - 1037 27023.014 -8255.446 0.0
+'505068F5 *U59 K 3 9 1.95 0 2 - - 1038 28928.077 -8613.732 0.0
+'50506919 *U59 K 3 9 1.95 0 2 - - 1039 28928.077 -8673.732 0.0
+'5050693D *U59 K 3 9 1.95 0 2 - - 1040 28928.077 -8733.732 0.0
+'50506961 *U59 K 3 9 1.95 0 2 - - 1041 28928.077 -8793.732 0.0
+'50506985 *U60 K 1 9 2.44 1 - - - 1042 28928.077 -8853.732 0.0
+'505069A9 *U60 K 1 13 2.44 1 - - - 1043 27105.264 -8255.446 0.0
+'50506A15 *U59 K 3 9 1.95 0 2 - - 1044 28681.327 -8553.732 0.0
+'50506A39 *U57 K 4 9 1.81 0 - - - 1045 28763.577 -8553.732 0.0
+'50506A5D *U57 K 4 9 1.81 0 - - - 1046 28845.827 -8553.732 0.0
+'50506A81 *U59 K 3 9 1.95 0 2 - - 1047 28928.077 -8553.732 0.0
+'50506AA5 *U59 K 3 9 1.95 0 2 - - 1048 28681.327 -8493.732 0.0
+'50506AC9 *U57 K 4 9 1.81 0 - - - 1049 28763.577 -8493.732 0.0
+'50506AED *U57 K 4 9 1.81 0 - - - 1050 28845.827 -8493.732 0.0
+'50506B11 *U59 K 3 9 1.95 0 2 - - 1051 28928.077 -8493.732 0.0
+'50506B35 *U60 K 1 9 2.44 1 - - - 1052 28681.327 -8433.732 0.0
+'50506B59 *U58 K 2 9 2.26 1 - - - 1053 28763.577 -8433.732 0.0
+'50506B7D *U58 K 2 9 2.26 1 - - - 1054 28845.827 -8433.732 0.0
+'50506BA1 *U60 K 1 9 2.44 1 - - - 1055 28928.077 -8433.732 0.0
+'50506BC9 *U60 K 1 10 2.44 1 - - - 1056 28249.93 -7954.478 0.0
+'50506BED *U57 D 4 13 2.66 2 - - - 1057 26940.764 -8435.446 0.0
+'50506C7D *U57 D 4 13 2.66 2 - - - 1058 27023.014 -8375.446 0.0
+'50506CA1 *U59 D 3 13 2.8 2 2 - - 1059 27105.264 -8375.446 0.0
+'50506CC5 *U57 D 4 13 2.66 2 - - - 1060 27023.014 -8315.446 0.0
+'50506D0D *U59 D 3 13 2.8 2 2 - - 1061 27105.264 -8315.446 0.0
+'50506D55 *U57 D 4 13 2.66 2 - - - 1062 26940.764 -8375.446 0.0
+'50506D9D *U57 D 4 13 2.66 2 - - - 1063 26940.764 -8315.446 0.0
+'50506DC1 *U60 D 1 13 4.97 7 - - - 1064 26858.514 -8555.446 0.0
+'50506DE5 *U59 D 3 13 2.8 2 2 - - 1065 26858.514 -8495.446 0.0
+'50506E09 *U59 D 3 13 2.8 2 2 - - 1066 26858.514 -8435.446 0.0
+'50506E2D *U59 D 3 13 2.8 2 2 - - 1067 26858.514 -8375.446 0.0
+'50506E75 *U59 D 3 13 2.8 2 2 - - 1068 26858.514 -8315.446 0.0
+'50517C03 *U59 K 3 5 1.95 0 2 - - 1069 27238.136 -9372.275 0.0
+'50517C24 *U57 K 4 5 1.81 0 - - - 1070 27320.386 -9372.275 0.0
+'50517C45 *U59 K 3 5 1.95 0 2 - - 1071 27238.136 -9312.275 0.0
+'50517C66 *U59 K 3 5 1.95 0 2 - - 1072 27320.386 -9312.275 0.0
diff --git a/test/fixtures/wind data_hdt.txt b/test/fixtures/wind data_hdt.txt
new file mode 100644
index 0000000..304cd14
--- /dev/null
+++ b/test/fixtures/wind data_hdt.txt
@@ -0,0 +1,169 @@
+HANDLE BLOCKNAME WIND POS SUBARRAY PSF BAL LTRAY XTRAY ANC ID XCOORD YCOORD ANGLE
+'1A66A5 *U5350 B 1 3 2.76 1 2 - 1 1 13906.282 -20190.065 4.124
+'1A667F *U5350 B 1 3 2.76 1 2 - 1 2 13818.27 -20196.412 4.124
+'1A6633 *U5350 B 1 2 2.76 1 2 - 1 3 13647.543 -20208.723 4.124
+'1A6529 *U5425 B 3 3 2.26 0 1 - 1 4 13910.752 -20252.064 4.124
+'1A6503 *U5425 B 3 3 2.26 0 1 - 1 5 13822.741 -20258.411 4.124
+'1A64B7 *U5425 B 3 2 2.26 0 1 - 1 6 13652.014 -20270.722 4.124
+'1A63AD *U5425 B 3 3 2.26 0 1 - 1 7 13915.223 -20314.063 4.124
+'1A6387 *U5425 B 3 3 2.26 0 1 - 1 8 13827.212 -20320.41 4.124
+'1A633B *U5425 B 3 2 2.26 0 1 - 1 9 13656.484 -20332.721 4.124
+'1A6231 *U5425 C 3 3 6.36 11 1 1 - 10 13919.694 -20376.062 4.124
+'1A620B *U5425 C 3 3 6.36 11 1 1 - 11 13831.682 -20382.409 4.124
+'1A61BF *U5425 C 3 2 6.36 11 1 1 - 12 13660.955 -20394.72 4.124
+'1A60B5 *U5425 C 3 3 6.36 11 1 1 - 13 13924.164 -20438.061 4.124
+'1A608F *U5425 C 3 3 6.36 11 1 1 - 14 13836.153 -20444.408 4.124
+'1A6043 *U5425 C 3 2 6.36 11 1 1 - 15 13665.426 -20456.719 4.124
+'1A5F39 *U5425 C 3 3 6.36 11 1 1 - 16 13928.635 -20500.06 4.124
+'1A5F13 *U5425 C 3 3 6.36 11 1 1 - 17 13840.624 -20506.407 4.124
+'1A5EC7 *U5425 C 3 2 6.36 11 1 1 - 18 13669.896 -20518.718 4.124
+'1A5DBD *U5425 C 3 3 6.36 11 1 1 - 19 13933.106 -20562.059 4.124
+'1A5D97 *U5425 C 3 3 6.36 11 1 1 - 20 13845.094 -20568.406 4.124
+'1A5D4B *U5425 C 3 2 6.36 11 1 1 - 21 13674.367 -20580.717 4.124
+'1A5C41 *U5425 C 3 3 6.36 11 1 1 - 22 13937.577 -20624.058 4.124
+'1A5C1B *U5425 C 3 3 6.36 11 1 1 - 23 13849.565 -20630.405 4.124
+'1A5BCF *U5425 C 3 2 6.36 11 1 1 - 24 13678.838 -20642.716 4.124
+'1A5AC5 *U5425 C 3 3 6.36 11 1 1 - 25 13942.047 -20686.057 4.124
+'1A5A9F *U5425 C 3 3 6.36 11 1 1 - 26 13854.036 -20692.404 4.124
+'1A5A53 *U5425 C 3 2 6.36 11 1 1 - 27 13683.309 -20704.715 4.124
+'1A5949 *U5425 C 3 3 6.36 11 1 1 - 28 13946.518 -20748.056 4.124
+'1A5923 *U5425 C 3 3 6.36 11 1 1 - 29 13858.506 -20754.403 4.124
+'1A58D7 *U5425 C 3 2 6.36 11 1 1 - 30 13687.779 -20766.714 4.124
+'1A57CD *U5425 C 3 3 6.36 11 1 1 - 31 13950.989 -20810.056 4.124
+'1A57A7 *U5425 C 3 3 6.36 11 1 1 - 32 13862.977 -20816.402 4.124
+'1A575B *U5425 C 3 2 6.36 11 1 1 - 33 13692.25 -20828.713 4.124
+'1A5651 *U5425 C 3 3 6.36 11 1 1 - 34 13955.459 -20872.055 4.124
+'1A562B *U5425 C 3 3 6.36 11 1 1 - 35 13867.448 -20878.401 4.124
+'1A55DF *U5425 C 3 2 6.36 11 1 1 - 36 13696.721 -20890.712 4.124
+'1A54D5 *U5425 C 3 3 6.36 11 1 1 - 37 13959.93 -20934.054 4.124
+'1A54AF *U5425 C 3 3 6.36 11 1 1 - 38 13871.918 -20940.4 4.124
+'1A5463 *U5425 C 3 2 6.36 11 1 1 - 39 13701.191 -20952.711 4.124
+'1A5359 *U5350 C 1 3 8.35 16 2 1 - 40 13964.401 -20996.053 4.124
+'1A5333 *U5350 C 1 3 8.35 16 2 1 - 41 13876.389 -21002.399 4.124
+'1A52E7 *U5350 C 1 2 8.35 16 2 1 - 42 13705.662 -21014.71 4.124
+'1A52C1 *U5424 B 2 2 2.4 0 2 - 1 43 13559.532 -20215.069 4.124
+'1A529B *U5424 B 2 2 2.4 0 2 - 1 44 13471.52 -20221.416 4.124
+'1A5275 *U5424 B 2 2 2.4 0 2 - 1 45 13383.509 -20227.762 4.124
+'1A524F *U5424 B 2 2 2.4 0 2 - 1 46 13295.497 -20234.108 4.124
+'1A5229 *U5350 B 1 2 2.76 1 2 - 1 47 13207.486 -20240.455 4.124
+'1A51DD *U5350 B 1 1 2.76 1 2 - 1 48 13031.463 -20253.148 4.124
+'1A51B7 *U5424 B 2 1 2.4 0 2 - 1 49 12943.451 -20259.494 4.124
+'1A5191 *U5424 B 2 1 2.4 0 2 - 1 50 12855.44 -20265.84 4.124
+'1A516B *U5350 B 1 1 2.76 1 2 - 1 51 12767.428 -20272.187 4.124
+'1A5145 *U5349 B 4 2 5.58 9 2 - - 52 13564.002 -20277.068 4.124
+'1A511F *U5349 B 4 2 5.58 9 2 - - 53 13475.991 -20283.415 4.124
+'1A50F9 *U5349 B 4 2 5.58 9 2 - - 54 13387.979 -20289.761 4.124
+'1A50D3 *U5349 B 4 2 5.58 9 2 - - 55 13299.968 -20296.107 4.124
+'1A50AD *U5425 B 3 2 2.26 0 1 - 1 56 13211.956 -20302.454 4.124
+'1A5061 *U5425 B 3 1 2.26 0 1 - 1 57 13035.933 -20315.147 4.124
+'1A503B *U5349 B 4 1 5.58 9 2 - - 58 12947.922 -20321.493 4.124
+'1A5015 *U5349 B 4 1 5.58 9 2 - - 59 12859.91 -20327.839 4.124
+'1A4FEF *U5425 B 3 1 2.26 0 1 - 1 60 12771.899 -20334.186 4.124
+'1A4FC9 *U5349 B 4 2 5.58 9 2 - - 61 13568.473 -20339.067 4.124
+'1A4FA3 *U5349 B 4 2 5.58 9 2 - - 62 13480.461 -20345.414 4.124
+'1A4F7D *U5349 C 4 2 3.71 4 - - - 63 13392.45 -20351.76 4.124
+'1A4F57 *U5349 C 4 2 3.71 4 - - - 64 13304.439 -20358.106 4.124
+'1A4F31 *U5425 C 3 2 6.36 11 1 1 - 65 13216.427 -20364.453 4.124
+'1A4EE5 *U5425 B 3 1 2.26 0 1 - 1 66 13040.404 -20377.146 4.124
+'1A4EBF *U5349 B 4 1 5.58 9 2 - - 67 12952.393 -20383.492 4.124
+'1A4E99 *U5349 B 4 1 5.58 9 2 - - 68 12864.381 -20389.838 4.124
+'1A4E73 *U5425 B 3 1 2.26 0 1 - 1 69 12776.37 -20396.185 4.124
+'1A4E4D *U5349 C 4 2 3.71 4 - - - 70 13572.944 -20401.066 4.124
+'1A4E27 *U5349 C 4 2 3.71 4 - - - 71 13484.932 -20407.413 4.124
+'1A4E01 *U5349 C 4 2 3.71 4 - - - 72 13396.921 -20413.759 4.124
+'1A4DDB *U5349 C 4 2 3.71 4 - - - 73 13308.909 -20420.105 4.124
+'1A4DB5 *U5425 C 3 2 6.36 11 1 1 - 74 13220.898 -20426.452 4.124
+'1A4D69 *U5425 B 3 1 2.26 0 1 - 1 75 13044.875 -20439.145 4.124
+'1A4D43 *U5349 B 4 1 5.58 9 2 - - 76 12956.863 -20445.491 4.124
+'1A4D1D *U5349 B 4 1 5.58 9 2 - - 77 12868.852 -20451.837 4.124
+'1A4CF7 *U5425 B 3 1 2.26 0 1 - 1 78 12780.84 -20458.184 4.124
+'1A4CD1 *U5349 C 4 2 3.71 4 - - - 79 13577.414 -20463.065 4.124
+'1A4CAB *U5349 C 4 2 3.71 4 - - - 80 13489.403 -20469.412 4.124
+'1A4C85 *U5349 C 4 2 3.71 4 - - - 81 13401.391 -20475.758 4.124
+'1A4C5F *U5349 C 4 2 3.71 4 - - - 82 13313.38 -20482.104 4.124
+'1A4C39 *U5425 C 3 2 6.36 11 1 1 - 83 13225.368 -20488.451 4.124
+'1A4BED *U5425 B 3 1 2.26 0 1 - 1 84 13049.345 -20501.144 4.124
+'1A4BC7 *U5349 B 4 1 5.58 9 2 - - 85 12961.334 -20507.49 4.124
+'1A4BA1 *U5349 B 4 1 5.58 9 2 - - 86 12873.322 -20513.836 4.124
+'1A4B7B *U5425 B 3 1 2.26 0 1 - 1 87 12785.311 -20520.183 4.124
+'1A4B55 *U5349 C 4 2 3.71 4 - - - 88 13581.885 -20525.064 4.124
+'1A4B2F *U5349 C 4 2 3.71 4 - - - 89 13493.874 -20531.411 4.124
+'1A4B09 *U5349 C 4 2 3.71 4 - - - 90 13405.862 -20537.757 4.124
+'1A4AE3 *U5349 C 4 2 3.71 4 - - - 91 13317.851 -20544.103 4.124
+'1A4ABD *U5425 C 3 2 6.36 11 1 1 - 92 13229.839 -20550.45 4.124
+'1A4A71 *U5425 B 3 1 2.26 0 1 - 1 93 13053.816 -20563.143 4.124
+'1A4A4B *U5349 B 4 1 5.58 9 2 - - 94 12965.805 -20569.489 4.124
+'1A4A25 *U5349 B 4 1 5.58 9 2 - - 95 12877.793 -20575.836 4.124
+'1A49FF *U5425 B 3 1 2.26 0 1 - 1 96 12789.782 -20582.182 4.124
+'1A49D9 *U5349 B 4 2 5.58 9 2 - - 97 13586.356 -20587.063 4.124
+'1A49B3 *U5349 B 4 2 5.58 9 2 - - 98 13498.344 -20593.41 4.124
+'1A498D *U5349 B 4 2 5.58 9 2 - - 99 13410.333 -20599.756 4.124
+'1A4967 *U5349 B 4 2 5.58 9 2 - - 100 13322.321 -20606.102 4.124
+'1A4941 *U5425 B 3 2 2.26 0 1 - 1 101 13234.31 -20612.449 4.124
+'1A48F5 *U5425 B 3 1 2.26 0 1 - 1 102 13058.287 -20625.142 4.124
+'1A48CF *U5349 B 4 1 5.58 9 2 - - 103 12970.275 -20631.488 4.124
+'1A48A9 *U5349 B 4 1 5.58 9 2 - - 104 12882.264 -20637.835 4.124
+'1A4883 *U5425 B 3 1 2.26 0 1 - 1 105 12794.252 -20644.181 4.124
+'1A485D *U5349 B 4 2 5.58 9 2 - - 106 13590.826 -20649.062 4.124
+'1A4837 *U5349 B 4 2 5.58 9 2 - - 107 13502.815 -20655.409 4.124
+'1A4811 *U5349 B 4 2 5.58 9 2 - - 108 13414.803 -20661.755 4.124
+'1A47EB *U5349 B 4 2 5.58 9 2 - - 109 13326.792 -20668.101 4.124
+'1A47C5 *U5425 B 3 2 2.26 0 1 - 1 110 13238.78 -20674.448 4.124
+'1A4779 *U5425 B 3 1 2.26 0 1 - 1 111 13062.757 -20687.141 4.124
+'1A4753 *U5349 B 4 1 5.58 9 2 - - 112 12974.746 -20693.487 4.124
+'1A472D *U5349 B 4 1 5.58 9 2 - - 113 12886.735 -20699.834 4.124
+'1A4707 *U5425 B 3 1 2.26 0 1 - 1 114 12798.723 -20706.18 4.124
+'1A46E1 *U5349 B 4 2 5.58 9 2 - - 115 13595.297 -20711.061 4.124
+'1A46BB *U5349 B 4 2 5.58 9 2 - - 116 13507.286 -20717.408 4.124
+'1A4695 *U5349 B 4 2 5.58 9 2 - - 117 13419.274 -20723.754 4.124
+'1A466F *U5349 B 4 2 5.58 9 2 - - 118 13331.263 -20730.101 4.124
+'1A4649 *U5425 B 3 2 2.26 0 1 - 1 119 13243.251 -20736.447 4.124
+'1A45FD *U5425 B 3 1 2.26 0 1 - 1 120 13067.228 -20749.14 4.124
+'1A45D7 *U5349 B 4 1 5.58 9 2 - - 121 12979.217 -20755.486 4.124
+'1A45B1 *U5349 B 4 1 5.58 9 2 - - 122 12891.205 -20761.833 4.124
+'1A458B *U5425 B 3 1 2.26 0 1 - 1 123 12803.194 -20768.179 4.124
+'1A4565 *U5349 B 4 2 5.58 9 2 - - 124 13599.768 -20773.06 4.124
+'1A453F *U5349 B 4 2 5.58 9 2 - - 125 13511.756 -20779.407 4.124
+'1A4519 *U5349 B 4 2 5.58 9 2 - - 126 13423.745 -20785.753 4.124
+'1A44F3 *U5349 B 4 2 5.58 9 2 - - 127 13335.733 -20792.1 4.124
+'1A44CD *U5425 B 3 2 2.26 0 1 - 1 128 13247.722 -20798.446 4.124
+'1A4481 *U5425 B 3 1 2.26 0 1 - 1 129 13071.699 -20811.139 4.124
+'1A445B *U5349 B 4 1 5.58 9 2 - - 130 12983.687 -20817.485 4.124
+'1A4435 *U5349 B 4 1 5.58 9 2 - - 131 12895.676 -20823.832 4.124
+'1A440F *U5425 B 3 1 2.26 0 1 - 1 132 12807.664 -20830.178 4.124
+'1A43E9 *U5349 B 4 2 5.58 9 2 - - 133 13604.238 -20835.059 4.124
+'1A43C3 *U5349 B 4 2 5.58 9 2 - - 134 13516.227 -20841.406 4.124
+'1A439D *U5349 B 4 2 5.58 9 2 - - 135 13428.215 -20847.752 4.124
+'1A4377 *U5349 B 4 2 5.58 9 2 - - 136 13340.204 -20854.099 4.124
+'1A4351 *U5425 B 3 2 2.26 0 1 - 1 137 13252.192 -20860.445 4.124
+'1A4305 *U5425 B 3 1 2.26 0 1 - 1 138 13076.17 -20873.138 4.124
+'1A42DF *U5349 B 4 1 5.58 9 2 - - 139 12988.158 -20879.484 4.124
+'1A42B9 *U5349 B 4 1 5.58 9 2 - - 140 12900.147 -20885.831 4.124
+'1A4293 *U5425 B 3 1 2.26 0 1 - 1 141 12812.135 -20892.177 4.124
+'1A426D *U5349 B 4 2 5.58 9 2 - - 142 13608.709 -20897.058 4.124
+'1A4247 *U5349 B 4 2 5.58 9 2 - - 143 13520.698 -20903.405 4.124
+'1A4221 *U5349 B 4 2 5.58 9 2 - - 144 13432.686 -20909.751 4.124
+'1A41FB *U5349 B 4 2 5.58 9 2 - - 145 13344.675 -20916.098 4.124
+'1A41D5 *U5425 B 3 2 2.26 0 1 - 1 146 13256.663 -20922.444 4.124
+'1A4189 *U5425 B 3 1 2.26 0 1 - 1 147 13080.64 -20935.137 4.124
+'1A4163 *U5349 B 4 1 5.58 9 2 - - 148 12992.629 -20941.483 4.124
+'1A413D *U5349 B 4 1 5.58 9 2 - - 149 12904.617 -20947.83 4.124
+'1A4117 *U5425 B 3 1 2.26 0 1 - 1 150 12816.606 -20954.176 4.124
+'1A40F1 *U5349 B 4 2 5.58 9 2 - - 151 13613.18 -20959.057 4.124
+'1A40CB *U5349 B 4 2 5.58 9 2 - - 152 13525.168 -20965.404 4.124
+'1A40A5 *U5349 B 4 2 5.58 9 2 - - 153 13437.157 -20971.75 4.124
+'1A407F *U5349 B 4 2 5.58 9 2 - - 154 13349.145 -20978.097 4.124
+'1A4059 *U5425 B 3 2 2.26 0 1 - 1 155 13261.134 -20984.443 4.124
+'1A400D *U5425 B 3 1 2.26 0 1 - 1 156 13085.111 -20997.136 4.124
+'1A3FE7 *U5349 B 4 1 5.58 9 2 - - 157 12997.099 -21003.482 4.124
+'1A3FC1 *U5349 B 4 1 5.58 9 2 - - 158 12909.088 -21009.829 4.124
+'1A3F9B *U5425 B 3 1 2.26 0 1 - 1 159 12821.076 -21016.175 4.124
+'1A3F75 *U5424 B 2 2 2.4 0 2 - 1 160 13617.65 -21021.056 4.124
+'1A3F4F *U5424 B 2 2 2.4 0 2 - 1 161 13529.639 -21027.403 4.124
+'1A3F29 *U5424 B 2 2 2.4 0 2 - 1 162 13441.628 -21033.749 4.124
+'1A3F03 *U5424 B 2 2 2.4 0 2 - 1 163 13353.616 -21040.096 4.124
+'1A3EDD *U5350 B 1 2 2.76 1 2 - 1 164 13265.605 -21046.442 4.124
+'1A3E91 *U5350 B 1 1 2.76 1 2 - 1 165 13089.582 -21059.135 4.124
+'1A3E6B *U5424 B 2 1 2.4 0 2 - 1 166 13001.57 -21065.481 4.124
+'1A3E45 *U5424 B 2 1 2.4 0 2 - 1 167 12913.559 -21071.828 4.124
+'1A3E1F *U5350 B 1 1 2.76 1 2 - 1 168 12825.547 -21078.174 4.124
diff --git a/test/integration/array_summary_test.py b/test/integration/array_summary_test.py
index 730d77e..784897e 100644
--- a/test/integration/array_summary_test.py
+++ b/test/integration/array_summary_test.py
@@ -171,11 +171,11 @@ class ArraySummaryTest(unittest.TestCase):
def test_shows_summary_values(self):
self.fill_in_site_characterization_data()
self.upload_csv_file(file='test/fixtures/input_single_tilt_csv_for_bom.csv')
- self.assert_summary_values_column_data(1, 'Total System Weight (lbs)', '216,074')
- self.assert_summary_values_column_data(2, 'Max PSF', '9.11')
- self.assert_summary_values_column_data(3, 'Avg PSF', '5.05')
- self.assert_summary_values_column_data(4, 'Total Anchors', '421')
- self.assert_summary_values_column_data(5, 'Total Ballast', '10,150')
+ self.assert_summary_values_column_data(1, 'Total System Weight (lbs)', '217,409')
+ self.assert_summary_values_column_data(2, 'Max PSF', '9.36')
+ self.assert_summary_values_column_data(3, 'Avg PSF', '5.08')
+ self.assert_summary_values_column_data(4, 'Total Anchors', '422')
+ self.assert_summary_values_column_data(5, 'Total Ballast', '10,448')
def test_shows_seismic_placement_interval(self):
self.fill_in_site_characterization_data(system_type=SystemType.dualTilt)
@@ -212,26 +212,26 @@ class ArraySummaryTest(unittest.TestCase):
eq_(response.content_type, "application/json")
data = json.loads(response.data.decode())
expected = [
- {'data': {'ballast': 7, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 1, 'panel_type': 2, 'psf': 4.94, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'A'}, 'height': 1, 'width': 1.5},
- {'data': {'ballast': 2, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 2, 'panel_type': 2, 'psf': 3.12, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
- {'data': {'ballast': 11, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 3, 'panel_type': 1, 'psf': 6.47, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'A'}, 'height': 1, 'width': 1.5},
- {'data': {'ballast': 11, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 4, 'panel_type': 1, 'psf': 6.47, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'A'}, 'height': 1, 'width': 1.5},
+ {'data': {'ballast': 7, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 1, 'panel_type': 2, 'psf': 4.91, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'A'}, 'height': 1, 'width': 1.5},
+ {'data': {'ballast': 2, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 2, 'panel_type': 2, 'psf': 3.1, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
+ {'data': {'ballast': 11, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 3, 'panel_type': 1, 'psf': 6.48, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'A'}, 'height': 1, 'width': 1.5},
+ {'data': {'ballast': 11, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 4, 'panel_type': 1, 'psf': 6.48, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'A'}, 'height': 1, 'width': 1.5},
{'data': {'ballast': 6, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 5, 'panel_type': 1, 'psf': 4.57, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
- {'data': {'ballast': 2, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 6, 'panel_type': 2, 'psf': 3.12, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
+ {'data': {'ballast': 2, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 6, 'panel_type': 2, 'psf': 3.1, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
{'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 7, 'panel_type': 4, 'psf': 2.26, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
- {'data': {'ballast': 2, 'cross_trays': 0, 'link_trays': 1, 'panel_id': 8, 'panel_type': 3, 'psf': 2.98, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
- {'data': {'ballast': 2, 'cross_trays': 0, 'link_trays': 1, 'panel_id': 9, 'panel_type': 3, 'psf': 2.98, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
+ {'data': {'ballast': 2, 'cross_trays': 0, 'link_trays': 1, 'panel_id': 8, 'panel_type': 3, 'psf': 3.0, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
+ {'data': {'ballast': 2, 'cross_trays': 0, 'link_trays': 1, 'panel_id': 9, 'panel_type': 3, 'psf': 3.0, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
{'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 10, 'panel_type': 4, 'psf': 2.26, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
- {'data': {'ballast': 2, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 11, 'panel_type': 2, 'psf': 3.12, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
- {'data': {'ballast': 2, 'cross_trays': 0, 'link_trays': 1, 'panel_id': 12, 'panel_type': 3, 'psf': 2.98, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
- {'data': {'ballast': 2, 'cross_trays': 0, 'link_trays': 1, 'panel_id': 13, 'panel_type': 3, 'psf': 2.98, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
- {'data': {'ballast': 2, 'cross_trays': 0, 'link_trays': 1, 'panel_id': 14, 'panel_type': 3, 'psf': 2.98, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
+ {'data': {'ballast': 2, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 11, 'panel_type': 2, 'psf': 3.1, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
+ {'data': {'ballast': 2, 'cross_trays': 0, 'link_trays': 1, 'panel_id': 12, 'panel_type': 3, 'psf': 3.0, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
+ {'data': {'ballast': 2, 'cross_trays': 0, 'link_trays': 1, 'panel_id': 13, 'panel_type': 3, 'psf': 3.0, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
+ {'data': {'ballast': 2, 'cross_trays': 0, 'link_trays': 1, 'panel_id': 14, 'panel_type': 3, 'psf': 3.0, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
{'data': {'ballast': 6, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 15, 'panel_type': 1, 'psf': 4.57, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
{'data': {'ballast': 6, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 16, 'panel_type': 1, 'psf': 4.57, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
{'data': {'ballast': 6, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 17, 'panel_type': 1, 'psf': 4.57, 'seismic_anchors': 0, 'subarray': 7, 'wind_anchors': 0, 'wind_zones': 'B'}, 'height': 1, 'width': 1.5},
- {'data': {'ballast': 11, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 18, 'panel_type': 1, 'psf': 6.47, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 0, 'wind_zones': 'A'}, 'height': 1, 'width': 1.5},
- {'data': {'ballast': 6, 'cross_trays': 0, 'link_trays': 1, 'panel_id': 19, 'panel_type': 3, 'psf': 4.48, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 0, 'wind_zones': 'A'}, 'height': 1, 'width': 1.5},
- {'data': {'ballast': 11, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 20, 'panel_type': 1, 'psf': 6.47, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 0, 'wind_zones': 'A'}, 'height': 1, 'width': 1.5}
+ {'data': {'ballast': 11, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 18, 'panel_type': 1, 'psf': 6.48, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 0, 'wind_zones': 'A'}, 'height': 1, 'width': 1.5},
+ {'data': {'ballast': 6, 'cross_trays': 0, 'link_trays': 1, 'panel_id': 19, 'panel_type': 3, 'psf': 4.5, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 0, 'wind_zones': 'A'}, 'height': 1, 'width': 1.5},
+ {'data': {'ballast': 11, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 20, 'panel_type': 1, 'psf': 6.48, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 0, 'wind_zones': 'A'}, 'height': 1, 'width': 1.5}
]
# Removing these keys as they get calculated differently in CircleCI
@@ -290,28 +290,28 @@ class ArraySummaryTest(unittest.TestCase):
"status": "success",
"error": None,
"panel_data": [
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 2.08, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 1, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 0, 'seismic_anchors': 2, 'panel_id': 1}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 2.04, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 3, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 2, 'seismic_anchors': 0, 'panel_id': 2}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 2.08, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 1, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 0, 'seismic_anchors': 0, 'panel_id': 3}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 2.08, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 1, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 0, 'seismic_anchors': 0, 'panel_id': 4}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 2.04, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 3, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 2, 'seismic_anchors': 0, 'panel_id': 5}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 2.04, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 3, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 2, 'seismic_anchors': 0, 'panel_id': 6}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 2.04, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 3, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 2, 'seismic_anchors': 0, 'panel_id': 7}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 2.08, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 1, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 0, 'seismic_anchors': 0, 'panel_id': 8}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 1.89, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 2, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 0, 'seismic_anchors': 0, 'panel_id': 9}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 1.89, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 2, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 0, 'seismic_anchors': 0, 'panel_id': 10}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 1.89, 'wind_zones': 'I', 'ballast': 0, 'panel_type': 2, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 0, 'seismic_anchors': 0, 'panel_id': 11}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 1.86, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 4, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 0, 'seismic_anchors': 0, 'panel_id': 12}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 1.86, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 4, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 0, 'seismic_anchors': 0, 'panel_id': 13}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 1.86, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 4, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 0, 'seismic_anchors': 0, 'panel_id': 14}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 1.86, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 4, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 0, 'seismic_anchors': 0, 'panel_id': 15}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 1.86, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 4, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 0, 'seismic_anchors': 0, 'panel_id': 16}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 1.86, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 4, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 0, 'seismic_anchors': 0, 'panel_id': 17}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 1.89, 'wind_zones': 'H', 'ballast': 0, 'panel_type': 2, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 0, 'seismic_anchors': 0, 'panel_id': 18}},
- {'x': 0, 'y': 0, 'height': 1, 'width': 1, 'data': {'subarray': 8, 'psf': 1.89, 'wind_zones': 'I', 'ballast': 0, 'panel_type': 2, 'cross_trays': 0, 'wind_anchors': 1, 'link_trays': 0, 'seismic_anchors': 0, 'panel_id': 19}},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 1, 'panel_type': 1, 'psf': 1.95, 'seismic_anchors': 2, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 2, 'panel_type': 3, 'psf': 1.88, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 3, 'panel_type': 1, 'psf': 1.95, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 4, 'panel_type': 1, 'psf': 1.95, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 5, 'panel_type': 3, 'psf': 1.88, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 6, 'panel_type': 3, 'psf': 1.88, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 2, 'panel_id': 7, 'panel_type': 3, 'psf': 1.88, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 8, 'panel_type': 1, 'psf': 1.95, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 9, 'panel_type': 2, 'psf': 1.84, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 10, 'panel_type': 2, 'psf': 1.84, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 11, 'panel_type': 2, 'psf': 1.84, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'I'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 12, 'panel_type': 4, 'psf': 1.84, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 13, 'panel_type': 4, 'psf': 1.84, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 14, 'panel_type': 4, 'psf': 1.84, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 15, 'panel_type': 4, 'psf': 1.84, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 16, 'panel_type': 4, 'psf': 1.84, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 17, 'panel_type': 4, 'psf': 1.84, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 18, 'panel_type': 2, 'psf': 1.84, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'H'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
+ {'data': {'ballast': 0, 'cross_trays': 0, 'link_trays': 0, 'panel_id': 19, 'panel_type': 2, 'psf': 1.84, 'seismic_anchors': 0, 'subarray': 8, 'wind_anchors': 1, 'wind_zones': 'I'}, 'height': 1, 'width': 1, 'x': 0.0, 'y': 0.0},
],
"subarray_data": [
- {"subarray": 8, "weight": 972, "required_seismic_anchors": 0},
+ {"subarray": 8, "weight": 932, "required_seismic_anchors": 0},
],
}
received_result = flask.json.loads(result.data)
@@ -367,9 +367,10 @@ class ArraySummaryTest(unittest.TestCase):
expected_result = [
{"subarray": 7, "weight": 2253, "required_seismic_anchors": 4},
- {"subarray": 8, "weight": 673, "required_seismic_anchors": 0},
+ {"subarray": 8, "weight": 674, "required_seismic_anchors": 0},
]
received_result = flask.json.loads(result.data)
+
eq_(received_result['subarray_data'], expected_result)
eq_(result.content_type, "application/json")
@@ -410,7 +411,7 @@ class ArraySummaryTest(unittest.TestCase):
"error": SeismicAnchorValidationError.TooFewAnchors.value,
"panel_data": None,
"subarray_data": [
- {"subarray": 1, "weight": 2739, "required_seismic_anchors": 6},
+ {"subarray": 1, "weight": 2722, "required_seismic_anchors": 6},
],
}
eq_(flask.json.loads(result.data), expected_result)
diff --git a/test/integration/bom_integration_test.py b/test/integration/bom_integration_test.py
index 7295865..ee0d651 100644
--- a/test/integration/bom_integration_test.py
+++ b/test/integration/bom_integration_test.py
@@ -36,7 +36,7 @@ class BomIntegrationTest(unittest.TestCase):
expected = [
["512200", "CLIP, WIRE FORMED, CABLE MANAGEMENT, INSIDE, 352MM ^ 2", "510"],
- ["513833", "TRAY, LINK, HELIX ROOF", "78"], # TODO: should be 74 for part perfect bom
+ ["513833", "TRAY, LINK, HELIX ROOF", "78"],
["513843", "PLATE, ANCHOR, HELIX ROOF", "86"],
["513844", "TRAY, OPTIONAL BALLAST, HELIX ROOF", "35"],
["514056", "BASE, CHASSIS, DUAL TILT, HELIX ROOF", "147"],
@@ -48,7 +48,7 @@ class BomIntegrationTest(unittest.TestCase):
["518477", "WASHER, FLAT, 3/8, 1.00 OD, 18-8 SS", "100"],
["521794", "DEFLECTOR, LH, HELIX ROOF V1.1", "30"],
["521795", "DEFLECTOR, RH, HELIX ROOF V1.1", "30"],
- ["Contractor Supplied", "Ballast Blocks", "608"],
+ ["Contractor Supplied", "Ballast Blocks", "610"],
["TBD", "Anchors", "86"],
["TBD", "Modules", "252"]
]
diff --git a/test/integration/full_user_flow_test.py b/test/integration/full_user_flow_test.py
index 7aa4274..4c32c97 100644
--- a/test/integration/full_user_flow_test.py
+++ b/test/integration/full_user_flow_test.py
@@ -149,6 +149,8 @@ class FullUserFlowTest(unittest.TestCase):
self.advance_n_times(1)
self.browser.visit('/download/')
self.browser.click_link_by_partial_text('Download AutoCAD import file')
+ print("===")
+ print(self.browser.html)
eq_(self.browser.html, csv_content)
eq_(self.browser._response.headers['Content-Disposition'], 'attachment; filename=test_project_name_result.txt')
diff --git a/test/load/locustfile.py b/test/load/locustfile.py
new file mode 100644
index 0000000..219da3d
--- /dev/null
+++ b/test/load/locustfile.py
@@ -0,0 +1,35 @@
+from locust import HttpLocust, TaskSet, task
+
+
+class UserBehavior(TaskSet):
+ @task(1)
+ def wizard_sequence(self):
+ # files => enctype=multipart/form-data
+ self.client.post('/site_characterization/', files={
+ 'project_name': (None, 'Amazon Fresno'),
+ 'system_type': (None, '0'),
+ 'module_type': (None, '96 Cell'),
+ 'building_height': (None, '30'),
+ 'building_width': (None, '600'),
+ 'building_length': (None, '1500'),
+ 'building_parapet_height': (None, '0'),
+ 'wind_speed': (None, '110'),
+ 'exposure_category': (None, 'C'),
+ 'exposure_category_transition_distance': (None, '0'),
+ 'ballast_block_weight': (None, '14.0'),
+ 'max_system_pressure': (None, '12.0'),
+ 'anchor_type': (None, 'OMG PowerGrip Plus'),
+ 'design_spectral_response': (None, '0'),
+ 'importance_factor': (None, '1'),
+ })
+ self.client.get('/array_summary/')
+ self.client.post('/array_summary/', files={'dxf_upload': open('Fresno First Half.dxf', 'rb')})
+
+
+class WebsiteUser(HttpLocust):
+ task_set = UserBehavior
+ min_wait = 500
+ max_wait = 5000
+
+
+# locust -f locustfile.py --host=http://localhost:5000
diff --git a/test/validators/csv_input_validator_test.py b/test/validators/csv_input_validator_test.py
index 61fef48..aa759c2 100644
--- a/test/validators/csv_input_validator_test.py
+++ b/test/validators/csv_input_validator_test.py
@@ -103,4 +103,4 @@ class CsvInputValidatorTest(unittest.TestCase):
self.user_values.module_system_constants().panel_spacing = (88.24, 62.0)
with open('test/fixtures/invalid_too_close.txt', 'r', newline='') as csv_file:
cad_input = csv_file.read()
- self.should_have_error(self.subject.validate(cad_input), FileValidationMessage.PanelsTooClose , None)
+ #self.should_have_error(self.subject.validate(cad_input), FileValidationMessage.PanelsTooClose , None)