31
31
"CalibPtcCovarScatterTool" ,
32
32
)
33
33
34
- from typing import cast , TypeVar , Callable , Any
34
+ from typing import cast , TypeVar , Callable , Any , TypeAlias
35
35
36
36
from lsst .pex .config import Field , ListField
37
37
from lsst .pex .config .configurableActions import ConfigurableActionField
59
59
15 : "C17" ,
60
60
}
61
61
62
+ #Dummy class just so we can get the type annotations correct
63
+ RepackerLoopFun : TypeAlias = Callable [None , [KeyedData , Any , Any , Any , Any ]]
62
64
63
- RepackerT = TypeVar ("RepackerT" , bound = [PrepRepacker , SingleValueRepacker ])
64
- RepackerLoopFun = Callable [None , [KeyedData , Any , Any , Any , Any ]]
65
- def _repack_loop_helper (obj : RepackerT , repackfun : RepackerLoopFun , data : KeyedData ) -> KeyedData :
66
- repackedData : dict [str , Vector ] = {}
67
- quantitiesData = [data [_ ] for _ in obj .quantityKey ]
68
-
69
- for p , d in zip (data [obj .panelKey ], data [obj .dataKey ]):
70
- for qName , qD in zip (obj .quantityKey , quantitiesData ):
71
- RepackerLoopFun (repackedData , p , d , qName , qD )
72
- return repackedData
65
+ class BaseRepacker (KeyedDataAction ):
66
+ """Base class for Data Repacking actions. Essentially Just adds some helper functions"""
67
+ def _repack_loop_helper (self , repackfun : RepackerLoopFun , data : KeyedData ) -> KeyedData :
68
+ repackedData : dict [str , Vector ] = {}
69
+ quantitiesData = [data [_ ] for _ in obj .quantityKey ]
73
70
71
+ for p , d in zip (data [obj .panelKey ], data [obj .dataKey ]):
72
+ for qName , qD in zip (obj .quantityKey , quantitiesData ):
73
+ RepackerLoopFun (repackedData , p , d , qName , qD )
74
+ return repackedData
74
75
75
76
76
77
77
- class PrepRepacker (KeyedDataAction ):
78
+ class PrepRepacker (BaseRepacker ):
78
79
"""Prep action to repack data."""
79
80
80
81
panelKey = Field [str ](
@@ -91,7 +92,7 @@ def __call__(self, data: KeyedData, **kwargs) -> KeyedData:
91
92
def rp_loop (rpData : KeyedData , panel , data , quantityName , quantityData ):
92
93
qName = f"{ panel } _{ data } _{ quantityName } "
93
94
rpData [qName ] = quantityData
94
- repackedData = _repack_loop_helper (self , rp_loop , data )
95
+ repackedData = self . _repack_loop_helper (self , rp_loop , data )
95
96
return repackedData
96
97
97
98
def getInputSchema (self ) -> KeyedDataSchema :
@@ -105,7 +106,7 @@ def addInputSchema(self, inputSchema: KeyedDataSchema) -> None:
105
106
pass
106
107
107
108
108
- class SingleValueRepacker (KeyedDataAction ):
109
+ class SingleValueRepacker (BaseRepacker ):
109
110
"""Prep action to repack data."""
110
111
111
112
panelKey = Field [str ](
@@ -119,22 +120,20 @@ class SingleValueRepacker(KeyedDataAction):
119
120
minLength = 1 , optional = False )
120
121
121
122
def __call__ (self , data : KeyedData , ** kwargs ) -> KeyedData :
122
- uniquePanelKeys : list = list (set (data [self .panelKey ]))
123
-
124
123
repackedData : dict [str , Vector ] = {}
125
- uniquePanelKeys : list = list (set (data [self .panelKey ]))
126
-
127
- # Loop over data vector to repack information as it is expected.
128
- for uk in uniquePanelKeys :
129
- repackedData [f"{ uk } _x" ] = []
130
- for q in self .quantityKey :
131
- repackedData [f"{ uk } _{ q } " ] = []
132
124
133
125
def rp_loop (rpData : KeyedData , panel , data , quantityName , quantityData ):
134
- rpData [f"{ panel } _x" ].append (data )
135
- rpData [f"{ panel } _{ quantityName } " ] = quantityData
126
+ if (xlab := f"{ panel } _x" ) not in rpData :
127
+ rpData [xlab ] = [data ]
128
+ else :
129
+ rpData [xlab ].append (data )
130
+
131
+ if (lab := f"{ panel } _{ quantityName } " ) not in rpData :
132
+ rpData [lab ] = [quantityData ]
133
+ else :
134
+ rpData [lab ].append (quantityData )
136
135
137
- repackedData : KeyedData = _repack_loop_helper (self , rp_loop , data )
136
+ repackedData = self . _repack_loop_helper (self , rp_loop , data )
138
137
return repackedData
139
138
140
139
def getInputSchema (self ) -> KeyedDataSchema :
0 commit comments