rc_t extract_statistic_from_row( statistic * data, row_input * row_data, const int64_t row_id ) { rc_t rc = 0; spotgrp *sg; /* first try the SPOT_GROUP column (correct for newer db's) */ char * spotgrp_base = row_data->spotgroup; uint32_t spotgrp_len = row_data->spotgroup_len; /* first try the SPOT_GROUP column (correct for newer db's) */ if ( spotgrp_len < 1 || *spotgrp_base == 0 ) { /* if empty try with SEQ_SPOT_GROUP column (correct for older db's) */ spotgrp_base = row_data->seq_spotgroup; spotgrp_len = row_data->seq_spotgroup_len; } sg = find_spotgroup( data, spotgrp_base, spotgrp_len ); if ( sg == NULL ) { sg = make_spotgrp( spotgrp_base, spotgrp_len ); if ( sg == NULL ) { rc = RC( rcApp, rcSelf, rcConstructing, rcMemory, rcExhausted ); PLOGERR( klogInt, ( klogInt, rc, "make_spotgrp failed at row $(row_nr)", "row_nr=%lu", row_id ) ); } else { rc = BSTreeInsert ( &data->spotgroups, (BSTNode *)sg, spotgroup_sort ); if ( rc != 0 ) { PLOGERR( klogInt, ( klogInt, rc, "BSTreeInsert( new spotgroup ) at row $(row_nr)", "row_nr=%lu", row_id ) ); } } } if ( rc == 0 ) { uint32_t n_bases = row_data->read_len; if ( ( n_bases == row_data->quality_len ) && ( n_bases == row_data->has_mismatch_len ) ) { rc = extract_spotgroup_statistic( data, sg, n_bases, row_data, row_id ); } else { rc = RC( rcApp, rcNoTarg, rcConstructing, rcData, rcInvalid ); PLOGERR( klogInt, ( klogInt, rc, "number of bases, quality and has_mismatch is not the same at row $(row_nr)", "row_nr=%lu", row_id ) ); } } return rc; }
rc_t extract_statistic_from_row(statistic *self, row_input const *data) { rc_t rc = 0; spotgrp *sg; char const *spotgrp_base; uint32_t spotgrp_len; unsigned i; uint8_t lb = 4; unsigned hpr = 0; unsigned gcc = 0; if (data == NULL) { return RC(rcXF, rcFunction, rcExecuting, rcParam, rcNull); } if (self == NULL) { return RC(rcXF, rcFunction, rcExecuting, rcSelf, rcNull); } rc = validate_row_data(self, data); if (rc) return rc; spotgrp_base = data->spotgroup; spotgrp_len = data->spotgroup_len; if (spotgrp_base == NULL || spotgrp_len == 0) { spotgrp_base = ""; spotgrp_len = 0; } sg = find_spotgroup( self, spotgrp_base, spotgrp_len ); if ( sg == NULL ) { sg = make_spotgrp( spotgrp_base, spotgrp_len ); if ( sg == NULL ) { return RC( rcXF, rcFunction, rcExecuting, rcMemory, rcExhausted ); } else { rc = BSTreeInsert ( &self->spotgroups, (BSTNode *)sg, spotgroup_sort ); if (rc) return rc; } } for (i = 0; i < data->read_len && rc == 0; ++i) { unsigned const base = data->read[i]; unsigned dimer; if (base > 3) { dimer = 16; hpr = 0; } else { dimer = (lb > 3) ? 16 : ((lb << 2) | base); if (lb == base) ++hpr; else hpr = 0; } if (i > 0) rc = spotgroup_enter_values(sg, data->quality[i], dimer, gcc, hpr, data->base_pos_offset + i, CASE_MATCH); if (base == 1 || base == 2) ++gcc; if (i >= self->gc_window) { unsigned const out = data->read[i - self->gc_window]; if (out == 1 || out == 2) --gcc; } lb = base; } return rc; }