class LoadPositionTbl(Base, BaseMixin): id = primary_key() identifier = Column(String(80), ForeignKey('IrradiationPositionTbl.identifier')) position = Column(Integer) loadName = Column(String(45), ForeignKey('LoadTbl.name')) weight = Column(Float) note = Column(BLOB)
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 MeasuredPositionTbl(Base, BaseMixin): id = primary_key() position = Column(Integer) x = Column(Float) y = Column(Float) z = Column(Float) is_degas = Column(Boolean) analysisID = Column(Integer, ForeignKey('AnalysisTbl.id')) loadName = Column(String(45), ForeignKey('LoadTbl.name'))
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 ProjectTbl(Base, NameMixin): id = primary_key() principal_investigatorID = Column(Integer, ForeignKey('PrincipalInvestigatorTbl.id')) samples = relationship('SampleTbl', backref='project') analysis_groups = relationship('AnalysisGroupTbl', backref='project') @property def pname(self): return '{} ({})'.format(self.name, self.principal_investigator.name) if self.principal_investigator else \ self.name
class ProjectTbl(Base, NameMixin): id = primary_key() principal_investigator = Column( String(140), ForeignKey('PrincipalInvestigatorTbl.name')) samples = relationship('SampleTbl', backref='project') @property def gname(self): return '{} ({})'.format(self.name, self.principal_investigator ) if self.principal_investigator else self.name
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 IRTbl(Base, BaseMixin): ir = primary_key(klass=String(32)) principal_investigatorID = Column(Integer, ForeignKey('PrincipalInvestigatorTbl.id')) institution = Column(String(140)) checkin_date = Column(DATE) lab_contact = Column(String(140), ForeignKey('UserTbl.name')) comment = Column(BLOB) @property def principal_investigator_name(self): ret = '' if self.principal_investigator: ret = self.principal_investigator.name return ret
class PrincipalInvestigatorTbl(Base, BaseMixin): id = primary_key() 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 RestrictedNameTbl(Base, BaseMixin): id = primary_key() name = stringcolumn() category = stringcolumn()
class IrradiationTbl(Base, NameMixin): id = primary_key() levels = relationship('LevelTbl', backref='irradiation')
class ProductionTbl(Base, NameMixin): id = primary_key() levels = relationship('LevelTbl', backref='production')
class SampleTbl(Base, NameMixin): id = primary_key() materialID = Column(Integer, ForeignKey('MaterialTbl.id')) projectID = Column(Integer, ForeignKey('ProjectTbl.id')) positions = relationship('IrradiationPositionTbl', backref='sample')
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