def test_migrate_interpretation_request_rd(self): # tests with all nullable fields being filled old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.InterpretationRequestRD, VERSION_400, fill_nullables=True ).create() if old_instance.pedigree.members: for member in old_instance.pedigree.members: if member.disorderList: for disorder in member.disorderList: disorder.ageOfOnset = "1.5" self._validate(old_instance) self._check_non_empty_fields(old_instance) migrated_instance = MigrateReports400To500().migrate_interpretation_request_rd( old_instance=old_instance, assembly='GRCh38' ) self._validate(migrated_instance) for other_file in migrated_instance.otherFiles.values(): self.assertIsInstance(other_file, self.new_model.File) # test with all nullable fields being null old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.InterpretationRequestRD, VERSION_400, fill_nullables=False ).create() self._validate(old_instance) migrated_instance = MigrateReports400To500().migrate_interpretation_request_rd( old_instance=old_instance, assembly='GRCh38' ) self._validate(migrated_instance) if migrated_instance.otherFiles is not None: for other_file in migrated_instance.otherFiles.values(): self.assertIsInstance(other_file, self.new_model.File)
def test_migrate_cancer_interpretation_request(self): """ Test passing with ILMN-8308-1 cancer IR """ # tests with all nullable fields being filled old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.CancerInterpretationRequest, VERSION_400, fill_nullables=True ).create() # we need to enforce that it can be cast to int valid_cancer_origins = ['germline_variant', 'somatic_variant'] for tiered_variant in old_instance.tieredVariants: if tiered_variant.alleleOrigins[0] not in valid_cancer_origins: tiered_variant.alleleOrigins[0] = random.choice(valid_cancer_origins) self._validate(old_instance) self._check_non_empty_fields(old_instance) migrated_instance = MigrateReports400To500().migrate_cancer_interpretation_request( old_instance=old_instance, assembly='GRCh38' ) self._validate(migrated_instance) # test with all nullable fields being null old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.CancerInterpretationRequest, VERSION_400, fill_nullables=False ).create() # we need to enforce that it can be cast to int for tiered_variant in old_instance.tieredVariants: if tiered_variant.alleleOrigins[0] not in valid_cancer_origins: tiered_variant.alleleOrigins[0] = random.choice(valid_cancer_origins) old_instance.cancerParticipant.LDPCode = "needs to be filled" self._validate(old_instance) migrated_instance = MigrateReports400To500().migrate_cancer_interpretation_request( old_instance=old_instance, assembly='GRCh38' ) self._validate(migrated_instance)
def test_migrate_cancer_interpretation_request(self): """ Test passing with ILMN-8308-1 cancer IR """ # tests with all nullable fields being filled old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.CancerInterpretationRequest, VERSION_400, fill_nullables=True).create( ) # we need to enforce that it can be cast to int self._validate(old_instance) self._check_non_empty_fields(old_instance) migrated_instance = MigrateReports400To500( ).migrate_cancer_interpretation_request(old_instance=old_instance, assembly='GRCh38') self._validate(migrated_instance) # test with all nullable fields being null old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.CancerInterpretationRequest, VERSION_400, fill_nullables=False).create( ) # we need to enforce that it can be cast to int old_instance.cancerParticipant.LDPCode = "needs to be filled" self._validate(old_instance) migrated_instance = MigrateReports400To500( ).migrate_cancer_interpretation_request(old_instance=old_instance, assembly='GRCh38') self._validate(migrated_instance)
def test_migrate_cancer_clinical_report(self): # creates a random clinical report cancer for testing filling null values cr_c_400 = GenericFactoryAvro.get_factory_avro( self.old_model.ClinicalReportCancer, VERSION_400, fill_nullables=True ).create(interpretationRequestVersion='1') # we need to enforce that it can be cast to int valid_cancer_origins = ['germline_variant', 'somatic_variant'] if cr_c_400.candidateVariants: for candidate_variant in cr_c_400.candidateVariants: if candidate_variant.alleleOrigins[0] not in valid_cancer_origins: candidate_variant.alleleOrigins[0] = random.choice(valid_cancer_origins) self._validate(cr_c_400) self._check_non_empty_fields(cr_c_400) assembly = 'grch38' participant_id = "no_one" sample_ids = { 'germline_variant': 'germline1', 'somatic_variant': 'somatic1' } migrated_cir_500 = MigrateReports400To500().migrate_cancer_clinical_report( cr_c_400, assembly=assembly, participant_id=participant_id, sample_ids=sample_ids ) self._validate(migrated_cir_500) self._check_non_empty_fields(migrated_cir_500, exclusions=["genomicChanges", "references", "actionType", "otherIds", "groupOfVariants", "score", "vendorSpecificScores", "variantClassification", "fdp50", "recurrentlyReported", "others", "phaseSet"]) self._check_variant_coordinates( [variant.reportedVariantCancer for variant in cr_c_400.candidateVariants], migrated_cir_500.variants, reports_5_0_0.Assembly.GRCh38 ) # creates a random clinical report cancer for testing not filling null values cr_c_400 = GenericFactoryAvro.get_factory_avro( self.old_model.ClinicalReportCancer, VERSION_400, fill_nullables=False ).create(interpretationRequestVersion='1') if cr_c_400.candidateVariants: for candidate_variant in cr_c_400.candidateVariants: if candidate_variant.alleleOrigins[0] not in valid_cancer_origins: candidate_variant.alleleOrigins[0] = random.choice(valid_cancer_origins) self._validate(cr_c_400) assembly = 'hg19' participant_id = "no_one" sample_ids = { 'germline_variant': 'germline1', 'somatic_variant': 'somatic1' } migrated_cir_500 = MigrateReports400To500().migrate_cancer_clinical_report( cr_c_400, assembly=assembly, participant_id=participant_id, sample_ids=sample_ids ) self._validate(migrated_cir_500) self.assertTrue(cr_c_400.candidateVariants is None) self.assertTrue(migrated_cir_500.variants is None)
def test_migrate_interpretation_request_rd_to_interpreted_genome_rd(self): # creates a random clinical report cancer for testing filling null values old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.InterpretationRequestRD, VERSION_400, fill_nullables=True ).create() # we need to enforce that it can be cast to int self._validate(old_instance) self._check_non_empty_fields(old_instance) assembly = 'grch38' interpretation_service = "testing" new_instance = MigrateReports400To500().migrate_interpretation_request_rd_to_interpreted_genome_rd( old_instance, assembly=assembly, interpretation_service=interpretation_service, reference_database_versions={'dbSnp': 'rs12345'}, software_versions={'intogen': '1.5'}, report_url="blablabla.blah", comments=["bla", "bla!", "bla?"] ) self._validate(new_instance) self._check_non_empty_fields(new_instance, exclusions=["alleleFrequencies", "genomicChanges", "proteinChanges", "cdnaChanges", "dbSnpId", "cosmicIds", "clinVarIds", "variantConsequences", "drugResponseClassification", "functionalEffect", "traitAssociation", "tumorigenesisClassification", "clinicalSignificance", "variantAttributes", "vaf"]) self._check_variant_coordinates( old_instance.tieredVariants, new_instance.variants, reports_5_0_0.Assembly.GRCh38 ) self.assertEqual(old_instance.tieringVersion, new_instance.softwareVersions['tiering']) # creates a random clinical report cancer for testing not filling null values old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.InterpretationRequestRD, VERSION_400, fill_nullables=False ).create() self._validate(old_instance) assembly = 'hg19' new_instance = MigrateReports400To500().migrate_interpretation_request_rd_to_interpreted_genome_rd( old_instance, assembly=assembly, interpretation_service=interpretation_service, reference_database_versions={'dbSnp': 'rs12345'}, software_versions={'intogen': '1.5'}, report_url="blablabla.blah", comments=["bla", "bla!", "bla?"] ) self._validate(new_instance) self._check_variant_coordinates( old_instance.tieredVariants, new_instance.variants, reports_5_0_0.Assembly.GRCh37 )
def migrate_clinical_report_cancer_to_v6(json_dict, sample_id=None, assembly=None, participant_id=None): """ Migration from reports 3.0.0 is not supported as we have no data in that version :type json_dict: dict :type sample_id: str :type assembly: Assembly :type participant_id: str :rtype: ClinicalReport_6_0_0 """ types = [ ClinicalReport_6_0_0, ClinicalReportCancer_5_0_0, ClinicalReportCancer_4_0_0 ] migrations = [ lambda x: x, MigrateReports500To600().migrate_cancer_clinical_report, lambda x: MigrateReports400To500().migrate_cancer_clinical_report( old_instance=x, assembly=assembly, participant_id=participant_id, sample_id=sample_id) ] return MigrationHelpers.migrate(json_dict, types, migrations)
def migrate_interpretation_request_rd_to_interpreted_genome_v6( json_dict, assembly): """ :type json_dict: dict :type assembly: Assembly :rtype: InterpretedGenomeRD_6_0_0 """ types = [ InterpretationRequestRD_6_0_0, InterpretationRequestRD_5_0_0, InterpretationRequestRD_4_0_0, InterpretationRequestRD_3_0_0, InterpretationRequestRD_2_1_0 ] migrations = [ lambda x: x, MigrateReports500To600().migrate_interpreted_genome_rd, lambda x: MigrateReports400To500( ).migrate_interpretation_request_rd_to_interpreted_genome_rd( old_instance=x, assembly=assembly, interpretation_service="tiering", reference_database_versions={}, software_versions={}), MigrateReports3To4().migrate_interpretation_request_rd, Migration21To3().migrate_interpretation_request ] return MigrationHelpers.migrate(json_dict, types, migrations)
def migrate_interpreted_genome_cancer_to_v6( json_dict, assembly=None, participant_id=None, sample_id=None, interpretation_request_version=None, interpretation_service=None): """ Migration from reports 3.0.0 is not supported as we have no data in that version :type json_dict: dict :type assembly: Assembly :type participant_id: str :type sample_id: str :type interpretation_request_version: int :type interpretation_service: str :rtype: InterpretedGenome_6_0_0 """ types = [ InterpretedGenome_6_0_0, CancerInterpretedGenome_5_0_0, CancerInterpretedGenome_4_0_0 ] migrations = [ lambda x: x, MigrateReports500To600().migrate_cancer_interpreted_genome, lambda x: MigrateReports400To500().migrate_cancer_interpreted_genome( old_instance=x, assembly=assembly, participant_id=participant_id, sample_id=sample_id, interpretation_request_version=interpretation_request_version, interpretation_service=interpretation_service) ] return MigrationHelpers.migrate(json_dict, types, migrations)
def migrate_interpreted_genome_rd_to_v6( json_dict, assembly=None, interpretation_request_version=None, panel_source='panelapp'): """ :type json_dict: dict :type assembly: Assembly :type interpretation_request_version: int :type panel_source: str :rtype: InterpretedGenome_6_0_0 """ types = [ InterpretedGenome_6_0_0, InterpretedGenomeRD_5_0_0, InterpretedGenomeRD_4_0_0, InterpretedGenomeRD_3_0_0, InterpretedGenomeRD_2_1_0 ] migrations = [ lambda x: x, lambda x: MigrateReports500To600( ).migrate_interpreted_genome_rd(x, panel_source=panel_source), lambda x: MigrateReports400To500().migrate_interpreted_genome_rd( x, assembly=assembly, interpretation_request_version=interpretation_request_version), MigrateReports3To4().migrate_interpreted_genome_rd, Migration21To3().migrate_interpreted_genome ] return MigrationHelpers.migrate(json_dict, types, migrations)
def test_migrate_reported_variants(self): old_ig = GenericFactoryAvro.get_factory_avro( self.old_model.InterpretedGenomeRD, VERSION_400, fill_nullables=True ).create() self._validate(old_ig) reported_variants_5 = MigrateReports400To500().convert_collection( old_ig.reportedVariants, MigrateReports400To500()._migrate_reported_variant, assembly="GRCh37" ) old_hgnc_symbols = [re.genomicFeature.hgnc for rv in old_ig.reportedVariants for re in rv.reportEvents] new_hgnc_symbols = [ge.geneSymbol for rv in reported_variants_5 for re in rv.reportEvents for ge in re.genomicEntities] [self.assertIsNotNone(symbol) for symbol in old_hgnc_symbols] [self.assertIsNotNone(symbol) for symbol in new_hgnc_symbols] self.assertEqual(old_hgnc_symbols, new_hgnc_symbols)
def migrate_interpretation_request_cancer_to_interpreted_genome_v6( json_dict, assembly, interpretation_service, reference_database_versions, software_versions, report_url, comments): """ :type json_dict: dict :type assembly: Assembly :type interpretation_service: str :type reference_database_versions: dict :type software_versions: dict :type report_url: str :type comments: list :rtype: CancerInterpretationRequest_6_0_0 """ if CancerInterpretationRequest_5_0_0.validate(CancerInterpretationRequest_5_0_0.fromJsonDict(json_dict)): raise MigrationError( "Cannot transform a cancer interpretation request in version 5.0.0 into an interpreted genome") if CancerInterpretationRequest_6_0_0.validate(CancerInterpretationRequest_6_0_0.fromJsonDict(json_dict)): raise MigrationError( "Cannot transform a cancer interpretation request in version 6.0.0 into an interpreted genome") types = [ InterpretedGenome_6_0_0, CancerInterpretedGenome_5_0_0, CancerInterpretationRequest_4_0_0 ] migrations = [ lambda x: x, MigrateReports500To600().migrate_cancer_interpreted_genome, lambda x: MigrateReports400To500().migrate_cancer_interpretation_request_to_cancer_interpreted_genome( old_instance=x, assembly=assembly, interpretation_service=interpretation_service, reference_database_versions=reference_database_versions, software_versions=software_versions, report_url=report_url, comments=comments) ] return MigrationHelpers.migrate(json_dict, types, migrations)
def test_migrate_rd_interpreted_genome(self): # creates a random clinical report cancer for testing filling null values old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.InterpretedGenomeRD, VERSION_400, fill_nullables=True).create( ) # we need to enforce that it can be cast to int self._validate(old_instance) self._check_non_empty_fields(old_instance) assembly = 'grch38' new_instance = MigrateReports400To500().migrate_interpreted_genome_rd( old_instance, assembly=assembly, interpretation_request_version=1) self._validate(new_instance) self._check_non_empty_fields( new_instance, exclusions=[ "alleleFrequencies", "genomicChanges", "proteinChanges", "cdnaChanges", "dbSnpId", "cosmicIds", "clinVarIds", "variantConsequences", "drugResponseClassification", "functionalEffect", "traitAssociation", "tumorigenesisClassification", "clinicalSignificance", "variantAttributes", "vaf" ]) self._check_variant_coordinates(old_instance.reportedVariants, new_instance.variants, reports_5_0_0.Assembly.GRCh38) # creates a random clinical report cancer for testing not filling null values old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.InterpretedGenomeRD, VERSION_400, fill_nullables=False).create() self._validate(old_instance) assembly = 'hg19' new_instance = MigrateReports400To500().migrate_interpreted_genome_rd( old_instance, assembly=assembly, interpretation_request_version=1) self._validate(new_instance) self._check_variant_coordinates(old_instance.reportedVariants, new_instance.variants, reports_5_0_0.Assembly.GRCh37)
def migrate_interpretation_request_cancer_to_v6(json_dict, assembly): """ :type json_dict: dict :type assembly: Assembly :rtype: CancerInterpretationRequest_6_0_0 """ types = [ CancerInterpretationRequest_6_0_0, CancerInterpretationRequest_5_0_0, CancerInterpretationRequest_4_0_0 ] migrations = [ MigrationHelpers.set_version_to_6_0_0, MigrateReports500To600().migrate_interpretation_request_cancer, lambda x: MigrateReports400To500().migrate_cancer_interpretation_request(old_instance=x, assembly=assembly) ] return MigrationHelpers.migrate(json_dict, types, migrations)
def migrate_clinical_report_rd_to_v6(json_dict, assembly=None): """ :type json_dict: dict :type assembly: Assembly :rtype: ClinicalReportRD_6_0_0 """ types = [ ClinicalReport_6_0_0, ClinicalReportRD_5_0_0, ClinicalReportRD_4_0_0, ClinicalReportRD_3_0_0, ClinicalReportRD_2_1_0 ] migrations = [ lambda x: x, MigrateReports500To600().migrate_clinical_report_rd, lambda x: MigrateReports400To500().migrate_clinical_report_rd( old_instance=x, assembly=assembly), MigrateReports3To4().migrate_clinical_report_rd, Migration21To3().migrate_clinical_report ] return MigrationHelpers.migrate(json_dict, types, migrations)
def migrate_interpretation_request_rd_to_v6(json_dict, assembly=None): """ :type json_dict: dict :type assembly: Assembly :rtype: InterpretationRequestRD_6_0_0 """ types = [ InterpretationRequestRD_6_0_0, InterpretationRequestRD_5_0_0, InterpretationRequestRD_4_0_0, InterpretationRequestRD_3_0_0, InterpretationRequestRD_2_1_0 ] migrations = [ MigrationHelpers.set_version_to_6_0_0, # needed because 5 is valid as 6 MigrateReports500To600().migrate_interpretation_request_rd, lambda x: MigrateReports400To500().migrate_interpretation_request_rd(old_instance=x, assembly=assembly), MigrateReports3To4().migrate_interpretation_request_rd, Migration21To3().migrate_interpretation_request ] return MigrationHelpers.migrate(json_dict, types, migrations)
def test_migrate_cancer_interpretation_request_to_cancer_interpreted_genome( self): # creates a random clinical report cancer for testing filling null values old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.CancerInterpretationRequest, VERSION_400, fill_nullables=True).create() old_instance.cancerParticipant.tumourSamples = [ old_instance.cancerParticipant.tumourSamples[0] ] self._validate(old_instance) self._check_non_empty_fields(old_instance) assembly = 'grch38' interpretation_service = 'testing' new_instance = MigrateReports400To500( ).migrate_cancer_interpretation_request_to_cancer_interpreted_genome( old_instance, assembly=assembly, interpretation_service=interpretation_service, reference_database_versions={'dbSnp': 'rs12345'}, software_versions={'intogen': '1.5'}, report_url="blablabla.blah", comments=["bla", "bla!", "bla?"]) self._validate(new_instance) self._check_non_empty_fields( new_instance, exclusions=[ "genomicChanges", "references", "actionType", "otherIds", "groupOfVariants", "score", "vendorSpecificScores", "variantClassification", "fdp50", "recurrentlyReported", "others", "phaseSet" ]) self._check_variant_coordinates([ variant.reportedVariantCancer for variant in old_instance.tieredVariants ], new_instance.variants, reports_5_0_0.Assembly.GRCh38) # creates a random clinical report cancer for testing not filling null values old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.CancerInterpretationRequest, VERSION_400, fill_nullables=False).create() old_instance.cancerParticipant.tumourSamples = [ old_instance.cancerParticipant.tumourSamples[0] ] self._validate(old_instance) assembly = 'grCH37' interpretation_service = 'testing' new_instance = MigrateReports400To500( ).migrate_cancer_interpretation_request_to_cancer_interpreted_genome( old_instance, assembly=assembly, interpretation_service=interpretation_service, reference_database_versions={}, software_versions={}) self._validate(new_instance) self._check_variant_coordinates([ variant.reportedVariantCancer for variant in old_instance.tieredVariants ], new_instance.variants, reports_5_0_0.Assembly.GRCh37)
def test_migrate_cancer_interpreted_genome(self): # creates a random clinical report cancer for testing filling null values old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.CancerInterpretedGenome, VERSION_400, fill_nullables=True).create() self._validate(old_instance) self._check_non_empty_fields(old_instance) assembly = 'grch38' participant_id = "no_one" sample_id = 'some' interpretation_request_version = 1 interpretation_service = 'testing' new_instance = MigrateReports400To500( ).migrate_cancer_interpreted_genome( old_instance, assembly=assembly, participant_id=participant_id, sample_id=sample_id, interpretation_request_version=interpretation_request_version, interpretation_service=interpretation_service) self._validate(new_instance) self._check_non_empty_fields( new_instance, exclusions=[ "genomicChanges", "references", "actionType", "otherIds", "groupOfVariants", "score", "vendorSpecificScores", "variantClassification", "fdp50", "recurrentlyReported", "others", "phaseSet" ]) self._check_variant_coordinates([ variant.reportedVariantCancer for variant in old_instance.reportedVariants ], new_instance.variants, reports_5_0_0.Assembly.GRCh38) # creates a random clinical report cancer for testing not filling null values old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.CancerInterpretedGenome, VERSION_400, fill_nullables=False).create() self._validate(old_instance) assembly = 'hg19' participant_id = "no_one" sample_id = 'some' interpretation_request_version = 1 interpretation_service = 'testing' new_instance = MigrateReports400To500( ).migrate_cancer_interpreted_genome( old_instance, assembly=assembly, participant_id=participant_id, sample_id=sample_id, interpretation_request_version=interpretation_request_version, interpretation_service=interpretation_service) self._validate(new_instance) self._check_variant_coordinates([ variant.reportedVariantCancer for variant in old_instance.reportedVariants ], new_instance.variants, reports_5_0_0.Assembly.GRCh37)