diff --git a/city_model_structure/attributes/edge.py b/city_model_structure/attributes/edge.py index 2235f096..3a156ed8 100644 --- a/city_model_structure/attributes/edge.py +++ b/city_model_structure/attributes/edge.py @@ -1,7 +1,7 @@ """ Node module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca +Copyright © 2021 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca """ import uuid diff --git a/city_model_structure/attributes/node.py b/city_model_structure/attributes/node.py index 65e769fd..50b617c6 100644 --- a/city_model_structure/attributes/node.py +++ b/city_model_structure/attributes/node.py @@ -1,12 +1,13 @@ """ Node module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca +Copyright © 2021 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca """ import uuid from typing import List, TypeVar +from city_model_structure.attributes.time_series import TimeSeries Edge = TypeVar('Edge') @@ -21,6 +22,7 @@ class Node: self._name = name self._id = None self._edges = edges + self._time_series = None @property def name(self): @@ -47,3 +49,7 @@ class Node: :return: [Edge] """ return self._edges + + @property + def time_series(self) -> TimeSeries: + return self._time_series diff --git a/city_model_structure/attributes/record.py b/city_model_structure/attributes/record.py new file mode 100644 index 00000000..294bb8b9 --- /dev/null +++ b/city_model_structure/attributes/record.py @@ -0,0 +1,28 @@ +""" +Record module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + + +class Record: + """ + Record class + """ + + def __init__(self, time=None, value=None, flag=None): + self._time = time + self._value = value + self._flag = flag + + @property + def time(self): + return self._time + + @property + def value(self): + return self._value + + @property + def flag(self): + return self._flag diff --git a/city_model_structure/attributes/time_series.py b/city_model_structure/attributes/time_series.py new file mode 100644 index 00000000..83301bb5 --- /dev/null +++ b/city_model_structure/attributes/time_series.py @@ -0,0 +1,26 @@ +""" +Time series module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from typing import List +from city_model_structure.attributes.record import Record + + +class TimeSeries: + """ + TimeSeries class + """ + + def __init__(self, time_series_type=None, records=None): + self._time_series_type = time_series_type + self._records = records + + @property + def time_series_type(self): + return self._time_series_type + + @property + def records(self) -> List[Record]: + return self._records diff --git a/city_model_structure/bus_system.py b/city_model_structure/bus_system.py new file mode 100644 index 00000000..171903e6 --- /dev/null +++ b/city_model_structure/bus_system.py @@ -0,0 +1,40 @@ +""" +Bus system module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from typing import List +from city_model_structure.city_object import CityObject +from city_model_structure.attributes.polygon import Polygon +from city_model_structure.transport.bus_network import BusNetwork +from city_model_structure.transport.bus_node import BusNode +from city_model_structure.transport.bus import Bus + + +class BusSystem(CityObject): + """ + BusSystem(CityObject) class + """ + def __init__(self, name, lod, surfaces, city_lower_corner): + super().__init__(name, lod, surfaces, city_lower_corner) + self._bus_routes = None + self._bus_network = None + self._buses = None + self._restricted_polygons = None + + @property + def bus_routes(self) -> List[BusNode]: + return self._bus_routes + + @property + def bus_network(self) -> BusNetwork: + return self._bus_network + + @property + def buses(self) -> List[Bus]: + return self._buses + + @property + def restricted_polygons(self) -> List[Polygon]: + return self._restricted_polygons diff --git a/city_model_structure/energy_system.py b/city_model_structure/energy_system.py index 6df539d6..f648001a 100644 --- a/city_model_structure/energy_system.py +++ b/city_model_structure/energy_system.py @@ -1,7 +1,7 @@ """ EnergySystem module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ from city_model_structure.city_object import CityObject diff --git a/city_model_structure/network.py b/city_model_structure/network.py index 869c7107..ae3d0186 100644 --- a/city_model_structure/network.py +++ b/city_model_structure/network.py @@ -1,9 +1,10 @@ """ Network module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca +Copyright © 2021 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca """ + import uuid from typing import List diff --git a/city_model_structure/transport/bus.py b/city_model_structure/transport/bus.py new file mode 100644 index 00000000..708d0a6d --- /dev/null +++ b/city_model_structure/transport/bus.py @@ -0,0 +1,70 @@ +""" +Bus module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from city_model_structure.attributes.schedule import Schedule + + +class Bus: + """ + Bus class + """ + + def __init__(self): + self._maintenance_time = None + self._charging_time = None + self._recovery_time = None + self._vehicle_type = None + self._energy_consumption = None + self._trips_schedule = None + self._capacity = None + self._maintenance_cost = None + self._investment_cost = None + self._charging_range = None + self._maximum_travel_range = None + + @property + def maintenance_time(self): + return self._maintenance_time + + @property + def charging_time(self): + return self._charging_time + + @property + def recovery_time(self): + return self.maintenance_time + self.charging_time + + @property + def vehicle_type(self): + return self._vehicle_type + + @property + def energy_consumption(self): + return self._energy_consumption + + @property + def trips_schedule(self) -> Schedule: + return self._trips_schedule + + @property + def capacity(self): + return self._capacity + + @property + def maintenance_cost(self): + return self._maintenance_cost + + @property + def investment_cost(self): + return self._investment_cost + + @property + def charging_range(self): + return self._charging_range + + @property + def maximum_travel_range(self): + return self._maximum_travel_range diff --git a/city_model_structure/transport/bus_depot.py b/city_model_structure/transport/bus_depot.py new file mode 100644 index 00000000..3bda6c66 --- /dev/null +++ b/city_model_structure/transport/bus_depot.py @@ -0,0 +1,26 @@ +""" +Bus depot module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from city_model_structure.transport.bus_node import BusNode + + +class BusDepot(BusNode): + """ + BusDepot class + """ + + def __init__(self, name, coordinates, edges=None): + super().__init__(name, coordinates, edges=edges, node_type='BusDepot') + self._number_of_charging_poles = None + self._number_of_available_buses = None + + @property + def number_of_charging_poles(self): + return self._number_of_charging_poles + + @property + def number_of_available_buses(self): + return self._number_of_available_buses diff --git a/city_model_structure/transport/bus_edge.py b/city_model_structure/transport/bus_edge.py new file mode 100644 index 00000000..9d9f967a --- /dev/null +++ b/city_model_structure/transport/bus_edge.py @@ -0,0 +1,41 @@ +""" +Bus edge module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from typing import List +from city_model_structure.attributes.edge import Edge +from city_model_structure.transport.bus_node import BusNode + + +class BusEdge(Edge): + """ + BusEdge class + Each edge is unidirectional and starts at the "from" node and ends at the "to" node + """ + + def __init__(self, name, nodes, edge_type='BusEdge'): + super().__init__(name, nodes) + self._edge_type = edge_type + self._average_travel_time = None + + @property + def edge_type(self): + """ + Get the edge type + :return: str + """ + return self._edge_type + + @property + def nodes(self) -> List[BusNode]: + """ + Get delimiting nodes for the edge + :return: [BusNode] + """ + return self._nodes + + @property + def average_travel_time(self): + return self._average_travel_time diff --git a/city_model_structure/transport/bus_network.py b/city_model_structure/transport/bus_network.py new file mode 100644 index 00000000..6f3dfbd8 --- /dev/null +++ b/city_model_structure/transport/bus_network.py @@ -0,0 +1,43 @@ +""" +Bus network module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from typing import List +from city_model_structure.network import Network +from city_model_structure.transport.bus_edge import BusEdge +from city_model_structure.transport.bus_node import BusNode + + +class BusNetwork(Network): + """ + BusNetwork(Network) class + """ + def __init__(self, name, edges=None, nodes=None): + super().__init__(name, edges, nodes) + self._type = "BusNetwork" + + @property + def type(self): + """ + Get network type + :return: str + """ + return self._type + + @property + def edges(self) -> List[BusEdge]: + """ + Get network edges + :return: [BusEdge] + """ + return self._edges + + @property + def nodes(self) -> List[BusNode]: + """ + Get network nodes + :return: [BusNode] + """ + return self._nodes diff --git a/city_model_structure/transport/bus_node.py b/city_model_structure/transport/bus_node.py new file mode 100644 index 00000000..03113fdf --- /dev/null +++ b/city_model_structure/transport/bus_node.py @@ -0,0 +1,54 @@ +""" +Bus node module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from typing import List + +from city_model_structure.attributes.node import Node +from city_model_structure.attributes.point import Point +from city_model_structure.transport.bus_edge import BusEdge + + +class BusNode(Node): + """ + BusNode class + """ + + def __init__(self, name, coordinates, node_type='BusNode', edges=None): + super().__init__(name, edges) + self._coordinates = coordinates + self._node_type = node_type + + @property + def node_type(self): + """ + Get node type + :return: str + """ + return self._node_type + + @property + def coordinates(self) -> Point: + """ + Get node coordinates + :return: Point + """ + return self._coordinates + + @coordinates.setter + def coordinates(self, value): + """ + Set node coordinates + :param value: Point + """ + self._coordinates = value + + @property + def edges(self) -> List[BusEdge]: + """ + get edges delimited by the node + :return: [BusEdge] + """ + return self._edges diff --git a/city_model_structure/transport/bus_stop.py b/city_model_structure/transport/bus_stop.py new file mode 100644 index 00000000..7aed89eb --- /dev/null +++ b/city_model_structure/transport/bus_stop.py @@ -0,0 +1,39 @@ +""" +Bus stop module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from typing import Union +from city_model_structure.transport.bus_node import BusNode +from city_model_structure.transport.fast_charging_infrastructure import FastChargingInfrastructure +from city_model_structure.attributes.schedule import Schedule + + +class BusStop(BusNode): + """ + BusStop class + """ + + def __init__(self, name, coordinates, edges=None): + super().__init__(name, coordinates, edges=edges, node_type='BusStop') + self._time_table = None + self._average_hourly_passengers_demand = None + self._fast_charging_infrastructure = None + self._waiting_time = None + + @property + def time_table(self): + return self._time_table + + @property + def average_hourly_passengers_demand(self) -> Schedule: + return self._average_hourly_passengers_demand + + @property + def fast_charging_infrastructure(self) -> Union[None, FastChargingInfrastructure]: + return self._fast_charging_infrastructure + + @property + def waiting_time(self): + return self._waiting_time diff --git a/city_model_structure/transport/connection.py b/city_model_structure/transport/connection.py index 093fb4b8..0f023cd4 100644 --- a/city_model_structure/transport/connection.py +++ b/city_model_structure/transport/connection.py @@ -1,7 +1,7 @@ """ Connection module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ diff --git a/city_model_structure/transport/crossing.py b/city_model_structure/transport/crossing.py index 9a28c8f8..0b740355 100644 --- a/city_model_structure/transport/crossing.py +++ b/city_model_structure/transport/crossing.py @@ -1,7 +1,7 @@ """ Crossing module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ diff --git a/city_model_structure/transport/fast_charging_infrastructure.py b/city_model_structure/transport/fast_charging_infrastructure.py new file mode 100644 index 00000000..16b4b6e5 --- /dev/null +++ b/city_model_structure/transport/fast_charging_infrastructure.py @@ -0,0 +1,23 @@ +""" +Fast charging infrastructure module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + + +class FastChargingInfrastructure: + """ + FastChargingInfrastructure class + """ + + def __init__(self): + self._electrical_demand = None + self._losses_in_grid = None + + @property + def electrical_demand(self): + return self._electrical_demand + + @property + def losses_in_grid(self): + return self._losses_in_grid diff --git a/city_model_structure/transport/join.py b/city_model_structure/transport/join.py index a7f609b8..3e1cd143 100644 --- a/city_model_structure/transport/join.py +++ b/city_model_structure/transport/join.py @@ -1,7 +1,7 @@ """ Join module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ diff --git a/city_model_structure/transport/lane.py b/city_model_structure/transport/lane.py index d68bcca0..417f986a 100644 --- a/city_model_structure/transport/lane.py +++ b/city_model_structure/transport/lane.py @@ -1,7 +1,7 @@ """ Lane module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca """ diff --git a/city_model_structure/transport/origin_destination_edge.py b/city_model_structure/transport/origin_destination_edge.py index c3d3f3c1..664bdd81 100644 --- a/city_model_structure/transport/origin_destination_edge.py +++ b/city_model_structure/transport/origin_destination_edge.py @@ -1,11 +1,13 @@ """ Origin-Destination edge module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ +from typing import List from city_model_structure.attributes.edge import Edge +from city_model_structure.transport.origin_destination_node import OriginDestinationNode from city_model_structure.attributes.schedule import Schedule @@ -28,6 +30,14 @@ class OriginDestinationEdge(Edge): """ return self._edge_type + @property + def nodes(self) -> List[OriginDestinationNode]: + """ + Get delimiting nodes for the edge + :return: [OriginDestinationNode] + """ + return self._nodes + @property def movement_schedule(self) -> Schedule: """ diff --git a/city_model_structure/transport/origin_destination_network.py b/city_model_structure/transport/origin_destination_network.py index 973317c6..9090f983 100644 --- a/city_model_structure/transport/origin_destination_network.py +++ b/city_model_structure/transport/origin_destination_network.py @@ -1,7 +1,7 @@ """ Origin-Destination network module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ from typing import List diff --git a/city_model_structure/transport/origin_destination_node.py b/city_model_structure/transport/origin_destination_node.py index 5e46e92d..eabf06fb 100644 --- a/city_model_structure/transport/origin_destination_node.py +++ b/city_model_structure/transport/origin_destination_node.py @@ -1,7 +1,7 @@ """ Origin-Destination node module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ from typing import List @@ -9,6 +9,7 @@ from city_model_structure.attributes.node import Node from city_model_structure.attributes.point import Point from city_model_structure.attributes.polygon import Polygon from city_model_structure.city_object import CityObject +from city_model_structure.transport.origin_destination_edge import OriginDestinationEdge class OriginDestinationNode(Node): @@ -48,6 +49,14 @@ class OriginDestinationNode(Node): """ self._coordinates = value + @property + def edges(self) -> List[OriginDestinationEdge]: + """ + get edges delimited by the node + :return: [OriginDestinationEdge] + """ + return self._edges + @property def polygon(self) -> Polygon: """ diff --git a/city_model_structure/transport/phase.py b/city_model_structure/transport/phase.py index 559e0834..66d2d59b 100644 --- a/city_model_structure/transport/phase.py +++ b/city_model_structure/transport/phase.py @@ -1,7 +1,7 @@ """ Phase module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca """ diff --git a/city_model_structure/transport/traffic_edge.py b/city_model_structure/transport/traffic_edge.py index 1fd77299..e507e0ba 100644 --- a/city_model_structure/transport/traffic_edge.py +++ b/city_model_structure/transport/traffic_edge.py @@ -1,13 +1,14 @@ """ Traffic edge module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ from typing import List, Union from city_model_structure.attributes.edge import Edge +from city_model_structure.transport.traffic_node import TrafficNode from city_model_structure.transport.lane import Lane @@ -37,6 +38,14 @@ class TrafficEdge(Edge): """ return self._edge_type + @property + def nodes(self) -> List[TrafficNode]: + """ + Get delimiting nodes for the edge + :return: [TrafficNode] + """ + return self._nodes + @property def lanes(self) -> List[Lane]: """ diff --git a/city_model_structure/transport/traffic_light.py b/city_model_structure/transport/traffic_light.py index 7b7d4621..89827a62 100644 --- a/city_model_structure/transport/traffic_light.py +++ b/city_model_structure/transport/traffic_light.py @@ -1,7 +1,7 @@ """ Traffic light module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ diff --git a/city_model_structure/transport/traffic_network.py b/city_model_structure/transport/traffic_network.py index e473f6da..eef5a4e9 100644 --- a/city_model_structure/transport/traffic_network.py +++ b/city_model_structure/transport/traffic_network.py @@ -1,7 +1,7 @@ """ Traffic network module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ diff --git a/city_model_structure/transport/traffic_node.py b/city_model_structure/transport/traffic_node.py index 3008cf97..6391750e 100644 --- a/city_model_structure/transport/traffic_node.py +++ b/city_model_structure/transport/traffic_node.py @@ -1,17 +1,17 @@ """ TrafficNode module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ + from typing import List from city_model_structure.attributes.edge import Edge from city_model_structure.attributes.node import Node from city_model_structure.attributes.point import Point - - +from city_model_structure.transport.traffic_edge import TrafficEdge from city_model_structure.transport.connection import Connection @@ -55,6 +55,14 @@ class TrafficNode(Node): """ self._coordinates = value + @property + def edges(self) -> List[TrafficEdge]: + """ + get edges delimited by the node + :return: [TrafficEdge] + """ + return self._edges + @property def prohibitions(self) -> [(Edge, Edge)]: """ diff --git a/city_model_structure/transport/walkway_node.py b/city_model_structure/transport/walkway_node.py index 36ec90c6..e884f976 100644 --- a/city_model_structure/transport/walkway_node.py +++ b/city_model_structure/transport/walkway_node.py @@ -1,7 +1,7 @@ """ Walkway node module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """