Пример #1
0
void MultiFlowComputeCumulativeIncorporationSignal ( struct bead_params *p,struct reg_params *reg_p, float *ivalPtr,
    NucStep &cache_step, incorporation_params_block_flows &cur_bead_block,
    TimeCompression &time_c, flow_buffer_info &my_flow,  PoissonCDFApproxMemo *math_poiss )
{
  // only side effect should be new values in ivalPtr

  // this is region wide
  //This will short-circuit if has been computed
  cache_step.CalculateNucRiseCoarseStep ( reg_p,time_c,my_flow );
  // pretend I'm making a parallel process
  FillIncorporationParamsBlockFlows ( &cur_bead_block, p,reg_p,my_flow.flow_ndx_map,my_flow.buff_flow );
  // "In parallel, across flows"
  float* nuc_rise_ptr[NUMFB];
  float* incorporation_rise[NUMFB];
  int my_start[NUMFB];
  for ( int fnum=0; fnum<NUMFB; fnum++ )
  {
    nuc_rise_ptr[fnum]      = cache_step.NucCoarseStep ( fnum );
    incorporation_rise[fnum]= &ivalPtr[fnum*time_c.npts() ];
    my_start[fnum] = cache_step.i_start_coarse_step[fnum];
  }
  // this is >almost< a parallel operation by flows now
  bool use_my_parallel=true;
  if ( use_my_parallel )
  {
    //@TODO handle cases of fewer than 4 flows remaining
    for ( int fnum=0; fnum<NUMFB; fnum+=4 )
    {

      ParallelSimpleComputeCumulativeIncorporationHydrogens ( &incorporation_rise[fnum], time_c.npts(), &time_c.deltaFrameSeconds[0],&nuc_rise_ptr[fnum],
          ISIG_SUB_STEPS_MULTI_FLOW,  &my_start[fnum], &p->Ampl[fnum],
          &cur_bead_block.SP[fnum],&cur_bead_block.kr[fnum], &cur_bead_block.kmax[fnum], &cur_bead_block.d[fnum], &cur_bead_block.molecules_to_micromolar_conversion[fnum], math_poiss );
      for ( int q=0; q<4; q++ )
        MultiplyVectorByScalar ( incorporation_rise[fnum+q], cur_bead_block.sens[fnum+q],time_c.npts() );  // transform hydrogens to signal
    }
  }
  else
  {
    for ( int fnum=0;fnum<NUMFB;fnum++ )
    {
      ComputeCumulativeIncorporationHydrogens ( incorporation_rise[fnum], time_c.npts(),
          &time_c.deltaFrameSeconds[0], nuc_rise_ptr[fnum], ISIG_SUB_STEPS_MULTI_FLOW, my_start[fnum],
          cur_bead_block.C[fnum], p->Ampl[fnum], cur_bead_block.SP[fnum], cur_bead_block.kr[fnum], cur_bead_block.kmax[fnum], cur_bead_block.d[fnum],cur_bead_block.molecules_to_micromolar_conversion[fnum], math_poiss );

      MultiplyVectorByScalar ( incorporation_rise[fnum], cur_bead_block.sens[fnum],time_c.npts() );  // transform hydrogens to signal
    }
  }
}
Пример #2
0
//@TODO:  Revert local bead correction here
// For refining "time" shifts, we want to use sampled beads, so don't do bkg subtraction on everything and munge the buffers.
void RefineFit::FitAmplitudePerBeadPerFlow (int ibd, NucStep &cache_step, int flow_block_size, int flow_block_start)
{
  int fitType[flow_block_size];
  BeadParams *p = &bkg.region_data->my_beads.params_nn[ibd];
  float block_signal_corrected[bkg.region_data->my_scratch.bead_flow_t];
  float block_signal_predicted[bkg.region_data->my_scratch.bead_flow_t];
  float washoutThreshold = bkg.getWashoutThreshold();
  int washoutFlowDetection = bkg.getWashoutFlowDetection();

  SupplyMultiFlowSignal (block_signal_corrected, ibd, flow_block_size, flow_block_start);

  if (bkg.global_defaults.signal_process_control.exp_tail_fit)
     my_exp_tail_fit.CorrectTraces(block_signal_corrected,bkg.region_data->my_scratch.shifted_bkg,
        p,&bkg.region_data->my_regions.rp,
        bkg.region_data_extras.my_flow,bkg.region_data->time_c, flow_block_size, flow_block_start);

  error_track err_t; // temporary store errors for this bead this flow
  for (int fnum=0;fnum < flow_block_size;fnum++)
  {
    float evect[bkg.region_data->time_c.npts()];
    bkg.region_data->emphasis_data.CustomEmphasis (evect, p->Ampl[fnum]);
    float *signal_corrected = &block_signal_corrected[fnum*bkg.region_data->time_c.npts()];
    float *signal_predicted = &block_signal_predicted[fnum*bkg.region_data->time_c.npts()];
    int NucID = bkg.region_data_extras.my_flow->flow_ndx_map[fnum];
	  fitType[fnum] = 
      my_single_fit.FitOneFlow (fnum,evect,p,&err_t, signal_corrected,signal_predicted, 
        NucID,cache_step.NucFineStep (fnum),cache_step.i_start_fine_step[fnum],
        flow_block_start,bkg.region_data->time_c,bkg.region_data->emphasis_data,bkg.region_data->my_regions);
  }
  //int reg = bkg.region_data->region->index;
  //printf("RefineFit::FitAmplitudePerBeadPerFlow... (r,b)=(%d,%d) predicted[10]=%f corrected[10]=%f\n",reg,ibd,block_signal_predicted[10],block_signal_corrected[10]);
  // note: predicted[0:7]=0 most of the time, my_start=8 or 9

// do things with my error vector for this bead

  // now detect corruption & store average error
  p->DetectCorruption (err_t, washoutThreshold, washoutFlowDetection, flow_block_size);
  // update error here to be passed to later block of flows
  // don't keep individual flow errors because we're surprisingly tight on memory
  p->UpdateCumulativeAvgError (err_t, flow_block_start + flow_block_size, flow_block_size); // current flow reached, 1-based

  // send prediction to hdf5 if necessary
  CrazyDumpToHDF5(p,ibd,block_signal_predicted, block_signal_corrected, fitType, err_t, flow_block_start );
}
Пример #3
0
//@TODO:  Revert local bead correction here
// For refining "time" shifts, we want to use sampled beads, so don't do bkg subtraction on everything and munge the buffers.
void RefineFit::FitAmplitudePerBeadPerFlow (int ibd, NucStep &cache_step)
{
  bead_params *p = &bkg.region_data->my_beads.params_nn[ibd];
  float block_signal_corrected[bkg.region_data->my_scratch.bead_flow_t];
  float block_signal_predicted[bkg.region_data->my_scratch.bead_flow_t];

  SupplyMultiFlowSignal (block_signal_corrected, ibd);

  if (bkg.global_defaults.signal_process_control.exp_tail_fit)
     my_exp_tail_fit.CorrectTraces(block_signal_corrected,bkg.region_data->my_scratch.shifted_bkg,p,&bkg.region_data->my_regions.rp,
                                   &bkg.region_data->my_flow,bkg.region_data->time_c);

  error_track err_t; // temporary store errors for this bead this flow
  for (int fnum=0;fnum < NUMFB;fnum++)
  {
    float evect[bkg.region_data->time_c.npts()];
    //local_emphasis[fnum].CustomEmphasis (evect,p->Ampl[fnum]);
    bkg.region_data->emphasis_data.CustomEmphasis (evect, p->Ampl[fnum]);
    float *signal_corrected = &block_signal_corrected[fnum*bkg.region_data->time_c.npts()];
    float *signal_predicted = &block_signal_predicted[fnum*bkg.region_data->time_c.npts()];
    int NucID = bkg.region_data->my_flow.flow_ndx_map[fnum];

    my_single_fit.FitOneFlow (fnum,evect,p,&err_t, signal_corrected,signal_predicted, NucID,cache_step.NucFineStep (fnum),cache_step.i_start_fine_step[fnum],bkg.region_data->my_flow,bkg.region_data->time_c,bkg.region_data->emphasis_data,bkg.region_data->my_regions);
  }

// do things with my error vector for this bead

  // now detect corruption & store average error
  DetectCorruption (p,err_t, WASHOUT_THRESHOLD, WASHOUT_FLOW_DETECTION);
  // update error here to be passed to later block of flows
  // don't keep individual flow errors because we're surprisingly tight on memory
  UpdateCumulativeAvgError (p,err_t,bkg.region_data->my_flow.buff_flow[NUMFB-1]+1); // current flow reached, 1-based

  // if necessary, send the errors to HDF5
  bkg.global_state.SendErrorVectorToHDF5 (p,err_t, bkg.region_data->region,bkg.region_data->my_flow);
  // send prediction to hdf5 if necessary
  bkg.global_state.SendPredictedToHDF5(ibd, block_signal_predicted, *bkg.region_data);
  bkg.global_state.SendCorrectedToHDF5(ibd, block_signal_corrected, *bkg.region_data);
  bkg.global_state.SendXtalkToHDF5(ibd, bkg.region_data->my_scratch.cur_xtflux_block, *bkg.region_data);
}
Пример #4
0
void MathModel::MultiFlowComputeCumulativeIncorporationSignal ( 
    struct BeadParams *p,struct reg_params *reg_p, float *ivalPtr,
    NucStep &cache_step, incorporation_params_block_flows &cur_bead_block,
    const TimeCompression &time_c, const FlowBufferInfo &my_flow,  
    PoissonCDFApproxMemo *math_poiss, int flow_block_size,
    int flow_block_start )
{
  // only side effect should be new values in ivalPtr

  // this is region wide
  //This will short-circuit if has been computed
  cache_step.CalculateNucRiseCoarseStep ( reg_p,time_c,my_flow );

  // pretend I'm making a parallel process
  FillIncorporationParamsBlockFlows ( &cur_bead_block, p,reg_p,my_flow.flow_ndx_map,
                                      flow_block_start, flow_block_size );

  // "In parallel, across flows"
  const float** nuc_rise_ptr = new const float *[flow_block_size];
  float** incorporation_rise = new float *[flow_block_size];
  int* my_start = new int[flow_block_size];
  for ( int fnum=0; fnum<flow_block_size; fnum++ )
  {
    nuc_rise_ptr[fnum]       = cache_step.NucCoarseStep ( fnum );
    incorporation_rise[fnum] = &ivalPtr[fnum*time_c.npts() ];
    my_start[fnum]           = cache_step.i_start_coarse_step[fnum];
  }
  // this is >almost< a parallel operation by flows now
  bool use_my_parallel= (flow_block_size%4 == 0);
  if ( use_my_parallel )
  {
    //@TODO handle cases of fewer than 4 flows remaining
    for ( int fnum=0; fnum<flow_block_size; fnum+=4 )
    {
      MathModel::ParallelSimpleComputeCumulativeIncorporationHydrogens ( 
          &incorporation_rise[fnum], time_c.npts(), &time_c.deltaFrameSeconds[0],
          &nuc_rise_ptr[fnum],
          ISIG_SUB_STEPS_MULTI_FLOW,  &my_start[fnum], &p->Ampl[fnum],
          &cur_bead_block.SP[fnum],&cur_bead_block.kr[fnum], &cur_bead_block.kmax[fnum], 
          &cur_bead_block.d[fnum], &cur_bead_block.molecules_to_micromolar_conversion[fnum], 
          math_poiss, reg_p->hydrogenModelType );
    }
  }
  else
  {
    for ( int fnum=0;fnum<flow_block_size;fnum++ )
    {
      MathModel::ComputeCumulativeIncorporationHydrogens ( incorporation_rise[fnum], time_c.npts(),
          &time_c.deltaFrameSeconds[0], nuc_rise_ptr[fnum], ISIG_SUB_STEPS_MULTI_FLOW, 
          my_start[fnum], cur_bead_block.C[fnum], p->Ampl[fnum], cur_bead_block.SP[fnum], 
          cur_bead_block.kr[fnum], cur_bead_block.kmax[fnum], 
          cur_bead_block.d[fnum],cur_bead_block.molecules_to_micromolar_conversion[fnum], 
          math_poiss, reg_p->hydrogenModelType );
    }
  }

  // transform hydrogens to signal
  for ( int fnum=0;fnum<flow_block_size;fnum++ )
      MultiplyVectorByScalar ( incorporation_rise[fnum], cur_bead_block.sens[fnum],time_c.npts() );

  // Cleanup.
  delete [] nuc_rise_ptr;
  delete [] incorporation_rise;
  delete [] my_start;
}