Commit ae40737672c54c90c23e60e5224dc023cbe7c1f6
1 parent
26045f19
added support for variable length arguments in grid.h
Showing
2 changed files
with
129 additions
and
17 deletions
Show diff stats
stim/grids/grid.h
@@ -5,18 +5,16 @@ | @@ -5,18 +5,16 @@ | ||
5 | #include <string> | 5 | #include <string> |
6 | #include <sstream> | 6 | #include <sstream> |
7 | #include <fstream> | 7 | #include <fstream> |
8 | +#include <cstdarg> | ||
8 | 9 | ||
9 | -#include "../cuda/threads.h" | ||
10 | -#include "../cuda/error.h" | ||
11 | -#include "../cuda/devices.h" | ||
12 | #include "../math/vector.h" | 10 | #include "../math/vector.h" |
13 | 11 | ||
14 | - | ||
15 | namespace stim{ | 12 | namespace stim{ |
16 | 13 | ||
17 | -//This object describes a generic D-dimensional grid containing data of type T | ||
18 | - // data can be loaded in the form of images | ||
19 | - // data can be saved in the form of binary files | 14 | +/**This object describes a generic D-dimensional grid containing data of type T. |
15 | + Functions are provided for saving and loading binary data. | ||
16 | + | ||
17 | +**/ | ||
20 | template<typename T, unsigned int D = 1> | 18 | template<typename T, unsigned int D = 1> |
21 | class grid{ | 19 | class grid{ |
22 | 20 | ||
@@ -25,7 +23,7 @@ protected: | @@ -25,7 +23,7 @@ protected: | ||
25 | stim::vec<unsigned long, D> R; //elements in each dimension | 23 | stim::vec<unsigned long, D> R; //elements in each dimension |
26 | T* ptr; //pointer to the data (on the GPU or CPU) | 24 | T* ptr; //pointer to the data (on the GPU or CPU) |
27 | 25 | ||
28 | - //return the total number of values in the binary file | 26 | + ///Return the total number of values in the binary file |
29 | unsigned long samples(){ | 27 | unsigned long samples(){ |
30 | 28 | ||
31 | unsigned long s = 1; | 29 | unsigned long s = 1; |
@@ -33,12 +31,55 @@ protected: | @@ -33,12 +31,55 @@ protected: | ||
33 | s *= R[d]; | 31 | s *= R[d]; |
34 | 32 | ||
35 | return s; | 33 | return s; |
34 | + } | ||
35 | + | ||
36 | + ///Initializes a grid by allocating the necessary memory and setting all values to zero | ||
37 | + void init(){ | ||
38 | + | ||
39 | + //calculate the total number of values | ||
40 | + unsigned long S = samples(); | ||
41 | + | ||
42 | + //allocate memory to store the grid | ||
43 | + ptr = (T*)malloc(sizeof(T) * S); | ||
44 | + | ||
45 | + //initialize the memory to zero | ||
46 | + memset(ptr, 0, sizeof(T) * S); | ||
36 | 47 | ||
37 | } | 48 | } |
38 | 49 | ||
39 | public: | 50 | public: |
40 | 51 | ||
41 | - //write data to disk | 52 | + ///Constructor used to specify the grid size as a vector |
53 | + | ||
54 | + /// @param _R is a vector describing the grid resolution | ||
55 | + grid( stim::vec<unsigned long, D> _R){ | ||
56 | + | ||
57 | + //set the grid resolution | ||
58 | + R = _R; | ||
59 | + | ||
60 | + init(); | ||
61 | + } | ||
62 | + | ||
63 | + ///Constructor used to specify the grid size as a set of parameters | ||
64 | + | ||
65 | + /// @param X0... is a list of values describing the grid size along each dimension | ||
66 | + grid( unsigned long X0, ...){ | ||
67 | + | ||
68 | + R[0] = X0; | ||
69 | + | ||
70 | + va_list ap; | ||
71 | + va_start(ap, X0); | ||
72 | + for(unsigned int d = 1; d<D; d++) | ||
73 | + R[d] = va_arg(ap, unsigned long); | ||
74 | + va_end(ap); | ||
75 | + | ||
76 | + init(); | ||
77 | + | ||
78 | + } | ||
79 | + | ||
80 | + ///Writes the binary data to disk | ||
81 | + | ||
82 | + /// @param filename is the name of the binary file to be written | ||
42 | void write(std::string filename){ | 83 | void write(std::string filename){ |
43 | 84 | ||
44 | std::fstream file; | 85 | std::fstream file; |
@@ -50,8 +91,11 @@ public: | @@ -50,8 +91,11 @@ public: | ||
50 | file.write((char *)ptr, samples() * sizeof(T)); | 91 | file.write((char *)ptr, samples() * sizeof(T)); |
51 | } | 92 | } |
52 | 93 | ||
53 | - //load a binary file from disk | ||
54 | - // header size is in bytes | 94 | + ///Loads a binary file from disk |
95 | + | ||
96 | + /// @param filename is the name of the file containing the binary data | ||
97 | + /// @param S is the size of the binary file along each dimension | ||
98 | + /// @param header is the size of the header in bytes | ||
55 | void read(std::string filename, stim::vec<unsigned long, D> S, unsigned long header = 0){ | 99 | void read(std::string filename, stim::vec<unsigned long, D> S, unsigned long header = 0){ |
56 | 100 | ||
57 | R = S; //set the sample resolution | 101 | R = S; //set the sample resolution |
@@ -68,8 +112,69 @@ public: | @@ -68,8 +112,69 @@ public: | ||
68 | file.read((char *)ptr, samples() * sizeof(T)); | 112 | file.read((char *)ptr, samples() * sizeof(T)); |
69 | } | 113 | } |
70 | 114 | ||
115 | + ///Gets a single value from the grid given a set of coordinates | ||
116 | + | ||
117 | + /// @param x0... is a list of coordinates specifying the desired value | ||
118 | + T get(unsigned long x0, ...){ | ||
119 | + | ||
120 | + va_list ap; | ||
121 | + | ||
122 | + unsigned long F = 1; | ||
123 | + unsigned long p = x0; | ||
124 | + | ||
125 | + va_start(ap, x0); | ||
126 | + for(unsigned int d = 1; d<D; d++){ | ||
127 | + F *= R[d-1]; | ||
128 | + p += va_arg(ap, unsigned int) * F; | ||
129 | + } | ||
130 | + va_end(ap); | ||
131 | + | ||
132 | + return ptr[p]; | ||
133 | + } | ||
134 | + | ||
135 | + ///Sets a value in the grid | ||
136 | + | ||
137 | + /// @param value is the grid point value | ||
138 | + /// @x0... is the coordinate of the value to be set | ||
139 | + void set(T value, unsigned long x0, ...){ | ||
140 | + | ||
141 | + va_list ap; | ||
142 | + | ||
143 | + unsigned long F = 1; | ||
144 | + unsigned long p = x0; | ||
145 | + | ||
146 | + va_start(ap, x0); | ||
147 | + for(unsigned int d = 1; d<D; d++){ | ||
148 | + F *= R[d-1]; | ||
149 | + p += va_arg(ap, unsigned int) * F; | ||
150 | + } | ||
151 | + va_end(ap); | ||
152 | + | ||
153 | + ptr[p] = value; | ||
154 | + } | ||
155 | + | ||
156 | + ///Outputs grid data as a string | ||
157 | + std::string str(){ | ||
71 | 158 | ||
159 | + std::stringstream result; | ||
72 | 160 | ||
161 | + result<<"stim::grid structure of size ["; | ||
162 | + for(unsigned int d = 0; d<D; d++){ | ||
163 | + if(d!=0) result<<", "; | ||
164 | + result<<R[d]; | ||
165 | + } | ||
166 | + result<<"]"<<std::endl; | ||
167 | + | ||
168 | + //calculate the number of values to output | ||
169 | + unsigned long nV = min(R[0], (unsigned long)10); | ||
170 | + | ||
171 | + for(unsigned long v = 0; v<nV; v++){ | ||
172 | + result<<ptr[v]; | ||
173 | + if(v != nV-1) result<<", "; | ||
174 | + } | ||
175 | + | ||
176 | + return result.str(); | ||
177 | + } | ||
73 | }; | 178 | }; |
74 | 179 | ||
75 | } | 180 | } |
stim/grids/image_stack.h
@@ -8,8 +8,9 @@ | @@ -8,8 +8,9 @@ | ||
8 | 8 | ||
9 | namespace stim{ | 9 | namespace stim{ |
10 | 10 | ||
11 | -//this creates a class that can be used to load 3D grid data from stacks of images | ||
12 | -// The class uses a 4D grid object, where the first dimension is color | 11 | +/**This class is used to load 3D grid data from stacks of images |
12 | + The class uses a 4D grid object, where the first dimension is a color value. | ||
13 | +**/ | ||
13 | template<typename T> | 14 | template<typename T> |
14 | class image_stack : public virtual stim::grid<T, 4>{ | 15 | class image_stack : public virtual stim::grid<T, 4>{ |
15 | 16 | ||
@@ -22,6 +23,9 @@ protected: | @@ -22,6 +23,9 @@ protected: | ||
22 | 23 | ||
23 | public: | 24 | public: |
24 | 25 | ||
26 | + ///Load an image stack based on a file mask. Images are loaded in alphanumeric order. | ||
27 | + | ||
28 | + /// @param file_mask is the mask describing images to be loaded | ||
25 | void load_images(std::string file_mask){ | 29 | void load_images(std::string file_mask){ |
26 | 30 | ||
27 | stim::filename file_path(file_mask); | 31 | stim::filename file_path(file_mask); |
@@ -65,6 +69,10 @@ public: | @@ -65,6 +69,10 @@ public: | ||
65 | } | 69 | } |
66 | } | 70 | } |
67 | 71 | ||
72 | + ///Saves a single page to an image file | ||
73 | + | ||
74 | + /// @param file_name is the name of the image file to be created | ||
75 | + /// @param i is the page to be saved | ||
68 | void save_image(std::string file_name, unsigned int i){ | 76 | void save_image(std::string file_name, unsigned int i){ |
69 | 77 | ||
70 | //create an image | 78 | //create an image |
@@ -76,6 +84,9 @@ public: | @@ -76,6 +84,9 @@ public: | ||
76 | I.save(file_name); | 84 | I.save(file_name); |
77 | } | 85 | } |
78 | 86 | ||
87 | + ///Saves the entire stack to a set of images | ||
88 | + | ||
89 | + /// @param file_mask is the mask describing how the file names will be saved (ex. image????.bmp) | ||
79 | void save_images(std::string file_mask){ | 90 | void save_images(std::string file_mask){ |
80 | 91 | ||
81 | stim::filename file_path(file_mask); | 92 | stim::filename file_path(file_mask); |
@@ -93,10 +104,6 @@ public: | @@ -93,10 +104,6 @@ public: | ||
93 | save_image(file_list[i], i); | 104 | save_image(file_list[i], i); |
94 | } | 105 | } |
95 | 106 | ||
96 | - | ||
97 | - | ||
98 | - | ||
99 | - | ||
100 | }; | 107 | }; |
101 | 108 | ||
102 | 109 |