diff --git a/CHANGELOG.md b/CHANGELOG.md index 589f73e..3ac5153 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ ## Multiple Primary and Histology Coding Rules Version History +**Changes in version 1.43** + +- Implemented 2026 updates of solid tumor rules. (#152) + **Changes in version 1.42** - Changed the minimum Java language for this library from Java 8 to Java 21. diff --git a/src/main/java/com/imsweb/mph/MphConstants.java b/src/main/java/com/imsweb/mph/MphConstants.java index 212db84..80b1e30 100644 --- a/src/main/java/com/imsweb/mph/MphConstants.java +++ b/src/main/java/com/imsweb/mph/MphConstants.java @@ -109,7 +109,7 @@ private MphConstants() { public static final String THYROID = "C739"; public static final String LYMPH_NODE = "C77"; - public static final String PERITONEUM = "C482"; + public static final List PERITONEUM = Collections.unmodifiableList(Arrays.asList("C481", "C482", "C488")); public static final String FALLOPIAN = "C570"; @@ -480,6 +480,7 @@ private MphConstants() { content.put("8982", "8575"); // Metaplastic carcinoma NOS or of no special type (NST) 8575 content.put("8070", "8575"); // Metaplastic carcinoma NOS or of no special type (NST) 8575 content.put("8480", "8480"); // Mucinous carcinoma 8480 + content.put("8470", "8470"); //Mucinous cystadenocarcinoma 8470 content.put("8430", "8430"); // Mucoepidermoid carcinoma 8430 content.put("8246/3", "8246/3"); //Neuroendocrine carcinoma NOS 8246/3 content.put("8574/3", "8246/3"); //Neuroendocrine carcinoma NOS 8246/3 @@ -573,9 +574,9 @@ private MphConstants() { static { Map content = new HashMap<>(); - content.put("8693/3", "8693/3"); //Extra-adrenal paraganglioma 8693/3 content.put("8013/3", "8013/3"); //Large cell neuroendocrine carcinoma/tumor content.put("8041/3", "8041/3"); //Small cell neuroendocrine carcinoma + content.put("8249/3", "8249/3"); //Neuroendocrine tumor, grade 2 8249 (/3) content.put("8316", "8316"); //Acquired cystic disease-associated renal cell carcinoma/tubulocystic renal cell carcinoma content.put("8317", "8317"); //Chromophobe renal cell carcinoma (ChRCC) content.put("8323/3", "8323/3"); //Clear cell papillary renal cell carcinoma @@ -589,11 +590,11 @@ private MphConstants() { content.put("8890/3", "8890/3"); // Leiomyosarcoma/renal vein leiomyosarcoma content.put("9180/3", "9180/3"); //Osteosarcoma content.put("9364/3", "9364/3"); //Primitive/peripheral neuroectodermal tumor (pNET)/Ewing sarcoma - content.put("8900/3", "8920/3,8910/3,8901/3,8912/3"); //Rhabdomyosarcoma - content.put("8920/3", "8920/3"); //Rhabdomyosarcoma + content.put("8900/3", "8910/3,8901/3,8912/3,8920/3"); //Rhabdomyosarcoma content.put("8910/3", "8910/3"); //Rhabdomyosarcoma content.put("8901/3", "8901/3"); //Rhabdomyosarcoma content.put("8912/3", "8912/3"); //Rhabdomyosarcoma + content.put("8920/3", "8920/3"); //Rhabdomyosarcoma content.put("9040/3", "9040/3"); //Synovial sarcoma KIDNEY_2018_TABLE1_SUBTYPES = Collections.unmodifiableMap(content); } @@ -604,11 +605,12 @@ private MphConstants() { Map content = new HashMap<>(); content.put("8510", "8510"); // Medullary carcinoma 8510 content.put("8960", "8960"); // Nephroblastoma 8960 - content.put("8693/3", "8240/3"); // Neuroendocrine tumor (NET) 8240 - content.put("8041/3", "8240/3"); // Neuroendocrine tumor (NET) 8240 - content.put("8013/3", "8240/3"); // Neuroendocrine tumor (NET) 8240 + content.put("8246/3", "8246/3"); // Neuroendocrine carcinoma 8246 (/3) + content.put("8013/3", "8246/3"); // Neuroendocrine carcinoma 8246 (/3) + content.put("8041/3", "8246/3"); // Neuroendocrine carcinoma 8246 (/3) content.put("8240/3", "8240/3"); // Neuroendocrine tumor (NET) 8240 - content.put("8700/3", "8700/3"); // Paraganglioma 8700/3 + content.put("8249/3", "8240/3"); // Neuroendocrine tumor (NET) 8240 + content.put("8693/3", "8693/3"); // Paraganglioma 8700/3 content.put("8312", "8312"); // Renal cell carcinoma NOS 8312 content.put("8316", "8312"); // Renal cell carcinoma NOS 8312 content.put("8317", "8312"); // Renal cell carcinoma NOS 8312 @@ -625,10 +627,10 @@ private MphConstants() { content.put("9180/3", "8800/3"); // Sarcoma 8800/3 content.put("9364/3", "8800/3"); // Sarcoma 8800/3 content.put("8900/3", "8800/3"); // Sarcoma 8800/3 - content.put("8920/3", "8800/3"); // Sarcoma 8800/3 content.put("8910/3", "8800/3"); // Sarcoma 8800/3 content.put("8901/3", "8800/3"); // Sarcoma 8800/3 content.put("8912/3", "8800/3"); // Sarcoma 8800/3 + content.put("8920/3", "8800/3"); // Sarcoma 8800/3 content.put("9040/3", "8800/3"); // Sarcoma 8800/3 KIDNEY_2018_TABLE1_ROWS = Collections.unmodifiableMap(content); } @@ -733,13 +735,12 @@ private MphConstants() { content.put("8480", "8480"); content.put("8144", "8144"); content.put("8333", "8333"); - content.put("8250/3", "8250/3"); + content.put("8250", "8250"); content.put("8253", "8253"); content.put("8257/3", "8257/3"); content.put("8265", "8265"); content.put("8254", "8254"); content.put("8256/3", "8256/3"); - content.put("8250/2", "8250/2"); content.put("8260", "8260"); content.put("8230", "8230"); content.put("8045", "8045"); @@ -767,13 +768,12 @@ private MphConstants() { content.put("8480", "8140"); //Adenocarcinoma 8140 content.put("8144", "8140"); //Adenocarcinoma 8140 content.put("8333", "8140"); //Adenocarcinoma 8140 - content.put("8250/3", "8140"); //Adenocarcinoma 8140 + content.put("8250", "8140"); //Adenocarcinoma 8140 content.put("8253/2", "8140"); //Adenocarcinoma 8140 content.put("8253/3", "8140"); //Adenocarcinoma 8140 content.put("8257/3", "8140"); //Adenocarcinoma 8140 content.put("8265", "8140"); //Adenocarcinoma 8140 content.put("8254", "8140"); //Adenocarcinoma 8140 - content.put("8250/2", "8140"); //Adenocarcinoma 8140 content.put("8256/3", "8140"); //Adenocarcinoma 8140 content.put("8260", "8140"); //Adenocarcinoma 8140 content.put("8230", "8140"); //Adenocarcinoma 8140 @@ -827,7 +827,8 @@ private MphConstants() { public static final String CNS_2018_SPINAL_MENINGES_SITES = "C701"; public static final String CNS_2018_SPINAL_CORD_SITES = "C720"; public static final String CNS_2018_CRANIAL_NERVES_SITES_NON_CAUDA_EQUINA = "C722-C725"; - public static final String CNS_2018_MENINGES_OF_CRANIAL_OR_PERIPH_NERVES_SITES = "C709"; + public static final String MALIGNANT_CNS_2018_MENINGES_OF_CRANIAL_OR_PERIPH_NERVES_SITES = "C709"; + public static final String NON_MALIGNANT_CNS_2018_MENINGES_OF_CRANIAL_OR_PERIPH_NERVES_SITES = "C700"; public static final List CNS_2018_MENINGIOMAS = Collections.unmodifiableList(Arrays.asList( "9530/0", "9534/0", "9539/1", "9538/1", "9532/0", "9531/0", "9537/0")); @@ -1048,11 +1049,12 @@ private MphConstants() { "C129", "C130", "C131", "C132", "C138", "C139", "C320", "C321", "C322", "C323", "C328", "C329", "C339")); private static final List HEAD_AND_NECK_2018_TABLE4_SITES = Collections.unmodifiableList(Arrays.asList( + "C000", "C001", "C002", "C003", "C004", "C005", "C006", "C008", "C009", "C020", "C021", "C022", "C023", "C028", "C029", "C030", "C031", "C039", "C040", "C041", "C048", "C049", - "C050", "C051", "C052", "C058", "C059", "C060", "C061", "C062", "C068", "C069")); + "C050", "C058", "C059", "C060", "C061", "C062", "C068", "C069")); private static final List HEAD_AND_NECK_2018_TABLE5_SITES = Collections.unmodifiableList(Arrays.asList( - "C024", "C100", "C101", "C102", "C103", "C104", "C108", "C109", "C019", "C090", "C091", "C098", "C099")); + "C051", "C052", "C100", "C101", "C102", "C103", "C104", "C108", "C109", "C019", "C024", "C090", "C091", "C098", "C099")); private static final List HEAD_AND_NECK_2018_TABLE6_SITES = Collections.unmodifiableList(Arrays.asList( "C079", "C080", "C081", "C088", "C089")); private static final List HEAD_AND_NECK_2018_TABLE7_SITES = Collections.unmodifiableList(Arrays.asList( @@ -1071,12 +1073,10 @@ private MphConstants() { // Table 1 ---------------------------------------- Map thisTableSubTypes = new HashMap<>(); thisTableSubTypes.put("8144", "8144"); - thisTableSubTypes.put("9560/3", "9560/3"); + thisTableSubTypes.put("8483/3", "8483/3"); thisTableSubTypes.put("8745/3", "8745/3"); thisTableSubTypes.put("8746/3", "8746/3"); thisTableSubTypes.put("8721/3", "8721/3"); - thisTableSubTypes.put("9521/3", "9521/3"); - thisTableSubTypes.put("9523/3", "9523/3"); thisTableSubTypes.put("9120/3", "9120/3"); thisTableSubTypes.put("9045/3", "9045/3"); thisTableSubTypes.put("9133/3", "9133/3"); @@ -1119,8 +1119,8 @@ private MphConstants() { thisTableSubTypes.put("9243/3", "9243/3"); thisTableSubTypes.put("8851/3", "8851/3"); thisTableSubTypes.put("8013/3", "8013/3"); - thisTableSubTypes.put("8249/3", "8249/3"); thisTableSubTypes.put("8041/3", "8041/3"); + thisTableSubTypes.put("8249/3", "8249/3"); thisTableSubTypes.put("8560", "8560"); thisTableSubTypes.put("8083", "8083"); thisTableSubTypes.put("8082", "8082"); @@ -1138,7 +1138,9 @@ private MphConstants() { thisTableSubTypes.put("8746/3", "8746/3"); thisTableSubTypes.put("8721/3", "8721/3"); thisTableSubTypes.put("8075", "8075"); + thisTableSubTypes.put("8560", "8560"); thisTableSubTypes.put("8083", "8083"); + thisTableSubTypes.put("8085/2", "8085/2"); thisTableSubTypes.put("8082", "8082"); thisTableSubTypes.put("8071", "8071"); thisTableSubTypes.put("8072", "8072"); @@ -1170,7 +1172,7 @@ private MphConstants() { thisTableSubTypes.put("8144", "8144"); thisTableSubTypes.put("8480", "8480"); thisTableSubTypes.put("8430", "8430"); - thisTableSubTypes.put("8450", "8450"); + thisTableSubTypes.put("8407", "8407"); thisTableSubTypes.put("8013", "8013"); thisTableSubTypes.put("8041", "8041"); thisTableSubTypes.put("8265/3", "8265/3"); @@ -1204,7 +1206,12 @@ private MphConstants() { for (String site : HEAD_AND_NECK_2018_TABLE7_SITES) content.put(site, thisTableSubTypes); - // Table 8: No SubTypes + // Table 8: + thisTableSubTypes = new HashMap<>(); + thisTableSubTypes.put("8071/3", "8071/3"); + for (String site : HEAD_AND_NECK_2018_TABLE8_SITES) + content.put(site, thisTableSubTypes); + // Table 9: No SubTypes // Special C111 Site - Combine Table 2 and 5. @@ -1231,10 +1238,9 @@ private MphConstants() { Map thisTableRows = new HashMap<>(); thisTableRows.put("8140", "8140"); // Adenocarcinoma 8140 thisTableRows.put("8144", "8140"); // Adenocarcinoma 8140 - thisTableRows.put("8483/3", "8483/3"); // HPV-related multiphenotypic sinonasal carcinoma 8483/3 + thisTableRows.put("8483/3", "8140"); // Adenocarcinoma 8140 thisTableRows.put("8082", "8082"); // Lymphoepithelial carcinoma 8082 thisTableRows.put("9540/3", "9540/3"); // Malignant peripheral nerve sheath tumor 9540/3 - thisTableRows.put("9560/3", "9540/3"); // Malignant peripheral nerve sheath tumor 9540/3 thisTableRows.put("8430", "8430"); // Mucoepidermoid carcinoma 8430 thisTableRows.put("8720", "8720"); // Mucosal melanoma 8720 thisTableRows.put("8745/3", "8720"); // Mucosal melanoma 8720 @@ -1243,8 +1249,6 @@ private MphConstants() { thisTableRows.put("8982", "8982"); // Myoepithelial carcinoma 8982 thisTableRows.put("8023", "8023"); // NUT carcinoma 8023* thisTableRows.put("9522/3", "9522/3"); // Olfactory neuroblastoma 9522/3 - thisTableRows.put("9521/3", "9522/3"); // Olfactory neuroblastoma 9522/3 - thisTableRows.put("9523/3", "9522/3"); // Olfactory neuroblastoma 9522/3 thisTableRows.put("9364", "9364"); // Primitive neuroectodermal tumor 9364 thisTableRows.put("8800/3", "8800/3"); // Sarcoma 8800/3 thisTableRows.put("9120/3", "8800/3"); // Sarcoma 8800/3 @@ -1299,10 +1303,11 @@ private MphConstants() { thisTableRows.put("9243/3", "9220/3"); // Chondrosarcoma 9220/3 thisTableRows.put("8850/3", "8850/3"); // Liposarcoma 8850/3 thisTableRows.put("8851/3", "8850/3"); // Liposarcoma 8850/3 + thisTableRows.put("8246/3", "8246/3"); //Neuroendocrine carcinoma 8246 (/3) + thisTableRows.put("8013/3", "8246/3"); //Neuroendocrine carcinoma 8246 (/3) + thisTableRows.put("8041/3", "8246/3"); //Neuroendocrine carcinoma 8246 (/3) thisTableRows.put("8240/3", "8240/3"); //Neuroendocrine tumor, NOS 8240/3 - thisTableRows.put("8013/3", "8240/3"); //Neuroendocrine tumor, NOS 8240/3 thisTableRows.put("8249/3", "8240/3"); //Neuroendocrine tumor, NOS 8240/3 - thisTableRows.put("8041/3", "8240/3"); //Neuroendocrine tumor, NOS 8240/3 thisTableRows.put("8070", "8070"); // Squamous cell carcinoma (SCC) 8070 thisTableRows.put("8560", "8070"); // Squamous cell carcinoma (SCC) 8070 thisTableRows.put("8083", "8070"); // Squamous cell carcinoma (SCC) 8070 @@ -1318,7 +1323,6 @@ private MphConstants() { // Table 4 ---------------------------------------------------------------------------------------------------------------------- thisTableRows = new HashMap<>(); - thisTableRows.put("8560", "8560"); // Adenosquamous carcinoma 8560 thisTableRows.put("9580", "9580"); // Granular cell tumor 9580 thisTableRows.put("8430", "8430"); // Mucoepidermoid carcinoma 8430 thisTableRows.put("8720", "8720"); // Oral mucosal melanoma 8720 @@ -1328,7 +1332,9 @@ private MphConstants() { thisTableRows.put("8825", "8825"); // Myofibroblastic sarcoma 8825 thisTableRows.put("8070", "8070"); // Squamous cell carcinoma 8070 thisTableRows.put("8075", "8070"); // Squamous cell carcinoma 8070 + thisTableRows.put("8560", "8070"); // Squamous cell carcinoma 8070 thisTableRows.put("8083", "8070"); // Squamous cell carcinoma 8070 + thisTableRows.put("8085/2", "8070"); // Squamous cell carcinoma 8070 thisTableRows.put("8082", "8070"); // Squamous cell carcinoma 8070 thisTableRows.put("8071", "8070"); // Squamous cell carcinoma 8070 thisTableRows.put("8072", "8070"); // Squamous cell carcinoma 8070 @@ -1365,7 +1371,7 @@ private MphConstants() { thisTableRows.put("8144", "8140"); // Adenocarcinoma 8140 thisTableRows.put("8480", "8140"); // Adenocarcinoma 8140 thisTableRows.put("8430", "8140"); // Adenocarcinoma 8140 - thisTableRows.put("8450", "8140"); // Adenocarcinoma 8140 + thisTableRows.put("8407", "8140"); // Adenocarcinoma 8140 thisTableRows.put("8200", "8200"); // Adenoid cystic carcinoma 8200 thisTableRows.put("8980", "8980"); // Carcinosarcoma 8980 thisTableRows.put("8440", "8440"); // Cystadenocarcinoma 8440 @@ -1394,9 +1400,9 @@ private MphConstants() { thisTableRows.put("9310/3", "9270/3"); // Ameloblastic carcinoma-primary type 9270/3 thisTableRows.put("9341", "9341"); // Clear cell odontogenic carcinoma 9341* thisTableRows.put("9302", "9302"); // Ghost cell odontogenic carcinoma 9302* - thisTableRows.put("8980/3", "8980/3"); // Odontogenic carcinosarcoma 8980/3 - thisTableRows.put("9330/3", "8980/3,8800/3"); // Odontogenic carcinosarcoma 8980/3 and Sarcoma NOS 8800/3 + thisTableRows.put("9342/3", "9342/3"); //Odontogenic carcinosarcoma 9342 (/3) thisTableRows.put("8800/3", "8800/3"); // Sarcoma NOS 8800/3 + thisTableRows.put("9330/3", "8800/3"); // Sarcoma NOS 8800/3 thisTableRows.put("9222/3", "8800/3"); // Sarcoma NOS 8800/3 thisTableRows.put("9220/3", "8800/3"); // Sarcoma NOS 8800/3 thisTableRows.put("9240/3", "8800/3"); // Sarcoma NOS 8800/3 @@ -1423,6 +1429,7 @@ private MphConstants() { thisTableRows.put("8420/3", "8420/3"); // Ceruminous adenocarcinoma 8420/3 thisTableRows.put("8240/3", "8240/3"); // Middle ear neuroendocrine tumor 8240/3 thisTableRows.put("8070", "8070"); // Squamous cell carcinoma of the middle ear 8070 + thisTableRows.put("8071/3", "8070"); // Squamous cell carcinoma of the middle ear 8070 for (String site : HEAD_AND_NECK_2018_TABLE8_SITES) content.put(site, thisTableRows); @@ -1462,27 +1469,27 @@ private MphConstants() { static { Map content = new HashMap<>(); - content.put("8744/3", "8744/3"); - content.put("8730/3", "8730/3"); - content.put("8722/3", "8722/3"); - content.put("8745/3", "8745/3"); - content.put("8771/3", "8771/3"); + content.put("8744", "8744"); + content.put("8730", "8730"); + content.put("8722", "8722"); + content.put("8745", "8745"); + content.put("8771", "8771"); content.put("8742", "8742"); - content.put("8743/3", "8743/3"); - content.put("8780/3", "8780/3"); - content.put("8761/3", "8761/3"); - content.put("8741/3", "8741/3"); - content.put("8723/3", "8723/3"); - content.put("8770/3", "8770/3"); - content.put("8721/3", "8721/3"); + content.put("8743", "8743"); + content.put("8780", "8780"); + content.put("8761", "8761"); + content.put("8741", "8741"); + content.put("8723", "8723"); + content.put("8770", "8770"); + content.put("8721", "8721"); content.put("8772/3", "8772/3"); - content.put("8773/3", "8773/3"); - content.put("8774/3", "8774/3"); + content.put("8773", "8773"); + content.put("8774", "8774"); CUTANEOUS_MELANOMA_2021_TABLE2_SUBTYPES = Collections.unmodifiableMap(content); } - public static final List CUTANEOUS_MELANOMA_2021_TABLE2_ROWS = Collections.unmodifiableList(Arrays.asList("8720", "8744/3", "8730/3", "8722/3", "8745/3", "8771/3", "8742", "8743/3", "8780/3", "8761/3", "8741/3", - "8723/3", "8770/3", "8721/3", "8772/3", "8773/3", "8774/3")); + public static final List CUTANEOUS_MELANOMA_2021_TABLE2_ROWS = Collections.unmodifiableList(Arrays.asList("8720", "8744", "8730", "8722", "8745", "8771", "8742", "8743", "8780", "8761", "8741", + "8723", "8770", "8721", "8772/3", "8773", "8774")); public static final List TESTIS_SITES = Collections.unmodifiableList(Arrays.asList("C620", "C621", "C629")); @@ -1508,11 +1515,11 @@ private MphConstants() { Map prostateRows = new HashMap<>(); prostateRows.put("8140", "8140"); + prostateRows.put("8572", "8140"); + prostateRows.put("8500", "8140"); prostateRows.put("8201", "8140"); prostateRows.put("8260", "8140"); prostateRows.put("8230", "8140"); - prostateRows.put("8500", "8140"); - prostateRows.put("8572", "8140"); prostateRows.put("8480", "8140"); prostateRows.put("8490", "8140"); @@ -1524,19 +1531,25 @@ private MphConstants() { prostateRows.put("8552", "8552"); + prostateRows.put("8154/3", "8154/3"); + + prostateRows.put("8246/3", "8246/3"); + prostateRows.put("8045/3", "8246/3"); + prostateRows.put("8013/3", "8246/3"); + prostateRows.put("8041/3", "8246/3"); + prostateRows.put("8240/3", "8240/3"); - prostateRows.put("8013/3", "8240/3"); - prostateRows.put("8041/3", "8240/3"); + prostateRows.put("8249/3", "8240/3"); prostateRows.put("8800/3", "8800/3"); - prostateRows.put("8935/3", "8800/3"); + prostateRows.put("9120/3", "8800/3"); prostateRows.put("8890/3", "8800/3"); + prostateRows.put("9180/3", "8800/3"); prostateRows.put("8900/3", "8800/3"); - prostateRows.put("9120/3", "8800/3"); + prostateRows.put("8815/3", "8800/3"); + prostateRows.put("8935/3", "8800/3"); prostateRows.put("9040/3", "8800/3"); - prostateRows.put("9180/3", "8800/3"); prostateRows.put("8802/3", "8800/3"); - prostateRows.put("8815/3", "8800/3"); prostateRows.put("8070", "8070"); @@ -1568,9 +1581,17 @@ private MphConstants() { esophagusRows.put("8200", "8200"); esophagusRows.put("8560", "8560"); esophagusRows.put("8936", "8936"); + esophagusRows.put("8154/3", "8154/3"); esophagusRows.put("8430", "8430"); esophagusRows.put("8720/3", "8720/3"); + esophagusRows.put("8246/3", "8246/3"); + esophagusRows.put("8013/3", "8246/3"); + esophagusRows.put("8041/3", "8246/3"); + + esophagusRows.put("8240/3", "8240/3"); + esophagusRows.put("8249/3", "8240/3"); + esophagusRows.put("8070", "8070"); esophagusRows.put("8083", "8070"); esophagusRows.put("8074", "8070"); @@ -1578,12 +1599,9 @@ private MphConstants() { esophagusRows.put("8020/3", "8020/3"); - esophagusRows.put("8240/3", "8240/3"); - esophagusRows.put("8246/3", "8240/3"); - esophagusRows.put("8013/3", "8240/3"); - esophagusRows.put("8041/3", "8240/3"); - esophagusRows.put("8154/3", "8154/3"); + + for (String site : ESOPHAGUS_SITES) content.put(site, esophagusRows); @@ -1885,7 +1903,9 @@ private MphConstants() { peritoneumRows.put("8815/3", "8815/3"); - content.put(PERITONEUM, peritoneumRows); + for (String site : PERITONEUM) + content.put(site, peritoneumRows); + //Table 15 Fallopian Tube Histologies Map fallopianRows = new HashMap<>(); @@ -1916,15 +1936,20 @@ private MphConstants() { uterineCorpusRows.put("8323", "8323"); + uterineCorpusRows.put("8154/3", "8154/3"); + uterineCorpusRows.put("8480", "8480"); uterineCorpusRows.put("8144", "8480"); uterineCorpusRows.put("8246/3", "8246/3"); uterineCorpusRows.put("8013/3", "8246/3"); - uterineCorpusRows.put("8154/3", "8246/3"); uterineCorpusRows.put("8041/3", "8246/3"); + uterineCorpusRows.put("8240/3", "8240/3"); + uterineCorpusRows.put("8249/3", "8240/3"); + uterineCorpusRows.put("8714/3", "8714/3"); + uterineCorpusRows.put("9473/3", "9473/3"); uterineCorpusRows.put("8800/3", "8800/3"); @@ -1946,8 +1971,8 @@ private MphConstants() { uterineCervixRows.put("8140/3", "8140/3"); uterineCervixRows.put("8483/3", "8140/3"); uterineCervixRows.put("8484/3", "8140/3"); - uterineCervixRows.put("8482/3", "8140/3"); uterineCervixRows.put("8310/3", "8140/3"); + uterineCervixRows.put("8482/3", "8140/3"); uterineCervixRows.put("9110/3", "8140/3"); uterineCervixRows.put("8098/3", "8098/3"); @@ -1955,15 +1980,17 @@ private MphConstants() { uterineCervixRows.put("8560/3", "8560/3"); uterineCervixRows.put("8980/3", "8980/3"); uterineCervixRows.put("8380/3", "8380/3"); + uterineCervixRows.put("9064/3", "9064/3"); uterineCervixRows.put("9100/3", "9064/3"); uterineCervixRows.put("9071/3", "9064/3"); + uterineCervixRows.put("8154/3", "8154/3"); + uterineCervixRows.put("8430/3", "8430/3"); uterineCervixRows.put("8246/3", "8246/3"); uterineCervixRows.put("8013/3", "8246/3"); - uterineCervixRows.put("8154/3", "8246/3"); uterineCervixRows.put("8041/3", "8246/3"); uterineCervixRows.put("8240/3", "8240/3"); @@ -2234,7 +2261,7 @@ private MphConstants() { OTHER_SITES_2023_TABLE_ROWS_FOR_SITE = Collections.unmodifiableMap(content); } - public static final List OTHER_SITES_2023_TABLE_2 = Collections.unmodifiableList(Arrays.asList("8045", "8013", "8094", "8552", "8154", "8180", "8244", "8255", "8323", "8340", "8346", "8347", "8560", "8855", "8902", "9081", "9085", "9101")); + public static final List OTHER_SITES_2023_TABLE_2 = Collections.unmodifiableList(Arrays.asList("8045", "8013", "8094", "8552", "8154", "8180", "8244", "8255", "8323", "8340", "8346", "8347", "8560", "8850", "8902", "9085", "9101")); public static final Map> OTHER_SITES_2023_TABLE_SUBTYPES_FOR_SITE; @@ -2251,17 +2278,20 @@ private MphConstants() { prostateSubtypes.put("8480", "8480"); prostateSubtypes.put("8490", "8490"); + prostateSubtypes.put("8045/3", "8045/3"); prostateSubtypes.put("8013/3", "8013/3"); prostateSubtypes.put("8041/3", "8041/3"); + prostateSubtypes.put("8249/3", "8249/3"); - prostateSubtypes.put("8935/3", "8935/3"); + prostateSubtypes.put("9120/3", "9120/3"); prostateSubtypes.put("8890/3", "8890/3"); + prostateSubtypes.put("9180/3", "9180/3"); prostateSubtypes.put("8900/3", "8900/3"); - prostateSubtypes.put("9120/3", "9120/3"); + prostateSubtypes.put("8815/3", "8815/3"); + prostateSubtypes.put("8935/3", "8935/3"); prostateSubtypes.put("9040/3", "9040/3"); - prostateSubtypes.put("9180/3", "9180/3"); prostateSubtypes.put("8802/3", "8802/3"); - prostateSubtypes.put("8815/3", "8815/3"); + content.put(PROSTATE, prostateSubtypes); //Table 4 Testis @@ -2277,12 +2307,13 @@ private MphConstants() { //Table 5 esophagus Map esophagusSubtypes = new HashMap<>(); + esophagusSubtypes.put("8013/3", "8013/3"); + esophagusSubtypes.put("8041/3", "8041/3"); + esophagusSubtypes.put("8249/3", "8249/3"); + esophagusSubtypes.put("8083", "8083"); esophagusSubtypes.put("8074", "8074"); esophagusSubtypes.put("8051", "8051"); - esophagusSubtypes.put("8246/3", "8246/3"); - esophagusSubtypes.put("8013/3", "8013/3"); - esophagusSubtypes.put("8041/3", "8041/3"); for (String site : ESOPHAGUS_SITES) content.put(site, esophagusSubtypes); @@ -2440,7 +2471,8 @@ private MphConstants() { peritoneumSubtypes.put("8806/3", "8806/3"); peritoneumSubtypes.put("8930/3", "8930/3"); peritoneumSubtypes.put("8931/3", "8931/3"); - content.put(PERITONEUM, peritoneumSubtypes); + for (String site : PERITONEUM) + content.put(site, peritoneumSubtypes); //Table 15 Fallopian Tube Histologies Map fallopianSubtypes = new HashMap<>(); @@ -2453,9 +2485,12 @@ private MphConstants() { uterineCorpusSubtypes.put("8570/3", "8570/3"); uterineCorpusSubtypes.put("9111/3", "9111/3"); uterineCorpusSubtypes.put("8144", "8144"); + uterineCorpusSubtypes.put("8013/3", "8013/3"); - uterineCorpusSubtypes.put("8154/3", "8154/3"); uterineCorpusSubtypes.put("8041/3", "8041/3"); + + uterineCorpusSubtypes.put("8249/3", "8249/3"); + uterineCorpusSubtypes.put("8930/3", "8930/3"); uterineCorpusSubtypes.put("8931/3", "8931/3"); uterineCorpusSubtypes.put("8891/3", "8891/3"); @@ -2469,21 +2504,25 @@ private MphConstants() { Map uterineCervixSubtypes = new HashMap<>(); uterineCervixSubtypes.put("8483/3", "8483/3"); uterineCervixSubtypes.put("8484/3", "8484/3"); - uterineCervixSubtypes.put("8482/3", "8482/3"); uterineCervixSubtypes.put("8310/3", "8310/3"); + uterineCervixSubtypes.put("8482/3", "8482/3"); uterineCervixSubtypes.put("9110/3", "9110/3"); + uterineCervixSubtypes.put("9100/3", "9100/3"); uterineCervixSubtypes.put("9071/3", "9071/3"); + uterineCervixSubtypes.put("8013/3", "8013/3"); - uterineCervixSubtypes.put("8154/3", "8154/3"); uterineCervixSubtypes.put("8041/3", "8041/3"); + uterineCervixSubtypes.put("8249/3", "8249/3"); + uterineCervixSubtypes.put("8930/3", "8930/3"); uterineCervixSubtypes.put("8931/3", "8931/3"); uterineCervixSubtypes.put("8891/3", "8891/3"); uterineCervixSubtypes.put("8890/3", "8890/3"); uterineCervixSubtypes.put("8896/3", "8896/3"); uterineCervixSubtypes.put("8805/3", "8805/3"); + uterineCervixSubtypes.put("8085/3", "8085/3"); uterineCervixSubtypes.put("8086/3", "8086/3"); diff --git a/src/main/java/com/imsweb/mph/mpgroups/Mp2018BreastGroup.java b/src/main/java/com/imsweb/mph/mpgroups/Mp2018BreastGroup.java index 195b16a..1022e03 100644 --- a/src/main/java/com/imsweb/mph/mpgroups/Mp2018BreastGroup.java +++ b/src/main/java/com/imsweb/mph/mpgroups/Mp2018BreastGroup.java @@ -52,6 +52,8 @@ public Mp2018BreastGroup() { rule.getNotes().add("When it is unknown/not documented whether the patient had a recurrence, use date of diagnosis to compute the time interval."); rule.getNotes().add( "The physician may state this is a recurrence, meaning the patient had a previous breast tumor and now has another breast tumor. Follow the rules; do not attempt to interpret the physician’s statement."); + rule.getNotes().add( + "When a breast resection was done and a subsequent tumor is identified in the remaining chest wall, muscle, or skin AND there was no residual breast tissue identified in the resected specimen, this is a recurrence and not a new primary. "); _rules.add(rule); // Rule M6 Abstract a single primary when there is inflammatory carcinoma in: @@ -77,11 +79,10 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte rule.setReason("Tumors on both sides (right and left breast) are multiple primaries."); rule.getNotes().add( "Physician statement \"bilateral breast cancer\" should not be interpreted as meaning a single primary. The term is descriptive and not used consistently. The literal definition of bilateral is \"cancer in both breasts\"."); - rule.getNotes().add("It is irrelevant how many tumors are in each breast. Abstract as separate primaries."); rule.getNotes().add("The histologies within each breast may be the same or different."); _rules.add(rule); - /*Suzanne Adams confirms that we are skipping M8 and M9 + /*Suzanne Adams confirmed that we are skipping M8 and M9 // Rule M8 Abstract a single primary when the diagnosis is Paget disease with synchronous underlying in situ or invasive carcinoma NST (duct/ductal). rule = new MphRule(MphConstants.MP_2018_BREAST_GROUP_NAME, "M8") { @@ -125,44 +126,9 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext cont rule.getExamples().add("Paget disease of the nipple with underlying lobular carcinoma are multiple primaries."); _rules.add(rule); */ - //Rule M10 Abstract a single primary when multiple tumors are carcinoma NST/duct and lobular. - //- Both/all tumors may be a mixture of carcinoma NST/duct and lobular 8522 OR - //- One tumor may be duct and another tumor lobular OR - //- One tumor may be mixed duct and lobular 8522, the other tumor either duct or lobular - rule = new MphRule(MphConstants.SOLID_TUMOR_2018_BREAST, "M10") { - @Override - public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { - TempRuleResult result = new TempRuleResult(); - String icd1 = i1.getIcdCode(); - String icd2 = i2.getIcdCode(); - // -One tumor = 8500/2 OR 8500/3 OR 8035/3; other tumor = 8520/2 OR 8519/2 OR 8520/3 - // -One tumor= 8500/2 OR 8500/3 OR 8035/3 OR 8520/2 OR 8519/2 OR 8520/3; other tumor = 8522/3 OR 8522/2 - // -One tumor= 8522; other tumor = 8522 - if ((MphConstants.BREAST_NST_DUCT_CARCINOMA_2018.contains(icd1) && MphConstants.BREAST_LOBULAR_CARCINOMA_2018.contains(icd2)) || - (MphConstants.BREAST_NST_DUCT_CARCINOMA_2018.contains(icd2) && MphConstants.BREAST_LOBULAR_CARCINOMA_2018.contains(icd1)) || - (MphConstants.BREAST_DUCT_2018.contains(icd1) && MphConstants.BREAST_LOBULAR_2018.contains(icd2)) || - (MphConstants.BREAST_DUCT_2018.contains(icd2) && MphConstants.BREAST_LOBULAR_2018.contains(icd1)) || - (MphConstants.BREAST_LOBULAR_2018.contains(icd1) && MphConstants.BREAST_LOBULAR_2018.contains(icd2))) - result.setFinalResult(MphUtils.MpResult.SINGLE_PRIMARY); - return result; - } - }; - rule.setQuestion("Is this a carcinoma NST/duct and lobular carcinoma?"); - rule.setReason("Carcinoma NST/duct and lobular carcinoma is a single primary."); - rule.getNotes().add("Tumors must be in the same breast."); - rule.getNotes().add("Carcinoma NST/duct includes:"); - rule.getNotes().add(" - DCIS 8500/2"); - rule.getNotes().add(" - Carcinoma NST 8500/3"); - rule.getNotes().add(" - Carcinoma with osteoclastic-like stromal giant cells 8035/3 (subtype/variant of carcinoma NST)"); - rule.getNotes().add("Lobular carcinoma includes:"); - rule.getNotes().add(" - In situ lobular carcinoma 8520/2"); - rule.getNotes().add(" - In situ pleomorphic lobular carcinoma 8519/2"); - rule.getNotes().add(" - Invasive lobular carcinoma 8520/3"); - rule.getNotes().add("One or more tumors with combination duct and lobular histology 8522 AND a separate tumor with any other histology in Table 3 are multiple primaries."); - rule.getExamples().add("Two tumors right breast. One tumor is invasive mixed duct and lobular 8522/3 and the second tumor is tubular 8211/3. Abstract two primaries: 8522/3 and 8211/3."); - _rules.add(rule); - //Rule M11 - Abstract a single primaryi when a ductal carcinoma occurs after a combination code in the same breast. See the + + //Rule M10 - Abstract a single primaryi when a ductal carcinoma occurs after a combination code in the same breast. See the // following list: //- DCIS following a diagnosis of: // - DCIS + lobular carcinoma in situ 8522/2 OR @@ -173,7 +139,7 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte // - Invasive duct + invasive lobular 8522/3 OR // - Invasive duct + invasive Paget 8541/3 OR // - Invasive duct + other invasive carcinoma 8523/3 - rule = new MphRule(MphConstants.SOLID_TUMOR_2018_BREAST, "M11") { + rule = new MphRule(MphConstants.SOLID_TUMOR_2018_BREAST, "M10") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { TempRuleResult result = new TempRuleResult(); @@ -216,8 +182,8 @@ else if (MphConstants.COMPARE_DX_EQUAL == latestDx || (MphConstants.COMPARE_DX_F " - Invasive duct + other invasive carcinoma 8523/3"); _rules.add(rule); - // Rule M12 Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 3 of Table 3 in the Equivalent Terms and Definitions. Timing is irrelevant. - rule = new MphRule(MphConstants.SOLID_TUMOR_2018_BREAST, "M12") { + // Rule M11 AAbstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 2 of Table 3 in the Site-group Instructions. Timing is irrelevant. + rule = new MphRule(MphConstants.SOLID_TUMOR_2018_BREAST, "M11") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { TempRuleResult result = new TempRuleResult(); @@ -232,8 +198,8 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte return result; } }; - rule.setQuestion("Are separate/non-contiguous tumors two or more different subtypes/variants in Column 3, Table 3 in the Equivalent Terms and Definitions?"); - rule.setReason("Separate/non-contiguous tumors that are two or more different subtypes/variants in Column 3, Table 3 in the Equivalent Terms and Definitions are multiple primaries."); + rule.setQuestion("Are separate/non-contiguous tumors two or more different subtypes/variants in Column 2, Table 3 in the Site-group Instructions?"); + rule.setReason("Separate/non-contiguous tumors that are two or more different subtypes/variants in Column 2 of Table 3 in the Site-group Instructions are multiple primaries."); rule.getNotes().add("The tumors may be subtypes/variants of the same or different NOS histologies."); rule.getNotes().add( " - Same NOS: Encapsulated papillary carcinoma with invasion 8504/3 and solid papillary carcinoma with invasion 8509/3 are both subtypes of invasive papillary carcinoma 8503/3 but are distinctly different histologies. Abstract multiple primaries."); @@ -241,8 +207,8 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte " - Different NOS: Encapsulated papillary carcinoma 8504/2 is a subtype/variant of in situ papillary carcinoma 8503/2. Pleomorphic lobular carcinoma in situ 8519/2 is a subtype/variant of lobular carcinoma in situ 8520/2. They are distinctly different histologies. Abstract multiple primaries."); _rules.add(rule); - // Rule M13 Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 3 in the Equivalent Terms and Definitions. - rule = new MphRule(MphConstants.SOLID_TUMOR_2018_BREAST, "M13") { + // Rule M12 Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 3 in the Site-group Instructions. + rule = new MphRule(MphConstants.SOLID_TUMOR_2018_BREAST, "M12") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { TempRuleResult result = new TempRuleResult(); @@ -264,16 +230,16 @@ else if (MphConstants.DATE_VERIFY_WITHIN == sixtyDaysApart) return result; } }; - rule.setQuestion("Are synchronous, separate/non-contiguous tumors on the same row in Table 3 in the Equivalent Terms and Definitions?"); - rule.setReason("Synchronous, separate/non-contiguous tumors on the same row in Table 3 in the Equivalent Terms and Definitions is a single primary."); + rule.setQuestion("Are synchronous, separate/non-contiguous tumors on the same row in Table 3 in the Site-group Instructions?"); + rule.setReason("Synchronous, separate/non-contiguous tumors on the same row in Table 3 in the Site-group Instructions is a single primary."); rule.getNotes().add("The same row means the tumors are:"); rule.getNotes().add(" - The same histology (same four-digit ICD-O code) OR"); rule.getNotes().add(" - One is the preferred term (column 1) and the other is a synonym for the preferred term (column 2) OR"); rule.getNotes().add(" - A NOS (column 1/column 2) and the other is a subtype/variant of that NOS (column 3)"); _rules.add(rule); - // Rule M14 Abstract multiple primaries when separate/non-contiguous tumors are on different rows in Table 3 in the Equivalent Terms and Definitions or a combination code in Table 2 and a code from Table 3 - rule = new MphRule(MphConstants.SOLID_TUMOR_2018_BREAST, "M14") { + // Rule M13 Abstract multiple primaries when separate/non-contiguous tumors are on different rows in Table 3 in the Site-group Instructions or a combination code in Table 2 and a code from Table 3 + rule = new MphRule(MphConstants.SOLID_TUMOR_2018_BREAST, "M13") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { TempRuleResult result = new TempRuleResult(); @@ -299,23 +265,23 @@ else if (!row1.equals(row2)) return result; } }; - rule.setQuestion("Are separate/non-contiguous tumors on different rows in Table 3 in the Equivalent Terms and Definitions or a combination code in Table 2 and a code from Table 3?"); + rule.setQuestion("Are separate/non-contiguous tumors on different rows in Table 3 in the Site-group Instructions or a combination code in Table 2 and a code from Table 3?"); rule.setReason( - "Separate/non-contiguous tumors on different rows in Table 3 or a combination code in Table 2 and a code from Table 3 in the Equivalent Terms and Definitions are multiple primaries."); + "Separate/non-contiguous tumors on different rows in Table 3 or a combination code in Table 2 and a code from Table 3 in the Site-group Instructions are multiple primaries."); rule.getNotes().add("Timing is irrelevant. Tumors may be synchronous or non-synchronous."); rule.getNotes().add("Each row in the table is a distinctly different histology."); rule.getExamples().add("Paget disease of the nipple with underlying lobular are multiple primaries. Paget and lobular are on different rows in Table 3."); _rules.add(rule); - // Rule M15 Abstract a single primary (the invasive) when an in situ tumor is diagnosed after an invasive tumor in the same breast. - rule = new MpRuleInsituAfterInvasiveSameSide(MphConstants.SOLID_TUMOR_2018_BREAST, "M15"); + // Rule M14 Abstract a single primary (the invasive) when an in situ tumor is diagnosed after an invasive tumor in the same breast. + rule = new MpRuleInsituAfterInvasiveSameSide(MphConstants.SOLID_TUMOR_2018_BREAST, "M14"); rule.getNotes().add("Once the patient has an invasive tumor, the in situ is recorded as a recurrence for those registrars who collect recurrence data."); rule.getNotes().add("The rules are hierarchical. Only use this rule when none of the previous rules apply."); rule.getNotes().add("The tumors may be a NOS and a subtype/variant of that NOS."); _rules.add(rule); - // Rule M16 Abstract a single primary (the invasive) when an invasive tumor is diagnosed less than or equal to 60 days after an in situ tumor in the same breast. - rule = new MpRuleInvasiveAfterInsituLessThan60DaysSameSide(MphConstants.SOLID_TUMOR_2018_BREAST, "M16"); + // Rule M15 Abstract a single primary (the invasive) when an invasive tumor is diagnosed less than or equal to 60 days after an in situ tumor in the same breast. + rule = new MpRuleInvasiveAfterInsituLessThan60DaysSameSide(MphConstants.SOLID_TUMOR_2018_BREAST, "M15"); rule.getNotes().add("The rules are hierarchical. Only use this rule when none of the previous rules apply."); rule.getNotes().add("The tumors may be a NOS and a subtype/variant of that NOS."); rule.getNotes().add("When the case has been abstracted, change behavior code on original abstract from /2 to /3."); @@ -326,8 +292,8 @@ else if (!row1.equals(row2)) rule.getNotes().add("See the COC and SEER manuals for instructions on coding other data items such as Date of Diagnosis, Accession Year and Sequence Number."); _rules.add(rule); - // Rule M17 Abstract multiple primaries when an invasive tumor occurs more than 60 days after an in situ tumor in the same breast. - rule = new MpRuleInvasiveAfterInsituGreaterThan60Days(MphConstants.SOLID_TUMOR_2018_BREAST, "M17"); + // Rule M16 Abstract multiple primaries when an invasive tumor occurs more than 60 days after an in situ tumor in the same breast. + rule = new MpRuleInvasiveAfterInsituGreaterThan60Days(MphConstants.SOLID_TUMOR_2018_BREAST, "M16"); rule.getNotes().add("The rules are hierarchical. Only use this rule when none of the previous rules apply."); rule.getNotes().add("Abstract both the invasive and in situ tumors."); rule.getNotes().add("Abstract as multiple primaries even if physician states the invasive tumor is disease recurrence or progression."); @@ -335,8 +301,8 @@ else if (!row1.equals(row2)) "This rule is based on long-term epidemiologic studies of recurrence intervals. The specialty medical experts (SMEs) reviewed and approved these rules. Many of the SMEs were also authors, co-authors, or editors of the AJCC Staging Manual."); _rules.add(rule); - // Rule M18 Abstract a single primary when none of the previous rules apply. - rule = new MpRuleNoCriteriaSatisfied(MphConstants.SOLID_TUMOR_2018_BREAST, "M18"); + // Rule M17 Abstract a single primary when none of the previous rules apply. + rule = new MpRuleNoCriteriaSatisfied(MphConstants.SOLID_TUMOR_2018_BREAST, "M17"); rule.getNotes().add("Use this rule as a last resort. Please confirm that you have not overlooked an applicable rule."); rule.getExamples().add( "One tumor is invasive carcinoma NST/ductal 8500/3 and a separate non-contiguous tumor in the same breast is DCIS 8500/2. Abstract a single primary: invasive carcinoma NST/ductal 8500/3."); diff --git a/src/main/java/com/imsweb/mph/mpgroups/Mp2018ColonGroup.java b/src/main/java/com/imsweb/mph/mpgroups/Mp2018ColonGroup.java index 89041d0..d3bca1e 100644 --- a/src/main/java/com/imsweb/mph/mpgroups/Mp2018ColonGroup.java +++ b/src/main/java/com/imsweb/mph/mpgroups/Mp2018ColonGroup.java @@ -72,7 +72,7 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte rule.getNotes().add("This rule does not apply to a single overlapping malignancy of colon and rectum."); _rules.add(rule); - // Rule M5 Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 3, Table 1 in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M5 Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 2, Table 1 in the Site-group Instructions. Timing is irrelevant. rule = new MphRule(MphConstants.SOLID_TUMOR_2018_COLON, "M5") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -88,8 +88,8 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte return result; } }; - rule.setQuestion("Are separate/non-contiguous tumors two or more different subtypes/variants in Column 3, Table 1 in the Equivalent Terms and Definitions?"); - rule.setReason("Separate/non-contiguous tumors that are two or more different subtypes/variants in Column 3, Table 1 in the Equivalent Terms and Definitions are multiple primaries."); + rule.setQuestion("Are separate/non-contiguous tumors two or more different subtypes/variants in Column 2, Table 1 in the Site-group Instructions?"); + rule.setReason("Separate/non-contiguous tumors that are two or more different subtypes/variants in Column 2, Table 1 in the Site-group Instructions are multiple primaries."); rule.getNotes().add("The tumors may be subtypes/variants of the same or different NOS histologies."); rule.getNotes().add( " - Same NOS: Medullary carcinoma NOS 8510/3 and tubulopapillary adenocarcinoma 8263/3 are both subtypes of adenocarcinoma NOS 8140/3 but are distinctly different histologies. Abstract multiple primaries."); @@ -97,10 +97,10 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte " - Different NOS: Goblet cell carcinoid 8243/3 is a subtype of mixed adenoneuroendocrine carcinoma 8244/3; somatostatin-producing NET 8156/3 is a subtype of neuroendocrine tumor Grade 1 (G1) 8240/3. They are distinctly different histologies. Abstract multiple primaries."); _rules.add(rule); - // Rule M6 Abstract multiple primaries when separate/non-contiguous tumors are on different rows in Table 1 in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M6 Abstract multiple primaries when separate/non-contiguous tumors are on different rows in Table 1 in the Site-group Instructions. Timing is irrelevant. rule = new MpRuleDifferentRowInTable(MphConstants.SOLID_TUMOR_2018_COLON, "M6", MphConstants.COLON_2018_TABLE1_ROWS); - rule.setQuestion("Are separate/non-contiguous tumors on different rows in Table 1 in the Equivalent Terms and Definitions?"); - rule.setReason("Separate/non-contiguous tumors that are on different rows in Table 1 in the Equivalent Terms and Definitions are multiple primaries."); + rule.setQuestion("Are separate/non-contiguous tumors on different rows in Table 1 in the Site-group Instructions?"); + rule.setReason("Separate/non-contiguous tumors that are on different rows in Table 1 in the Site-group Instructions are multiple primaries."); rule.getNotes().add("Each row in the table is a distinctly different histology."); _rules.add(rule); @@ -215,10 +215,10 @@ else if (!i1.getPrimarySite().equals(i2.getPrimarySite())) "The physician may state this is a recurrence, meaning the patient had a previous colon tumor and now has another colon tumor. Follow the rules; do not attempt to interpret the physician’s statement."); _rules.add(rule); - // Rule M11 Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 1 in the Equivalent Terms and Definitions. + // Rule M11 Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 1 in the Site-group Instructions. rule = new MpRuleSameRowInTable(MphConstants.SOLID_TUMOR_2018_COLON, "M11", MphConstants.COLON_2018_TABLE1_ROWS, true); - rule.setQuestion("Are synchronous, separate/non-contiguous tumors on the same in Table 1 in the Equivalent Terms and Definitions?"); - rule.setReason("Synchronous, separate/non-contiguous tumors that are on the same row in Table 1 in the Equivalent Terms and Definitions are a single primary."); + rule.setQuestion("Are synchronous, separate/non-contiguous tumors on the same in Table 1 in the Site-group Instructions?"); + rule.setReason("Synchronous, separate/non-contiguous tumors that are on the same row in Table 1 in the Site-group Instructions are a single primary."); rule.getNotes().add("The same row means the tumors are:"); rule.getNotes().add(" - The same histology (same four-digit ICD-O code) OR"); rule.getNotes().add(" - One is the preferred term (column 1) and the other is a synonym for the preferred term (column 2) OR"); @@ -230,7 +230,7 @@ else if (!i1.getPrimarySite().equals(i2.getPrimarySite())) // Rule M12 Abstract a single primary (the invasive) when an in situ tumor is diagnosed after an invasive tumor. rule = new MpRuleInsituAfterInvasive(MphConstants.SOLID_TUMOR_2018_COLON, "M12"); rule.getNotes().add("The rules are hierarchical. Only use this rule when none of the previous rules apply."); - rule.getNotes().add("The tumors may be a NOS and a subtype/variant of that NOS. See Table 1 in the Equivalent Terms and Definitions for listings of NOS and subtype/variants."); + rule.getNotes().add("The tumors may be a NOS and a subtype/variant of that NOS. See Table 1 in the Site-group Instructions for listings of NOS and subtype/variants."); rule.getNotes().add("The in situ is recorded as a recurrence for those registrars who collect recurrence data."); _rules.add(rule); diff --git a/src/main/java/com/imsweb/mph/mpgroups/Mp2018HeadAndNeckGroup.java b/src/main/java/com/imsweb/mph/mpgroups/Mp2018HeadAndNeckGroup.java index cf824e1..9f4fc2a 100644 --- a/src/main/java/com/imsweb/mph/mpgroups/Mp2018HeadAndNeckGroup.java +++ b/src/main/java/com/imsweb/mph/mpgroups/Mp2018HeadAndNeckGroup.java @@ -148,7 +148,7 @@ else if (GroupUtility.areOppositeSides(i1.getLaterality(), i2.getLaterality())) "The physician may state this is a recurrence, meaning the patient had a previous head and neck tumor and now has another head and neck tumor. Follow the rules; do not attempt to interpret the physician’s statement."); _rules.add(rule); - // Rule M7 Abstract multiple primaries when separate, non-contiguous tumors are two or more different subtypes/variants in Column 3 of the appropriate site table (Tables 1-9) in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M7 Abstract multiple primaries when separate, non-contiguous tumors are two or more different subtypes/variants in Column 2 of the appropriate site table (Tables 1-9) in the Site-group Instructions. Timing is irrelevant. rule = new MphRule(MphConstants.SOLID_TUMOR_2018_HEAD_AND_NECK, "M7") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -206,9 +206,9 @@ else if (!map1.equals(map2)) } }; rule.setQuestion( - "Are separate, non-contiguous tumors different subtypes/variants in Column 3 of the appropriate site table (Tables 1-9) in the Equivalent Terms and Definitions?"); + "Are separate, non-contiguous tumors different subtypes/variants in Column 2 of the appropriate site table (Tables 1-9) in the Site-group Instructions?"); rule.setReason( - "Separate, non-contiguous tumors are different subtypes/variants in Column 3 of the appropriate site table (Tables 1-9) in the Equivalent Terms and Definitions are multiple primaries."); + "Separate, non-contiguous tumors are different subtypes/variants in Column 2 of the appropriate site table (Tables 1-9) in the Site-group Instructions are multiple primaries."); rule.getNotes().add("The tumors may be subtypes/variants of the same or different NOS histologies."); rule.getNotes().add( " - Same NOS: Alveolar rhabdomyosarcoma 8920/3 and embryonal rhabdomyosarcoma 8910/3 are both subtypes of rhabdomyosarcoma 8900/3 but are distinctly different histologies. Abstract multiple primaries."); @@ -216,7 +216,7 @@ else if (!map1.equals(map2)) " - Different NOS: Colloid-type adenocarcinoma 8144 is a subtype of adenocarcinoma NOS 8140; Sarcomatoid carcinoma 8074 is a subtype of squamous cell carcinoma 8070. They are distinctly different histologies. Abstract multiple primaries."); _rules.add(rule); - // Rule M8 Abstract multiple primaries when separate, non-contiguous tumors are on different rows in the appropriate site table (Tables 1-9) in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M8 Abstract multiple primaries when separate, non-contiguous tumors are on different rows in the appropriate site table (Tables 1-9) in the Site-group Instructions. Timing is irrelevant. rule = new MphRule(MphConstants.SOLID_TUMOR_2018_HEAD_AND_NECK, "M8") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -245,15 +245,15 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte return result; } }; - rule.setQuestion("Are separate, non-contiguous tumors on different rows in the appropriate site table (Tables 1-9) in the Equivalent Terms and Definitions?"); - rule.setReason("Separate, non-contiguous tumors on different rows in the appropriate site table (Tables 1-9) in the Equivalent Terms and Definitions are multiple primaries."); + rule.setQuestion("Are separate, non-contiguous tumors on different rows in the appropriate site table (Tables 1-9) in the Site-group Instructions?"); + rule.setReason("Separate, non-contiguous tumors on different rows in the appropriate site table (Tables 1-9) in the Site-group Instructions are multiple primaries."); rule.getNotes().add("Each row in the table is a distinctly different histology."); _rules.add(rule); // Rule M9 Abstract a single primary (the invasive) when an in situ tumor is diagnosed after an invasive tumor in the same primary site. rule = new MpRuleInsituAfterInvasive(MphConstants.SOLID_TUMOR_2018_HEAD_AND_NECK, "M9"); rule.getNotes().add(HIERARCHICAL_RULES); - rule.getNotes().add("The tumors may be a NOS and a subtype/variant of that NOS. See Tables 1-9 in the Equivalent Terms and Definitions for listings of NOS and subtype/variants."); + rule.getNotes().add("The tumors may be a NOS and a subtype/variant of that NOS. See Tables 1-9 in the Site-group Instructions for listings of NOS and subtype/variants."); rule.getNotes().add("The in situ is recorded as a recurrence for those registrars who collect recurrence data."); _rules.add(rule); @@ -277,7 +277,7 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte "This rule is based on long-term epidemiologic studies of recurrence intervals. The specialty medical experts (SMEs) reviewed and approved these rules. Many of the SMEs were also authors, co-authors, or editors of the AJCC Staging Manual."); _rules.add(rule); - // Rule M12 Abstract a single primary when separate/non-contiguous tumors in the same primary site are on the same row in the appropriate site table (Tables 1-9) in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M12 Abstract a single primary when separate/non-contiguous tumors in the same primary site are on the same row in the appropriate site table (Tables 1-9) in the Site-group Instructions. Timing is irrelevant. rule = new MphRule(MphConstants.SOLID_TUMOR_2018_HEAD_AND_NECK, "M12") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -309,9 +309,9 @@ else if (row1.contains(row2) || row2.contains(row1)) return result; } }; - rule.setQuestion("Are separate, non-contiguous tumors in the same primary site and on the same row in the appropriate site table (Tables 1-9) in the Equivalent Terms and Definitions?"); + rule.setQuestion("Are separate, non-contiguous tumors in the same primary site and on the same row in the appropriate site table (Tables 1-9) in the Site-group Instructions?"); rule.setReason( - "Separate, non-contiguous tumors in the same primary site and on the same row in the appropriate site table (Tables 1-9) in the Equivalent Terms and Definitions are a single primary."); + "Separate, non-contiguous tumors in the same primary site and on the same row in the appropriate site table (Tables 1-9) in the Site-group Instructions are a single primary."); rule.getNotes().add("The same row means the tumors are:"); rule.getNotes().add(" - The same histology (same four-digit ICD-O code) OR"); rule.getNotes().add(" - One is the preferred term (column 1) and the other is a synonym for the preferred term (column 2) OR"); diff --git a/src/main/java/com/imsweb/mph/mpgroups/Mp2018KidneyGroup.java b/src/main/java/com/imsweb/mph/mpgroups/Mp2018KidneyGroup.java index a987baf..d09683b 100644 --- a/src/main/java/com/imsweb/mph/mpgroups/Mp2018KidneyGroup.java +++ b/src/main/java/com/imsweb/mph/mpgroups/Mp2018KidneyGroup.java @@ -81,7 +81,7 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte rule.getNotes().add("The location and histology of the subsequent tumor is irrelevant. Kidney tumors that occur more than 3 years apart are always multiple primaries."); _rules.add(rule); - // Rule M7 Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 3, Table 1 in the Equivalent Terms and Definitions. Tumors must be in same kidney and timing is irrelevant. + // Rule M7 Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 2, Table 1 in the Site-group Instructions. Tumors must be in same kidney and timing is irrelevant. rule = new MphRule(MphConstants.SOLID_TUMOR_2018_KIDNEY, "M7") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -98,9 +98,9 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte } }; rule.setQuestion( - "Are separate/non-contiguous tumors two or more different subtypes/variants in Column 3, Table 1 in the Equivalent Terms and Definitions (Tumors must be in the same kidney)?"); + "Are separate/non-contiguous tumors two or more different subtypes/variants in Column 2, Table 1 in the Site-group Instructions (Tumors must be in the same kidney)?"); rule.setReason( - "Separate/non-contiguous tumors that are two or more different subtypes/variants in Column 3, Table 1 in the Equivalent Terms and Definitions (Tumors must be in the same kidney), are multiple primaries."); + "Separate/non-contiguous tumors that are two or more different subtypes/variants in Column 2, Table 1 in the Site-group Instructions (Tumors must be in the same kidney), are multiple primaries."); rule.getNotes().add("Note: The tumors may be subtypes/variants of the same or different NOS histologies."); rule.getNotes().add( "- Same NOS: Clear cell renal cell carcinoma (ccRCC) 8310/3 and papillary renal cell carcinoma 8260/3 are both subtypes of renal cell carcinoma NOS 8312/3 but are distinctly different histologies. Abstract multiple primaries."); @@ -108,7 +108,7 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte "- Different NOS: Pleomorphic rhabdomyosarcoma 8901/3 is a subtype/variant of rhabdomyosarcoma 8900/3; large cell neuroendocrine carcinoma 8013/3 is a subtype of small cell neuroendocrine tumor 8041/3. They are distinctly different histologies. Abstract multiple primaries."); _rules.add(rule); - // Rule M8 Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 1 in the Equivalent Terms and Definitions. Tumors must be in the same kidney. + // Rule M8 Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 1 in the Site-group Instructions. Tumors must be in the same kidney. rule = new MphRule(MphConstants.SOLID_TUMOR_2018_KIDNEY, "M8") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -158,19 +158,19 @@ else if (GroupUtility.areSameSide(i1.getLaterality(), i2.getLaterality())) { return result; } }; - rule.setQuestion("Are synchronous, separate/non-contiguous tumors on the same row in Table 1 in the Equivalent Terms and Definitions (Tumors must be in the same kidney)?"); + rule.setQuestion("Are synchronous, separate/non-contiguous tumors on the same row in Table 1 in the Site-group Instructions (Tumors must be in the same kidney)?"); rule.setReason( - "Synchronous, separate/non-contiguous tumors that are on the same row in Table 1 in the Equivalent Terms and Definitions (Tumors must be in the same kidney), are a single primary."); + "Synchronous, separate/non-contiguous tumors that are on the same row in Table 1 in the Site-group Instructions (Tumors must be in the same kidney), are a single primary."); rule.getNotes().add("The same row means the tumors are:"); rule.getNotes().add(" - The same histology (same four-digit ICD-O code) OR"); rule.getNotes().add(" - One is the preferred term (column 1) and the other is a synonym for the preferred term (column 2) OR"); rule.getNotes().add(" - A NOS (column 1/column 2) and the other is a subtype/variant of that NOS (column 3)"); _rules.add(rule); - // Rule M9 Abstract multiple primaries when separate/non-contiguous tumors are on different rows in Table 1 in the Equivalent Terms and Definitions. Tumors must be in the same kidney and timing is irrelevant. + // Rule M9 Abstract multiple primaries when separate/non-contiguous tumors are on different rows in Table 1 in the Site-group Instructions. Tumors must be in the same kidney and timing is irrelevant. rule = new MpRuleDifferentRowInTable(MphConstants.SOLID_TUMOR_2018_KIDNEY, "M9", MphConstants.KIDNEY_2018_TABLE1_ROWS); - rule.setQuestion("Are separate/non-contiguous tumors on different rows in Table 1 in the Equivalent Terms and Definitions (Tumors must be in the same kidney)?"); - rule.setReason("Separate/non-contiguous tumors that are on different rows in Table 1 in the Equivalent Terms and Definitions (Tumors must be in the same kidney), are multiple primaries."); + rule.setQuestion("Are separate/non-contiguous tumors on different rows in Table 1 in the Site-group Instructions (Tumors must be in the same kidney)?"); + rule.setReason("Separate/non-contiguous tumors that are on different rows in Table 1 in the Site-group Instructions (Tumors must be in the same kidney), are multiple primaries."); rule.getNotes().add("Each row in the table is a distinctly different histology."); _rules.add(rule); @@ -179,7 +179,7 @@ else if (GroupUtility.areSameSide(i1.getLaterality(), i2.getLaterality())) { rule.setQuestion("Is there an in situ tumor following an invasive tumor and tumors are in the same kidney?"); rule.setReason("An in situ tumor diagnosed following an invasive tumor and tumors are in the same kidney is a single primary."); rule.getNotes().add("The rules are hierarchical. Only use this rule when none of the previous rules apply."); - rule.getNotes().add("The tumors may be a NOS and a subtype/variant of that NOS. See Table 1 in the Equivalent Terms and Definitions for listings of NOS and subtype/variants."); + rule.getNotes().add("The tumors may be a NOS and a subtype/variant of that NOS. See Table 1 in the Site-group Instructions for listings of NOS and subtype/variants."); rule.getNotes().add("Once the patient has an invasive tumor, the in situ is recorded as a recurrence for those registrars who collect recurrence data."); _rules.add(rule); diff --git a/src/main/java/com/imsweb/mph/mpgroups/Mp2018LungGroup.java b/src/main/java/com/imsweb/mph/mpgroups/Mp2018LungGroup.java index 912e33e..2bbb760 100644 --- a/src/main/java/com/imsweb/mph/mpgroups/Mp2018LungGroup.java +++ b/src/main/java/com/imsweb/mph/mpgroups/Mp2018LungGroup.java @@ -77,7 +77,7 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte rule.getNotes().add("It is irrelevant whether the tumors are in the ipsilateral (same) lung or are bilateral (both lungs)."); _rules.add(rule); - // Rule M6 Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 3, Table 3 in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M6 Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 2, Table 3 in the Site-group Instructions. Timing is irrelevant. rule = new MphRule(MphConstants.SOLID_TUMOR_2018_LUNG, "M6") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -93,8 +93,8 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte return result; } }; - rule.setQuestion("Are separate/non-contiguous tumors two or more different subtypes/variants in Column 3, Table 3 in the Equivalent Terms and Definitions?"); - rule.setReason("Separate/non-contiguous tumors that are two or more different subtypes/variants in Column 3, Table 3 in the Equivalent Terms and Definitions are multiple primaries."); + rule.setQuestion("Are separate/non-contiguous tumors two or more different subtypes/variants in Column 2, Table 3 in the Site-group Instructions?"); + rule.setReason("Separate/non-contiguous tumors that are two or more different subtypes/variants in Column 2, Table 3 in the Site-group Instructions are multiple primaries."); rule.getNotes().add("The tumors may be subtypes/variants of the same or different NOS histologies."); rule.getNotes().add( " - Same NOS: Colloid adenocarcinoma 8480/3 and lepidic adenocarcinoma 8250/3 are both subtypes of adenocarcinoma NOS 8140/3 but are distinctly different histologies. Abstract multiple primaries."); @@ -102,7 +102,7 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte " - Different NOS: Keratinizing squamous cell carcinoma 8071/3 is a subtype of squamous cell carcinoma NOS 8070; Lepidic adenocarcinoma 8520/3 is a subtype of adenocarcinoma 8140/3. They are distinctly different histologies. Abstract multiple primaries."); _rules.add(rule); - // Rule M7 Abstract a single primary when synchronous, separate/non-contiguous tumors in the same lung are on the same row in Table 3 in the Equivalent Terms and Definitions. + // Rule M7 Abstract a single primary when synchronous, separate/non-contiguous tumors in the same lung are on the same row in Table 3 in the Site-group Instructions. rule = new MphRule(MphConstants.SOLID_TUMOR_2018_LUNG, "M7") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -144,8 +144,8 @@ else if (GroupUtility.areSameSide(i1.getLaterality(), i2.getLaterality())) return result; } }; - rule.setQuestion("Are synchronous, separate/non-contiguous tumors in the same lung on the same row in Table 3 in the Equivalent Terms and Definitions?"); - rule.setReason("Synchronous separate/non-contiguous tumors in the same lung on the same row in Table 3 in the Equivalent Terms and Definitions are a single primary."); + rule.setQuestion("Are synchronous, separate/non-contiguous tumors in the same lung on the same row in Table 3 in the Site-group Instructions?"); + rule.setReason("Synchronous separate/non-contiguous tumors in the same lung on the same row in Table 3 in the Site-group Instructions are a single primary."); rule.getNotes().add("Tumors must be in the same lung."); rule.getNotes().add("The same row means the tumors are:"); rule.getNotes().add(" - The same histology (same four-digit ICD-O code) OR"); @@ -153,7 +153,7 @@ else if (GroupUtility.areSameSide(i1.getLaterality(), i2.getLaterality())) rule.getNotes().add(" - A NOS (column 1/column 2) and the other is a subtype/variant of that NOS (column 3)"); _rules.add(rule); - // Rule M8 Abstract multiple primaries when separate/non-contiguous tumors are on different rows in Table 3 in the Equivalent Terms and Definitions or a combination code in Table 2 and a code from Table 3 + // Rule M8 Abstract multiple primaries when separate/non-contiguous tumors are on different rows in Table 3 in the Site-group Instructions or a combination code in Table 2 and a code from Table 3 rule = new MphRule(MphConstants.SOLID_TUMOR_2018_LUNG, "M8") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -180,9 +180,9 @@ else if (!row1.equals(row2)) return result; } }; - rule.setQuestion("Are separate/non-contiguous tumors on different rows in Table 3 in the Equivalent Terms and Definitions or a combination code in Table 2 and a code from Table 3?"); + rule.setQuestion("Are separate/non-contiguous tumors on different rows in Table 3 in the Site-group Instructions or a combination code in Table 2 and a code from Table 3?"); rule.setReason( - "Separate/non-contiguous tumors on different rows in Table 3 in the Equivalent Terms and Definitions or a combination code in Table 2 and a code from Table 3 are multiple primaries."); + "Separate/non-contiguous tumors on different rows in Table 3 in the Site-group Instructions or a combination code in Table 2 and a code from Table 3 are multiple primaries."); rule.getNotes().add("Each row in the table is a distinctly different histology."); _rules.add(rule); @@ -234,7 +234,7 @@ else if (MphConstants.BOTH.equals(lat1) || MphConstants.BOTH.equals(lat2) || Gro rule.setReason("Simultaneous multiple tumors in both lungs, the same lung, or opposite lungs is a single primary."); rule.getNotes().add("Tumors may be combinations of:"); rule.getNotes().add(" - In situ and invasive OR"); - rule.getNotes().add(" - NOS and subtype/variant (See Table 3 in the Equivalent Terms and Definitions)"); + rule.getNotes().add(" - NOS and subtype/variant (See Table 3 in the Site-group Instructions)"); rule.getNotes().add("Examples of NOS and subtypes/variants include:"); rule.getNotes().add(" - Adenocarcinoma 8140 and a subtype/variant of adenocarcinoma"); rule.getNotes().add(" - Squamous cell carcinoma 8070 and a subtype/variant of squamous cell carcinoma"); @@ -253,7 +253,7 @@ else if (MphConstants.BOTH.equals(lat1) || MphConstants.BOTH.equals(lat2) || Gro rule.setQuestion("Is there an in situ tumor following an invasive tumor in the same lung?"); rule.setReason("An in situ tumor diagnosed following an invasive tumor in the same lung is a single primary."); rule.getNotes().add("The rules are hierarchical. Only use this rule when none of the previous rules apply."); - rule.getNotes().add("The tumors may be a NOS and a subtype/variant of that NOS. See Table 3 in the Equivalent Terms and Definitions for listings of NOS and subtype/variants."); + rule.getNotes().add("The tumors may be a NOS and a subtype/variant of that NOS. See Table 3 in the Site-group Instructions for listings of NOS and subtype/variants."); rule.getNotes().add("The in situ is recorded as a recurrence for those registrars who collect recurrence data."); _rules.add(rule); diff --git a/src/main/java/com/imsweb/mph/mpgroups/Mp2018MalignantCNSAndPeripheralNervesGroup.java b/src/main/java/com/imsweb/mph/mpgroups/Mp2018MalignantCNSAndPeripheralNervesGroup.java index 7e8e37b..374bca5 100644 --- a/src/main/java/com/imsweb/mph/mpgroups/Mp2018MalignantCNSAndPeripheralNervesGroup.java +++ b/src/main/java/com/imsweb/mph/mpgroups/Mp2018MalignantCNSAndPeripheralNervesGroup.java @@ -44,7 +44,7 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte } }; rule.getNotes().add("The rules are hierarchical. Only use when previous rules do not apply."); - rule.getNotes().add("See Table 2 in the Equivalent Terms and Definitions for a listing of CNS sites."); + rule.getNotes().add("See Table 2 in the Site-group Instructions for a listing of CNS sites."); rule.getNotes().add( "A non-malignant CNS tumor and a malignant CNS tumor are always multiple primaries (timing and primary sites are irrelevant). Prepare two abstracts; one for the non-malignant and another for the malignant tumor."); _rules.add(rule); @@ -144,7 +144,7 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte rule = new MpRuleCNS(MphConstants.SOLID_TUMOR_2018_MALIGNANT_CNS, "M9", true); _rules.add(rule); - // Rule M10 Abstract multiple primaries when separate, non-contiguous tumors are two or more different subtypes/variants in Column 3, Table 3 in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M10 Abstract multiple primaries when separate, non-contiguous tumors are two or more different subtypes/variants in Column 2, Table 3 in the Site-group Instructions. Timing is irrelevant. rule = new MphRule(MphConstants.SOLID_TUMOR_2018_MALIGNANT_CNS, "M10") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -162,8 +162,8 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte return result; } }; - rule.setQuestion("Are separate/non-contiguous tumors two or more different subtypes/variants in Column 3, Table 3 in the Equivalent Terms and Definitions?"); - rule.setReason("Separate/non-contiguous tumors that are two or more different subtypes/variants in Column 3, Table 3 in the Equivalent Terms and Definitions are multiple primaries."); + rule.setQuestion("Are separate/non-contiguous tumors two or more different subtypes/variants in Column 2, Table 3 in the Site-group Instructions?"); + rule.setReason("Separate/non-contiguous tumors that are two or more different subtypes/variants in Column 2, Table 3 in the Site-group Instructions are multiple primaries."); rule.getNotes().add("The tumors may be subtypes/variants of the same or different NOS histologies."); rule.getNotes().add( " - Same NOS: Anaplastic astrocytoma IDH-mutant 9401 and gemistocytic astrocytoma IDH-mutant 9411 are both subtypes of astrocytoma NOS 9400/3 but are distinctly different histologies. Abstract multiple primaries."); @@ -191,7 +191,7 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte return result; } }; - rule.setQuestion("Are separate/non-contiguous tumors two or more different subtypes/variants in Column 3, Table 3 in the Equivalent Terms and Definitions?"); + rule.setQuestion("Are separate/non-contiguous tumors two or more different subtypes/variants in Column 2, Table 3 in the Site-group Instructions?"); rule.setReason("Abstract a single primary when separate, non-contiguous tumors are Glioma NOS and a subtype/variant of Glioma NOS."); rule.getNotes().add( "The following is a list of all tumors which would be classified as subtypes/variants of glioma NOS.\n" + @@ -205,17 +205,17 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte + " Ependymoma, RELA fusion-positive 9396\n"); _rules.add(rule); - // Rule M12 Abstract a single primary when separate, non-contiguous tumors are on the same row in Table 3 in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M12 Abstract a single primary when separate, non-contiguous tumors are on the same row in Table 3 in the Site-group Instructions. Timing is irrelevant. rule = new MpRuleSameRowInTable(MphConstants.SOLID_TUMOR_2018_MALIGNANT_CNS, "M12", MALIGNANT_CNS_2018_TABLE3_ROWS, false); - rule.setQuestion("Are separate/non-contiguous tumors on the same rows in Table 3 in the Equivalent Terms and Definitions?"); - rule.setReason("Separate/non-contiguous tumors on the same row in Table 3 in the Equivalent Terms and Definitions are a single primary."); + rule.setQuestion("Are separate/non-contiguous tumors on the same rows in Table 3 in the Site-group Instructions?"); + rule.setReason("Separate/non-contiguous tumors on the same row in Table 3 in the Site-group Instructions are a single primary."); rule.getNotes().add("The same row means the tumors are:"); rule.getNotes().add(" - The same histology (same four-digit ICD-O code) OR"); rule.getNotes().add(" - One is the preferred term (column 1) and the other is a synonym for the preferred term (column 2) OR"); rule.getNotes().add(" - A NOS (column 1/column 2) and the other is a subtype/variant of that NOS (column 3)"); _rules.add(rule); - // Rule M13 Abstract multiple primaries when separate, non-contiguous tumors are on different rows in Table 3 in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M13 Abstract multiple primaries when separate, non-contiguous tumors are on different rows in Table 3 in the Site-group Instructions. Timing is irrelevant. rule = new MphRule(MphConstants.SOLID_TUMOR_2018_MALIGNANT_CNS, "M13") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -242,8 +242,8 @@ else if (!row1.equals(row2)) return result; } }; - rule.setQuestion("Are separate/non-contiguous tumors on different rows in Table 3 in the Equivalent Terms and Definitions?"); - rule.setReason("Separate/non-contiguous tumors on different rows in Table 3 in the Equivalent Terms and Definitions are multiple primaries."); + rule.setQuestion("Are separate/non-contiguous tumors on different rows in Table 3 in the Site-group Instructions?"); + rule.setReason("Separate/non-contiguous tumors on different rows in Table 3 in the Site-group Instructions are multiple primaries."); rule.getNotes().add("Each row in the table is a distinctly different histology."); _rules.add(rule); diff --git a/src/main/java/com/imsweb/mph/mpgroups/Mp2018NonMalignantCNSTumorsGroup.java b/src/main/java/com/imsweb/mph/mpgroups/Mp2018NonMalignantCNSTumorsGroup.java index 212e2f2..0428fd1 100644 --- a/src/main/java/com/imsweb/mph/mpgroups/Mp2018NonMalignantCNSTumorsGroup.java +++ b/src/main/java/com/imsweb/mph/mpgroups/Mp2018NonMalignantCNSTumorsGroup.java @@ -77,7 +77,7 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte // - Cerebral meninges C700 AND spinal meninges C701 // - Cerebral meninges C700 AND any other part of CNS // - Any cranial nerve(s) C722-C725 AND any other part of the CNS - // - Meninges of cranial nerves C709 AND any other part of the CNS + // - Meninges of cranial nerves C700 AND any other part of the CNS // -Spinal cord C720 AND any other part of CNS // - Spinal meninges C701 AND any other part of CNS // (Any other part of the CNS is any other site in the header...for example "cerebral meninges C700 and any other part of the CNS" equates to C700 and any @@ -85,7 +85,7 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte rule = new MpRuleCNS(MphConstants.SOLID_TUMOR_2018_NON_MALIGNANT_CNS, "M8", false); _rules.add(rule); - // Rule M9 Abstract multiple primaries when separate, non-contiguous tumors are two or more different subtypes/variants in Column 3, Table 6 in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M9 Abstract multiple primaries when separate, non-contiguous tumors are two or more different subtypes/variants in Column 2, Table 6 in the Site-group Instructions. Timing is irrelevant. rule = new MphRule(MphConstants.SOLID_TUMOR_2018_NON_MALIGNANT_CNS, "M9") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -97,8 +97,8 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte return result; } }; - rule.setQuestion("Are separate/non-contiguous tumors two or more different subtypes/variants in Column 3, Table 6 in the Equivalent Terms and Definitions?"); - rule.setReason("Separate/non-contiguous tumors that are two or more different subtypes/variants in Column 3, Table 6 in the Equivalent Terms and Definitions are multiple primaries."); + rule.setQuestion("Are separate/non-contiguous tumors two or more different subtypes/variants in Column 2, Table 6 in the Site-group Instructions?"); + rule.setReason("Separate/non-contiguous tumors that are two or more different subtypes/variants in Column 2, Table 6 in the Site-group Instructions are multiple primaries."); rule.getNotes().add("The tumors may be subtypes/variants of the same or different NOS histologies."); rule.getNotes().add( " - Same NOS: Atypical meningioma 9539/1 and fibrous meningioma 9532/0 are both subtypes of meningioma NOS 9530 but are distinctly different histologies. Abstract multiple primaries."); @@ -163,7 +163,7 @@ else if ("9509".equals(i1.getHistology()) && !i1.getBehavior().equals(i2.getBeha "The physician may stage each tumor because staging and determining multiple primaries are done for different reasons. Staging determines which course of treatment would be most effective. Determining multiple primaries is done to stabilize the data for the study of epidemiology (long-term studies done on incidence, mortality, and causation of a disease with the goal of reducing or eliminating that disease)."); _rules.add(rule); - // Rule M12 Abstract a single primary when separate/non-contiguous tumors are on the same row in Table 6 in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M12 Abstract a single primary when separate/non-contiguous tumors are on the same row in Table 6 in the Site-group Instructions. Timing is irrelevant. rule = new MphRule(MphConstants.SOLID_TUMOR_2018_NON_MALIGNANT_CNS, "M12") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -200,8 +200,8 @@ else if ("9509".equals(i1.getHistology()) && !i1.getBehavior().equals(i2.getBeha return result; } }; - rule.setQuestion("Are separate/non-contiguous tumors on the same rows in Table 6 in the Equivalent Terms and Definitions?"); - rule.setReason("Separate/non-contiguous tumors on the same row in Table 6 in the Equivalent Terms and Definitions are a single primary."); + rule.setQuestion("Are separate/non-contiguous tumors on the same rows in Table 6 in the Site-group Instructions?"); + rule.setReason("Separate/non-contiguous tumors on the same row in Table 6 in the Site-group Instructions are a single primary."); rule.getNotes().add("The same row means the tumors are:"); rule.getNotes().add(" - The same histology (same four-digit ICD-O code) OR"); rule.getNotes().add(" - One is the preferred term (column 1) and the other is a synonym for the preferred term (column 2) OR"); @@ -235,7 +235,7 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte rule.getNotes().add("Low-grade glioma is considered an umbrella term or non-specific diagnosis, primarily seen on radiographic reports such as CT scans and MRIs. Often the patient is actively followed with scans and surgical intervention delayed or not recommended that would provide a definitive histology type. A diagnosis of low-grade glioma is not recommended and may be used when the diagnosis is based on imaging and/or additional tests were inconclusive."); _rules.add(rule); - // Rule M14 Abstract multiple primaries when separate/non-contiguous tumors are on different rows in Table 6 in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M14 Abstract multiple primaries when separate/non-contiguous tumors are on different rows in Table 6 in the Site-group Instructions. Timing is irrelevant. rule = new MphRule(MphConstants.SOLID_TUMOR_2018_NON_MALIGNANT_CNS, "M14") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -267,8 +267,8 @@ else if (!row1.equals(row2)) return result; } }; - rule.setQuestion("Are separate/non-contiguous tumors on different rows in Table 6 in the Equivalent Terms and Definitions?"); - rule.setReason("Separate/non-contiguous tumors on different rows in Table 6 in the Equivalent Terms and Definitions are multiple primaries."); + rule.setQuestion("Are separate/non-contiguous tumors on different rows in Table 6 in the Site-group Instructions?"); + rule.setReason("Separate/non-contiguous tumors on different rows in Table 6 in the Site-group Instructions are multiple primaries."); rule.getNotes().add("Each row in the table is a distinctly different histology."); _rules.add(rule); diff --git a/src/main/java/com/imsweb/mph/mpgroups/Mp2018UrinarySitesGroup.java b/src/main/java/com/imsweb/mph/mpgroups/Mp2018UrinarySitesGroup.java index ca949e2..77095ab 100644 --- a/src/main/java/com/imsweb/mph/mpgroups/Mp2018UrinarySitesGroup.java +++ b/src/main/java/com/imsweb/mph/mpgroups/Mp2018UrinarySitesGroup.java @@ -217,7 +217,7 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte rule.getNotes().add(" - Urethra"); _rules.add(rule); - // Rule M12 Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 3 of Table 2 in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M12 Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 2 of Table 2 in the Site-group Instructions. Timing is irrelevant. rule = new MphRule(MphConstants.SOLID_TUMOR_2018_URINARY, "M12") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -233,8 +233,8 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte return result; } }; - rule.setQuestion("Are separate/non-contiguous tumors two or more different subtypes/variants in Column 3, Table 2 in the Equivalent Terms and Definitions?"); - rule.setReason("Separate/non-contiguous tumors that are two or more different subtypes/variants in Column 3, Table 2 in the Equivalent Terms and Definitions, are multiple primaries."); + rule.setQuestion("Are separate/non-contiguous tumors two or more different subtypes/variants in Column 2, Table 2 in the Site-group Instructions?"); + rule.setReason("Separate/non-contiguous tumors that are two or more different subtypes/variants in Column 2, Table 2 in the Site-group Instructions, are multiple primaries."); rule.getNotes().add("The tumors may be subtypes/variants of the same or different NOS histologies."); rule.getNotes().add( " - Same NOS: Leiomyosarcoma 8890/3 and liposarcoma 8850/3 are both subtypes of sarcoma NOS 8800/3 but are distinctly different histologies. Abstract multiple primaries."); @@ -242,10 +242,10 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte " - Different NOS: Verrucous carcinoma 8051 is a subtype of squamous cell carcinoma NOS 8070; giant cell urothelial carcinoma 8031 is a subtype of urothelial carcinoma 8120. They are distinctly different histologies. Abstract multiple primaries."); _rules.add(rule); - // Rule M13 Abstract multiple primaries when separate/non-contiguous tumors are on different rows in Table 2 in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M13 Abstract multiple primaries when separate/non-contiguous tumors are on different rows in Table 2 in the Site-group Instructions. Timing is irrelevant. rule = new MpRuleDifferentRowInTable(MphConstants.SOLID_TUMOR_2018_URINARY, "M13", MphConstants.URINARY_2018_TABLE2_ROWS); - rule.setQuestion("Are separate/non-contiguous tumors on different rows in Table 2 in the Equivalent Terms and Definitions?"); - rule.setReason("Separate/non-contiguous tumors that are on different rows in Table 2 in the Equivalent Terms and Definitions, are multiple primaries."); + rule.setQuestion("Are separate/non-contiguous tumors on different rows in Table 2 in the Site-group Instructions?"); + rule.setReason("Separate/non-contiguous tumors that are on different rows in Table 2 in the Site-group Instructions, are multiple primaries."); rule.getNotes().add("Each row in the table is a distinctly different histology."); rule.getExamples().add( "Small cell neuroendocrine carcinoma 8041 and urothelial carcinoma 8120 are on different rows of Table 2. Abstract two primaries, one for the small cell neuroendocrine carcinoma and a second for the urothelial carcinoma."); @@ -255,10 +255,10 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte rule = new MpRulePrimarySite(MphConstants.SOLID_TUMOR_2018_URINARY, "M14"); _rules.add(rule); - // Rule M15 Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 2 in the Equivalent Terms and Definitions. + // Rule M15 Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 2 in the Site-group Instructions. rule = new MpRuleSameRowInTable(MphConstants.SOLID_TUMOR_2018_URINARY, "M15", MphConstants.URINARY_2018_TABLE2_ROWS, true); - rule.setQuestion("Are synchronous, separate/non-contiguous tumors on the same row in Table 2 in the Equivalent Terms and Definitions?"); - rule.setReason("Synchronous, separate/non-contiguous tumors that are on the same row in Table 2 in the Equivalent Terms and Definitions are a single primary."); + rule.setQuestion("Are synchronous, separate/non-contiguous tumors on the same row in Table 2 in the Site-group Instructions?"); + rule.setReason("Synchronous, separate/non-contiguous tumors that are on the same row in Table 2 in the Site-group Instructions are a single primary."); rule.getNotes().add("The same row means the tumors are:"); rule.getNotes().add(" - The same histology (same four-digit ICD-O code) OR"); rule.getNotes().add(" - One is the preferred term (column 1) and the other is a synonym for the preferred term (column 2) OR"); @@ -273,7 +273,7 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte rule.setQuestion("Is there an in situ tumor following an invasive tumor?"); rule.setReason("An in situ tumor following an invasive tumor is a single primary."); rule.getNotes().add("The rules are hierarchical. Only use this rule when previous rules do not apply."); - rule.getNotes().add("The tumors may be a NOS and a subtype/variant of that NOS. See Table 2 in the Equivalent Terms and Definitions for listings of NOS and subtype/variants."); + rule.getNotes().add("The tumors may be a NOS and a subtype/variant of that NOS. See Table 2 in the Site-group Instructions for listings of NOS and subtype/variants."); rule.getNotes().add("Once the patient has an invasive tumor, the subsequent in situ is recorded as a recurrence for those registrars who collect recurrence data."); _rules.add(rule); diff --git a/src/main/java/com/imsweb/mph/mpgroups/Mp2021CutaneousMelanomaGroup.java b/src/main/java/com/imsweb/mph/mpgroups/Mp2021CutaneousMelanomaGroup.java index fe2d3a5..c9b36c5 100644 --- a/src/main/java/com/imsweb/mph/mpgroups/Mp2021CutaneousMelanomaGroup.java +++ b/src/main/java/com/imsweb/mph/mpgroups/Mp2021CutaneousMelanomaGroup.java @@ -71,7 +71,7 @@ else if (!i1.getLaterality().equals(i2.getLaterality())) _rules.add(rule); //M5- Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in - //Column 3, Table 2 in the Equivalent Terms and Definitions. Timing is irrelevant. + //Column 2, Table 2 in the Site-group Instructions. Timing is irrelevant. rule = new MphRule(MphConstants.SOLID_TUMOR_2021_CUTANEOUS_MELANOMA, "M5") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -88,11 +88,11 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte }; rule.setQuestion("Are separate/non-contiguous tumors different subtypes/variants in Column 3, Table 2?"); - rule.setReason("Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 3, Table 2 in the Equivalent Terms and Definitions."); + rule.setReason("Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 2, Table 2 in the Site-group Instructions."); rule.getExamples().add("Epithelioid cell melanoma 8771/3 and nodular melanoma 8721/3 are both subtypes/variants of melanoma, NOS 8720/3"); _rules.add(rule); - //M6- Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 2 in the Equivalent Terms and Definitions. Tumors must have same site and same laterality. + //M6- Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 2 in the Site-group Instructions. Tumors must have same site and same laterality. rule = new MphRule(MphConstants.SOLID_TUMOR_2021_CUTANEOUS_MELANOMA, "M6") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -117,13 +117,27 @@ else if (MphConstants.DATE_VERIFY_WITHIN == sixtyDaysApart) result.setFinalResult(MphUtils.MpResult.SINGLE_PRIMARY); } } + else { + result.setFinalResult(MpResult.QUESTIONABLE); + String icd1 = i1.getIcdCode(); + String icd2 = i2.getIcdCode(); + String histologyNotInTable; + boolean bothNotInTable = false; + if (!icd1InTable && !icd2InTable) { + bothNotInTable = true; + histologyNotInTable = "Both " + icd1 + " and " + icd2; + } + else + histologyNotInTable = !icd1InTable ? icd1 : icd2; + result.setMessage("Unable to apply Rule " + this.getStep() + " of " + this.getGroupName() + ". " + histologyNotInTable + (bothNotInTable ? " are " : " is ") + "not in the table."); + } return result; } }; rule.setQuestion("Are tumors synchronous, on the same row in Table 2 and have same site and laterality?"); rule.setReason( - "Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 2 in the Equivalent Terms and Definitions. And they have same site and laterality."); + "Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 2 in the Site-group Instructions. And they have same site and laterality."); _rules.add(rule); //M7- Melanomas diagnosed more than 60 days apart are multiple primaries. diff --git a/src/main/java/com/imsweb/mph/mpgroups/Mp2023OtherSitesGroup.java b/src/main/java/com/imsweb/mph/mpgroups/Mp2023OtherSitesGroup.java index 2292e78..2fc2cfd 100644 --- a/src/main/java/com/imsweb/mph/mpgroups/Mp2023OtherSitesGroup.java +++ b/src/main/java/com/imsweb/mph/mpgroups/Mp2023OtherSitesGroup.java @@ -111,7 +111,7 @@ else if ((MphConstants.COMPARE_DX_FIRST_LATEST == laterDx && smallCellCarcinoma. + "Papillary thyroid carcinoma, NOS and follicular carcinoma, NOS OR\n" + "Papillary carcinoma, follicular variant and papillary thyroid carcinoma OR\n" + "Papillary carcinoma, follicular variant and follicular carcinoma OR\n" - + "Any papillary thyroid carcinoma subtype/variant and any follicular subtype/variant listed in Column 3, Table 12."); + + "Any papillary thyroid carcinoma subtype/variant and any follicular subtype/variant listed in Column 2, Table 12."); _rules.add(rule); //M8- Abstract multiple primaries when separate/non-contiguous tumors are anaplastic carcinoma and any other histologies in the thyroid. @@ -302,7 +302,7 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte rule.getNotes().add("Includes all combinations of adenomatous, tubular, villous, and tubulovillous adenomas or polyps."); _rules.add(rule); - //M17 - Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 3, Table 3-23 + //M17 - Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 2, Table 3-23 rule = new MphRule(MphConstants.SOLID_TUMOR_2023_OTHER_SITES, "M17") { @Override public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext context) { @@ -322,8 +322,8 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte return result; } }; - rule.setQuestion("Are tumors different subtypes/variants in Column 3, Table 3-23?"); - rule.setReason("Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 3, Table 3-23."); + rule.setQuestion("Are tumors different subtypes/variants in Column 2, Table 3-23?"); + rule.setReason("Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 2, Table 3-23."); _rules.add(rule); //M18 Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 3-23. @@ -355,8 +355,8 @@ else if (MphConstants.DATE_VERIFY_WITHIN == sixtyDaysApart) }; rule.setQuestion("Are tumors on the same row in Table 3-23?"); rule.setReason("Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 3-23."); - rule.getNotes().add("The same histology (same four-digit ICD-O code) OR One is the preferred term (column 1) and the other is a synonym for the preferred term (column 2) OR" - + "A NOS (column 1/column 2) and the other is a subtype/variant of that NOS (column 3) "); + rule.getNotes().add("The same histology (same four-digit ICD-O code) OR One is the preferred term (column 1) and the other is a synonym for the preferred term ((indented under the preferred term in column 1) OR" + + "A NOS (column 1) and the other is a subtype/variant of that NOS (column 2) "); _rules.add(rule); //M19 - Abstract multiple primaries when separate/non-contiguous tumors are on multiple rows in Table 2-23. diff --git a/src/main/java/com/imsweb/mph/mprules/MpRuleCNS.java b/src/main/java/com/imsweb/mph/mprules/MpRuleCNS.java index 5c7cc50..5b0cc6f 100644 --- a/src/main/java/com/imsweb/mph/mprules/MpRuleCNS.java +++ b/src/main/java/com/imsweb/mph/mprules/MpRuleCNS.java @@ -13,29 +13,29 @@ public class MpRuleCNS extends MphRule { - private boolean _malignant; + private final boolean _malignant; public MpRuleCNS(String groupName, String step, boolean malignant) { super(groupName, step); _malignant = malignant; - setQuestion("Are multiple tumors present in the following sites:\n" + + setQuestion("Are multiple tumors present in any of the following sites:\n" + " - Any lobe(s) of the brain C710-C719 AND any other part of CNS\n" + " - Cauda equina C721 AND any other part of CNS\n" + " - Cerebral meninges C700 AND spinal meninges C701\n" + " - Cerebral meninges C700 AND any other part of CNS\n" + " - Any cranial nerve(s) C722-C725 AND any other part of the CNS\n" + (malignant ? " - Any two or more of the cranial nerves: C722 Olfactory, C723 Optic, C724 Acoustic, C725 Cranial nerves NOS,\n" : "") + - " - Meninges of cranial nerves C709 AND any other part of the CNS\n" + + (malignant ? " - Meninges of cranial nerves C709 AND any other part of the CNS\n" : " - Meninges of cranial nerves C700 AND any other part of the CNS\n" ) + " - Spinal cord C720 AND any other part of CNS\n" + " - Spinal meninges C701 AND any other part of CNS?"); - setReason("Multiple tumors present in the following sites:\n" + + setReason("Abstract multiple primaries when multiple tumors are present in any of the following sites:\n" + " - Any lobe(s) of the brain C710-C719 AND any other part of CNS\n" + " - Cauda equina C721 AND any other part of CNS\n" + " - Cerebral meninges C700 AND spinal meninges C701\n" + " - Cerebral meninges C700 AND any other part of CNS\n" + " - Any cranial nerve(s) C722-C725 AND any other part of the CNS\n" + (malignant ? " - Any two or more of the cranial nerves: C722 Olfactory, C723 Optic, C724 Acoustic, C725 Cranial nerves NOS,\n" : "") + - " - Meninges of cranial nerves C709 AND any other part of the CNS\n" + + (malignant ? " - Meninges of cranial nerves C709 AND any other part of the CNS\n" : " - Meninges of cranial nerves C700 AND any other part of the CNS\n" ) + " - Spinal cord C720 AND any other part of CNS\n" + " - Spinal meninges C701 AND any other part of CNS\n" + "are multiple primaries."); @@ -65,11 +65,11 @@ public TempRuleResult apply(MphInput i1, MphInput i2, RuleExecutionContext conte // - Any two or more of the cranial nerves: C722 Olfactory, C723 Optic, C724 Acoustic, C725 Cranial nerves NOS boolean cranialNerves = GroupUtility.isSiteContained(MphConstants.CNS_2018_CRANIAL_NERVES_SITES_NON_CAUDA_EQUINA, s1) && GroupUtility.isSiteContained( MphConstants.CNS_2018_CRANIAL_NERVES_SITES_NON_CAUDA_EQUINA, s2) && !s1.equals(s2); - // - Meninges of cranial nerves C709 AND any other part of the CNS - boolean meningesOfCranialAndOtherPart = (GroupUtility.isSiteContained(MphConstants.CNS_2018_MENINGES_OF_CRANIAL_OR_PERIPH_NERVES_SITES, s1) && !GroupUtility.isSiteContained( - MphConstants.CNS_2018_MENINGES_OF_CRANIAL_OR_PERIPH_NERVES_SITES, s2)) - || (GroupUtility.isSiteContained(MphConstants.CNS_2018_MENINGES_OF_CRANIAL_OR_PERIPH_NERVES_SITES, s2) && !GroupUtility.isSiteContained( - MphConstants.CNS_2018_MENINGES_OF_CRANIAL_OR_PERIPH_NERVES_SITES, s1)); + // - Meninges of cranial nerves C700 AND any other part of the CNS + boolean meningesOfCranialAndOtherPart = (GroupUtility.isSiteContained(_malignant ? MphConstants.MALIGNANT_CNS_2018_MENINGES_OF_CRANIAL_OR_PERIPH_NERVES_SITES : MphConstants.NON_MALIGNANT_CNS_2018_MENINGES_OF_CRANIAL_OR_PERIPH_NERVES_SITES, s1) && !GroupUtility.isSiteContained( + _malignant ? MphConstants.MALIGNANT_CNS_2018_MENINGES_OF_CRANIAL_OR_PERIPH_NERVES_SITES : MphConstants.NON_MALIGNANT_CNS_2018_MENINGES_OF_CRANIAL_OR_PERIPH_NERVES_SITES, s2)) + || (GroupUtility.isSiteContained(_malignant ? MphConstants.MALIGNANT_CNS_2018_MENINGES_OF_CRANIAL_OR_PERIPH_NERVES_SITES : MphConstants.NON_MALIGNANT_CNS_2018_MENINGES_OF_CRANIAL_OR_PERIPH_NERVES_SITES, s2) && !GroupUtility.isSiteContained( + _malignant ? MphConstants.MALIGNANT_CNS_2018_MENINGES_OF_CRANIAL_OR_PERIPH_NERVES_SITES : MphConstants.NON_MALIGNANT_CNS_2018_MENINGES_OF_CRANIAL_OR_PERIPH_NERVES_SITES, s1)); // -Spinal cord C720 AND any other part of CNS boolean spinalCordAndOtherPart = (GroupUtility.isSiteContained(MphConstants.CNS_2018_SPINAL_CORD_SITES, s1) && !GroupUtility.isSiteContained(MphConstants.CNS_2018_SPINAL_CORD_SITES, s2)) || (GroupUtility.isSiteContained(MphConstants.CNS_2018_SPINAL_CORD_SITES, s2) && !GroupUtility.isSiteContained(MphConstants.CNS_2018_SPINAL_CORD_SITES, s1)); diff --git a/src/main/resources/Hematopoietic2010TransformToPairs.csv b/src/main/resources/Hematopoietic2010TransformToPairs.csv index aae195c..d2abb55 100644 --- a/src/main/resources/Hematopoietic2010TransformToPairs.csv +++ b/src/main/resources/Hematopoietic2010TransformToPairs.csv @@ -103,6 +103,7 @@ morphology,valid start year,valid end year,start year,end year,transform to 9962/3,2001,,2010,,9910/3 9962/3,2001,,2010,,9911/3 9659/3,1992,,2010,,9680/3 +9659/3,1992,,,,9688/3 9698/3,2001,,2010,,9680/3 9653/3,2001,,2010,,9680/3 9671/3,2001,,2010,,9650/3 diff --git a/src/main/resources/hemato_data_info.properties b/src/main/resources/hemato_data_info.properties index 4c3fe88..7b797ea 100644 --- a/src/main/resources/hemato_data_info.properties +++ b/src/main/resources/hemato_data_info.properties @@ -1,2 +1,2 @@ -#Mon Mar 09 14:58:02 EDT 2026 -last_updated=202603091458 +#Mon Mar 23 10:25:43 EDT 2026 +last_updated=202603231025 diff --git a/src/test/java/com/imsweb/mph/Mph2018RuleTests.java b/src/test/java/com/imsweb/mph/Mph2018RuleTests.java index 414a6e9..86c1305 100644 --- a/src/test/java/com/imsweb/mph/Mph2018RuleTests.java +++ b/src/test/java/com/imsweb/mph/Mph2018RuleTests.java @@ -182,61 +182,7 @@ public void test2018Breast() { // Assert.assertTrue(output.getReason().contains("Paget")); // Assert.assertEquals(ruleStepToTest, output.getStep()); - //Rule M10 Abstract a single primary when simultaneous multiple tumors are carcinoma NST/duct and lobular. - //- Both/all tumors may be a mixture of carcinoma NST/duct and lobular 8522 OR - //- One tumor may be duct and another tumor lobular OR - //- One tumor may be mixed duct and lobular 8522, the other tumor either duct or lobular - ruleStepToTest = "M10"; - ruleCountToTest = 5; - i1.setPrimarySite("C500"); - i1.setHistologyIcdO3("8500"); - i1.setBehaviorIcdO3("2"); - i1.setDateOfDiagnosisYear("2018"); - i1.setDateOfDiagnosisMonth("1"); - i1.setLaterality("1"); - i2.setPrimarySite("C509"); - i2.setHistologyIcdO3("8520"); - i2.setBehaviorIcdO3("2"); - i2.setDateOfDiagnosisYear("2018"); - i2.setDateOfDiagnosisMonth("2"); - i2.setLaterality("1"); - output = _utils.computePrimaries(i1, i2); - Assert.assertEquals(MphUtils.MpResult.SINGLE_PRIMARY, output.getResult()); - Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertEquals(ruleStepToTest, output.getStep()); - // Date restriction is removed in July 2019 update - i2.setDateOfDiagnosisMonth("5"); - output = _utils.computePrimaries(i1, i2); - Assert.assertEquals(MphUtils.MpResult.SINGLE_PRIMARY, output.getResult()); - Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertEquals(ruleStepToTest, output.getStep()); - i1.setPrimarySite("C500"); - i1.setHistologyIcdO3("8500"); - i1.setBehaviorIcdO3("2"); - i1.setDateOfDiagnosisYear("2018"); - i1.setDateOfDiagnosisMonth("1"); - i1.setLaterality("1"); - i2.setPrimarySite("C509"); - i2.setHistologyIcdO3("8520"); - i2.setBehaviorIcdO3("3"); - i2.setDateOfDiagnosisYear("2018"); - i2.setDateOfDiagnosisMonth("2"); - i2.setLaterality("1"); - output = _utils.computePrimaries(i1, i2); - //2023 update behavior restriction removed - Assert.assertEquals(MphConstants.SOLID_TUMOR_2018_BREAST, output.getGroupName()); - Assert.assertEquals(MphUtils.MpResult.SINGLE_PRIMARY, output.getResult()); - Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertEquals(ruleStepToTest, output.getStep()); - i1.setBehaviorIcdO3("2"); - i2.setBehaviorIcdO3("2"); - output = _utils.computePrimaries(i1, i2); - Assert.assertEquals(MphConstants.SOLID_TUMOR_2018_BREAST, output.getGroupName()); - Assert.assertEquals(MphUtils.MpResult.SINGLE_PRIMARY, output.getResult()); - Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertEquals(ruleStepToTest, output.getStep()); - - // Rule M11 Abstract a single primary when any of the following conditions are met in the same breast: + // Rule M10 Abstract a single primary when any of the following conditions are met in the same breast: // - DCIS subsequent to a diagnosis of mixed DCIS AND: //  Lobular carcinoma in situ 8522/2 OR //  In situ Paget 8543/2 OR @@ -246,8 +192,8 @@ public void test2018Breast() { //  Invasive lobular 8522/3 OR //  Invasive Paget 8541/3 OR //  Other invasive carcinoma 8523/3 - ruleStepToTest = "M11"; - ruleCountToTest = 6; + ruleStepToTest = "M10"; + ruleCountToTest = 5; i1.setPrimarySite("C504"); i1.setHistologyIcdO3("8543"); i1.setBehaviorIcdO3("2"); @@ -303,9 +249,9 @@ public void test2018Breast() { output = _utils.computePrimaries(i1, i2); Assert.assertNotEquals(ruleStepToTest, output.getStep()); - // Rule M12 Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 3 of Table 3 in the Equivalent Terms and Definitions. Timing is irrelevant. - ruleStepToTest = "M12"; - ruleCountToTest = 7; + // Rule M11 Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 3 of Table 3 in the Equivalent Terms and Definitions. Timing is irrelevant. + ruleStepToTest = "M11"; + ruleCountToTest = 6; i1.setPrimarySite("C500"); i1.setHistologyIcdO3("8035"); i1.setBehaviorIcdO3("2"); @@ -322,7 +268,7 @@ public void test2018Breast() { Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); Assert.assertEquals(ruleStepToTest, output.getStep()); - Assert.assertTrue(output.getReason().contains("subtypes/variants in Column 3, Table 3")); + Assert.assertTrue(output.getReason().contains("different subtypes")); i1.setPrimarySite("C501"); i1.setHistologyIcdO3("8310"); i1.setBehaviorIcdO3("2"); @@ -337,7 +283,7 @@ public void test2018Breast() { i2.setDateOfDiagnosisMonth(""); output = _utils.computePrimaries(i1, i2); Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); - Assert.assertTrue(output.getReason().contains("subtypes/variants in Column 3, Table 3")); + Assert.assertTrue(output.getReason().contains("different subtypes")); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); Assert.assertEquals(ruleStepToTest, output.getStep()); i1.setPrimarySite("C508"); @@ -356,7 +302,7 @@ public void test2018Breast() { Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); Assert.assertEquals(ruleStepToTest, output.getStep()); - Assert.assertTrue(output.getReason().contains("subtypes/variants in Column 3, Table 3")); + Assert.assertTrue(output.getReason().contains("different subtypes")); i1.setHistologyIcdO3("9170"); i2.setHistologyIcdO3("9180"); @@ -364,7 +310,7 @@ public void test2018Breast() { Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); Assert.assertEquals(ruleStepToTest, output.getStep()); - Assert.assertTrue(output.getReason().contains("subtypes/variants in Column 3, Table 3")); + Assert.assertTrue(output.getReason().contains("different subtypes")); //Does not apply i1.setHistologyIcdO3("9170"); i2.setHistologyIcdO3("9120"); @@ -481,9 +427,9 @@ public void test2018Breast() { Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); Assert.assertEquals(ruleStepToTest, output.getStep()); - // Rule M13 Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 3 in the Equivalent Terms and Definitions. Timing is irrelevant. - ruleStepToTest = "M13"; - ruleCountToTest = 8; + // Rule M12 Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 3 in the Equivalent Terms and Definitions. Timing is irrelevant. + ruleStepToTest = "M12"; + ruleCountToTest = 7; i1.setPrimarySite("C500"); i1.setHistologyIcdO3("8200"); i1.setBehaviorIcdO3("2"); @@ -684,9 +630,9 @@ public void test2018Breast() { Assert.assertEquals(ruleStepToTest, output.getStep()); Assert.assertTrue(output.getReason().contains("same row in Table 3")); - // Rule M14 Abstract multiple primaries when separate/non-contiguous tumors are on different rows in Table 3 in the Equivalent Terms and Definitions. Timing is irrelevant. - ruleStepToTest = "M14"; - ruleCountToTest = 9; + // Rule M13 Abstract multiple primaries when separate/non-contiguous tumors are on different rows in Table 3 in the Equivalent Terms and Definitions. Timing is irrelevant. + ruleStepToTest = "M13"; + ruleCountToTest = 8; i1.setPrimarySite("C500"); i1.setHistologyIcdO3("8315"); i1.setBehaviorIcdO3("2"); @@ -756,9 +702,9 @@ public void test2018Breast() { Assert.assertEquals(ruleStepToTest, output.getStep()); Assert.assertTrue(output.getReason().contains("different rows in Table 3")); - // Rule M15 Abstract a single primary (the invasive) when an in situ tumor is diagnosed after an invasive tumor in the same breast. - ruleStepToTest = "M15"; - ruleCountToTest = 10; + // Rule M14 Abstract a single primary (the invasive) when an in situ tumor is diagnosed after an invasive tumor in the same breast. + ruleStepToTest = "M14"; + ruleCountToTest = 9; i1.setPrimarySite("C500"); i1.setHistologyIcdO3("8401"); i1.setBehaviorIcdO3("3"); @@ -788,9 +734,9 @@ public void test2018Breast() { output = _utils.computePrimaries(i1, i2); Assert.assertNotEquals(ruleStepToTest, output.getStep()); - // Rule M16 Abstract a single primary (the invasive) when an invasive tumor is diagnosed less than or equal to 60 days after an in situ tumor in the same breast. - ruleStepToTest = "M16"; - ruleCountToTest = 11; + // Rule M15 Abstract a single primary (the invasive) when an invasive tumor is diagnosed less than or equal to 60 days after an in situ tumor in the same breast. + ruleStepToTest = "M15"; + ruleCountToTest = 10; i1.setPrimarySite("C500"); i1.setHistologyIcdO3("8523"); i1.setBehaviorIcdO3("2"); @@ -809,9 +755,9 @@ public void test2018Breast() { Assert.assertEquals(ruleStepToTest, output.getStep()); Assert.assertTrue(output.getReason().contains("invasive tumor following an in situ tumor less than or equal to 60 days")); - // Rule M17 Abstract multiple primaries when an invasive tumor occurs more than 60 days after an in situ tumor in the same breast. - ruleStepToTest = "M17"; - ruleCountToTest = 12; + // Rule M16 Abstract multiple primaries when an invasive tumor occurs more than 60 days after an in situ tumor in the same breast. + ruleStepToTest = "M16"; + ruleCountToTest = 11; i1.setPrimarySite("C500"); i1.setHistologyIcdO3("8401"); i1.setBehaviorIcdO3("2"); @@ -834,11 +780,11 @@ public void test2018Breast() { output = _utils.computePrimaries(i1, i2); Assert.assertNotEquals(ruleStepToTest, output.getStep()); - // Rule M18 Abstract a single primary when none of the previous rules apply. + // Rule M17 Abstract a single primary when none of the previous rules apply. // Unable to trigger this rule. /* - ruleStepToTest = "M18"; - ruleCountToTest = 15; + ruleStepToTest = "M17"; + ruleCountToTest = 14; i1.setPrimarySite("C500"); i1.setHistologyIcdO3("8529"); i1.setBehaviorIcdO3("2"); @@ -955,7 +901,7 @@ public void test2018Colon() { output = _utils.computePrimaries(i1, i2); Assert.assertNotEquals(ruleStepToTest, output.getStep()); - // Rule M5 Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 3, Table 1 in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M5 Abstract multiple primaries when separate/non-contiguous tumors are different subtypes in the Equivalent Terms and Definitions. Timing is irrelevant. ruleStepToTest = "M5"; ruleCountToTest = 3; i1.setPrimarySite("C180"); @@ -969,7 +915,7 @@ public void test2018Colon() { output = _utils.computePrimaries(i1, i2); Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertTrue(output.getReason().contains("two or more different subtypes/variants in Column 3, Table 1")); + Assert.assertTrue(output.getReason().contains("different subtypes")); Assert.assertEquals(ruleStepToTest, output.getStep()); i1.setPrimarySite("C180"); i1.setHistologyIcdO3("8020"); @@ -982,7 +928,7 @@ public void test2018Colon() { output = _utils.computePrimaries(i1, i2); Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertTrue(output.getReason().contains("two or more different subtypes/variants in Column 3, Table 1")); + Assert.assertTrue(output.getReason().contains("different subtypes")); Assert.assertEquals(ruleStepToTest, output.getStep()); i1.setPrimarySite("C180"); i1.setHistologyIcdO3("8142"); @@ -995,7 +941,7 @@ public void test2018Colon() { output = _utils.computePrimaries(i1, i2); Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertTrue(output.getReason().contains("two or more different subtypes/variants in Column 3, Table 1")); + Assert.assertTrue(output.getReason().contains("different subtypes")); Assert.assertEquals(ruleStepToTest, output.getStep()); // Does not apply i1.setPrimarySite("C180"); @@ -2432,15 +2378,9 @@ public void test2018HeadAndNeck() { Assert.assertEquals(MpResult.SINGLE_PRIMARY, output.getResult()); Assert.assertEquals(ruleStepToTest, output.getStep()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - i1.setHistologyIcdO3("9330"); - i2.setHistologyIcdO3("8980"); - output = _utils.computePrimaries(i1, i2); - Assert.assertEquals(MpResult.SINGLE_PRIMARY, output.getResult()); - Assert.assertEquals(ruleStepToTest, output.getStep()); - Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); //Not same row i1.setHistologyIcdO3("8800"); - i2.setHistologyIcdO3("8980"); + i2.setHistologyIcdO3("9342"); output = _utils.computePrimaries(i1, i2); Assert.assertEquals(MpResult.MULTIPLE_PRIMARIES, output.getResult()); @@ -2570,7 +2510,7 @@ public void test2018Kidney() { ruleStepToTest = "M7"; - i1.setHistologyIcdO3("8920"); + i1.setHistologyIcdO3("8910"); i2.setHistologyIcdO3("9180"); output = _utils.computePrimaries(i1, i2); Assert.assertEquals(ruleStepToTest, output.getStep()); @@ -2586,7 +2526,7 @@ public void test2018Kidney() { Assert.assertEquals(ruleStepToTest, output.getStep()); i1.setHistologyIcdO3("8316"); - i2.setHistologyIcdO3("8920"); + i2.setHistologyIcdO3("8910"); output = _utils.computePrimaries(i1, i2); Assert.assertEquals(ruleStepToTest, output.getStep()); @@ -2648,7 +2588,7 @@ public void test2018Kidney() { Assert.assertEquals(ruleStepToTest, output.getStep()); i1.setHistologyIcdO3("8312"); - i2.setHistologyIcdO3("8920"); + i2.setHistologyIcdO3("8910"); output = _utils.computePrimaries(i1, i2); Assert.assertEquals(ruleStepToTest, output.getStep()); @@ -2662,7 +2602,7 @@ public void test2018Kidney() { output = _utils.computePrimaries(i1, i2); Assert.assertEquals(ruleStepToTest, output.getStep()); - // Rule M7 Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 3, Table 1 in the Equivalent Terms and Definitions. Tumors must be in same kidney and timing is irrelevant. + // Rule M7 Abstract multiple primaries when separate/non-contiguous tumors are different subtypes in the Equivalent Terms and Definitions. Tumors must be in same kidney and timing is irrelevant. ruleStepToTest = "M7"; ruleCountToTest = 5; i1.setPrimarySite("C649"); @@ -2678,14 +2618,14 @@ public void test2018Kidney() { output = _utils.computePrimaries(i1, i2); Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertTrue(output.getReason().contains("two or more different subtypes/variants in Column 3, Table 1")); + Assert.assertTrue(output.getReason().contains("different subtypes")); Assert.assertEquals(ruleStepToTest, output.getStep()); i1.setHistologyIcdO3("9120"); i2.setHistologyIcdO3("8041"); output = _utils.computePrimaries(i1, i2); Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertTrue(output.getReason().contains("two or more different subtypes/variants in Column 3, Table 1")); + Assert.assertTrue(output.getReason().contains("different subtypes")); Assert.assertEquals(ruleStepToTest, output.getStep()); // Does not apply. i1.setHistologyIcdO3("8960"); @@ -2717,7 +2657,7 @@ public void test2018Kidney() { Assert.assertTrue(output.getReason().contains("tumors that are on the same row in Table 1")); Assert.assertEquals(ruleStepToTest, output.getStep()); i1.setHistologyIcdO3("8041"); - i2.setHistologyIcdO3("8240"); + i2.setHistologyIcdO3("8246"); output = _utils.computePrimaries(i1, i2); Assert.assertEquals(MphUtils.MpResult.SINGLE_PRIMARY, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); @@ -2750,7 +2690,8 @@ public void test2018Kidney() { Assert.assertTrue(output.getReason().contains("tumors that are on different rows in Table 1")); Assert.assertEquals(ruleStepToTest, output.getStep()); //8700 added to table 1 - i2.setHistologyIcdO3("8700"); + //paraganglioma 8700/3 row: Change code from 8700/3 to 8693/3 - 2026 update + i2.setHistologyIcdO3("8693"); output = _utils.computePrimaries(i1, i2); Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); @@ -2934,7 +2875,7 @@ public void test2018Lung() { Assert.assertNotEquals(ruleStepToTest, output.getStep()); - // Rule M6 Abstract multiple primaries when separate/non-contiguous tumors are two or more different subtypes/variants in Column 3, Table 3 in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M6 Abstract multiple primaries when separate/non-contiguous tumors are different subtypes in the Equivalent Terms and Definitions. Timing is irrelevant. ruleStepToTest = "M6"; ruleCountToTest = 4; i1.setHistologyIcdO3("8480"); @@ -2946,14 +2887,14 @@ public void test2018Lung() { output = _utils.computePrimaries(i1, i2); Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertTrue(output.getReason().contains("two or more different subtypes/variants in Column 3, Table 3")); + Assert.assertTrue(output.getReason().contains("different subtypes")); Assert.assertEquals(ruleStepToTest, output.getStep()); i1.setHistologyIcdO3("8333"); i2.setHistologyIcdO3("8083"); output = _utils.computePrimaries(i1, i2); Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertTrue(output.getReason().contains("two or more different subtypes/variants in Column 3, Table 3")); + Assert.assertTrue(output.getReason().contains("different subtypes")); Assert.assertEquals(ruleStepToTest, output.getStep()); i1.setHistologyIcdO3("8045"); i2.setHistologyIcdO3("8041"); @@ -2962,7 +2903,7 @@ public void test2018Lung() { output = _utils.computePrimaries(i1, i2); Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertTrue(output.getReason().contains("two or more different subtypes/variants in Column 3, Table 3")); + Assert.assertTrue(output.getReason().contains("different subtypes")); Assert.assertEquals(ruleStepToTest, output.getStep()); // i1.setHistologyIcdO3("8250"); @@ -2972,7 +2913,7 @@ public void test2018Lung() { output = _utils.computePrimaries(i1, i2); Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertTrue(output.getReason().contains("two or more different subtypes/variants in Column 3, Table 3")); + Assert.assertTrue(output.getReason().contains("different subtypes")); Assert.assertEquals(ruleStepToTest, output.getStep()); // Does not apply. i1.setHistologyIcdO3("8041"); @@ -3596,7 +3537,7 @@ public void test2018MalignantCNSAndPeripheralNerves() { output = _utils.computePrimaries(i1, i2); Assert.assertEquals(ruleStepToTest, output.getStep()); - // Rule M10 Abstract multiple primaries when separate, non-contiguous tumors are two or more different subtypes/variants in Column 3, Table 3 in the Equivalent Terms and Definitions. Timing is irrelevant. + // Rule M10 Abstract multiple primaries when separate, non-contiguous tumors are different subtypes in the Equivalent Terms and Definitions. Timing is irrelevant. ruleStepToTest = "M10"; ruleCountToTest = 5; i1.setPrimarySite("C728"); @@ -3875,7 +3816,7 @@ public void test2018NonMalignantCNSTumors() { Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); Assert.assertEquals(ruleStepToTest, output.getStep()); - i1.setPrimarySite("C709"); + i1.setPrimarySite("C700"); i2.setPrimarySite("C753"); output = _utils.computePrimaries(i1, i2); Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); @@ -4476,14 +4417,14 @@ public void test2018Urinary() { output = _utils.computePrimaries(i1, i2); Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertTrue(output.getReason().contains("tumors that are two or more different subtypes/variants in Column 3, Table 2")); + Assert.assertTrue(output.getReason().contains("different subtypes")); Assert.assertEquals(ruleStepToTest, output.getStep()); i1.setHistologyIcdO3("8746"); i2.setHistologyIcdO3("8721"); output = _utils.computePrimaries(i1, i2); Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertTrue(output.getReason().contains("tumors that are two or more different subtypes/variants in Column 3, Table 2")); + Assert.assertTrue(output.getReason().contains("different subtypes")); Assert.assertEquals(ruleStepToTest, output.getStep()); // Does not apply. i1.setHistologyIcdO3("8144"); diff --git a/src/test/java/com/imsweb/mph/Mph2021RuleTests.java b/src/test/java/com/imsweb/mph/Mph2021RuleTests.java index d070d04..ff44e6c 100644 --- a/src/test/java/com/imsweb/mph/Mph2021RuleTests.java +++ b/src/test/java/com/imsweb/mph/Mph2021RuleTests.java @@ -117,7 +117,7 @@ public void test2021CutaneousMelanoma() { Assert.assertEquals(MphConstants.SOLID_TUMOR_2021_CUTANEOUS_MELANOMA, output.getGroupName()); Assert.assertEquals(MphUtils.MpResult.MULTIPLE_PRIMARIES, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertTrue(output.getReason().contains("Column 3")); + Assert.assertTrue(output.getReason().contains("different subtypes")); Assert.assertEquals(ruleStepToTest, output.getStep()); // Rule M6 Abstract a single primary when synchronous, separate/non-contiguous tumors are on the same row in Table 2 @@ -183,11 +183,15 @@ public void test2021CutaneousMelanoma() { Assert.assertEquals(ruleStepToTest, output.getStep()); // Rule M8 Melanomas that do not meet any of the above criteria are abstracted as a single primary. * - ruleStepToTest = "M8"; - ruleCountToTest = 6; + // This rule won't be reached. + + + // Rule M6 8772/2 is not in the table + ruleStepToTest = "M6"; + ruleCountToTest = 4; i1.setPrimarySite("C442"); i2.setPrimarySite("C442"); - i1.setHistologyIcdO3("8725"); + i1.setHistologyIcdO3("8772"); i2.setHistologyIcdO3("8720"); i1.setBehaviorIcdO3("3"); i2.setBehaviorIcdO3("3"); @@ -195,12 +199,20 @@ public void test2021CutaneousMelanoma() { i2.setLaterality("5"); i1.setDateOfDiagnosisYear("2021"); i2.setDateOfDiagnosisYear("2021"); - i1.setDateOfDiagnosisMonth("01"); - i2.setDateOfDiagnosisMonth("01"); + i1.setDateOfDiagnosisMonth("1"); + i2.setDateOfDiagnosisMonth("1"); output = _utils.computePrimaries(i1, i2); - Assert.assertEquals(MphUtils.MpResult.SINGLE_PRIMARY, output.getResult()); + Assert.assertEquals(MphConstants.SOLID_TUMOR_2021_CUTANEOUS_MELANOMA, output.getGroupName()); + Assert.assertEquals(MpResult.SINGLE_PRIMARY, output.getResult()); + Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); + Assert.assertEquals(ruleStepToTest, output.getStep()); + i1.setBehaviorIcdO3("2"); + i2.setBehaviorIcdO3("2"); + output = _utils.computePrimaries(i1, i2); + Assert.assertEquals(MphConstants.SOLID_TUMOR_2021_CUTANEOUS_MELANOMA, output.getGroupName()); + Assert.assertEquals(MpResult.QUESTIONABLE, output.getResult()); Assert.assertEquals(ruleCountToTest, output.getAppliedRules().size()); - Assert.assertTrue(output.getReason().contains("criteria")); Assert.assertEquals(ruleStepToTest, output.getStep()); + Assert.assertTrue(output.getReason().contains("8772/2 is not in the table.")); } }