Skip to content
Snippets Groups Projects
Unverified Commit a7c5f9da authored by Christine Kim's avatar Christine Kim Committed by GitHub
Browse files

Web spice isis (#48)

* Add lsk to doubleEtToSclk

* Add target for search in getTargetStates

* Web spice ISIS changes

* Fix log bug
parent 5fcdab79
Branches master
No related merge requests found
...@@ -88,8 +88,10 @@ if(SPICEQL_BUILD_LIB) ...@@ -88,8 +88,10 @@ if(SPICEQL_BUILD_LIB)
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/apollo17.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/apollo17.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/base.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/base.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/cassini.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/cassini.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/chandrayaan1.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/clem1.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/clem1.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/galileo.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/galileo.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/hayabusa.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/hayabusa2.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/hayabusa2.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/juno.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/juno.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/kaguya.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/kaguya.json
...@@ -102,6 +104,7 @@ if(SPICEQL_BUILD_LIB) ...@@ -102,6 +104,7 @@ if(SPICEQL_BUILD_LIB)
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/mgs.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/mgs.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/mro.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/mro.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/msl.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/msl.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/newhorizons.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/odyssey.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/odyssey.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/smart1.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/smart1.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/tgo.json ${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/tgo.json
......
...@@ -142,7 +142,7 @@ namespace SpiceQL { ...@@ -142,7 +142,7 @@ namespace SpiceQL {
for (json::json_pointer &ptr : kptrs) { for (json::json_pointer &ptr : kptrs) {
SPDLOG_TRACE("Getting Latest Kernels from: {}", ptr.to_string()); SPDLOG_TRACE("Getting Latest Kernels from: {}", ptr.to_string());
SPDLOG_TRACE("JSON: {}", kernels[ptr]); SPDLOG_TRACE("JSON: {}", kernels[ptr].dump());
vector<vector<string>> kvect = json2DArrayTo2DVector(kernels[ptr]); vector<vector<string>> kvect = json2DArrayTo2DVector(kernels[ptr]);
vector<vector<string>> newLatest; vector<vector<string>> newLatest;
......
...@@ -279,12 +279,15 @@ namespace SpiceQL { ...@@ -279,12 +279,15 @@ namespace SpiceQL {
string doubleEtToSclk(int frameCode, double et, string mission, bool searchKernels) { string doubleEtToSclk(int frameCode, double et, string mission, bool searchKernels) {
Config missionConf; Config missionConf;
json lsks;
json sclks; json sclks;
if (searchKernels) { if (searchKernels) {
sclks = Inventory::search_for_kernelset(mission, {"lsk", "fk", "sclk"}); lsks = Inventory::search_for_kernelset("base", {"lsk"});
sclks = Inventory::search_for_kernelset(mission, {"fk", "sclk"});
} }
KernelSet lskSet(lsks);
KernelSet sclkSet(sclks); KernelSet sclkSet(sclks);
SpiceChar sclk[100]; SpiceChar sclk[100];
......
...@@ -211,7 +211,7 @@ namespace SpiceQL { ...@@ -211,7 +211,7 @@ namespace SpiceQL {
json ephemKernels = {}; json ephemKernels = {};
if (searchKernels) { if (searchKernels) {
ephemKernels = Inventory::search_for_kernelsets({mission, observer, "base"}, {"sclk", "ck", "spk", "pck", "tspk", "fk", "lsk", "fk"}, ets.front(), ets.back(), ckQuality, spkQuality); ephemKernels = Inventory::search_for_kernelsets({mission, target, observer, "base"}, {"sclk", "ck", "spk", "pck", "tspk", "fk", "lsk", "fk"}, ets.front(), ets.back(), ckQuality, spkQuality);
SPDLOG_DEBUG("{} Kernels : {}", mission, ephemKernels.dump(4)); SPDLOG_DEBUG("{} Kernels : {}", mission, ephemKernels.dump(4));
} }
......
"""Module providing SpiceQL endpoints""" """Module providing SpiceQL endpoints"""
from ast import literal_eval from ast import literal_eval
from typing import Any from typing import Annotated, Any
from fastapi import FastAPI from fastapi import FastAPI, Query
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from starlette.responses import RedirectResponse from starlette.responses import RedirectResponse
import numpy as np import numpy as np
...@@ -28,6 +28,19 @@ class ResponseModel(BaseModel): ...@@ -28,6 +28,19 @@ class ResponseModel(BaseModel):
statusCode: int statusCode: int
body: ResultModel | ErrorModel body: ResultModel | ErrorModel
class TargetStatesRequestModel(BaseModel):
target: str
observer: str
frame: str
abcorr: str
mission: str
ets: Annotated[list[float], Query()] | float | str | None = None
startEts: float | None = None
exposureDuration: float | None = None
numOfExposures: int | None = None
ckQuality: str = "predicted"
spkQuality: str = "predicted"
# Create FastAPI instance # Create FastAPI instance
app = FastAPI() app = FastAPI()
...@@ -61,10 +74,17 @@ async def getTargetStates( ...@@ -61,10 +74,17 @@ async def getTargetStates(
if ets is not None: if ets is not None:
if isinstance(ets, str): if isinstance(ets, str):
ets = literal_eval(ets) ets = literal_eval(ets)
else:
# getTargetStates requires an iterable ets. If not iterable, make it a list.
try:
iter(ets)
except TypeError:
ets = [ets]
else: else:
if all(v is not None for v in [startEts, exposureDuration, numOfExposures]): if all(v is not None for v in [startEts, exposureDuration, numOfExposures]):
stopEts = (exposureDuration * numOfExposures) + startEts stopEts = (exposureDuration * numOfExposures) + startEts
etsNpArray = np.arange(startEts, stopEts, exposureDuration) etsNpArray = np.arange(startEts, stopEts, exposureDuration)
# If ets is a single value, np.arange yields an empty array
ets = list(etsNpArray) ets = list(etsNpArray)
else: else:
raise Exception("Verify that a startEts, exposureDuration, and numOfExposures are being passed correctly.") raise Exception("Verify that a startEts, exposureDuration, and numOfExposures are being passed correctly.")
...@@ -75,6 +95,46 @@ async def getTargetStates( ...@@ -75,6 +95,46 @@ async def getTargetStates(
body = ErrorModel(error=str(e)) body = ErrorModel(error=str(e))
return ResponseModel(statusCode=500, body=body) return ResponseModel(statusCode=500, body=body)
@app.post("/getTargetStates")
async def getTargetStates(params: TargetStatesRequestModel):
target = params.target
observer = params.observer
frame = params.frame
abcorr = params.abcorr
mission = params.mission
ets = params.ets
startEts = params.startEts
exposureDuration = params.exposureDuration
numOfExposures = params.numOfExposures
ckQuality = params.ckQuality
spkQuality = params.spkQuality
try:
if ets is not None:
if isinstance(ets, str):
ets = literal_eval(ets)
else:
# getTargetStates requires an iterable ets. If not iterable, make it a list.
try:
iter(ets)
except TypeError:
ets = [ets]
else:
if all(v is not None for v in [startEts, exposureDuration, numOfExposures]):
stopEts = (exposureDuration * numOfExposures) + startEts
etsNpArray = np.arange(startEts, stopEts, exposureDuration)
# If ets is a single value, np.arange yields an empty array
ets = list(etsNpArray)
else:
raise Exception("Verify that startEts, exposureDuration, and numOfExposures are being passed correctly.")
result = pyspiceql.getTargetStates(ets, target, observer, frame, abcorr, mission, ckQuality, spkQuality, SEARCH_KERNELS_BOOL)
body = ResultModel(result=result)
return ResponseModel(statusCode=200, body=body)
except Exception as e:
body = ErrorModel(error=str(e))
return ResponseModel(statusCode=500, body=body)
@app.get("/getTargetOrientations") @app.get("/getTargetOrientations")
async def getTargetOrientations( async def getTargetOrientations(
toFrame: int, toFrame: int,
...@@ -95,7 +155,7 @@ async def getTargetOrientations( ...@@ -95,7 +155,7 @@ async def getTargetOrientations(
etsNpArray = np.arange(startEts, stopEts, exposureDuration) etsNpArray = np.arange(startEts, stopEts, exposureDuration)
ets = list(etsNpArray) ets = list(etsNpArray)
else: else:
raise Exception("Verify that a startEts, exposureDuration, and numOfExposures are being passed correctly.") raise Exception("Verify that startEts, exposureDuration, and numOfExposures are being passed correctly.")
result = pyspiceql.getTargetOrientations(ets, toFrame, refFrame, mission, ckQuality, SEARCH_KERNELS_BOOL) result = pyspiceql.getTargetOrientations(ets, toFrame, refFrame, mission, ckQuality, SEARCH_KERNELS_BOOL)
body = ResultModel(result=result) body = ResultModel(result=result)
return ResponseModel(statusCode=200, body=body) return ResponseModel(statusCode=200, body=body)
...@@ -103,6 +163,7 @@ async def getTargetOrientations( ...@@ -103,6 +163,7 @@ async def getTargetOrientations(
body = ErrorModel(error=str(e)) body = ErrorModel(error=str(e))
return ResponseModel(statusCode=500, body=body) return ResponseModel(statusCode=500, body=body)
@app.get("/strSclkToEt") @app.get("/strSclkToEt")
async def strSclkToEt( async def strSclkToEt(
frameCode: int, frameCode: int,
...@@ -132,7 +193,7 @@ async def doubleSclkToEt( ...@@ -132,7 +193,7 @@ async def doubleSclkToEt(
@app.get("/doubleEtToSclk") @app.get("/doubleEtToSclk")
async def strSclkToEt( async def doubleEtToSclk(
frameCode: int, frameCode: int,
et: float, et: float,
mission: str): mission: str):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment