From 96a355159e6c6ebf1852acf15c8d150b379a7f8b Mon Sep 17 00:00:00 2001 From: Samantha Emerson Date: Tue, 23 Mar 2021 13:16:02 -0400 Subject: [PATCH 01/11] Add initial custom header logic to TFP v3.2 builder --- nacc/uds3/tfp/v3_2/builder.py | 73 +++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/nacc/uds3/tfp/v3_2/builder.py b/nacc/uds3/tfp/v3_2/builder.py index e665dde..93d407a 100644 --- a/nacc/uds3/tfp/v3_2/builder.py +++ b/nacc/uds3/tfp/v3_2/builder.py @@ -861,11 +861,76 @@ def update_header(record, packet): for header in packet: header.PACKET = "T" header.FORMID = header.form_name + + # Custom header info + formdate = '' + formrater = '' + try: + if header.FORMID.value == "T1": + formdate = record['tfp_t1_date'] + formrater = record['tfp_t1_rater'] + elif header.FORMID.value == "A1": + formdate = record['tfp_a1_date'] + formrater = record['tfp_a1_rater'] + elif header.FORMID.value == "A2": + formdate = record['tfp_a2_date'] + formrater = record['tfp_a2_rater'] + elif header.FORMID.value == "A3": + formdate = record['tfp_a3_date'] + formrater = record['tfp_a3_rater'] + elif header.FORMID.value == "A4D": + formdate = record['tfp_a4d_date'] + formrater = record['tfp_a4d_rater'] + elif header.FORMID.value == "A4G": + formdate = record['tfp_a4g_date'] + formrater = record['tfp_a4g_rater'] + elif header.FORMID.value == "B4": + formdate = record['tfp_b4_date'] + formrater = record['tfp_b4_rater'] + elif header.FORMID.value == "B5": + formdate = record['tfp_b5_date'] + formrater = record['tfp_b5_rater'] + elif header.FORMID.value == "B7": + formdate = record['tfp_b7_date'] + formrater = record['tfp_b7_rater'] + elif header.FORMID.value == "B9": + formdate = record['tfp_b9_date'] + formrater = record['tfp_b9_rater'] + elif header.FORMID.value == "C2": + formdate = record['tfp_c2_date'] + formrater = record['tfp_c2_rater'] + elif header.FORMID.value == "D1": + formdate = record['tfp_d1_date'] + formrater = record['tfp_d1_rater'] + elif header.FORMID.value == "D2": + formdate = record['tfp_d2_date'] + formrater = record['tfp_d2_rater'] + elif header.FORMID.value == "Z1X": + formdate = record['tfp_z1x_date'] + formrater = record['tfp_z1x_rater'] + # Date should be format of yyyy-mm-dd. If not, + # then use form header defaults. + if len(formdate.split("-")) == 3: + yyyy = formdate.split("-")[0] + mm = formdate.split("-")[1] + dd = formdate.split("-")[2] + else: + yyyy = record['visityr'] + mm = record['visitmo'] + dd = record['visitday'] + header.VISITMO = mm + header.VISITDAY = dd + header.VISITYR = yyyy + except KeyError: + header.VISITMO = record['visitmo'] + header.VISITDAY = record['visitday'] + header.VISITYR = record['visityr'] + header.FORMVER = "3.2" header.ADCID = record['adcid'] header.PTID = record['ptid'] - header.VISITMO = record['visitmo'] - header.VISITDAY = record['visitday'] - header.VISITYR = record['visityr'] header.VISITNUM = record['visitnum'] - header.INITIALS = record['initials'] \ No newline at end of file + if formrater is not None: + header.INITIALS = formrater + else: + header.INITIALS = record['initials'] \ No newline at end of file From fe85a99af5cafcb63ff4d2686d348d0711ec977d Mon Sep 17 00:00:00 2001 From: Samantha Emerson Date: Tue, 23 Mar 2021 13:23:32 -0400 Subject: [PATCH 02/11] Make C2T optional on tfp builder to reflect nacc's ded --- nacc/uds3/tfp/v3_2/builder.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/nacc/uds3/tfp/v3_2/builder.py b/nacc/uds3/tfp/v3_2/builder.py index 93d407a..6e16093 100644 --- a/nacc/uds3/tfp/v3_2/builder.py +++ b/nacc/uds3/tfp/v3_2/builder.py @@ -57,9 +57,12 @@ def build_uds3_tfp_new_form(record, err=sys.stderr): add_b7(record, packet) except KeyError: pass - - add_b9(record, packet) - add_c2t(record, packet) + add_b9(record, packet) + try: + if record['tele_c2sub'] == '1': + add_c2t(record, packet) + except KeyError: + pass add_d1(record, packet) add_d2(record, packet) try: From d700ea021939b609c4635594c76c09e5ee8ee1a8 Mon Sep 17 00:00:00 2001 From: Samantha Emerson Date: Tue, 23 Mar 2021 13:31:44 -0400 Subject: [PATCH 03/11] Repair tfp unit test to account for now-optional c2t --- tests/test_tfp_blanks.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_tfp_blanks.py b/tests/test_tfp_blanks.py index ce7bd49..b73d251 100644 --- a/tests/test_tfp_blanks.py +++ b/tests/test_tfp_blanks.py @@ -165,7 +165,7 @@ def make_filled_form() -> dict: 'tele_b7not': '', 'tele_langb9': '', 'tele_langc2': '', - 'tele_c2sub': '', + 'tele_c2sub': '1', 'tele_c2not': '', 'tele_langd1': '', 'tele_langd2': '', @@ -188,6 +188,7 @@ def make_filled_form() -> dict: 'tele_lange3f': '', 'tele_langcls': '', 'tele_clssub': '', + 'tvp_z1x_checklist_complete': '2', 'telcog': '', 'telill': '', 'telhome': '', From a6c5d2c28da608cecc8b1711502f7b2ce39cf53b Mon Sep 17 00:00:00 2001 From: Samantha Emerson Date: Tue, 23 Mar 2021 14:27:48 -0400 Subject: [PATCH 04/11] Add initial custom header logic to all multi-form builder files --- nacc/ftld/fvp/builder.py | 67 +++++++++++++++++++++++++-- nacc/ftld/ivp/builder.py | 67 +++++++++++++++++++++++++-- nacc/lbd/fvp/builder.py | 73 ++++++++++++++++++++++++++++-- nacc/lbd/ivp/builder.py | 73 ++++++++++++++++++++++++++++-- nacc/lbd/v3_1/fvp/builder.py | 70 +++++++++++++++++++++++++++-- nacc/lbd/v3_1/ivp/builder.py | 70 +++++++++++++++++++++++++++-- nacc/uds3/fvp/builder.py | 82 +++++++++++++++++++++++++++++++-- nacc/uds3/ivp/builder.py | 85 +++++++++++++++++++++++++++++++++-- nacc/uds3/tfp/v3_2/builder.py | 6 +-- 9 files changed, 558 insertions(+), 35 deletions(-) diff --git a/nacc/ftld/fvp/builder.py b/nacc/ftld/fvp/builder.py index 95e97ed..da9bbd2 100644 --- a/nacc/ftld/fvp/builder.py +++ b/nacc/ftld/fvp/builder.py @@ -477,8 +477,67 @@ def update_header(record, packet): header.FORMVER = 3 header.ADCID = record['adcid'] header.PTID = record['ptid'] - header.VISITMO = record['visitmo'] - header.VISITDAY = record['visitday'] - header.VISITYR = record['visityr'] + + # Custom header info + formdate = '' + formrater = '' + try: + if header.FORMID.value == "Z1X": + formdate = record['fu_z1x_date'] + formrater = record['fu_z1x_rater'] + elif header.FORMID.value == "A3A": + formdate = record['fu_a3a_date'] + formrater = record['fu_a3a_rater'] + elif header.FORMID.value == "B3F": + formdate = record['fu_b3f_date'] + formrater = record['fu_b3f_rater'] + elif header.FORMID.value == "B9F": + formdate = record['fu_b9f_date'] + formrater = record['fu_b9f_rater'] + elif header.FORMID.value == "C1F": + formdate = record['fu_c1f_date'] + formrater = record['fu_c1f_rater'] + elif header.FORMID.value == "C2F": + formdate = record['fu_c2f_date'] + formrater = record['fu_c2f_rater'] + elif header.FORMID.value == "C3F": + formdate = record['fu_c3f_date'] + formrater = record['fu_c3f_rater'] + elif header.FORMID.value == "C4F": + formdate = record['fu_c4f_date'] + formrater = record['fu_c4f_rater'] + elif header.FORMID.value == "C5F": + formdate = record['fu_c5f_date'] + formrater = record['fu_c5f_rater'] + elif header.FORMID.value == "C6F": + formdate = record['fu_c6f_date'] + formrater = record['fu_c6f_rater'] + elif header.FORMID.value == "E2F": + formdate = record['fu_e2f_date'] + formrater = record['fu_e2f_rater'] + elif header.FORMID.value == "E3F": + formdate = record['fu_e3f_date'] + formrater = record['fu_e3f_rater'] + # Date should be format of yyyy-mm-dd. If not, + # then use form header defaults. + if len(formdate.split("-")) == 3: + yyyy = formdate.split("-")[0] + mm = formdate.split("-")[1] + dd = formdate.split("-")[2] + else: + yyyy = record['visityr'] + mm = record['visitmo'] + dd = record['visitday'] + header.VISITMO = mm + header.VISITDAY = dd + header.VISITYR = yyyy + except KeyError: + header.VISITMO = record['visitmo'] + header.VISITDAY = record['visitday'] + header.VISITYR = record['visityr'] + header.VISITNUM = record['visitnum'] - header.INITIALS = record['initials'] + if formrater is not None: + header.INITIALS = formrater + else: + header.INITIALS = record['initials'] diff --git a/nacc/ftld/ivp/builder.py b/nacc/ftld/ivp/builder.py index 3f82c6e..50021af 100644 --- a/nacc/ftld/ivp/builder.py +++ b/nacc/ftld/ivp/builder.py @@ -478,8 +478,67 @@ def update_header(record, packet): header.FORMVER = 3 header.ADCID = record['adcid'] header.PTID = record['ptid'] - header.VISITMO = record['visitmo'] - header.VISITDAY = record['visitday'] - header.VISITYR = record['visityr'] + + # Custom header info + formdate = '' + formrater = '' + try: + if header.FORMID.value == "Z1X": + formdate = record['z1x_date'] + formrater = record['z1x_rater'] + elif header.FORMID.value == "A3A": + formdate = record['a3a_date'] + formrater = record['a3a_rater'] + elif header.FORMID.value == "B3F": + formdate = record['b3f_date'] + formrater = record['b3f_rater'] + elif header.FORMID.value == "B9F": + formdate = record['b9f_date'] + formrater = record['b9f_rater'] + elif header.FORMID.value == "C1F": + formdate = record['c1f_date'] + formrater = record['c1f_rater'] + elif header.FORMID.value == "C2F": + formdate = record['c2f_date'] + formrater = record['c2f_rater'] + elif header.FORMID.value == "C3F": + formdate = record['c3f_date'] + formrater = record['c3f_rater'] + elif header.FORMID.value == "C4F": + formdate = record['c4f_date'] + formrater = record['c4f_rater'] + elif header.FORMID.value == "C5F": + formdate = record['c5f_date'] + formrater = record['c5f_rater'] + elif header.FORMID.value == "C6F": + formdate = record['c6f_date'] + formrater = record['c6f_rater'] + elif header.FORMID.value == "E2F": + formdate = record['e2f_date'] + formrater = record['e2f_rater'] + elif header.FORMID.value == "E3F": + formdate = record['e3f_date'] + formrater = record['e3f_rater'] + # Date should be format of yyyy-mm-dd. If not, + # then use form header defaults. + if len(formdate.split("-")) == 3: + yyyy = formdate.split("-")[0] + mm = formdate.split("-")[1] + dd = formdate.split("-")[2] + else: + yyyy = record['visityr'] + mm = record['visitmo'] + dd = record['visitday'] + header.VISITMO = mm + header.VISITDAY = dd + header.VISITYR = yyyy + except KeyError: + header.VISITMO = record['visitmo'] + header.VISITDAY = record['visitday'] + header.VISITYR = record['visityr'] + header.VISITNUM = record['visitnum'] - header.INITIALS = record['initials'] + if formrater is not None: + header.INITIALS = formrater + else: + header.INITIALS = record['initials'] diff --git a/nacc/lbd/fvp/builder.py b/nacc/lbd/fvp/builder.py index 2b575e3..f90dc9d 100644 --- a/nacc/lbd/fvp/builder.py +++ b/nacc/lbd/fvp/builder.py @@ -504,8 +504,73 @@ def update_header(record, packet): header.FORMVER = 3 header.ADCID = record['adcid'] header.PTID = record['ptid'] - header.VISITMO = record['visitmo'] - header.VISITDAY = record['visitday'] - header.VISITYR = record['visityr'] + + # Custom header info + formdate = '' + formrater = '' + try: + if header.FORMID.value == "B1L": + formdate = record['fu_b1l_date'] + formrater = record['fu_b1l_rater'] + elif header.FORMID.value == "B2L": + formdate = record['fu_b2l_date'] + formrater = record['fu_b2l_rater'] + elif header.FORMID.value == "B3L": + formdate = record['fu_b3l_date'] + formrater = record['fu_b3l_rater'] + elif header.FORMID.value == "B4L": + formdate = record['fu_b4l_date'] + formrater = record['fu_b4l_rater'] + elif header.FORMID.value == "B5L": + formdate = record['fu_b5l_date'] + formrater = record['fu_b5l_rater'] + elif header.FORMID.value == "B6L": + formdate = record['fu_b6l_date'] + formrater = record['fu_b6l_rater'] + elif header.FORMID.value == "B7L": + formdate = record['fu_b7l_date'] + formrater = record['fu_b7l_rater'] + elif header.FORMID.value == "B8L": + formdate = record['fu_b8l_date'] + formrater = record['fu_b8l_rater'] + elif header.FORMID.value == "B9L": + formdate = record['fu_b9l_date'] + formrater = record['fu_b9l_rater'] + elif header.FORMID.value == "C1L": + formdate = record['fu_c1l_date'] + formrater = record['fu_c1l_rater'] + elif header.FORMID.value == "D1L": + formdate = record['fu_d1l_date'] + formrater = record['fu_d1l_rater'] + elif header.FORMID.value == "E1L": + formdate = record['fu_e1l_date'] + formrater = record['fu_e1l_rater'] + elif header.FORMID.value == "E2L": + formdate = record['fu_e2l_date'] + formrater = record['fu_e2l_rater'] + elif header.FORMID.value == "E3L": + formdate = record['fu_e3l_date'] + formrater = record['fu_e3l_rater'] + # Date should be format of yyyy-mm-dd. If not, + # then use form header defaults. + if len(formdate.split("-")) == 3: + yyyy = formdate.split("-")[0] + mm = formdate.split("-")[1] + dd = formdate.split("-")[2] + else: + yyyy = record['visityr'] + mm = record['visitmo'] + dd = record['visitday'] + header.VISITMO = mm + header.VISITDAY = dd + header.VISITYR = yyyy + except KeyError: + header.VISITMO = record['visitmo'] + header.VISITDAY = record['visitday'] + header.VISITYR = record['visityr'] + header.VISITNUM = record['visitnum'] - header.INITIALS = record['initials'] + if formrater is not None: + header.INITIALS = formrater + else: + header.INITIALS = record['initials'] diff --git a/nacc/lbd/ivp/builder.py b/nacc/lbd/ivp/builder.py index 3992a56..a4c1bfd 100644 --- a/nacc/lbd/ivp/builder.py +++ b/nacc/lbd/ivp/builder.py @@ -503,8 +503,73 @@ def update_header(record, packet): header.FORMVER = 3 header.ADCID = record['adcid'] header.PTID = record['ptid'] - header.VISITMO = record['visitmo'] - header.VISITDAY = record['visitday'] - header.VISITYR = record['visityr'] + + # Custom header info + formdate = '' + formrater = '' + try: + if header.FORMID.value == "B1L": + formdate = record['b1l_date'] + formrater = record['b1l_rater'] + elif header.FORMID.value == "B2L": + formdate = record['b2l_date'] + formrater = record['b2l_rater'] + elif header.FORMID.value == "B3L": + formdate = record['b3l_date'] + formrater = record['b3l_rater'] + elif header.FORMID.value == "B4L": + formdate = record['b4l_date'] + formrater = record['b4l_rater'] + elif header.FORMID.value == "B5L": + formdate = record['b5l_date'] + formrater = record['b5l_rater'] + elif header.FORMID.value == "B6L": + formdate = record['b6l_date'] + formrater = record['b6l_rater'] + elif header.FORMID.value == "B7L": + formdate = record['b7l_date'] + formrater = record['b7l_rater'] + elif header.FORMID.value == "B8L": + formdate = record['b8l_date'] + formrater = record['b8l_rater'] + elif header.FORMID.value == "B9L": + formdate = record['b9l_date'] + formrater = record['b9l_rater'] + elif header.FORMID.value == "C1L": + formdate = record['c1l_date'] + formrater = record['c1l_rater'] + elif header.FORMID.value == "D1L": + formdate = record['d1l_date'] + formrater = record['d1l_rater'] + elif header.FORMID.value == "E1L": + formdate = record['e1l_date'] + formrater = record['e1l_rater'] + elif header.FORMID.value == "E2L": + formdate = record['e2l_date'] + formrater = record['e2l_rater'] + elif header.FORMID.value == "E3L": + formdate = record['e3l_date'] + formrater = record['e3l_rater'] + # Date should be format of yyyy-mm-dd. If not, + # then use form header defaults. + if len(formdate.split("-")) == 3: + yyyy = formdate.split("-")[0] + mm = formdate.split("-")[1] + dd = formdate.split("-")[2] + else: + yyyy = record['visityr'] + mm = record['visitmo'] + dd = record['visitday'] + header.VISITMO = mm + header.VISITDAY = dd + header.VISITYR = yyyy + except KeyError: + header.VISITMO = record['visitmo'] + header.VISITDAY = record['visitday'] + header.VISITYR = record['visityr'] + header.VISITNUM = record['visitnum'] - header.INITIALS = record['initials'] + if formrater is not None: + header.INITIALS = formrater + else: + header.INITIALS = record['initials'] diff --git a/nacc/lbd/v3_1/fvp/builder.py b/nacc/lbd/v3_1/fvp/builder.py index a1b199a..dedfa00 100644 --- a/nacc/lbd/v3_1/fvp/builder.py +++ b/nacc/lbd/v3_1/fvp/builder.py @@ -389,8 +389,70 @@ def update_header(record, packet): header.FORMVER = 3.1 header.ADCID = record['adcid'] header.PTID = record['ptid'] - header.VISITMO = record['visitmo'] - header.VISITDAY = record['visitday'] - header.VISITYR = record['visityr'] + + # Custom header info + formdate = '' + formrater = '' + try: + if header.FORMID.value == "B1L": + formdate = record['fu_b1l_date'] + formrater = record['fu_b1l_rater'] + elif header.FORMID.value == "B2L": + formdate = record['fu_b2l_date'] + formrater = record['fu_b2l_rater'] + elif header.FORMID.value == "B3L": + formdate = record['fu_b3l_date'] + formrater = record['fu_b3l_rater'] + elif header.FORMID.value == "B4L": + formdate = record['fu_b4l_date'] + formrater = record['fu_b4l_rater'] + elif header.FORMID.value == "B5L": + formdate = record['fu_b5l_date'] + formrater = record['fu_b5l_rater'] + elif header.FORMID.value == "B6L": + formdate = record['fu_b6l_date'] + formrater = record['fu_b6l_rater'] + elif header.FORMID.value == "B7L": + formdate = record['fu_b7l_date'] + formrater = record['fu_b7l_rater'] + elif header.FORMID.value == "B9L": + formdate = record['fu_b9l_date'] + formrater = record['fu_b9l_rater'] + elif header.FORMID.value == "C1L": + formdate = record['fu_c1l_date'] + formrater = record['fu_c1l_rater'] + elif header.FORMID.value == "D1L": + formdate = record['fu_d1l_date'] + formrater = record['fu_d1l_rater'] + elif header.FORMID.value == "E1L": + formdate = record['fu_e1l_date'] + formrater = record['fu_e1l_rater'] + elif header.FORMID.value == "E2L": + formdate = record['fu_e2l_date'] + formrater = record['fu_e2l_rater'] + elif header.FORMID.value == "E3L": + formdate = record['fu_e3l_date'] + formrater = record['fu_e3l_rater'] + # Date should be format of yyyy-mm-dd. If not, + # then use form header defaults. + if len(formdate.split("-")) == 3: + yyyy = formdate.split("-")[0] + mm = formdate.split("-")[1] + dd = formdate.split("-")[2] + else: + yyyy = record['visityr'] + mm = record['visitmo'] + dd = record['visitday'] + header.VISITMO = mm + header.VISITDAY = dd + header.VISITYR = yyyy + except KeyError: + header.VISITMO = record['visitmo'] + header.VISITDAY = record['visitday'] + header.VISITYR = record['visityr'] + header.VISITNUM = record['visitnum'] - header.INITIALS = record['initials'] + if formrater is not None: + header.INITIALS = formrater + else: + header.INITIALS = record['initials'] diff --git a/nacc/lbd/v3_1/ivp/builder.py b/nacc/lbd/v3_1/ivp/builder.py index 6535362..21c3228 100644 --- a/nacc/lbd/v3_1/ivp/builder.py +++ b/nacc/lbd/v3_1/ivp/builder.py @@ -387,8 +387,70 @@ def update_header(record, packet): header.FORMVER = 3.1 header.ADCID = record['adcid'] header.PTID = record['ptid'] - header.VISITMO = record['visitmo'] - header.VISITDAY = record['visitday'] - header.VISITYR = record['visityr'] + + # Custom header info + formdate = '' + formrater = '' + try: + if header.FORMID.value == "B1L": + formdate = record['b1l_date'] + formrater = record['b1l_rater'] + elif header.FORMID.value == "B2L": + formdate = record['b2l_date'] + formrater = record['b2l_rater'] + elif header.FORMID.value == "B3L": + formdate = record['b3l_date'] + formrater = record['b3l_rater'] + elif header.FORMID.value == "B4L": + formdate = record['b4l_date'] + formrater = record['b4l_rater'] + elif header.FORMID.value == "B5L": + formdate = record['b5l_date'] + formrater = record['b5l_rater'] + elif header.FORMID.value == "B6L": + formdate = record['b6l_date'] + formrater = record['b6l_rater'] + elif header.FORMID.value == "B7L": + formdate = record['b7l_date'] + formrater = record['b7l_rater'] + elif header.FORMID.value == "B9L": + formdate = record['b9l_date'] + formrater = record['b9l_rater'] + elif header.FORMID.value == "C1L": + formdate = record['c1l_date'] + formrater = record['c1l_rater'] + elif header.FORMID.value == "D1L": + formdate = record['d1l_date'] + formrater = record['d1l_rater'] + elif header.FORMID.value == "E1L": + formdate = record['e1l_date'] + formrater = record['e1l_rater'] + elif header.FORMID.value == "E2L": + formdate = record['e2l_date'] + formrater = record['e2l_rater'] + elif header.FORMID.value == "E3L": + formdate = record['e3l_date'] + formrater = record['e3l_rater'] + # Date should be format of yyyy-mm-dd. If not, + # then use form header defaults. + if len(formdate.split("-")) == 3: + yyyy = formdate.split("-")[0] + mm = formdate.split("-")[1] + dd = formdate.split("-")[2] + else: + yyyy = record['visityr'] + mm = record['visitmo'] + dd = record['visitday'] + header.VISITMO = mm + header.VISITDAY = dd + header.VISITYR = yyyy + except KeyError: + header.VISITMO = record['visitmo'] + header.VISITDAY = record['visitday'] + header.VISITYR = record['visityr'] + header.VISITNUM = record['visitnum'] - header.INITIALS = record['initials'] + if formrater is not None: + header.INITIALS = formrater + else: + header.INITIALS = record['initials'] diff --git a/nacc/uds3/fvp/builder.py b/nacc/uds3/fvp/builder.py index 52a8224..ee7a0e3 100644 --- a/nacc/uds3/fvp/builder.py +++ b/nacc/uds3/fvp/builder.py @@ -1095,8 +1095,82 @@ def update_header(record, packet): header.FORMVER = 3 header.ADCID = record['adcid'] header.PTID = record['ptid'] - header.VISITMO = record['visitmo'] - header.VISITDAY = record['visitday'] - header.VISITYR = record['visityr'] + + # Custom header info + formdate = '' + formrater = '' + try: + if header.FORMID.value == "A1": + formdate = record['fu_a1_date'] + formrater = record['fu_a1_rater'] + elif header.FORMID.value == "A2": + formdate = record['fu_a2_date'] + formrater = record['fu_a2_rater'] + elif header.FORMID.value == "A3": + formdate = record['fu_a3_date'] + formrater = record['fu_a3_rater'] + elif header.FORMID.value == "A4D": + formdate = record['fu_a4d_date'] # check eli's code- this might also be a3 + formrater = record['fu_a4d_rater'] + elif header.FORMID.value == "A4G": + formdate = record['fu_a4g_date'] + formrater = record['fu_a4g_rater'] + elif header.FORMID.value == "B1": + formdate = record['fu_b1_date'] + formrater = record['fu_b1_rater'] + elif header.FORMID.value == "B4": + formdate = record['fu_b4_date'] + formrater = record['fu_b4_rater'] + elif header.FORMID.value == "B5": + formdate = record['fu_b5_date'] + formrater = record['fu_b5_rater'] + elif header.FORMID.value == "B6": + formdate = record['fu_b6_date'] + formrater = record['fu_b6_rater'] + elif header.FORMID.value == "B7": + formdate = record['fu_b7_date'] + formrater = record['fu_b7_rater'] + elif header.FORMID.value == "B9": + formdate = record['fu_b9_date'] + formrater = record['fu_b9_rater'] + elif header.FORMID.value == "C1S": + formdate = record['fu_c1s_date'] + formrater = record['fu_c1s_rater'] + elif header.FORMID.value == "C2": + formdate = record['fu_c2_date'] + formrater = record['fu_c2_rater'] + elif header.FORMID.value == "D1": + formdate = record['fu_d1_date'] + formrater = record['fu_d1_rater'] + elif header.FORMID.value == "D2": + formdate = record['fu_d2_date'] + formrater = record['fu_d2_rater'] + elif header.FORMID.value == "Z1": + formdate = record['fu_z1_date'] + formrater = record['fu_z1_rater'] + elif header.FORMID.value == "Z1X": + formdate = record['fu_z1x_date'] + formrater = record['fu_z1x_rater'] + # Date should be format of yyyy-mm-dd. If not, + # then use form header defaults. + if len(formdate.split("-")) == 3: + yyyy = formdate.split("-")[0] + mm = formdate.split("-")[1] + dd = formdate.split("-")[2] + else: + yyyy = record['visityr'] + mm = record['visitmo'] + dd = record['visitday'] + header.VISITMO = mm + header.VISITDAY = dd + header.VISITYR = yyyy + except KeyError: + header.VISITMO = record['visitmo'] + header.VISITDAY = record['visitday'] + header.VISITYR = record['visityr'] + header.VISITNUM = record['visitnum'] - header.INITIALS = record['initials'] \ No newline at end of file + if formrater is not None: + header.INITIALS = formrater + else: + header.INITIALS = record['initials'] \ No newline at end of file diff --git a/nacc/uds3/ivp/builder.py b/nacc/uds3/ivp/builder.py index f433595..3ce402c 100644 --- a/nacc/uds3/ivp/builder.py +++ b/nacc/uds3/ivp/builder.py @@ -1193,8 +1193,85 @@ def update_header(record, packet): header.FORMVER = 3 header.ADCID = record['adcid'] header.PTID = record['ptid'] - header.VISITMO = record['visitmo'] - header.VISITDAY = record['visitday'] - header.VISITYR = record['visityr'] + + # Custom header info + formdate = '' + formrater = '' + try: + if header.FORMID.value == "A1": + formdate = record['a1_date'] + formrater = record['a1_rater'] + elif header.FORMID.value == "A2": + formdate = record['a2_date'] + formrater = record['a2_rater'] + elif header.FORMID.value == "A3": + formdate = record['a3_date'] + formrater = record['a3_rater'] + elif header.FORMID.value == "A4D": + formdate = record['a4d_date'] + formrater = record['a4d_rater'] + elif header.FORMID.value == "A4G": + formdate = record['a4g_date'] + formrater = record['a4g_rater'] + elif header.FORMID.value == "A5": + formdate = record['a5_date'] + formrater = record['a5_rater'] + elif header.FORMID.value == "B1": + formdate = record['b1_date'] + formrater = record['b1_rater'] + elif header.FORMID.value == "B4": + formdate = record['b4_date'] + formrater = record['b4_rater'] + elif header.FORMID.value == "B5": + formdate = record['b5_date'] + formrater = record['b5_rater'] + elif header.FORMID.value == "B6": + formdate = record['b6_date'] + formrater = record['b6_rater'] + elif header.FORMID.value == "B7": + formdate = record['b7_date'] + formrater = record['b7_rater'] + elif header.FORMID.value == "B9": + formdate = record['b9_date'] + formrater = record['b9_rater'] + elif header.FORMID.value == "C1S": + formdate = record['c1s_date'] + formrater = record['c1s_rater'] + elif header.FORMID.value == "C2": + formdate = record['c2_date'] + formrater = record['c2_rater'] + elif header.FORMID.value == "D1": + formdate = record['d1_date'] + formrater = record['d1_rater'] + elif header.FORMID.value == "D2": + formdate = record['d2_date'] + formrater = record['d2_rater'] + elif header.FORMID.value == "Z1": + formdate = record['z1_date'] + formrater = record['z1_rater'] + elif header.FORMID.value == "Z1X": + formdate = record['z1x_date'] + formrater = record['z1x_rater'] + # Date should be format of yyyy-mm-dd. If not, + # then use form header defaults. + if len(formdate.split("-")) == 3: + yyyy = formdate.split("-")[0] + mm = formdate.split("-")[1] + dd = formdate.split("-")[2] + else: + yyyy = record['visityr'] + mm = record['visitmo'] + dd = record['visitday'] + header.VISITMO = mm + header.VISITDAY = dd + header.VISITYR = yyyy + except KeyError: + header.VISITMO = record['visitmo'] + header.VISITDAY = record['visitday'] + header.VISITYR = record['visityr'] + header.VISITNUM = record['visitnum'] - header.INITIALS = record['initials'] + if formrater is not None: + header.INITIALS = formrater + else: + header.INITIALS = record['initials'] diff --git a/nacc/uds3/tfp/v3_2/builder.py b/nacc/uds3/tfp/v3_2/builder.py index 6e16093..3a13c2a 100644 --- a/nacc/uds3/tfp/v3_2/builder.py +++ b/nacc/uds3/tfp/v3_2/builder.py @@ -864,6 +864,9 @@ def update_header(record, packet): for header in packet: header.PACKET = "T" header.FORMID = header.form_name + header.FORMVER = "3.2" + header.ADCID = record['adcid'] + header.PTID = record['ptid'] # Custom header info formdate = '' @@ -929,9 +932,6 @@ def update_header(record, packet): header.VISITDAY = record['visitday'] header.VISITYR = record['visityr'] - header.FORMVER = "3.2" - header.ADCID = record['adcid'] - header.PTID = record['ptid'] header.VISITNUM = record['visitnum'] if formrater is not None: header.INITIALS = formrater From 0e3b727b70419a6b1945b348fd8e2b200faa7867 Mon Sep 17 00:00:00 2001 From: Samantha Emerson Date: Thu, 13 May 2021 14:16:04 -0400 Subject: [PATCH 05/11] Add more options to LBD event detection --- nacc/redcap2nacc.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/nacc/redcap2nacc.py b/nacc/redcap2nacc.py index 75feda2..d1e9f72 100755 --- a/nacc/redcap2nacc.py +++ b/nacc/redcap2nacc.py @@ -165,7 +165,10 @@ def check_redcap_event(options, record) -> bool: """ if options.lbd and options.ivp: event_name = 'initial' - form_match_lbd = record['lbd_ivp_b1l_complete'] + try: + form_match_lbd = record['lbd_ivp_b1l_complete'] + except KeyError: + form_match_lbd = record['lbd_ivp_b1l_clinical_symptoms_and_exam_complete'] if form_match_lbd in ['0', '']: return False elif options.lbd and options.fvp: @@ -175,7 +178,10 @@ def check_redcap_event(options, record) -> bool: return False elif options.lbdsv and options.ivp: event_name = 'initial' - form_match_lbd = record['lbd_ivp_b1l_complete'] + try: + form_match_lbd = record['lbd_ivp_b1l_complete'] + except KeyError: + form_match_lbd = record['lbd_ivp_b1l_clinical_symptoms_and_exam_complete'] if form_match_lbd in ['0', '']: return False elif options.lbdsv and options.fvp: From ae78c3274b83339e9c667fd54c7e7084197634f5 Mon Sep 17 00:00:00 2001 From: Samantha Emerson Date: Thu, 13 May 2021 14:19:08 -0400 Subject: [PATCH 06/11] Fix typo in milestone builder.py --- nacc/uds3/m/builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nacc/uds3/m/builder.py b/nacc/uds3/m/builder.py index 4426e9d..6c04ed1 100644 --- a/nacc/uds3/m/builder.py +++ b/nacc/uds3/m/builder.py @@ -84,7 +84,7 @@ def parse_date(date, DMY_choice): return m[0] + m[1] elif date == '': return '' - raise ValueError('Inccorect death date format, date must be MM/DD/YYYY') + raise ValueError('Incorrect death date format, date must be MM/DD/YYYY') def subject_deceased(status): From 9a6524ab7acca5353f2e709bda761d5c82121271 Mon Sep 17 00:00:00 2001 From: Samantha Emerson Date: Thu, 13 May 2021 15:07:06 -0400 Subject: [PATCH 07/11] Fix formrater logic in builder files --- nacc/ftld/fvp/builder.py | 2 +- nacc/ftld/ivp/builder.py | 2 +- nacc/lbd/fvp/builder.py | 2 +- nacc/lbd/ivp/builder.py | 2 +- nacc/lbd/v3_1/fvp/builder.py | 2 +- nacc/lbd/v3_1/ivp/builder.py | 2 +- nacc/uds3/fvp/builder.py | 2 +- nacc/uds3/ivp/builder.py | 2 +- nacc/uds3/tfp/v3_2/builder.py | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/nacc/ftld/fvp/builder.py b/nacc/ftld/fvp/builder.py index da9bbd2..14fd124 100644 --- a/nacc/ftld/fvp/builder.py +++ b/nacc/ftld/fvp/builder.py @@ -537,7 +537,7 @@ def update_header(record, packet): header.VISITYR = record['visityr'] header.VISITNUM = record['visitnum'] - if formrater is not None: + if formrater != '': header.INITIALS = formrater else: header.INITIALS = record['initials'] diff --git a/nacc/ftld/ivp/builder.py b/nacc/ftld/ivp/builder.py index 50021af..21b6473 100644 --- a/nacc/ftld/ivp/builder.py +++ b/nacc/ftld/ivp/builder.py @@ -538,7 +538,7 @@ def update_header(record, packet): header.VISITYR = record['visityr'] header.VISITNUM = record['visitnum'] - if formrater is not None: + if formrater != '': header.INITIALS = formrater else: header.INITIALS = record['initials'] diff --git a/nacc/lbd/fvp/builder.py b/nacc/lbd/fvp/builder.py index f90dc9d..54e4b0c 100644 --- a/nacc/lbd/fvp/builder.py +++ b/nacc/lbd/fvp/builder.py @@ -570,7 +570,7 @@ def update_header(record, packet): header.VISITYR = record['visityr'] header.VISITNUM = record['visitnum'] - if formrater is not None: + if formrater != '': header.INITIALS = formrater else: header.INITIALS = record['initials'] diff --git a/nacc/lbd/ivp/builder.py b/nacc/lbd/ivp/builder.py index a4c1bfd..03e42bc 100644 --- a/nacc/lbd/ivp/builder.py +++ b/nacc/lbd/ivp/builder.py @@ -569,7 +569,7 @@ def update_header(record, packet): header.VISITYR = record['visityr'] header.VISITNUM = record['visitnum'] - if formrater is not None: + if formrater != '': header.INITIALS = formrater else: header.INITIALS = record['initials'] diff --git a/nacc/lbd/v3_1/fvp/builder.py b/nacc/lbd/v3_1/fvp/builder.py index dedfa00..8e82a56 100644 --- a/nacc/lbd/v3_1/fvp/builder.py +++ b/nacc/lbd/v3_1/fvp/builder.py @@ -452,7 +452,7 @@ def update_header(record, packet): header.VISITYR = record['visityr'] header.VISITNUM = record['visitnum'] - if formrater is not None: + if formrater != '': header.INITIALS = formrater else: header.INITIALS = record['initials'] diff --git a/nacc/lbd/v3_1/ivp/builder.py b/nacc/lbd/v3_1/ivp/builder.py index 21c3228..ecf74e1 100644 --- a/nacc/lbd/v3_1/ivp/builder.py +++ b/nacc/lbd/v3_1/ivp/builder.py @@ -450,7 +450,7 @@ def update_header(record, packet): header.VISITYR = record['visityr'] header.VISITNUM = record['visitnum'] - if formrater is not None: + if formrater != '': header.INITIALS = formrater else: header.INITIALS = record['initials'] diff --git a/nacc/uds3/fvp/builder.py b/nacc/uds3/fvp/builder.py index ee7a0e3..12c8d9c 100644 --- a/nacc/uds3/fvp/builder.py +++ b/nacc/uds3/fvp/builder.py @@ -1170,7 +1170,7 @@ def update_header(record, packet): header.VISITYR = record['visityr'] header.VISITNUM = record['visitnum'] - if formrater is not None: + if formrater != '': header.INITIALS = formrater else: header.INITIALS = record['initials'] \ No newline at end of file diff --git a/nacc/uds3/ivp/builder.py b/nacc/uds3/ivp/builder.py index 3ce402c..582b3f8 100644 --- a/nacc/uds3/ivp/builder.py +++ b/nacc/uds3/ivp/builder.py @@ -1271,7 +1271,7 @@ def update_header(record, packet): header.VISITYR = record['visityr'] header.VISITNUM = record['visitnum'] - if formrater is not None: + if formrater != '': header.INITIALS = formrater else: header.INITIALS = record['initials'] diff --git a/nacc/uds3/tfp/v3_2/builder.py b/nacc/uds3/tfp/v3_2/builder.py index 3a13c2a..94f4000 100644 --- a/nacc/uds3/tfp/v3_2/builder.py +++ b/nacc/uds3/tfp/v3_2/builder.py @@ -933,7 +933,7 @@ def update_header(record, packet): header.VISITYR = record['visityr'] header.VISITNUM = record['visitnum'] - if formrater is not None: + if formrater != '': header.INITIALS = formrater else: header.INITIALS = record['initials'] \ No newline at end of file From ca4d4a3a6c684fc4908c74bc6cb9a72bafbd7a9f Mon Sep 17 00:00:00 2001 From: Samantha Emerson Date: Thu, 13 May 2021 15:15:58 -0400 Subject: [PATCH 08/11] Fix blanking logic typos in uds3 fvp forms.py with help from Elijah Rockers --- nacc/uds3/fvp/forms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nacc/uds3/fvp/forms.py b/nacc/uds3/fvp/forms.py index 3305a9a..19d3295 100644 --- a/nacc/uds3/fvp/forms.py +++ b/nacc/uds3/fvp/forms.py @@ -805,7 +805,7 @@ def __init__(self): self.fields['BRNINJIF'] = nacc.uds3.Field(name='BRNINJIF', typename='Num', position=(386, 386), length=1, inclusive_range=(1, 3), allowable_values=['3', '2', '1'], blanks=['Blank if Question 20 BRNINJ ne 1 (Present)', 'Blank if Question 2 NORMCOG = 1 (Yes)']) self.fields['BRNINCTE'] = nacc.uds3.Field(name='BRNINCTE', typename='Num', position=(388, 388), length=1, inclusive_range=(0, 1), allowable_values=['9', '1', '0'], blanks=['Blank if Question 20 BRNINJ ne 1 (Present)']) self.fields['HYCEPH'] = nacc.uds3.Field(name='HYCEPH', typename='Num', position=(390, 390), length=1, inclusive_range=(0, 1), allowable_values=['1', '0'], blanks=[]) - self.fields['HYCEPHIF'] = nacc.uds3.Field(name='HYCEPHIF', typename='Num', position=(392, 392), length=1, inclusive_range=(1, 3), allowable_values=['3', '2', '1'], blanks=['Blank if Question 21 NPHYDR ne 1 (Present)', 'Blank if Question 2 NORMCOG = 1 (Yes)']) + self.fields['HYCEPHIF'] = nacc.uds3.Field(name='HYCEPHIF', typename='Num', position=(392, 392), length=1, inclusive_range=(1, 3), allowable_values=['3', '2', '1'], blanks=['Blank if Question 21 HYCEPH ne 1 (Present)', 'Blank if Question 2 NORMCOG = 1 (Yes)']) self.fields['EPILEP'] = nacc.uds3.Field(name='EPILEP', typename='Num', position=(394, 394), length=1, inclusive_range=(0, 1), allowable_values=['1', '0'], blanks=[]) self.fields['EPILEPIF'] = nacc.uds3.Field(name='EPILEPIF', typename='Num', position=(396, 396), length=1, inclusive_range=(1, 3), allowable_values=['3', '2', '1'], blanks=['Blank if Question 22 EPILEP ne 1 (Present)', 'Blank if Question 2 NORMCOG = 1 (Yes)']) self.fields['NEOP'] = nacc.uds3.Field(name='NEOP', typename='Num', position=(398, 398), length=1, inclusive_range=(0, 1), allowable_values=['1', '0'], blanks=[]) @@ -944,7 +944,7 @@ def __init__(self): self.fields['B7NOT'] = nacc.uds3.Field(name='B7NOT', typename='Num', position=(95, 96), length=2, inclusive_range=(95,98), allowable_values=['98','97','96','95'], blanks=['Blank if Question 10 B7SUB = 1 (Yes)']) self.fields['LANGB8'] = nacc.uds3.Field(name='LANGB8', typename='Num', position=(98, 98), length=1, inclusive_range=(1,2), allowable_values=['2','1'], blanks=[]) self.fields['LANGB9'] = nacc.uds3.Field(name='LANGB9', typename='Num', position=(100, 100), length=1, inclusive_range=(1,2), allowable_values=['2','1'], blanks=[]) - self.fields['LANGC1'] = nacc.uds3.Field(name='LANGC2', typename='Num', position=(102, 102), length=1, inclusive_range=(1,2), allowable_values=['2','1'], blanks=['Blank if 13a LANGC2 = 1 (English) or 2 (Spanish)']) + self.fields['LANGC1'] = nacc.uds3.Field(name='LANGC1', typename='Num', position=(102, 102), length=1, inclusive_range=(1,2), allowable_values=['2','1'], blanks=['Blank if 13a LANGC2 = 1 (English) or 2 (Spanish)']) self.fields['LANGC2'] = nacc.uds3.Field(name='LANGC2', typename='Num', position=(104, 104), length=1, inclusive_range=(1,2), allowable_values=['2','1'], blanks=['Blank if 12a LANGC1 = 1 (English) or 2 (Spanish)']) self.fields['LANGD1'] = nacc.uds3.Field(name='LANGD1', typename='Num', position=(106, 106), length=1, inclusive_range=(1,2), allowable_values=['2','1'], blanks=[]) self.fields['LANGD2'] = nacc.uds3.Field(name='LANGD2', typename='Num', position=(108, 108), length=1, inclusive_range=(1,2), allowable_values=['2','1'], blanks=[]) From 4d2d72d15fd7cbc803c5a822426789f4f6cbabbe Mon Sep 17 00:00:00 2001 From: Samantha Emerson Date: Thu, 13 May 2021 15:19:25 -0400 Subject: [PATCH 09/11] Update AUTHORS to include other contributors --- AUTHORS | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index fb695c7..b4ccd08 100644 --- a/AUTHORS +++ b/AUTHORS @@ -34,5 +34,8 @@ Contributors at the University of Florida Other Contributors + * Brook Hurd * L. D. Nicolas May - + * Elijah D. Rockers + * Kathleen Bradbury + * Stephanie Wenzlawsh From 07efe32f3a59d1e0f275005d439e8b3dfcebc965 Mon Sep 17 00:00:00 2001 From: Samantha Emerson Date: Thu, 13 May 2021 15:42:12 -0400 Subject: [PATCH 10/11] Add LBD event detection logic to FVP events as well --- nacc/redcap2nacc.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/nacc/redcap2nacc.py b/nacc/redcap2nacc.py index d1e9f72..76af815 100755 --- a/nacc/redcap2nacc.py +++ b/nacc/redcap2nacc.py @@ -173,7 +173,10 @@ def check_redcap_event(options, record) -> bool: return False elif options.lbd and options.fvp: event_name = 'follow' - form_match_lbd = record['lbd_fvp_b1l_complete'] + try: + form_match_lbd = record['lbd_fvp_b1l_complete'] + except KeyError: + form_match_lbd = record['lbd_fvp_b1l_clinical_symptoms_and_exam_complete'] if form_match_lbd in ['0', '']: return False elif options.lbdsv and options.ivp: @@ -186,7 +189,10 @@ def check_redcap_event(options, record) -> bool: return False elif options.lbdsv and options.fvp: event_name = 'follow' - form_match_lbd = record['lbd_fvp_b1l_complete'] + try: + form_match_lbd = record['lbd_fvp_b1l_complete'] + except KeyError: + form_match_lbd = record['lbd_fvp_b1l_clinical_symptoms_and_exam_complete'] if form_match_lbd in ['0', '']: return False elif options.ftld and options.ivp: From 8f14dc0e7f5c235631cb8c60de95b3788ba0e33c Mon Sep 17 00:00:00 2001 From: Samantha Emerson Date: Thu, 13 May 2021 15:45:58 -0400 Subject: [PATCH 11/11] Add NOGDS to set_to_zero_if_blank to acount for changed field on the TFP B6 form --- nacc/redcap2nacc.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/nacc/redcap2nacc.py b/nacc/redcap2nacc.py index 76af815..b946878 100755 --- a/nacc/redcap2nacc.py +++ b/nacc/redcap2nacc.py @@ -315,6 +315,13 @@ def set_to_zero_if_blank(*field_names): if empty(field): field.value = 0 + # B6 G1. + try: + if packet['GDS'] in range(0, 15): + set_to_zero_if_blank('NOGDS') + except KeyError: + pass + # B8 2. try: if packet['PARKSIGN'] == 1: