Source code for kappa_sdk.shutin

from datetime import datetime
from ._private._kw_api import KWAPI
from ._private._well_dto import LogLogPreviewDto, EmbeddedChannelDto, DoubleValuesDto
from typing import Optional, List, cast
from .document_vector import DocumentVector
from .datetime_utils import datetime_to_str


[docs] class ShutIn: """ Class to store any shutin """ def __init__(self, start_date: datetime, end_date: datetime, is_reference: bool, pressure_id: Optional[str], fit_for_use: str, shut_in_type: str, kw_api: KWAPI): self.__start_date: datetime = start_date self.__end_date: datetime = end_date self.__is_reference: bool = is_reference self.__pressure_id: Optional[str] = pressure_id self.__kw_api: KWAPI = kw_api self.__fit_for_use: Optional[bool] = None if fit_for_use == "Unknown" else fit_for_use == "FitForUse" self.__hard_shutin: Optional[bool] = None if shut_in_type == "Unknown" else shut_in_type == "Hard" @property def start_date(self) -> datetime: """ Returns the start date of the :class:`ShutIn` object""" return self.__start_date @property def end_date(self) -> datetime: """ Returns the end date of the :class:`ShutIn` object""" return self.__end_date @property def is_reference(self) -> bool: """ Returns whether the ShutIn is reference or not""" return self.__is_reference @property def fit_for_use(self) -> Optional[bool]: """ Returns whether the ShutIn is fit for use or not, returns None if the category is Unknown""" return self.__fit_for_use @property def hard_shutin(self) -> Optional[bool]: """Returns whether the ShutIn is an hard shutin or not, returns None if the type is Unknown""" return self.__hard_shutin def get_log_log_preview_from_shut_in_dates(self, pressure_id: Optional[str] = None, to_date: Optional[datetime] = None, tp: float = 10) -> List[DocumentVector]: """ Get Loglog preview :class:`DocumentVector` from shut-in dates Parameters ---------- pressure_id: Pressure vector id to use to_date: End date of the shut-in, if None it will use the initial end date of the shut-in tp: Horner Time on production Returns ------- List[:class:`DocumentVector`]: List of document vectors which contains the Loglog dP values and the Bourdet derivative values """ to_date_str = datetime_to_str(to_date) pressure_id = pressure_id if pressure_id is not None else self.__pressure_id if pressure_id is None: raise ValueError("Missing pressure vector Id to get the loglog preview") dto = LogLogPreviewDto(pressureId=pressure_id, startDate=cast(str, datetime_to_str(self.__start_date)), endDate=cast(str, datetime_to_str(self.__end_date)) if to_date_str is None else to_date_str, tp=tp) plot_instance = self.__kw_api.get_log_log_preview(dto) document_vectors = [] for channel in plot_instance.panes[0].channels: if isinstance(channel, EmbeddedChannelDto): document_vector = DocumentVector([], channel.yValues.values, channel.name, channel.yValues.dimension, True if "derivative" in channel.name else False, False, channel.isByStep) document_vector.set_elapsed_times(cast(DoubleValuesDto, channel.xValues).values, self.__start_date) document_vectors.append(document_vector) return document_vectors