File Coverage

lib/Convert/Pheno/CDISC.pm
Criterion Covered Total %
statement 46 46 100.0
branch 2 2 100.0
condition n/a
subroutine 10 10 100.0
pod 0 2 0.0
total 58 60 96.6


line stmt bran cond sub pod time code
1             package Convert::Pheno::CDISC;
2              
3 6     6   43 use strict;
  6         14  
  6         190  
4 6     6   28 use warnings;
  6         13  
  6         138  
5 6     6   28 use autodie;
  6         11  
  6         38  
6 6     6   32877 use feature qw(say);
  6         27  
  6         447  
7 6     6   42 use Data::Dumper;
  6         27  
  6         456  
8 6     6   3050 use Convert::Pheno::REDCap;
  6         16  
  6         312  
9 6     6   55 use Convert::Pheno::Mapping;
  6         24  
  6         916  
10 6     6   41 use Exporter 'import';
  6         21  
  6         2658  
11             our @EXPORT = qw(do_cdisc2bff cdisc2redcap);
12             $Data::Dumper::Sortkeys = 1;
13              
14             ###############
15             ###############
16             # CDISC2BFF #
17             ###############
18             ###############
19              
20             sub do_cdisc2bff {
21              
22 72     72 0 151 my ( $self, $participant ) = @_;
23 72         161 return do_redcap2bff( $self, $participant );
24             }
25              
26             sub cdisc2redcap {
27              
28 2     2 0 7 my $data = shift;
29              
30             # We take $subject information from the nested data structure
31 2         12 my $subjects = $data->{ODM}{ClinicalData}{SubjectData};
32              
33             # Now we iterate over the array of subjects
34 2         9 my $individuals = [];
35 2         17 for my $subject ( @{$subjects} ) {
  2         11  
36              
37             # The data in CDISC-ODM has the following hierarchy
38             # StudyEventData->'-redcap:UniqueEventName'->FormData->ItemGroupData->ItemData
39              
40             # StudyEventData
41 16         19 for my $StudyEventData ( @{ $subject->{'StudyEventData'} } ) {
  16         43  
42              
43             # We'll store the new data on $individual
44             my $individual = {
45             study_id => $subject->{'-SubjectKey'},
46             redcap_event_name =>
47 72         307 $StudyEventData->{'-redcap:UniqueEventName'}
48             };
49              
50             # FormData
51 72         102 for my $FormData ( @{ $StudyEventData->{FormData} } ) {
  72         167  
52              
53             # ItemGroupData
54 438         483 for my $ItemGroupData ( @{ $FormData->{ItemGroupData} } ) {
  438         1045  
55              
56             # The elements can arrive as {} or []
57             # Both will be loaded as []
58 3324 100       7081 if ( ref $ItemGroupData->{ItemData} eq ref [] ) {
59 1590         1578 for my $ItemData ( @{ $ItemGroupData->{ItemData} } ) {
  1590         2501  
60             $individual->{ $ItemData->{'-ItemOID'} } =
61 21698         36028 dotify_and_coerce_number( $ItemData->{'-Value'} );
62             }
63             }
64             else {
65             # Converting from hash to 1-subject array
66             $individual->{ $ItemGroupData->{ItemData}{'-ItemOID'} }
67             = dotify_and_coerce_number(
68 1734         4169 $ItemGroupData->{ItemData}{'-Value'} );
69             }
70             }
71             }
72 72         103 push @{$individuals}, $individual;
  72         182  
73             }
74             }
75 2         17 return $individuals;
76             }
77             1;