rc_t SRALoaderFmtMake(SRALoaderFmt **self, const SRALoaderConfig *config) { rc_t rc = 0; FastqLoaderFmt* fmt; const PlatformXML* platform; const ProcessingXML* processing; if( self == NULL || config == NULL ) { return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull); } *self = NULL; if( (rc = Experiment_GetProcessing(config->experiment, &processing)) != 0 || (rc = Experiment_GetPlatform(config->experiment, &platform)) != 0 ) { return rc; } fmt = calloc(1, sizeof(*fmt)); if(fmt == NULL) { rc = RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted); LOGERR(klogInt, rc, "failed to initialize; out of memory"); return rc; } if( platform->id == SRA_PLATFORM_454 ) { if( rc == 0 && (rc = SRAWriter454_Make(&fmt->w454, config)) != 0 ) { LOGERR(klogInt, rc, "failed to initialize 454 writer"); } } else if( platform->id == SRA_PLATFORM_ION_TORRENT ) { if( rc == 0 && (rc = SRAWriterIonTorrent_Make(&fmt->wIonTorrent, config)) != 0 ) { LOGERR(klogInt, rc, "failed to initialize Ion Torrent writer"); } } else if( (rc = SRAWriterIllumina_Make(&fmt->wIllumina, config)) != 0 ) { LOGERR(klogInt, rc, "failed to initialize Illumina writer"); } if( rc == 0 && (rc = SRALoaderFmtInit(&fmt->dad, (const SRALoaderFmt_vt*)&vtFastqLoaderFmt)) != 0 ) { LOGERR(klogInt, rc, "failed to initialize parent object"); } if( rc != 0 ) { FastqLoaderFmt_Whack(fmt, NULL); } else { fmt->processing = processing; fmt->spots_bad_allowed = config->spots_bad_allowed; fmt->spots_bad_count = 0; *self = &fmt->dad; } return rc; }
rc_t SFFLoaderFmtMake(SRALoaderFmt** self, const SRALoaderConfig* config) { rc_t rc = 0; SFFLoaderFmt* obj = NULL; const PlatformXML* platform; if( self == NULL || config == NULL ) { return RC(rcSRA, rcFormatter, rcConstructing, rcSelf, rcNull); } *self = NULL; if( (rc = Experiment_GetPlatform(config->experiment, &platform)) != 0 ) { return rc; } obj = calloc(1, sizeof(SFFLoaderFmt)); if(obj == NULL) { return RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted); } if( (rc = SRALoaderFmtInit(&obj->dad, (const SRALoaderFmt_vt*)&vtSFFLoaderFmt)) != 0 ) { LOGERR(klogInt, rc, "failed to initialize parent object"); } else { if( platform->id == SRA_PLATFORM_454 ) { if( (rc = SRAWriter454_Make(&obj->w454, config)) != 0 ) { LOGERR(klogInt, rc, "failed to initialize writer"); } } else { if( (rc = SRAWriterIonTorrent_Make(&obj->wIonTorrent, config)) != 0 ) { LOGERR(klogInt, rc, "failed to initialize Ion Torrent writer"); } } } if(rc == 0) { obj->skip_signal = (config->columnFilter & efltrSIGNAL) && !(config->columnFilter & efltrDEFAULT); *self = &obj->dad; } else { free(obj); } return rc; }
rc_t SRAWriterIllumina_Make(const SRAWriterIllumina** cself, const SRALoaderConfig* config) { rc_t rc = 0; SRAWriterIllumina* self; const PlatformXML* platform; const ReadSpecXML_read* last_read; int32_t spot_len; uint32_t sequence_length; uint8_t nreads; if( cself == NULL || config == NULL ) { return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull); } if( (rc = Experiment_GetPlatform(config->experiment, &platform)) != 0 || (rc = Experiment_GetReadNumber(config->experiment, &nreads)) != 0 || (rc = Experiment_GetSpotLength(config->experiment, &sequence_length)) != 0 || (rc = Experiment_GetRead(config->experiment, nreads - 1, &last_read)) != 0 ) { return rc; } if( platform->id != SRA_PLATFORM_ILLUMINA ) { rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcInvalid); LOGERR(klogErr, rc, "platform type"); return rc; } if( nreads > ILLUMINAWRITER_MAX_NUM_READS ) { rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcUnsupported); PLOGERR(klogErr, (klogErr, rc, "more than $(max) reads", PLOG_U8(max), (uint8_t)ILLUMINAWRITER_MAX_NUM_READS)); return rc; } self = calloc(1, sizeof(*self)); if( self == NULL ) { rc = RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted); return rc; } if( (rc = SRAWriter_Make(&self->base, config)) != 0 ) { LOGERR(klogInt, rc, "failed to initialize base writer"); } self->config = config; self->platform = platform; self->nreads = nreads; self->barcode_read_id = ILLUMINAWRITER_READID_NONE; self->last_read = last_read; self->fixed_read_seg = true; self->col_mask = ILLUMINAWRITER_COLMASK_NOTSET; self->sequence_length = sequence_length; spot_len = sequence_length; do { const ReadSpecXML_read* read_spec; int16_t len = 0; --nreads; if( (rc = Experiment_GetRead(config->experiment, nreads, &read_spec)) != 0 ) { break; } if( read_spec->read_type == rdsp_BarCode_rt ) { if( self->barcode_read_id == ILLUMINAWRITER_READID_NONE ) { self->barcode_read_id = nreads; } else { rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcDuplicate); LOGERR(klogErr, rc, "only on BarCode READ_TYPE per spot supported"); break; } } if( self->fixed_read_seg ) { switch(read_spec->coord_type) { case rdsp_BaseCoord_ct: case rdsp_CycleCoord_ct: len = spot_len - read_spec->coord.start_coord + 1; break; case rdsp_ExpectedBaseCall_ct: case rdsp_ExpectedBaseCallTable_ct: if( read_spec->coord.expected_basecalls.default_length > 0 ) { len = read_spec->coord.expected_basecalls.default_length; } else { rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcUnsupported); } break; case rdsp_RelativeOrder_ct: if( nreads == 0 ) { len = spot_len - 1 + 1; /* as if BASE_COORD == 1 */ break; } default: rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcUnsupported); } if( rc == 0 ) { spot_len -= len; if( spot_len < 0 || len <= 0 ) { rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcInconsistent); LOGERR(klogErr, rc, "SPOT_DECODE_SPEC and SEQUENCE_LENGTH"); } else { SRASegment* seg = &self->read_seg[nreads]; seg->start = spot_len; seg->len = len; DEBUG_MSG(3, ("#%u read fixed length = %i\n", nreads, len)); } } else if( GetRCState(rc) == rcUnsupported ) { self->fixed_read_seg = false; DEBUG_MSG(3, ("not fixed spot segmentation")); rc = 0; } } } while( rc == 0 && nreads > 0 ); if( rc == 0 ) { *cself = self; } else { SRAWriterIllumina_Whack(self, NULL); } return rc; }
rc_t SRAWriteAbsolid_Make(const SRAWriteAbsolid** cself, const SRALoaderConfig* config) { rc_t rc = 0; SRAWriteAbsolid* self; const PlatformXML* platform; const ReadSpecXML_read* read; uint32_t sequence_length; uint8_t nreads; if( cself == NULL || config == NULL ) { return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull); } if( (rc = Experiment_GetPlatform(config->experiment, &platform)) != 0 || (rc = Experiment_GetSpotLength(config->experiment, &sequence_length)) != 0 || (rc = Experiment_GetReadNumber(config->experiment, &nreads)) != 0 ) { return rc; } if( platform->id != SRA_PLATFORM_ABSOLID ) { rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid); LOGERR(klogErr, rc, "platform type"); return rc; } if( nreads > ABSOLID_FMT_MAX_NUM_READS ) { rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcUnsupported); PLOGERR(klogErr, (klogErr, rc, "expected up to $(max) reads", "max=%u", ABSOLID_FMT_MAX_NUM_READS)); return rc; } self = calloc(1, sizeof(*self)); if( self == NULL ) { rc = RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted); return rc; } if( (rc = SRAWriter_Make(&self->base, config)) != 0 ) { LOGERR(klogInt, rc, "failed to initialize base writer"); } else if( (rc = Experiment_GetRead(config->experiment, 0, &read)) != 0 ) { LOGERR(klogInt, rc, "failed to get read 1 descriptor"); } else if( read->coord_type != rdsp_RelativeOrder_ct && read->coord_type != rdsp_BaseCoord_ct ) { rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcInvalid); LOGERR(klogErr, rc, "1st read can be BASE_COORD or RELATIVE_ORDER only"); } else if( read->read_type != rdsp_Forward_rt && read->read_type != rdsp_Reverse_rt ) { LOGMSG(klogWarn, "expected 1st read to be of type 'Forward' or 'Reverse'"); } self->read_seg[0].start = 0; self->read_seg[0].len = sequence_length; if( rc == 0 && nreads >= ABSOLID_FMT_MAX_NUM_READS ) { if( nreads > ABSOLID_FMT_MAX_NUM_READS ) { rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcUnsupported); LOGERR(klogErr, rc, "more than 2 reads"); } else if( (rc = Experiment_GetRead(config->experiment, 1, &read)) != 0 ) { LOGERR(klogErr, rc, "failed to get read 2 descriptor"); } else if( read->coord_type != rdsp_BaseCoord_ct ) { rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcInvalid); LOGERR(klogErr, rc, "2nd read can be BASE_COORD only"); } else if( read->read_type != rdsp_Forward_rt && read->read_type != rdsp_Reverse_rt ) { LOGMSG(klogWarn, "expected 2ndt read to be of type 'Forward' or 'Reverse'"); } if( rc == 0 ) { self->read_seg[1].start = read->coord.start_coord - 1; self->read_seg[1].len = sequence_length - self->read_seg[1].start; self->read_seg[0].len = self->read_seg[1].start; } } #if _DEBUGGING DEBUG_MSG(3, ("%s READ_SEG[%hu,%hu]\n", __func__, self->read_seg[0].start, self->read_seg[0].len)); if( nreads > 1 ) { DEBUG_MSG(3, ("%s READ_SEG[%hu,%hu]\n", __func__, self->read_seg[1].start, self->read_seg[1].len)); } #endif if( rc == 0 ) { self->platform = platform; self->nreads = nreads; *cself = self; } else { SRAWriteAbsolid_Whack(self, NULL); } return rc; }