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
No related branches found
No related tags found
No related merge requests found
......@@ -88,8 +88,10 @@ if(SPICEQL_BUILD_LIB)
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/apollo17.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/base.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/galileo.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/hayabusa.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/hayabusa2.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/juno.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/kaguya.json
......@@ -102,6 +104,7 @@ if(SPICEQL_BUILD_LIB)
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/mgs.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/mro.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/smart1.json
${CMAKE_CURRENT_SOURCE_DIR}/SpiceQL/db/tgo.json
......
......@@ -142,7 +142,7 @@ namespace SpiceQL {
for (json::json_pointer &ptr : kptrs) {
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>> newLatest;
......
......@@ -279,12 +279,15 @@ namespace SpiceQL {
string doubleEtToSclk(int frameCode, double et, string mission, bool searchKernels) {
Config missionConf;
json lsks;
json sclks;
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);
SpiceChar sclk[100];
......
......@@ -211,7 +211,7 @@ namespace SpiceQL {
json ephemKernels = {};
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));
}
......
"""Module providing SpiceQL endpoints"""
from ast import literal_eval
from typing import Any
from fastapi import FastAPI
from typing import Annotated, Any
from fastapi import FastAPI, Query
from pydantic import BaseModel, Field
from starlette.responses import RedirectResponse
import numpy as np
......@@ -28,6 +28,19 @@ class ResponseModel(BaseModel):
statusCode: int
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
app = FastAPI()
......@@ -61,10 +74,17 @@ async def getTargetStates(
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 a startEts, exposureDuration, and numOfExposures are being passed correctly.")
......@@ -75,6 +95,46 @@ async def getTargetStates(
body = ErrorModel(error=str(e))
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")
async def getTargetOrientations(
toFrame: int,
......@@ -95,7 +155,7 @@ async def getTargetOrientations(
etsNpArray = np.arange(startEts, stopEts, exposureDuration)
ets = list(etsNpArray)
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)
body = ResultModel(result=result)
return ResponseModel(statusCode=200, body=body)
......@@ -103,6 +163,7 @@ async def getTargetOrientations(
body = ErrorModel(error=str(e))
return ResponseModel(statusCode=500, body=body)
@app.get("/strSclkToEt")
async def strSclkToEt(
frameCode: int,
......@@ -132,7 +193,7 @@ async def doubleSclkToEt(
@app.get("/doubleEtToSclk")
async def strSclkToEt(
async def doubleEtToSclk(
frameCode: int,
et: float,
mission: str):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment