void RegionTrackerReader::ReadFlowIndex() { // side-effect is to initialize flowToIndex with hdf5 contents // hyperslab layout in file // 1 x numFlows // start position [0, 0] for flowToIndex vector<hsize_t> offset(2); offset[0] = 0; offset[1] = 0; // read out 1 x numFlows vector<hsize_t> count(2); count[0] = 1; count[1] = numFlows; // memory layout for each slab we read in 1 x numFlows // start position in memory slab is [0] vector<hsize_t> offset_out(1); offset_out[0] = 0; // read in 1 x numFlows vector<hsize_t> count_out(1); count_out[0] = numFlows; H5ReplayReader reader = H5ReplayReader(clo, FLOWINDEX); reader.Read(offset, count, offset_out, count_out, &flowToIndex[0]); fprintf(stdout, "H5 RegionTrackerReader flowToIndex: region %d: %d, %d, ...\n", regionindex, flowToIndex[0], flowToIndex[1]); // start position [1, 0] for flowToBlockId offset[0] = 1; offset[1] = 0; // count and memory layout is the same as for flowToIndex reader.Read(offset, count, offset_out, count_out, &flowToBlockId[0]); fprintf(stdout, "H5 RegionTrackerReader flowToBlockId: region %d: %d, %d, ...\n", regionindex, flowToBlockId[0], flowToBlockId[1]); }
void *do_subset(void* data) { pthread_detach( pthread_self() ); struct thread_args *args = (struct thread_args *)data; hsize_t row = args->row; hsize_t col = args->col; vector<hsize_t>chunks( * (args->chunks)); vector<hsize_t>dims(* (args->dims)); string h5file_in = string(* (args->h5file_in)); string source = string( * (args->source)); string h5file_out = string(* (args->h5file_out)); string destination = string(* (args->destination)); hsize_t offset_out_0 = args->offset_out; hsize_t count_out_0 = args->count_out; vector<size_t>input_positions(* (args->input_positions)); unsigned int thread_id = args->thread_id; unsigned int flowlimit = args->flowlimit; H5ReplayReader reader = H5ReplayReader(h5file_in, &source[0]); H5ReplayRecorder recorder = H5ReplayRecorder(h5file_out, &destination[0]); // read a chunk in vector<hsize_t> offset(3); offset.At(0) = row; offset.At(1) = col; offset.At(2) = 0; vector<hsize_t> count(3); count.At(0) = ( row+chunks.At(0) < dims.At(0) ) ? chunks.At(0) : dims.At(0)-row; count.At(1) = ( col+chunks.At(1) < dims.At(1) ) ? chunks.At(1) : dims.At(1)-col; count.At(2) = dims.At(2); vector<float> signal(count.At(0) * count.At(1) * count.At(2)); vector<float> subset(count_out_0*count.At(2)); vector<hsize_t> offset_in(1); offset_in.At(0) = 0; vector<hsize_t> count_in(1, signal.size()); // fprintf(stdout, "thread_id %d reading %d from row=%d (max %d), %d from column=%d (max %d)\n", thread_id, (int)count.At(0), (int)row, (int)dims.At(0), (int)count.At(1), (int)col, (int)dims.At(1)); reader.Read(offset, count, offset_in, count_in, &signal[0]); // now subset well at a time size_t ix = 0; size_t incr = 0; vector<size_t> subset_input_positions(count_out_0); for (size_t rr=row; rr<(row+count.At(0)) && ix < input_positions.size(); rr++) { for (size_t cc=col; cc<(col+count.At(1)) && ix < input_positions.size(); cc++) { size_t pos = input_positions.At(ix); size_t chp_indx = RowColToIndex1(rr,cc, dims.At(0), dims.At(1)); if ( chp_indx < pos) continue; while ( chp_indx > pos){ ix++; if (ix == input_positions.size()) break; pos = input_positions.At(ix); } if( chp_indx == pos) { size_t array_indx = RowColToIndex1(rr-row,cc-col,count.At(0),count.At(1))*dims.At(2); // fprintf(stdout, "thread_id=%d: Position match %lu at chip rr=%lu, rr-row=%d, cc=%lu, cc-col=%d, (array_indx=%lu)/(dims[2]=%llu)=%llu\n", thread_id, pos, rr, (int)(rr-row), cc, (int)(cc-col), array_indx, dims.At(2), array_indx/dims.At(2)); for(size_t flow=0; flow<flowlimit; flow++) subset.At(incr*dims.At(2) + flow) = signal.At( array_indx + flow); assert (incr < count_out_0 ); subset_input_positions.At(incr) = input_positions.At(ix); incr++; ix++; } assert (ix <= input_positions.size() ); } } assert (incr == count_out_0 ); // write the chunk back out vector<hsize_t> count_out(2); count_out.At(0) = count_out_0; count_out.At(1) = dims.At(2); vector<hsize_t> offset_out(2); offset_out.At(0) = offset_out_0; offset_out.At(1) = 0; vector<hsize_t> offset_in_subset(1,0); vector<hsize_t> count_in_subset(1,subset.size()); recorder.Write(offset_out, count_out, offset_in_subset, count_in_subset, &subset[0]); { string position = "position"; H5ReplayRecorder recorder_pos = H5ReplayRecorder(h5file_out, &position[0]); vector<hsize_t> offset_pos(1, offset_out.At(0)); vector<hsize_t> count_pos(1, count_out.At(0)); recorder_pos.Write(offset_pos, count_pos, offset_in, count_pos, &subset_input_positions[0]); } thread_flags.at(thread_id) = 0; int ret = 0; pthread_exit(&ret); return(NULL); }
void *compute_norm(void* data) { // fprintf(stdout, "Thread count %d\n", thread_count); pthread_detach( pthread_self() ); struct compute_norm_args *args = (struct compute_norm_args *)data; hsize_t row = args->row; hsize_t col = args->col; vector<hsize_t>chunks( * (args->chunks)); vector<hsize_t>dims(* (args->dims)); string h5file = string(* (args->h5file)); string source = string( * (args->source)); string destination = string(* (args->destination)); unsigned int thread_id = args->thread_id; unsigned int flowlimit = args->flowlimit; H5ReplayReader reader = H5ReplayReader(h5file, &source[0]); H5ReplayRecorder recorder = H5ReplayRecorder(h5file, &destination[0]); // read a chunk in vector<hsize_t> offset(3); offset[0] = row; offset[1] = col; offset[2] = 0; vector<hsize_t> count(3); count[0] = ( row+chunks[0] < dims[0] ) ? chunks[0] : dims[0]-row; count[1] = ( col+chunks[1] < dims[1] ) ? chunks[1] : dims[1]-col; count[2] = dims[2]; vector<float> signal(count[0] * count[1] * count[2], 0); vector<float> normed_signal(signal.size(), 0); vector<hsize_t> offset_in(1); offset_in[0] = 0; vector<hsize_t> count_in(1); count_in[0] = signal.size(); // fprintf(stdout, "thread_id %d reading %d from row=%d (max %d), %d from column=%d (max %d)\n", thread_id, (int)count[0], (int)row, (int)dims[0], (int)count[1], (int)col, (int)dims[1]); reader.Read(offset, count, offset_in, count_in, &signal[0]); // now normalize a well at a time size_t ix = 0; for (size_t rr=0; rr<count[0]; rr++) { for (size_t cc=0; cc<count[1]; cc++) { size_t wellindex = ix*count[2]; ix++; vector<double> peaks; assert (flowlimit <= dims[2] ); vector<float>dat(signal.begin()+wellindex, signal.begin()+wellindex+flowlimit); vector<float>normalized(dat.size(), 0); NoKeyCall nkc; nkc.SetBeadLocation(cc+col,rr+row); nkc.GetPeaks(dat, peaks); float failure_to_normalize_value = -1.0f; nkc.NormalizeBeadSignal(dat, peaks, normalized, failure_to_normalize_value); // vector<float>normalized(dat.size(), 1); // stick it back in signal double v = 0; for (size_t fnum = 0; fnum < count[2]; fnum++){ if (fnum < flowlimit) { *(normed_signal.begin()+wellindex+fnum) = normalized[fnum]; v += fabs(normalized[fnum]); } else { *(normed_signal.begin()+wellindex+fnum) = 0; } } assert(v>0); } } // write the chunk back out vector<hsize_t> extension(3); extension[0] = row+count[0]; extension[1] = col+count[1]; extension[2] = count[2]; recorder.ExtendDataSet(extension); // extend if necessary recorder.Write(offset, count, offset_in, count_in, &normed_signal[0]); thread_flags.at(thread_id) = 0; int ret = 0; pthread_exit(&ret); return(NULL); }