added pet data for samples events

This commit is contained in:
GotthardG 2024-12-04 11:23:21 +01:00
parent b4f4e5a3d5
commit 1a1a710edf
5 changed files with 75 additions and 7 deletions

View File

@ -1,2 +1,2 @@
from .data import contacts, return_addresses, dewars, proposals, shipments, pucks, samples, dewar_types, serial_numbers from .data import contacts, return_addresses, dewars, proposals, shipments, pucks, samples, dewar_types, serial_numbers, sample_events
from .slots_data import slots from .slots_data import slots

View File

@ -1,5 +1,5 @@
from app.models import ContactPerson, Address, Dewar, Proposal, Shipment, Puck, Sample, DewarType, DewarSerialNumber, Slot from app.models import ContactPerson, Address, Dewar, Proposal, Shipment, Puck, Sample, DewarType, DewarSerialNumber, Slot, SampleEvent
from datetime import datetime from datetime import datetime, timedelta
import random import random
import time import time
import hashlib import hashlib
@ -183,3 +183,57 @@ for puck in pucks:
) )
samples.append(sample) samples.append(sample)
sample_id_counter += 1 sample_id_counter += 1
# Define possible event types for samples
event_types = ["Mounted", "Failed", "Unmounted", "Lost"]
def generate_sample_events(samples, chance_no_event=0.2, chance_lost=0.1):
"""Generate events for samples with timestamps increasing between different samples."""
events = []
# Set the start time to yesterday at 9:33 AM
start_time = datetime.now().replace(hour=9, minute=33, second=0, microsecond=0) - timedelta(days=1)
for sample in samples:
current_time = start_time
# Skip some samples with no events
if random.random() < chance_no_event:
# Increment start_time for the next sample to reflect time passage
start_time += timedelta(minutes=10)
continue
# Determine initial event type
event_type = "Failed" if random.random() < 0.05 else "Mounted"
# Append the initial event
events.append(SampleEvent(
sample_id=sample.id,
event_type=event_type,
timestamp=current_time
))
current_time += timedelta(seconds=50) # Increment the time for subsequent events
# Proceed if mounted and it's not the last sample
if event_type == "Mounted" and sample is not samples[-1]:
# Determine follow-up event
if random.random() < chance_lost:
events.append(SampleEvent(
sample_id=sample.id,
event_type="Lost",
timestamp=current_time
))
else:
events.append(SampleEvent(
sample_id=sample.id,
event_type="Unmounted",
timestamp=current_time
))
# Increment start_time for the next sample
start_time += timedelta(minutes=10)
return events
sample_events = generate_sample_events(samples)

View File

@ -27,11 +27,11 @@ def init_db():
def load_sample_data(session: Session): def load_sample_data(session: Session):
# Import models inside function to avoid circular dependency # Import models inside function to avoid circular dependency
from app.data import contacts, return_addresses, dewars, proposals, shipments, pucks, samples, dewar_types, serial_numbers, slots from app.data import contacts, return_addresses, dewars, proposals, shipments, pucks, samples, dewar_types, serial_numbers, slots, sample_events
# If any data already exists, skip seeding # If any data already exists, skip seeding
if session.query(models.ContactPerson).first(): if session.query(models.ContactPerson).first():
return return
session.add_all(contacts + return_addresses + dewars + proposals + shipments + pucks + samples + dewar_types + serial_numbers + slots) session.add_all(contacts + return_addresses + dewars + proposals + shipments + pucks + samples + dewar_types + serial_numbers + slots + sample_events)
session.commit() session.commit()

View File

@ -133,6 +133,7 @@ class Sample(Base):
# Foreign keys and relationships # Foreign keys and relationships
puck_id = Column(Integer, ForeignKey('pucks.id')) puck_id = Column(Integer, ForeignKey('pucks.id'))
puck = relationship("Puck", back_populates="samples") puck = relationship("Puck", back_populates="samples")
events = relationship("SampleEvent", back_populates="sample")
class Slot(Base): class Slot(Base):
@ -158,3 +159,13 @@ class LogisticsEvent(Base):
timestamp = Column(DateTime, default=datetime.utcnow) timestamp = Column(DateTime, default=datetime.utcnow)
dewar = relationship("Dewar", back_populates="events") dewar = relationship("Dewar", back_populates="events")
slot = relationship("Slot", back_populates="events") slot = relationship("Slot", back_populates="events")
class SampleEvent(Base):
__tablename__ = "sample_events"
id = Column(Integer, primary_key=True, index=True)
sample_id = Column(Integer, ForeignKey('samples.id'))
event_type = Column(String, index=True)
timestamp = Column(DateTime, default=datetime.utcnow)
sample = relationship("Sample", back_populates="events")

View File

@ -76,6 +76,8 @@ class DataCollectionParameters(BaseModel):
class Config: class Config:
from_attributes = True from_attributes = True
class SampleEventCreate(BaseModel):
event_type: str
class Results(BaseModel): class Results(BaseModel):
# Define attributes for Results here # Define attributes for Results here
@ -142,6 +144,7 @@ class SampleCreate(BaseModel):
position: int = Field(..., alias="positioninpuck") position: int = Field(..., alias="positioninpuck")
data_collection_parameters: Optional[DataCollectionParameters] = None data_collection_parameters: Optional[DataCollectionParameters] = None
results: Optional[Results] = None results: Optional[Results] = None
events: Optional[List[str]] = None
class Config: class Config:
populate_by_name = True populate_by_name = True