Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/main/java/com/imsweb/algorithms/Algorithms.java
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ public final class Algorithms {
public static final String FIELD_RURAL_CONT_1993 = "ruralurbanContinuum1993";
public static final String FIELD_RURAL_CONT_2003 = "ruralurbanContinuum2003";
public static final String FIELD_RURAL_CONT_2013 = "ruralurbanContinuum2013";
public static final String FIELD_RURAL_CONT_2023 = "ruralurbanContinuum2023";
public static final String FIELD_SURV_VS_RECODE = "vitalStatusRecode";
public static final String FIELD_SURV_DX_DATE_RECODE = "survDateDxRecode";
public static final String FIELD_SURV_DATE_ACTIVE_FUP = "survDateActiveFollowup";
Expand Down Expand Up @@ -358,6 +359,7 @@ public static void initialize() {
addField(AlgorithmField.of(FIELD_ICCC_EXT, 9422, 3, "Int Class of Childhood Cancer (ICCC) Extended Code", "ICCC Ext", DATA_LEVEL_TUMOR, false));
addField(AlgorithmField.of(FIELD_IARC_MP_INDICATOR, 9400, 1, "IARC Multiple Primary Indicator", "IARC MP", DATA_LEVEL_TUMOR, false));
addField(AlgorithmField.of(FIELD_COUNTY_AT_DX_ANALYSIS_FLAG, 9440, 4, "County at DX Analysis Flag", "DX Anlys Cty Fg", DATA_LEVEL_TUMOR, false));
addField(AlgorithmField.of(FIELD_RURAL_CONT_2023, 9470, 2, "RuralUrban Continuum 2023", "Rur Urb Cont 23", DATA_LEVEL_TUMOR, false));
addField(AlgorithmField.of(FIELD_IHS_PRCDA_2017, 9970, 1, "IHS PRCDA 2017", "IHS PRCDA 2017", DATA_LEVEL_TUMOR, false));
addField(AlgorithmField.of(FIELD_ACS_YOST_QUINTILE_US, 9610, 1, "Yost Quintile (Across States)", "Yost US", DATA_LEVEL_TUMOR, false));
addField(AlgorithmField.of(FIELD_ACS_YOST_QUINTILE_STATE, 9611, 1, "Yost Quintile (State Specific)", "Yost State", DATA_LEVEL_TUMOR, false));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,7 @@ public void initializeContinuumData(String requestedState, Map<String, Map<Strin
countyData.setUrbanContinuum1993(countyEntry.getValue().getUrbanContinuum1993());
countyData.setUrbanContinuum2003(countyEntry.getValue().getUrbanContinuum2003());
countyData.setUrbanContinuum2013(countyEntry.getValue().getUrbanContinuum2013());
countyData.setUrbanContinuum2023(countyEntry.getValue().getUrbanContinuum2023());
}
}
}
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/com/imsweb/algorithms/internal/CountyData.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public class CountyData {
private String _urbanContinuum1993;
private String _urbanContinuum2003;
private String _urbanContinuum2013;
private String _urbanContinuum2023;

// census data keyed by census tract code
private Map<String, CensusData> _censusData = new HashMap<>();
Expand Down Expand Up @@ -81,6 +82,14 @@ public void setUrbanContinuum2013(String urbanContinuum2013) {
_urbanContinuum2013 = urbanContinuum2013;
}

public String getUrbanContinuum2023() {
return _urbanContinuum2023;
}

public void setUrbanContinuum2023(String urbanContinuum2023) {
_urbanContinuum2023 = urbanContinuum2023;
}

/**
* Returns the census data for a given census tract code, null if not found.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import static com.imsweb.algorithms.Algorithms.FIELD_RURAL_CONT_1993;
import static com.imsweb.algorithms.Algorithms.FIELD_RURAL_CONT_2003;
import static com.imsweb.algorithms.Algorithms.FIELD_RURAL_CONT_2013;
import static com.imsweb.algorithms.Algorithms.FIELD_RURAL_CONT_2023;
import static com.imsweb.algorithms.Algorithms.FIELD_STATE_DX;
import static com.imsweb.algorithms.Algorithms.FIELD_URIC_2000;
import static com.imsweb.algorithms.Algorithms.FIELD_URIC_2010;
Expand Down Expand Up @@ -72,9 +73,11 @@ public RuralUrbanAlgorithm() {
_outputFields.add(Algorithms.getField(FIELD_RURAL_CONT_1993));
_outputFields.add(Algorithms.getField(FIELD_RURAL_CONT_2003));
_outputFields.add(Algorithms.getField(FIELD_RURAL_CONT_2013));
_outputFields.add(Algorithms.getField(FIELD_RURAL_CONT_2023));
_unknownValues.put(FIELD_RURAL_CONT_1993, Arrays.asList(CONTINUUM_UNK_96, CONTINUUM_UNK_97, CONTINUUM_UNK_98, CONTINUUM_UNK_99));
_unknownValues.put(FIELD_RURAL_CONT_2003, Arrays.asList(CONTINUUM_UNK_96, CONTINUUM_UNK_97, CONTINUUM_UNK_98, CONTINUUM_UNK_99));
_unknownValues.put(FIELD_RURAL_CONT_2013, Arrays.asList(CONTINUUM_UNK_96, CONTINUUM_UNK_97, CONTINUUM_UNK_98, CONTINUUM_UNK_99));
_unknownValues.put(FIELD_RURAL_CONT_2023, Arrays.asList(CONTINUUM_UNK_96, CONTINUUM_UNK_97, CONTINUUM_UNK_98, CONTINUUM_UNK_99));
}

@Override
Expand Down Expand Up @@ -102,6 +105,7 @@ public AlgorithmOutput execute(AlgorithmInput input) {
outputTumor.put(FIELD_RURAL_CONT_1993, continuumOutputDto.getRuralUrbanContinuum1993());
outputTumor.put(FIELD_RURAL_CONT_2003, continuumOutputDto.getRuralUrbanContinuum2003());
outputTumor.put(FIELD_RURAL_CONT_2013, continuumOutputDto.getRuralUrbanContinuum2013());
outputTumor.put(FIELD_RURAL_CONT_2023, continuumOutputDto.getRuralUrbanContinuum2023());

outputTumors.add(outputTumor);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,11 @@ public String getRuralUrbanContinuum(String bealeCategory, String state, String
case RuralUrbanUtils.BEALE_CATEGORY_2013:
result = countyData.getUrbanContinuum2013();
break;
case RuralUrbanUtils.BEALE_CATEGORY_2023:
result = countyData.getUrbanContinuum2023();
break;
default:
throw new IllegalStateException("Invalid beale category: " + bealeCategory);
throw new IllegalStateException("Unknown bealeCategory: " + bealeCategory);
}

return result == null ? RURAL_URBAN_CONTINUUM_UNKNOWN : result;
Expand Down Expand Up @@ -170,6 +173,16 @@ private Map<String, Map<String, CountyData>> loadRuralUrbanContinuumData() {
dto.setUrbanContinuum2013(StringUtils.leftPad(val, 2, '0'));
});

// load 2023 data
Utils.processInternalFile("ruralurban/rural-urban-continuum-2023.csv", line -> {
String state = line.getField(0);
String county = line.getField(1);
String val = line.getField(2);

CountyData dto = result.computeIfAbsent(state, k -> new HashMap<>()).computeIfAbsent(county, k -> new CountyData());
dto.setUrbanContinuum2023(StringUtils.leftPad(val, 2, '0'));
});

return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public class RuralUrbanOutputDto {
private String _ruralUrbanContinuum1993;
private String _ruralUrbanContinuum2003;
private String _ruralUrbanContinuum2013;
private String _ruralUrbanContinuum2023;

public String getUrbanRuralIndicatorCode2000() {
return _urbanRuralIndicatorCode2000;
Expand Down Expand Up @@ -45,6 +46,10 @@ public String getRuralUrbanContinuum2013() {
return _ruralUrbanContinuum2013;
}

public String getRuralUrbanContinuum2023() {
return _ruralUrbanContinuum2023;
}

public void setUrbanRuralIndicatorCode2000(String urbanRuralIndicatorCode2000) {
_urbanRuralIndicatorCode2000 = urbanRuralIndicatorCode2000;
}
Expand Down Expand Up @@ -89,4 +94,8 @@ public void setRuralUrbanContinuum2013(String ruralUrbanContinuum2013) {
_ruralUrbanContinuum2013 = ruralUrbanContinuum2013;
}

public void setRuralUrbanContinuum2023(String ruralUrbanContinuum2023) {
_ruralUrbanContinuum2023 = ruralUrbanContinuum2023;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public final class RuralUrbanUtils {
public static final String BEALE_CATEGORY_1993 = "1993";
public static final String BEALE_CATEGORY_2003 = "2003";
public static final String BEALE_CATEGORY_2013 = "2013";
public static final String BEALE_CATEGORY_2023 = "2023";

public static final String TRACT_CATEGORY_2000 = "2000";
public static final String TRACT_CATEGORY_2010 = "2010";
Expand Down Expand Up @@ -135,7 +136,6 @@ else if (input.countyIsNotReported())
* </ul>
* All those properties are defined as constants in this class.
* <br/><br/>
* The returned urban rural commuting area will have the following values depending on the year (1993, 2003, or 2013):
* The returned urban rural commuting area will have the following values depending on the census tract (2000, or 2010):
* <ul>
* <li>1 = Urban commuting area - RUCA codes 1.0, 1.1, 2.0, 2.1, 3.0, 4.1, 5.1, 7.1, 8.1, and 10.1</li>
Expand Down Expand Up @@ -198,7 +198,7 @@ else if (input.countyIsNotReported())
}

/**
* Calculates the rural urban continuum (ruralUrbanContinuum1993, ruralUrbanContinuum2003, ruralUrbanContinuum2013) input DTO.
* Calculates the rural urban continuum (ruralUrbanContinuum1993, ruralUrbanContinuum2003, ruralUrbanContinuum2013, ruralUrbanContinuum2023) for the provided input DTO.
* <br/><br/>
* The provided input dto has the following parameters used in the calculation:
* <ul>
Expand All @@ -207,7 +207,7 @@ else if (input.countyIsNotReported())
* </ul>
* All those properties are defined as constants in this class.
* <br/><br/>
* The returned urban rural continuum will have the following values depending on the year (1993, 2003, or 2013):
* The returned urban rural continuum will have the following values depending on the year (1993, 2003, 2013, or 2023):
* <ul>
* <li>00 = Central counties of metro areas of 1 million population or more (1993 only)</li>
* <li>01 = Counties of metro areas of 1 million population or more</li>
Expand Down Expand Up @@ -237,21 +237,25 @@ public static RuralUrbanOutputDto computeRuralUrbanContinuum(StateCountyTractInp
result.setRuralUrbanContinuum1993("96");
result.setRuralUrbanContinuum2003("96");
result.setRuralUrbanContinuum2013("96");
result.setRuralUrbanContinuum2023("96");
}
else if (input.hasUnknownStateOrCounty()) {
result.setRuralUrbanContinuum1993("99");
result.setRuralUrbanContinuum2003("99");
result.setRuralUrbanContinuum2013("99");
result.setRuralUrbanContinuum2023("99");
}
else if (input.countyIsNotReported()) {
result.setRuralUrbanContinuum1993("97");
result.setRuralUrbanContinuum2003("97");
result.setRuralUrbanContinuum2013("97");
result.setRuralUrbanContinuum2023("97");
}
else {
result.setRuralUrbanContinuum1993(_PROVIDER.getRuralUrbanContinuum(BEALE_CATEGORY_1993, input.getAddressAtDxState(), input.getCountyAtDxAnalysis()));
result.setRuralUrbanContinuum2003(_PROVIDER.getRuralUrbanContinuum(BEALE_CATEGORY_2003, input.getAddressAtDxState(), input.getCountyAtDxAnalysis()));
result.setRuralUrbanContinuum2013(_PROVIDER.getRuralUrbanContinuum(BEALE_CATEGORY_2013, input.getAddressAtDxState(), input.getCountyAtDxAnalysis()));
result.setRuralUrbanContinuum2023(_PROVIDER.getRuralUrbanContinuum(BEALE_CATEGORY_2023, input.getAddressAtDxState(), input.getCountyAtDxAnalysis()));
}

if (result.getRuralUrbanContinuum1993() == null)
Expand All @@ -260,6 +264,8 @@ else if (input.countyIsNotReported()) {
result.setRuralUrbanContinuum2003(RURAL_URBAN_CONTINUUM_UNKNOWN);
if (result.getRuralUrbanContinuum2013() == null)
result.setRuralUrbanContinuum2013(RURAL_URBAN_CONTINUUM_UNKNOWN);
if (result.getRuralUrbanContinuum2023() == null)
result.setRuralUrbanContinuum2023(RURAL_URBAN_CONTINUUM_UNKNOWN);

return result;
}
Expand Down
6 changes: 4 additions & 2 deletions src/main/resources/ruralurban/readme.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
The data for the "NAACCR Rural Urban Program" was provided by NAACCR.
The data for the "NAACCR Rural Urban Program" was obtained from the USDA website.

No more information is available.
https://www.ers.usda.gov/data-products/rural-urban-continuum-codes

Virgin Islands (present in the UDSA data in 2013 and 2023) was excluded.

Line 548 in rural-urban-continuum-1993.csv was changed from 9 to 5

Expand Down
Loading
Loading