1 | //compile with:
|
---|
2 | //g++44 -std=c++0x -o fitsCompare -DHAVE_ZLIB=1 -lz dataChecker.cpp
|
---|
3 | #include <string.h>
|
---|
4 | #include <fstream>
|
---|
5 | #include <map>
|
---|
6 | #include <unordered_map>
|
---|
7 |
|
---|
8 | using namespace std;
|
---|
9 | //#include <iostream>
|
---|
10 |
|
---|
11 | #include "externals/fits.h"
|
---|
12 |
|
---|
13 | using namespace std;
|
---|
14 |
|
---|
15 | /*
|
---|
16 | * Usage: program-name <file1> <file2> <optional -v for verbose output>
|
---|
17 | *
|
---|
18 | *
|
---|
19 | *
|
---|
20 | *
|
---|
21 | *
|
---|
22 | *
|
---|
23 | */
|
---|
24 |
|
---|
25 | fits* file1;
|
---|
26 | fits* file2;
|
---|
27 | char* file1Data;
|
---|
28 | char* file2Data;
|
---|
29 |
|
---|
30 | int customReturn(int code)
|
---|
31 | {
|
---|
32 | if (file1)
|
---|
33 | {
|
---|
34 | file1->close();
|
---|
35 | delete file1;
|
---|
36 | }
|
---|
37 | if (file2)
|
---|
38 | {
|
---|
39 | file2->close();
|
---|
40 | delete file2;
|
---|
41 | }
|
---|
42 | if (file1Data)
|
---|
43 | {
|
---|
44 | delete[] file1Data;
|
---|
45 | }
|
---|
46 | if (file2Data)
|
---|
47 | {
|
---|
48 | delete[] file2Data;
|
---|
49 | }
|
---|
50 | exit(code);
|
---|
51 | }
|
---|
52 |
|
---|
53 | int main(int argc, char** argv)
|
---|
54 | {
|
---|
55 | if (argc < 3)
|
---|
56 | return -1;
|
---|
57 |
|
---|
58 | bool verbose=false;
|
---|
59 |
|
---|
60 | if (argc > 3 &&
|
---|
61 | !strcmp(argv[3], "-v"))
|
---|
62 | verbose=true;
|
---|
63 |
|
---|
64 | string filename1(argv[1]);
|
---|
65 | string filename2(argv[2]);
|
---|
66 | file1=NULL;
|
---|
67 | file2=NULL;
|
---|
68 | file1Data=NULL;
|
---|
69 | file2Data=NULL;
|
---|
70 | try
|
---|
71 | {
|
---|
72 | file1 = new fits(filename1);
|
---|
73 | file2 = new fits(filename2);
|
---|
74 | }
|
---|
75 | catch (std::runtime_error e)
|
---|
76 | {
|
---|
77 | if (verbose)
|
---|
78 | cout << "Could not open at least one of the two files." << endl;
|
---|
79 | else
|
---|
80 | cout << 2 << endl;
|
---|
81 | return -1;
|
---|
82 | }
|
---|
83 |
|
---|
84 | //get the columns in the file.
|
---|
85 | fits::Table::Columns columns1=file1->GetColumns();
|
---|
86 | fits::Table::Columns columns2=file2->GetColumns();
|
---|
87 |
|
---|
88 | if (columns1.size() != columns2.size())
|
---|
89 | {
|
---|
90 | if (verbose)
|
---|
91 | cout << "Different number of columns" << endl;
|
---|
92 | else
|
---|
93 | cout << "1" << endl;
|
---|
94 | customReturn(-1);
|
---|
95 | }
|
---|
96 |
|
---|
97 | long totalSize=0;
|
---|
98 | for (auto it=columns1.begin(), jt=columns2.begin(); it != columns1.end(); it++, jt++)
|
---|
99 | {
|
---|
100 | if (it->first != jt->first)
|
---|
101 | {
|
---|
102 | if (verbose)
|
---|
103 | cout << "Different column names" << endl;
|
---|
104 | else
|
---|
105 | cout << "1" << endl;
|
---|
106 | customReturn(-1);
|
---|
107 | }
|
---|
108 | if ((it->second.offset != jt->second.offset) ||
|
---|
109 | (it->second.num != jt->second.num) ||
|
---|
110 | (it->second.size != jt->second.size) ||
|
---|
111 | (it->second.type != jt->second.type) ||
|
---|
112 | (it->second.unit != jt->second.unit))
|
---|
113 | {
|
---|
114 | if (verbose)
|
---|
115 | cout << "Different column def" << endl;
|
---|
116 | else
|
---|
117 | cout << "1" << endl;
|
---|
118 | customReturn(-1);
|
---|
119 | }
|
---|
120 |
|
---|
121 | totalSize += it->second.size * it->second.num;
|
---|
122 |
|
---|
123 | }
|
---|
124 |
|
---|
125 | char* file1Data = new char[totalSize];
|
---|
126 | char* file2Data = new char[totalSize];
|
---|
127 |
|
---|
128 | if ((sizeof(long) != 8) ||
|
---|
129 | (sizeof(int) != 4) ||
|
---|
130 | (sizeof(short) != 2))
|
---|
131 | {
|
---|
132 | if (verbose)
|
---|
133 | cout << "OS IS NOT SUITABLE (32bits ?) please use a 64 bits system" << endl;
|
---|
134 | else
|
---|
135 | cout << "2" << endl;
|
---|
136 | customReturn(-1);
|
---|
137 | }
|
---|
138 |
|
---|
139 | for (auto it=columns1.begin(); it != columns1.end(); it++)
|
---|
140 | {
|
---|
141 | switch (it->second.size) {
|
---|
142 | case 1:
|
---|
143 | file1->SetPtrAddress(it->first, &file1Data[it->second.offset], it->second.num);
|
---|
144 | file2->SetPtrAddress(it->first, &file2Data[it->second.offset], it->second.num);
|
---|
145 | break;
|
---|
146 | case 2:
|
---|
147 | file1->SetPtrAddress(it->first, (short*)(&file1Data[it->second.offset]), it->second.num);
|
---|
148 | file2->SetPtrAddress(it->first, (short*)(&file2Data[it->second.offset]), it->second.num);
|
---|
149 | break;
|
---|
150 | case 4:
|
---|
151 | file1->SetPtrAddress(it->first, (int*)(&file1Data[it->second.offset]), it->second.num);
|
---|
152 | file2->SetPtrAddress(it->first, (int*)(&file2Data[it->second.offset]), it->second.num);
|
---|
153 | break;
|
---|
154 | case 8:
|
---|
155 | file1->SetPtrAddress(it->first, (long*)(&file1Data[it->second.offset]), it->second.num);
|
---|
156 | file2->SetPtrAddress(it->first, (long*)(&file2Data[it->second.offset]), it->second.num);
|
---|
157 | break;
|
---|
158 | default:
|
---|
159 | if (verbose)
|
---|
160 | cout << "Unkown column element size: " << it->second.size << endl;
|
---|
161 | else
|
---|
162 | cout << "2" << endl;
|
---|
163 | customReturn(-1);
|
---|
164 | };
|
---|
165 | }
|
---|
166 |
|
---|
167 | int numRows1 = file1->GetInt("NAXIS2");
|
---|
168 | int numRows2 = file2->GetInt("NAXIS2");
|
---|
169 | if (numRows1 > numRows2)
|
---|
170 | {
|
---|
171 | if (verbose)
|
---|
172 | cout << "looks like the files has different number of rows: " << numRows1 << " vs " << numRows2 << endl;
|
---|
173 | else
|
---|
174 | cout << "1" << endl;
|
---|
175 | customReturn(0);
|
---|
176 | }
|
---|
177 | int row=0;
|
---|
178 | if (verbose)
|
---|
179 | cout << "files have " << numRows1 << " rows" << endl << endl;
|
---|
180 | while (file1->GetNextRow() &&
|
---|
181 | file2->GetNextRow() &&
|
---|
182 | row < numRows1)
|
---|
183 | {
|
---|
184 | if (verbose)
|
---|
185 | {
|
---|
186 | cout << "\rrow: " << row;
|
---|
187 | cout.flush();
|
---|
188 | }
|
---|
189 | for (int i=0;i<totalSize;i++)
|
---|
190 | {
|
---|
191 | if (file1Data[i] != file2Data[i])
|
---|
192 | {
|
---|
193 | if (verbose)
|
---|
194 | cout << "Files differ... i: " << i << " " << file1Data[i] << " " << file2Data[i] << endl;
|
---|
195 | else
|
---|
196 | cout << "1" << endl;
|
---|
197 | customReturn(0);
|
---|
198 | }
|
---|
199 | }
|
---|
200 | row++;
|
---|
201 | }
|
---|
202 | if (numRows1 != numRows2)
|
---|
203 | {
|
---|
204 | if (verbose)
|
---|
205 | cout << "Archive has more rows. orig. data is fine" << endl;
|
---|
206 | else
|
---|
207 | cout << "3" << endl;
|
---|
208 | }
|
---|
209 | if (verbose)
|
---|
210 | cout << "Files data is identical" << endl;
|
---|
211 | else
|
---|
212 | cout << "0" << endl;
|
---|
213 | customReturn(0);
|
---|
214 | }
|
---|