Skip to content

Commit feb25e0

Browse files
Merge pull request #289 from answerdigital/feature/cosd-lung-mappings
Add COSD lung mappings
2 parents 43f32c8 + 1f09b19 commit feb25e0

File tree

64 files changed

+3671
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+3671
-0
lines changed

OmopTransformer/COSD/CosdTransformer.cs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,16 @@
66
using OmopTransformer.COSD.Colorectal.ConditionOccurrence.CosdConditionOccurrenceSecondaryDiagnosis;
77
using OmopTransformer.COSD.Colorectal.ConditionOccurrence.CosdV8ConditionOccurrencePrimaryDiagnosis;
88
using OmopTransformer.COSD.Colorectal.ConditionOccurrence.CosdV8ConditionOccurrencePrimaryDiagnosisHistologyTopography;
9+
using LungV8ConditionOccurrencePrimaryDiagnosis = OmopTransformer.COSD.Lung.ConditionOccurrence.CosdV8LungConditionOccurrencePrimaryDiagnosis.CosdV8LungConditionOccurrencePrimaryDiagnosis;
10+
using LungV8ConditionOccurrencePrimaryDiagnosisRecord = OmopTransformer.COSD.Lung.ConditionOccurrence.CosdV8LungConditionOccurrencePrimaryDiagnosis.CosdV8LungConditionOccurrencePrimaryDiagnosisRecord;
11+
using LungV8ConditionOccurrencePrimaryDiagnosisHistologyTopography = OmopTransformer.COSD.Lung.ConditionOccurrence.CosdV8LungConditionOccurrencePrimaryDiagnosisHistologyTopography.CosdV8LungConditionOccurrencePrimaryDiagnosisHistologyTopography;
12+
using LungV8ConditionOccurrencePrimaryDiagnosisHistologyTopographyRecord = OmopTransformer.COSD.Lung.ConditionOccurrence.CosdV8LungConditionOccurrencePrimaryDiagnosisHistologyTopography.CosdV8LungConditionOccurrencePrimaryDiagnosisHistologyTopographyRecord;
13+
using LungV8ConditionOccurrenceProgression = OmopTransformer.COSD.Lung.ConditionOccurrence.CosdV8LungConditionOccurrenceProgression.CosdV8LungConditionOccurrenceProgression;
14+
using LungV8ConditionOccurrenceProgressionRecord = OmopTransformer.COSD.Lung.ConditionOccurrence.CosdV8LungConditionOccurrenceProgression.CosdV8LungConditionOccurrenceProgressionRecord;
15+
using LungV9ConditionOccurrenceProgression = OmopTransformer.COSD.Lung.ConditionOccurrence.CosdV9LungConditionOccurrenceProgression.CosdV9LungConditionOccurrenceProgression;
16+
using LungV9ConditionOccurrenceProgressionRecord = OmopTransformer.COSD.Lung.ConditionOccurrence.CosdV9LungConditionOccurrenceProgression.CosdV9LungConditionOccurrenceProgressionRecord;
17+
using LungV9ConditionOccurrenceRecurrence = OmopTransformer.COSD.Lung.ConditionOccurrence.CosdV9LungConditionOccurrenceRecurrence.CosdV9LungConditionOccurrenceRecurrence;
18+
using LungV9ConditionOccurrenceRecurrenceRecord = OmopTransformer.COSD.Lung.ConditionOccurrence.CosdV9LungConditionOccurrenceRecurrence.CosdV9LungConditionOccurrenceRecurrenceRecord;
919
using OmopTransformer.COSD.Core.Death.v8Death;
1020
using OmopTransformer.COSD.Core.Death.v9DeathBasisOfDiagnosisCancer;
1121
using OmopTransformer.COSD.Core.Death.v9DeathDischargeDestination;
@@ -65,6 +75,14 @@
6575
using OmopTransformer.COSD.Colorectal.ProcedureOccurrence.CosdV8ProcedureOccurrenceProcedureOpcs;
6676
using OmopTransformer.COSD.Colorectal.ProcedureOccurrence.CosdV9ProcedureOccurrencePrimaryProcedureOpcs;
6777
using OmopTransformer.COSD.Colorectal.ProcedureOccurrence.CosdV9ProcedureOccurrenceProcedureOpcs;
78+
using LungV8ProcedureOccurrencePrimaryProcedureOpcs = OmopTransformer.COSD.Lung.ProcedureOccurrence.CosdV8LungProcedureOccurrencePrimaryProcedureOpcs.CosdV8LungProcedureOccurrencePrimaryProcedureOpcs;
79+
using LungV8ProcedureOccurrencePrimaryProcedureOpcsRecord = OmopTransformer.COSD.Lung.ProcedureOccurrence.CosdV8LungProcedureOccurrencePrimaryProcedureOpcs.CosdV8LungProcedureOccurrencePrimaryProcedureOpcsRecord;
80+
using LungV8ProcedureOccurrenceProcedureOpcs = OmopTransformer.COSD.Lung.ProcedureOccurrence.CosdV8LungProcedureOccurrenceProcedureOpcs.CosdV8LungProcedureOccurrenceProcedureOpcs;
81+
using LungV8ProcedureOccurrenceProcedureOpcsRecord = OmopTransformer.COSD.Lung.ProcedureOccurrence.CosdV8LungProcedureOccurrenceProcedureOpcs.CosdV8LungProcedureOccurrenceProcedureOpcsRecord;
82+
using LungV9ProcedureOccurrencePrimaryProcedureOpcs = OmopTransformer.COSD.Lung.ProcedureOccurrence.CosdV9LungProcedureOccurrencePrimaryProcedureOpcs.CosdV9LungProcedureOccurrencePrimaryProcedureOpcs;
83+
using LungV9ProcedureOccurrencePrimaryProcedureOpcsRecord = OmopTransformer.COSD.Lung.ProcedureOccurrence.CosdV9LungProcedureOccurrencePrimaryProcedureOpcs.CosdV9LungProcedureOccurrencePrimaryProcedureOpcsRecord;
84+
using LungV9ProcedureOccurrenceProcedureOpcs = OmopTransformer.COSD.Lung.ProcedureOccurrence.CosdV9LungProcedureOccurrenceProcedureOpcs.CosdV9LungProcedureOccurrenceProcedureOpcs;
85+
using LungV9ProcedureOccurrenceProcedureOpcsRecord = OmopTransformer.COSD.Lung.ProcedureOccurrence.CosdV9LungProcedureOccurrenceProcedureOpcs.CosdV9LungProcedureOccurrenceProcedureOpcsRecord;
6886
using OmopTransformer.Omop;
6987
using OmopTransformer.Omop.ConditionOccurrence;
7088
using OmopTransformer.Omop.Death;
@@ -206,6 +224,36 @@ await Transform<CosdV8ConditionOccurrencePrimaryDiagnosisHistologyTopographyReco
206224
runId,
207225
cancellationToken);
208226

227+
await Transform<LungV8ConditionOccurrencePrimaryDiagnosisRecord, LungV8ConditionOccurrencePrimaryDiagnosis>(
228+
_conditionOccurrenceRecorder.InsertUpdateConditionOccurrence,
229+
"Cosd V8 Lung Condition Occurrence Primary Diagnosis",
230+
runId,
231+
cancellationToken);
232+
233+
await Transform<LungV8ConditionOccurrencePrimaryDiagnosisHistologyTopographyRecord, LungV8ConditionOccurrencePrimaryDiagnosisHistologyTopography>(
234+
_conditionOccurrenceRecorder.InsertUpdateConditionOccurrence,
235+
"Cosd V8 Lung Condition Occurrence Primary Diagnosis Histology Topography",
236+
runId,
237+
cancellationToken);
238+
239+
await Transform<LungV8ConditionOccurrenceProgressionRecord, LungV8ConditionOccurrenceProgression>(
240+
_conditionOccurrenceRecorder.InsertUpdateConditionOccurrence,
241+
"Cosd V8 Lung Condition Occurrence Progression",
242+
runId,
243+
cancellationToken);
244+
245+
await Transform<LungV9ConditionOccurrenceProgressionRecord, LungV9ConditionOccurrenceProgression>(
246+
_conditionOccurrenceRecorder.InsertUpdateConditionOccurrence,
247+
"Cosd V9 Lung Condition Occurrence Progression",
248+
runId,
249+
cancellationToken);
250+
251+
await Transform<LungV9ConditionOccurrenceRecurrenceRecord, LungV9ConditionOccurrenceRecurrence>(
252+
_conditionOccurrenceRecorder.InsertUpdateConditionOccurrence,
253+
"Cosd V9 Lung Condition Occurrence Recurrence",
254+
runId,
255+
cancellationToken);
256+
209257
await Transform<CosdV8ProcedureOccurrencePrimaryProcedureOpcsRecord, CosdV8ProcedureOccurrencePrimaryProcedureOpcs>(
210258
_procedureOccurrenceRecorder.InsertUpdateProcedureOccurrence,
211259
"Cosd V8 Procedure Occurrence Primary Procedure Opcs",
@@ -230,6 +278,30 @@ await Transform<CosdV9ProcedureOccurrenceProcedureOpcsRecord, CosdV9ProcedureOcc
230278
runId,
231279
cancellationToken);
232280

281+
await Transform<LungV8ProcedureOccurrencePrimaryProcedureOpcsRecord, LungV8ProcedureOccurrencePrimaryProcedureOpcs>(
282+
_procedureOccurrenceRecorder.InsertUpdateProcedureOccurrence,
283+
"Cosd V8 Lung Procedure Occurrence Primary Procedure Opcs",
284+
runId,
285+
cancellationToken);
286+
287+
await Transform<LungV8ProcedureOccurrenceProcedureOpcsRecord, LungV8ProcedureOccurrenceProcedureOpcs>(
288+
_procedureOccurrenceRecorder.InsertUpdateProcedureOccurrence,
289+
"Cosd V8 Lung Procedure Occurrence Procedure Opcs",
290+
runId,
291+
cancellationToken);
292+
293+
await Transform<LungV9ProcedureOccurrencePrimaryProcedureOpcsRecord, LungV9ProcedureOccurrencePrimaryProcedureOpcs>(
294+
_procedureOccurrenceRecorder.InsertUpdateProcedureOccurrence,
295+
"Cosd V9 Lung Procedure Occurrence Primary Procedure Opcs",
296+
runId,
297+
cancellationToken);
298+
299+
await Transform<LungV9ProcedureOccurrenceProcedureOpcsRecord, LungV9ProcedureOccurrenceProcedureOpcs>(
300+
_procedureOccurrenceRecorder.InsertUpdateProcedureOccurrence,
301+
"Cosd V9 Lung Procedure Occurrence Procedure Opcs",
302+
runId,
303+
cancellationToken);
304+
233305
await Transform<CosdV9TobaccoSmokingStatusRecord, CosdV9TobaccoSmokingStatus>(
234306
_observationRecorder.InsertUpdateObservations,
235307
"Cosd CosdV9TobaccoSmokingStatus",

OmopTransformer/COSD/Lung/.gitkeep

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using OmopTransformer.Annotations;
2+
using OmopTransformer.Omop.ConditionOccurrence;
3+
using OmopTransformer.Transformation;
4+
5+
namespace OmopTransformer.COSD.Lung.ConditionOccurrence.CosdV8LungConditionOccurrencePrimaryDiagnosis;
6+
7+
[Notes(
8+
"Assumptions",
9+
"* Any changes in a Diagnosis that may occur in later submissions, for the same Diagnosis date, is taken to be an additional diagnosis as opposed to a change (hence removal of the original)",
10+
"* If the same Diagnosis occurs but we have 2 separate \"basis of diagnosis\" values, then the first one will be taken only")]
11+
internal class CosdV8LungConditionOccurrencePrimaryDiagnosis : OmopConditionOccurrence<CosdV8LungConditionOccurrencePrimaryDiagnosisRecord>
12+
{
13+
[CopyValue(nameof(Source.NhsNumber))]
14+
public override string? nhs_number { get; set; }
15+
16+
[Transform(typeof(DateConverter), nameof(Source.DiagnosisDate))]
17+
public override DateTime? condition_start_date { get; set; }
18+
19+
[ConstantValue(32828, "`EHR episode record`")]
20+
public override int? condition_type_concept_id { get; set; }
21+
22+
[Transform(typeof(Icd10StandardNonStandardSelector), nameof(Source.CancerDiagnosis))]
23+
public override int? condition_source_concept_id { get; set; }
24+
25+
[Transform(typeof(StandardConditionConceptSelector), useOmopTypeAsSource: true, nameof(condition_source_concept_id))]
26+
public override int[]? condition_concept_id { get; set; }
27+
28+
[CopyValue(nameof(Source.CancerDiagnosis))]
29+
public override string? condition_source_value { get; set; }
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<Query>
2+
<Sql>
3+
with lung as (
4+
select
5+
Record ->> '$.Lung.LungCore.LungCoreLinkagePatientId.NHSNumber.@extension' as NHSNumber,
6+
Record ->> '$.Lung.LungCore.LungCoreLinkageDiagnosticDetails.ClinicalDateCancerDiagnosis' as DiagnosisDate,
7+
Record ->> '$.Lung.LungCore.LungCoreLinkageDiagnosticDetails.DateOfNonPrimaryCancerDiagnosisClinicallyAgreed' as NonPrimaryDiagnosisDate,
8+
Record ->> '$.Lung.LungCore.LungCoreDiagnosis.MorphologyICDODiagnosis.@code' as CancerHistology,
9+
Record ->> '$.Lung.LungCore.LungCoreDiagnosis.TopographyICDO.@code' as CancerTopography,
10+
Record ->> '$.Lung.LungCore.LungCoreLinkageDiagnosticDetails.PrimaryDiagnosis.@code'as CancerDiagnosis
11+
from omop_staging.cosd_staging_81 lu
12+
where lu.Type = 'LU'
13+
)
14+
15+
select
16+
distinct
17+
NHSNumber,
18+
coalesce(DiagnosisDate, NonPrimaryDiagnosisDate) as DiagnosisDate,
19+
CancerHistology,
20+
CancerTopography,
21+
CancerDiagnosis
22+
from lung
23+
where NHSNumber is not null;
24+
25+
</Sql>
26+
<Explanations>
27+
<Explanation columnName="NHSNumber">
28+
<Description>Patient NHS Number</Description>
29+
<Origin>NHS NUMBER</Origin>
30+
</Explanation>
31+
<Explanation columnName="DiagnosisDate">
32+
<Description>DATE OF PRIMARY CANCER DIAGNOSIS (CLINICALLY AGREED) is the date the Primary Cancer was confirmed or the Primary Cancer diagnosis was agreed.</Description>
33+
<Origin>CLINICAL DATE CANCER DIAGNOSIS</Origin>
34+
</Explanation>
35+
<Explanation columnName="CancerHistology">
36+
<Description>MORPHOLOGY (ICD-O CANCER TRANSFORMATION) is the morphology code of the Cancer Transformation using the ICD-O CODE.</Description>
37+
<Origin>MORPHOLOGY (ICD-O CANCER TRANSFORMATION)</Origin>
38+
</Explanation>
39+
<Explanation columnName="CancerTopography">
40+
<Description>TOPOGRAPHY (ICD-O) is the topographical site of the Tumour using the ICD-O CODE.</Description>
41+
<Origin>TOPOGRAPHY (ICD-O)</Origin>
42+
</Explanation>
43+
<Explanation columnName="CancerDiagnosis">
44+
<Description>The primary diagnosis code for the cancer.</Description>
45+
<Origin>PRIMARY DIAGNOSIS</Origin>
46+
</Explanation>
47+
</Explanations>
48+
</Query>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using OmopTransformer.Annotations;
2+
3+
namespace OmopTransformer.COSD.Lung.ConditionOccurrence.CosdV8LungConditionOccurrencePrimaryDiagnosis;
4+
5+
[DataOrigin("COSD")]
6+
[Description("COSD V8 Lung Condition Occurrence Primary Diagnosis")]
7+
[SourceQuery("CosdV8LungConditionOccurrencePrimaryDiagnosis.xml")]
8+
internal class CosdV8LungConditionOccurrencePrimaryDiagnosisRecord
9+
{
10+
public string? NhsNumber { get; set; }
11+
public string? DiagnosisDate { get; set; }
12+
public string? CancerHistology { get; set; }
13+
public string? CancerTopography { get; set; }
14+
public string? CancerDiagnosis { get; set; }
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using OmopTransformer.Annotations;
2+
using OmopTransformer.Omop.ConditionOccurrence;
3+
using OmopTransformer.Transformation;
4+
5+
namespace OmopTransformer.COSD.Lung.ConditionOccurrence.CosdV8LungConditionOccurrencePrimaryDiagnosisHistologyTopography;
6+
7+
[Notes(
8+
"Assumptions",
9+
"* For a given Diagnosis date, all valid combinations of Histology and Topography are added (thereby giving us an ICD-O-3 condition) as well as the ICD10 Diagnosis.",
10+
"* Any changes in a Diagnosis that may occur in later submissions, for the same Diagnosis date, is taken to be an additional diagnosis as opposed to a change (hence removal of the original)",
11+
"* If the same Diagnosis occurs but we have 2 separate \"basis of diagnosis\" values, then the first one will be taken only")]
12+
internal class CosdV8LungConditionOccurrencePrimaryDiagnosisHistologyTopography : OmopConditionOccurrence<CosdV8LungConditionOccurrencePrimaryDiagnosisHistologyTopographyRecord>
13+
{
14+
[CopyValue(nameof(Source.NhsNumber))]
15+
public override string? nhs_number { get; set; }
16+
17+
[Transform(typeof(DateConverter), nameof(Source.DiagnosisDate))]
18+
public override DateTime? condition_start_date { get; set; }
19+
20+
[ConstantValue(32828, "`EHR episode record`")]
21+
public override int? condition_type_concept_id { get; set; }
22+
23+
[Transform(typeof(Icdo3Selector), nameof(Source.CancerHistology), nameof(Source.CancerTopography))]
24+
public override int? condition_source_concept_id { get; set; }
25+
26+
[Transform(typeof(StandardConditionConceptSelector), useOmopTypeAsSource: true, nameof(condition_source_concept_id))]
27+
public override int[]? condition_concept_id { get; set; }
28+
29+
[Transform(typeof(TextDeliminator), nameof(Source.CancerHistology), nameof(Source.CancerTopography))]
30+
public override string? condition_source_value { get; set; }
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<Query>
2+
<Sql>
3+
with lung as (
4+
select
5+
Record ->> '$.Lung.LungCore.LungCoreLinkagePatientId.NHSNumber.@extension' as NHSNumber,
6+
Record ->> '$.Lung.LungCore.LungCoreLinkageDiagnosticDetails.ClinicalDateCancerDiagnosis' as DiagnosisDate,
7+
Record ->> '$.Lung.LungCore.LungCoreLinkageDiagnosticDetails.DateOfNonPrimaryCancerDiagnosisClinicallyAgreed' as NonPrimaryDiagnosisDate,
8+
Record ->> '$.Lung.LungCore.LungCoreDiagnosis.MorphologyICDODiagnosis.@code' as CancerHistology,
9+
Record ->> '$.Lung.LungCore.LungCoreDiagnosis.TopographyICDO.@code' as CancerTopography,
10+
Record ->> '$.Lung.LungCore.LungCoreLinkageDiagnosticDetails.PrimaryDiagnosis.@code'as CancerDiagnosis
11+
from omop_staging.cosd_staging_81 lu
12+
where lu.Type = 'LU'
13+
)
14+
15+
select
16+
distinct
17+
NHSNumber,
18+
coalesce(DiagnosisDate, NonPrimaryDiagnosisDate) as DiagnosisDate,
19+
CancerHistology,
20+
CancerTopography,
21+
CancerDiagnosis
22+
from lung
23+
where NHSNumber is not null
24+
and CancerHistology is not null
25+
and CancerTopography is not null;
26+
27+
</Sql>
28+
<Explanations>
29+
<Explanation columnName="NHSNumber">
30+
<Description>Patient NHS Number</Description>
31+
<Origin>NHS NUMBER</Origin>
32+
</Explanation>
33+
<Explanation columnName="DiagnosisDate">
34+
<Description>DATE OF PRIMARY CANCER DIAGNOSIS (CLINICALLY AGREED) is the date the Primary Cancer was confirmed or the Primary Cancer diagnosis was agreed.</Description>
35+
<Origin>CLINICAL DATE CANCER DIAGNOSIS</Origin>
36+
</Explanation>
37+
<Explanation columnName="CancerHistology">
38+
<Description>MORPHOLOGY (ICD-O CANCER TRANSFORMATION) is the morphology code of the Cancer Transformation using the ICD-O CODE.</Description>
39+
<Origin>MORPHOLOGY (ICD-O CANCER TRANSFORMATION)</Origin>
40+
</Explanation>
41+
<Explanation columnName="CancerTopography">
42+
<Description>TOPOGRAPHY (ICD-O) is the topographical site of the Tumour using the ICD-O CODE.</Description>
43+
<Origin>TOPOGRAPHY (ICD-O)</Origin>
44+
</Explanation>
45+
<Explanation columnName="CancerDiagnosis">
46+
<Description>The primary diagnosis code for the cancer.</Description>
47+
<Origin>PRIMARY DIAGNOSIS</Origin>
48+
</Explanation>
49+
</Explanations>
50+
</Query>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using OmopTransformer.Annotations;
2+
3+
namespace OmopTransformer.COSD.Lung.ConditionOccurrence.CosdV8LungConditionOccurrencePrimaryDiagnosisHistologyTopography;
4+
5+
[DataOrigin("COSD")]
6+
[Description("COSD V8 Lung Condition Occurrence Primary Diagnosis Histology Topography")]
7+
[SourceQuery("CosdV8LungConditionOccurrencePrimaryDiagnosisHistologyTopography.xml")]
8+
internal class CosdV8LungConditionOccurrencePrimaryDiagnosisHistologyTopographyRecord
9+
{
10+
public string? NhsNumber { get; set; }
11+
public string? DiagnosisDate { get; set; }
12+
public string? CancerHistology { get; set; }
13+
public string? CancerTopography { get; set; }
14+
public string? CancerDiagnosis { get; set; }
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using OmopTransformer.Annotations;
2+
using OmopTransformer.Omop.ConditionOccurrence;
3+
using OmopTransformer.Transformation;
4+
5+
namespace OmopTransformer.COSD.Lung.ConditionOccurrence.CosdV8LungConditionOccurrenceProgression;
6+
7+
[Notes(
8+
"Assumptions",
9+
"* Any changes in a Diagnosis that may occur in later submissions, for the same Diagnosis date, is taken to be an additional diagnosis as opposed to a change (hence removal of the original)",
10+
"* If the same Diagnosis occurs but we have 2 separate \"basis of diagnosis\" values, then the first one will be taken only")]
11+
internal class CosdV8LungConditionOccurrenceProgression : OmopConditionOccurrence<CosdV8LungConditionOccurrenceProgressionRecord>
12+
{
13+
[CopyValue(nameof(Source.NhsNumber))]
14+
public override string? nhs_number { get; set; }
15+
16+
[Transform(typeof(DateConverter), nameof(Source.NonPrimaryDiagnosisDate))]
17+
public override DateTime? condition_start_date { get; set; }
18+
19+
[ConstantValue(32828, "`EHR episode record`")]
20+
public override int? condition_type_concept_id { get; set; }
21+
22+
[Transform(typeof(Icd10StandardNonStandardSelector), nameof(Source.NonPrimaryProgressionOriginalDiagnosis))]
23+
public override int? condition_source_concept_id { get; set; }
24+
25+
[Transform(typeof(StandardConditionConceptSelector), useOmopTypeAsSource: true, nameof(condition_source_concept_id))]
26+
public override int[]? condition_concept_id { get; set; }
27+
28+
[CopyValue(nameof(Source.NonPrimaryProgressionOriginalDiagnosis))]
29+
public override string? condition_source_value { get; set; }
30+
}

0 commit comments

Comments
 (0)