Skip to content

Commit a7c5f9d

Browse files
authored
Web spice isis (#48)
* Add lsk to doubleEtToSclk * Add target for search in getTargetStates * Web spice ISIS changes * Fix log bug
1 parent 5fcdab7 commit a7c5f9d

File tree

5 files changed

+76
-9
lines changed

5 files changed

+76
-9
lines changed

CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,10 @@ if(SPICEQL_BUILD_LIB)
8888
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/apollo17.json
8989
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/base.json
9090
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/cassini.json
91+
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/chandrayaan1.json
9192
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/clem1.json
9293
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/galileo.json
94+
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/hayabusa.json
9395
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/hayabusa2.json
9496
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/juno.json
9597
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/kaguya.json
@@ -102,6 +104,7 @@ if(SPICEQL_BUILD_LIB)
102104
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/mgs.json
103105
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/mro.json
104106
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/msl.json
107+
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/newhorizons.json
105108
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/odyssey.json
106109
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/smart1.json
107110
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/tgo.json

SpiceQL/src/query.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ namespace SpiceQL {
142142

143143
for (json::json_pointer &ptr : kptrs) {
144144
SPDLOG_TRACE("Getting Latest Kernels from: {}", ptr.to_string());
145-
SPDLOG_TRACE("JSON: {}", kernels[ptr]);
145+
SPDLOG_TRACE("JSON: {}", kernels[ptr].dump());
146146
vector<vector<string>> kvect = json2DArrayTo2DVector(kernels[ptr]);
147147
vector<vector<string>> newLatest;
148148

SpiceQL/src/spice_types.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,12 +279,15 @@ namespace SpiceQL {
279279

280280
string doubleEtToSclk(int frameCode, double et, string mission, bool searchKernels) {
281281
Config missionConf;
282+
json lsks;
282283
json sclks;
283284

284285
if (searchKernels) {
285-
sclks = Inventory::search_for_kernelset(mission, {"lsk", "fk", "sclk"});
286+
lsks = Inventory::search_for_kernelset("base", {"lsk"});
287+
sclks = Inventory::search_for_kernelset(mission, {"fk", "sclk"});
286288
}
287289

290+
KernelSet lskSet(lsks);
288291
KernelSet sclkSet(sclks);
289292

290293
SpiceChar sclk[100];

SpiceQL/src/utils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ namespace SpiceQL {
211211
json ephemKernels = {};
212212

213213
if (searchKernels) {
214-
ephemKernels = Inventory::search_for_kernelsets({mission, observer, "base"}, {"sclk", "ck", "spk", "pck", "tspk", "fk", "lsk", "fk"}, ets.front(), ets.back(), ckQuality, spkQuality);
214+
ephemKernels = Inventory::search_for_kernelsets({mission, target, observer, "base"}, {"sclk", "ck", "spk", "pck", "tspk", "fk", "lsk", "fk"}, ets.front(), ets.back(), ckQuality, spkQuality);
215215
SPDLOG_DEBUG("{} Kernels : {}", mission, ephemKernels.dump(4));
216216
}
217217

fastapi/app/main.py

Lines changed: 67 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
"""Module providing SpiceQL endpoints"""
22

33
from ast import literal_eval
4-
from typing import Any
5-
from fastapi import FastAPI
4+
from typing import Annotated, Any
5+
from fastapi import FastAPI, Query
66
from pydantic import BaseModel, Field
77
from starlette.responses import RedirectResponse
88
import numpy as np
@@ -28,14 +28,27 @@ class ResponseModel(BaseModel):
2828
statusCode: int
2929
body: ResultModel | ErrorModel
3030

31+
class TargetStatesRequestModel(BaseModel):
32+
target: str
33+
observer: str
34+
frame: str
35+
abcorr: str
36+
mission: str
37+
ets: Annotated[list[float], Query()] | float | str | None = None
38+
startEts: float | None = None
39+
exposureDuration: float | None = None
40+
numOfExposures: int | None = None
41+
ckQuality: str = "predicted"
42+
spkQuality: str = "predicted"
43+
3144
# Create FastAPI instance
3245
app = FastAPI()
3346

3447
@app.get("/")
3548
async def message():
3649
try:
37-
data_dir_exists = os.path.exists(pyspiceql.getDataDirectory())
38-
return {"data_content": os.listdir(pyspiceql.getDataDirectory()),
50+
data_dir_exists = os.path.exists(pyspiceql.getDataDirectory())
51+
return {"data_content": os.listdir(pyspiceql.getDataDirectory()),
3952
"data_dir_exists": data_dir_exists,
4053
"is_healthy": data_dir_exists}
4154
except Exception as e:
@@ -61,10 +74,17 @@ async def getTargetStates(
6174
if ets is not None:
6275
if isinstance(ets, str):
6376
ets = literal_eval(ets)
77+
else:
78+
# getTargetStates requires an iterable ets. If not iterable, make it a list.
79+
try:
80+
iter(ets)
81+
except TypeError:
82+
ets = [ets]
6483
else:
6584
if all(v is not None for v in [startEts, exposureDuration, numOfExposures]):
6685
stopEts = (exposureDuration * numOfExposures) + startEts
6786
etsNpArray = np.arange(startEts, stopEts, exposureDuration)
87+
# If ets is a single value, np.arange yields an empty array
6888
ets = list(etsNpArray)
6989
else:
7090
raise Exception("Verify that a startEts, exposureDuration, and numOfExposures are being passed correctly.")
@@ -75,6 +95,46 @@ async def getTargetStates(
7595
body = ErrorModel(error=str(e))
7696
return ResponseModel(statusCode=500, body=body)
7797

98+
99+
@app.post("/getTargetStates")
100+
async def getTargetStates(params: TargetStatesRequestModel):
101+
target = params.target
102+
observer = params.observer
103+
frame = params.frame
104+
abcorr = params.abcorr
105+
mission = params.mission
106+
ets = params.ets
107+
startEts = params.startEts
108+
exposureDuration = params.exposureDuration
109+
numOfExposures = params.numOfExposures
110+
ckQuality = params.ckQuality
111+
spkQuality = params.spkQuality
112+
try:
113+
if ets is not None:
114+
if isinstance(ets, str):
115+
ets = literal_eval(ets)
116+
else:
117+
# getTargetStates requires an iterable ets. If not iterable, make it a list.
118+
try:
119+
iter(ets)
120+
except TypeError:
121+
ets = [ets]
122+
else:
123+
if all(v is not None for v in [startEts, exposureDuration, numOfExposures]):
124+
stopEts = (exposureDuration * numOfExposures) + startEts
125+
etsNpArray = np.arange(startEts, stopEts, exposureDuration)
126+
# If ets is a single value, np.arange yields an empty array
127+
ets = list(etsNpArray)
128+
else:
129+
raise Exception("Verify that startEts, exposureDuration, and numOfExposures are being passed correctly.")
130+
result = pyspiceql.getTargetStates(ets, target, observer, frame, abcorr, mission, ckQuality, spkQuality, SEARCH_KERNELS_BOOL)
131+
body = ResultModel(result=result)
132+
return ResponseModel(statusCode=200, body=body)
133+
except Exception as e:
134+
body = ErrorModel(error=str(e))
135+
return ResponseModel(statusCode=500, body=body)
136+
137+
78138
@app.get("/getTargetOrientations")
79139
async def getTargetOrientations(
80140
toFrame: int,
@@ -95,13 +155,14 @@ async def getTargetOrientations(
95155
etsNpArray = np.arange(startEts, stopEts, exposureDuration)
96156
ets = list(etsNpArray)
97157
else:
98-
raise Exception("Verify that a startEts, exposureDuration, and numOfExposures are being passed correctly.")
158+
raise Exception("Verify that startEts, exposureDuration, and numOfExposures are being passed correctly.")
99159
result = pyspiceql.getTargetOrientations(ets, toFrame, refFrame, mission, ckQuality, SEARCH_KERNELS_BOOL)
100160
body = ResultModel(result=result)
101161
return ResponseModel(statusCode=200, body=body)
102162
except Exception as e:
103163
body = ErrorModel(error=str(e))
104164
return ResponseModel(statusCode=500, body=body)
165+
105166

106167
@app.get("/strSclkToEt")
107168
async def strSclkToEt(
@@ -132,7 +193,7 @@ async def doubleSclkToEt(
132193

133194

134195
@app.get("/doubleEtToSclk")
135-
async def strSclkToEt(
196+
async def doubleEtToSclk(
136197
frameCode: int,
137198
et: float,
138199
mission: str):

0 commit comments

Comments
 (0)