static rc_t MaxNReadsValidator_GetKey( const SRASplitter* cself, const char** key, spotid_t spot, readmask_t* readmask ) { rc_t rc = 0; MaxNReadsValidator* self = ( MaxNReadsValidator* )cself; if ( self == NULL || key == NULL ) { rc = RC( rcSRA, rcNode, rcExecuting, rcParam, rcNull ); } else { const void* nreads = NULL; bitsz_t o = 0, sz = 0; uint64_t nn = 0; *key = ""; if ( self->col != NULL ) { rc = SRAColumnRead( self->col, spot, &nreads, &o, &sz ); if ( rc == 0 ) { switch( sz ) { case 8: nn = *((const uint8_t*)nreads); break; case 16: nn = *((const uint16_t*)nreads); break; case 32: nn = *((const uint32_t*)nreads); break; case 64: nn = *((const uint64_t*)nreads); break; default: rc = RC( rcSRA, rcNode, rcExecuting, rcData, rcUnexpected ); break; } if ( nn > nreads_max ) { clear_readmask( readmask ); PLOGMSG(klogWarn, (klogWarn, "too many reads $(nreads) at spot id $(row), maximum $(max) supported, skipped", PLOG_3(PLOG_U64(nreads),PLOG_I64(row),PLOG_U32(max)), nn, spot, nreads_max)); } else if ( nn == nreads_max - 1 ) { PLOGMSG(klogWarn, (klogWarn, "too many reads $(nreads) at spot id $(row), truncated to $(max)", PLOG_3(PLOG_U64(nreads),PLOG_I64(row),PLOG_U32(max)), nn + 1, spot, nreads_max)); } } } } return rc; }
static rc_t AbsolidLabelerFilter_GetKeySet(const SRASplitter* cself, const SRASplitter_Keys** key, uint32_t* keys, spotid_t spot, const readmask_t* readmask) { rc_t rc = 0; AbsolidLabelerFilter* self = (AbsolidLabelerFilter*)cself; if( self == NULL || key == NULL ) { rc = RC(rcExe, rcNode, rcExecuting, rcParam, rcInvalid); } else { *keys = 0; if( rc == 0 && (rc = AbsolidReaderSeekSpot(self->reader, spot)) == 0 ) { uint32_t num_reads = 0; if( (rc = AbsolidReader_SpotInfo(self->reader, NULL, NULL, NULL, &num_reads)) == 0 ) { uint32_t readId, q; const char* read_label; INSDC_coord_len read_label_sz = 0; INSDC_coord_len read_len = 0; *key = self->keys; *keys = sizeof(self->keys) / sizeof(self->keys[0]); for(q = 0; q < *keys; q++) { clear_readmask(self->keys[q].readmask); } for(q = 0, readId = 0; rc == 0 && readId < num_reads; readId++) { if( !isset_readmask(readmask, readId) ) { continue; } rc = AbsolidReader_SpotReadInfo(self->reader, readId + 1, NULL, &read_label, &read_label_sz, NULL, &read_len); if( read_len == 0 ) { continue; } if( self->is_platform_cs_native ) { uint32_t i; for(i = 0; i < *keys; i++) { if( read_label_sz == self->key_sz[i] && strncmp(read_label, self->keys[i].key, read_label_sz) == 0 ) { set_readmask(self->keys[i].readmask, readId); break; } } if( i >= *keys ) { rc = RC(rcExe, rcNode, rcExecuting, rcTag, rcUnexpected); } } else { /* since prev filter leaves only 2 first bio reads labels F3 and R3 wil be used */ set_readmask(self->keys[q].readmask, readId); } q++; } } } else if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound ) { SRA_DUMP_DBG (3, ("%s skipped %u row\n", __func__, spot)); rc = 0; } } return rc; }
/* skip all reads with len < minreadlen */ static rc_t AbsolidReadLenFilter_GetKey(const SRASplitter* cself, const char** key, spotid_t spot, readmask_t* readmask) { rc_t rc = 0; AbsolidReadLenFilter* self = (AbsolidReadLenFilter*)cself; if( self == NULL || key == NULL ) { rc = RC(rcExe, rcNode, rcExecuting, rcParam, rcInvalid); } else { *key = ""; if( rc == 0 && (rc = AbsolidReaderSeekSpot(self->reader, spot)) == 0 ) { uint32_t num_reads = 0; if( (rc = AbsolidReader_SpotInfo(self->reader, NULL, NULL, NULL, &num_reads)) == 0 ) { uint32_t readId; make_readmask(new_mask); INSDC_coord_len read_len = 0; clear_readmask(new_mask); for(readId = 0; rc == 0 && readId < num_reads; readId++) { if( !isset_readmask(readmask, readId) ) { continue; } rc = AbsolidReader_SpotReadInfo(self->reader, readId + 1, NULL, NULL, NULL, NULL, &read_len); if( rc == 0 && read_len > 0 ) { set_readmask(new_mask, readId); } } copy_readmask(new_mask, readmask); } } else if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound ) { SRA_DUMP_DBG (3, ("%s skipped %u row\n", __func__, spot)); *key = NULL; rc = 0; } } return rc; }
/* leave only up to 2 first bio reads */ static rc_t Absolid2BioFilter_GetKey(const SRASplitter* cself, const char** key, spotid_t spot, readmask_t* readmask) { rc_t rc = 0; Absolid2BioFilter* self = (Absolid2BioFilter*)cself; if( self == NULL || key == NULL ) { rc = RC(rcExe, rcNode, rcExecuting, rcParam, rcInvalid); } else { if( (rc = AbsolidReaderSeekSpot(self->reader, spot)) == 0 ) { uint32_t num_reads = 0; if( (rc = AbsolidReader_SpotInfo(self->reader, NULL, NULL, NULL, &num_reads)) == 0 ) { uint32_t q, readId; make_readmask(new_mask); SRAReadTypes read_type = SRA_READ_TYPE_TECHNICAL; clear_readmask(new_mask); for(q = 0, readId = 0; rc == 0 && readId < num_reads && q < 2; readId++) { if( (rc = AbsolidReader_SpotReadInfo(self->reader, readId + 1, &read_type, NULL, NULL, NULL, NULL)) == 0 ) { if( read_type & SRA_READ_TYPE_BIOLOGICAL ) { set_readmask(new_mask, readId); q++; } } } *key = ""; copy_readmask(new_mask, readmask); } } else if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound ) { SRA_DUMP_DBG (3, ("%s skipped %u row\n", __func__, spot)); *key = NULL; rc = 0; } } return rc; }
static rc_t ReadFilterSplitter_GetKeySet( const SRASplitter* cself, const SRASplitter_Keys** key, uint32_t* keys, spotid_t spot, const readmask_t* readmask ) { rc_t rc = 0; ReadFilterSplitter* self = ( ReadFilterSplitter* )cself; if ( self == NULL || key == NULL ) { rc = RC( rcSRA, rcNode, rcExecuting, rcParam, rcNull ); } else { const INSDC_SRA_read_filter* rdf; bitsz_t o = 0, sz = 0; *keys = 0; if ( self->col_rdf != NULL ) { rc = SRAColumnRead( self->col_rdf, spot, (const void **)&rdf, &o, &sz ); if ( rc == 0 ) { int32_t j, i = sz / sizeof( INSDC_SRA_read_filter ) / 8; *key = self->keys; *keys = sizeof( self->keys ) / sizeof( self->keys[ 0 ] ); for ( j = 0; j < *keys; j++ ) { clear_readmask( self->keys[ j ].readmask ); } while ( i > 0 ) { i--; if ( self->read_filter != 0xFF && self->read_filter != rdf[i] ) { /* skip by filter value != to command line */ } else if ( rdf[ i ] == SRA_READ_FILTER_PASS ) { set_readmask( self->keys[ EReadFilterSplitter_pass ].readmask, i ); } else if ( rdf[ i ] == SRA_READ_FILTER_REJECT ) { set_readmask( self->keys[ EReadFilterSplitter_reject ].readmask, i ); } else if( rdf[ i ] == SRA_READ_FILTER_CRITERIA ) { set_readmask( self->keys[ EReadFilterSplitter_criteria ].readmask, i ); } else if( rdf[ i ] == SRA_READ_FILTER_REDACTED ) { set_readmask( self->keys[ EReadFilterSplitter_redacted ].readmask, i ); } else { set_readmask( self->keys[ EReadFilterSplitter_unknown ].readmask, i ); PLOGMSG( klogWarn, ( klogWarn, "unknown READ_FILTER value $(value) at spot id $(row)", PLOG_2( PLOG_U8( value ), PLOG_I64( row ) ), rdf[ i ], spot ) ); } } } } } return rc; }