void AllocateProcessorQueue (ProcessorQueue &my_queue,ComputationPlanner &analysis_compute_plan, int numRegions)
{
  //create queue for passing work to thread pool
 

  my_queue.SetCpuQueue(new WorkerInfoQueue (numRegions*analysis_compute_plan.numBkgWorkers+1));
  if (analysis_compute_plan.use_gpu_acceleration) {
    if(analysis_compute_plan.numBkgWorkers_gpu) {
      my_queue.AllocateGpuInfo(analysis_compute_plan.numBkgWorkers_gpu);
      my_queue.SetGpuQueue(new WorkerInfoQueue (numRegions*analysis_compute_plan.numBkgWorkers_gpu+1));

    }
  }
  
  // decide on whether to use both CPU and GPU for bkg model fitting jobs
  if (analysis_compute_plan.use_gpu_only_fitting) {
    my_queue.turnOffHeterogeneousComputing();
  }

  if (!analysis_compute_plan.gpu_multiflow_fit) {
    my_queue.turnOffGpuMultiFlowFitting();
  }

  if (!analysis_compute_plan.gpu_singleflow_fit) {
    my_queue.turnOffGpuSingleFlowFitting();
  }

  {
    int cworker;
    pthread_t work_thread;

    // spawn threads for doing background correction/fitting work
    for (cworker = 0; cworker < analysis_compute_plan.numBkgWorkers; cworker++)
    {
      int t = pthread_create (&work_thread, NULL, BkgFitWorkerCpu,
                              &my_queue);
      pthread_detach(work_thread);
      if (t)
        fprintf (stderr, "Error starting thread\n");
    }

  }

  fprintf (stdout, "Number of CPU threads for beadfind: %d\n", analysis_compute_plan.numBkgWorkers);
  if (analysis_compute_plan.use_gpu_acceleration)
    fprintf (stdout, "Number of GPU threads for background model: %d\n", analysis_compute_plan.numBkgWorkers_gpu);
  else
    fprintf (stdout, "Number of CPU threads for background model: %d\n", analysis_compute_plan.numBkgWorkers);
}
void AllocateProcessorQueue (ProcessorQueue &my_queue,ComputationPlanner &analysis_compute_plan, int numRegions)
{
  //create queue for passing work to thread pool
  
  my_queue.SetCpuQueue(new WorkerInfoQueue (numRegions*analysis_compute_plan.numBkgWorkers+1));
  if (analysis_compute_plan.use_gpu_acceleration) {
    if(analysis_compute_plan.numMultiFlowFitGpuWorkers) {
      my_queue.AllocateMultiFitGpuInfo(analysis_compute_plan.numMultiFlowFitGpuWorkers);
      my_queue.SetMultiFitGpuQueue(new WorkerInfoQueue (numRegions*analysis_compute_plan.numBkgWorkers_gpu+1));
    }
    if(analysis_compute_plan.numSingleFlowFitGpuWorkers) {
      my_queue.AllocateSingleFitGpuInfo(analysis_compute_plan.numSingleFlowFitGpuWorkers);
      my_queue.SetSingleFitGpuQueue(new WorkerInfoQueue (numRegions*analysis_compute_plan.numBkgWorkers_gpu+1));
    }
  }

  {
    int cworker;
    pthread_t work_thread;

    // spawn threads for doing background correction/fitting work
    for (cworker = 0; cworker < analysis_compute_plan.numBkgWorkers; cworker++)
    {
      int t = pthread_create (&work_thread, NULL, BkgFitWorkerCpu,
                              &my_queue);
      pthread_detach(work_thread);
      if (t)
        fprintf (stderr, "Error starting thread\n");
    }

  }

  fprintf (stdout, "Number of CPU threads for beadfind: %d\n", analysis_compute_plan.numBkgWorkers);
  if (analysis_compute_plan.use_gpu_acceleration)
    fprintf (stdout, "Number of GPU threads for background model: %d\n", analysis_compute_plan.numBkgWorkers_gpu);
  else
    fprintf (stdout, "Number of CPU threads for background model: %d\n", analysis_compute_plan.numBkgWorkers);
}