use of com.hartwig.hmftools.patientdb.data.BiopsyData in project hmftools by hartwigmedical.
the class PatientReader method read.
@NotNull
public Patient read(@NotNull final EcrfPatient ecrfPatient, @NotNull final List<SampleData> sequencedSamples) throws IOException {
LOGGER.info("Reading patient " + ecrfPatient.patientId() + " with samples: " + sequencedSamples);
final BaselineData baselineData = cpctPatientReader.read(ecrfPatient);
final PreTreatmentData preTreatmentData = preTreatmentReader.read(ecrfPatient);
final List<BiopsyData> clinicalBiopsies = BiopsyReader.read(ecrfPatient);
final List<BiopsyTreatmentData> treatments = biopsyTreatmentReader.read(ecrfPatient);
final List<BiopsyTreatmentResponseData> treatmentResponses = BiopsyTreatmentResponseReader.read(ecrfPatient);
final List<TumorMarkerData> tumorMarkers = TumorMarkerReader.read(ecrfPatient);
final MatchResult<BiopsyData> matchedBiopsies = BiopsyMatcher.matchBiopsiesToTumorSamples(ecrfPatient.patientId(), sequencedSamples, clinicalBiopsies);
final MatchResult<BiopsyTreatmentData> matchedTreatments = TreatmentMatcher.matchTreatmentsToBiopsies(ecrfPatient.patientId(), clinicalBiopsies, treatments);
final MatchResult<BiopsyTreatmentResponseData> matchedResponses = TreatmentResponseMatcher.matchTreatmentResponsesToTreatments(ecrfPatient.patientId(), treatments, treatmentResponses);
final List<ValidationFinding> findings = Lists.newArrayList();
findings.addAll(matchedBiopsies.findings());
findings.addAll(matchedTreatments.findings());
findings.addAll(matchedResponses.findings());
return new Patient(ecrfPatient.patientId(), baselineData, preTreatmentData, sequencedSamples, matchedBiopsies.values(), matchedTreatments.values(), matchedResponses.values(), tumorMarkers, findings);
}
use of com.hartwig.hmftools.patientdb.data.BiopsyData in project hmftools by hartwigmedical.
the class PatientValidator method validateInformedConsentDate.
@NotNull
static List<ValidationFinding> validateInformedConsentDate(@NotNull final String patientIdentifier, @NotNull final BaselineData baselineData, @NotNull final List<BiopsyData> biopsies) {
final List<ValidationFinding> findings = Lists.newArrayList();
final LocalDate informedConsentDate = baselineData.informedConsentDate();
if (informedConsentDate != null && !biopsies.isEmpty()) {
final List<BiopsyData> biopsiesPriorToInformedConsent = biopsies.stream().filter(biopsy -> {
final LocalDate biopsyDate = biopsy.date();
return biopsyDate != null && biopsyDate.isBefore(informedConsentDate);
}).collect(Collectors.toList());
if (biopsiesPriorToInformedConsent.size() > 0) {
final String detailsMessage = "informedConsentDate: " + informedConsentDate + ". biopsies: " + biopsiesPriorToInformedConsent.stream().map(BiopsyData::toString).collect(Collectors.toList());
FormStatusState best = baselineData.informedConsentStatus();
boolean locked = baselineData.informedConsentLocked();
for (BiopsyData biopsy : biopsies) {
best = FormStatusState.best(best, biopsy.formStatus());
locked = locked || biopsy.formLocked();
}
findings.add(ValidationFinding.of(ECRF_LEVEL, patientIdentifier, fields(FIELD_INFORMED_CONSENT_DATE, FIELD_BIOPSY_DATE), "at least 1 biopsy taken before informed consent date", best, locked, detailsMessage));
}
}
return findings;
}
use of com.hartwig.hmftools.patientdb.data.BiopsyData in project hmftools by hartwigmedical.
the class PatientReaderTest method canReadCpctPatientBiopsies.
@Test
public void canReadCpctPatientBiopsies() {
final CpctEcrfModel model = loadTestEcrf();
assertEquals(1, model.patientCount());
final EcrfPatient cpctPatient = model.patients().iterator().next();
final List<BiopsyData> biopsies = BiopsyReader.read(cpctPatient);
assertEquals(1, biopsies.size());
assertEquals("Soft tissue", biopsies.get(0).site());
assertEquals("near right scapula", biopsies.get(0).location());
assertEquals(LocalDate.parse("2012-02-17", DATE_FORMATTER), biopsies.get(0).date());
}
use of com.hartwig.hmftools.patientdb.data.BiopsyData in project hmftools by hartwigmedical.
the class TreatmentMatcher method matchTreatmentsToBiopsies.
@NotNull
public static MatchResult<BiopsyTreatmentData> matchTreatmentsToBiopsies(@NotNull final String patientId, @NotNull final List<BiopsyData> biopsies, @NotNull final List<BiopsyTreatmentData> treatments) {
final List<BiopsyTreatmentData> matchedTreatments = Lists.newArrayList();
final List<ValidationFinding> findings = Lists.newArrayList();
List<BiopsyData> remainingBiopsies = biopsies;
for (final BiopsyTreatmentData treatment : treatments) {
final String treatmentGiven = treatment.treatmentGiven();
if (treatmentGiven == null || treatmentGiven.toLowerCase().equals("no")) {
matchedTreatments.add(treatment);
continue;
}
final Map<Boolean, List<BiopsyData>> partitions = remainingBiopsies.stream().collect(Collectors.partitioningBy(clinicalBiopsy -> isPossibleMatch(clinicalBiopsy.date(), treatment.startDate())));
final List<BiopsyData> possibleMatches = partitions.get(true);
if (possibleMatches.size() == 0) {
findings.add(treatmentMatchFinding(patientId, "no biopsy match for treatment", treatment.toString()));
matchedTreatments.add(treatment);
} else if (possibleMatches.size() > 1) {
findings.add(treatmentMatchFinding(patientId, "multiple biopsy matches for treatment", treatment + ". biopsies: " + possibleMatches.stream().map(BiopsyData::toString).collect(Collectors.toList())));
matchedTreatments.add(treatment);
} else if (possibleMatches.get(0).date() == null) {
findings.add(treatmentMatchFinding(patientId, "treatment matched biopsy with null date.", treatment.toString()));
matchedTreatments.add(treatment);
} else {
final BiopsyData clinicalBiopsy = possibleMatches.get(0);
matchedTreatments.add(ImmutableBiopsyTreatmentData.builder().from(treatment).biopsyId(clinicalBiopsy.id()).build());
remainingBiopsies = partitions.get(false);
}
}
return new MatchResult<>(matchedTreatments, findings);
}
use of com.hartwig.hmftools.patientdb.data.BiopsyData in project hmftools by hartwigmedical.
the class BiopsyReader method read.
@NotNull
static List<BiopsyData> read(@NotNull final EcrfPatient patient) {
final List<BiopsyData> biopsies = Lists.newArrayList();
for (final EcrfStudyEvent studyEvent : patient.studyEventsPerOID(STUDY_BIOPSY)) {
for (final EcrfForm form : studyEvent.nonEmptyFormsPerOID(FORM_BIOPS, false)) {
String biopsyTaken = null;
String biopsyEvaluable = null;
// KODU: This works as there is generally a 1:N relation between BIOPSY and BIOPSIES item groups.
for (final EcrfItemGroup biopsyGroup : form.nonEmptyItemGroupsPerOID(ITEMGROUP_BIOPSY, false)) {
biopsyTaken = biopsyGroup.readItemString(FIELD_BIOPSY_TAKEN, 0, false);
biopsyEvaluable = biopsyGroup.readItemString(FIELD_BIOPSY_EVALUABLE, 0, false);
}
for (final EcrfItemGroup biopsiesGroup : form.nonEmptyItemGroupsPerOID(ITEMGROUP_BIOPSIES, false)) {
final LocalDate date = biopsiesGroup.readItemDate(FIELD_BIOPSY_DATE, 0, DATE_FORMATTER, false);
final String location = biopsiesGroup.readItemString(FIELD_LOCATION, 0, false);
final String site = biopsiesGroup.readItemString(FIELD_SITE, 0, false);
final String siteOther = biopsiesGroup.readItemString(FIELD_SITE_OTHER, 0, false);
final String finalSite = (site == null || site.trim().toLowerCase().startsWith("other")) ? siteOther : site;
BiopsyData biopsy = ImmutableBiopsyData.of(date, biopsyTaken, biopsyEvaluable, finalSite, location, form.status(), form.locked());
// form needed to be created for every treatment response.
if (!isDuplicate(biopsies, biopsy) && !isEmpty(biopsy)) {
biopsies.add(biopsy);
}
}
}
}
return biopsies;
}
Aggregations