Hi, Alexandre,

Thanks for bring this issue to our attention.  My first impression was 
that your input data might be missing a end-of-line or some such 
thing, but guess you suspect that ibis::colFloats::segment is in 
trouble.  Would you mind check whether your input CSV file is indeed 
missing the end-of-line for the last line?  In the mean time, I will 
look into ibis::colFloats::segment..

John


On 8/27/2009 8:59 AM, Alexandre Maurel wrote:
> Hello,
> 
> I used ardea to generate a table using the following :
> 
> Barcode    Row    Col    Cycle    Sample
> 100220    1    1    30    sample1
> 100220    1    1    36    sample1
> 100220    1    2    30    sample1
> 100220    1    2    36    sample1
> 100220    2    1    30    sample1
> 100220    2    1    36    sample1
> 100220    2    2    30    sample1
> 100220    2    2    36    sample1
> 100220    3    3    38    sample2
> 100220    4    4    38    sample2
> 
> ardea -d tmp -m 
> "Barcode:float,Row:float,Col:float,Cycle:float,Sample:category" -t Array.txt
> 
> then using ibis,
> 
> ibis -d tmp -q "select Barcode,Row,Col,Cycle,Sample where Row > 0"
> 
> result gives ....
> 
> Barcode, Row, Col, Cycle, Sample (with counts)
> 100220, 1, 1, 30, sample1,      1
> 100220, 1, 1, 36, sample1,      1
> 100220, 1, 2, 30, sample1,      1
> 100220, 1, 2, 36, sample1,      1
> 100220, 2, 1, 30, sample1,      1
> 100220, 2, 1, 36, sample1,      1
> 100220, 2, 2, 30, sample1,      1
> 100220, 2, 2, 36, sample1,      1
> 100220, 3, 3, 38, sample2,      2
> 
> which is wrong the last row is missing ....
> 
> Here how I solved this bug
> 
> array_t<uint32_t>*
> ibis::colFloats::segment(const array_t<uint32_t>* old) const {
>     array_t<uint32_t>* res = new array_t<uint32_t>;
>    // res->push_back(0); // the first number is always 0
>     uint32_t j = 0;
>     float target = *(array->begin());
>     const uint32_t nelm = array->size();
> 
>     if (old != 0 && old->size()>2) {
>     // find segments with in the previously defined segments
>         for (uint32_t i=0; i<old->size()-1; ++i) {
>             if (j < nelm) {
>                 res->push_back(j);
>                 target = (*array)[j];
>                 ++ j;
>                 if (j < nelm) {
>                     do {
>                         while (j < (*old)[i+1] && (*array)[j] == target) 
> ++ j;
>                         if (j < (*old)[i+1]) {
>                             res->push_back(j);
>                             if (j < nelm) {
>                                 target = (*array)[j];
>                                 ++ j;
>                             }
>                         }
>                     } while (j < (*old)[i+1]);
>                 }
>             };
>         }
>     }
>     else { // start with all elements in one segment
>     res->push_back(0); // the first number is always 0
>     uint32_t j = 1;
>     while (j < nelm) {
>         while (j < nelm && (*array)[j] == target)
>         ++ j;
>         res->push_back(j);
>         if (j < nelm) {
>         target = (*array)[j];
>         ++ j;
>         }
>     }
>     }
>     if (res->back() < nelm)
>     res->push_back(nelm);
>     return res;
> } // ibis::colFloats::segment
> 
> 
> Hope this help.
> 
> Alexandre Maurel
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> FastBit-users mailing list
> [email protected]
> https://hpcrdm.lbl.gov/cgi-bin/mailman/listinfo/fastbit-users
_______________________________________________
FastBit-users mailing list
[email protected]
https://hpcrdm.lbl.gov/cgi-bin/mailman/listinfo/fastbit-users

Reply via email to