Exemple #1
0
def panel(panel, version, update_date, update_version):
    """
    Update a panel in the database
    """
    adapter = store

    # Check that the panel exists
    panel_obj = adapter.gene_panel(panel, version=version)

    if not panel_obj:
        LOG.warning("Panel %s (version %s) could not be found" % (panel, version))
        click.Abort()

    date_obj = None
    if update_date:
        try:
            date_obj = get_date(update_date)
        except Exception as err:
            LOG.warning(err)
            click.Abort()

    update_panel(
        adapter,
        panel,
        panel_version=panel_obj["version"],
        new_version=update_version,
        new_date=date_obj,
    )
Exemple #2
0
def panel(context, panel, version, update_date, update_version):
    """
    Update a panel in the database
    """
    adapter = context.obj['adapter']
    
    #Check that the panel exists
    panel_obj = adapter.gene_panel(panel, version=version)
    # for panel_obj in adapter.panel_collection.find({'panel_name': 'CAN'}):
    #     print(panel_obj['panel_name'], panel_obj['version'])
    #
    # print(panel_obj)
    if not panel_obj:
        LOG.warning("Panel %s (version %s) could not be found" % (panel, version))
        context.abort()
    
    date_obj = None
    if update_date:
        try:
            date_obj = get_date(update_date)
        except Exception as err:
            LOG.warning(err)
            context.abort()

    updated_panel = update_panel(
        adapter, 
        panel, 
        panel_version=panel_obj['version'], 
        new_version=update_version, 
        new_date=date_obj
    )
Exemple #3
0
 def analysis_date_to_Datetime(cls, analysis_date):
     """Check if analysis_date is on datetime format or string convertible to datetime.
     Otherwise return now."""
     if isinstance(analysis_date, datetime.datetime):
         return analysis_date
     try:
         return get_date(analysis_date)
     except ValueError as err:
         LOG.warning("Analysis date is on wrong format: {}".format(err))
         LOG.warning("Setting analysis date to todays date")
         return datetime.datetime.now()
Exemple #4
0
def panel(context, date, name, version, panel_type, panel_id, path, institute):
    """Add a gene panel to the database."""
    adapter = context.obj['adapter']
    f = get_file_handle(path)
    for line in f:
        line = line.rstrip()
        if line.startswith('##'):
            info = line[2:].split('=')
            name = info[0]
            value = info[1]
            if name == 'panel_id':
                panel_id = value
            elif name == 'institute':
                institute = value
            elif name == 'version':
                version = float(value)
            elif name == 'date':
                date = value
            elif name == 'display_name':
                name = value

    if version:
        existing_panel = adapter.gene_panel(panel_id, version)
    else:
        existing_panel = adapter.gene_panel(panel_id)

    if existing_panel:
        log.debug("found existing panel")
        name = name or existing_panel.display_name or panel_id
        institute = institute or existing_panel.institute

    try:
        date = get_date(date)
    except ValueError as error:
        log.warning(error)
        context.abort()

    info = {
        'file': path,
        'institute': institute,
        'type': panel_type,
        'date': date,
        'version': version,
        'panel_name': panel_id,
        'full_name': name,
    }

    load_panel(adapter=adapter, panel_info=info)
def test_update_panel_date(adapter, case_obj, dummypanel_obj):
    adapter.case_collection.insert_one(case_obj)
    adapter.panel_collection.insert_one(dummypanel_obj)

    ## GIVEN an adapter with a case with gene panels
    new_date_obj = get_date('2015-03-12')

    case_obj = adapter.case_collection.find_one()
    panel_obj = adapter.panel_collection.find_one()

    case_id = case_obj['_id']

    # There is infirmation about a panel both in the panel collection
    # and on the case object. This is fine until one starts to manipulate the objects
    case_panel = case_obj['panels'][0]

    panel_version = case_panel['version']
    panel_name = case_panel['panel_name']
    panel_id = case_panel['panel_id']

    ## WHEN updating the panel version

    update_panel(adapter,
                 panel_name,
                 panel_version=None,
                 new_date=new_date_obj)

    ## THEN assert that the panel version was updated both in panel and case

    updated_panel_obj = adapter.panel_collection.find_one({
        'panel_name':
        panel_name,
        'version':
        panel_version
    })

    assert updated_panel_obj['date'] == new_date_obj

    case_obj = adapter.case_collection.find_one({'_id': case_id})

    for panel in case_obj['panels']:
        assert panel['updated_at'] == new_date_obj
Exemple #6
0
def parse_panel_app_panel(panel_info,
                          hgnc_map,
                          institute="cust000",
                          panel_type="clinical"):
    """Parse a PanelApp panel

    Args:
        panel_info(dict)
        hgnc_map(dict): Map from symbol to hgnc ids
        institute(str)
        panel_type(str)

    Returns:
        gene_panel(dict)
    """
    date_format = "%Y-%m-%dT%H:%M:%S.%f"

    gene_panel = {}
    gene_panel["version"] = float(panel_info["version"])
    gene_panel["date"] = get_date(panel_info["Created"][:-1],
                                  date_format=date_format)
    gene_panel["display_name"] = panel_info["SpecificDiseaseName"]
    gene_panel["institute"] = institute
    gene_panel["panel_type"] = panel_type

    LOG.info("Parsing panel %s", gene_panel["display_name"])

    gene_panel["genes"] = []

    nr_low_confidence = 1
    nr_genes = 0
    for nr_genes, gene in enumerate(panel_info["Genes"], 1):
        gene_info = parse_panel_app_gene(gene, hgnc_map)
        if not gene_info:
            nr_low_confidence += 1
            continue
        gene_panel["genes"].append(gene_info)

    LOG.info("Number of genes in panel %s", nr_genes)
    LOG.info("Number of low confidence genes in panel %s", nr_low_confidence)

    return gene_panel
def test_update_panel_date(adapter, case_obj, testpanel_obj):
    adapter.case_collection.insert_one(case_obj)
    adapter.panel_collection.insert_one(testpanel_obj)

    ## GIVEN an adapter with a case with gene panels
    new_date_obj = get_date("2015-03-12")

    case_obj = adapter.case_collection.find_one()
    panel_obj = adapter.panel_collection.find_one()

    case_id = case_obj["_id"]

    # There is infirmation about a panel both in the panel collection
    # and on the case object. This is fine until one starts to manipulate the objects
    case_panel = case_obj["panels"][0]

    panel_version = case_panel["version"]
    panel_name = case_panel["panel_name"]
    panel_id = case_panel["panel_id"]

    ## WHEN updating the panel version

    update_panel(adapter,
                 panel_name,
                 panel_version=None,
                 new_date=new_date_obj)

    ## THEN assert that the panel version was updated both in panel and case

    updated_panel_obj = adapter.panel_collection.find_one({
        "panel_name":
        panel_name,
        "version":
        panel_version
    })

    assert updated_panel_obj["date"] == new_date_obj

    case_obj = adapter.case_collection.find_one({"_id": case_id})

    for panel in case_obj["panels"]:
        assert panel["updated_at"] == new_date_obj
Exemple #8
0
def get_panel_info(panel_lines=None,
                   panel_id=None,
                   institute=None,
                   version=None,
                   date=None,
                   display_name=None):
    """Parse metadata for a gene panel

    For historical reasons it is possible to include all information about a gene panel in the
    header of a panel file. This function parses the header.

    Args:
        panel_lines(iterable(str))

    Returns:
        panel_info(dict): Dictionary with panel information
    """
    panel_info = {
        'panel_id': panel_id,
        'institute': institute,
        'version': version,
        'date': date,
        'display_name': display_name,
    }

    if panel_lines:
        for line in panel_lines:
            line = line.rstrip()
            if not line.startswith('##'):
                break

            info = line[2:].split('=')
            field = info[0]
            value = info[1]

            if not panel_info.get(field):
                panel_info[field] = value

    panel_info['date'] = get_date(panel_info['date'])

    return panel_info
Exemple #9
0
def get_panel_info(panel_lines=None, panel_id=None, institute=None, **kwargs):
    """Parse metadata for a gene panel

    For historical reasons it is possible to include all information about a gene panel in the
    header of a panel file. This function parses the header.

    Args:
        panel_lines(iterable(str))
        panel_id(str)
        institute(str)
        maintainer(list(user._id))

    Returns:
        panel_info(dict): Dictionary with panel information
    """
    panel_info = {
        "panel_id": panel_id,
        "institute": institute,
        "version": kwargs.get("version"),
        "maintainer": kwargs.get("maintainer"),
        "date": kwargs.get("date"),
        "display_name": kwargs.get("display_name"),
    }

    if panel_lines:
        for line in panel_lines:
            line = line.rstrip()
            if not line.startswith("##"):
                break

            info = line[2:].split("=")
            field = info[0]
            value = info[1]

            if not panel_info.get(field):
                panel_info[field] = value

    panel_info["date"] = get_date(panel_info["date"])

    return panel_info
def test_update_panel_date(panel_database, case_obj):
    adapter = panel_database
    adapter._add_case(case_obj)
    
    ## GIVEN an adapter with a case with gene panels
    new_date_obj = get_date('2015-03-12')
    
    case_obj = adapter.case_collection.find_one()
    panel_obj = adapter.panel_collection.find_one()
    
    case_id = case_obj['_id']
    
    # There is infirmation about a panel both in the panel collection
    # and on the case object. This is fine until one starts to manipulate the objects
    case_panel = case_obj['panels'][0]
    
    panel_version = case_panel['version']
    panel_name = case_panel['panel_name']
    panel_id = case_panel['panel_id']

    ## WHEN updating the panel version
    
    update_panel(adapter, panel_name, panel_version=None, new_date=new_date_obj)
    
    ## THEN assert that the panel version was updated both in panel and case
    
    updated_panel_obj = adapter.panel_collection.find_one(
        {
            'panel_name': panel_name,
            'version': panel_version
        })
    
    assert updated_panel_obj['date'] == new_date_obj
    
    case_obj = adapter.case_collection.find_one({'_id': case_id})
    
    for panel in case_obj['panels']:
        assert panel['updated_at'] == new_date_obj
Exemple #11
0
def get_correct_date(date_info):
    """Convert dateinfo to correct date

    Args:
        dateinfo: Something that represents a date

    Returns:
        correct_date(datetime.datetime)
    """
    if isinstance(date_info, datetime.datetime):
        return date_info

    if isinstance(date_info, str):
        try:
            correct_date = get_date(date_info)
        except ValueError as err:
            LOG.warning("Analysis date is on wrong format")
            LOG.info("Setting analysis date to todays date")
            correct_date = datetime.datetime.now()
        return correct_date

    LOG.info("Setting analysis date to todays date")
    return datetime.datetime.now()
Exemple #12
0
def test_invalid_date():
    date_str = "20150510"
    with pytest.raises(ValueError):
        date_obj = get_date(date_str)
Exemple #13
0
    def load_omim_panel(self, api_key, institute=None):
        """Create and load the OMIM-AUTO panel"""
        existing_panel = self.gene_panel(panel_id='OMIM-AUTO')
        if not existing_panel:
            LOG.warning("OMIM-AUTO does not exists in database")
            LOG.info('Creating a first version')
            version = 1.0

        if existing_panel:
            version = float(math.floor(existing_panel['version']) + 1)

        LOG.info("Setting version to %s", version)

        try:
            mim_files = fetch_mim_files(api_key=api_key, genemap2=True, mim2genes=True)
        except Exception as err:
            raise err

        date_string = None
        # Get the correct date when omim files where released
        for line in mim_files['genemap2']:
            if 'Generated' in line:
                date_string = line.split(':')[-1].lstrip().rstrip()
        date_obj = get_date(date_string)

        if existing_panel:
            if existing_panel['date'] == date_obj:
                LOG.warning("There is no new version of OMIM")
                return

        panel_data = {}
        panel_data['path'] = None
        panel_data['type'] = 'clinical'
        panel_data['date'] = date_obj
        panel_data['panel_id'] = 'OMIM-AUTO'
        panel_data['institute'] = institute or 'cust002'
        panel_data['version'] = version
        panel_data['display_name'] = 'OMIM-AUTO'
        panel_data['genes'] = []

        alias_genes = self.genes_by_alias()

        genes = get_omim_panel_genes(
            genemap2_lines = mim_files['genemap2'],
            mim2gene_lines = mim_files['mim2genes'],
            alias_genes = alias_genes,
        )

        for gene in genes:
            panel_data['genes'].append(gene)

        panel_obj = build_panel(panel_data, self)

        if existing_panel:

            new_genes = self.compare_mim_panels(existing_panel, panel_obj)
            if new_genes:
                self.update_mim_version(new_genes, panel_obj, old_version=existing_panel['version'])
            else:
                LOG.info("The new version of omim does not differ from the old one")
                LOG.info("No update is added")
                return

        self.add_gene_panel(panel_obj)
Exemple #14
0
def test_valid_date():
    date_str = "2015-05-10"
    date_obj = get_date(date_str)
    assert isinstance(date_obj, datetime.datetime)
Exemple #15
0
def test_valid_date_no_date():
    date_str = None
    date_obj = get_date(date_str)
    assert isinstance(date_obj, datetime.datetime)
Exemple #16
0
def test_invalid_date():
    date_str = "20150510"
    with pytest.raises(ValueError):
        date_obj = get_date(date_str)
Exemple #17
0
def test_valid_date():
    date_str = "2015-05-10"
    date_obj = get_date(date_str)
    assert isinstance(date_obj, datetime.datetime)
Exemple #18
0
def test_valid_date_no_date():
    date_str = None
    date_obj = get_date(date_str)
    assert isinstance(date_obj, datetime.datetime)
Exemple #19
0
def panel(
    panel, version, update_date, update_version, add_maintainer, revoke_maintainer
):
    """
    Update a panel in the database
    """
    adapter = store

    # Check that the panel exists
    panel_obj = adapter.gene_panel(panel, version=version)

    if not panel_obj:
        LOG.warning("Panel %s (version %s) could not be found", panel, version)
        raise click.Abort()

    date_obj = None
    if update_date:
        try:
            date_obj = get_date(update_date)
        except Exception as err:
            LOG.warning(err)
            raise click.Abort()

    # Any mintainer updates?

    new_maintainer = None
    if add_maintainer:
        user_obj = adapter.user(user_id=add_maintainer)
        if not user_obj:
            # Check if maintainers exist in the user database
            LOG.warning(
                "Maintainer user id %s does not exist in user database", add_maintainer
            )

            raise click.Abort()

        new_maintainer = panel_obj.get("maintainer", [])
        if add_maintainer in new_maintainer:
            LOG.warning("User %s already in maintainer list.", add_maintainer)
            raise click.Abort()

        new_maintainer.append(add_maintainer)

    if revoke_maintainer:
        current_maintainers = panel_obj.get("maintainer", [])
        try:
            current_maintainers.remove(revoke_maintainer)
            new_maintainer = current_maintainers
        except ValueError:
            LOG.warning(
                "Maintainer user id %s is not a maintainer for panel %s. Current maintainers: %s",
                revoke_maintainer,
                panel,
                current_maintainers,
            )

    update_panel(
        adapter,
        panel,
        panel_version=panel_obj["version"],
        new_version=update_version,
        new_maintainer=new_maintainer,
        new_date=date_obj,
    )
Exemple #20
0
    def load_omim_panel(self, genemap2_lines, mim2gene_lines, institute=None):
        """Create and load the OMIM-AUTO panel

        If the panel already exists, update with new information and increase version

        Args:
            genemap_lines(iterable(str)): The genemap2 file information
            mim2gene_lines(iterable(str)): The mim2genes file information
            institute(str): What institute that is responsible. Default: 'cust002'

        """
        institute = institute or "cust002"
        existing_panel = self.gene_panel(panel_id="OMIM-AUTO")
        if not existing_panel:
            LOG.warning("OMIM-AUTO does not exists in database")
            LOG.info("Creating a first version")

        version = 1.0
        if existing_panel:
            version = float(math.floor(existing_panel["version"]) + 1)

        LOG.info("Setting version to %s", version)

        date_string = None
        # Get the correct date when omim files where released
        for line in genemap2_lines:
            if "Generated" in line:
                date_string = line.split(":")[-1].strip()
                break

        date_obj = get_date(date_string)

        if existing_panel:
            if existing_panel["date"] == date_obj:
                LOG.warning("There is no new version of OMIM")
                return

        panel_data = {
            "path": None,
            "type": "clinical",
            "date": date_obj,
            "panel_id": "OMIM-AUTO",
            "institute": institute,
            "version": version,
            "display_name": "OMIM-AUTO",
            "genes": [],
        }

        alias_genes = self.genes_by_alias()

        genes = get_omim_panel_genes(
            genemap2_lines=genemap2_lines,
            mim2gene_lines=mim2gene_lines,
            alias_genes=alias_genes,
        )

        for gene in genes:
            panel_data["genes"].append(gene)

        panel_obj = build_panel(panel_data, self)

        if existing_panel:
            new_genes = self.compare_mim_panels(existing_panel, panel_obj)
            if not new_genes:
                LOG.info("The new version of omim does not differ from the old one")
                LOG.info("No update is added")
                return
            self.update_mim_version(
                new_genes, panel_obj, old_version=existing_panel["version"]
            )

        self.add_gene_panel(panel_obj)
Exemple #21
0
    def load_omim_panel(self, api_key, institute=None):
        """Create and load the OMIM-AUTO panel"""
        existing_panel = self.gene_panel(panel_id='OMIM-AUTO')
        if not existing_panel:
            LOG.warning("OMIM-AUTO does not exists in database")
            LOG.info('Creating a first version')
            version = 1.0

        if existing_panel:
            version = float(math.floor(existing_panel['version']) + 1)

        LOG.info("Setting version to %s", version)

        try:
            mim_files = fetch_mim_files(api_key=api_key, genemap2=True, mim2genes=True)
        except Exception as err:
            raise err

        date_string = None
        # Get the correct date when omim files where released
        for line in mim_files['genemap2']:
            if 'Generated' in line:
                date_string = line.split(':')[-1].lstrip().rstrip()
        date_obj = get_date(date_string)

        if existing_panel:
            if existing_panel['date'] == date_obj:
                LOG.warning("There is no new version of OMIM")
                return

        panel_data = {}
        panel_data['path'] = None
        panel_data['type'] = 'clinical'
        panel_data['date'] = date_obj
        panel_data['panel_id'] = 'OMIM-AUTO'
        panel_data['institute'] = institute or 'cust002'
        panel_data['version'] = version
        panel_data['display_name'] = 'OMIM-AUTO'
        panel_data['genes'] = []

        alias_genes = self.genes_by_alias()

        genes = get_omim_panel_genes(
            genemap2_lines = mim_files['genemap2'],
            mim2gene_lines = mim_files['mim2genes'],
            alias_genes = alias_genes,
        )

        for gene in genes:
            panel_data['genes'].append(gene)

        panel_obj = build_panel(panel_data, self)

        if existing_panel:

            new_genes = self.compare_mim_panels(existing_panel, panel_obj)
            if new_genes:
                self.update_mim_version(new_genes, panel_obj, old_version=existing_panel['version'])
            else:
                LOG.info("The new version of omim does not differ from the old one")
                LOG.info("No update is added")
                return

        self.add_gene_panel(panel_obj)