Skip to content

Commit 1618e10

Browse files
committed
reformatting, check for CC mode
1 parent d421434 commit 1618e10

File tree

2 files changed

+36
-19
lines changed

2 files changed

+36
-19
lines changed

kadi/commands/validate.py

+24-11
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,7 @@ def state_vals(self):
722722
class ValidateACISStatePower(ValidateSingleMsid):
723723
state_name = "dpa_power"
724724
msids = ["dpa_power"]
725-
state_keys_extra = ["ccd_count", "clocking", "feps", "ccds", "fep_count", "simpos"]
725+
state_keys_extra = ["ccd_count", "clocking", "feps", "ccds", "fep_count", "si_mode"]
726726
plot_attrs = PlotAttrs(title="DPA Power", ylabel="DPA Power (W)")
727727
min_violation_duration = 600.0 # seconds
728728
max_delta_val = 2.0 # W
@@ -744,24 +744,37 @@ def states(self):
744744

745745
@functools.cached_property
746746
def state_vals(self):
747-
istates = interpolate_states(self.states, self.times)
748-
# create on-off states for FEPs
747+
int_states = interpolate_states(self.states, self.times)
748+
749+
# create on-off states for FEPs and CCDs
749750
ccds = [f"I{i}" for i in range(4)] + [f"S{i}" for i in range(6)]
750751
ccdsfeps = defaultdict(list)
751-
for row in istates:
752+
for row in int_states:
752753
for i in range(6):
753-
ccdsfeps[f"FEP{i}"].append(float(str(i) in row["feps"]))
754-
for ccd in ccds:
755-
ccdsfeps[ccd].append(float(str(ccd) in row["ccds"]))
754+
ccdsfeps[f"FEP{i}"].append(str(i) in row["feps"])
755+
for key in ccds:
756+
ccdsfeps[key].append(key in row["ccds"])
756757
for key in ccdsfeps:
757-
istates[key] = ccdsfeps[key]
758-
df = istates.to_pandas()
759-
keep_cols = list(ccdsfeps.keys())
760-
XX = df.drop([col for col in istates.colnames if col not in keep_cols], axis=1)
758+
int_states[key] = np.array(ccdsfeps[key], dtype="float64")
759+
760+
# check for continuous clocking mode
761+
int_states["cc"] = np.char.startswith(int_states["si_mode"], "CC").astype(
762+
"float64"
763+
)
764+
int_states["cc"] *= ~int_states["clocking"].astype("bool")
765+
766+
# Convert to pandas DataFrame, so we can use sklearn
767+
df = int_states.to_pandas()
768+
keep_cols = ["cc"] + list(ccdsfeps.keys())
769+
XX = df.drop(
770+
[col for col in int_states.colnames if col not in keep_cols], axis=1
771+
)
761772
XX = self.scaler_X.fit_transform(XX.values)
762773
yy = self.model.predict(XX)
774+
763775
# Inverse transform the predictions and actual values
764776
_state_vals = self.scaler_y.inverse_transform(yy.reshape(-1, 1)).flatten()
777+
765778
return _state_vals
766779

767780
def add_exclude_intervals(self):

kadi/scripts/create_dpa_power_model.py

+12-8
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from collections import defaultdict
44

55
import astropy.units as u
6+
import numpy as np
67
from cheta import fetch_sci as fetch
78
from cxotime import CxoTime
89
from joblib import dump
@@ -59,11 +60,10 @@ def main():
5960
state_keys = [
6061
"ccd_count",
6162
"clocking",
62-
"simpos",
6363
"feps",
6464
"ccds",
6565
"fep_count",
66-
"power_cmd",
66+
"si_mode",
6767
]
6868

6969
# Get commanded states
@@ -81,21 +81,25 @@ def main():
8181

8282
logger.setLevel(args.log_level)
8383

84-
# create on-off states for FEPs
84+
# create on-off states for FEPs and CCDs
8585
ccds = [f"I{i}" for i in range(4)] + [f"S{i}" for i in range(6)]
8686
ccdsfeps = defaultdict(list)
8787
for row in int_states:
8888
for i in range(6):
89-
ccdsfeps[f"FEP{i}"].append(float(str(i) in row["feps"]))
90-
for ccd in ccds:
91-
ccdsfeps[ccd].append(float(str(ccd) in row["ccds"]))
89+
ccdsfeps[f"FEP{i}"].append(str(i) in row["feps"])
90+
for key in ccds:
91+
ccdsfeps[key].append(key in row["ccds"])
9292
for key in ccdsfeps:
93-
int_states[key] = ccdsfeps[key]
93+
int_states[key] = np.array(ccdsfeps[key], dtype="float64")
94+
95+
# check for continuous clocking mode
96+
int_states["cc"] = np.char.startswith(int_states["si_mode"], "CC").astype("float64")
97+
int_states["cc"] *= ~int_states["clocking"].astype("bool")
9498

9599
# Convert to pandas DataFrame, so we can use sklearn
96100
df = int_states.to_pandas()
97101

98-
model_keys = list(ccdsfeps.keys())
102+
model_keys = ["cc"] + list(ccdsfeps.keys())
99103

100104
# Separate into features and target
101105
X = df.drop([col for col in int_states.colnames if col not in model_keys], axis=1)

0 commit comments

Comments
 (0)