UltraScan III
us_resids_bitmap.cpp
Go to the documentation of this file.
1 
3 #include "us_resids_bitmap.h"
4 #include "us_settings.h"
5 #include "us_gui_settings.h"
6 
7 #include <qwt_legend.h>
8 
9 // constructor: residuals bitmap widget
10 US_ResidsBitmap::US_ResidsBitmap( QVector< QVector< double > >& resids,
11  QWidget* wparent )
12  : US_WidgetsDialog( wparent, 0 )
13 {
14 
15  setWindowTitle( tr( "Residuals Pixel Map" ) );
16  setPalette( US_GuiSettings::frameColor() );
17 
18  QGridLayout* main = new QGridLayout( this );
19  main->setSpacing ( 2 );
20  main->setContentsMargins( 2, 2, 2, 2 );
21 
22  lb_bitmap = new QLabel(); // will draw to a label
23 
24  main->addWidget( lb_bitmap );
25 
26  replot( resids );
27 
28  setAttribute( Qt::WA_DeleteOnClose, true );
29 }
30 
31 void US_ResidsBitmap::replot( QVector< QVector< double > >& resids )
32 {
33  // get standard deviation of residuals
34  int scanCount = resids.size();
35  int valCount = resids[ 0 ].size();
36  double sigma = 0.0;
37  double kfactor = 2.0;
38 
39  for ( int ii = 0; ii < scanCount; ii++ )
40  { // get sum of squares for sigma (std.dev.)
41  for ( int jj = 0; jj < valCount; jj++ )
42  {
43  sigma += pow( resids[ ii ][ jj ], 2.0 );
44  }
45  }
46 
47  sigma = sqrt( sigma / (double)( scanCount * valCount ) );
48  sigma *= kfactor; // standard deviation times k-factor
49 
50  int red = 0;
51  int green = 0;
52  int blue = 0;
53  int kres;
54  double vres;
55 
56  QImage res_image( valCount, scanCount, QImage::Format_ARGB32 );
57 
58  // build image with pixel values colored by residual relation to stdev
59 
60  for ( int ii = 0; ii < scanCount; ii++ )
61  {
62  for ( int jj = 0; jj < valCount; jj++ )
63  {
64  vres = resids[ ii ][ jj ];
65  kres = qRound( 255.0 * vres / sigma );
66 
67  if ( kres >= 0 )
68  { // positive: scaled redish or red
69  red = kres < 255 ? kres : 255;
70  green = 0;
71  }
72 
73  else
74  { // negative: scaled greenish or green
75  kres = -kres;
76  red = 0;
77  green = kres < 255 ? kres : 255;
78  }
79 
80  // set pixel
81  res_image.setPixel( jj, ii, QColor( red, green, blue ).rgb() );
82  }
83  }
84 
85  int mwid = valCount < 600 ? valCount : 600;
86  int mhgt = scanCount < 100 ? scanCount : 100;
87 
88  // create the label pixmap from the image
89  resize( mwid + 4, mhgt + 4 );
90  lb_bitmap->resize( mwid, mhgt );
91  QPixmap pmap( mwid, mhgt );
92  pmap = pmap.fromImage( res_image.scaled( mwid, mhgt ) );
93 
94  lb_bitmap->setPixmap( pmap );
95 }
96