File: fomvar.cpp

package info (click to toggle)
clipper 2.1.20201109-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 13,344 kB
  • sloc: cpp: 65,248; sh: 11,365; makefile: 237; python: 122; fortran: 41; csh: 18
file content (73 lines) | stat: -rw-r--r-- 1,939 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <clipper/clipper.h>
#include <clipper/clipper-ccp4.h>



using namespace clipper;
using namespace clipper::data32;


int main(int argc, char** argv)
{
  CCP4MTZfile file;
  clipper::HKL_data_base::HKL_reference_index ih;

  double mfom[40][20], nfom[40][20];
  for ( int i = 0; i < 40; i++ ) for ( int j = 0; j < 20; j++ )
    mfom[i][j] = nfom[i][j] = 0.0;

  HKL_info hkls;

  file.open_read(argv[1]);
  file.import_hkl_info( hkls, true );
  file.close_read();
  Resolution_ordinal resord;
  resord.init( hkls, 1.0 );

  HKL_data<ABCD> abcd(hkls);
  HKL_data<Phi_fom> fom(hkls);
  HKL_data<Phi_fom> fom1(hkls);
  HKL_data<Phi_fom> fom2(hkls);
  for ( ih = hkls.first(); !ih.last(); ih.next() ) {
    fom1[ih].phi() = fom2[ih].phi() = 0.0;
    fom1[ih].fom() = fom2[ih].fom() = 0.0;
  }

  double n = 0.0;
  for ( int i = 1; i < argc; i++ ) {
    file.open_read( argv[i] );
    file.import_hkl_data( abcd, "/*/*/sigmaa" );
    file.close_read();
    fom.compute( abcd, clipper::data32::Compute_phifom_from_abcd() );
    for ( ih = hkls.first(); !ih.last(); ih.next() ) 
      if ( !fom[ih].missing() ) {
	fom1[ih].fom() += fom[ih].fom();
	fom2[ih].fom() += fom[ih].fom()*fom[ih].fom();
	int bin = int( 39.999*resord.ordinal( ih.invresolsq() ) );
	mfom[bin][i] += fom[ih].fom();
	nfom[bin][i] += 1.0;
      }
    n += 1.0;
  }

  double s0 = 0.0, s1 = 0.0;
  for ( ih = hkls.first(); !ih.last(); ih.next() )
    if ( !fom1[ih].missing() ) {
      fom1[ih].fom() /= n;
      fom2[ih].fom() /= n;
      fom2[ih].fom() = sqrt( Util::max( fom2[ih].fom() - fom1[ih].fom()*fom1[ih].fom(), 0.0f ) );
      s0 += 1.0;
      s1 += fom2[ih].fom();
    }

  std::cout << s1/s0 << "\n";

  resord.invert();
  for ( int i = 0; i < 40; i++ ) {
    std::cout << resord.ordinal(double(i)/40.0) << "  \t";
    for ( int j = 0; j < 20; j++ )
      if ( nfom[i][j] > 0.0 )
	std::cout << mfom[i][j]/nfom[i][j] << "  \t";
    std::cout << "\n";
  }
}