Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Conograph/trunk/src/main_indexing.cc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 33 - (show annotations) (download) (as text)
Wed Sep 7 04:38:51 2016 UTC (7 years, 6 months ago) by rtomiyasu
File MIME type: text/x-c++src
File size: 20186 byte(s)
The output format for base-centered monoclinic cells was corrected.
1 /*
2 * The MIT License
3
4 Conograph (powder auto-indexing program)
5
6 Copyright (c) <2012> <Ryoko Oishi-Tomiyasu, KEK>
7
8 Permission is hereby granted, free of charge, to any person obtaining a copy
9 of this software and associated documentation files (the "Software"), to deal
10 in the Software without restriction, including without limitation the rights
11 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 copies of the Software, and to permit persons to whom the Software is
13 furnished to do so, subject to the following conditions:
14
15 The above copyright notice and this permission notice shall be included in
16 all copies or substantial portions of the Software.
17
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 THE SOFTWARE.
25 *
26 */
27 #ifdef _OPENMP
28 #include <omp.h>
29 #endif
30 #include <iostream>
31 #include <string>
32 #include <stdexcept>
33 #include <cstdlib>
34 #include <time.h>
35 #include "ControlFile.hh"
36 #include "ControlParam.hh"
37 #include "IndexingLattice.hh"
38 #include "SortingLattice.hh"
39 #include "lattice_symmetry/OutputInfo.hh"
40 #include "lattice_symmetry/VCLatticeFigureOfMeritToCheckSymmetry.hh"
41 #include "lattice_symmetry/LatticeFigureOfMeritToDisplay.hh"
42 #include "LatticeWithSameQ/LatticeMetricTensor.hh"
43 #include "LatticeWithSameQ/LatticeWithSameQ.hh"
44 #include "LatticeWithSameQ/p_out_same_q.hh"
45 #include "zerror_type/error_out.hh"
46 #include "zerror_type/error_mes.hh"
47 #include "zlog/zlog.hh"
48 #include "p_out_indexing.hh"
49 #include "qc/p_out_space_group_dtm.hh"
50 #include "chToqValue.hh"
51 #include "utility_func/stopx.hh"
52 #include "utility_func/zstring.hh"
53
54
55 using namespace std;
56
57
58 int main(int argc, char* argv[])
59 {
60 clock_t start = clock(); /* Record the starting time. */
61
62 // For interruption signal.
63 SetSignal(SIGINT);
64
65 static const string controlFile = "cntl.inp.xml";
66 static const string InputFileLabel = "ZCodeParameters";
67
68 try{
69 CRLog::append(new CCoutListner());
70 CRLog::append(new FileoutListner("LOG_CONOGRAPH.txt", zListnerID(1)));
71
72 ZLOG_INFO( "Reading " + controlFile + "...\n\n" );
73
74 ControlFile cf;
75 ZErrorMessage zerr;
76 zerr = cf.readFile(controlFile, InputFileLabel);
77 if( zerr.putErrorType() != ZErrorNoError) throw zerr;
78
79 PeakPosData pData;
80 zerr = pData.readFile(cf.putPeakDataFileName());
81 if( zerr.putErrorType() != ZErrorNoError) throw zerr;
82
83 if( pData.putPeakPosXData().size() < 3 )
84 {
85 throw nerror_arg("NUMBER OF INPUT REFLECTIONS IS TOO SMALL.", __FILE__, __LINE__, __FUNCTION__);
86 }
87
88 ControlParam cData;
89 zerr = cData.readFile(cf.putControlParamFileName(), InputFileLabel);
90 if( zerr.putErrorType() != ZErrorNoError ) throw zerr;
91
92 #ifdef _OPENMP
93 omp_set_num_threads(min(omp_get_max_threads(), cData.putNumberOfThreadsToUse()));
94 ZLOG_INFO( "The number of threads is set to " + num2str( min(omp_get_max_threads(), cData.putNumberOfThreadsToUse()) ) + "\n" );
95 #endif
96
97 // change the peak-positions into q-values.
98 vector<QData> qData;
99 vector<Int4> qIndexData;
100 zerr = chToqValue(cData, pData, qData, qIndexData);
101 if( zerr.putErrorType() != ZErrorNoError) throw zerr;
102
103 // Set Qdata as a static member of VCData.
104 VCData::setQData(qData, qIndexData);
105
106 #ifdef DEBUG
107 ZLOG_INFO( "Outputting q-values...\nNo., qvalue, error_of_qvalue, peakpos, peak-width, flag\n" );
108 stringstream strstream;
109 for(UInt4 k=0; k<qData.size(); k++)
110 {
111 strstream << qIndexData[k] + 1 << " "
112 << qData[k].q << " "
113 << sqrt( qData[k].q_var ) << " "
114 << (pData.putPeakPosXData())[ qIndexData[k] ] << " "
115 << (pData.putPeakWidthData())[ qIndexData[k] ] << " "
116 << (pData.putToUseFlag())[ qIndexData[k] ] << endl;
117 }
118 ZLOG_INFO( strstream.str() + "\n" );
119 #endif
120
121 if( (Int4)qData.size() < 3 )
122 {
123 throw ZErrorMessage("The number of q-values is too small : " + num2str<Int4>(qData.size()), __FILE__, __LINE__, __FUNCTION__);
124 }
125
126 // Check if the range of q-values is large enough.
127 zerr = cData.setAutomaticallyComputedParam(qData);
128 if( zerr.putErrorType() != ZErrorNoError ) throw zerr;
129 const Double inv_d_max = sqrt( min( qData.begin() + cData.putMaxPeakNum(), qData.end()-1 )->q );
130 const Double inv_d_min = sqrt( qData.begin()->q );
131 ZLOG_INFO( "\nThe range of d^*-value : sqrt(the minimum of q-values)--sqrt(the maximum of q-values) = "
132 + num2str( inv_d_min ) + "--" + num2str( inv_d_max ) + "\n" );
133
134 // Estimation of zero point shift.
135 if( cData.IsAngleDispersion()
136 && cData.putPeakShiftFunctionType() != kPeakShiftFunction_Type0 )
137 {
138 vector< pair<Int4, Int4> > pair_of_q;
139 vector< Double > zero_point_shift_deg;
140 fitZeroPointShift(pData, 10, pair_of_q, zero_point_shift_deg);
141
142 ZLOG_INFO( "-------- Estimated zero point shift from pairs of peaks --------\nNo. of peaks (ratio of sin(theta)) : zero point shift\n" );
143 const Int4 ISIZE = zero_point_shift_deg.size();
144 if( ISIZE > 0 )
145 {
146 const Vec_DP& posdata = pData.putPeakPosXData();
147 static const Double RadDeg = PI() / 180.0; // = pi / 180.0.
148 stringstream strstream;
149 strstream.precision(4);
150 strstream.setf(ios::fixed, ios::floatfield);
151 for(Int4 i=0; i<ISIZE; i++)
152 {
153 strstream.width(4);
154 strstream << num2str( pair_of_q[i].first + 1 ) + "&";
155 strstream.width(4);
156 strstream << num2str( pair_of_q[i].second + 1 ) + " ("
157 << sin(0.5*posdata[ pair_of_q[i].second ]*RadDeg) / sin(0.5*posdata[ pair_of_q[i].first ]*RadDeg) << "): ";
158 strstream.width(7);
159 strstream << zero_point_shift_deg[i] << "\n";
160 }
161 ZLOG_INFO( strstream.str() );
162 }
163 else
164 {
165 ZLOG_INFO( "Could not estimate because the number of peaks is small\n" );
166 }
167 ZLOG_INFO( "-------- Estimated zero point shift from pairs of peaks --------\n" );
168 }
169
170 // Indexing.
171 IndexingLattice clc;
172 clc.setParam(cData);
173
174 clc.determineTwoDimLattices(pData, "DEBUG_CONOGRAPH");
175 clc.determineThreeDimLattices("DEBUG_CONOGRAPH");
176 const vector<SymMat43_VCData>& S_super = clc.putThreeDimTopographNodes();
177
178 ZLOG_INFO( "The program has obtained " + num2str( S_super.size() )
179 + " unit-cell parameters in CPU time : " + num2str( (clock() - start) / CLOCKS_PER_SEC )
180 + " [sec.]\n\n" );
181
182 // Indexing.
183 static const Int4 NUM_LS = put_number_of_bravais_types();
184 vector<VCLatticeFigureOfMeritToCheckSymmetry> lattice_result[NUM_LS];
185
186 SortingLattice srl;
187 srl.setParam(cData);
188
189 start = clock(); /* Record the starting time. */
190 srl.putLatticeCandidatesForEachBravaisTypes(S_super, cData.putThresholdOnNormM(), cData.putThresholdOnRevM(),
191 cData.putMaxSizeForEachBRAVAIS(),
192 cData.putBaseCenteredAxis(), cData.putRhombohedralAxis(), lattice_result);
193
194 ZLOG_INFO( "Selecting lattices with the best figure of merit among almost equivalent solutions...\n" );
195 // After this method, each lattice_result[i] are sorted by unit-cell volumes.
196 srl.setNumberOfNeighbors(cData.putBaseCenteredAxis(), OutputInfo::CmpFunc[(Int4)SCM], lattice_result);
197
198 ZLOG_INFO( "The Bravais lattice determination and refinement of unit-cell parameters finish in CPU time : " + num2str( (clock() - start) / CLOCKS_PER_SEC ) + " [sec.]\n\n" );
199
200 // Sort by sort_criterion.
201 static const eSortCriterion sort_criterion = SCM;
202 for(Int4 i=0; i<NUM_LS; i++)
203 {
204 stable_sort( lattice_result[i].begin(), lattice_result[i].end(), OutputInfo::CmpFunc[(Int4)sort_criterion] );
205 }
206
207 // Sets output_flag.
208 ZLOG_INFO( "Outputting results...\n" );
209 OutputInfo outinfo[NUM_LS];
210 for(Int4 i=0; i<NUM_LS; i++)
211 {
212 outinfo[i].setLabel(lattice_result[i], cData);
213 }
214
215 // Solution having the top M is output as the best solution.
216 printHKLdata(lattice_result, outinfo, sort_criterion, cData, pData,
217 cf.putOutputFileName());
218
219 ZLOG_INFO( "Input a lattice number in " + cf.putOutputFileName()
220 + "\n(Then, the program outputs an IGOR text file for comparison of calculated peak-positions with the powder diffraction pattern.\n"
221 + "Input \"quit\" to finish the program.) :" );
222
223 string str;
224 Int4 cs_index;
225 Int4 cs_label;
226 vector<LatticeFigureOfMeritToDisplay> selected_lattice_tray;
227
228 do{
229 cin >> str;
230 if( str == "quit" )
231 {
232 ZLOG_INFO( "quit.\n" );
233 break;
234 }
235
236 if( cin.fail() || str.length() < 3
237 || !str2num(str.substr(0,2), cs_index) || !str2num(str.substr(2), cs_label)
238 || cs_index <= 0 || put_number_of_bravais_types() < cs_index
239 || cs_label <= 0 )
240 {
241 ZLOG_ERROR( "Wrong lattice number.\n" );
242 }
243 else
244 {
245 const Int4 index = outinfo[cs_index-1].putIndex(cs_label);
246
247 if( index < 0 )
248 {
249 ZLOG_ERROR( "Wrong lattice number.\n" );
250 }
251 else
252 {
253 const LatticeFigureOfMeritZeroShift& selected_lattice0 = lattice_result[cs_index-1][index].putLatticeFigureOfMerit();
254 const size_t n = selected_lattice_tray.size();
255 selected_lattice_tray.resize(n+1);
256
257 VecDat3<Double> length_axis, angle_axis;
258 selected_lattice0.putReducedLatticeConstantsDegree(cData.putBaseCenteredAxis(), cData.putRhombohedralAxis(), length_axis, angle_axis);
259
260 ZLOG_INFO( "Optimizing lattice parameters by linear least squares...\n" );
261 bool fitting_succeed = false;
262 try{
263 // Starts from setting the Bravais-type and unit-cell parameters.
264 zerr = selected_lattice_tray[n].setLatticeConstantsDegree(selected_lattice0.enumBravaisType(), cData.putBaseCenteredAxis(), cData.putRhombohedralAxis(), length_axis, angle_axis);
265 if( zerr.putErrorType() != ZErrorNoError ) throw zerr;
266
267 selected_lattice_tray[n].putOptimizedLatticeConstantsDegree(cData.putBaseCenteredAxis(), cData.putRhombohedralAxis(), length_axis, angle_axis);
268 ZLOG_INFO( "Initial unit-cell parameters : "
269 + num2str( length_axis[0] ) + " " + num2str( length_axis[1] ) + " " + num2str( length_axis[2] ) + " "
270 + num2str( angle_axis[0] ) + " " + num2str( angle_axis[1] ) + " " + num2str( angle_axis[2] ) + "\n" );
271
272 zerr = selected_lattice_tray[n].setPeakShiftParamDegree(
273 selected_lattice0.putPeakShiftFunctionType(),
274 selected_lattice0.putWaveLength(),
275 selected_lattice0.putPeakShiftParamDegree(),
276 pData);
277 if( zerr.putErrorType() != ZErrorNoError ) throw zerr;
278 if( selected_lattice0.putPeakShiftFunctionType() != kPeakShiftFunction_Type0 )
279 {
280 ZLOG_INFO( "Wave-length: " + num2str( selected_lattice_tray[n].putLatticeFigureOfMerit().putWaveLength() ) + "\n"
281 + "Initial zero point shift: " + num2str(selected_lattice_tray[n].putPeakShiftParamDegree()[0].value ) + "\n" );
282 }
283
284 // Reduce the lattice parameters to be optimized.
285 selected_lattice_tray[n].reduceLatticeConstants();
286
287 selected_lattice_tray[n].putOptimizedLatticeConstantsDegree(cData.putBaseCenteredAxis(), cData.putRhombohedralAxis(), length_axis, angle_axis);
288 ZLOG_INFO( "Reduced unit-cell parameters : "
289 + num2str( length_axis[0] ) + " " + num2str( length_axis[1] ) + " " + num2str( length_axis[2] ) + " "
290 + num2str( angle_axis[0] ) + " " + num2str( angle_axis[1] ) + " " + num2str( angle_axis[2] ) + "\n" );
291
292
293 // Set figure of merits.
294 selected_lattice_tray[n].setFigureOfMerit(cData.putNumberOfReflectionsForFigureOfMerit());
295
296 // Index peaks and set flags.
297 selected_lattice_tray[n].resetMillerIndicesInRange(cData.putNumberOfReflectionsForFigureOfMerit());
298 selected_lattice_tray[n].resetMillerIndicesToFit();
299
300 // Set Miller indices for optimization.
301 zerr = selected_lattice_tray[n].setMillerIndicesToFit(selected_lattice_tray[n].putMillerIndicesToFit());
302 if( zerr.putErrorType() != ZErrorNoError ) throw zerr;
303 // Set Use/No Use IDs.
304 ZErrorMessage zerr = selected_lattice_tray[n].setFittingIDs(selected_lattice_tray[n].putFittingIDs());
305 if( zerr.putErrorType() != ZErrorNoError ) throw zerr;
306
307 if( selected_lattice0.putPeakShiftFunctionType() == kPeakShiftFunction_Type0 )
308 {
309 vector<etype_ID> peak_shift_fitflag(0, _ZRietveldIDVary);
310 fitting_succeed = selected_lattice_tray[n].fitLatticeParameter(pData, peak_shift_fitflag, 30, 1.0e-3); // All arguments are not used in this case.
311 }
312 else
313 {
314 vector<etype_ID> peak_shift_fitflag(1, _ZRietveldIDVary);
315 fitting_succeed = selected_lattice_tray[n].fitLatticeParameter(pData, peak_shift_fitflag, 30, 1.0e-3);
316 }
317 }
318 catch(const ZErrorMessage& zerr)
319 {
320 ZLOG_ERROR( zerr.printErrorLog() );
321 }
322
323 if( fitting_succeed )
324 {
325 selected_lattice_tray[n].putOptimizedLatticeConstantsDegree(cData.putBaseCenteredAxis(), cData.putRhombohedralAxis(), length_axis, angle_axis);
326 ZLOG_INFO( "Optimized unit-cell parameters : "
327 + num2str( length_axis[0] ) + " " + num2str( length_axis[1] ) + " " + num2str( length_axis[2] ) + " "
328 + num2str( angle_axis[0] ) + " " + num2str( angle_axis[1] ) + " " + num2str( angle_axis[2] ) + "\n)" );
329
330 if( selected_lattice0.putPeakShiftFunctionType() != kPeakShiftFunction_Type0 )
331 {
332 ZLOG_INFO( "Optimized zero point shift : " + num2str( selected_lattice_tray[n].putPeakShiftParamDegree()[0].value ) + "\n");
333 }
334 // Save the optimized solution in the original entry in lattice_result.
335 lattice_result[cs_index-1][index].setLatticeFigureOfMerit( selected_lattice_tray[n].putLatticeFigureOfMerit() );
336
337 // Reduce the lattice parameters.
338 selected_lattice_tray[n].reduceLatticeConstants();
339 selected_lattice_tray[n].putOptimizedLatticeConstantsDegree(cData.putBaseCenteredAxis(), cData.putRhombohedralAxis(), length_axis, angle_axis);
340 ZLOG_INFO( "Reduced unit-cell parameters : "
341 + num2str( length_axis[0] ) + " " + num2str( length_axis[1] ) + " " + num2str( length_axis[2] ) + " "
342 + num2str( angle_axis[0] ) + " " + num2str( angle_axis[1] ) + " " + num2str( angle_axis[2] ) + "\n\n" );
343 }
344
345 const Int4 num = selected_lattice_tray[n].putLatticeFigureOfMerit().checkDominantZone();
346 if( num > cData.putNumberOfReflectionsForFigureOfMerit() )
347 {
348 ZLOG_WARN( "A dominant zone exists. This is resolved by increasing the parameter <" + cData.putNumberOfReflectionsForFigureOfMeritLabel() + "> to a number more than " + num2str(num-1) + ".\n" );
349 }
350
351 ZLOG_INFO( "Checking coincidence of computed lines ...\n" );
352 LatticeWithSameQ lws;
353 lws.setParam( cData, selected_lattice_tray[n].putLatticeFigureOfMerit().putSellingReducedForm() );
354 pair<bool, Double> evaluation_ans;
355 lws.execute( evaluation_ans, selected_lattice_tray[n].putLatticeFigureOfMerit().putSellingReducedForm() );
356
357 if( !evaluation_ans.first )
358 {
359 ZLOG_WARN( "it is necessary to increase \"" + cData.putMaxQTocheckComputedLinesLabel()
360 + "\" or reduce " + cData.putResolutionTocheckComputedLinesLabel()
361 + "\" in order to obtain all the unit-cells with the same computed lines.\n" );
362 }
363
364 vector<LatticeFigureOfMerit> lattices_same_q;
365 lws.putLatticesWithSameQ(cData, selected_lattice_tray[n].putQDataModifiedWithNewPeakShiftParam(), lattices_same_q);
366
367 if( lattices_same_q.empty() )
368 {
369 ZLOG_INFO( "The unit-cell does not have the same computed lines as any other unit-cells.\n\n" );
370 }
371 else
372 {
373 ostringstream oss;
374 printSolutions(lattices_same_q, cData, &oss);
375 ZLOG_WARN( "The unit-cell have very similar computed lines as the following (the solution might not determined uniquely from peak positions):\n" + oss.str() );
376 if( lattices_same_q.size() > 15 )
377 {
378 ZLOG_WARN( "The peak positions of only the first 15 unit-cells are displayed. Output the IGOR file to check all the unit cells." );
379 }
380 }
381
382 string fname00, fname0;
383 removeFileExtension(cf.putOutputFileName(), fname00);
384 removeFileExtension(fname00, fname0);
385
386 const string output_igor_file_name = fname0 + "_lattice("
387 + put_bravais_type_name(selected_lattice_tray[n].putLatticeFigureOfMerit().enumBravaisType(), cData.putBaseCenteredAxis()) + ";"
388 + selected_lattice_tray[n].putLatticeFigureOfMerit().printOptimizedLatticeConstants(cData.putBaseCenteredAxis(), cData.putRhombohedralAxis(), 3) + ";"
389 + num2str<Double>(selected_lattice_tray[n].putLatticeFigureOfMerit().putFiguresOfMerit().putFigureOfMeritWolff(), 3) + ").histogramIgor";
390
391 printPeakPosition(cData, pData, selected_lattice_tray[n], lattices_same_q, output_igor_file_name);
392
393 ZLOG_INFO( "The program has output an IGOR text file : " + output_igor_file_name + "\n\n" );
394
395 if( false )
396 {
397 const Int4 num_types = putNumberOfTypesOfSystematicAbsences(selected_lattice_tray[n].putLatticeFigureOfMerit().putBravaisType());
398 const Double MIN_FOM = floor(selected_lattice_tray[n].putLatticeFigureOfMerit().putFiguresOfMerit().putFigureOfMeritWolff()*100.0)*0.01;
399
400 vector<LatticeFigureOfMeritToDisplay> lattices_with_reflection_condition;
401 for(Int4 i=0; i<num_types; i++)
402 {
403 // Copy constructor.
404 LatticeFigureOfMeritToDisplay lattice_wrc(selected_lattice_tray[n]);
405
406 lattice_wrc.setTypeOfSystematicAbsences(i);
407 lattice_wrc.setDeWolffFigureOfMerit(cData.putNumberOfReflectionsForFigureOfMerit());
408 if( lattice_wrc.putLatticeFigureOfMerit().putFiguresOfMerit().putFigureOfMeritWolff() < MIN_FOM ) continue;
409
410 lattice_wrc.resetMillerIndicesInRange(cData.putNumberOfReflectionsForFigureOfMerit());
411 lattice_wrc.resetMillerIndicesToFit();
412
413 lattices_with_reflection_condition.push_back(lattice_wrc);
414 }
415 sort( lattices_with_reflection_condition.begin(), lattices_with_reflection_condition.end(), cmpDeWolff );
416
417 // print_lattice_array(cData, pData, lattices_with_reflection_condition, fname0 + ".out.xml");
418
419 const string output_igor_file_name = fname0 + "_lattice_ref_cond("
420 + put_bravais_type_name(selected_lattice_tray[n].putLatticeFigureOfMerit().enumBravaisType(), cData.putBaseCenteredAxis()) + ";"
421 + selected_lattice_tray[n].putLatticeFigureOfMerit().printOptimizedLatticeConstants(cData.putBaseCenteredAxis(), cData.putRhombohedralAxis(), 3) + ";"
422 + num2str<Double>(selected_lattice_tray[n].putLatticeFigureOfMerit().putFiguresOfMerit().putFigureOfMeritWolff(), 3) + ").histogramIgor";
423
424 printPeakPosition(cData, pData, MIN_FOM,
425 lattices_with_reflection_condition, output_igor_file_name);
426 }
427 }
428 }
429
430 ZLOG_INFO( "Input a lattice number in " + cf.putOutputFileName() + " :" );
431
432 } while( true );
433
434 // Selected lattice is output.
435 if( !selected_lattice_tray.empty() )
436 {
437 string fname00, fname0;
438 removeFileExtension(cf.putOutputFileName(), fname00);
439 removeFileExtension(fname00, fname0);
440
441 printHKLdata(selected_lattice_tray, cData, pData, fname0 +".index2.xml");
442
443 printPeakPosition(cData, pData, selected_lattice_tray, fname0 +"_lattices.histogramIgor");
444 }
445 }
446 catch(bad_alloc& ball){
447 ZErrorMessage zerr = nerror(ball, __FILE__, __LINE__, __FUNCTION__);
448 ZLOG_ERROR( zerr.printErrorLog() );
449 return 0;
450 }
451 catch(out_of_range&)
452 {
453 ZErrorMessage zerr("out_of_range exception has occurred", __FILE__, __LINE__, __FUNCTION__);
454 ZLOG_ERROR( zerr.printErrorLog() );
455 return 0;
456 }
457 catch(const ZErrorMessage& etype)
458 {
459 ZLOG_ERROR( etype.printErrorLog() );
460 return 0;
461 }
462
463 return 1;
464 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26