~mok0/clipper/trunk

« back to all changes in this revision

Viewing changes to examples/cctbxtest.cpp

  • Committer: Morten Kjeldgaard
  • Date: 2011-02-09 21:25:56 UTC
  • Revision ID: mok@bioxray.dk-20110209212556-3zbon5ukh4zf3x00
Tags: 2.0.3
versionĀ 2.0.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <clipper/clipper.h>
 
2
#include <clipper/clipper-contrib.h>
 
3
#include <clipper/clipper-cctbx.h>
 
4
//#include <clipper/clipper-mmdbold.h>
 
5
 
 
6
#include <iostream>
 
7
 
 
8
 
 
9
using namespace clipper;
 
10
 
 
11
 
 
12
int main()
 
13
{
 
14
  const char* hallsymbols[] = {
 
15
// the 530 tabulated settings
 
16
 "P 1", "-P 1", "P 2y", "P 2", "P 2x",
 
17
 "P 2yb", "P 2c", "P 2xa", "C 2y", "A 2y",
 
18
 "I 2y", "A 2", "B 2", "I 2", "B 2x",
 
19
 "C 2x", "I 2x", "P -2y", "P -2", "P -2x",
 
20
 "P -2yc", "P -2yac", "P -2ya", "P -2a", "P -2ab",
 
21
 "P -2b", "P -2xb", "P -2xbc", "P -2xc", "C -2y",
 
22
 "A -2y", "I -2y", "A -2", "B -2", "I -2",
 
23
 "B -2x", "C -2x", "I -2x", "C -2yc", "A -2yac",
 
24
 "I -2ya", "A -2ya", "C -2ybc", "I -2yc", "A -2a",
 
25
 "B -2bc", "I -2b", "B -2b", "A -2ac", "I -2a",
 
26
 "B -2xb", "C -2xbc", "I -2xc", "C -2xc", "B -2xbc",
 
27
 "I -2xb", "-P 2y", "-P 2", "-P 2x", "-P 2yb",
 
28
 "-P 2c", "-P 2xa", "-C 2y", "-A 2y", "-I 2y",
 
29
 "-A 2", "-B 2", "-I 2", "-B 2x", "-C 2x",
 
30
 "-I 2x", "-P 2yc", "-P 2yac", "-P 2ya", "-P 2a",
 
31
 "-P 2ab", "-P 2b", "-P 2xb", "-P 2xbc", "-P 2xc",
 
32
 "-P 2ybc", "-P 2yn", "-P 2yab", "-P 2ac", "-P 2n",
 
33
 "-P 2bc", "-P 2xab", "-P 2xn", "-P 2xac", "-C 2yc",
 
34
 "-A 2yac", "-I 2ya", "-A 2ya", "-C 2ybc", "-I 2yc",
 
35
 "-A 2a", "-B 2bc", "-I 2b", "-B 2b", "-A 2ac",
 
36
 "-I 2a", "-B 2xb", "-C 2xbc", "-I 2xc", "-C 2xc",
 
37
 "-B 2xbc", "-I 2xb", "P 2 2", "P 2c 2", "P 2a 2a",
 
38
 "P 2 2b", "P 2 2ab", "P 2bc 2", "P 2ac 2ac", "P 2ac 2ab",
 
39
 "C 2c 2", "A 2a 2a", "B 2 2b", "C 2 2", "A 2 2",
 
40
 "B 2 2", "F 2 2", "I 2 2", "I 2b 2c", "P 2 -2",
 
41
 "P -2 2", "P -2 -2", "P 2c -2", "P 2c -2c", "P -2a 2a",
 
42
 "P -2 2a", "P -2 -2b", "P -2b -2", "P 2 -2c", "P -2a 2",
 
43
 "P -2b -2b", "P 2 -2a", "P 2 -2b", "P -2b 2", "P -2c 2",
 
44
 "P -2c -2c", "P -2a -2a", "P 2c -2ac", "P 2c -2b", "P -2b 2a",
 
45
 "P -2ac 2a", "P -2bc -2c", "P -2a -2ab", "P 2 -2bc", "P 2 -2ac",
 
46
 "P -2ac 2", "P -2ab 2", "P -2ab -2ab", "P -2bc -2bc", "P 2ac -2",
 
47
 "P 2bc -2bc", "P -2ab 2ab", "P -2 2ac", "P -2 -2bc", "P -2ab -2",
 
48
 "P 2 -2ab", "P -2bc 2", "P -2ac -2ac", "P 2c -2n", "P 2c -2ab",
 
49
 "P -2bc 2a", "P -2n 2a", "P -2n -2ac", "P -2ac -2n", "P 2 -2n",
 
50
 "P -2n 2", "P -2n -2n", "C 2 -2", "A -2 2", "B -2 -2",
 
51
 "C 2c -2", "C 2c -2c", "A -2a 2a", "A -2 2a", "B -2 -2b",
 
52
 "B -2b -2", "C 2 -2c", "A -2a 2", "B -2b -2b", "A 2 -2",
 
53
 "B 2 -2", "B -2 2", "C -2 2", "C -2 -2", "A -2 -2",
 
54
 "A 2 -2c", "B 2 -2c", "B -2c 2", "C -2b 2", "C -2b -2b",
 
55
 "A -2c -2c", "A 2 -2a", "B 2 -2b", "B -2b 2", "C -2c 2",
 
56
 "C -2c -2c", "A -2a -2a", "A 2 -2ac", "B 2 -2bc", "B -2bc 2",
 
57
 "C -2bc 2", "C -2bc -2bc", "A -2ac -2ac", "F 2 -2", "F -2 2",
 
58
 "F -2 -2", "F 2 -2d", "F -2d 2", "F -2d -2d", "I 2 -2",
 
59
 "I -2 2", "I -2 -2", "I 2 -2c", "I -2a 2", "I -2b -2b",
 
60
 "I 2 -2a", "I 2 -2b", "I -2b 2", "I -2c 2", "I -2c -2c",
 
61
 "I -2a -2a", "-P 2 2", "P 2 2 -1n", "-P 2ab 2bc", "-P 2 2c",
 
62
 "-P 2a 2", "-P 2b 2b", "P 2 2 -1ab", "-P 2ab 2b", "P 2 2 -1bc",
 
63
 "-P 2b 2bc", "P 2 2 -1ac", "-P 2a 2c", "-P 2a 2a", "-P 2b 2",
 
64
 "-P 2 2b", "-P 2c 2c", "-P 2c 2", "-P 2 2a", "-P 2a 2bc",
 
65
 "-P 2b 2n", "-P 2n 2b", "-P 2ab 2c", "-P 2ab 2n", "-P 2n 2bc",
 
66
 "-P 2ac 2", "-P 2bc 2bc", "-P 2ab 2ab", "-P 2 2ac", "-P 2 2bc",
 
67
 "-P 2ab 2", "-P 2a 2ac", "-P 2b 2c", "-P 2a 2b", "-P 2ac 2c",
 
68
 "-P 2bc 2b", "-P 2b 2ab", "-P 2 2ab", "-P 2bc 2", "-P 2ac 2ac",
 
69
 "-P 2ab 2ac", "-P 2ac 2bc", "-P 2bc 2ab", "-P 2c 2b", "-P 2c 2ac",
 
70
 "-P 2ac 2a", "-P 2b 2a", "-P 2a 2ab", "-P 2bc 2c", "-P 2 2n",
 
71
 "-P 2n 2", "-P 2n 2n", "P 2 2ab -1ab", "-P 2ab 2a", "P 2bc 2 -1bc",
 
72
 "-P 2c 2bc", "P 2ac 2ac -1ac", "-P 2c 2a", "-P 2n 2ab", "-P 2n 2c",
 
73
 "-P 2a 2n", "-P 2bc 2n", "-P 2ac 2b", "-P 2b 2ac", "-P 2ac 2ab",
 
74
 "-P 2bc 2ac", "-P 2ac 2n", "-P 2bc 2a", "-P 2c 2ab", "-P 2n 2ac",
 
75
 "-P 2n 2a", "-P 2c 2n", "-C 2c 2", "-C 2c 2c", "-A 2a 2a",
 
76
 "-A 2 2a", "-B 2 2b", "-B 2b 2", "-C 2bc 2", "-C 2bc 2bc",
 
77
 "-A 2ac 2ac", "-A 2 2ac", "-B 2 2bc", "-B 2bc 2", "-C 2 2",
 
78
 "-A 2 2", "-B 2 2", "-C 2 2c", "-A 2a 2", "-B 2b 2b",
 
79
 "-C 2b 2", "-C 2b 2b", "-A 2c 2c", "-A 2 2c", "-B 2 2c",
 
80
 "-B 2c 2", "C 2 2 -1bc", "-C 2b 2bc", "C 2 2 -1bc", "-C 2b 2c",
 
81
 "A 2 2 -1ac", "-A 2a 2c", "A 2 2 -1ac", "-A 2ac 2c", "B 2 2 -1bc",
 
82
 "-B 2bc 2b", "B 2 2 -1bc", "-B 2b 2bc", "-F 2 2", "F 2 2 -1d",
 
83
 "-F 2uv 2vw", "-I 2 2", "-I 2 2c", "-I 2a 2", "-I 2b 2b",
 
84
 "-I 2b 2c", "-I 2a 2b", "-I 2b 2", "-I 2a 2a", "-I 2c 2c",
 
85
 "-I 2 2b", "-I 2 2a", "-I 2c 2", "P 4", "P 4w",
 
86
 "P 4c", "P 4cw", "I 4", "I 4bw", "P -4",
 
87
 "I -4", "-P 4", "-P 4c", "P 4ab -1ab", "-P 4a",
 
88
 "P 4n -1n", "-P 4bc", "-I 4", "I 4bw -1bw", "-I 4ad",
 
89
 "P 4 2", "P 4ab 2ab", "P 4w 2c", "P 4abw 2nw", "P 4c 2",
 
90
 "P 4n 2n", "P 4cw 2c", "P 4nw 2abw", "I 4 2", "I 4bw 2bw",
 
91
 "P 4 -2", "P 4 -2ab", "P 4c -2c", "P 4n -2n", "P 4 -2c",
 
92
 "P 4 -2n", "P 4c -2", "P 4c -2ab", "I 4 -2", "I 4 -2c",
 
93
 "I 4bw -2", "I 4bw -2c", "P -4 2", "P -4 2c", "P -4 2ab",
 
94
 "P -4 2n", "P -4 -2", "P -4 -2c", "P -4 -2ab", "P -4 -2n",
 
95
 "I -4 -2", "I -4 -2c", "I -4 2", "I -4 2bw", "-P 4 2",
 
96
 "-P 4 2c", "P 4 2 -1ab", "-P 4a 2b", "P 4 2 -1n", "-P 4a 2bc",
 
97
 "-P 4 2ab", "-P 4 2n", "P 4ab 2ab -1ab", "-P 4a 2a", "P 4ab 2n -1ab",
 
98
 "-P 4a 2ac", "-P 4c 2", "-P 4c 2c", "P 4n 2c -1n", "-P 4ac 2b",
 
99
 "P 4n 2 -1n", "-P 4ac 2bc", "-P 4c 2ab", "-P 4n 2n", "P 4n 2n -1n",
 
100
 "-P 4ac 2a", "P 4n 2ab -1n", "-P 4ac 2ac", "-I 4 2", "-I 4 2c",
 
101
 "I 4bw 2bw -1bw", "-I 4bd 2", "I 4bw 2aw -1bw", "-I 4bd 2c", "P 3",
 
102
 "P 31", "P 32", "R 3", "P 3*", "-P 3",
 
103
 "-R 3", "-P 3*", "P 3 2", "P 3 2\"", "P 31 2c (0 0 1)",
 
104
 "P 31 2\"", "P 32 2c (0 0 -1)", "P 32 2\"", "R 3 2\"", "P 3* 2",
 
105
 "P 3 -2\"", "P 3 -2", "P 3 -2\"c", "P 3 -2c", "R 3 -2\"",
 
106
 "P 3* -2", "R 3 -2\"c", "P 3* -2n", "-P 3 2", "-P 3 2c",
 
107
 "-P 3 2\"", "-P 3 2\"c", "-R 3 2\"", "-P 3* 2", "-R 3 2\"c",
 
108
 "-P 3* 2n", "P 6", "P 61", "P 65", "P 62",
 
109
 "P 64", "P 6c", "P -6", "-P 6", "-P 6c",
 
110
 "P 6 2", "P 61 2 (0 0 -1)", "P 65 2 (0 0 1)", "P 62 2c (0 0 1)", "P 64 2c (0 0 -1)",
 
111
 "P 6c 2c", "P 6 -2", "P 6 -2c", "P 6c -2", "P 6c -2c",
 
112
 "P -6 2", "P -6c 2", "P -6 -2", "P -6c -2c", "-P 6 2",
 
113
 "-P 6 2c", "-P 6c 2", "-P 6c 2c", "P 2 2 3", "F 2 2 3",
 
114
 "I 2 2 3", "P 2ac 2ab 3", "I 2b 2c 3", "-P 2 2 3", "P 2 2 3 -1n",
 
115
 "-P 2ab 2bc 3", "-F 2 2 3", "F 2 2 3 -1d", "-F 2uv 2vw 3", "-I 2 2 3",
 
116
 "-P 2ac 2ab 3", "-I 2b 2c 3", "P 4 2 3", "P 4n 2 3", "F 4 2 3",
 
117
 "F 4d 2 3", "I 4 2 3", "P 4acd 2ab 3", "P 4bd 2ab 3", "I 4bd 2c 3",
 
118
 "P -4 2 3", "F -4 2 3", "I -4 2 3", "P -4n 2 3", "F -4c 2 3",
 
119
 "I -4bd 2c 3", "-P 4 2 3", "P 4 2 3 -1n", "-P 4a 2bc 3", "-P 4n 2 3",
 
120
 "P 4n 2 3 -1n", "-P 4bc 2bc 3", "-F 4 2 3", "-F 4c 2 3", "F 4d 2 3 -1d",
 
121
 "-F 4vw 2vw 3", "F 4d 2 3 -1cd", "-F 4cvw 2vw 3", "-I 4 2 3", "-I 4bd 2c 3",
 
122
// the 51 pathological point groups
 
123
 "-P 1", "-P 2", "-P 2y", "-P 2x", "-P 2\"", "-P 2y\"", "-P 2x\"", "-P 2'", "-P 2y'", "-P 2x'", "-P 2 2", "-P 2 2\"", "-P 2 2\"(y,z,x)", "-P 2 2\"(z,x,y)", "-P 3", "-P 3 (y,z,x)", "-P 3 (z,x,y)", "-P 3 (-x,y,z)", "-P 3 (y,z,-x)", "-P 3 (z,-x,y)", "-P 3*", "-P 3* (-x,y,z)", "-P 3* (x,-y,z)", "-P 3* (x,y,-z)", "-P 3 2", "-P 3 2 (y,z,x)", "-P 3 2 (z,x,y)", "-P 3* 2", "-P 3* 2 (-x,y,z)", "-P 3* 2 (x,-y,z)", "-P 3* 2 (-x,-y,z)", "-P 3 2\"", "-P 3 2\"(z,x,y)", "-P 3 2\"(y,z,x)", "-P 3 2\"(-x,y,z)", "-P 3 2\"(z,-x,y)", "-P 3 2\"(y,z,-x)", "-P 4", "-P 4 (y,z,x)", "-P 4 (z,x,y)", "-P 4 2", "-P 4 2 (y,z,x)", "-P 4 2 (z,x,y)", "-P 6", "-P 6 (y,z,x)", "-P 6 (z,x,y)", "-P 6 2", "-P 6 2 (y,z,x)", "-P 6 2 (z,x,y)", "-P 2 2 3", "-P 4 2 3",
 
124
  };
 
125
 
 
126
 
 
127
  // check cells
 
128
  Cell c( Cell_descr( 11, 12, 13, 70, 80, 90 ) );
 
129
  std::cout << c.format() << "\n" << CCTBX::cell(CCTBX::cell(c)).format() << "\n";
 
130
 
 
131
  // check hkls
 
132
  HKL hkl( 3, 4, 5 );
 
133
  std::cout << hkl.format() << "\t" << CCTBX::hkl(CCTBX::Hkl(hkl)).format() << "\n";
 
134
  std::cout << hkl.format() << "\t" << CCTBX::Hkl(CCTBX::hkl(hkl)).format() << "\n";
 
135
 
 
136
  // test fft in each spacegroup
 
137
  Cell cellc( Cell_descr( 37, 37, 37 ) );
 
138
  Cell cellha( Cell_descr( 37, 37, 37, 120, 90, 90 ) );
 
139
  Cell cellhb( Cell_descr( 37, 37, 37, 90, 120, 90 ) );
 
140
  Cell cellhc( Cell_descr( 37, 37, 37, 90, 90, 120 ) );
 
141
  Cell cellha1( Cell_descr( 37, 37, 37, 60, 90, 90 ) );
 
142
  Cell cellhb1( Cell_descr( 37, 37, 37, 90, 60, 90 ) );
 
143
  Cell cellhc1( Cell_descr( 37, 37, 37, 90, 90, 60 ) );
 
144
  Cell cell;
 
145
  for ( int s = 0; s < sizeof(hallsymbols)/sizeof(hallsymbols[0]); s++ ) {
 
146
    // get spacegroup
 
147
    String symbol = hallsymbols[s];
 
148
    cctbx::sgtbx::SpaceGroup sgops(hallsymbols[s]);
 
149
    Spacegroup s1( Spgr_descr( symbol, Spgr_descr::Hall ) );
 
150
    Spacegroup s2 = CCTBX::spacegroup( sgops );
 
151
    Spacegroup s3 = CCTBX::spacegroup( CCTBX::spacegroup( s2 ) );
 
152
 
 
153
    // identify trigonal/hexagonal groups
 
154
    cell = cellc;
 
155
    for ( int sym = 1; sym < s1.num_symops(); sym++ ) {
 
156
      if ( ( s1.symop(sym).rot()(1,1) * s1.symop(sym).rot()(1,2) == -1 ) ||
 
157
           ( s1.symop(sym).rot()(2,1) * s1.symop(sym).rot()(2,2) == -1 ) )
 
158
        cell = cellha;
 
159
      if ( ( s1.symop(sym).rot()(0,0) * s1.symop(sym).rot()(0,2) == -1 ) ||
 
160
           ( s1.symop(sym).rot()(2,0) * s1.symop(sym).rot()(2,2) == -1 ) )
 
161
        cell = cellhb;
 
162
      if ( ( s1.symop(sym).rot()(0,0) * s1.symop(sym).rot()(0,1) == -1 ) ||
 
163
           ( s1.symop(sym).rot()(1,0) * s1.symop(sym).rot()(1,1) == -1 ) )
 
164
        cell = cellhc;
 
165
      if ( ( s1.symop(sym).rot()(1,1) * s1.symop(sym).rot()(1,2) == 1 ) ||
 
166
           ( s1.symop(sym).rot()(2,1) * s1.symop(sym).rot()(2,2) == 1 ) )
 
167
        cell = cellha1;
 
168
      if ( ( s1.symop(sym).rot()(0,0) * s1.symop(sym).rot()(0,2) == 1 ) ||
 
169
           ( s1.symop(sym).rot()(2,0) * s1.symop(sym).rot()(2,2) == 1 ) )
 
170
        cell = cellhb1;
 
171
      if ( ( s1.symop(sym).rot()(0,0) * s1.symop(sym).rot()(0,1) == 1 ) ||
 
172
           ( s1.symop(sym).rot()(1,0) * s1.symop(sym).rot()(1,1) == 1 ) )
 
173
        cell = cellhc1;
 
174
    }
 
175
 
 
176
    // build model
 
177
    Atom_list atoms;
 
178
    Atom atom = Atom::null();
 
179
    atom.set_occupancy( 1.0 );
 
180
    atom.set_u_iso( 0.5 );
 
181
    atom.set_element( "C" );
 
182
    atom.set_coord_orth( Coord_orth( 12, 8, 5 ) );
 
183
    atoms.push_back( atom );
 
184
    atom.set_element( "N" );
 
185
    atom.set_coord_orth( Coord_orth( 11, 6, 4 ) );
 
186
    atoms.push_back( atom );
 
187
    atom.set_element( "O" );
 
188
    atom.set_coord_orth( Coord_orth( 13, 5, 4 ) );
 
189
    atoms.push_back( atom );
 
190
 
 
191
    /*
 
192
    // build mmdb
 
193
    MMDB mmdb( s1, cell );
 
194
    clipper::NDBModel model;
 
195
    clipper::NDBChain chain;
 
196
    clipper::NDBResidue residue;
 
197
    clipper::NDBAtom atom;
 
198
    model.set_id("A");
 
199
    chain.set_id("A");
 
200
    residue.set_type("GLY");
 
201
    atom = clipper::NDBAtom::null();
 
202
    atom.set_occupancy(1.0);
 
203
    atom.set_u_iso(0.5);
 
204
    clipper::DBModel m1 = mmdb.add_model( model );
 
205
    clipper::DBChain c1 = m1.add_chain( chain );
 
206
    clipper::DBResidue r1 = c1.add_residue( residue );
 
207
    atom.set_element( "C" );
 
208
    atom.set_coord_orth( Coord_orth( 12, 8, 5 ) );
 
209
    r1.add_atom( atom );
 
210
    atom.set_element( "N" );
 
211
    atom.set_coord_orth( Coord_orth( 11, 6, 4 ) );
 
212
    r1.add_atom( atom );
 
213
    atom.set_element( "O" );
 
214
    atom.set_coord_orth( Coord_orth( 13, 5, 4 ) );
 
215
    r1.add_atom( atom );
 
216
    mmdb.finalise_edit();
 
217
    clipper::DBAtom_selection atoms = mmdb.select_atoms_serial( 0, 0 );
 
218
    */
 
219
 
 
220
    // calc structure factors by slow fft
 
221
    HKL_info hkl_info( s1, cell, Resolution( 3.0 ), true );
 
222
    HKL_data<data32::F_phi> f_phi1( hkl_info );
 
223
    HKL_data<data32::F_phi> f_phi2( hkl_info );
 
224
    SFcalc_iso_sum<float>( f_phi1, atoms );
 
225
    SFcalc_iso_fft<float>( f_phi2, atoms );
 
226
    Grid_sampling grid( s1, cell, Resolution( 3.0 ) );
 
227
    Xmap<float> xmap( s1, cell, grid );
 
228
    FFTmap fftmap( s1, cell, grid );
 
229
    xmap.fft_from( f_phi2, Xmap_base::Normal );
 
230
    xmap.fft_to( f_phi2, Xmap_base::Sparse );
 
231
    fftmap.fft_rfl_to_map( f_phi2, xmap );
 
232
    xmap.fft_to( f_phi2, Xmap_base::Normal );
 
233
    xmap.fft_from( f_phi2, Xmap_base::Sparse );
 
234
    fftmap.fft_map_to_rfl( xmap, f_phi2 );
 
235
 
 
236
    int nerr = 0;
 
237
    for (int h=-2; h<=2; h++)
 
238
      for (int k=-2; k<=2; k++)
 
239
        for (int l=-2; l<=2; l++) {
 
240
          HKL rfl(h,k,l);
 
241
          if ( !HKL_class( s1, rfl ).sys_abs() )
 
242
            if ( std::abs( std::complex<float>(fftmap.get_recip_data(rfl) ) -
 
243
                           std::complex<float>(f_phi2[rfl]) ) > 1.0e-3 ) {
 
244
              nerr++;
 
245
              std::cout << rfl.format() <<
 
246
                "\t: " << fftmap.get_recip_data(rfl).f() <<
 
247
                "\t" << fftmap.get_recip_data(rfl).phi() <<
 
248
                "\t: " << f_phi2[rfl].f() <<
 
249
                "\t" << f_phi2[rfl].phi() <<
 
250
                "\t" << f_phi2[rfl].missing() << ":" << HKL_class( s1, rfl ).sys_abs() << "\n";
 
251
            }
 
252
          if ( HKL_class( s1, rfl ).sys_abs() != f_phi2[rfl].missing() ) {
 
253
            nerr++;
 
254
            int sym; bool friedel;
 
255
            int ih = hkl_info.index_of( hkl_info.find_sym( rfl, sym, friedel) );
 
256
            std::cout << rfl.format() << ih << " " << sym << " " << friedel <<
 
257
              "\t" << hkl_info.hkl_of( ih ).format() <<
 
258
              "\t" << f_phi2[rfl].missing() <<
 
259
              ":" << HKL_class( s1, rfl ).sys_abs() << "\n";
 
260
          }
 
261
        }
 
262
    
 
263
    HKL_info::HKL_reference_index ih;
 
264
    float tol = 0.002 * f_phi1[ HKL( 0, 0, 0 ) ].f();
 
265
    for ( ih = hkl_info.first(); !ih.last(); ih.next() )
 
266
      if ( std::abs( std::complex<float>(f_phi1[ih]) -
 
267
                     std::complex<float>(f_phi2[ih]) ) > tol ) {
 
268
        nerr++;
 
269
        std::cout << ih.hkl().format() << 
 
270
          "\t: " << f_phi1[ih].f() << "\t" << f_phi1[ih].phi() <<
 
271
          "\t: " << f_phi2[ih].f() << "\t" << f_phi2[ih].phi() <<
 
272
          "\n";
 
273
      }
 
274
 
 
275
    // diagnostics
 
276
    if ( s1.hash() != s2.hash() || s1.hash() != s3.hash() || nerr > 1 )
 
277
      std::cout << "Fail ";
 
278
    else
 
279
      std::cout << "OK   ";
 
280
    String name = symbol + "                  ";
 
281
    std::cout << name.substr(0,17) << cell.alpha_deg() << " " << cell.beta_deg() << " " << cell.gamma_deg() << "\t" << s1.asu_max().format() << "   " << nerr << "\n";
 
282
  }
 
283
}