void CRemoteBlastDbAdapter::x_FetchData(int oid, int begin, int end)
{
    CCachedSeqDataForRemote& cached_seqdata = m_Cache[oid];
    _ASSERT( !cached_seqdata.HasSequenceData(begin, end) );
    _ASSERT( cached_seqdata.GetLength() != 0 );
    _ASSERT( !cached_seqdata.GetIdList().empty() );
    _ASSERT( cached_seqdata.IsValid() );
    const char seqtype = (GetSequenceType() == CSeqDB::eProtein) ? 'p' : 'n';
    
    CRef<CSeq_interval> seq_int
        (new CSeq_interval(*cached_seqdata.GetIdList().front(), begin, end));
    CBlastServices::TSeqIntervalVector seqids(1, seq_int);
    CBlastServices::TSeqIdVector ids;
    CBlastServices::TSeqDataVector seq_data;
    string errors, warnings;
    const bool kVerbose = (getenv("VERBOSE") ? true : false);

    CBlastServices::GetSequenceParts(seqids, m_DbName, seqtype, ids, seq_data,
                                   errors, warnings, kVerbose);
    if (seq_data.empty() || !errors.empty() || !warnings.empty() || 
        ids.empty() ) {
        RemoteBlastDbLoader_ErrorHandler(errors, warnings);
    }
    _ASSERT(ids.size() == seq_data.size());
    cached_seqdata.GetSeqDataChunk(begin, end) = seq_data.front();
    _ASSERT(cached_seqdata.HasSequenceData(begin, end));
}
void CRemoteBlastDbAdapter::x_FetchDataByBatch(const vector<int>& oids, 
                                               const vector<TSeqRange>& ranges)
{
    const char seqtype = (GetSequenceType() == CSeqDB::eProtein) ? 'p' : 'n';
    if (oids.empty()) {
        return;
    }

    CBlastServices::TSeqIntervalVector seqids;
    seqids.reserve(oids.size());
    for (vector<int>::size_type i = 0; i < oids.size(); i++) {
        CCachedSeqDataForRemote& cached_seqdata = m_Cache[oids[i]];
        _ASSERT( !cached_seqdata.HasSequenceData(ranges[i].GetFrom(),
                                                 ranges[i].GetToOpen()) );
        _ASSERT( cached_seqdata.GetLength() != 0 );
        _ASSERT( !cached_seqdata.GetIdList().empty() );
        _ASSERT( cached_seqdata.IsValid() );
    
        CRef<CSeq_interval> seq_int
            (new CSeq_interval(*cached_seqdata.GetIdList().front(), 
                               ranges[i].GetFrom(), ranges[i].GetToOpen()));
        seqids.push_back(seq_int);
    }

    CBlastServices::TSeqIdVector ids;
    CBlastServices::TSeqDataVector seq_data;
    string errors, warnings;
    const bool kVerbose = (getenv("VERBOSE") ? true : false);

    CBlastServices::GetSequenceParts(seqids, m_DbName, seqtype, ids, seq_data,
                                   errors, warnings, kVerbose);
    if (seq_data.empty() || !errors.empty() || !warnings.empty() || 
        ids.empty() ) {
        RemoteBlastDbLoader_ErrorHandler(errors, warnings);
    }
    _ASSERT(seqids.size() == ids.size());
    _ASSERT(ids.size() == seq_data.size());

    for (vector<int>::size_type i = 0; i < oids.size(); i++) {
        CCachedSeqDataForRemote& cached_seqdata = m_Cache[oids[i]];
        cached_seqdata.GetSeqDataChunk(ranges[i].GetFrom(), 
                                       ranges[i].GetToOpen()) = seq_data[i];
        _ASSERT(cached_seqdata.HasSequenceData(ranges[i].GetFrom(),
                                               ranges[i].GetToOpen()));
    }
}
Beispiel #3
0
// very specific "set_diff" for integers
SEXP set_diff(SEXP x, int n) {
    SEXP ans, xmatch;
    int i, j = 0, *buf;
    if (TYPEOF(x) != INTSXP) error("'x' must be an integer");
    if (n <= 0) error("'n' must be a positive integer");
    xmatch = match(x, seq_int(n, 1), 0); // took a while to realise: matches vec against x - thanks to comment from Matthew in assign.c!
    
    buf = (int *) R_alloc(n, sizeof(int));
    for (i=0; i<n; i++) {
        if (INTEGER(xmatch)[i] == 0) {
            buf[j++] = i+1;
        }
    }
    n = j;
    PROTECT(ans = allocVector(INTSXP, n));
    memcpy(INTEGER(ans), buf, sizeof(int) * n); // sizeof is of type size_t - no integer overflow issues
    UNPROTECT(1);
    return(ans);
}