The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#! /usr/bin/perl

package Bio::SeqReader::FastqRecord;

sub header1;
sub header2;
sub new;
sub quals;
sub reset;
sub seq;

=head1 NAME

Bio::SeqReader::FastqRecord - Class providing methods for representing header,
sequence, and quality information in FASTQ records.

=head1 SYNOPSIS

  use Bio::SeqReader::FastqRecord;

=head1 EXAMPLES

  my $so = new Bio::SeqReader::FastqRecord();
  $so->seq( 'ACGTACGT' );
  print $so->seq();       # ACGTACGT

=head1 DESCRIPTION

Class representing a sequence in FASTQ format. Headers 1 and 2, sequence text, and quality text
are accessed by the object's getter-setter methods.

=head1 CLASS METHODS

Bio::SeqReader::FastqRecord provides no class methods.

=head1 INSTANCE METHODS

Bio::SeqReader::FastqRecord provides the following instance methods.

=cut

use strict;

=over 12

=item B<new()>

Returns a new Bio::SeqReader::FastqRecord object.

  # Void constructor
  my $so = new Bio::SeqReader::FastqRecord();

  # Constructor with initial values
  my $so = new Bio::SeqReader::FastqRecord(
                  header1     => 'R_12345 read info ...',
                  seqtext     => 'ACGTACGT',
                  header2     => '',
                  qualtext    => 'A@AA?#??'
                  );

=back

=cut

sub new {
    my ( $class, %parms ) = @_;

    my $self = {};
    bless( $self, $class );

    $self->reset();
    $self->seq( $parms{ seqtext } )     if exists $parms{ seqtext };
    $self->quals( $parms{ qualtext } )  if exists $parms{ qualtext };
    $self->header1( $parms{ header1 } ) if exists $parms{ header1 };
    $self->header2( $parms{ header2 } ) if exists $parms{ header2 };

    return $self;
}

=over 12

=item B<display_id()>

Getter for the display id associated with a Bio::SeqReader::FastqRecord object.
Makes use of the current contents of header 1.

  print $so->display_id();   # => R_12345 

=back

=cut

sub display_id {
    my $self = shift;

    my $display_id = $self->{ _HEADER1 };
    $display_id =~ s/\s+.*//;

    return $display_id;

}

=over 12

=item B<header1()>

Getter-setter for the first header text from a Bio::SeqReader::FastqRecord object.

  $so->header1( 'R_12345 read info ...' );
  print $so->header1();   # => R_12345 read info

=back

=cut

sub header1 {
    my $self = shift;

    if ( @_ ) {
        $self->{ _HEADER1 } = shift;
        $self->{ _HEADER1 } =~ s/^\s+//g;
        $self->{ _HEADER1 } =~ s/\s+$//g;
    }

    return $self->{ _HEADER1 };
}

=over 12

=item B<header2()>

Getter-setter for the second header text from a Bio::SeqReader::FastqRecord object.

  $so->header2( 'second header info ...' );
  print $so->header2();   # => second header info ...

=back

=cut

sub header2 {
    my $self = shift;

    if ( @_ ) {
        $self->{ _HEADER2 } = shift;
        $self->{ _HEADER2 } =~ s/^\s+//g;
        $self->{ _HEADER2 } =~ s/\s+$//g;
    }

    return $self->{ _HEADER2 };
}

=over 12

=item B<quals()>

Getter-setter for the quality text from a Bio::SeqReader::FastqRecord object.

  $so->quals( 'A@AA?#??' );
  print $so->quals();   # => A@AA?#??

=back

=cut

sub quals {
    my $self = shift;

    if ( @_ ) {
        $self->{ _QUALTEXT } = shift;
        $self->{ _QUALTEXT } =~ s/[\000-\037\s]+//g;
    }

    return $self->{ _QUALTEXT };
}

=over 12

=item B<reset()>

Reset a Bio::SeqReader::FastqRecord object. Basically sets all internal
data to empty strings.

=back

=cut

sub reset {
    my $self = shift;

    $self->{ _SEQTEXT }  = '';
    $self->{ _QUALTEXT } = '';
    $self->{ _HEADER1 }  = '';
    $self->{ _HEADER2 }  = '';
}

=over 12

=item B<seq()>

Getter-setter for the sequence text from a Bio::SeqReader::FastqRecord object.

  $so->seq( 'ACGTACGT' );
  print $so->seq();   # => ACGTACGT

=back

=cut

sub seq {
    my $self = shift;

    if ( @_ ) {
        $self->{ _SEQTEXT } = shift;
        $self->{ _SEQTEXT } =~ s/[\000-\037\s]+//g;
    }

    return $self->{ _SEQTEXT };
}

1;

=head1 EXTERNAL DEPENDENCIES

Perl core.

=head1 BUGS

None reported yet, but let me know.

=head1 SEE ALSO

Bio::SeqReader::Fastq, Bio::SeqReader.

=head1 AUTHOR

John A. Crow E<lt>jac_at_cpan_dot_orgE<gt>

=head1 COPYRIGHT AND LICENSE

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.10.0 or,
at your option, any later version of Perl 5 you may have available.

  Copyright (C) 2012 by John A. Crow
  Copyright (C) 2012 by National Center for Genome Resources


=cut