int NoiseAdjustGadget::process_config(ACE_Message_Block* mb)
  {
    if ( !workingDirectory.value().empty() ) {
      noise_dependency_folder_ = workingDirectory.value();
    }
    else {
#ifdef _WIN32
      noise_dependency_folder_ = std::string("c:\\temp\\gadgetron\\");
#else
      noise_dependency_folder_ =  std::string("/tmp/gadgetron/");
#endif // _WIN32
    }

    GDEBUG("Folder to store noise dependencies is %s\n", noise_dependency_folder_.c_str());

    if ( !noise_dependency_prefix.value().empty() ) noise_dependency_prefix_ = noise_dependency_prefix.value();

    perform_noise_adjust_ = perform_noise_adjust.value();
    GDEBUG("NoiseAdjustGadget::perform_noise_adjust_ is %d\n", perform_noise_adjust_);

    pass_nonconformant_data_ = pass_nonconformant_data.value();
    GDEBUG("NoiseAdjustGadget::pass_nonconformant_data_ is %d\n", pass_nonconformant_data_);

    noise_dwell_time_us_preset_ = noise_dwell_time_us_preset.value();
    ISMRMRD::deserialize(mb->rd_ptr(),current_ismrmrd_header_);
    
    if ( current_ismrmrd_header_.acquisitionSystemInformation ) {
      receiver_noise_bandwidth_ = (float)(current_ismrmrd_header_.acquisitionSystemInformation->relativeReceiverNoiseBandwidth ?
					  *current_ismrmrd_header_.acquisitionSystemInformation->relativeReceiverNoiseBandwidth : 0.793f);
      
      GDEBUG("receiver_noise_bandwidth_ is %f\n", receiver_noise_bandwidth_);
    }

    // find the measurementID of this scan
    if ( current_ismrmrd_header_.measurementInformation )
      {
	if ( current_ismrmrd_header_.measurementInformation->measurementID )
	  {
	    measurement_id_ = *current_ismrmrd_header_.measurementInformation->measurementID;
	    GDEBUG("Measurement ID is %s\n", measurement_id_.c_str());
	  }

	// find the noise depencies if any
	if ( current_ismrmrd_header_.measurementInformation->measurementDependency.size() > 0 )
	  {
	    measurement_id_of_noise_dependency_.clear();

	    std::vector<ISMRMRD::MeasurementDependency>::const_iterator iter = current_ismrmrd_header_.measurementInformation->measurementDependency.begin();
	    for ( ; iter!= current_ismrmrd_header_.measurementInformation->measurementDependency.end(); iter++ )
	      {
		std::string dependencyType = iter->dependencyType;
		std::string dependencyID = iter->measurementID;

		GDEBUG("Found dependency measurement : %s with ID %s\n", dependencyType.c_str(), dependencyID.c_str());
            
		if ( dependencyType=="Noise" || dependencyType=="noise" ) {
		  measurement_id_of_noise_dependency_ = dependencyID;
		}
	      }
        
	    if ( !measurement_id_of_noise_dependency_.empty() ) {
	      GDEBUG("Measurement ID of noise dependency is %s\n", measurement_id_of_noise_dependency_.c_str());
		  
	      full_name_stored_noise_dependency_ = this->generateNoiseDependencyFilename(generateMeasurementIdOfNoiseDependency(measurement_id_of_noise_dependency_));
	      GDEBUG("Stored noise dependency is %s\n", full_name_stored_noise_dependency_.c_str());
		  
	      // try to load the precomputed noise prewhitener
	      if ( !this->loadNoiseCovariance() ) {
		GDEBUG("Stored noise dependency is NOT found : %s\n", full_name_stored_noise_dependency_.c_str());
		noiseCovarianceLoaded_ = false;
		noise_dwell_time_us_ = -1;
		noise_covariance_matrixf_.clear();
	      } else {
		GDEBUG("Stored noise dependency is found : %s\n", full_name_stored_noise_dependency_.c_str());
		GDEBUG("Stored noise dwell time in us is %f\n", noise_dwell_time_us_);
		GDEBUG("Stored noise channel number is %d\n", noise_covariance_matrixf_.get_size(0));
		
		if (noise_ismrmrd_header_.acquisitionSystemInformation) {
		  if (noise_ismrmrd_header_.acquisitionSystemInformation->coilLabel.size() != 
		      current_ismrmrd_header_.acquisitionSystemInformation->coilLabel.size()) {
		    GDEBUG("Length of coil label arrays do not match");
		    return GADGET_FAIL;
		  }
		  
		  bool labels_match = true;
		  for (size_t l = 0; l < noise_ismrmrd_header_.acquisitionSystemInformation->coilLabel.size(); l++) {
		    if (noise_ismrmrd_header_.acquisitionSystemInformation->coilLabel[l].coilNumber != 
			current_ismrmrd_header_.acquisitionSystemInformation->coilLabel[l].coilNumber) {
		      labels_match = false; break;
		    }
		    if (noise_ismrmrd_header_.acquisitionSystemInformation->coilLabel[l].coilName != 
			current_ismrmrd_header_.acquisitionSystemInformation->coilLabel[l].coilName) {
		      labels_match = false; break;
		    }
		  }
		  if (!labels_match) {
		    GDEBUG("Noise and measurement coil labels don't match\n");
		    return GADGET_FAIL;
		  }
		} else if (current_ismrmrd_header_.acquisitionSystemInformation) {
		  GDEBUG("Noise ismrmrd header does not have acquisition system information but current header does\n");
		  return GADGET_FAIL;
		}

		noiseCovarianceLoaded_ = true;
		number_of_noise_samples_ = 1; //When we load the matrix, it is already scaled.
	      }
	    }
	  }
      }


    //Let's figure out if some channels are "scale_only"
    std::string uncomb_str = scale_only_channels_by_name.value();
    std::vector<std::string> uncomb;
    if (uncomb_str.size()) {
      GDEBUG("SCALE ONLY: %s\n",  uncomb_str.c_str());
      boost::split(uncomb, uncomb_str, boost::is_any_of(","));
      for (unsigned int i = 0; i < uncomb.size(); i++) {
	std::string ch = boost::algorithm::trim_copy(uncomb[i]);
	if (current_ismrmrd_header_.acquisitionSystemInformation) {
	  for (size_t i = 0; i < current_ismrmrd_header_.acquisitionSystemInformation->coilLabel.size(); i++) {
	    if (ch == current_ismrmrd_header_.acquisitionSystemInformation->coilLabel[i].coilName) {
	      scale_only_channels_.push_back(i);//This assumes that the channels are sorted in the header
	      break;
	    }
	  }
	}
      }
    }

#ifdef USE_OMP
    omp_set_num_threads(1);
#endif // USE_OMP

    return GADGET_OK;
  }
int NoiseCovariancePlottingGadget::process_config(ACE_Message_Block* mb)
{
    if (!workingDirectory.value().empty())
    {
        noise_dependency_folder_ = workingDirectory.value();
    }
    else
    {
#ifdef _WIN32
        noise_dependency_folder_ = std::string("c:\\temp\\gadgetron\\");
#else
        noise_dependency_folder_ =  std::string("/tmp/gadgetron/");
#endif // _WIN32
    }

    GDEBUG("Folder to store noise dependencies is %s\n", noise_dependency_folder_.c_str());

    if (!noise_dependency_prefix.value().empty()) noise_dependency_prefix_ = noise_dependency_prefix.value();

    ISMRMRD::deserialize(mb->rd_ptr(), current_ismrmrd_header_);

    // find the measurementID of this scan
    if (current_ismrmrd_header_.measurementInformation)
    {
        if (current_ismrmrd_header_.measurementInformation->measurementID)
        {
            measurement_id_ = *current_ismrmrd_header_.measurementInformation->measurementID;
            GDEBUG("Measurement ID is %s\n", measurement_id_.c_str());
        }

        // find the noise depencies if any
        if (current_ismrmrd_header_.measurementInformation->measurementDependency.size() > 0)
        {
            measurement_id_of_noise_dependency_.clear();

            std::vector<ISMRMRD::MeasurementDependency>::const_iterator iter = current_ismrmrd_header_.measurementInformation->measurementDependency.begin();
            for (; iter != current_ismrmrd_header_.measurementInformation->measurementDependency.end(); iter++)
            {
                std::string dependencyType = iter->dependencyType;
                std::string dependencyID = iter->measurementID;

                GDEBUG("Found dependency measurement : %s with ID %s\n", dependencyType.c_str(), dependencyID.c_str());

                if (dependencyType == "Noise" || dependencyType == "noise") {
                    measurement_id_of_noise_dependency_ = dependencyID;
                }
            }

            if (!measurement_id_of_noise_dependency_.empty())
            {
                GDEBUG("Measurement ID of noise dependency is %s\n", measurement_id_of_noise_dependency_.c_str());

                full_name_stored_noise_dependency_ = this->generateNoiseDependencyFilename(generateMeasurementIdOfNoiseDependency(measurement_id_of_noise_dependency_));
                GDEBUG("Stored noise dependency is %s\n", full_name_stored_noise_dependency_.c_str());
            }
        }
        else
        {
            full_name_stored_noise_dependency_ = this->generateNoiseDependencyFilename(measurement_id_);
            GDEBUG("Stored noise dependency is %s\n", full_name_stored_noise_dependency_.c_str());
        }
    }

    return GADGET_OK;
}