class UserTbl(Base, BaseMixin): name = Column(String(45), primary_key=True) affiliation = stringcolumn(80) category = stringcolumn(80) email = stringcolumn(80) media = relationship('MediaTbl', backref='user')
class AnalysisChangeTbl(Base, BaseMixin): idanalysischangeTbl = Column(Integer, primary_key=True) # tag = Column(String(40), ForeignKey('TagTbl.name')) tag = stringcolumn(40) timestamp = Column(TIMESTAMP) user = stringcolumn(40) analysisID = Column(Integer, ForeignKey('AnalysisTbl.id'))
class PrincipalInvestigatorTbl(Base, BaseMixin): name = Column(String(140), primary_key=True) affiliation = stringcolumn(140) email = stringcolumn(140) @property def record_view(self): from pychron.envisage.browser.record_views import PrincipalInvestigatorRecordView r = PrincipalInvestigatorRecordView(self) return r
class SampleTbl(Base, NameMixin): materialID = Column(Integer, ForeignKey('MaterialTbl.id')) projectID = Column(Integer, ForeignKey('ProjectTbl.id')) note = stringcolumn(140) igsn = stringcolumn(140) lat = Column(Float) lon = Column(Float) storage_location = deferred(stringcolumn(140)) lithology = deferred(stringcolumn(140)) unit = deferred(stringcolumn(80)) lithology_class = deferred(stringcolumn(140)) lithology_type = deferred(stringcolumn(140)) lithology_group = deferred(stringcolumn(140)) location = deferred(stringcolumn(140)) approximate_age = deferred(Column(Float)) elevation = deferred(Column(Float)) create_date = deferred(Column(DateTime, default=func.now())) update_date = deferred( Column(DateTime, onupdate=func.now(), default=func.now())) positions = relationship('IrradiationPositionTbl', backref='sample', lazy='joined')
class ProjectTbl(Base, NameMixin): principal_investigatorID = Column(Integer, ForeignKey('PrincipalInvestigatorTbl.id')) samples = relationship('SampleTbl', backref='project') analysis_groups = relationship('AnalysisGroupTbl', backref='project') checkin_date = Column(DATE) comment = Column(TEXT) lab_contact = stringcolumn(80) institution = stringcolumn(80) @property def pname(self): return '{} ({})'.format(self.name, self.principal_investigator.name) if self.principal_investigator else \ self.name
class LevelTbl(Base, NameMixin): irradiationID = Column(Integer, ForeignKey('IrradiationTbl.id')) # productionID = Column(Integer, ForeignKey('ProductionTbl.id')) holder = stringcolumn(45) z = Column(Float) positions = relationship('IrradiationPositionTbl', backref='level', lazy='joined') note = Column(TEXT) @property def projects(self): ps = [] for p in self.positions: try: name = p.sample.project.name if name != 'Irradiation-{}'.format(self.irradiation.name): ps.append(p.sample.project.pname) except AttributeError: pass return list(set(ps))
class AnalysisGroupTbl(Base, IDMixin): name = stringcolumn(140) create_date = Column(TIMESTAMP, default=func.now()) projectID = Column(Integer, ForeignKey('ProjectTbl.id')) user = Column(String(140), ForeignKey('UserTbl.name')) sets = relationship('AnalysisGroupSetTbl', backref='group')
class MaterialTbl(Base, NameMixin): id = primary_key() samples = relationship('SampleTbl', backref='material') grainsize = stringcolumn(80) @property def gname(self): return '{} ({})'.format(self.name, self.grainsize) if self.grainsize else self.name
class SamplePrepStepTbl(Base, IDMixin): sampleID = Column(Integer, ForeignKey('SampleTbl.id')) sessionID = Column(Integer, ForeignKey('SamplePrepSessionTbl.id')) crush = Column(String(140)) wash = Column(String(140)) sieve = Column(String(140)) frantz = Column(String(140)) acid = Column(String(140)) heavy_liquid = Column(String(140)) pick = Column(String(140)) mount = stringcolumn(140) gold_table = stringcolumn(140) us_wand = stringcolumn(140) eds = stringcolumn(140) cl = stringcolumn(140) bse = stringcolumn(140) se = stringcolumn(140) status = Column(String(32)) comment = Column(String(300)) timestamp = Column(DATETIME, default=func.now()) added = Column(Boolean) images = relationship('SamplePrepImageTbl', backref='step')
class InterpretedAgeSetTbl(Base, BaseMixin): idinterpretedagesettbl = Column(Integer, primary_key=True) interpreted_ageID = Column(Integer, ForeignKey('InterpretedAgeTbl.idinterpretedagetbl')) analysisID = Column(Integer, ForeignKey('AnalysisTbl.id')) forced_plateau_step = Column(Boolean) plateau_step = Column(Boolean) tag = stringcolumn(80) analysis = relationship('AnalysisTbl', uselist=False)
class InterpretedAgeTbl(Base, BaseMixin): idinterpretedagetbl = Column(Integer, primary_key=True) age_kind = stringcolumn(32) kca_kind = stringcolumn(32) age = Column(Float) age_err = Column(Float) display_age_units = stringcolumn(2) kca = Column(Float) kca_err = Column(Float) mswd = Column(Float) age_error_kind = stringcolumn(80) include_j_error_in_mean = Column(Boolean) include_j_error_in_plateau = Column(Boolean) include_j_error_in_individual_analyses = Column(Boolean) analyses = relationship('InterpretedAgeSetTbl', backref='interpreted_age')
class PrincipalInvestigatorTbl(Base, IDMixin): affiliation = stringcolumn(140) email = stringcolumn(140) last_name = Column(String(140)) first_initial = Column(String(10)) projects = relationship('ProjectTbl', backref='principal_investigator') repositories = relationship('RepositoryTbl', backref='principal_investigator') irs = relationship('IRTbl', backref='principal_investigator') @property def name(self): return '{}, {}'.format(self.last_name, self.first_initial) if self.first_initial else self.last_name @property def record_view(self): from pychron.envisage.browser.record_views import PrincipalInvestigatorRecordView r = PrincipalInvestigatorRecordView(self) return r
class LevelTbl(Base, NameMixin): id = primary_key() irradiationID = Column(Integer, ForeignKey('IrradiationTbl.id')) productionID = Column(Integer, ForeignKey('ProductionTbl.id')) holder = stringcolumn(45) z = Column(Float) positions = relationship('IrradiationPositionTbl', backref='level') note = Column(BLOB)
class MaterialTbl(Base, NameMixin): samples = relationship('SampleTbl', backref='material') grainsize = stringcolumn(80) @property def gname(self): return '{} ({})'.format(self.name, self.grainsize) if self.grainsize else self.name def __repr__(self): return '{}<{}>'.format(self.__class__.__name__, self.gname)
class CurrentTbl(Base, IDMixin): value = Column(Float(32)) error = Column(Float(32)) unit = stringcolumn(40) parameterID = Column(Integer, ForeignKey('ParameterTbl.id')) analysisID = Column(Integer, ForeignKey('AnalysisTbl.id')) parameter = relationship('ParameterTbl', uselist=False) analysis = relationship('AnalysisTbl', uselist=False)
class IrradiationPositionTbl(Base, IDMixin): identifier = stringcolumn(80) sampleID = Column(Integer, ForeignKey('SampleTbl.id')) levelID = Column(Integer, ForeignKey('LevelTbl.id')) position = Column(Integer) note = Column(TEXT) weight = Column(Float) j = Column(Float) j_err = Column(Float) packet = stringcolumn(40) # analyses = relationship('AnalysisTbl', backref='irradiation_position') @property def analysis_count(self): return object_session(self).query(AnalysisTbl).with_parent(self).count() @property def analyzed(self): return bool(self.analysis_count)
class IrradiationPositionTbl(Base, BaseMixin): id = primary_key() identifier = stringcolumn(80) sampleID = Column(Integer, ForeignKey('SampleTbl.id')) levelID = Column(Integer, ForeignKey('LevelTbl.id')) position = Column(Integer) note = Column(BLOB) weight = Column(Float) j = Column(Float) j_err = Column(Float) analyses = relationship('AnalysisTbl', backref='irradiation_position')
class UserTbl(Base, BaseMixin): name = Column(String(45), primary_key=True) affiliation = stringcolumn(80) category = stringcolumn(80) email = stringcolumn(80)
class NameMixin(BaseMixin): name = stringcolumn(80) def __repr__(self): return '{}<{}>'.format(self.__class__.__name__, self.name)
class MassSpectrometerTbl(Base, BaseMixin): name = Column(String(45), primary_key=True) kind = stringcolumn(45)
class RestrictedNameTbl(Base, IDMixin): name = stringcolumn() category = stringcolumn()
class AnalysisTbl(Base, BaseMixin): id = primary_key() timestamp = Column(TIMESTAMP) # tag = stringcolumn(45) uuid = stringcolumn(32) analysis_type = stringcolumn(45) aliquot = Column(Integer) increment = Column(Integer) irradiation_positionID = Column(Integer, ForeignKey('IrradiationPositionTbl.id')) measurementName = stringcolumn(45) extractionName = stringcolumn(45) postEqName = stringcolumn(45) postMeasName = stringcolumn(45) mass_spectrometer = Column(String(45), ForeignKey('MassSpectrometerTbl.name')) extract_device = stringcolumn(45) extract_value = Column(Float) extract_units = stringcolumn(45) cleanup = Column(Float) duration = Column(Float) weight = Column(Float) comment = stringcolumn(80) repository_associations = relationship('RepositoryAssociationTbl', backref='analysis') group_sets = relationship('AnalysisGroupSetTbl', backref='analysis') change = relationship('AnalysisChangeTbl', uselist=False, backref='analysis') measured_position = relationship('MeasuredPositionTbl', uselist=False, backref='analysis') _record_view = None group_id = 0 @property def is_plateau_step(self): return @property def timestampf(self): return make_timef(self.timestamp) @property def identifier(self): return self.irradiation_position.identifier @property def irradiation(self): return self.irradiation_position.level.irradiation.name @property def irradiation_level(self): return self.irradiation_position.level.name @property def project(self): return self.irradiation_position.sample.project.name @property def sample(self): return self.irradiation_position.sample.name @property def irradiation_position_position(self): return self.irradiation_position.position @property def tag_dict(self): return {k: getattr(self.change.tag_item, k) for k in ('name',) + OMIT_KEYS} # @property # def labnumber(self): # return self.irradiation_position @property def analysis_timestamp(self): return self.timestamp @property def rundate(self): return self.timestamp @property def repository_identifier(self): if self.repository_associations and len(self.repository_associations) == 1: return self.repository_associations[0].repository @property def record_id(self): return make_runid(self.irradiation_position.identifier, self.aliquot, self.increment) @property def repository_identifier(self): es = [e.repository for e in self.repository_associations] if len(es) == 1: return es[0] @property def record_views(self): # iv = self._record_view # if not iv: repos = self.repository_associations if len(repos) == 1: return self._make_record_view(repos[0].repository), else: return [self._make_record_view(r.repository, use_suffix=True) for r in repos] def make_record_view(self, repository, use_suffix=False): for repo in self.repository_associations: if repo.repository == repository: return self._make_record_view(repo.repository, use_suffix=use_suffix) else: return self._make_record_view(self.repository_associations[0].repository) def _make_record_view(self, repo, use_suffix=False): iv = DVCIsotopeRecordView(self) # iv.repository_ids = es = [e.repository for e in self.repository_associations] # if len(es) == 1: # iv.repository_identifier = es[0] iv.repository_identifier = repo iv.use_repository_suffix = use_suffix iv.init() return iv
class UnitsTbl(Base, IDMixin): name = stringcolumn(40)
class AnalysisTbl(Base, IDMixin): experiment_type = stringcolumn(32) timestamp = Column(DATETIME) # tag = stringcolumn(45) uuid = stringcolumn(32) analysis_type = stringcolumn(45) aliquot = Column(Integer) increment = Column(Integer) irradiation_positionID = Column(Integer, ForeignKey('IrradiationPositionTbl.id')) # simple_identifier = Column(Integer, ForeignKey('SimpleIdentifier.identifier')) measurementName = stringcolumn(45) extractionName = stringcolumn(45) postEqName = stringcolumn(45) postMeasName = stringcolumn(45) mass_spectrometer = Column(String(45), ForeignKey('MassSpectrometerTbl.name')) extract_device = stringcolumn(45) extract_value = Column(Float) extract_units = stringcolumn(45) cleanup = Column(Float) duration = Column(Float) weight = Column(Float) comment = stringcolumn(200) repository_associations = relationship('RepositoryAssociationTbl', backref='analysis', lazy='joined') group_sets = relationship('AnalysisGroupSetTbl', backref='analysis') change = relationship('AnalysisChangeTbl', uselist=False, backref='analysis', lazy='joined') measured_positions = relationship('MeasuredPositionTbl', backref='analysis') media = relationship('MediaTbl', backref='analysis') irradiation_position = relationship('IrradiationPositionTbl', backref='analysis', lazy='joined') _record_view = None group_id = 0 frozen = False delta_time = 0 review_status = None repository_identifier = '' is_plateau_step = None load_name = '' load_holder = '' _temporary_tag = None @property def step(self): print(self.increment, alphas(self.increment)) return alphas(self.increment) @property def position(self): if self.measured_positions: return ','.join([ '{}'.format(p.position) for p in self.measured_positions if p.position ]) else: return '' @property def meas_script_name(self): return self.measurementName @property def extract_script_name(self): return self.extractionName @property def timestampf(self): return make_timef(self.timestamp) @property def identifier(self): return self.irradiation_position.identifier @property def irradiation_info(self): return '{}{} {}'.format(self.irradiation, self.irradiation_level, self.irradiation_position_position) @property def irradiation(self): return self.irradiation_position.level.irradiation.name @property def irradiation_level(self): return self.irradiation_position.level.name @property def packet(self): return self.irradiation_position.packet or '' @property def project(self): try: return self.irradiation_position.sample.project.name except AttributeError: return '' @property def principal_investigator(self): try: return self.irradiation_position.sample.project.principal_investigator.name except AttributeError: return '' @property def sample(self): try: return self.irradiation_position.sample.name except AttributeError: return '' @property def irradiation_position_position(self): return self.irradiation_position.position @property def material(self): try: return self.irradiation_position.sample.material.name except AttributeError: return '' @property def tag(self): if self._temporary_tag: tag = self._temporary_tag else: tag = self.change.tag return tag def set_tag(self, t): self._temporary_tag = t @property def analysis_timestamp(self): return self.timestamp @property def rundate(self): return self.timestamp @property def record_id(self): return make_runid(self.irradiation_position.identifier, self.aliquot, self.increment) @property def repository_identifier(self): if self.repository_associations and len( self.repository_associations) == 1: return self.repository_associations[0].repository @property def display_uuid(self): u = self.uuid if not u: u = '' return u[:8] def get_load_name(self): ln = '' if self.measured_positions: ln = self.measured_positions[0].loadName or '' return ln def get_load_holder(self): lh = '' if self.measured_positions: load = self.measured_positions[0].load if load: lh = load.holderName return lh def bind(self): self.load_name = self.get_load_name() self.load_holder = self.get_load_holder() # force binding of irradiation_position self.irradiation_position self.irradiation_level self.irradiation
class SamplePrepImageTbl(Base, IDMixin): stepID = Column(Integer, ForeignKey('SamplePrepStepTbl.id')) host = stringcolumn(45) path = stringcolumn(45) timestamp = Column(DATETIME, default=func.now()) note = Column(TEXT)
class RestrictedNameTbl(Base, BaseMixin): id = primary_key() name = stringcolumn() category = stringcolumn()
class ParameterTbl(Base, IDMixin): name = stringcolumn(40)
class SamplePrepChoicesTbl(Base, IDMixin): tag = stringcolumn(140) value = stringcolumn(140)