132 def run(self, detector, finalVisitSummary):
133 """Parse the information on the current visit and retrieve the
134 observable solar system objects from MPSky.
138 finalVisitSummary : `lsst.afw.table.ExposureCatalog`
139 visitInfo including center and time of exposure
143 result : `lsst.pipe.base.Struct`
144 Results struct with components:
146 - ``ssObjects`` : `pandas.DataFrame`
147 DataFrame containing Solar System Objects near the detector
148 footprint as retrieved by MPSky. The columns are as follows:
153 RA in decimal degrees (`float`)
155 DEC in decimal degrees (`float`)
156 ``obj_X_poly``, ``obj_Y_poly``, ``obj_Z_poly``
157 Chebyshev coefficients for object path
158 ``obs_X_poly``, ``obs_Y_poly``, ``obs_Z_poly``
159 Chebyshev coefficients for observer path
161 Lower time bound for polynomials
163 Upper time bound for polynomials
165 row = finalVisitSummary.find(detector)
166 visitInfo = row.visitInfo
167 ra, dec = row[
'ra'], row[
'dec']
168 corners = np.vstack([row[
'raCorners'], row[
'decCorners']]).T
170 for corner
in corners:
171 corner_coords.append(
SpherePoint(corner[0], corner[1], units=degrees).getVector())
173 expRadius = detectorPolygon.getBoundingCircle().getOpeningAngle().asDegrees()
174 expMidPointEPOCH = visitInfo.date.toAstropy().mjd
177 mpSkyURL = os.environ.get(
'MP_SKY_URL', self.config.mpSkyFallbackURL)
179 expRadius + self.config.queryBufferRadiusDegrees, mpSkyURL)
181 ssObjects=mpSkySsObjects,
185 """Extract ephemerides from an MPSky web request
189 response : `requests.Response`
195 Designations of nearby objects
197 Array of object right ascensions
199 Array of object declinations
200 object_polynomial : `np.ndarray`, (N,M)
201 Array of object cartesian position polynomials
202 observer_polynomial : `np.ndarray`, (N,M)
203 Array of observer cartesian position polynomials
205 Lower time bound for polynomials
207 Upper time bound for polynomials
210 with pa.input_stream(memoryview(response.content))
as stream:
212 object_polynomial = pa.ipc.read_tensor(stream).to_numpy()
213 observer_polynomial = pa.ipc.read_tensor(stream).to_numpy()
214 with pa.ipc.open_stream(stream)
as reader:
215 columns = next(reader)
216 objID = columns[
"name"].to_numpy(zero_copy_only=
False)
217 ra = columns[
"ra"].to_numpy()
218 dec = columns[
"dec"].to_numpy()
219 t_min = columns[
"tmin"].to_numpy()
220 t_max = columns[
"tmax"].to_numpy()
221 return objID, ra, dec, object_polynomial, observer_polynomial, t_min, t_max
224 """Query MPSky ephemeris service for objects near the expected detector position
228 expCenter : `lsst.geom.SpherePoint`
229 Center of search cone
231 Epoch of cone search, (MJD in UTC).
232 queryRadius : `float`
233 Radius of the cone search in degrees.
235 URL to query for MPSky.
239 mpSkySsObjects : `pandas.DataFrame`
240 DataFrame with Solar System Object information and RA/DEC position
247 "radius": queryRadius
251 response = requests.get(mpSkyURL, params=params, timeout=self.config.mpSkyRequestTimeoutSeconds)
252 response.raise_for_status()
254 objID, ra, dec, object_polynomial, observer_polynomial, tmin, tmax = response
256 mpSkySsObjects = pd.DataFrame()
257 mpSkySsObjects[
'ObjID'] = objID
258 mpSkySsObjects[
'ra'] = ra
259 mpSkySsObjects[
'obj_x_poly'] = [poly[0]
for poly
in object_polynomial.T]
260 mpSkySsObjects[
'obj_y_poly'] = [poly[1]
for poly
in object_polynomial.T]
261 mpSkySsObjects[
'obj_z_poly'] = [poly[2]
for poly
in object_polynomial.T]
262 mpSkySsObjects[
'obs_x_poly'] = [observer_polynomial.T[0]
for
263 i
in range(len(mpSkySsObjects))]
264 mpSkySsObjects[
'obs_y_poly'] = [observer_polynomial.T[1]
for
265 i
in range(len(mpSkySsObjects))]
266 mpSkySsObjects[
'obs_z_poly'] = [observer_polynomial.T[2]
for
267 i
in range(len(mpSkySsObjects))]
268 mpSkySsObjects[
'tmin'] = tmin
269 mpSkySsObjects[
'tmax'] = tmax
270 mpSkySsObjects[
'dec'] = dec
271 mpSkySsObjects[
'Err(arcsec)'] = 2
272 mpSkySsObjects[
'ssObjectId'] = [obj_id_to_ss_object_id(v)
for v
in mpSkySsObjects[
'ObjID'].values]
273 nFound = len(mpSkySsObjects)
276 self.log.info(
"No Solar System objects found for visit.")
278 self.log.info(
"%d Solar System Objects in visit", nFound)
279 except requests.RequestException
as e:
280 raise NoWorkFound(f
"Failed to connect to the remote ephemerides service: {e}")
from e
282 return mpSkySsObjects