def test_interpretation_request(self): # get an interpretation request RD for reports 4.2.0 interpretation_request_factory = GenericFactoryAvro.get_factory_avro( protocols.reports_4_2_0.InterpretationRequestRD, version=VERSION_500) instance = interpretation_request_factory() self.assertTrue(instance.validate(instance.toJsonDict())) # get an interpretation request RD for reports 4.0.0 interpretation_request_factory = GenericFactoryAvro.get_factory_avro( protocols.reports_4_0_0.InterpretationRequestRD, version=VERSION_400) instance = interpretation_request_factory() self.assertTrue(instance.validate(instance.toJsonDict())) # get an interpretation request RD for reports 3.1.0 interpretation_request_factory = GenericFactoryAvro.get_factory_avro( protocols.reports_3_0_0.InterpretationRequestRD, version=VERSION_300) instance = interpretation_request_factory() self.assertTrue(instance.validate(instance.toJsonDict()))
def test_migrate_rd_clinical_report(self): # creates a random clinical report cancer for testing filling null values old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.ClinicalReportRD, VERSION_400, fill_nullables=True).create( interpretationRequestVersion='1' ) # 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_clinical_report_rd( old_instance, assembly=assembly) 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.candidateVariants, new_instance.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.ClinicalReportRD, VERSION_400, fill_nullables=False).create(interpretationRequestVersion='1') self._validate(cr_c_400) assembly = 'hg19' new_instance = MigrateReports400To500().migrate_clinical_report_rd( cr_c_400, assembly=assembly) self._validate(new_instance) self.assertTrue(cr_c_400.candidateVariants is None) self.assertTrue(new_instance.variants is None)
def test_json_serialization(self): from protocols.util.dependency_manager import VERSION_400 from protocols.util.factories.avro_factory import GenericFactoryAvro from protocols.reports_4_0_0 import CancerInterpretationRequest as CancerInterpretationRequest_4_0_0 cir_v4 = GenericFactoryAvro.get_factory_avro(clazz=CancerInterpretationRequest_4_0_0, version=VERSION_400, fill_nullables=True).create() cir_v4.validate(cir_v4.toJsonDict()) cir_v4_json = cir_v4.toJsonDict() cir_v4_from_json = CancerInterpretationRequest_4_0_0.fromJsonDict(cir_v4_json) cir_v4_from_json.validate(cir_v4_from_json.toJsonDict())
def _test_post(self, clazz, post_function): model = GenericFactoryAvro.get_factory_avro( clazz=clazz, version=dependency_manager.VERSION_73, fill_nullables=False, ).create() response = post_function(model) # this is stronger than it looks because post checks for errors self.assertIsNotNone(response) return response
def test_migrate_interpretation_request_rd_to_interpreted_genome_210_600(self, fill_nullables=True): old_instance = GenericFactoryAvro.get_factory_avro( reports_2_1_0.InterpretationRequestRD, VERSION_210, fill_nullables=fill_nullables ).create() self._validate(old_instance) migrated_instance = MigrationHelpers.migrate_interpretation_request_rd_to_interpreted_genome_latest( old_instance.toJsonDict(), assembly='GRCh38' ) self.assertIsInstance(migrated_instance, reports_6_0_0.InterpretedGenome) self._validate(migrated_instance)
def test_migrate_interpreted_genome_rd_600_300(self, fill_nullables=True): old_instance = GenericFactoryAvro.get_factory_avro( reports_6_0_0.InterpretedGenome, VERSION_70, fill_nullables=fill_nullables ).create() self._validate(old_instance) if fill_nullables: self._check_non_empty_fields(old_instance) migrated_instance = MigrationHelpers.reverse_migrate_interpreted_genome_rd_to_v3(old_instance.toJsonDict()) self.assertIsInstance(migrated_instance, reports_3_0_0.InterpretedGenomeRD) self._validate(migrated_instance)
def test_migrate_pedigree_110_110(self, fill_nullables=True): old_instance = GenericFactoryAvro.get_factory_avro( participant_1_1_0.Pedigree, VERSION_61, fill_nullables=fill_nullables).create() self._validate(old_instance) if fill_nullables: self._check_non_empty_fields(old_instance) migrated_instance = MigrationHelpers.migrate_pedigree_to_latest( old_instance.toJsonDict()) self._validate(migrated_instance)
def test_migrate_interpreted_genome_rd(self): """ Test passing on 3000 real cases""" old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.InterpretedGenomeRD, VERSION_300, fill_nullables=False).create() self._validate(old_instance) migrated_instance = MigrateReports3To4().migrate_interpreted_genome_rd( old_instance=old_instance) self._validate(migrated_instance) # fill all nullables old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.InterpretedGenomeRD, VERSION_300, fill_nullables=True).create() self._validate(old_instance) migrated_instance = MigrateReports3To4().migrate_interpreted_genome_rd( old_instance=old_instance) self._validate(migrated_instance)
def test_reverse_migrate_clinical_report_cancer_600_400(self, fill_nullables=True): old_instance = GenericFactoryAvro.get_factory_avro( reports_6_0_0.ClinicalReport, VERSION_70, fill_nullables=fill_nullables ).create() self._validate(old_instance) if fill_nullables: self._check_non_empty_fields(old_instance) migrated_instance = MigrationHelpers.reverse_migrate_clinical_report_cancer_to_v4(old_instance.toJsonDict()) self.assertIsInstance(migrated_instance, reports_4_0_0.ClinicalReportCancer) self._validate(migrated_instance)
def test_migrate_interpretation_request_rd(self): """Also tested with real data""" old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.InterpretationRequestRD, VERSION_210, fill_nullables=False).create( ) # reports_3_0_0.InterpretationRequestRD self._validate(old_instance) migrated_instance = Migration21To3().migrate_interpretation_request( old_instance) self._validate(migrated_instance) old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.InterpretationRequestRD, VERSION_210, fill_nullables=True).create( ) # reports_3_0_0.InterpretationRequestRD self._validate(old_instance) migrated_instance = Migration21To3().migrate_interpretation_request( old_instance) self._validate(migrated_instance)
def test_migrate_interpreted_genome_rd_500_600(self, fill_nullables=True): old_instance = GenericFactoryAvro.get_factory_avro( reports_5_0_0.InterpretedGenomeRD, VERSION_61, fill_nullables=fill_nullables ).create() self._validate(old_instance) if fill_nullables: self._check_non_empty_fields(old_instance) migrated_instance = MigrationHelpers.migrate_interpreted_genome_rd_to_latest( old_instance.toJsonDict() ) self._validate(migrated_instance)
def test_migrate_pedigree_300_110(self, fill_nullables=True): old_instance = GenericFactoryAvro.get_factory_avro( reports_3_0_0.Pedigree, VERSION_300, fill_nullables=fill_nullables ).create() for participant in old_instance.participants: for disorder in participant.disorderList: disorder.ageOfOnset = str(factory.fuzzy.FuzzyFloat(0.0).fuzz()) self._validate(old_instance) if fill_nullables: self._check_non_empty_fields(old_instance) migrated_instance = MigrationHelpers.migrate_pedigree_to_latest(old_instance.toJsonDict()) self._validate(migrated_instance)
def test_migrate_cancer_interpreted_genome(self, fill_nullables=True): # creates a random clinical report RD for testing filling null values old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.CancerInterpretedGenome, VERSION_61, fill_nullables=fill_nullables ).create(interpretationRequestVersion=1) self._validate(old_instance) if fill_nullables: self._check_non_empty_fields(old_instance) new_instance = MigrateReports500To400().migrate_cancer_interpreted_genome(old_instance=old_instance) self.assertTrue(isinstance(new_instance, self.new_model.CancerInterpretedGenome)) self._validate(new_instance)
def test_migrate_cancer_participant(self): old_participant = GenericFactoryAvro.get_factory_avro( clazz=participant_1_0_3.CancerParticipant, version=VERSION_500, fill_nullables=True)() migrated_participant = MigrationParticipants103To110( ).migrate_cancer_participant(old_participant) self.assertIsInstance(migrated_participant, self.new_model.CancerParticipant) self._validate(migrated_participant) old_participant = GenericFactoryAvro.get_factory_avro( clazz=participant_1_0_3.CancerParticipant, version=VERSION_500, fill_nullables=False)() migrated_participant = MigrationParticipants103To110( ).migrate_cancer_participant(old_participant) self.assertIsInstance(migrated_participant, self.new_model.CancerParticipant) self._validate(migrated_participant)
def test_migrate_interpretation_request_rd(self): """Also tested with real data""" old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.InterpretationRequestRD, VERSION_300, fill_nullables=False).create( ) # reports_3_0_0.InterpretationRequestRD self._validate(old_instance) migrated_instance = MigrateReports3To4( ).migrate_interpretation_request_rd(old_instance=old_instance) self._validate(migrated_instance) old_big_wigs = old_instance.bigWigs new_big_wigs = migrated_instance.bigWigs if old_big_wigs is not None: for old_big_wig, new_big_wig in zip(old_big_wigs, new_big_wigs): self.assertIsInstance(new_big_wig, self.new_model.File) self.assertEqual(new_big_wig.sampleId, old_big_wig.SampleId) self.assertEqual(new_big_wig.uriFile, old_big_wig.URIFile) self.assertEqual(new_big_wig.fileType, old_big_wig.fileType) self.assertEqual(new_big_wig.md5Sum, None) old_instance = GenericFactoryAvro.get_factory_avro( self.old_model.InterpretationRequestRD, VERSION_300, fill_nullables=True).create( ) # reports_3_0_0.InterpretationRequestRD self._validate(old_instance) migrated_instance = MigrateReports3To4( ).migrate_interpretation_request_rd(old_instance=old_instance) for old_variant, new_variant in zip(old_instance.TieredVariants, migrated_instance.tieredVariants): for old_re, new_re in zip(old_variant.reportEvents, new_variant.reportEvents): self.assertEqual(old_re.genomicFeature.HGNC, new_re.genomicFeature.hgnc) self._validate(migrated_instance)
def test_register_custom_factory(self): ## registering GA4GH variant factory GenericFactoryAvro.register_factory(Variant, GA4GHVariantFactory, version="4.0.0") factory = GenericFactoryAvro.get_factory_avro(Variant, "4.0.0") instances = factory.create_batch(5) for instance in instances: self.assertTrue(instance.validate(instance.toJsonDict())) self.assertTrue(instance.referenceBases in ["A", "C", "G", "T"]) ## register CancerReportedVariantsFactory GenericFactoryAvro.register_factory( protocols.reports_3_0_0.ReportedVariantCancer, CancerReportedVariantsFactory, version="3.0.0") factory = GenericFactoryAvro.get_factory_avro( protocols.reports_3_0_0.CancerInterpretationRequest, "3.0.0") instances = factory.create_batch(5) for instance in instances: self.assertTrue(instance.validate(instance.toJsonDict())) for tiered_variant in instance.TieredVariants: self.assertTrue(tiered_variant.reportedVariantCancer.reference in ["A", "C", "G", "T"]) self.assertTrue(tiered_variant.reportedVariantCancer.alternate in ["A", "C", "G", "T"])
def test_reverse_migrate_cancer_exit_questionnaire_to_v5(self, fill_nullables=True): old_instance = GenericFactoryAvro.get_factory_avro( reports_6_0_0.CancerExitQuestionnaire, VERSION_70, fill_nullables=fill_nullables ).create() old_instance = self.populate_c_eq_variant_level_questions_variant_details(old_c_eq=old_instance) self._validate(old_instance) if fill_nullables: self._check_non_empty_fields(old_instance) migrated_instance = MigrationHelpers.reverse_migrate_cancer_exit_questionnaire_to_v5( json_dict=old_instance.toJsonDict() ) self.assertIsInstance(migrated_instance, reports_5_0_0.CancerExitQuestionnaire) self._validate(migrated_instance)
def test_migrate_clinical_report_cancer_500_600(self, fill_nullables=True): old_instance = GenericFactoryAvro.get_factory_avro( reports_5_0_0.ClinicalReportCancer, VERSION_61, fill_nullables=fill_nullables ).create() self._validate(old_instance) if fill_nullables: self._check_non_empty_fields(old_instance) migrated_instance = MigrationHelpers.migrate_clinical_report_cancer_to_latest( json_dict=old_instance.toJsonDict(), ) self.assertIsInstance(migrated_instance, reports_6_0_0.ClinicalReport) self._validate(migrated_instance)
def test_migrate_genomic_entity_to_feature(self): old_entity = GenericFactoryAvro.get_factory_avro(self.old_model.GenomicEntity, VERSION_61, fill_nullables=True).create() entity_type = old_entity.type feature_type_map = { self.old_model.GenomicEntityType.regulatory_region: self.new_model.FeatureTypes.RegulatoryRegion, self.old_model.GenomicEntityType.gene: self.new_model.FeatureTypes.Gene, self.old_model.GenomicEntityType.transcript: self.new_model.FeatureTypes.Transcript, } expected_feature_type = feature_type_map.get(entity_type) new_feature = MigrateReports500To400()._migrate_genomic_entity_to_feature(old_entity) self.assertTrue(isinstance(new_feature, self.new_model.GenomicFeature)) self._validate(new_feature) self.assertEqual(new_feature.featureType, expected_feature_type)
def test_migrate_clinical_report_cancer_300_600(self, fill_nullables=True): old_instance = GenericFactoryAvro.get_factory_avro( reports_3_0_0.ClinicalReportCancer, VERSION_300, fill_nullables=fill_nullables ).create() self._validate(old_instance) if fill_nullables: self._check_non_empty_fields(old_instance, exclusions=["md5Sum"]) with self.assertRaises(MigrationError): MigrationHelpers.migrate_clinical_report_cancer_to_latest( json_dict=old_instance.toJsonDict(), sample_ids={ 'somatic_variant': 'somatic1', 'germline_variant': 'germline1'}, assembly='GRCh38', participant_id='456' )
def test_migrate_cancer_participant_100_110(self, fill_nullables=True): old_instance = GenericFactoryAvro.get_factory_avro( participant_1_0_0.CancerParticipant, VERSION_400, fill_nullables=fill_nullables).create( ) # type: participant_1_0_0.CancerParticipant old_instance.LDPCode = "fakedLDP" self._validate(old_instance) if fill_nullables: self._check_non_empty_fields(old_instance) migrated_instance = MigrationHelpers.migrate_cancer_participant_to_latest( old_instance.toJsonDict()) self._validate(migrated_instance)
def test_migrate_interpretation_request_rd(self, fill_nullables=True): old_ir_rd = GenericFactoryAvro.get_factory_avro( self.old_model.InterpretationRequestRD, VERSION_61, fill_nullables=fill_nullables).create() new_ir_rd = MigrateReports500To600().migrate_interpretation_request_rd( old_instance=old_ir_rd) self._validate(new_ir_rd) self.assertIsInstance(new_ir_rd, self.new_model.InterpretationRequestRD) self.assertIsInstance(new_ir_rd.versionControl, self.new_model.ReportVersionControl) self.assertEqual(new_ir_rd.versionControl.gitVersionControl, '6.0.0')
def test_migrate_rd_clinical_report_210_600(self, fill_nullables=True): old_instance = GenericFactoryAvro.get_factory_avro( reports_2_1_0.ClinicalReportRD, VERSION_210, fill_nullables=fill_nullables ).create() old_instance.interpretationRequestVersion = str(factory.fuzzy.FuzzyInteger(0).fuzz()) self._validate(old_instance) if fill_nullables: self._check_non_empty_fields(old_instance) migrated_instance = MigrationHelpers.migrate_clinical_report_rd_to_latest( old_instance.toJsonDict(), assembly='GRCh38') self.assertIsInstance(migrated_instance, reports_6_0_0.ClinicalReport) self._validate(migrated_instance)
def test_migrate_interpreted_genome_rd_400_600(self, fill_nullables=True): old_instance = GenericFactoryAvro.get_factory_avro( reports_4_0_0.InterpretedGenomeRD, VERSION_400, fill_nullables=fill_nullables ).create() self._validate(old_instance) if fill_nullables: self._check_non_empty_fields(old_instance) migrated_instance = MigrationHelpers.migrate_interpreted_genome_rd_to_latest( old_instance.toJsonDict(), assembly='GRCh38', interpretation_request_version=1 ) self.assertIsInstance(migrated_instance, reports_6_0_0.InterpretedGenome) self._validate(migrated_instance)
def test_migrate_cancer_exit_questionnaire(self, fill_nullables=True): old_c_eq = GenericFactoryAvro.get_factory_avro( self.old_model.CancerExitQuestionnaire, VERSION_61, fill_nullables=fill_nullables).create() old_c_eq = self.populate_c_eq_variant_level_questions_variant_details( old_c_eq=old_c_eq) new_c_eq = MigrateReports500To600().migrate_cancer_exit_questionnaire( old_instance=old_c_eq, assembly="GRCh38", ) self.assertIsInstance(new_c_eq, self.new_model.CancerExitQuestionnaire) self._validate(new_c_eq)
def test_migrate_interpretation_request_rd_500_600(self, fill_nullables=True): old_instance = GenericFactoryAvro.get_factory_avro( reports_5_0_0.InterpretationRequestRD, VERSION_61, fill_nullables=fill_nullables ).create() self.assertIsInstance(old_instance, reports_5_0_0.InterpretationRequestRD) self._validate(old_instance) migrated_instance = MigrationHelpers.migrate_interpretation_request_rd_to_latest( json_dict=old_instance.toJsonDict() ) self.assertIsInstance(migrated_instance, reports_6_0_0.InterpretationRequestRD) self._validate(migrated_instance) self.assertEqual(migrated_instance.versionControl.gitVersionControl, '6.0.0')
def test_migrate_germline_variant_level_questions(self, fill_nullables=True): old_q = GenericFactoryAvro.get_factory_avro( self.old_model.CancerGermlineVariantLevelQuestions, VERSION_61, fill_nullables=fill_nullables).create() old_q = self.populate_variant_level_questions_variant_details(q=old_q) new_q = MigrateReports500To600( )._migrate_germline_variant_level_question(question=old_q, assembly="GRCh38") self.assertIsInstance( new_q, self.new_model.CancerGermlineVariantLevelQuestions) self._validate(new_q)
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_questionnaire_rd_500_600(self, fill_nullables=True): old_instance = GenericFactoryAvro.get_factory_avro( reports_5_0_0.RareDiseaseExitQuestionnaire, VERSION_61, fill_nullables=fill_nullables ).create() old_instance = self.populate_exit_questionnaire_variant_details(eq=old_instance) self._validate(old_instance) if fill_nullables: self._check_non_empty_fields(old_instance) migrated_instance = MigrationHelpers.migrate_exit_questionnaire_rd_to_latest( json_dict=old_instance.toJsonDict(), assembly="GRCh38" ) self.assertIsInstance(migrated_instance, reports_6_0_0.RareDiseaseExitQuestionnaire) self._validate(migrated_instance)
def test_migrate_interpreted_genome_cancer_300_500(self, fill_nullables=True): old_instance = GenericFactoryAvro.get_factory_avro( reports_3_0_0.CancerInterpretedGenome, VERSION_300, fill_nullables=fill_nullables ).create() self._validate(old_instance) if fill_nullables: self._check_non_empty_fields(old_instance, exclusions=["md5Sum"]) with self.assertRaises(MigrationError): MigrationHelpers.migrate_interpreted_genome_cancer_to_latest( old_instance.toJsonDict(), assembly='GRCh38', participant_id='123', sample_ids={ 'somatic_variant': 'somatic1', 'germline_variant': 'germline1'}, interpretation_request_version=5, interpretation_service='congenica') self.assertTrue(False)