Commit 332925ad3ee1a2c21bda3f7b0630633752e47ca4

Authored by David Mayerich
1 parent 573a6ded

added the ability to crop agilent binary files

Showing 1 changed file with 28 additions and 7 deletions   Show diff stats
stim/envi/agilent_binary.h
... ... @@ -44,6 +44,10 @@ public:
44 44 alloc();
45 45 }
46 46  
  47 + char* data() {
  48 + return (char*)ptr;
  49 + }
  50 +
47 51 size_t dim(size_t i){
48 52 return R[i];
49 53 }
... ... @@ -84,6 +88,11 @@ public:
84 88 return *this; //return the result
85 89 }
86 90  
  91 + operator bool() {
  92 + if (R[0] == 0 || R[1] == 0 || R[2] == 0) return false;
  93 + else return true;
  94 + }
  95 +
87 96 ~agilent_binary(){
88 97 free(ptr);
89 98 }
... ... @@ -189,6 +198,17 @@ public:
189 198 ptr[i] = -log10(ptr[i] / background->ptr[i]);
190 199 }
191 200  
  201 + //crops the image down to a set number of samples
  202 + void crop(size_t n) {
  203 + if (n < R[2]) { //if the requested size is smaller than the image
  204 + R[2] = n; //update the number of bands
  205 + T* old_ptr = ptr; //store the old pointer
  206 + alloc(); //allocate space for the new image
  207 + memcpy(ptr, old_ptr, bytes()); //copy the old data to the new image
  208 + free(old_ptr); //free the old data
  209 + }
  210 + }
  211 +
192 212 //#ifdef CUDA_FOUND
193 213 /// Perform an FFT and return a binary file with bands in the specified range
194 214 agilent_binary<T> fft(double band_min, double band_max, double ELWN = 15798, int UDR = 2){
... ... @@ -242,18 +262,19 @@ public:
242 262 HANDLE_ERROR(cudaMemcpy(cpu_fft, gpu_fft, R[0] * R[1] * (R[2]/2+1) * sizeof(cufftComplex), cudaMemcpyDeviceToHost)); //copy data from the host to the device
243 263  
244 264 //double int_delta = 0.00012656; //interferogram sample spacing in centimeters
245   - double int_delta = (1.0 / ELWN) * ((double)UDR / 2.0); //calculate the interferogram spacing
246   - double int_length = int_delta * R[2]; //interferogram length in centimeters
247   - double fft_delta = 1/int_length; //spectrum spacing (in inverse centimeters, wavenumber)
248   - double fft_max = fft_delta * R[2]/2; //get the maximum wavenumber value supported by the specified number of interferogram samples
  265 + double int_delta = (1.0 / ELWN) * ((double)UDR / 2.0); //calculate the interferogram spacing
  266 + double int_length = int_delta * R[2]; //interferogram length in centimeters
  267 + double fft_delta = 1/int_length; //spectrum spacing (in inverse centimeters, wavenumber)
  268 + double fft_max = fft_delta * R[2]/2; //get the maximum wavenumber value supported by the specified number of interferogram samples
249 269  
250   - if(band_max > fft_max) band_max = fft_max; //the user gave a band outside of the FFT range, reset the band to the maximum available
  270 + if(band_max > fft_max) band_max = fft_max; //the user gave a band outside of the FFT range, reset the band to the maximum available
  271 + if (band_min < 0) band_min = 0;
251 272  
252 273 size_t start_i = (size_t)std::ceil(band_min / fft_delta); //calculate the first band to store
253 274 size_t size_i = (size_t)std::floor(band_max / fft_delta) - start_i; //calculate the number of bands to store
254   - size_t end_i = start_i + size_i; //last band number
  275 + size_t end_i = start_i + size_i; //last band number
255 276 agilent_binary<T> result(R[0], R[1], size_i);
256   - result.Z[0] = start_i * fft_delta; //set the range for the FFT result
  277 + result.Z[0] = start_i * fft_delta; //set the range for the FFT result
257 278 result.Z[1] = end_i * fft_delta;
258 279  
259 280 for(size_t b = start_i; b < end_i; b++){
... ...