package ULISA; # !!!!!!!!!!!!!!!!! not in use - replaced by C::R::ULISA !!!!!!!!!!!!!!!! use strict; use Local::Debug; use Data::Dumper; use DBIx::Simple; use XML::Simple qw(:strict); # need to specify ForceArray & KeyAttr if using :strict here my $xs = XML::Simple->new(); # generate list of specimens equivalent to [DGLRX][BL|F|SL|U]|T[B.|S.]|BMAT in _get_histology_specimens() my $histology_tissues = join '|', qw(trephine block fixed); # don't generate ULISA if requests restricted to: my $ignored_fields = join '|', qw( Hist_ID TBCulture ZAP70 Hist(Details|Result) TimeStamp CutUp HandE Req(Rec|Out) ); my %xs_options = ( RootName => 'ulisa', NoAttr => 1, XMLDecl => 1, SuppressEmpty => 1, # ? only works for xml_in KeyAttr => [], ); my %sql_for = ( histology_fields => q!show columns from HistoPanel!, specimens => q!select sample_code, sample_type from Specimens!, request_data => q!select LName as last_name, FName as first_name, DoB as dob, Specimen as specimen, BlockRef as block_ref, concat('H',HMDS,'/',date_format(Date,'%y')) as lab_number from Main left join PID on P_ID = Pat_ID where DBID = ?!, ); sub new { my ($class, $args) = @_; Local::Debug::DEBUG $args; my $dbi = DBIx::Simple->new( $args->{dbh} ) or die DBIx::Simple->error; bless { dbi => $dbi, query => $args->{query}, }, $class; } sub parse_data { my $self = shift; my $query = $self->{query}; my $id = $self->{query}->{ID}; # Local::Debug::DEBUG( 'ID: ' . $self->{query}->{ID} ); my $histology_specimen_types = $self->_get_histology_specimen_types(); # arrayref my $requested_panels = $self->_get_requests_from_query(); # arrayref my $request_data = $self->_dbi($sql_for{request_data}, 'hash', $id); # hashref my @specimens = split /,\s?/, $request_data->{specimen}; # add H&E to list if it's a Screen of histology specimen type(s), & Geimsa if it's a BMAT: if ($query->{screen_record}) { SPECIMEN: foreach my $specimen ( @specimens ) { push @{ $requested_panels }, 'H and E' and last SPECIMEN if grep $specimen eq $_, @{ $histology_specimen_types }; } push @{ $requested_panels }, 'Giemsa' if $request_data->{specimen} =~ /BMAT/; } # Local::Debug::DEBUG( @requested_panels ); # return if nothing to generate: return unless @{ $requested_panels }; my %xml; $xml{case} = $self->_format_case_data($request_data); $xml{specimens}{specimen} = []; # initialise for SPECIMEN block # only need this if decoding specimens: # my $specimen_details = $self->_get_specimen_details(); SPECIMEN: foreach my $specimen ( @specimens ) { # Local::Debug::DEBUG( 'Specimen: ' . $specimen ); # only need histology tissues: next SPECIMEN unless grep $specimen eq $_, @{ $histology_specimen_types }; # my $tissue_type = $specimen_details->{$specimen}; PANEL: foreach my $panel ( @{ $requested_panels } ) { # Local::Debug::DEBUG( 'Panel: ' . $panel ); push @{ $xml{specimens}{specimen} }, { block => $request_data->{block_ref} || 'none', # tissuetype => $tissue_type || 'unknown', # not decoding specimens tissuetype => $specimen, protocol => $panel, notes => {}, }; } } $xml{specimens}{caseid} = $request_data->{lab_number}; my $xml_out = $xs->XMLout( \%xml, %xs_options ); return $xml_out; } sub _format_case_data { my $self = shift; my $data = shift; my ($first_name, $middle_name) = split ' ', $data->{first_name} unless $data->{first_name} =~ /^\d/; # ignore numerical entries return { accessionnum => $self->{query}->{ID}, caseid => $data->{lab_number}, firstname => $first_name || $data->{first_name}, # if first_name is numerical middlename => $middle_name || {}, lastname => $data->{last_name}, birthdate => $data->{dob} || {}, MRN => {}, } } sub _get_histology_specimen_types { my $self = shift; my $specimen_details = $self->_get_specimen_details; my @specimens = grep { $specimen_details->{$_} =~ /$histology_tissues/; } keys %{ $specimen_details }; # Local::Debug::DEBUG( sort @specimens ); return \@specimens; } sub _get_histology_data_fields { my $self = shift; my $histology_columns = $self->_dbi($sql_for{histology_fields}, 'arrays'); my @panels = map { $_->[0]; } grep { $_->[0] !~ /$ignored_fields/ } @{ $histology_columns }; # Local::Debug::DEBUG( @panels ); return \@panels; } sub _get_requests_from_query { my $self = shift; my $histology_data_fields = $self->_get_histology_data_fields; # arrayref my @requested_panels = grep $self->{query}->{$_} eq 'x', @{ $histology_data_fields }; return \@requested_panels; } sub _get_specimen_details { my $self = shift; my $specimens = $self->_dbi($sql_for{specimens}, 'arrays'); my %specimens = map { $_->[0] => $_->[1]; } @{ $specimens }; return \%specimens; } sub _dbi { my $self = shift; my $dbi = $self->{dbi}; my ($sql, $format, $modifier) = @_; my $data = $modifier ? # precedence important here: $dbi->query( $sql, $modifier )->$format || $dbi->error : $dbi->query( $sql )->$format || $dbi->error; return $data; } 1;