@@ -996,19 +996,97 @@ void D3SpectrumDisplayDiv::setXAxisRange( const double minimum, const double max
996996}// void setXAxisRange( const double minimum, const double maximum );
997997
998998
999- void  D3SpectrumDisplayDiv::setYAxisRange ( const   double  minimum ,
1000-                                        const   double  maximum  )
999+ std::tuple< double , double ,Wt::WString>  D3SpectrumDisplayDiv::setYAxisRange ( double  lower_counts ,
1000+                                        double  upper_counts  )
10011001{
1002-   const  string minimumStr = SpecUtils::printCompact (minimum, 8 );
1003-   const  string maximumStr = SpecUtils::printCompact (maximum, 8 );
1004-   m_yAxisMinimum = minimum;
1005-   m_yAxisMaximum = maximum;
1002+   if ( upper_counts < lower_counts )
1003+     std::swap ( lower_counts, upper_counts );
1004+   
1005+   if ( upper_counts == lower_counts )
1006+     return  {m_yAxisMinimum, m_yAxisMaximum, WString::tr (" d3sdd-yaxis-lower-upper-equal" 
1007+   
1008+   WString errmsg;
1009+   const  bool  isLogY = yAxisIsLog ();
1010+   if ( isLogY )
1011+   {
1012+     const  auto  hist = m_foreground;
1013+     if ( !hist || !hist->gamma_counts () || (hist->gamma_counts ()->size () < 2 ) )
1014+       return  {m_yAxisMinimum, m_yAxisMaximum, WString::tr (" d3sdd-yaxis-no-spectrum" 
1015+     
1016+     const  shared_ptr<const  vector<float >> &channels = hist->gamma_counts ();
1017+     assert ( channels );
1018+     
1019+     //  Lets check the y-range - ignoring we may be showing multiple channels per display-bin,
1020+     //  to see if the requested range is reasonable
1021+     double  xmin, xmax, ymin, ymax;
1022+     visibleRange ( xmin, xmax, ymin, ymax );
1023+     
1024+     const  size_t  lower_channel = hist->find_gamma_channel (xmin);
1025+     const  size_t  upper_channel = hist->find_gamma_channel (xmax);
1026+     float  min_nonzero_value = std::numeric_limits<float >::max ();
1027+     float  max_value = -std::numeric_limits<float >::max ();
1028+     
1029+     for ( size_t  channel = lower_channel; channel <= upper_channel; ++channel )
1030+     {
1031+       if ( channel < channels->size () )
1032+       {
1033+         const  float  val = (*channels)[channel];
1034+         max_value = std::max ( max_value, val );
1035+         if ( val > 0 .0f  )
1036+           min_nonzero_value = std::min ( min_nonzero_value, val );
1037+       }// if( channel < channels->size() )
1038+     }// for( loop over visible channels )
1039+     
1040+     if ( (max_value <= 0 .0f ) || IsInf (max_value) || IsNan (max_value) )
1041+       max_value = 1 .0f ;
1042+     
1043+     if ( (min_nonzero_value == std::numeric_limits<float >::max ())
1044+        || IsInf (min_nonzero_value)
1045+        || IsNan (min_nonzero_value) )
1046+     {
1047+       min_nonzero_value = 0 .1f *max_value;
1048+     }
1049+     
1050+     if ( upper_counts <= 0 .0f  )
1051+     {
1052+       errmsg = WString::tr (" d3sdd-yaxis-upper-counts-below-zero" 
1053+       upper_counts = (max_value > 0 .0f ) ? 2 .0f *max_value : 1 .0f ;
1054+     }
1055+     
1056+     if ( upper_counts <= min_nonzero_value )
1057+     {
1058+       errmsg = WString::tr (" d3sdd-yaxis-below-min-non-zero" 
1059+       upper_counts = 2 .0f *min_nonzero_value;
1060+     }
1061+     
1062+     if ( (lower_counts <= 0.0 ) || (lower_counts > max_value) )
1063+     {
1064+       errmsg = WString::tr (" d3sdd-yaxis-lower-counts-below-zero" 
1065+       lower_counts = min_nonzero_value;
1066+     }
1067+   }// if( isLogY && (lower_counts <= 0.0f) )
1068+   
1069+   
1070+   if ( isLogY )
1071+   {
1072+     const  double  prevMinLogY = logYAxisMin ();
1073+     if ( lower_counts < prevMinLogY )
1074+       setLogYAxisMin ( lower_counts );
1075+   }// if( isLogY )
1076+   
1077+   
1078+   const  string minimumStr = SpecUtils::printCompact (lower_counts, 8 );
1079+   const  string maximumStr = SpecUtils::printCompact (upper_counts, 8 );
1080+   m_yAxisMinimum = lower_counts;
1081+   m_yAxisMaximum = upper_counts;
10061082
10071083  string js = m_jsgraph + " .setYAxisRange(" " ," " );" 
10081084  if ( isRendered () )
10091085    doJavaScript ( js );
10101086  else 
10111087    m_pendingJs.push_back ( js );
1088+   
1089+   return  {m_yAxisMinimum, m_yAxisMaximum, errmsg};
10121090}// void setYAxisRange( const double minimum, const double maximum );
10131091
10141092
0 commit comments