NREL-erad 0.0.0a0__py3-none-any.whl → 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. erad/__init__.py +1 -0
  2. erad/constants.py +20 -20
  3. erad/cypher_queries/load_data_v1.cypher +211 -211
  4. erad/data/World_Earthquakes_1960_2016.csv +23410 -23410
  5. erad/db/assets/critical_infras.py +170 -170
  6. erad/db/assets/distribution_lines.py +101 -101
  7. erad/db/credential_model.py +20 -20
  8. erad/db/disaster_input_model.py +23 -23
  9. erad/db/inject_earthquake.py +52 -52
  10. erad/db/inject_flooding.py +53 -53
  11. erad/db/neo4j_.py +162 -162
  12. erad/db/utils.py +13 -13
  13. erad/exceptions.py +68 -68
  14. erad/metrics/check_microgrid.py +208 -208
  15. erad/metrics/metric.py +178 -178
  16. erad/programs/backup.py +61 -61
  17. erad/programs/microgrid.py +44 -44
  18. erad/scenarios/abstract_scenario.py +102 -102
  19. erad/scenarios/common.py +92 -92
  20. erad/scenarios/earthquake_scenario.py +161 -161
  21. erad/scenarios/fire_scenario.py +160 -160
  22. erad/scenarios/flood_scenario.py +493 -493
  23. erad/scenarios/flows.csv +671 -0
  24. erad/scenarios/utilities.py +75 -75
  25. erad/scenarios/wind_scenario.py +89 -89
  26. erad/utils/ditto_utils.py +252 -252
  27. erad/utils/hifld_utils.py +147 -147
  28. erad/utils/opendss_utils.py +357 -357
  29. erad/utils/overpass.py +76 -76
  30. erad/utils/util.py +178 -178
  31. erad/visualization/plot_graph.py +218 -218
  32. {NREL_erad-0.0.0a0.dist-info → nrel_erad-1.0.0.dist-info}/METADATA +65 -61
  33. nrel_erad-1.0.0.dist-info/RECORD +42 -0
  34. {NREL_erad-0.0.0a0.dist-info → nrel_erad-1.0.0.dist-info}/WHEEL +1 -2
  35. {NREL_erad-0.0.0a0.dist-info → nrel_erad-1.0.0.dist-info/licenses}/LICENSE.txt +28 -28
  36. NREL_erad-0.0.0a0.dist-info/RECORD +0 -42
  37. NREL_erad-0.0.0a0.dist-info/top_level.txt +0 -1
erad/__init__.py CHANGED
@@ -0,0 +1 @@
1
+ __version__ = "1.0.0"
erad/constants.py CHANGED
@@ -1,20 +1,20 @@
1
- """ Module for managing constants in ERAD package.
2
-
3
- _Do not change this constants in your code._
4
- """
5
-
6
- import os
7
-
8
- ROOT_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
9
- DATA_FOLDER_NAME = "data"
10
- DATA_FOLDER = os.path.join(ROOT_PATH, DATA_FOLDER_NAME)
11
-
12
- FIRE_HISTORIC_GEODATAFRAME_PATH = "US_Wildfires_1878_2019.gdb"
13
- EARTHQUAKE_HISTORIC_CSV_PATH = "World_Earthquakes_1960_2016.csv"
14
- FLOOD_HISTORIC_SHP_PATH = "FEMA_100_Year_Flood_Zones_in_the_US\\FEMA_100_Year_Flood_Zones_in_the_US.shp"
15
- #FLOOD_HISTORIC_SHP_PATH = "NFHL_06_20230323.gdb"
16
- ELEVATION_RASTER_FILE = "TrueMarble.250m.21600x21600.B2.tif"
17
-
18
- SMARTDS_VALID_YEARS = [2016, 2017, 2018]
19
- SMARTDS_VALID_AREAS = ['SFO', 'GSO', 'AUS']
20
-
1
+ """ Module for managing constants in ERAD package.
2
+
3
+ _Do not change this constants in your code._
4
+ """
5
+
6
+ import os
7
+
8
+ ROOT_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
9
+ DATA_FOLDER_NAME = "data"
10
+ DATA_FOLDER = os.path.join(ROOT_PATH, DATA_FOLDER_NAME)
11
+
12
+ FIRE_HISTORIC_GEODATAFRAME_PATH = "US_Wildfires_1878_2019.gdb"
13
+ EARTHQUAKE_HISTORIC_CSV_PATH = "World_Earthquakes_1960_2016.csv"
14
+ FLOOD_HISTORIC_SHP_PATH = "FEMA_100_Year_Flood_Zones_in_the_US\\FEMA_100_Year_Flood_Zones_in_the_US.shp"
15
+ #FLOOD_HISTORIC_SHP_PATH = "NFHL_06_20230323.gdb"
16
+ ELEVATION_RASTER_FILE = "TrueMarble.250m.21600x21600.B2.tif"
17
+
18
+ SMARTDS_VALID_YEARS = [2016, 2017, 2018]
19
+ SMARTDS_VALID_AREAS = ['SFO', 'GSO', 'AUS']
20
+
@@ -1,212 +1,212 @@
1
- LOAD CSV WITH HEADERS FROM 'file:///buses.csv' AS bus_row
2
- WITH bus_row WHERE bus_row.name IS NOT NULL
3
- MERGE (bus:Bus {name: bus_row.name, longitude: toFloat(bus_row.longitude),
4
- latitude: toFloat(bus_row.latitude)});
5
-
6
- LOAD CSV WITH HEADERS FROM 'file:///loads.csv' AS load_row
7
- WITH load_row WHERE load_row.name IS NOT NULL
8
- MERGE (load:Load {name: load_row.name, kw: toFloat(load_row.kw),
9
- kvar: toFloat(load_row.kvar), source: load_row.source,
10
- critical_load_factor: toFloat(load_row.critical_load_factor)})
11
- MERGE (load_bus:Bus {name: load_row.source})
12
- MERGE (load)-[:CONSUMES_POWER_FROM]->(load_bus);
13
-
14
- LOAD CSV WITH HEADERS FROM 'file:///line_sections.csv' AS line_row
15
- WITH line_row WHERE line_row.name IS NOT NULL
16
- MERGE (from_bus:Bus {name: line_row.source})
17
- MERGE (to_bus:Bus {name: line_row.target})
18
- MERGE (from_bus)-[:CONNECTS_TO {name: line_row.name, source: line_row.source,
19
- target: line_row.target,ampacity: toFloat(line_row.ampacity),
20
- height_m: toFloat(line_row.height_m), geom_type: line_row.geom_type}]->(to_bus);
21
-
22
- LOAD CSV WITH HEADERS FROM 'file:///transformers.csv' AS xfmr_row
23
- WITH xfmr_row WHERE xfmr_row.name IS NOT NULL
24
- MERGE (from_bus:Bus {name: xfmr_row.source})
25
- MERGE (to_bus:Bus {name: xfmr_row.target})
26
- MERGE (from_bus)-[:CONNECTS_TO {name: xfmr_row.name, source: xfmr_row.source,
27
- target: xfmr_row.target, kva: xfmr_row.kva,
28
- height_m: toFloat(xfmr_row.height_m)}]->(to_bus);
29
-
30
-
31
- LOAD CSV WITH HEADERS FROM 'file:///pv_systems.csv' AS pv_row
32
- WITH pv_row WHERE pv_row.name IS NOT NULL
33
- MERGE (sa:Solar {capacity: toFloat(pv_row.capacity),
34
- name: pv_row.name, owner: pv_row.owner})
35
- MERGE (ba:Bus {name: pv_row.bus})
36
- MERGE (lo:Load {name: pv_row.owner})
37
- MERGE (sa)-[:INJECTS_ACTIVE_POWER_TO]->(ba)
38
- MERGE (lo)-[:OWNS]->(sa);
39
-
40
- LOAD CSV WITH HEADERS FROM 'file:///energy_storage.csv' AS es_row
41
- WITH es_row WHERE es_row.name IS NOT NULL
42
- MERGE (ea:EnergyStorage {kw: toFloat(es_row.kw), name: es_row.name,
43
- owner:es_row.owner})
44
- MERGE (ba:Bus {name: es_row.bus})
45
- MERGE (lo:Load {name: es_row.owner})
46
- MERGE (ea)-[:INJECTS_POWER]->(ba)
47
- MERGE (ba)-[:CONSUMES_POWER]->(ea)
48
- MERGE (lo)-[:OWNS]->(ea);
49
-
50
- LOAD CSV WITH HEADERS FROM 'file:///substation.csv' AS sub_row
51
- WITH sub_row WHERE sub_row.name IS NOT NULL
52
- MERGE (b:Bus {name: sub_row.name})
53
- SET b:Substation;
54
-
55
- MATCH (b:Bus)-[CONSUMES_POWER]-(c:Load)
56
- SET c.longitude = b.longitude
57
- SET c.latitude = b.latitude;
58
-
59
- MATCH (c:Load)
60
- WHERE c.latitude IS NULL
61
- DETACH DELETE c;
62
-
63
- LOAD CSV WITH HEADERS FROM 'file:///pharmacies.csv' AS p_row
64
- WITH p_row WHERE p_row.name IS NOT NULL
65
- MERGE (p:Pharmacy {name: (p_row.name + p_row.gid), source:p_row.source,
66
- kw:toFloat(p_row.kw), kvar:toFloat(p_row.kvar),
67
- backup_capacity_kw:toFloat(p_row.backup_capacity_kw),
68
- backup: toInteger(p_row.backup),
69
- longitude: toFloat(p_row.longitude), latitude: toFloat(p_row.latitude)})
70
- WITH p
71
- MATCH (lo:Load)
72
- MERGE (lo)-[:VISITS_FOR_MEDICINE {distance: point.distance(
73
- point({longitude: p.longitude, latitude:p.latitude}),
74
- point({longitude: lo.longitude, latitude:lo.latitude})
75
- )}]->(p);
76
-
77
- MATCH (p:Pharmacy)
78
- WITH p
79
- MATCH (b:Bus {name: p.source})
80
- MERGE (b)<-[:GETS_POWER_FROM]-(p);
81
-
82
- LOAD CSV WITH HEADERS FROM 'file:///groceries.csv' AS g_row
83
- WITH g_row WHERE g_row.name IS NOT NULL
84
- MERGE (g:Grocery {name: (g_row.name + g_row.gid), source:g_row.source,
85
- kw:toFloat(g_row.kw), kvar:toFloat(g_row.kvar),
86
- backup_capacity_kw:toFloat(g_row.backup_capacity_kw),
87
- backup: toInteger(g_row.backup),
88
- longitude: toFloat(g_row.longitude), latitude: toFloat(g_row.latitude)})
89
- WITH g
90
- MATCH (lo:Load)
91
- MERGE (lo)-[:VISITS_FOR_GROCERIES {distance: point.distance(
92
- point({longitude: g.longitude, latitude:g.latitude}),
93
- point({longitude: lo.longitude, latitude:lo.latitude})
94
- )}]->(g);
95
-
96
- MATCH (g:Grocery)
97
- WITH g
98
- MATCH (b:Bus {name: g.source})
99
- MERGE (b)<-[:GETS_POWER_FROM]-(g);
100
-
101
- LOAD CSV WITH HEADERS FROM 'file:///medical_centers.csv' AS m_row
102
- WITH m_row WHERE m_row.name IS NOT NULL
103
- MERGE (m:Hospital {name: (m_row.name + m_row.gid),
104
- source:m_row.source, kw:toFloat(m_row.kw), kvar:toFloat(m_row.kvar),
105
- backup_capacity_kw:toFloat(m_row.backup_capacity_kw),
106
- longitude: toFloat(m_row.longitude),
107
- latitude: toFloat(m_row.latitude), backup: toInteger(m_row.backup)})
108
- WITH m
109
- MATCH (lo:Load)
110
- MERGE (lo)-[:VISITS_DURING_HEALTH_EMERGENCY {distance: point.distance(
111
- point({longitude: m.longitude, latitude:m.latitude}),
112
- point({longitude: lo.longitude, latitude:lo.latitude})
113
- )}]->(m);
114
-
115
- MATCH (h:Hospital)
116
- WITH h
117
- MATCH (b:Bus {name: h.source})
118
- MERGE (b)<-[:GETS_POWER_FROM]-(h);
119
-
120
- LOAD CSV WITH HEADERS FROM 'file:///banking.csv' AS b_row
121
- WITH b_row WHERE b_row.name IS NOT NULL
122
- MERGE (b:Banking {name: (b_row.name + b_row.gid),
123
- source: b_row.source,kw:toFloat(b_row.kw), kvar:toFloat(b_row.kvar),
124
- backup_capacity_kw:toFloat(b_row.backup_capacity_kw),
125
- backup: toInteger(b_row.backup),
126
- longitude: toFloat(b_row.longitude), latitude: toFloat(b_row.latitude)})
127
- WITH b
128
- MATCH (lo:Load)
129
- MERGE (lo)-[:VISITS_TO_WITHDRAW_OR_DEPOSIT_CURRENCY {distance: point.distance(
130
- point({longitude: b.longitude, latitude:b.latitude}),
131
- point({longitude: lo.longitude, latitude:lo.latitude})
132
- )}]->(b);
133
-
134
- MATCH (b1:Banking)
135
- WITH b1
136
- MATCH (b:Bus {name: b1.source})
137
- MERGE (b)<-[:GETS_POWER_FROM]-(b1);
138
-
139
- LOAD CSV WITH HEADERS FROM 'file:///convenience.csv' AS c_row
140
- WITH c_row WHERE c_row.name IS NOT NULL
141
- MERGE (c:Convenience {name: (c_row.name + c_row.gid),
142
- source:c_row.source, kw:toFloat(c_row.kw), kvar:toFloat(c_row.kvar),
143
- backup_capacity_kw:toFloat(c_row.backup_capacity_kw),
144
- backup: toInteger(c_row.backup),
145
- longitude: toFloat(c_row.longitude), latitude: toFloat(c_row.latitude)})
146
- WITH c
147
- MATCH (lo:Load)
148
- MERGE (lo)-[:VISITS_FOR_SERVICE {distance: point.distance(
149
- point({longitude: c.longitude, latitude:c.latitude}),
150
- point({longitude: lo.longitude, latitude:lo.latitude})
151
- )}]->(c);
152
-
153
- MATCH (c:Convenience)
154
- WITH c
155
- MATCH (b:Bus {name: c.source})
156
- MERGE (b)<-[:GETS_POWER_FROM]-(c);
157
-
158
- LOAD CSV WITH HEADERS FROM 'file:///shelters.csv' AS s_row
159
- WITH s_row WHERE s_row.use_type IS NOT NULL
160
- MERGE (s:Shelter {name: (s_row.use_type + s_row.gid),
161
- backup: toInteger(s_row.backup), source: s_row.source, kw:toFloat(s_row.kw),
162
- kvar:toFloat(s_row.kvar),
163
- backup_capacity_kw:toFloat(s_row.backup_capacity_kw),
164
- longitude: toFloat(s_row.longitude), latitude: toFloat(s_row.latitude)})
165
- WITH s
166
- MATCH (lo:Load)
167
- MERGE (lo)-[:VISITS_FOR_SERVICE {distance: point.distance(
168
- point({longitude: s.longitude, latitude:s.latitude}),
169
- point({longitude: lo.longitude, latitude:lo.latitude})
170
- )}]->(s);
171
-
172
- MATCH (s:Shelter)
173
- WITH s
174
- MATCH (b:Bus {name: s.source})
175
- MERGE (b)<-[:GETS_POWER_FROM]-(s);
176
-
177
- MATCH (b1:Bus)-[r:CONNECTS_TO]-(b2:Bus)
178
- SET r.longitude = (b1.longitude + b2.longitude)/2
179
- SET r.latitude = (b1.latitude + b2.latitude)/2;
180
-
181
- MATCH p=(sourceNode:Bus)-[r:CONNECTS_TO]-(targetNode:Bus)
182
- WHERE r.ampacity IS NOT NULL
183
- WITH r,sourceNode, CASE r.num_phase
184
- WHEN 3 THEN 1.732
185
- ELSE 1
186
- END AS multiplier
187
- SET r.kva = multiplier*r.ampacity*sourceNode.kv;
188
-
189
- MATCH p=(sourceNode:Bus)-[r:CONSUMES_POWER_FROM]-(targetNode:Load)
190
- SET targetNode.kw = toFloat(targetNode.kw)
191
- SET targetNode.kvar = toFloat(targetNode.kvar)
192
- SET r.kva = sqrt(targetNode.kw*targetNode.kw+targetNode.kvar*targetNode.kvar);
193
-
194
- MATCH p=(sourceNode:Bus)-[r:INJECTS_ACTIVE_POWER_TO]-(targetNode:Solar)
195
- SET targetNode.capacity = toFloat(targetNode.capacity)
196
- SET r.kva = targetNode.capacity;
197
-
198
-
199
- MATCH p=(sourceNode:Bus)-[r:INJECTS_POWER]-(targetNode:EnergyStorage)
200
- SET targetNode.kw = toFloat(targetNode.kw)
201
- SET r.kva = targetNode.kw;
202
-
203
- MATCH (sourceNode:Bus)-[r:CONNECTS_TO]-(targetNode:Bus)
204
- SET r.kva = toFloat(r.kva);
205
-
206
- MATCH p=()-[r:GETS_POWER_FROM]->()
207
- WHERE r.kva is null
208
- SET r.kva = 300;
209
-
210
- MATCH p=()-[r:CONNECTS_TO]->()
211
- WHERE r.kva IS null
1
+ LOAD CSV WITH HEADERS FROM 'file:///buses.csv' AS bus_row
2
+ WITH bus_row WHERE bus_row.name IS NOT NULL
3
+ MERGE (bus:Bus {name: bus_row.name, longitude: toFloat(bus_row.longitude),
4
+ latitude: toFloat(bus_row.latitude)});
5
+
6
+ LOAD CSV WITH HEADERS FROM 'file:///loads.csv' AS load_row
7
+ WITH load_row WHERE load_row.name IS NOT NULL
8
+ MERGE (load:Load {name: load_row.name, kw: toFloat(load_row.kw),
9
+ kvar: toFloat(load_row.kvar), source: load_row.source,
10
+ critical_load_factor: toFloat(load_row.critical_load_factor)})
11
+ MERGE (load_bus:Bus {name: load_row.source})
12
+ MERGE (load)-[:CONSUMES_POWER_FROM]->(load_bus);
13
+
14
+ LOAD CSV WITH HEADERS FROM 'file:///line_sections.csv' AS line_row
15
+ WITH line_row WHERE line_row.name IS NOT NULL
16
+ MERGE (from_bus:Bus {name: line_row.source})
17
+ MERGE (to_bus:Bus {name: line_row.target})
18
+ MERGE (from_bus)-[:CONNECTS_TO {name: line_row.name, source: line_row.source,
19
+ target: line_row.target,ampacity: toFloat(line_row.ampacity),
20
+ height_m: toFloat(line_row.height_m), geom_type: line_row.geom_type}]->(to_bus);
21
+
22
+ LOAD CSV WITH HEADERS FROM 'file:///transformers.csv' AS xfmr_row
23
+ WITH xfmr_row WHERE xfmr_row.name IS NOT NULL
24
+ MERGE (from_bus:Bus {name: xfmr_row.source})
25
+ MERGE (to_bus:Bus {name: xfmr_row.target})
26
+ MERGE (from_bus)-[:CONNECTS_TO {name: xfmr_row.name, source: xfmr_row.source,
27
+ target: xfmr_row.target, kva: xfmr_row.kva,
28
+ height_m: toFloat(xfmr_row.height_m)}]->(to_bus);
29
+
30
+
31
+ LOAD CSV WITH HEADERS FROM 'file:///pv_systems.csv' AS pv_row
32
+ WITH pv_row WHERE pv_row.name IS NOT NULL
33
+ MERGE (sa:Solar {capacity: toFloat(pv_row.capacity),
34
+ name: pv_row.name, owner: pv_row.owner})
35
+ MERGE (ba:Bus {name: pv_row.bus})
36
+ MERGE (lo:Load {name: pv_row.owner})
37
+ MERGE (sa)-[:INJECTS_ACTIVE_POWER_TO]->(ba)
38
+ MERGE (lo)-[:OWNS]->(sa);
39
+
40
+ LOAD CSV WITH HEADERS FROM 'file:///energy_storage.csv' AS es_row
41
+ WITH es_row WHERE es_row.name IS NOT NULL
42
+ MERGE (ea:EnergyStorage {kw: toFloat(es_row.kw), name: es_row.name,
43
+ owner:es_row.owner})
44
+ MERGE (ba:Bus {name: es_row.bus})
45
+ MERGE (lo:Load {name: es_row.owner})
46
+ MERGE (ea)-[:INJECTS_POWER]->(ba)
47
+ MERGE (ba)-[:CONSUMES_POWER]->(ea)
48
+ MERGE (lo)-[:OWNS]->(ea);
49
+
50
+ LOAD CSV WITH HEADERS FROM 'file:///substation.csv' AS sub_row
51
+ WITH sub_row WHERE sub_row.name IS NOT NULL
52
+ MERGE (b:Bus {name: sub_row.name})
53
+ SET b:Substation;
54
+
55
+ MATCH (b:Bus)-[CONSUMES_POWER]-(c:Load)
56
+ SET c.longitude = b.longitude
57
+ SET c.latitude = b.latitude;
58
+
59
+ MATCH (c:Load)
60
+ WHERE c.latitude IS NULL
61
+ DETACH DELETE c;
62
+
63
+ LOAD CSV WITH HEADERS FROM 'file:///pharmacies.csv' AS p_row
64
+ WITH p_row WHERE p_row.name IS NOT NULL
65
+ MERGE (p:Pharmacy {name: (p_row.name + p_row.gid), source:p_row.source,
66
+ kw:toFloat(p_row.kw), kvar:toFloat(p_row.kvar),
67
+ backup_capacity_kw:toFloat(p_row.backup_capacity_kw),
68
+ backup: toInteger(p_row.backup),
69
+ longitude: toFloat(p_row.longitude), latitude: toFloat(p_row.latitude)})
70
+ WITH p
71
+ MATCH (lo:Load)
72
+ MERGE (lo)-[:VISITS_FOR_MEDICINE {distance: point.distance(
73
+ point({longitude: p.longitude, latitude:p.latitude}),
74
+ point({longitude: lo.longitude, latitude:lo.latitude})
75
+ )}]->(p);
76
+
77
+ MATCH (p:Pharmacy)
78
+ WITH p
79
+ MATCH (b:Bus {name: p.source})
80
+ MERGE (b)<-[:GETS_POWER_FROM]-(p);
81
+
82
+ LOAD CSV WITH HEADERS FROM 'file:///groceries.csv' AS g_row
83
+ WITH g_row WHERE g_row.name IS NOT NULL
84
+ MERGE (g:Grocery {name: (g_row.name + g_row.gid), source:g_row.source,
85
+ kw:toFloat(g_row.kw), kvar:toFloat(g_row.kvar),
86
+ backup_capacity_kw:toFloat(g_row.backup_capacity_kw),
87
+ backup: toInteger(g_row.backup),
88
+ longitude: toFloat(g_row.longitude), latitude: toFloat(g_row.latitude)})
89
+ WITH g
90
+ MATCH (lo:Load)
91
+ MERGE (lo)-[:VISITS_FOR_GROCERIES {distance: point.distance(
92
+ point({longitude: g.longitude, latitude:g.latitude}),
93
+ point({longitude: lo.longitude, latitude:lo.latitude})
94
+ )}]->(g);
95
+
96
+ MATCH (g:Grocery)
97
+ WITH g
98
+ MATCH (b:Bus {name: g.source})
99
+ MERGE (b)<-[:GETS_POWER_FROM]-(g);
100
+
101
+ LOAD CSV WITH HEADERS FROM 'file:///medical_centers.csv' AS m_row
102
+ WITH m_row WHERE m_row.name IS NOT NULL
103
+ MERGE (m:Hospital {name: (m_row.name + m_row.gid),
104
+ source:m_row.source, kw:toFloat(m_row.kw), kvar:toFloat(m_row.kvar),
105
+ backup_capacity_kw:toFloat(m_row.backup_capacity_kw),
106
+ longitude: toFloat(m_row.longitude),
107
+ latitude: toFloat(m_row.latitude), backup: toInteger(m_row.backup)})
108
+ WITH m
109
+ MATCH (lo:Load)
110
+ MERGE (lo)-[:VISITS_DURING_HEALTH_EMERGENCY {distance: point.distance(
111
+ point({longitude: m.longitude, latitude:m.latitude}),
112
+ point({longitude: lo.longitude, latitude:lo.latitude})
113
+ )}]->(m);
114
+
115
+ MATCH (h:Hospital)
116
+ WITH h
117
+ MATCH (b:Bus {name: h.source})
118
+ MERGE (b)<-[:GETS_POWER_FROM]-(h);
119
+
120
+ LOAD CSV WITH HEADERS FROM 'file:///banking.csv' AS b_row
121
+ WITH b_row WHERE b_row.name IS NOT NULL
122
+ MERGE (b:Banking {name: (b_row.name + b_row.gid),
123
+ source: b_row.source,kw:toFloat(b_row.kw), kvar:toFloat(b_row.kvar),
124
+ backup_capacity_kw:toFloat(b_row.backup_capacity_kw),
125
+ backup: toInteger(b_row.backup),
126
+ longitude: toFloat(b_row.longitude), latitude: toFloat(b_row.latitude)})
127
+ WITH b
128
+ MATCH (lo:Load)
129
+ MERGE (lo)-[:VISITS_TO_WITHDRAW_OR_DEPOSIT_CURRENCY {distance: point.distance(
130
+ point({longitude: b.longitude, latitude:b.latitude}),
131
+ point({longitude: lo.longitude, latitude:lo.latitude})
132
+ )}]->(b);
133
+
134
+ MATCH (b1:Banking)
135
+ WITH b1
136
+ MATCH (b:Bus {name: b1.source})
137
+ MERGE (b)<-[:GETS_POWER_FROM]-(b1);
138
+
139
+ LOAD CSV WITH HEADERS FROM 'file:///convenience.csv' AS c_row
140
+ WITH c_row WHERE c_row.name IS NOT NULL
141
+ MERGE (c:Convenience {name: (c_row.name + c_row.gid),
142
+ source:c_row.source, kw:toFloat(c_row.kw), kvar:toFloat(c_row.kvar),
143
+ backup_capacity_kw:toFloat(c_row.backup_capacity_kw),
144
+ backup: toInteger(c_row.backup),
145
+ longitude: toFloat(c_row.longitude), latitude: toFloat(c_row.latitude)})
146
+ WITH c
147
+ MATCH (lo:Load)
148
+ MERGE (lo)-[:VISITS_FOR_SERVICE {distance: point.distance(
149
+ point({longitude: c.longitude, latitude:c.latitude}),
150
+ point({longitude: lo.longitude, latitude:lo.latitude})
151
+ )}]->(c);
152
+
153
+ MATCH (c:Convenience)
154
+ WITH c
155
+ MATCH (b:Bus {name: c.source})
156
+ MERGE (b)<-[:GETS_POWER_FROM]-(c);
157
+
158
+ LOAD CSV WITH HEADERS FROM 'file:///shelters.csv' AS s_row
159
+ WITH s_row WHERE s_row.use_type IS NOT NULL
160
+ MERGE (s:Shelter {name: (s_row.use_type + s_row.gid),
161
+ backup: toInteger(s_row.backup), source: s_row.source, kw:toFloat(s_row.kw),
162
+ kvar:toFloat(s_row.kvar),
163
+ backup_capacity_kw:toFloat(s_row.backup_capacity_kw),
164
+ longitude: toFloat(s_row.longitude), latitude: toFloat(s_row.latitude)})
165
+ WITH s
166
+ MATCH (lo:Load)
167
+ MERGE (lo)-[:VISITS_FOR_SERVICE {distance: point.distance(
168
+ point({longitude: s.longitude, latitude:s.latitude}),
169
+ point({longitude: lo.longitude, latitude:lo.latitude})
170
+ )}]->(s);
171
+
172
+ MATCH (s:Shelter)
173
+ WITH s
174
+ MATCH (b:Bus {name: s.source})
175
+ MERGE (b)<-[:GETS_POWER_FROM]-(s);
176
+
177
+ MATCH (b1:Bus)-[r:CONNECTS_TO]-(b2:Bus)
178
+ SET r.longitude = (b1.longitude + b2.longitude)/2
179
+ SET r.latitude = (b1.latitude + b2.latitude)/2;
180
+
181
+ MATCH p=(sourceNode:Bus)-[r:CONNECTS_TO]-(targetNode:Bus)
182
+ WHERE r.ampacity IS NOT NULL
183
+ WITH r,sourceNode, CASE r.num_phase
184
+ WHEN 3 THEN 1.732
185
+ ELSE 1
186
+ END AS multiplier
187
+ SET r.kva = multiplier*r.ampacity*sourceNode.kv;
188
+
189
+ MATCH p=(sourceNode:Bus)-[r:CONSUMES_POWER_FROM]-(targetNode:Load)
190
+ SET targetNode.kw = toFloat(targetNode.kw)
191
+ SET targetNode.kvar = toFloat(targetNode.kvar)
192
+ SET r.kva = sqrt(targetNode.kw*targetNode.kw+targetNode.kvar*targetNode.kvar);
193
+
194
+ MATCH p=(sourceNode:Bus)-[r:INJECTS_ACTIVE_POWER_TO]-(targetNode:Solar)
195
+ SET targetNode.capacity = toFloat(targetNode.capacity)
196
+ SET r.kva = targetNode.capacity;
197
+
198
+
199
+ MATCH p=(sourceNode:Bus)-[r:INJECTS_POWER]-(targetNode:EnergyStorage)
200
+ SET targetNode.kw = toFloat(targetNode.kw)
201
+ SET r.kva = targetNode.kw;
202
+
203
+ MATCH (sourceNode:Bus)-[r:CONNECTS_TO]-(targetNode:Bus)
204
+ SET r.kva = toFloat(r.kva);
205
+
206
+ MATCH p=()-[r:GETS_POWER_FROM]->()
207
+ WHERE r.kva is null
208
+ SET r.kva = 300;
209
+
210
+ MATCH p=()-[r:CONNECTS_TO]->()
211
+ WHERE r.kva IS null
212
212
  SET r.kva = 300;