@@ -340,7 +340,7 @@ class UsefulVars(object):
340340 sensitive valuation for heating (no load shapes for these gains).
341341 """
342342
343- def __init__(self, base_dir, handyfiles, opts):
343+ def __init__(self, base_dir, handyfiles, opts, allow_overwrite=False ):
344344 self.adopt_schemes = opts.adopt_scn_restrict
345345 self.discount_rate = 0.07
346346 self.nsamples = 100
@@ -1236,7 +1236,6 @@ def __init__(self, base_dir, handyfiles, opts):
12361236 "AFUE": {"COP": 1}, "UEF": {"SEF": 1},
12371237 "EF": {"UEF": 1, "SEF": 1, "CEF": 1},
12381238 "SEF": {"UEF": 1}}
1239- self.sf_to_house = {}
12401239 self.com_eqp_eus_nostk = [
12411240 "PCs", "non-PC office equipment", "MELs", "other"]
12421241 self.res_lts_per_home = {
@@ -1548,6 +1547,18 @@ def __init__(self, base_dir, handyfiles, opts):
15481547 self.env_heat_ls_scrn = (
15491548 "windows solar", "equipment gain", "people gain",
15501549 "other heat gain")
1550+ self._allow_overwrite = allow_overwrite
1551+ self._initialized = True
1552+
1553+ def __setattr__(self, name, value):
1554+ if name == "adopt_schemes":
1555+ print(f"wrting adoptSchems: {value}")
1556+ if not hasattr(self, "_initialized"):
1557+ super().__setattr__(name, value)
1558+ elif hasattr(self, "_allow_overwrite") and self._allow_overwrite:
1559+ super().__setattr__(name, value)
1560+ else:
1561+ raise ValueError(f"Cannot modify instance variables after initialization: {name}")
15511562
15521563 def set_peak_take(self, sysload_dat, restrict_key):
15531564 """Fill in dicts with seasonal system load shape data.
@@ -1931,6 +1942,8 @@ class Measure(object):
19311942 eff_fs_splt (dict): Data needed to determine the fuel splits of
19321943 efficient case results for fuel switching measures.
19331944 handyvars (object): Global variables useful across class methods.
1945+ sf_to_house (dict): Stores information for mapping stock units in
1946+ sf to number of households, as applicable.
19341947 retro_rate (float or list): Stock retrofit rate specific to the ECM.
19351948 tech_switch_to (str, None): Technology switch to flag.
19361949 technology_type (string): Flag for supply- or demand-side technology.
@@ -1983,7 +1996,9 @@ def __init__(
19831996 self.sector_shapes = None
19841997 # Deep copy handy vars to avoid any dependence of changes to these vars
19851998 # across other measures that use them
1986- self.handyvars = copy.deepcopy(handyvars)
1999+ # self.handyvars = copy.deepcopy(handyvars)
2000+ self.handyvars = handyvars
2001+ self.sf_to_house = {}
19872002 # Set the rate of baseline retrofitting for ECM stock-and-flow calcs
19882003 try:
19892004 # Check first to see whether pulling up retrofit rate errors
@@ -4587,28 +4602,26 @@ def fill_mkts(self, msegs, msegs_cpl, convert_data, tsv_data_init, opts,
45874602 # Check if data were already pulled for current
45884603 # combination of climate/building type; if not,
45894604 # pull and store the data
4590- if sf_to_house_key not in \
4591- self.handyvars.sf_to_house.keys():
4605+ if sf_to_house_key not in self.sf_to_house.keys():
45924606 # Conversion from $/sf to $/home divides number of
45934607 # homes in a given climate/res. building type by the
45944608 # total square footage of those homes; multiply by 1M
45954609 # given EIA convention of reporting in Msf
4596- self.handyvars. sf_to_house[sf_to_house_key] = {
4610+ self.sf_to_house[sf_to_house_key] = {
45974611 yr: mseg_sqft_stock["total homes"][yr] / (
45984612 mseg_sqft_stock["total square footage"][yr] *
45994613 1000000) for yr in self.handyvars.aeo_years}
4600-
46014614 # Convert measure costs to $/home (assumed synonymous with
46024615 # $/unit for envelope cases); handle cases where measure
46034616 # cost is separated out by year or not
46044617 try:
46054618 cost_meas = {
4606- yr: cost_meas[yr] / self.handyvars. sf_to_house[
4619+ yr: cost_meas[yr] / self.sf_to_house[
46074620 sf_to_house_key][yr]
46084621 for yr in self.handyvars.aeo_years}
46094622 except (IndexError, TypeError):
46104623 cost_meas = {
4611- yr: cost_meas / self.handyvars. sf_to_house[
4624+ yr: cost_meas / self.sf_to_house[
46124625 sf_to_house_key][yr]
46134626 for yr in self.handyvars.aeo_years}
46144627 # Handle special case of a residential lighting controls
@@ -4626,7 +4639,7 @@ def fill_mkts(self, msegs, msegs_cpl, convert_data, tsv_data_init, opts,
46264639 # measures)
46274640 if sqft_subst == 1:
46284641 cost_base = {
4629- yr: cost_base[yr] / self.handyvars. sf_to_house[
4642+ yr: cost_base[yr] / self.sf_to_house[
46304643 sf_to_house_key][yr]
46314644 for yr in self.handyvars.aeo_years}
46324645 # Set measure and baseline cost units to $/unit
@@ -5220,10 +5233,10 @@ def fill_mkts(self, msegs, msegs_cpl, convert_data, tsv_data_init, opts,
52205233 # above and applied to the stock costs for these
52215234 # microsegments, and is reused here for the stock
52225235 if sf_to_house_key and sf_to_house_key in \
5223- self.handyvars. sf_to_house.keys():
5236+ self.sf_to_house.keys():
52245237 add_stock = {
52255238 key: val * new_existing_frac[key] *
5226- self.handyvars. sf_to_house[sf_to_house_key][key] *
5239+ self.sf_to_house[sf_to_house_key][key] *
52275240 1000000 for key, val in mseg_sqft_stock[
52285241 "total square footage"].items()
52295242 if key in self.handyvars.aeo_years}
0 commit comments