diff --git a/hub/catalog_factories/construction/construction_helper.py b/hub/catalog_factories/construction/construction_helper.py index e69de29b..a93c2584 100644 --- a/hub/catalog_factories/construction/construction_helper.py +++ b/hub/catalog_factories/construction/construction_helper.py @@ -0,0 +1,46 @@ +from hub.helpers import constants as cte + + +class ConstructionHelper: + """ + Construction helper class + """ + _reference_standard_to_construction_period = { + 'non_standard_dompark': '1900 - 2004', + 'ASHRAE 90.1_2004': '2004 - 2009', + 'ASHRAE 189.1_2009': '2009 - PRESENT' + } + + _nrel_surfaces_types_to_hub_types = { + 'exterior wall': cte.WALL, + 'interior wall': cte.INTERIOR_WALL, + 'ground wall': cte.GROUND_WALL, + 'exterior slab': cte.GROUND, + 'attic floor': cte.ATTIC_FLOOR, + 'interior slab': cte.INTERIOR_SLAB, + 'roof': cte.ROOF + } + + _nrcan_surfaces_types_to_hub_types = { + 'Wall_Outdoors': cte.WALL, + 'RoofCeiling_Outdoors': cte.ROOF, + 'Floor_Outdoors': cte.ATTIC_FLOOR, + 'Window_Outdoors': cte.WINDOW, + 'Skylight_Outdoors': cte.SKYLIGHT, + 'Door_Outdoors': cte.DOOR, + 'Wall_Ground': cte.GROUND_WALL, + 'RoofCeiling_Ground': cte.GROUND_WALL, + 'Floor_Ground': cte.GROUND + } + + @property + def reference_standard_to_construction_period(self): + return self._reference_standard_to_construction_period + + @property + def nrel_surfaces_types_to_hub_types(self): + return self._nrel_surfaces_types_to_hub_types + + @property + def nrcan_surfaces_types_to_hub_types(self): + return self._nrcan_surfaces_types_to_hub_types diff --git a/hub/catalog_factories/construction/nrcan_catalog.py b/hub/catalog_factories/construction/nrcan_catalog.py index 92775c3c..1ace7524 100644 --- a/hub/catalog_factories/construction/nrcan_catalog.py +++ b/hub/catalog_factories/construction/nrcan_catalog.py @@ -49,7 +49,6 @@ class NrcanCatalog(Catalog): self._g_value_per_hdd.append(['15000', values[len(values)-1]]) construction_url = f'{self._base_url_construction}{standard["constructions_location"]}' - print(construction_url) with urllib.request.urlopen(construction_url) as json_file: cases = json.load(json_file)['tables']['surface_thermal_transmittance']['table'] # W/m2K diff --git a/hub/catalog_factories/usage_catalog_factory.py b/hub/catalog_factories/usage_catalog_factory.py index 26aa6631..9644ac8c 100644 --- a/hub/catalog_factories/usage_catalog_factory.py +++ b/hub/catalog_factories/usage_catalog_factory.py @@ -47,4 +47,4 @@ class UsageCatalogFactory: Enrich the city given to the class using the class given handler :return: Catalog """ - return getattr(self, self._catalog_type, lambda: None) + return getattr(self, self._catalog_type, lambda: None) \ No newline at end of file diff --git a/hub/exports/energy_building_exports_factory.py b/hub/exports/energy_building_exports_factory.py index 97240d4f..0ae9ae55 100644 --- a/hub/exports/energy_building_exports_factory.py +++ b/hub/exports/energy_building_exports_factory.py @@ -22,7 +22,7 @@ class EnergyBuildingsExportsFactory: self._export_type = '_' + export_type.lower() class_funcs = validate_import_export_type(EnergyBuildingsExportsFactory) if self._export_type not in class_funcs: - err_msg = f"Wrong import type. Valid functions include {class_funcs}" + err_msg = f"Wrong import type [{self._export_type}]. Valid functions include {class_funcs}" logger.error(err_msg) raise Exception(err_msg) if isinstance(path, str): diff --git a/hub/exports/exports_factory.py b/hub/exports/exports_factory.py index 13df7569..2d769af0 100644 --- a/hub/exports/exports_factory.py +++ b/hub/exports/exports_factory.py @@ -22,7 +22,7 @@ class ExportsFactory: self._export_type = '_' + export_type.lower() class_funcs = validate_import_export_type(ExportsFactory) if self._export_type not in class_funcs: - err_msg = f"Wrong import type. Valid functions include {class_funcs}" + err_msg = f"Wrong export type [{self._export_type}]. Valid functions include {class_funcs}" logger.error(err_msg) raise Exception(err_msg) if isinstance(path, str): diff --git a/hub/helpers/dictionaries.py b/hub/helpers/dictionaries.py index e69de29b..46588375 100644 --- a/hub/helpers/dictionaries.py +++ b/hub/helpers/dictionaries.py @@ -0,0 +1,595 @@ +""" +Dictionaries module saves all transformations of functions and usages to access the catalogs +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2022 Concordia CERC group +Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +import hub.helpers.constants as cte + + +class Dictionaries: + """ + Dictionaries class + """ + _usage_to_hft_usage = { + cte.RESIDENTIAL: 'residential', + cte.SINGLE_FAMILY_HOUSE: 'single family house', + cte.MULTI_FAMILY_HOUSE: 'multifamily house', + cte.ROW_HOUSE: 'single family house', + cte.MID_RISE_APARTMENT: 'multifamily house', + cte.HIGH_RISE_APARTMENT: 'multifamily house', + cte.OFFICE_AND_ADMINISTRATION: 'office and administration', + cte.SMALL_OFFICE: 'office and administration', + cte.MEDIUM_OFFICE: 'office and administration', + cte.LARGE_OFFICE: 'office and administration', + cte.COURTHOUSE: 'office and administration', + cte.FIRE_STATION: 'office and administration', + cte.PENITENTIARY: 'school with shower', + cte.POLICE_STATION: 'office and administration', + cte.POST_OFFICE: 'office and administration', + cte.LIBRARY: 'office and administration', + cte.EDUCATION: 'education', + cte.PRIMARY_SCHOOL: 'school without shower', + cte.PRIMARY_SCHOOL_WITH_SHOWER: 'school with shower', + cte.SECONDARY_SCHOOL: 'education', + cte.UNIVERSITY: 'education', + cte.LABORATORY_AND_RESEARCH_CENTER: 'laboratory and research centers', + cte.STAND_ALONE_RETAIL: 'retail', + cte.HOSPITAL: 'health care', + cte.OUT_PATIENT_HEALTH_CARE: 'health care', + cte.HEALTH_CARE: 'health care', + cte.RETIREMENT_HOME_OR_ORPHANAGE: 'Home for the aged or orphanage', + cte.COMMERCIAL: 'retail', + cte.STRIP_MALL: 'retail', + cte.SUPERMARKET: 'retail shop / refrigerated food', + cte.RETAIL_SHOP_WITHOUT_REFRIGERATED_FOOD: 'retail', + cte.RETAIL_SHOP_WITH_REFRIGERATED_FOOD: 'retail shop / refrigerated food', + cte.RESTAURANT: 'restaurant', + cte.QUICK_SERVICE_RESTAURANT: 'restaurant', + cte.FULL_SERVICE_RESTAURANT: 'restaurant', + cte.HOTEL: 'hotel', + cte.HOTEL_MEDIUM_CLASS: 'hotel (Medium-class)', + cte.SMALL_HOTEL: 'hotel', + cte.LARGE_HOTEL: 'hotel', + cte.DORMITORY: 'dormitory', + cte.EVENT_LOCATION: 'event location', + cte.CONVENTION_CENTER: 'event location', + cte.HALL: 'hall', + cte.GREEN_HOUSE: 'green house', + cte.INDUSTRY: 'industry', + cte.WORKSHOP: 'industry', + cte.WAREHOUSE: 'industry', + cte.WAREHOUSE_REFRIGERATED: 'industry', + cte.SPORTS_LOCATION: 'sport location', + cte.SPORTS_ARENA: 'sport location', + cte.GYMNASIUM: 'sport location', + cte.MOTION_PICTURE_THEATRE: 'event location', + cte.MUSEUM: 'event location', + cte.PERFORMING_ARTS_THEATRE: 'event location', + cte.TRANSPORTATION: 'n/a', + cte.AUTOMOTIVE_FACILITY: 'n/a', + cte.PARKING_GARAGE: 'n/a', + cte.RELIGIOUS: 'event location', + cte.NON_HEATED: 'non-heated' + } + + _usage_to_comnet_usage = { + cte.RESIDENTIAL: 'BA Multifamily', + cte.SINGLE_FAMILY_HOUSE: 'BA Multifamily', + cte.MULTI_FAMILY_HOUSE: 'BA Multifamily', + cte.ROW_HOUSE: 'BA Multifamily', + cte.MID_RISE_APARTMENT: 'BA Multifamily', + cte.HIGH_RISE_APARTMENT: 'BA Multifamily', + cte.OFFICE_AND_ADMINISTRATION: 'BA Office', + cte.SMALL_OFFICE: 'BA Office', + cte.MEDIUM_OFFICE: 'BA Office', + cte.LARGE_OFFICE: 'BA Office', + cte.COURTHOUSE: 'BA Courthouse', + cte.FIRE_STATION: 'BA Fire Station', + cte.PENITENTIARY: 'BA Penitentiary', + cte.POLICE_STATION: 'BA Police Station', + cte.POST_OFFICE: 'BA Post Office', + cte.LIBRARY: 'BA Library', + cte.EDUCATION: 'BA School/University', + cte.PRIMARY_SCHOOL: 'BA School/University', + cte.PRIMARY_SCHOOL_WITH_SHOWER: 'BA School/University', + cte.SECONDARY_SCHOOL: 'BA School/University', + cte.UNIVERSITY: 'BA School/University', + cte.LABORATORY_AND_RESEARCH_CENTER: 'BA School/University', + cte.STAND_ALONE_RETAIL: 'BA Retail', + cte.HOSPITAL: 'BA Hospital', + cte.OUT_PATIENT_HEALTH_CARE: 'BA Healthcare Clinic', + cte.HEALTH_CARE: 'BA Healthcare Clinic', + cte.RETIREMENT_HOME_OR_ORPHANAGE: 'BA Healthcare Clinic', + cte.COMMERCIAL: 'BA Retail', + cte.STRIP_MALL: 'BA Retail', + cte.SUPERMARKET: 'BA Retail', + cte.RETAIL_SHOP_WITHOUT_REFRIGERATED_FOOD: 'BA Retail', + cte.RETAIL_SHOP_WITH_REFRIGERATED_FOOD: 'BA Retail', + cte.RESTAURANT: 'BA Dining: Bar Lounge/Leisure', + cte.QUICK_SERVICE_RESTAURANT: 'BA Dining: Cafeteria/Fast Food', + cte.FULL_SERVICE_RESTAURANT: 'BA Dining: Bar Lounge/Leisure', + cte.HOTEL: 'BA Hotel', + cte.HOTEL_MEDIUM_CLASS: 'BA Motel', + cte.SMALL_HOTEL: 'BA Motel', + cte.LARGE_HOTEL: 'BA Hotel', + cte.DORMITORY: 'BA Dormitory', + cte.EVENT_LOCATION: 'BA Convention Center', + cte.CONVENTION_CENTER: 'BA Convention Center', + cte.HALL: 'BA Town Hall', + cte.GREEN_HOUSE: 'n/a', + cte.INDUSTRY: 'BA Manufacturing Facility', + cte.WORKSHOP: 'BA Workshop', + cte.WAREHOUSE: 'BA Warehouse', + cte.WAREHOUSE_REFRIGERATED: 'BA Warehouse', + cte.SPORTS_LOCATION: 'BA Exercise Center', + cte.SPORTS_ARENA: 'BA Sports Arena', + cte.GYMNASIUM: 'BA Gymnasium', + cte.MOTION_PICTURE_THEATRE: 'BA Motion Picture Theater', + cte.MUSEUM: 'BA Museum', + cte.PERFORMING_ARTS_THEATRE: 'BA Performing Arts Theater', + cte.TRANSPORTATION: 'BA Transportation', + cte.AUTOMOTIVE_FACILITY: 'BA Automotive Facility', + cte.PARKING_GARAGE: 'BA Parking Garage', + cte.RELIGIOUS: 'BA Religious Building', + cte.NON_HEATED: 'n/a' + } + + _usage_to_nrcan_usage = { + cte.RESIDENTIAL: 'Multi-unit residential building', + cte.SINGLE_FAMILY_HOUSE: 'Multi-unit residential building', + cte.MULTI_FAMILY_HOUSE: 'Multi-unit residential building', + cte.ROW_HOUSE: 'Multi-unit residential building', + cte.MID_RISE_APARTMENT: 'Multi-unit residential building', + cte.HIGH_RISE_APARTMENT: 'Multi-unit residential building', + cte.OFFICE_AND_ADMINISTRATION: 'Office', + cte.SMALL_OFFICE: 'Office', + cte.MEDIUM_OFFICE: 'Office', + cte.LARGE_OFFICE: 'Office', + cte.COURTHOUSE: 'Courthouse', + cte.FIRE_STATION: 'Fire station', + cte.PENITENTIARY: 'Penitentiary', + cte.POLICE_STATION: 'Police station', + cte.POST_OFFICE: 'Post office', + cte.LIBRARY: 'Library', + cte.EDUCATION: 'School/university', + cte.PRIMARY_SCHOOL: 'School/university', + cte.PRIMARY_SCHOOL_WITH_SHOWER: 'School/university', + cte.SECONDARY_SCHOOL: 'School/university', + cte.UNIVERSITY: 'School/university', + cte.LABORATORY_AND_RESEARCH_CENTER: 'School/university', + cte.STAND_ALONE_RETAIL: 'Retail', + cte.HOSPITAL: 'Hospital', + cte.OUT_PATIENT_HEALTH_CARE: 'Health-care clinic', + cte.HEALTH_CARE: 'Health-care clinic', + cte.RETIREMENT_HOME_OR_ORPHANAGE: 'Health-care clinic', + cte.COMMERCIAL: 'Retail', + cte.STRIP_MALL: 'Retail', + cte.SUPERMARKET: 'Retail', + cte.RETAIL_SHOP_WITHOUT_REFRIGERATED_FOOD: 'Retail', + cte.RETAIL_SHOP_WITH_REFRIGERATED_FOOD: 'Retail', + cte.RESTAURANT: 'Dining - bar/lounge', + cte.QUICK_SERVICE_RESTAURANT: 'Dining - cafeteria', + cte.FULL_SERVICE_RESTAURANT: 'Dining - bar/lounge', + cte.HOTEL: 'Hotel', + cte.HOTEL_MEDIUM_CLASS: 'Motel', + cte.SMALL_HOTEL: 'Motel', + cte.LARGE_HOTEL: 'Hotel', + cte.DORMITORY: 'Dormitory', + cte.EVENT_LOCATION: 'Convention centre', + cte.CONVENTION_CENTER: 'Convention centre', + cte.HALL: 'Town hall', + cte.GREEN_HOUSE: 'n/a', + cte.INDUSTRY: 'Manufacturing facility', + cte.WORKSHOP: 'Workshop', + cte.WAREHOUSE: 'Warehouse', + cte.WAREHOUSE_REFRIGERATED: 'Warehouse - refrigerated', + cte.SPORTS_LOCATION: 'Exercise centre', + cte.SPORTS_ARENA: 'Sports arena', + cte.GYMNASIUM: 'Gymnasium', + cte.MOTION_PICTURE_THEATRE: 'Motion picture theatre', + cte.MUSEUM: 'Museum', + cte.PERFORMING_ARTS_THEATRE: 'Performing arts theatre', + cte.TRANSPORTATION: 'Transportation', + cte.AUTOMOTIVE_FACILITY: 'Automotive facility', + cte.PARKING_GARAGE: 'Parking garage', + cte.RELIGIOUS: 'Religious', + cte.NON_HEATED: 'n/a' + } + + _function_to_nrcan_construction_function = { + cte.RESIDENTIAL: 'MidriseApartment', + cte.SINGLE_FAMILY_HOUSE: 'MidriseApartment', + cte.MULTI_FAMILY_HOUSE: 'HighriseApartment', + cte.ROW_HOUSE: 'MidriseApartment', + cte.MID_RISE_APARTMENT: 'MidriseApartment', + cte.HIGH_RISE_APARTMENT: 'HighriseApartment', + cte.OFFICE_AND_ADMINISTRATION: 'MediumOffice', + cte.SMALL_OFFICE: 'SmallOffice', + cte.MEDIUM_OFFICE: 'MediumOffice', + cte.LARGE_OFFICE: 'LargeOffice', + cte.COURTHOUSE: 'MediumOffice', + cte.FIRE_STATION: 'n/a', + cte.PENITENTIARY: 'LargeHotel', + cte.POLICE_STATION: 'n/a', + cte.POST_OFFICE: 'MediumOffice', + cte.LIBRARY: 'MediumOffice', + cte.EDUCATION: 'SecondarySchool', + cte.PRIMARY_SCHOOL: 'PrimarySchool', + cte.PRIMARY_SCHOOL_WITH_SHOWER: 'PrimarySchool', + cte.SECONDARY_SCHOOL: 'SecondarySchool', + cte.UNIVERSITY: 'SecondarySchool', + cte.LABORATORY_AND_RESEARCH_CENTER: 'SecondarySchool', + cte.STAND_ALONE_RETAIL: 'RetailStandalone', + cte.HOSPITAL: 'Hospital', + cte.OUT_PATIENT_HEALTH_CARE: 'Outpatient', + cte.HEALTH_CARE: 'Outpatient', + cte.RETIREMENT_HOME_OR_ORPHANAGE: 'SmallHotel', + cte.COMMERCIAL: 'RetailStripmall', + cte.STRIP_MALL: 'RetailStripmall', + cte.SUPERMARKET: 'RetailStripmall', + cte.RETAIL_SHOP_WITHOUT_REFRIGERATED_FOOD: 'RetailStandalone', + cte.RETAIL_SHOP_WITH_REFRIGERATED_FOOD: 'RetailStandalone', + cte.RESTAURANT: 'FullServiceRestaurant', + cte.QUICK_SERVICE_RESTAURANT: 'QuickServiceRestaurant', + cte.FULL_SERVICE_RESTAURANT: 'FullServiceRestaurant', + cte.HOTEL: 'SmallHotel', + cte.HOTEL_MEDIUM_CLASS: 'SmallHotel', + cte.SMALL_HOTEL: 'SmallHotel', + cte.LARGE_HOTEL: 'LargeHotel', + cte.DORMITORY: 'SmallHotel', + cte.EVENT_LOCATION: 'n/a', + cte.CONVENTION_CENTER: 'n/a', + cte.HALL: 'n/a', + cte.GREEN_HOUSE: 'n/a', + cte.INDUSTRY: 'n/a', + cte.WORKSHOP: 'n/a', + cte.WAREHOUSE: 'Warehouse', + cte.WAREHOUSE_REFRIGERATED: 'Warehouse', + cte.SPORTS_LOCATION: 'n/a', + cte.SPORTS_ARENA: 'n/a', + cte.GYMNASIUM: 'n/a', + cte.MOTION_PICTURE_THEATRE: 'n/a', + cte.MUSEUM: 'n/a', + cte.PERFORMING_ARTS_THEATRE: 'n/a', + cte.TRANSPORTATION: 'n/a', + cte.AUTOMOTIVE_FACILITY: 'n/a', + cte.PARKING_GARAGE: 'n/a', + cte.RELIGIOUS: 'n/a', + cte.NON_HEATED: 'n/a' + } + + _function_to_nrel_construction_function = { + cte.RESIDENTIAL: 'residential', + cte.SINGLE_FAMILY_HOUSE: 'residential', + cte.MULTI_FAMILY_HOUSE: 'midrise apartment', + cte.ROW_HOUSE: 'midrise apartment', + cte.MID_RISE_APARTMENT: 'midrise apartment', + cte.HIGH_RISE_APARTMENT: 'high-rise apartment', + cte.OFFICE_AND_ADMINISTRATION: 'medium office', + cte.SMALL_OFFICE: 'small office', + cte.MEDIUM_OFFICE: 'medium office', + cte.LARGE_OFFICE: 'large office', + cte.COURTHOUSE: 'medium office', + cte.FIRE_STATION: 'n/a', + cte.PENITENTIARY: 'large hotel', + cte.POLICE_STATION: 'n/a', + cte.POST_OFFICE: 'medium office', + cte.LIBRARY: 'medium office', + cte.EDUCATION: 'secondary school', + cte.PRIMARY_SCHOOL: 'primary school', + cte.PRIMARY_SCHOOL_WITH_SHOWER: 'primary school', + cte.SECONDARY_SCHOOL: 'secondary school', + cte.UNIVERSITY: 'secondary school', + cte.LABORATORY_AND_RESEARCH_CENTER: 'secondary school', + cte.STAND_ALONE_RETAIL: 'stand-alone retail', + cte.HOSPITAL: 'hospital', + cte.OUT_PATIENT_HEALTH_CARE: 'outpatient healthcare', + cte.HEALTH_CARE: 'outpatient healthcare', + cte.RETIREMENT_HOME_OR_ORPHANAGE: 'small hotel', + cte.COMMERCIAL: 'strip mall', + cte.STRIP_MALL: 'strip mall', + cte.SUPERMARKET: 'supermarket', + cte.RETAIL_SHOP_WITHOUT_REFRIGERATED_FOOD: 'stand-alone retail', + cte.RETAIL_SHOP_WITH_REFRIGERATED_FOOD: 'stand-alone retail', + cte.RESTAURANT: 'full service restaurant', + cte.QUICK_SERVICE_RESTAURANT: 'quick service restaurant', + cte.FULL_SERVICE_RESTAURANT: 'full service restaurant', + cte.HOTEL: 'small hotel', + cte.HOTEL_MEDIUM_CLASS: 'small hotel', + cte.SMALL_HOTEL: 'small hotel', + cte.LARGE_HOTEL: 'large hotel', + cte.DORMITORY: 'small hotel', + cte.EVENT_LOCATION: 'n/a', + cte.CONVENTION_CENTER: 'n/a', + cte.HALL: 'n/a', + cte.GREEN_HOUSE: 'n/a', + cte.INDUSTRY: 'n/a', + cte.WORKSHOP: 'n/a', + cte.WAREHOUSE: 'warehouse', + cte.WAREHOUSE_REFRIGERATED: 'warehouse', + cte.SPORTS_LOCATION: 'n/a', + cte.SPORTS_ARENA: 'n/a', + cte.GYMNASIUM: 'n/a', + cte.MOTION_PICTURE_THEATRE: 'n/a', + cte.MUSEUM: 'n/a', + cte.PERFORMING_ARTS_THEATRE: 'n/a', + cte.TRANSPORTATION: 'n/a', + cte.AUTOMOTIVE_FACILITY: 'n/a', + cte.PARKING_GARAGE: 'n/a', + cte.RELIGIOUS: 'n/a', + cte.NON_HEATED: 'n/a' + } + + _pluto_function_to_hub_function = { + 'A0': cte.SINGLE_FAMILY_HOUSE, + 'A1': cte.SINGLE_FAMILY_HOUSE, + 'A2': cte.SINGLE_FAMILY_HOUSE, + 'A3': cte.SINGLE_FAMILY_HOUSE, + 'A4': cte.SINGLE_FAMILY_HOUSE, + 'A5': cte.SINGLE_FAMILY_HOUSE, + 'A6': cte.SINGLE_FAMILY_HOUSE, + 'A7': cte.SINGLE_FAMILY_HOUSE, + 'A8': cte.SINGLE_FAMILY_HOUSE, + 'A9': cte.SINGLE_FAMILY_HOUSE, + 'B1': cte.MULTI_FAMILY_HOUSE, + 'B2': cte.MULTI_FAMILY_HOUSE, + 'B3': cte.MULTI_FAMILY_HOUSE, + 'B9': cte.MULTI_FAMILY_HOUSE, + 'C0': cte.RESIDENTIAL, + 'C1': cte.RESIDENTIAL, + 'C2': cte.RESIDENTIAL, + 'C3': cte.RESIDENTIAL, + 'C4': cte.RESIDENTIAL, + 'C5': cte.RESIDENTIAL, + 'C6': cte.RESIDENTIAL, + 'C7': cte.RESIDENTIAL, + 'C8': cte.RESIDENTIAL, + 'C9': cte.RESIDENTIAL, + 'D0': cte.RESIDENTIAL, + 'D1': cte.RESIDENTIAL, + 'D2': cte.RESIDENTIAL, + 'D3': cte.RESIDENTIAL, + 'D4': cte.RESIDENTIAL, + 'D5': cte.RESIDENTIAL, + 'D6': cte.RESIDENTIAL, + 'D7': cte.RESIDENTIAL, + 'D8': cte.RESIDENTIAL, + 'D9': cte.RESIDENTIAL, + 'E1': cte.WAREHOUSE, + 'E3': cte.WAREHOUSE, + 'E4': cte.WAREHOUSE, + 'E5': cte.WAREHOUSE, + 'E7': cte.WAREHOUSE, + 'E9': cte.WAREHOUSE, + 'F1': cte.WAREHOUSE, + 'F2': cte.WAREHOUSE, + 'F4': cte.WAREHOUSE, + 'F5': cte.WAREHOUSE, + 'F8': cte.WAREHOUSE, + 'F9': cte.WAREHOUSE, + 'G0': cte.SMALL_OFFICE, + 'G1': cte.SMALL_OFFICE, + 'G2': cte.SMALL_OFFICE, + 'G3': cte.SMALL_OFFICE, + 'G4': cte.SMALL_OFFICE, + 'G5': cte.SMALL_OFFICE, + 'G6': cte.SMALL_OFFICE, + 'G7': cte.SMALL_OFFICE, + 'G8': cte.SMALL_OFFICE, + 'G9': cte.SMALL_OFFICE, + 'H1': cte.HOTEL, + 'H2': cte.HOTEL, + 'H3': cte.HOTEL, + 'H4': cte.HOTEL, + 'H5': cte.HOTEL, + 'H6': cte.HOTEL, + 'H7': cte.HOTEL, + 'H8': cte.HOTEL, + 'H9': cte.HOTEL, + 'HB': cte.HOTEL, + 'HH': cte.HOTEL, + 'HR': cte.HOTEL, + 'HS': cte.HOTEL, + 'I1': cte.HOSPITAL, + 'I2': cte.OUT_PATIENT_HEALTH_CARE, + 'I3': cte.OUT_PATIENT_HEALTH_CARE, + 'I4': cte.RESIDENTIAL, + 'I5': cte.OUT_PATIENT_HEALTH_CARE, + 'I6': cte.OUT_PATIENT_HEALTH_CARE, + 'I7': cte.OUT_PATIENT_HEALTH_CARE, + 'I9': cte.OUT_PATIENT_HEALTH_CARE, + 'J1': cte.LARGE_OFFICE, + 'J2': cte.LARGE_OFFICE, + 'J3': cte.LARGE_OFFICE, + 'J4': cte.LARGE_OFFICE, + 'J5': cte.LARGE_OFFICE, + 'J6': cte.LARGE_OFFICE, + 'J7': cte.LARGE_OFFICE, + 'J8': cte.LARGE_OFFICE, + 'J9': cte.LARGE_OFFICE, + 'K1': cte.STRIP_MALL, + 'K2': cte.STRIP_MALL, + 'K3': cte.STRIP_MALL, + 'K4': cte.RESIDENTIAL, + 'K5': cte.RESTAURANT, + 'K6': cte.SUPERMARKET, + 'K7': cte.SUPERMARKET, + 'K8': cte.SUPERMARKET, + 'K9': cte.SUPERMARKET, + 'L1': cte.RESIDENTIAL, + 'L2': cte.RESIDENTIAL, + 'L3': cte.RESIDENTIAL, + 'L8': cte.RESIDENTIAL, + 'L9': cte.RESIDENTIAL, + 'M1': cte.LARGE_OFFICE, + 'M2': cte.LARGE_OFFICE, + 'M3': cte.LARGE_OFFICE, + 'M4': cte.LARGE_OFFICE, + 'M9': cte.LARGE_OFFICE, + 'N1': cte.RESIDENTIAL, + 'N2': cte.RESIDENTIAL, + 'N3': cte.RESIDENTIAL, + 'N4': cte.RESIDENTIAL, + 'N9': cte.RESIDENTIAL, + 'O1': cte.SMALL_OFFICE, + 'O2': cte.SMALL_OFFICE, + 'O3': cte.SMALL_OFFICE, + 'O4': cte.SMALL_OFFICE, + 'O5': cte.SMALL_OFFICE, + 'O6': cte.SMALL_OFFICE, + 'O7': cte.SMALL_OFFICE, + 'O8': cte.SMALL_OFFICE, + 'O9': cte.SMALL_OFFICE, + 'P1': cte.LARGE_OFFICE, + 'P2': cte.HOTEL, + 'P3': cte.SMALL_OFFICE, + 'P4': cte.SMALL_OFFICE, + 'P5': cte.SMALL_OFFICE, + 'P6': cte.SMALL_OFFICE, + 'P7': cte.LARGE_OFFICE, + 'P8': cte.LARGE_OFFICE, + 'P9': cte.SMALL_OFFICE, + 'Q0': cte.SMALL_OFFICE, + 'Q1': cte.SMALL_OFFICE, + 'Q2': cte.SMALL_OFFICE, + 'Q3': cte.SMALL_OFFICE, + 'Q4': cte.SMALL_OFFICE, + 'Q5': cte.SMALL_OFFICE, + 'Q6': cte.SMALL_OFFICE, + 'Q7': cte.SMALL_OFFICE, + 'Q8': cte.SMALL_OFFICE, + 'Q9': cte.SMALL_OFFICE, + 'R0': cte.RESIDENTIAL, + 'R1': cte.RESIDENTIAL, + 'R2': cte.RESIDENTIAL, + 'R3': cte.RESIDENTIAL, + 'R4': cte.RESIDENTIAL, + 'R5': cte.RESIDENTIAL, + 'R6': cte.RESIDENTIAL, + 'R7': cte.RESIDENTIAL, + 'R8': cte.RESIDENTIAL, + 'R9': cte.RESIDENTIAL, + 'RA': cte.RESIDENTIAL, + 'RB': cte.RESIDENTIAL, + 'RC': cte.RESIDENTIAL, + 'RD': cte.RESIDENTIAL, + 'RG': cte.RESIDENTIAL, + 'RH': cte.RESIDENTIAL, + 'RI': cte.RESIDENTIAL, + 'RK': cte.RESIDENTIAL, + 'RM': cte.RESIDENTIAL, + 'RR': cte.RESIDENTIAL, + 'RS': cte.RESIDENTIAL, + 'RW': cte.RESIDENTIAL, + 'RX': cte.RESIDENTIAL, + 'RZ': cte.RESIDENTIAL, + 'S0': cte.RESIDENTIAL, + 'S1': cte.RESIDENTIAL, + 'S2': cte.RESIDENTIAL, + 'S3': cte.RESIDENTIAL, + 'S4': cte.RESIDENTIAL, + 'S5': cte.RESIDENTIAL, + 'S9': cte.RESIDENTIAL, + 'U0': cte.WAREHOUSE, + 'U1': cte.WAREHOUSE, + 'U2': cte.WAREHOUSE, + 'U3': cte.WAREHOUSE, + 'U4': cte.WAREHOUSE, + 'U5': cte.WAREHOUSE, + 'U6': cte.WAREHOUSE, + 'U7': cte.WAREHOUSE, + 'U8': cte.WAREHOUSE, + 'U9': cte.WAREHOUSE, + 'W1': cte.PRIMARY_SCHOOL, + 'W2': cte.PRIMARY_SCHOOL, + 'W3': cte.SECONDARY_SCHOOL, + 'W4': cte.EDUCATION, + 'W5': cte.SECONDARY_SCHOOL, + 'W6': cte.SECONDARY_SCHOOL, + 'W7': cte.SECONDARY_SCHOOL, + 'W8': cte.PRIMARY_SCHOOL, + 'W9': cte.SECONDARY_SCHOOL, + 'Y1': cte.LARGE_OFFICE, + 'Y2': cte.LARGE_OFFICE, + 'Y3': cte.LARGE_OFFICE, + 'Y4': cte.LARGE_OFFICE, + 'Y5': cte.LARGE_OFFICE, + 'Y6': cte.LARGE_OFFICE, + 'Y7': cte.LARGE_OFFICE, + 'Y8': cte.LARGE_OFFICE, + 'Y9': cte.LARGE_OFFICE, + 'Z1': cte.LARGE_OFFICE + } + _hft_function_to_hub_function = { + 'residential': cte.RESIDENTIAL, + 'single family house': cte.SINGLE_FAMILY_HOUSE, + 'multifamily house': cte.MULTI_FAMILY_HOUSE, + 'hotel': cte.HOTEL, + 'hospital': cte.HOSPITAL, + 'outpatient': cte.OUT_PATIENT_HEALTH_CARE, + 'commercial': cte.SUPERMARKET, + 'strip mall': cte.STRIP_MALL, + 'warehouse': cte.WAREHOUSE, + 'primary school': cte.PRIMARY_SCHOOL, + 'secondary school': cte.EDUCATION, + 'office': cte.MEDIUM_OFFICE, + 'large office': cte.LARGE_OFFICE + } + + @property + def hub_usage_to_hft_usage(self): + """ + Get HfT usage from the given internal usage + :return: dict + """ + return self._usage_to_hft_usage + + @property + def hub_usage_to_comnet_usage(self): + """ + Get Comnet usage from the given internal usage + :return: dict + """ + return self._usage_to_comnet_usage + + @property + def hub_usage_to_nrcan_usage(self): + """ + Get Nrcan usage from the given internal usage + :return: dict + """ + return self._usage_to_nrcan_usage + + @property + def hub_function_to_nrcan_construction_function(self): + """ + Get Nrcan construction function from the given internal function + :return: dict + """ + return self._function_to_nrcan_construction_function + + @property + def hub_function_to_nrel_construction_function(self): + """ + Get Nrel construction function from the given internal function + :return: dict + """ + return self._function_to_nrel_construction_function + + @property + def pluto_function_to_hub_function(self): + """ + Set internal function from pluto standard + :return: dict + """ + return self._pluto_function_to_hub_function + + @property + def hft_function_to_hub_function(self): + """ + Set internal function from functions used in hft files + :return: dict + """ + return self._hft_function_to_hub_function diff --git a/hub/imports/construction/nrel_physics_parameters.py b/hub/imports/construction/nrel_physics_parameters.py index 8364c70c..6de4771a 100644 --- a/hub/imports/construction/nrel_physics_parameters.py +++ b/hub/imports/construction/nrel_physics_parameters.py @@ -20,11 +20,11 @@ class NrelPhysicsParameters: """ NrelPhysicsParameters class """ + def __init__(self, city, base_path, divide_in_storeys=False): self._city = city self._path = base_path self._divide_in_storeys = divide_in_storeys - print(city.name) self._climate_zone = ConstructionHelper.city_to_nrel_climate_zone(city.name) def enrich_buildings(self): @@ -40,8 +40,8 @@ class NrelPhysicsParameters: self._climate_zone) except KeyError: logger.error(f'Building {building.name} has unknown archetype for building function: {building.function} ' - f'and building year of construction: {building.year_of_construction} ' - f'and climate zone reference norm {self._climate_zone}\n') + f'and building year of construction: {building.year_of_construction} ' + f'and climate zone reference norm {self._climate_zone}\n') sys.stderr.write(f'Building {building.name} has unknown archetype for building function: {building.function} ' f'and building year of construction: {building.year_of_construction} ' f'and climate zone reference norm {self._climate_zone}\n') diff --git a/hub/imports/construction/us_physics_parameters.py b/hub/imports/construction/us_physics_parameters.py index a4c669eb..5f0dc68f 100644 --- a/hub/imports/construction/us_physics_parameters.py +++ b/hub/imports/construction/us_physics_parameters.py @@ -24,7 +24,6 @@ class NrelPhysicsParameters: self._city = city self._path = base_path self._divide_in_storeys = divide_in_storeys - print(city.name) self._climate_zone = ConstructionHelper.city_to_nrel_climate_zone(city.name) def enrich_buildings(self): diff --git a/hub/imports/construction_factory.py b/hub/imports/construction_factory.py index c2644979..f9ce905a 100644 --- a/hub/imports/construction_factory.py +++ b/hub/imports/construction_factory.py @@ -7,7 +7,6 @@ Code contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concord """ from pathlib import Path -from hub.imports.construction.us_physics_parameters import UsPhysicsParameters from hub.hub_logger import logger from hub.helpers.utils import validate_import_export_type from hub.imports.construction.nrel_physics_parameters import NrelPhysicsParameters @@ -24,7 +23,7 @@ class ConstructionFactory: self._handler = '_' + handler.lower().replace(' ', '_') class_funcs = validate_import_export_type(ConstructionFactory) if self._handler not in class_funcs: - err_msg = f"Wrong import type. Valid functions include {class_funcs}" + err_msg = f"Wrong import type [{self._handler}]. Valid functions include {class_funcs}" logger.error(err_msg) raise Exception(err_msg) self._city = city diff --git a/hub/imports/geometry/citygml.py b/hub/imports/geometry/citygml.py index 642cf2e6..a4573b11 100644 --- a/hub/imports/geometry/citygml.py +++ b/hub/imports/geometry/citygml.py @@ -26,7 +26,10 @@ class CityGml: self._lod2_tags = ['lod2Solid', 'lod2MultiSurface', 'lod2MultiCurve'] self._extrusion_height_field = extrusion_height_field self._year_of_construction_field = year_of_construction_field + if function_field == None: + function_field = 'function' self._function_field = function_field + self._lower_corner = None self._upper_corner = None with open(path) as gml: @@ -110,7 +113,10 @@ class CityGml: if 'yearOfConstruction' in city_object: year_of_construction = city_object['yearOfConstruction'] if 'function' in city_object: - function = city_object['function'] + function = city_object[self._function_field] + if type(function) != str: + function = function['#text'] + if any(key in city_object for key in self._lod1_tags): if self._lod is None or self._lod > 1: self._lod = 1 diff --git a/hub/imports/usage/comnet_usage_parameters.py b/hub/imports/usage/comnet_usage_parameters.py index 47fcc605..e73c8690 100644 --- a/hub/imports/usage/comnet_usage_parameters.py +++ b/hub/imports/usage/comnet_usage_parameters.py @@ -9,17 +9,15 @@ import sys import numpy import hub.helpers.constants as cte -from hub.helpers.configuration_helper import ConfigurationHelper as ch -from hub.imports.geometry.helpers.geometry_helper import GeometryHelper -from hub.imports.usage.helpers.usage_helper import UsageHelper -from hub.imports.usage.helpers.schedules_helper import SchedulesHelper -from hub.city_model_structure.building_demand.usage_zone import UsageZone +from hub.helpers.dictionaries import Dictionaries +from hub.city_model_structure.building_demand.usage import Usage from hub.city_model_structure.building_demand.lighting import Lighting from hub.city_model_structure.building_demand.occupancy import Occupancy from hub.city_model_structure.building_demand.appliances import Appliances from hub.city_model_structure.building_demand.thermal_control import ThermalControl from hub.city_model_structure.attributes.schedule import Schedule from hub.city_model_structure.building_demand.internal_gain import InternalGain +from hub.catalog_factories.usage_catalog_factory import UsageCatalogFactory class ComnetUsageParameters: diff --git a/hub/imports/usage/helpers/usage_helper.py b/hub/imports/usage/helpers/usage_helper.py index 112a2771..b7b4a494 100644 --- a/hub/imports/usage/helpers/usage_helper.py +++ b/hub/imports/usage/helpers/usage_helper.py @@ -12,49 +12,12 @@ class UsageHelper: """ Usage helper class """ - _usage_to_hft = { - cte.RESIDENTIAL: 'residential', - cte.SINGLE_FAMILY_HOUSE: 'Single family house', - cte.MULTI_FAMILY_HOUSE: 'Multi-family house', - cte.EDUCATION: 'education', - cte.SCHOOL_WITHOUT_SHOWER: 'school without shower', - cte.SCHOOL_WITH_SHOWER: 'school with shower', - cte.RETAIL_SHOP_WITHOUT_REFRIGERATED_FOOD: 'retail', - cte.RETAIL_SHOP_WITH_REFRIGERATED_FOOD: 'retail shop / refrigerated food', - cte.HOTEL: 'hotel', - cte.HOTEL_MEDIUM_CLASS: 'hotel (Medium-class)', - cte.DORMITORY: 'dormitory', - cte.INDUSTRY: 'industry', - cte.RESTAURANT: 'restaurant', - cte.HEALTH_CARE: 'health care', - cte.RETIREMENT_HOME_OR_ORPHANAGE: 'Home for the aged or orphanage', - cte.OFFICE_AND_ADMINISTRATION: 'office and administration', - cte.EVENT_LOCATION: 'event location', - cte.HALL: 'hall', - cte.SPORTS_LOCATION: 'sport location', - cte.LABOR: 'Labor', - cte.GREEN_HOUSE: 'green house', - cte.NON_HEATED: 'non-heated'} - - @staticmethod - def hft_from_libs_usage(usage): - """ - Get HfT usage from the given internal usage key - :param usage: str - :return: str - """ - try: - return UsageHelper._usage_to_hft[usage] - except KeyError: - sys.stderr.write('Error: keyword not found to translate from libs_usage to hft usage.\n') _usage_to_comnet = { cte.RESIDENTIAL: 'BA Multifamily', cte.SINGLE_FAMILY_HOUSE: 'BA Multifamily', cte.MULTI_FAMILY_HOUSE: 'BA Multifamily', cte.EDUCATION: 'BA School/University', - cte.SCHOOL_WITHOUT_SHOWER: 'BA School/University', - cte.SCHOOL_WITH_SHOWER: 'BA School/University', cte.RETAIL_SHOP_WITHOUT_REFRIGERATED_FOOD: 'BA Retail', cte.RETAIL_SHOP_WITH_REFRIGERATED_FOOD: 'BA Retail', cte.HOTEL: 'BA Hotel', @@ -68,7 +31,6 @@ class UsageHelper: cte.EVENT_LOCATION: 'BA Convention Center', cte.HALL: 'BA Convention Center', cte.SPORTS_LOCATION: 'BA Sports Arena', - cte.LABOR: 'BA Gymnasium', cte.GREEN_HOUSE: cte.GREEN_HOUSE, cte.NON_HEATED: cte.NON_HEATED } diff --git a/hub/imports/usage_factory.py b/hub/imports/usage_factory.py index 0300572f..e8962480 100644 --- a/hub/imports/usage_factory.py +++ b/hub/imports/usage_factory.py @@ -23,7 +23,7 @@ class UsageFactory: self._handler = '_' + handler.lower().replace(' ', '_') class_funcs = validate_import_export_type(UsageFactory) if self._handler not in class_funcs: - err_msg = f"Wrong import type. Valid functions include {class_funcs}" + err_msg = f"Wrong import type [{self._handler}]. Valid functions include {class_funcs}" logger.error(err_msg) raise Exception(err_msg) self._city = city diff --git a/hub/unittests/test_city_layers.py b/hub/unittests/test_city_layers.py index dee4e26b..a763e895 100644 --- a/hub/unittests/test_city_layers.py +++ b/hub/unittests/test_city_layers.py @@ -69,8 +69,6 @@ class CityLayerTest(TestCase): adjacent_buildings=adjacent_buildings).export_debug() filepath = os.path.join(output_path, city.name + ".idf") newfilepath = filepath[:-4] + "_" + uuid.uuid4().hex[:10] + ".idf" - print(filepath) - print(newfilepath) os.rename(filepath, newfilepath) print(f"It took {round((time.time() - t0), 0)} seconds") return newfilepath diff --git a/hub/unittests/test_exports.py b/hub/unittests/test_exports.py index cb24820f..2b8afe63 100644 --- a/hub/unittests/test_exports.py +++ b/hub/unittests/test_exports.py @@ -51,7 +51,7 @@ class TestExports(TestCase): building.function = Dictionaries().hft_function_to_hub_function[building.function] building.year_of_construction = 2006 ConstructionFactory('nrel', self._complete_city).enrich() - UsageFactory('ca', self._complete_city).enrich() + UsageFactory('nrcan', self._complete_city).enrich() cli = (self._example_path / 'weather' / 'inseldb_Summerland.cli').resolve() self._complete_city.climate_file = Path(cli) self._complete_city.climate_reference_city = 'Summerland' @@ -67,6 +67,12 @@ class TestExports(TestCase): self._complete_city = self._get_complete_city(from_pickle) ExportsFactory(export_type, self._complete_city, self._output_path).export() + def _export_building_energy(self, export_type, from_pickle=False): + self._complete_city = self._get_complete_city(from_pickle) + EnergyBuildingsExportsFactory(export_type, self._complete_city, self._output_path).export() + + + def test_obj_export(self): """ export to obj @@ -83,7 +89,7 @@ class TestExports(TestCase): """ export to energy ADE """ - self._export('energy_ade') + self._export_building_energy('energy_ade') def test_sra_export(self): """