Initial snark14m import
[snark14.git] / src / snark / recfile.cpp
1 /*\r
2  ***********************************************************\r
3  $SNARK_Header: S N A R K  1 4 - A PICTURE RECONSTRUCTION PROGRAM $\r
4  $HeadURL: svn://dig.cs.gc.cuny.edu/snark/trunk/src/snark/recfile.cpp $\r
5  $LastChangedRevision: 118 $\r
6  $Date: 2014-07-09 14:22:29 -0400 (Wed, 09 Jul 2014) $\r
7  $Author: agulati $\r
8  ***********************************************************\r
9  */\r
10 \r
11 #include <cstring>\r
12 #include <cstdlib>       \r
13 #include <cstdio>\r
14 #include <cctype>\r
15 \r
16 #include "int2str.h"\r
17 #include "DIGFile.h"\r
18 #include "modefl.h"\r
19 #include "recfile.h"\r
20 \r
21 SnarkRecFile RecFile;\r
22 \r
23 void SnarkRecFile::FlipImage(REAL* Dst, REAL* Src)\r
24 {\r
25         unsigned INTEGER i;\r
26         REAL* SrcPtr = Src;  // first row\r
27         REAL* DstPtr = Dst + NumberOfElements * (NumberOfElements - 1); // last row\r
28 \r
29         for (i = 0; i < NumberOfElements; i++)\r
30         {\r
31 \r
32                 // copy row of data\r
33                 memcpy(DstPtr, SrcPtr, NumberOfElements * sizeof(REAL));\r
34 \r
35                 DstPtr -= NumberOfElements; // set to previous row\r
36                 SrcPtr += NumberOfElements; // set to next row\r
37         }\r
38 }\r
39 \r
40 INTEGER SnarkRecFile::Open(const CHAR* FileName, INTEGER nelem, REAL pixsiz)\r
41 {\r
42         // opens a file for writing\r
43         // and sets main header values\r
44 \r
45         NumberOfElements = nelem;\r
46 \r
47         // allocate data buffer\r
48         DataBuffer = new REAL[NumberOfElements * NumberOfElements];\r
49 \r
50         PixelSize = pixsiz;\r
51 \r
52         if (DIGFileSnarkRec::Open(FileName, "Proj Name", nelem, pixsiz, "This reconstruction file has been created by snark14") != 0)\r
53         {\r
54                 return 1;\r
55         }\r
56         return 0;\r
57 }\r
58 \r
59 INTEGER SnarkRecFile::Open(const CHAR* FileName)\r
60 {\r
61         // opens a file for reading\r
62 \r
63         if (DIGFileSnarkRec::Open(FileName) != 0)\r
64         {\r
65                 return 1;\r
66         }\r
67 \r
68         if (GetSampling(&PixelSize) != 0)\r
69         {\r
70                 return 2;\r
71         }\r
72 \r
73         if (GetDimensions(&NumberOfElements) != 0)\r
74         {\r
75                 return 3;\r
76         }\r
77 \r
78         DataBuffer = new REAL[NumberOfElements * NumberOfElements];\r
79 \r
80         RecNum = 0;\r
81         RecSetNum = 0;\r
82 \r
83         return 0;\r
84 }\r
85 \r
86 INTEGER SnarkRecFile::GetNelem(INTEGER* nelem)\r
87 {\r
88 \r
89         // returns the value of nelem\r
90 \r
91         *nelem = NumberOfElements;\r
92 \r
93         return 0;\r
94 }\r
95 \r
96 INTEGER SnarkRecFile::GetPixSize(REAL* pixsize)\r
97 {\r
98 \r
99         // returns the value of nelem\r
100 \r
101         *pixsize = PixelSize;\r
102         return 0;\r
103 }\r
104 \r
105 INTEGER SnarkRecFile::GetProjName(CHAR pProjName[81])\r
106 {\r
107         // returns the projection name\r
108 \r
109         const CHAR* ProjName;\r
110 \r
111         if (DIGFileSnarkRec::GetProjName(&ProjName) != 0)\r
112         {\r
113                 return -1;\r
114         }\r
115 \r
116         strncpy(pProjName, ProjName, 80);\r
117 \r
118         pProjName[80] = 0;\r
119 \r
120         return 0;\r
121 }\r
122 \r
123 INTEGER SnarkRecFile::SetProjName(CHAR* pProjName)\r
124 {\r
125         // changes the projection name (already set when opening file for writing)\r
126         return DIGFileSnarkRec::SetProjName(pProjName);\r
127 }\r
128 \r
129 INTEGER SnarkRecFile::WritePhan(CHAR* pPhanName, REAL* pData)\r
130 {\r
131         // flip image to DIGFile order\r
132         FlipImage(DataBuffer, pData);\r
133 \r
134         // append to DIGFile\r
135         return AppendPhantom(pPhanName, "Phantom created by snark14", DataBuffer);\r
136 }\r
137 \r
138 INTEGER SnarkRecFile::WriteRec(CHAR* pRecName, CHAR pAlgName[4],\r
139                 unsigned INTEGER pCount, unsigned INTEGER pIter, REAL* pData)\r
140 {\r
141 \r
142         // writes a reconstruction array\r
143         // opens a new array set if necessary\r
144 \r
145         // trim string for 3 letter algorithm names\r
146         if (pAlgName[3] == ' ')\r
147         {\r
148                 pAlgName[3] = 0;\r
149         }\r
150 \r
151         // convert to upper case\r
152         for (int i = 0; i < 4; i++)\r
153         {\r
154                 pAlgName[i] = toupper(pAlgName[i]);\r
155         }\r
156 \r
157         if (pCount == 1)\r
158         { // new  array set\r
159                 if (AppendRecSet(pAlgName, pRecName, "") != 0)\r
160                 {\r
161                         return 1;\r
162                 }\r
163         }\r
164 \r
165         // flip image to DIGFile order\r
166         FlipImage(DataBuffer, pData);\r
167 \r
168         if (AppendRec(pCount, "Reconstruction created by snark14", DataBuffer) != 0)\r
169         {\r
170                 return 2;\r
171         }\r
172 \r
173         return 0;\r
174 }\r
175 \r
176 INTEGER SnarkRecFile::ReadPhan(CHAR pPhantomName[81], REAL* pData)\r
177 {\r
178         // reads a phatom array (first array set)\r
179         // if none exists, returns 2\r
180 \r
181         const CHAR* PhantomName;\r
182 \r
183         if (!PhantomPresent)\r
184         { // no phantom in file\r
185                 return 2;\r
186         }\r
187 \r
188         if (GetPhantomName(&PhantomName) != 0)\r
189         {\r
190                 return 3;\r
191         }\r
192 \r
193         strncpy(pPhantomName, PhantomName, 80);\r
194 \r
195         pPhantomName[80] = 0;\r
196 \r
197         if (GetPhantomData(DataBuffer) != 0)\r
198         {\r
199                 return 5;\r
200         }\r
201 \r
202         // flip image to Snark order\r
203         FlipImage(pData, DataBuffer);\r
204 \r
205         unsigned int ArraySize;\r
206 \r
207         GetArrayNoOfItems(&ArraySize);\r
208 \r
209         ApplyLimits(ArraySize, pData);\r
210 \r
211         return 0;\r
212 }\r
213 \r
214 INTEGER SnarkRecFile::ApplyLimits(unsigned int pArraySize, REAL* pData)\r
215 {\r
216         unsigned int i;\r
217 \r
218         if (Modefl.lofl)\r
219         {\r
220                 if (Modefl.upfl)\r
221                 {\r
222                         for (i = 0; i < pArraySize; i++)\r
223                         {\r
224                                 if (pData[i] < Modefl.lower)\r
225                                         pData[i] = Modefl.lower;\r
226                                 if (pData[i] > Modefl.upper)\r
227                                         pData[i] = Modefl.upper;\r
228                         }\r
229                 }\r
230                 else\r
231                 {\r
232                         for (i = 0; i < pArraySize; i++)\r
233                         {\r
234                                 if (pData[i] < Modefl.lower)\r
235                                         pData[i] = Modefl.lower;\r
236                         }\r
237                 }\r
238         }\r
239         else\r
240         {\r
241                 if (Modefl.upfl)\r
242                 {\r
243                         for (i = 0; i < pArraySize; i++)\r
244                         {\r
245                                 if (pData[i] > Modefl.upper)\r
246                                         pData[i] = Modefl.upper;\r
247                         }\r
248                 }\r
249         };\r
250 \r
251         return 0;\r
252 }\r
253 \r
254 INTEGER SnarkRecFile::ReadRec(CHAR pRecName[81], CHAR pAlgName[4],\r
255                 unsigned INTEGER* pCount, unsigned INTEGER* pIter, REAL* pData)\r
256 {\r
257         // reads the next reconstruction array\r
258 \r
259         const char* AlgName;\r
260         const char* RecName;\r
261         unsigned INTEGER NoOfRecs;\r
262 \r
263         // Reconstruction set\r
264         if (SelectRecSet(RecSetNum) != 0)\r
265         {\r
266                 return 7;\r
267         }\r
268 \r
269         // Reconstruction set header\r
270         if (GetRecSetName(&RecName) != 0)\r
271         {\r
272                 return 1;\r
273         }\r
274 \r
275         strncpy(pRecName, RecName, 80);\r
276 \r
277         pRecName[80] = 0;\r
278 \r
279         // Reconstruction set header\r
280         if (GetRecSetAlgName(&AlgName) != 0)\r
281         {\r
282                 return 3;\r
283         }\r
284 \r
285         pAlgName[0] = 0;\r
286 \r
287         strncat(pAlgName, AlgName, 4);\r
288 \r
289         // get number of recs in rec set\r
290         if (GetNoOfRecs(&NoOfRecs))\r
291         {\r
292                 return 5;\r
293         }\r
294 \r
295         // select reconstruction within reconstruction set\r
296         if (DIGFileSnarkRec::SelectRec(RecNum) != 0)\r
297         {\r
298                 return 8;\r
299         }\r
300 \r
301         /*\r
302          if(GetRecCount(pCount) != 0) {\r
303          return 4;\r
304          }\r
305          */\r
306         *pCount = RecNum + 1;\r
307 \r
308         if (*pCount == NoOfRecs)\r
309         {\r
310                 *pIter = 1;\r
311         }\r
312         else\r
313         {\r
314                 *pIter = (*pCount - 1) % 50 + 2;\r
315         }\r
316 \r
317         if (GetRecData(DataBuffer) != 0)\r
318         {\r
319                 return 6;\r
320         }\r
321 \r
322         // flip image to Snark order\r
323         FlipImage(pData, DataBuffer);\r
324 \r
325         unsigned int ArraySize;\r
326 \r
327         GetArrayNoOfItems(&ArraySize);\r
328 \r
329         ApplyLimits(ArraySize, pData);\r
330 \r
331         if (RecNum == (NoOfRecs - 1))\r
332         {  // if - end of recnstruction set\r
333                 RecSetNum++;\r
334                 RecNum = 0;\r
335         }\r
336         else\r
337         {                          // not end of recnstruction set\r
338                 RecNum++;\r
339         }\r
340         return 0;\r
341 }\r
342 \r
343 // closes the file      \r
344 INTEGER SnarkRecFile::Close()\r
345 {\r
346         if (DataBuffer != NULL)\r
347                 delete[] DataBuffer;\r
348 \r
349         return DIGFile::Close();\r
350 }\r
351 \r
352 INTEGER SnarkRecFile::SelectRec(unsigned INTEGER pRecNo)\r
353 {\r
354         // selects a reconstruction\r
355         // input: array number in file\r
356         // output: will set the array set number and the array number\r
357         // first array is 0\r
358 \r
359         unsigned INTEGER NoOfRecSets;\r
360         unsigned INTEGER NoOfRecs;\r
361         unsigned INTEGER RecSetNo;\r
362         unsigned INTEGER RecNo;\r
363 \r
364         if (GetNoOfRecSets(&NoOfRecSets) != 0)\r
365         {\r
366                 return -1; // error\r
367         }\r
368 \r
369         RecNo = pRecNo;\r
370 \r
371         for (RecSetNo = 0; RecSetNo < NoOfRecSets; RecSetNo++)\r
372         {\r
373 \r
374                 // select reconstruction set\r
375                 if (SelectRecSet(RecSetNo) != 0)\r
376                 {\r
377                         return -1; // error\r
378                 }\r
379 \r
380                 // get number of reconstructions in set\r
381                 if (GetNoOfRecs(&NoOfRecs) != 0)\r
382                 {\r
383                         return -1; // error\r
384                 }\r
385 \r
386                 // Check if reconstruction in current set\r
387                 if (RecNo < NoOfRecs)\r
388                 { // reconstruction in curent reconstrction set\r
389 \r
390                         RecSetNum = RecSetNo;\r
391                         RecNum = pRecNo;\r
392 \r
393                         // select reconstruction within reconstruction set\r
394                         if (DIGFileSnarkRec::SelectRec(RecNum) != 0)\r
395                         {\r
396                                 return -1;\r
397                         }\r
398                         return 0;\r
399                 }\r
400 \r
401                 RecNum -= NoOfRecs;\r
402         }\r
403 \r
404         return -1; // requested reconstruction number is too high\r
405 }\r