Commit 7d43100a324109f10f92d2a4127868f320f39ead
1 parent
3f56f1f9
allow appending to binary files
Showing
7 changed files
with
16 additions
and
625 deletions
Show diff stats
defaults.h
@@ -32,6 +32,7 @@ | @@ -32,6 +32,7 @@ | ||
32 | //default flags | 32 | //default flags |
33 | #define DEFAULT_PLANEWAVE false | 33 | #define DEFAULT_PLANEWAVE false |
34 | #define DEFAULT_VECTORSIM false | 34 | #define DEFAULT_VECTORSIM false |
35 | +#define DEFAULT_APPEND false | ||
35 | //#define DEFAULT_OUTPUT_POINT fileoutStruct::imageObjective | 36 | //#define DEFAULT_OUTPUT_POINT fileoutStruct::imageObjective |
36 | 37 | ||
37 | 38 | ||
@@ -72,7 +73,7 @@ | @@ -72,7 +73,7 @@ | ||
72 | #define DEFAULT_PADDING 1 | 73 | #define DEFAULT_PADDING 1 |
73 | #define DEFAULT_SUPERSAMPLE 1 | 74 | #define DEFAULT_SUPERSAMPLE 1 |
74 | 75 | ||
75 | -#define DEFAULT_INTENSITY_FILE "out_di.bmp" | 76 | +#define DEFAULT_INTENSITY_FILE "testappend" |
76 | #define DEFAULT_TRANSMITTANCE_FILE "" | 77 | #define DEFAULT_TRANSMITTANCE_FILE "" |
77 | #define DEFAULT_ABSORBANCE_FILE "" | 78 | #define DEFAULT_ABSORBANCE_FILE "" |
78 | #define DEFAULT_NEAR_FILE "out_n.bmp" | 79 | #define DEFAULT_NEAR_FILE "out_n.bmp" |
fileout.cu
@@ -113,9 +113,7 @@ void fileoutStruct::saveDetector(microscopeStruct* scope) | @@ -113,9 +113,7 @@ void fileoutStruct::saveDetector(microscopeStruct* scope) | ||
113 | scalarslice I = scope->getIntensity(); | 113 | scalarslice I = scope->getIntensity(); |
114 | 114 | ||
115 | if(is_binary(intFile)) | 115 | if(is_binary(intFile)) |
116 | - I.toEnvi(intFile, scope->nf.lambda); | ||
117 | - else | ||
118 | - I.toImage(intFile); | 116 | + I.toEnvi(intFile, scope->nf.lambda, append); |
119 | } | 117 | } |
120 | //absorbance | 118 | //absorbance |
121 | if(absFile != "") | 119 | if(absFile != "") |
@@ -123,7 +121,7 @@ void fileoutStruct::saveDetector(microscopeStruct* scope) | @@ -123,7 +121,7 @@ void fileoutStruct::saveDetector(microscopeStruct* scope) | ||
123 | scalarslice I = scope->getAbsorbance(); | 121 | scalarslice I = scope->getAbsorbance(); |
124 | 122 | ||
125 | if(is_binary(absFile)) | 123 | if(is_binary(absFile)) |
126 | - I.toEnvi(absFile, scope->nf.lambda); | 124 | + I.toEnvi(absFile, scope->nf.lambda, append); |
127 | else | 125 | else |
128 | I.toImage(absFile); | 126 | I.toImage(absFile); |
129 | } | 127 | } |
@@ -133,7 +131,7 @@ void fileoutStruct::saveDetector(microscopeStruct* scope) | @@ -133,7 +131,7 @@ void fileoutStruct::saveDetector(microscopeStruct* scope) | ||
133 | scalarslice I = scope->getTransmittance(); | 131 | scalarslice I = scope->getTransmittance(); |
134 | 132 | ||
135 | if(is_binary(transFile)) | 133 | if(is_binary(transFile)) |
136 | - I.toEnvi(transFile, scope->nf.lambda); | 134 | + I.toEnvi(transFile, scope->nf.lambda, append); |
137 | else | 135 | else |
138 | I.toImage(transFile); | 136 | I.toImage(transFile); |
139 | } | 137 | } |
fileout.h
@@ -18,7 +18,9 @@ struct fileoutStruct{ | @@ -18,7 +18,9 @@ struct fileoutStruct{ | ||
18 | std::string farFile; //far field filename | 18 | std::string farFile; //far field filename |
19 | std::string intFile; //detector intensity filename | 19 | std::string intFile; //detector intensity filename |
20 | std::string absFile; //detector absorbance filename | 20 | std::string absFile; //detector absorbance filename |
21 | - std::string transFile; //detector transmission filename | 21 | + std::string transFile; //detector transmission filename |
22 | + | ||
23 | + bool append; //append simulation results to existing binary files | ||
22 | 24 | ||
23 | //output type | 25 | //output type |
24 | enum field_type {fieldMag, fieldIntensity, fieldAbsorbance, fieldPolar, fieldImag, fieldReal, fieldAngularSpectrum}; | 26 | enum field_type {fieldMag, fieldIntensity, fieldAbsorbance, fieldPolar, fieldImag, fieldReal, fieldAngularSpectrum}; |
main.cpp
@@ -19,7 +19,7 @@ microscopeStruct* SCOPE; | @@ -19,7 +19,7 @@ microscopeStruct* SCOPE; | ||
19 | #include "rts/rtsMatrix.h" | 19 | #include "rts/rtsMatrix.h" |
20 | #include "rts/rtsQuaternion.h" | 20 | #include "rts/rtsQuaternion.h" |
21 | 21 | ||
22 | -#include "rtsEnvi.h" | 22 | +#include "envi/rtsEnvi.h" |
23 | 23 | ||
24 | #include "warnings.h" | 24 | #include "warnings.h" |
25 | 25 | ||
@@ -60,6 +60,6 @@ int main(int argc, char *argv[]) | @@ -60,6 +60,6 @@ int main(int argc, char *argv[]) | ||
60 | SCOPE->destroy(); | 60 | SCOPE->destroy(); |
61 | 61 | ||
62 | 62 | ||
63 | - | 63 | + |
64 | 64 | ||
65 | } | 65 | } |
options.h
@@ -135,7 +135,7 @@ static void loadMaterials(po::variables_map vm) | @@ -135,7 +135,7 @@ static void loadMaterials(po::variables_map vm) | ||
135 | exit(1); | 135 | exit(1); |
136 | } | 136 | } |
137 | 137 | ||
138 | - | 138 | + |
139 | for(int i=0; i<matVec.size(); i+=2) | 139 | for(int i=0; i<matVec.size(); i+=2) |
140 | { | 140 | { |
141 | rts::material<ptype> newM(vm["lambda"].as<ptype>(), matVec[i], matVec[i+1]); | 141 | rts::material<ptype> newM(vm["lambda"].as<ptype>(), matVec[i], matVec[i+1]); |
@@ -252,6 +252,10 @@ static void loadMicroscopeParams(po::variables_map vm) | @@ -252,6 +252,10 @@ static void loadMicroscopeParams(po::variables_map vm) | ||
252 | 252 | ||
253 | static void loadOutputParams(po::variables_map vm) | 253 | static void loadOutputParams(po::variables_map vm) |
254 | { | 254 | { |
255 | + //append simulation results to previous binary files | ||
256 | + gFileOut.append = DEFAULT_APPEND; | ||
257 | + if(vm.count("append")) | ||
258 | + gFileOut.append = true; | ||
255 | 259 | ||
256 | //image parameters | 260 | //image parameters |
257 | //component of the field to be saved | 261 | //component of the field to be saved |
rtsEnvi.h deleted
1 | -#ifndef RTS_ENVI_H | ||
2 | -#define RTS_ENVI_H | ||
3 | - | ||
4 | -#include <string> | ||
5 | -#include <iostream> | ||
6 | -#include <fstream> | ||
7 | -#include <sstream> | ||
8 | - | ||
9 | -/* This is a class for reading and writing ENVI binary files. This class will be updated as needed. | ||
10 | - | ||
11 | -What this class CAN currently do: | ||
12 | - *) Write band images to a BSQ file. | ||
13 | - *) Append band images to a BSQ file. | ||
14 | - | ||
15 | -*/ | ||
16 | - | ||
17 | -//information from an ENVI header file | ||
18 | -//A good resource can be found here: http://www.exelisvis.com/docs/enviheaderfiles.html | ||
19 | -struct EnviHeader | ||
20 | -{ | ||
21 | - std::string name; | ||
22 | - | ||
23 | - std::string description; | ||
24 | - | ||
25 | - unsigned int samples; //x-axis | ||
26 | - unsigned int lines; //y-axis | ||
27 | - unsigned int bands; //spectral axis | ||
28 | - unsigned int header_offset; //header offset for binary file (in bytes) | ||
29 | - std::string file_type; //should be "ENVI Standard" | ||
30 | - unsigned int data_type; //data representation; common value is 4 (32-bit float) | ||
31 | - | ||
32 | - enum interleaveType {BIP, BIL, BSQ}; //bip = Z,X,Y; bil = X,Z,Y; bsq = X,Y,Z | ||
33 | - interleaveType interleave; | ||
34 | - | ||
35 | - std::string sensor_type; //not really used | ||
36 | - | ||
37 | - enum endianType {endianLittle, endianBig}; | ||
38 | - endianType byte_order; //little = least significant bit first (most systems) | ||
39 | - | ||
40 | - double x_start, y_start; //coordinates of the upper-left corner of the image | ||
41 | - std::string wavelength_units; //stored wavelength units | ||
42 | - std::string z_plot_titles[2]; | ||
43 | - | ||
44 | - double pixel_size[2]; //pixel size along X and Y | ||
45 | - | ||
46 | - std::vector<std::string> band_names; //name for each band in the image | ||
47 | - std::vector<double> wavelength; //wavelength for each band | ||
48 | - | ||
49 | - EnviHeader() | ||
50 | - { | ||
51 | - name = ""; | ||
52 | - | ||
53 | - //specify default values for a new or empty ENVI file | ||
54 | - samples = 0; | ||
55 | - lines = 0; | ||
56 | - bands = 0; | ||
57 | - header_offset = 0; | ||
58 | - data_type = 4; | ||
59 | - interleave = BSQ; | ||
60 | - byte_order = endianLittle; | ||
61 | - x_start = y_start = 0; | ||
62 | - pixel_size[0] = pixel_size[1] = 1; | ||
63 | - | ||
64 | - //strings | ||
65 | - file_type = "ENVI Standard"; | ||
66 | - sensor_type = "Unknown"; | ||
67 | - wavelength_units = "Unknown"; | ||
68 | - z_plot_titles[0] = z_plot_titles[1] = "Unknown"; | ||
69 | - } | ||
70 | - | ||
71 | - std::string trim(std::string line) | ||
72 | - { | ||
73 | - //trims whitespace from the beginning and end of line | ||
74 | - int start_i, end_i; | ||
75 | - for(start_i=0; start_i < line.length(); start_i++) | ||
76 | - if(line[start_i] != 32) | ||
77 | - { | ||
78 | - break; | ||
79 | - } | ||
80 | - | ||
81 | - for(end_i = line.length()-1; end_i >= start_i; end_i--) | ||
82 | - if(line[end_i] != ' ') | ||
83 | - { | ||
84 | - break; | ||
85 | - } | ||
86 | - | ||
87 | - return line.substr(start_i, end_i - start_i+1); | ||
88 | - } | ||
89 | - | ||
90 | - | ||
91 | - std::string get_token(std::string line) | ||
92 | - { | ||
93 | - //returns a variable name; in this case we look for the '=' sign | ||
94 | - size_t i = line.find_first_of('='); | ||
95 | - | ||
96 | - std::string result; | ||
97 | - if(i != std::string::npos) | ||
98 | - result = trim(line.substr(0, i-1)); | ||
99 | - | ||
100 | - return result; | ||
101 | - } | ||
102 | - | ||
103 | - std::string get_data_str(std::string line) | ||
104 | - { | ||
105 | - size_t i = line.find_first_of('='); | ||
106 | - | ||
107 | - std::string result; | ||
108 | - if(i != std::string::npos) | ||
109 | - result = trim(line.substr(i+1)); | ||
110 | - else | ||
111 | - { | ||
112 | - std::cout<<"ENVI Header error - data not found for token: "<<get_token(line)<<std::endl; | ||
113 | - exit(1); | ||
114 | - } | ||
115 | - return result; | ||
116 | - } | ||
117 | - | ||
118 | - std::string get_brace_str(std::string token, std::string line, std::ifstream &file) | ||
119 | - { | ||
120 | - //this function assembles all of the characters between curly braces | ||
121 | - //this is how strings are defined within an ENVI file | ||
122 | - | ||
123 | - std::string result; | ||
124 | - | ||
125 | - //first, find the starting brace | ||
126 | - size_t i; | ||
127 | - do | ||
128 | - { | ||
129 | - i = line.find_first_of('{'); | ||
130 | - if(i != std::string::npos) | ||
131 | - break; | ||
132 | - }while(file); | ||
133 | - | ||
134 | - //if i is still npos, we have reached the end of the file without a brace...something is wrong | ||
135 | - if(i == std::string::npos) | ||
136 | - { | ||
137 | - std::cout<<"ENVI Header error - string token declared without being defined: "<<token<<std::endl; | ||
138 | - exit(1); | ||
139 | - } | ||
140 | - line = line.substr(i+1); | ||
141 | - | ||
142 | - //copy character data into the result string until we find a closing brace | ||
143 | - while(file) | ||
144 | - { | ||
145 | - i = line.find_first_of('}'); | ||
146 | - | ||
147 | - | ||
148 | - if(i != std::string::npos) | ||
149 | - { | ||
150 | - result += line.substr(0, i); | ||
151 | - break; | ||
152 | - } | ||
153 | - else | ||
154 | - result += line; | ||
155 | - | ||
156 | - getline(file, line); | ||
157 | - } | ||
158 | - | ||
159 | - if(i == std::string::npos) | ||
160 | - { | ||
161 | - std::cout<<"ENVI Header error - string token declared without a terminating '}': "<<token<<std::endl; | ||
162 | - exit(1); | ||
163 | - } | ||
164 | - | ||
165 | - return trim(result); | ||
166 | - } | ||
167 | - | ||
168 | - std::vector<std::string> get_string_seq(std::string token, std::string sequence) | ||
169 | - { | ||
170 | - //this function returns a sequence of comma-delimited strings | ||
171 | - std::vector<std::string> result; | ||
172 | - | ||
173 | - std::string entry; | ||
174 | - size_t i; | ||
175 | - do | ||
176 | - { | ||
177 | - i = sequence.find_first_of(','); | ||
178 | - entry = sequence.substr(0, i); | ||
179 | - sequence = sequence.substr(i+1); | ||
180 | - result.push_back(trim(entry)); | ||
181 | - }while(i != std::string::npos); | ||
182 | - | ||
183 | - return result; | ||
184 | - } | ||
185 | - | ||
186 | - std::vector<double> get_double_seq(std::string token, std::string sequence) | ||
187 | - { | ||
188 | - //this function returns a sequence of comma-delimited strings | ||
189 | - std::vector<double> result; | ||
190 | - | ||
191 | - std::string entry; | ||
192 | - size_t i; | ||
193 | - do | ||
194 | - { | ||
195 | - i = sequence.find_first_of(','); | ||
196 | - entry = sequence.substr(0, i); | ||
197 | - sequence = sequence.substr(i+1); | ||
198 | - result.push_back(atof(entry.c_str())); | ||
199 | - }while(i != std::string::npos); | ||
200 | - | ||
201 | - return result; | ||
202 | - } | ||
203 | - | ||
204 | - void load(std::string filename) | ||
205 | - { | ||
206 | - name = filename; | ||
207 | - | ||
208 | - //open the header file | ||
209 | - std::ifstream file(name.c_str()); | ||
210 | - | ||
211 | - if(!file) | ||
212 | - { | ||
213 | - std::cout<<"ENVI header file not found: "<<name<<std::endl; | ||
214 | - exit(1); | ||
215 | - } | ||
216 | - | ||
217 | - //the first line should just be "ENVI" | ||
218 | - std::string line; | ||
219 | - getline(file, line); | ||
220 | - if(line != "ENVI") | ||
221 | - { | ||
222 | - std::cout<<"The header doesn't appear to be an ENVI file. The first line should be 'ENVI'."<<std::endl; | ||
223 | - exit(1); | ||
224 | - } | ||
225 | - | ||
226 | - //for each line in the file, get the token | ||
227 | - std::string token; | ||
228 | - while(file) | ||
229 | - { | ||
230 | - | ||
231 | - //get a line | ||
232 | - getline(file, line); | ||
233 | - | ||
234 | - //get the token | ||
235 | - token = get_token(line); | ||
236 | - | ||
237 | - if(token == "description") | ||
238 | - description = get_brace_str(token, line, file); | ||
239 | - else if(token == "band names") | ||
240 | - { | ||
241 | - std::string string_sequence = get_brace_str(token, line, file); | ||
242 | - band_names = get_string_seq(token, string_sequence); | ||
243 | - } | ||
244 | - else if(token == "wavelength") | ||
245 | - { | ||
246 | - std::string string_sequence = get_brace_str(token, line, file); | ||
247 | - wavelength = get_double_seq(token, string_sequence); | ||
248 | - } | ||
249 | - else if(token == "pixel size") | ||
250 | - { | ||
251 | - std::string string_sequence = get_brace_str(token, line, file); | ||
252 | - std::vector<double> pxsize = get_double_seq(token, string_sequence); | ||
253 | - pixel_size[0] = pxsize[0]; | ||
254 | - pixel_size[1] = pxsize[1]; | ||
255 | - } | ||
256 | - else if(token == "z plot titles") | ||
257 | - { | ||
258 | - std::string string_sequence = get_brace_str(token, line, file); | ||
259 | - std::vector<std::string> titles = get_string_seq(token, string_sequence); | ||
260 | - z_plot_titles[0] = titles[0]; | ||
261 | - z_plot_titles[1] = titles[1]; | ||
262 | - } | ||
263 | - | ||
264 | - else if(token == "samples") | ||
265 | - samples = atoi(get_data_str(line).c_str()); | ||
266 | - else if(token == "lines") | ||
267 | - lines = atoi(get_data_str(line).c_str()); | ||
268 | - else if(token == "bands") | ||
269 | - bands = atoi(get_data_str(line).c_str()); | ||
270 | - else if(token == "header offset") | ||
271 | - header_offset = atoi(get_data_str(line).c_str()); | ||
272 | - else if(token == "file type") | ||
273 | - file_type = get_data_str(line); | ||
274 | - else if(token == "data type") | ||
275 | - data_type = atoi(get_data_str(line).c_str()); | ||
276 | - else if(token == "interleave") | ||
277 | - { | ||
278 | - std::string interleave_str = get_data_str(line); | ||
279 | - if(interleave_str == "bip") | ||
280 | - interleave = BIP; | ||
281 | - else if(interleave_str == "bil") | ||
282 | - interleave = BIL; | ||
283 | - else if(interleave_str == "bsq") | ||
284 | - interleave = BSQ; | ||
285 | - } | ||
286 | - else if(token == "sensor type") | ||
287 | - sensor_type = get_data_str(line); | ||
288 | - else if(token == "byte order") | ||
289 | - byte_order = (endianType)atoi(get_data_str(line).c_str()); | ||
290 | - else if(token == "x start") | ||
291 | - x_start = atof(get_data_str(line).c_str()); | ||
292 | - else if(token == "y start") | ||
293 | - y_start = atof(get_data_str(line).c_str()); | ||
294 | - else if(token == "wavelength units") | ||
295 | - wavelength_units = get_data_str(line); | ||
296 | - } | ||
297 | - | ||
298 | - //close the file | ||
299 | - file.close(); | ||
300 | - } | ||
301 | - | ||
302 | - void save(std::string filename) | ||
303 | - { | ||
304 | - //open a file | ||
305 | - std::ofstream outfile(filename.c_str()); | ||
306 | - | ||
307 | - //write the ENVI type identifier | ||
308 | - outfile<<"ENVI"<<std::endl; | ||
309 | - | ||
310 | - //output all of the data | ||
311 | - outfile<<"description = {"<<std::endl; | ||
312 | - outfile<<" "<<description<<"}"<<std::endl; | ||
313 | - | ||
314 | - outfile<<"samples = "<<samples<<std::endl; | ||
315 | - outfile<<"lines = "<<lines<<std::endl; | ||
316 | - outfile<<"bands = "<<bands<<std::endl; | ||
317 | - outfile<<"header offset = "<<header_offset<<std::endl; | ||
318 | - outfile<<"file type = "<<file_type<<std::endl; | ||
319 | - outfile<<"data type = "<<data_type<<std::endl; | ||
320 | - outfile<<"interleave = "; | ||
321 | - if(interleave == BIP) | ||
322 | - outfile<<"bip"; | ||
323 | - if(interleave == BIL) | ||
324 | - outfile<<"bil"; | ||
325 | - if(interleave == BSQ) | ||
326 | - outfile<<"bsq"; | ||
327 | - outfile<<std::endl; | ||
328 | - outfile<<"sensor type = "<<sensor_type<<std::endl; | ||
329 | - outfile<<"byte order = "<<byte_order<<std::endl; | ||
330 | - outfile<<"x start = "<<x_start<<std::endl; | ||
331 | - outfile<<"y start = "<<y_start<<std::endl; | ||
332 | - outfile<<"wavelength units = "<<wavelength_units<<std::endl; | ||
333 | - outfile<<"z plot titles = {"; | ||
334 | - outfile<<z_plot_titles[0]<<", "<<z_plot_titles[1]<<"}"<<std::endl; | ||
335 | - outfile<<"pixel size = {"<<pixel_size[0]<<", "<<pixel_size[1]<<", units=Meters}"<<std::endl; | ||
336 | - if(band_names.size() > 0) | ||
337 | - { | ||
338 | - outfile<<"band names = {"<<std::endl; | ||
339 | - for(int i=0; i<band_names.size(); i++) | ||
340 | - { | ||
341 | - outfile<<band_names[i]; | ||
342 | - if(i < band_names.size() - 1) | ||
343 | - outfile<<", "; | ||
344 | - } | ||
345 | - outfile<<"}"<<std::endl; | ||
346 | - } | ||
347 | - outfile<<"wavelength = {"<<std::endl; | ||
348 | - for(int i=0; i<wavelength.size()-1; i++) | ||
349 | - outfile<<wavelength[i]<<", "; | ||
350 | - outfile<<wavelength.back()<<"}"<<std::endl; | ||
351 | - | ||
352 | - outfile.close(); | ||
353 | - } | ||
354 | - | ||
355 | - void save() | ||
356 | - { | ||
357 | - std::cout<<"ENVI Header Name: "<<name<<std::endl; | ||
358 | - save(name); | ||
359 | - } | ||
360 | - | ||
361 | - //returns the size of a single value (in bytes) | ||
362 | - unsigned int valsize() | ||
363 | - { | ||
364 | - switch(data_type) | ||
365 | - { | ||
366 | - case 1: //1 = 8-bit byte | ||
367 | - return 1; | ||
368 | - case 2: //16-bit signed integer | ||
369 | - case 12: //16-bit unsigned integer | ||
370 | - return 2; | ||
371 | - case 3: //32-bit signed long integer | ||
372 | - case 4: //32-bit floating point | ||
373 | - case 13: //32-bit unsigned long integer | ||
374 | - return 4; | ||
375 | - case 5: //64-bit double-precision floating point | ||
376 | - case 6: //32-bit complex value | ||
377 | - case 14: //64-bit signed long integer | ||
378 | - case 15: //64-bit unsigned long integer | ||
379 | - return 8; | ||
380 | - case 9: //64-bit complex value | ||
381 | - return 16; | ||
382 | - default: | ||
383 | - return 0; | ||
384 | - } | ||
385 | - | ||
386 | - } | ||
387 | -}; //end EnviHeader | ||
388 | - | ||
389 | -class EnviFile | ||
390 | -{ | ||
391 | - EnviHeader header; | ||
392 | - FILE* data; | ||
393 | - std::string mode; | ||
394 | - | ||
395 | - //a locked file has alread had data written..certain things can't be changed | ||
396 | - // accessor functions deal with these issues | ||
397 | - bool locked; | ||
398 | - | ||
399 | - void init() | ||
400 | - { | ||
401 | - locked = false; | ||
402 | - data = NULL; | ||
403 | - } | ||
404 | - | ||
405 | - void readonly() | ||
406 | - { | ||
407 | - if(mode == "r") | ||
408 | - { | ||
409 | - std::cout<<"ENVI Error: changes cannot be made to a read-only file."<<std::endl; | ||
410 | - exit(1); | ||
411 | - } | ||
412 | - } | ||
413 | - | ||
414 | - //this function determines if the current software is capable of the requested change | ||
415 | - bool caps(EnviHeader new_header) | ||
416 | - { | ||
417 | - readonly(); //if the file is read-only, throw an exception | ||
418 | - | ||
419 | - //we currently only support BSQ | ||
420 | - if(new_header.interleave == EnviHeader::BIP || new_header.interleave == EnviHeader::BIL) | ||
421 | - { | ||
422 | - std::cout<<"This software only supports BSQ."; | ||
423 | - return false; | ||
424 | - } | ||
425 | - | ||
426 | - //if the number of bands has changed | ||
427 | - if(header.bands != new_header.bands) | ||
428 | - { | ||
429 | - //the new header must be a BSQ file | ||
430 | - if(new_header.interleave != EnviHeader::BSQ) | ||
431 | - { | ||
432 | - std::cout<<"ENVI Error: can only add bands to a BSQ file."<<std::endl; | ||
433 | - return false; | ||
434 | - } | ||
435 | - } | ||
436 | - | ||
437 | - //disallow anything that can't be done when the file is locked | ||
438 | - if(locked) | ||
439 | - { | ||
440 | - if(header.lines != new_header.lines) | ||
441 | - { | ||
442 | - std::cout<<"ENVI Error: cannot change the number of lines in a locked BSQ file."<<std::endl; | ||
443 | - return false; | ||
444 | - } | ||
445 | - if(header.samples != new_header.samples) | ||
446 | - { | ||
447 | - std::cout<<"ENVI Error: cannot change the number of samples in a locked BSQ file."<<std::endl; | ||
448 | - return false; | ||
449 | - } | ||
450 | - if(header.data_type != new_header.data_type) | ||
451 | - { | ||
452 | - std::cout<<"ENVI Error: cannot change the data type of a locked file."<<std::endl; | ||
453 | - return false; | ||
454 | - } | ||
455 | - if(header.byte_order != new_header.byte_order) | ||
456 | - { | ||
457 | - std::cout<<"ENVI Error: cannot change the byte order of a locked file."<<std::endl; | ||
458 | - return false; | ||
459 | - } | ||
460 | - } | ||
461 | - | ||
462 | - return true; | ||
463 | - | ||
464 | - } | ||
465 | - | ||
466 | - EnviHeader load_header(std::string header_file) | ||
467 | - { | ||
468 | - EnviHeader new_header; | ||
469 | - new_header.load(header_file); | ||
470 | - return new_header; | ||
471 | - } | ||
472 | - | ||
473 | - void set_header(EnviHeader new_header) | ||
474 | - { | ||
475 | - if(caps(new_header)) | ||
476 | - header = new_header; | ||
477 | - else | ||
478 | - exit(1); | ||
479 | - } | ||
480 | - | ||
481 | -public: | ||
482 | - | ||
483 | - EnviFile() | ||
484 | - { | ||
485 | - init(); | ||
486 | - } | ||
487 | - | ||
488 | - EnviFile(std::string filename, std::string file_mode = "r") | ||
489 | - { | ||
490 | - init(); | ||
491 | - open(filename, filename + ".hdr", file_mode); | ||
492 | - } | ||
493 | - | ||
494 | - void open(std::string file_name, std::string header_name, std::string file_mode = "r") | ||
495 | - { | ||
496 | - mode = file_mode; | ||
497 | - | ||
498 | - header.name = header_name; | ||
499 | - | ||
500 | - //open the data file | ||
501 | - data = fopen(file_name.c_str(), mode.c_str()); | ||
502 | - | ||
503 | - //lock the file if we are loading or appending | ||
504 | - if(mode == "r" || mode == "a" || mode == "r+" || mode == "a+") | ||
505 | - { | ||
506 | - locked = true; | ||
507 | - //load the ENVI header - failure will cause an exit | ||
508 | - set_header(load_header(header_name)); | ||
509 | - } | ||
510 | - else | ||
511 | - { | ||
512 | - header.name = header_name; | ||
513 | - } | ||
514 | - | ||
515 | - | ||
516 | - } | ||
517 | - | ||
518 | - void setDescription(std::string desc) | ||
519 | - { | ||
520 | - readonly(); //if the file is read-only, throw an exception | ||
521 | - header.description = desc; | ||
522 | - } | ||
523 | - | ||
524 | - void setZPlotTitles(std::string spectrum, std::string value) | ||
525 | - { | ||
526 | - readonly(); //if the file is read-only, throw an exception | ||
527 | - header.z_plot_titles[0] = spectrum; | ||
528 | - header.z_plot_titles[1] = value; | ||
529 | - } | ||
530 | - | ||
531 | - void setPixelSize(double sx, double sy) | ||
532 | - { | ||
533 | - readonly(); //if the file is read-only, throw an exception | ||
534 | - header.pixel_size[0] = sx; | ||
535 | - header.pixel_size[1] = sy; | ||
536 | - } | ||
537 | - | ||
538 | - void setWavelengthUnits(std::string units) | ||
539 | - { | ||
540 | - readonly(); //if the file is read-only, throw an exception | ||
541 | - header.wavelength_units = units; | ||
542 | - } | ||
543 | - | ||
544 | - void setCoordinates(double x, double y) | ||
545 | - { | ||
546 | - readonly(); //if the file is read-only, throw an exception | ||
547 | - header.x_start = x; | ||
548 | - header.y_start = y; | ||
549 | - } | ||
550 | - | ||
551 | - //FUNCTIONS THAT MAY BE DISALLOWED IN A LOCKED FILE | ||
552 | - void setSamples(unsigned int samples) | ||
553 | - { | ||
554 | - EnviHeader newHeader = header; | ||
555 | - newHeader.samples = samples; | ||
556 | - set_header(newHeader); | ||
557 | - } | ||
558 | - | ||
559 | - void setLines(unsigned int lines) | ||
560 | - { | ||
561 | - EnviHeader newHeader = header; | ||
562 | - newHeader.lines = lines; | ||
563 | - set_header(newHeader); | ||
564 | - } | ||
565 | - | ||
566 | - void setBands(unsigned int bands) | ||
567 | - { | ||
568 | - EnviHeader newHeader = header; | ||
569 | - newHeader.bands = bands; | ||
570 | - set_header(newHeader); | ||
571 | - } | ||
572 | - | ||
573 | - //DATA MANIPULATION | ||
574 | - void addBand(void* band, unsigned int samples, unsigned int lines, double wavelength, std::string band_name ="") | ||
575 | - { | ||
576 | - //add a band to the file | ||
577 | - | ||
578 | - EnviHeader newHeader = header; | ||
579 | - newHeader.bands++; | ||
580 | - newHeader.samples = samples; | ||
581 | - newHeader.lines = lines; | ||
582 | - newHeader.wavelength.push_back(wavelength); | ||
583 | - if(band_name != "") | ||
584 | - newHeader.band_names.push_back(band_name); | ||
585 | - set_header(newHeader); | ||
586 | - | ||
587 | - //copy the data to the file | ||
588 | - fwrite(band, header.valsize(), samples * lines, data); | ||
589 | - | ||
590 | - //since data was written, the file must be locked | ||
591 | - locked = true; | ||
592 | - } | ||
593 | - | ||
594 | - //close file | ||
595 | - void close() | ||
596 | - { | ||
597 | - std::cout<<"ENVI File Mode: "<<mode<<std::endl; | ||
598 | - | ||
599 | - //close the data stream | ||
600 | - fclose(data); | ||
601 | - | ||
602 | - //close the header | ||
603 | - if(mode != "r") | ||
604 | - header.save(); | ||
605 | - } | ||
606 | - | ||
607 | -}; //end EnviFile | ||
608 | - | ||
609 | - | ||
610 | -#endif |
scalarslice.cu
@@ -2,7 +2,7 @@ | @@ -2,7 +2,7 @@ | ||
2 | 2 | ||
3 | #include "rts/cuda_handle_error.h" | 3 | #include "rts/cuda_handle_error.h" |
4 | #include "cublas_v2.h" | 4 | #include "cublas_v2.h" |
5 | -#include "rtsEnvi.h" | 5 | +#include "envi/rtsEnvi.h" |
6 | 6 | ||
7 | scalarslice::scalarslice(int x, int y) | 7 | scalarslice::scalarslice(int x, int y) |
8 | { | 8 | { |
@@ -54,7 +54,6 @@ void scalarslice::toImage(std::string filename, bool positive, rts::colormap::co | @@ -54,7 +54,6 @@ void scalarslice::toImage(std::string filename, bool positive, rts::colormap::co | ||
54 | //retrieve the maximum value | 54 | //retrieve the maximum value |
55 | ptype maxVal; | 55 | ptype maxVal; |
56 | HANDLE_ERROR(cudaMemcpy(&maxVal, S + result, sizeof(ptype), cudaMemcpyDeviceToHost)); | 56 | HANDLE_ERROR(cudaMemcpy(&maxVal, S + result, sizeof(ptype), cudaMemcpyDeviceToHost)); |
57 | - std::cout<<"Maximum value: "<<maxVal<<std::endl; | ||
58 | 57 | ||
59 | //destroy the CUBLAS handle | 58 | //destroy the CUBLAS handle |
60 | cublasDestroy(handle); | 59 | cublasDestroy(handle); |
@@ -80,11 +79,8 @@ void scalarslice::toEnvi(std::string filename, ptype wavelength, bool append) | @@ -80,11 +79,8 @@ void scalarslice::toEnvi(std::string filename, ptype wavelength, bool append) | ||
80 | ptype* cpuData = (ptype*) malloc( memsize ); | 79 | ptype* cpuData = (ptype*) malloc( memsize ); |
81 | HANDLE_ERROR(cudaMemcpy( cpuData, S, memsize, cudaMemcpyDeviceToHost)); | 80 | HANDLE_ERROR(cudaMemcpy( cpuData, S, memsize, cudaMemcpyDeviceToHost)); |
82 | 81 | ||
83 | - std::cout<<"Adding band."<<std::endl; | ||
84 | - std::cout<<"First value: "<<cpuData[0]<<std::endl; | ||
85 | //add a band to the ENVI file | 82 | //add a band to the ENVI file |
86 | outfile.addBand(cpuData, R[0], R[1], wavelength); | 83 | outfile.addBand(cpuData, R[0], R[1], wavelength); |
87 | - std::cout<<"Added band."<<std::endl; | ||
88 | 84 | ||
89 | outfile.close(); | 85 | outfile.close(); |
90 | 86 |