Exemplo n.º 1
0
    def main():
        from pychron.paths import paths
        paths.build('_dev')
        from pychron.core.helpers.logger_setup import logging_setup
        from pychron.experiment.automated_run.spec import AutomatedRunSpec
        logging_setup('dvcdb')
        from pychron.dvc.dvc_database import DVCDatabase
        from itertools import groupby
        db = DVCDatabase(kind='mysql', host='localhost', username='******', name='pychronmeta', password='******')
        db.connect()
        identifiers = ['63290', '63291']
        runs = [AutomatedRunSpec(identifier='63290', repository_identifier='Cather_McIntoshd')]
        cr = ConflictResolver()
        experiments = {}
        with db.session_ctx():
            cr.available_ids = db.get_repository_identifiers()
            eas = db.get_associated_repositories(identifiers)
            for idn, exps in groupby(eas, key=lambda x: x[1]):
                experiments[idn] = [e[0] for e in exps]
            conflicts = []
            for ai in runs:
                identifier = ai.identifier
                es = experiments[identifier]
                if ai.repository_identifier not in es:
                    conflicts.append((ai, es))
            if conflicts:
                cr.add_conflicts('Foo', conflicts)

        if cr.conflicts:

            info = cr.edit_traits(kind='livemodal')
            if info.result:
                cr.apply()
Exemplo n.º 2
0
    def main():
        from pychron.paths import paths
        paths.build('_dev')
        from pychron.core.helpers.logger_setup import logging_setup
        from pychron.experiment.automated_run.spec import AutomatedRunSpec
        logging_setup('dvcdb')
        from pychron.dvc.dvc_database import DVCDatabase
        from itertools import groupby
        db = DVCDatabase(kind='mysql',
                         host='localhost',
                         username='******',
                         name='pychronmeta',
                         password='******')
        db.connect()
        identifiers = ['63290', '63291']
        runs = [
            AutomatedRunSpec(identifier='63290',
                             repository_identifier='Cather_McIntoshd')
        ]
        cr = ConflictResolver()
        experiments = {}
        with db.session_ctx():
            cr.available_ids = db.get_repository_identifiers()
            eas = db.get_associated_repositories(identifiers)
            for idn, exps in groupby(eas, key=lambda x: x[1]):
                experiments[idn] = [e[0] for e in exps]
            conflicts = []
            for ai in runs:
                identifier = ai.identifier
                es = experiments[identifier]
                if ai.repository_identifier not in es:
                    conflicts.append((ai, es))
            if conflicts:
                cr.add_conflicts('Foo', conflicts)

        if cr.conflicts:

            info = cr.edit_traits(kind='livemodal')
            if info.result:
                cr.apply()
Exemplo n.º 3
0
    def _clone_central_db(self,
                          repositories,
                          analyses=None,
                          principal_investigators=None,
                          projects=None):

        self.info('--------- Clone DB -----------')
        # create an a sqlite database
        from pychron.dvc.dvc_orm import Base
        metadata = Base.metadata
        from pychron.dvc.dvc_database import DVCDatabase

        path = database_path()
        if os.path.isfile(path):
            if not self.confirmation_dialog(
                    'The database "{}" already exists. '
                    'Do you want to overwrite it'.format(
                        os.path.basename(path))):

                path = self._get_new_path()
            else:
                os.remove(path)

        if path:
            progress = open_progress(n=20)
            self.debug('--------- Starting db clone to {}'.format(path))
            src = self.dvc
            db = DVCDatabase(path=path, kind='sqlite')
            db.connect()
            with db.session_ctx(use_parent_session=False) as sess:
                metadata.create_all(sess.bind)

            tables = [
                'MassSpectrometerTbl', 'ExtractDeviceTbl', 'VersionTbl',
                'UserTbl'
            ]

            for table in tables:
                mod = __import__('pychron.dvc.dvc_orm', fromlist=[table])
                progress.change_message('Cloning {}'.format(table))
                self._copy_table(db, getattr(mod, table))

            with src.session_ctx(use_parent_session=False):
                from pychron.dvc.dvc_orm import RepositoryTbl
                from pychron.dvc.dvc_orm import AnalysisTbl
                from pychron.dvc.dvc_orm import AnalysisChangeTbl
                from pychron.dvc.dvc_orm import RepositoryAssociationTbl
                from pychron.dvc.dvc_orm import AnalysisGroupTbl
                from pychron.dvc.dvc_orm import AnalysisGroupSetTbl
                from pychron.dvc.dvc_orm import MaterialTbl
                from pychron.dvc.dvc_orm import SampleTbl
                from pychron.dvc.dvc_orm import IrradiationTbl
                from pychron.dvc.dvc_orm import LevelTbl
                from pychron.dvc.dvc_orm import IrradiationPositionTbl
                from pychron.dvc.dvc_orm import PrincipalInvestigatorTbl

                repos = [
                    src.db.get_repository(reponame)
                    for reponame in repositories
                ]

                progress.change_message('Assembling Analyses 0/5')
                st = time.time()
                if analyses:
                    ans = analyses
                    ras = [
                        rai for ai in ans for rai in ai.repository_associations
                    ]
                else:

                    # at = time.time()
                    ras = [
                        ra for repo in repos
                        for ra in repo.repository_associations
                    ]
                    # self.debug('association time={}'.format(time.time()-at))
                    progress.change_message('Assembling Analyses 1/5')

                    # at = time.time()
                    ans = [ri.analysis for ri in ras]
                    # self.debug('analysis time={}'.format(time.time()-at))

                    progress.change_message('Assembling Analyses 2/5')

                # at = time.time()
                ans_c = [ai.change for ai in ans]
                # self.debug('change time={}'.format(time.time()-at))
                progress.change_message('Assembling Analyses 3/5')

                # at = time.time()
                agss = [gi for ai in ans for gi in ai.group_sets]
                # self.debug('agss time={}'.format(time.time()-at))
                progress.change_message('Assembling Analyses 4/5')

                # at = time.time()
                ags = {gi.group for gi in agss}
                # self.debug('ags time={}'.format(time.time()-at))
                progress.change_message('Assembling Analyses 5/5')

                self.debug(
                    'total analysis assembly time={}'.format(time.time() - st))

                self._copy_records(progress, db, RepositoryTbl, repos)
                self._copy_records(progress, db, RepositoryAssociationTbl, ras)
                self._copy_records(progress, db, AnalysisTbl, ans)
                self._copy_records(progress, db, AnalysisChangeTbl, ans_c)
                self._copy_records(progress, db, AnalysisGroupTbl, ags)
                self._copy_records(progress, db, AnalysisGroupSetTbl, agss)

                if principal_investigators:
                    pis = [
                        src.get_principal_investigator(pp.name)
                        for pp in principal_investigators
                    ]
                else:
                    pis = {repo.principal_investigator for repo in repos}
                self._copy_records(progress, db, PrincipalInvestigatorTbl, pis)

                from pychron.dvc.dvc_orm import ProjectTbl
                if projects:
                    prjs = [src.get_project(pp) for pp in projects]
                else:
                    prjs = {
                        ai.irradiation_position.sample.project
                        for ai in ans
                    }
                self._copy_records(progress, db, ProjectTbl, prjs)

                ips = {ai.irradiation_position for ai in ans}
                sams = {ip.sample for ip in ips}
                mats = {si.material for si in sams}

                self._copy_records(progress, db, MaterialTbl, mats)

                self._copy_records(progress, db, SampleTbl, sams)

                ls = {ip.level for ip in ips}
                irs = {l.irradiation for l in ls}

                self._copy_records(progress, db, IrradiationTbl, irs)

                self._copy_records(progress, db, LevelTbl, ls)

                self._copy_records(progress, db, IrradiationPositionTbl, ips)

                self.debug('--------- db clone finished')
                progress.close()
                self.information_dialog('Database saved to "{}"'.format(path))
                return path
Exemplo n.º 4
0
    def _clone_central_db(self, repositories, analyses=None, principal_investigators=None, projects=None):

        self.info('--------- Clone DB -----------')
        # create an a sqlite database
        from pychron.dvc.dvc_orm import Base
        metadata = Base.metadata
        from pychron.dvc.dvc_database import DVCDatabase

        path = database_path()
        if os.path.isfile(path):
            if not self.confirmation_dialog('The database "{}" already exists. '
                                            'Do you want to overwrite it'.format(os.path.basename(path))):

                path = self._get_new_path()
            else:
                os.remove(path)

        if path:
            progress = open_progress(n=20)
            self.debug('--------- Starting db clone to {}'.format(path))
            src = self.dvc
            db = DVCDatabase(path=path, kind='sqlite')
            db.connect()
            with db.session_ctx(use_parent_session=False) as sess:
                metadata.create_all(sess.bind)

            tables = ['MassSpectrometerTbl', 'ExtractDeviceTbl', 'VersionTbl', 'UserTbl']

            for table in tables:
                mod = __import__('pychron.dvc.dvc_orm', fromlist=[table])
                progress.change_message('Cloning {}'.format(table))
                self._copy_table(db, getattr(mod, table))

            with src.session_ctx(use_parent_session=False):
                from pychron.dvc.dvc_orm import RepositoryTbl
                from pychron.dvc.dvc_orm import AnalysisTbl
                from pychron.dvc.dvc_orm import AnalysisChangeTbl
                from pychron.dvc.dvc_orm import RepositoryAssociationTbl
                from pychron.dvc.dvc_orm import AnalysisGroupTbl
                from pychron.dvc.dvc_orm import AnalysisGroupSetTbl
                from pychron.dvc.dvc_orm import MaterialTbl
                from pychron.dvc.dvc_orm import SampleTbl
                from pychron.dvc.dvc_orm import IrradiationTbl
                from pychron.dvc.dvc_orm import LevelTbl
                from pychron.dvc.dvc_orm import IrradiationPositionTbl
                from pychron.dvc.dvc_orm import PrincipalInvestigatorTbl

                repos = [src.db.get_repository(reponame) for reponame in repositories]

                progress.change_message('Assembling Analyses 0/5')
                st = time.time()
                if analyses:
                    ans = analyses
                    ras = [rai for ai in ans
                           for rai in ai.repository_associations]
                else:

                    # at = time.time()
                    ras = [ra for repo in repos for ra in repo.repository_associations]
                    # self.debug('association time={}'.format(time.time()-at))
                    progress.change_message('Assembling Analyses 1/5')

                    # at = time.time()
                    ans = [ri.analysis for ri in ras]
                    # self.debug('analysis time={}'.format(time.time()-at))

                    progress.change_message('Assembling Analyses 2/5')

                # at = time.time()
                ans_c = [ai.change for ai in ans]
                # self.debug('change time={}'.format(time.time()-at))
                progress.change_message('Assembling Analyses 3/5')

                # at = time.time()
                agss = [gi for ai in ans for gi in ai.group_sets]
                # self.debug('agss time={}'.format(time.time()-at))
                progress.change_message('Assembling Analyses 4/5')

                # at = time.time()
                ags = {gi.group for gi in agss}
                # self.debug('ags time={}'.format(time.time()-at))
                progress.change_message('Assembling Analyses 5/5')

                self.debug('total analysis assembly time={}'.format(time.time()-st))

                self._copy_records(progress, db, RepositoryTbl, repos)
                self._copy_records(progress, db, RepositoryAssociationTbl, ras)
                self._copy_records(progress, db, AnalysisTbl, ans)
                self._copy_records(progress, db, AnalysisChangeTbl, ans_c)
                self._copy_records(progress, db, AnalysisGroupTbl, ags)
                self._copy_records(progress, db, AnalysisGroupSetTbl, agss)

                if principal_investigators:
                    pis = [src.get_principal_investigator(pp.name) for pp in principal_investigators]
                else:
                    pis = {repo.principal_investigator for repo in repos}
                self._copy_records(progress, db, PrincipalInvestigatorTbl, pis)

                from pychron.dvc.dvc_orm import ProjectTbl
                if projects:
                    prjs = [src.get_project(pp) for pp in projects]
                else:
                    prjs = {ai.irradiation_position.sample.project for ai in ans}
                self._copy_records(progress, db, ProjectTbl, prjs)

                ips = {ai.irradiation_position for ai in ans}
                sams = {ip.sample for ip in ips}
                mats = {si.material for si in sams}

                self._copy_records(progress, db, MaterialTbl, mats)

                self._copy_records(progress, db, SampleTbl, sams)

                ls = {ip.level for ip in ips}
                irs = {l.irradiation for l in ls}

                self._copy_records(progress, db, IrradiationTbl, irs)

                self._copy_records(progress, db, LevelTbl, ls)

                self._copy_records(progress, db, IrradiationPositionTbl, ips)

                self.debug('--------- db clone finished')
                progress.close()
                self.information_dialog('Database saved to "{}"'.format(path))
                return path