17 #include "msdevstudio/MSconfig.h"
29 #include <qapplication.h>
31 #if QT_VERSION < 0x040000
32 #include "qlistview.h"
33 #include "qbuttongroup.h"
34 #include "qgroupbox.h"
35 #include "qwidgetstack.h"
38 #include <QtCore/QCustomEvent>
39 #include <QtGui/QHBoxLayout>
40 #include <QtGui/QVBoxLayout>
42 #include "q3listview.h"
43 #include "q3buttongroup.h"
44 #include "q3groupbox.h"
45 #include "q3widgetstack.h"
49 #include "qcheckbox.h"
50 #include "qcolordialog.h"
51 #include "qcombobox.h"
52 #include "qlineedit.h"
53 #include "qmessagebox.h"
54 #include "qpushbutton.h"
55 #include "qradiobutton.h"
58 #include "qinputdialog.h"
59 #include "qfontdialog.h"
60 #include "qtabwidget.h"
61 #include "qsettings.h"
62 #include "qstringlist.h"
63 #include "qtextstream.h"
89 #include "boost/tokenizer.hpp"
90 #include "boost/lexical_cast.hpp"
106 using std::runtime_error;
110 using namespace hippodraw;
116 std::vector<std::string> & tokens,
bool clear )
121 std::string::size_type j;
122 while ( (j = input.find_first_of(delimiters)) != std::string::npos ) {
124 tokens.push_back(input.substr(0, j));
126 input = input.substr(j+1);
128 tokens.push_back(input);
129 if (tokens.back() ==
"") {
142 m_is_updating ( false ),
143 m_user_models_loaded ( false )
147 const vector < string > & names = controller -> getFitterNames ();
148 for (
unsigned int i = 0; i < names.size(); i++ ) {
149 QString name ( names[i].c_str() );
152 #if QT_VERSION < 0x040000
153 #else // correct code generated by uic3 with release 4.1.1
180 connect (
m_all_ntuples, SIGNAL ( currentIndexChanged (
int ) ),
185 connect (
axisWidget1, SIGNAL ( lowTextReturnPressed() ),
188 connect (
axisWidget2, SIGNAL ( lowTextReturnPressed() ),
191 connect (
axisWidget1, SIGNAL ( highTextReturnPressed() ),
194 connect (
axisWidget2, SIGNAL ( highTextReturnPressed() ),
197 connect (
axisWidget1, SIGNAL ( lowSliderReleased() ),
200 connect (
axisWidget2, SIGNAL ( lowSliderReleased() ),
203 connect (
axisWidget1, SIGNAL ( lowSliderPressed() ),
206 connect (
axisWidget1, SIGNAL ( highSliderPressed() ),
209 connect (
axisWidget1, SIGNAL ( lowSliderValueChanged (
int ) ),
212 connect (
axisWidget2, SIGNAL ( lowSliderValueChanged (
int ) ),
215 connect (
axisWidget1, SIGNAL ( highSliderReleased() ),
218 connect (
axisWidget2, SIGNAL ( highSliderReleased() ),
221 connect (
axisWidget1, SIGNAL ( highSliderValueChanged (
int ) ),
224 connect (
axisWidget2, SIGNAL ( highSliderValueChanged (
int ) ),
227 connect (
axisWidget1, SIGNAL ( zoomPanCheckBoxClicked () ),
230 connect (
axisWidget2, SIGNAL ( zoomPanCheckBoxClicked () ),
286 setFixedSize ( cur_size );
339 const vector < string > & names = controller -> getValueTransformTypes ();
341 unsigned int size = names.size ();
342 for (
unsigned int i = 0; i <
size; i++ ) {
355 #if QT_VERSION < 0x040000
363 m_plotter = pev -> plotter ();
370 m_plotter_list = ev -> getPlotters ();
371 if ( m_plotter_list.size () == 1 ) {
372 m_plotter = m_plotter_list.front ();
394 #if QT_VERSION < 0x040000
400 button -> setChecked (
true );
405 #if QT_VERSION < 0x040000
411 button -> setEnabled ( enabled );
425 if ( isHidden() ==
true )
return;
427 int index =
m_plot_tab -> currentPageIndex ();
473 if ( plotter == 0 ) {
477 vector < PlotterBase * > cutlist;
479 controller -> fillCutList ( plotter, cutlist );
481 if ( cutlist.empty () ) {
487 vector < PlotterBase * >::iterator first = cutlist.begin();
488 while ( first != cutlist.end () ) {
492 cutter -> setActive (
true );
503 const vector < string > & names
507 names.empty () == false ) {
518 const vector < string > & nt_vector
522 if ( nt_vector.empty () ) {
529 if ( count == nt_vector.size () )
return;
531 #ifdef ITERATOR_MEMBER_DEFECT
536 vector < string > ::const_iterator first = nt_vector.begin();
537 while ( first != nt_vector.end() ) {
538 const string & name = *first++;
543 const string & name = nt_vector.back ();
561 const vector < string > & nt_vector
564 for (
unsigned int i = 0; i < nt_vector.size(); i++ ) {
565 if ( nt_vector[i] == name ) {
567 if ( current != i ) {
594 vector < DataSource * > nt_vector;
595 controller -> getDataSources ( nt_vector );
597 if ( ds == 0 )
return;
599 const string new_name = text.
latin1();
601 ds -> setName ( new_name );
609 controller -> setCurrentIndex ( item );
637 controller -> setCurrentIndex( index );
680 if ( !plotter ) return ;
683 const std::string strAxisName ( axisName.
latin1() );
684 const std::string strLabel( label.
latin1() );
687 controller -> setAxisBinding ( plotter, strAxisName, strLabel );
689 bool valid = controller -> isDataValid ( plotter );
690 if ( valid ==
false ) {
699 const vector < string > & dataRepNames
701 if ( dataRepNames.empty () )
return;
704 if ( dataRepNames.size() !=
size ) {
707 vector < string > ::const_iterator first = dataRepNames.begin ();
708 while ( first != dataRepNames.end() ) {
709 const string & name = *first++;
710 if ( name.find (
"Static" ) != string::npos )
continue;
721 clear ( std::vector < QLabel * > & labels,
722 std::vector < QComboBox * > & combos )
724 unsigned int size = combos.size ();
725 for (
unsigned int i = 0; i <
size; i++ ) {
728 box -> setEnabled (
false );
730 label -> setEnabled (
false );
739 vector < DataSource * > nt_vector;
743 int size = static_cast <
int > ( nt_vector.size() );
750 if ( ! (index < size ) ) {
757 const vector < string > & bindingOptions
758 = controller -> bindingOptions ( plotTypeStr );
760 if ( bindingOptions.empty () )
return;
766 vector < int > indices;
768 for (
unsigned int i = 0; i < s; i++ ) {
769 indices.push_back (
m_new_combos[i] -> currentItem () );
776 const vector < string > & cols = nt->
getLabels();
778 for (
unsigned int i = 0; i <
m_new_combos.size (); i++ ) {
779 if ( i < bindingOptions.size () ) {
780 const string & axisName = bindingOptions[i];
782 qs1 = ( axisName.c_str() );
786 for (std::vector<string>::size_type j = 0; j < cols.size(); j++){
790 if ( axisName.find (
"optional" ) != string::npos ) {
800 for (
unsigned int i = 0; i <
m_new_combos.size(); i++ ) {
803 if ( indices[i] >= 0 &&
828 if ( plotter != 0 ) {
831 bool yes = plotter -> isTargetable ();
832 if ( yes ==
false )
return;
861 const vector < string > & nt_vector
864 unsigned int size = nt_vector.size ();
866 bool refresh = count !=
size;
869 for ( std::size_t i = 0; i <
size; i++ ) {
870 const string & ntname = nt_vector[i];
871 if ( ntname == name ) jndex = i;
894 bool yes = plotter != 0;
896 yes = plotter -> isTargetable ();
898 DataRep * datarep = plotter -> getTarget ();
901 int index = plotter -> indexOf ( datarep );
903 const string & dataRepName
904 = controller -> getType ( plotter, index );
905 QString qst2 ( dataRepName.c_str() );
925 while ( hit.current() != 0 )
930 if ( hwidget )
delete ( hwidget );
943 DataRep * datarep = plotter -> getTarget ();
944 int index = plotter -> indexOf ( datarep );
945 assert ( datarep != 0 );
947 bool ntuple_bindings = datarep -> hasNTupleBindings ( );
950 if ( ntuple_bindings ) {
951 name = controller -> getDataSourceName ( plotter, index );
963 const vector < string > & bindings
964 = controller -> axisBindings ( plotter, index );
965 const vector < string > & bindingOptions
966 = controller -> bindingOptions ( plotter, index );
967 unsigned int listSize;
969 if ( bindings.size() < bindingOptions.size() )
971 listSize = bindings.size();
975 listSize = bindingOptions.size();
978 bool yes = plotter -> isTargetable ();
979 if ( ntuple_bindings ==
false ||
980 yes ==
false )
return;
986 const vector < string > & cols
987 = controller -> getDataSourceLabels ( plotter, index );
989 if ( cols.empty () )
return;
993 for (
unsigned int i = 0; i <
m_sel_combos.size (); i++ )
995 if ( i == listSize )
break;
996 const string & axisLabel = bindings[i];
997 const string & axisName = bindingOptions[i];
999 qs1 = ( axisName.c_str() );
1003 qs2 = ( axisLabel.c_str() );
1009 for (std::vector<string>::size_type j = 0; j < cols.size(); j++ )
1013 if ( axisName.find (
"optional" ) != string::npos )
1026 "One or more columns of the bound data source\n"
1027 "contains invalid data.";
1041 "No n-tuple selected error\n"
1042 "Need to load n-tuple to create a plot";
1044 "No n-tuple selected error",
1055 QString message (
"Plot of type " );
1056 message += type.c_str();
1057 message +=
" can not be added\n"
1058 "to selected plot\n\n"
1059 "It might be incompatible. For example, \n"
1060 "requiring a Z axis display while selected\n"
1061 "does not have one.";
1063 "Add to plot error",
1073 QString message (
"Fitter of type " );
1074 message += type.c_str();
1075 message +=
" can not be used\n"
1076 "with selected plot\n\n"
1077 "It might be incompatible. For example, \n"
1078 "Maximum Likelihood fitting requires binned\n"
1079 "data representation.";
1092 QString message =
"Function`";
1093 message += name.c_str();
1094 message +=
"' could not be used because ...\n";
1096 message +=
"\nMaybe the copy constructor or clone function is bad.";
1110 QString message (
"Funtion of type " );
1111 message += type.c_str();
1112 message +=
" can not be used\n"
1113 "with selected fitter\n\n"
1114 "It might be incompatible. For example, \n"
1115 "the fitter requires derivatives\n"
1116 "that the function can not supply.";
1129 QString message (
"Attempt to apply invalid range:\n\n" );
1130 message += bad.c_str();
1131 message +=
"\n\n Low end of range must be less than high end.";
1145 QString message (
"Multiple data representations are active.\n"
1146 "Can not apply a " );
1147 message += type.c_str();
1150 "Use Command-click to select only one data representation.";
1153 "Use Control-click to select only one data representation.";
1156 "Multiple data representation error",
1168 QString message (
"Multiple data representations are active.\n"
1170 message += type.c_str();
1171 message +=
" to each?\n\n";
1174 message +=
"One can use Control-click to apply a ";
1176 message +=
"One can use Command-click to apply a ";
1178 message += type.c_str();
1179 message +=
" to a selected data representation.";
1183 "Multiple data representation error",
1187 QMessageBox::NoButton );
1189 ok = result == QMessageBox::Ok;
1198 const QString message (
"Attempt to add cut to itself\n"
1199 "The request was ignorned" );
1201 "Applying cut error",
1213 "Multiple plots are selected.\n"
1214 "Can not apply change until only one is selected\n\n"
1215 "Use shift-click to deselect a selected plot" );
1217 "Multiple plot error",
1227 "Functions are not supported on the selected data reaxisWitation.";
1243 QString message (
"New plot could not be created because:\n" );
1244 message += e.what ();
1259 vector < int > dimSize;
1260 controller -> fillDimSize ( dimSize, rtuple, column );
1263 QString caption(
"MultiDimensional data in rows of the column ");
1267 std::ostringstream ost;
1268 ost <<
" Rows of this column are of size ";
1271 for( i = 0; i < dimSize.size() - 1; i++ )
1272 ost << dimSize[i] <<
" x ";
1275 ost <<
"\n Enter C-style index of a single element of this";
1276 ost <<
"\n multidimentional data which you wish to analyse.";
1277 ost <<
"\n Index should be a comma separated list of ";
1278 ost << dimSize.size() <<
" integers.";
1280 ost <<
"\n For e.g. ";
1281 for( i = 0; i < dimSize.size() - 1; i++ )
1285 string label( ost.str() );
1290 QString::null, &ok,
this );
1293 std::ostringstream labelstream;
1298 vector< unsigned int > index;
1299 string s( text.
ascii() );
1303 boost::char_separator< char > sep(
"," );
1306 typedef boost::tokenizer< boost::char_separator< char > > tokenizer;
1307 tokenizer tok( s, sep );
1310 for( tokenizer::iterator tok_iter = tok.begin();
1311 tok_iter != tok.end();
1314 unsigned int idx = boost::lexical_cast<
unsigned int >( *tok_iter );
1315 index.push_back( idx );
1316 labelstream <<
"[" << idx <<
"]";
1320 return labelstream.str();
1330 vector < DataSource * > nt_vector;
1333 if ( nt_vector.empty() )
1347 vector < string > bindings;
1348 for (
unsigned int i = 0; i <
m_new_combos.size(); i++ )
1357 if(
column !=
"nil" && ds -> isMultiDimensional(
column ) ) {
1358 bool yes = ds -> isUseable (
column );
1359 if ( yes ==
false ) {
1361 message (
"This column is not useable because it contains\n"
1362 "a multidimension array that varies is size or is\n"
1363 "an unsupported data type." );
1368 QMessageBox::NoButton,
1369 QMessageBox::NoButton );
1375 rcontroller -> smartExpandRootNTuple ( ds,
column );
1378 bindings.push_back ( label );
1385 controller -> createDisplay ( plotTypeStr, * ds, bindings );
1389 bool valid = controller -> isDataValid ( newDisplay );
1390 if ( valid ==
false ) {
1395 catch (
const std::exception & e ) {
1408 if ( !plotter )
return;
1413 vector < DataSource * > nt_vector;
1421 vector < string > bindings;
1422 for (
unsigned int i = 0; i <
m_new_combos.size(); i++ )
1430 if (
column !=
"nil" && ds -> isMultiDimensional (
column ) ) {
1433 rcontroller -> smartExpandRootNTuple ( ds,
column );
1436 bindings.push_back ( label );
1442 DataRep * rep = controller -> addDataRep ( plotter, plotTypeStr, ds,
1454 plotter -> autoScale ();
1455 bool valid = controller -> isDataValid ( rep );
1456 if ( valid ==
false ) {
1468 if ( !plotter )
return;
1471 int num_rep = plotter -> getNumDataReps();
1475 if (( num_active < 0) || ( num_rep <= 1 ))
1478 "You must have more than one DataReps \n"
1479 "in this view AND only one DataRep \n"
1480 "selected to be removed.";
1483 "Unable to remove DataRep",
1491 DataRep * rep = plotter -> getDataRep( num_active );
1494 plotter -> removeDataRep ( rep );
1495 plotter -> autoScale ();
1507 if ( plotter == 0 )
return;
1509 NTuple * ntuple = fc -> createNTuple ( plotter, 0 );
1520 plotterlist.clear();
1523 if ( canvaz != 0 ) {
1538 if ( size == 0 )
return;
1541 vector < PlotterBase * > web;
1545 for (
unsigned int i = 0; i <
size; i++ ) {
1547 bool yes = plotter != 0;
1548 if ( yes ) yes = plotter -> isTargetable ();
1549 if ( yes ==
false )
continue;
1551 DataRep * rep = plotter -> getTarget ();
1552 yes = rep -> hasNTupleBindings ();
1553 if ( yes ==
false )
continue;
1556 const vector < string > & names = ds_controller -> getNTupleNames ();
1557 const string & ds_name = names [ index ];
1558 const DataSource * source = ds_controller -> getDataSource ( ds_name );
1562 dr_controller -> changeDataSource ( rep, source );
1564 catch (
const runtime_error & e ) {
1565 QString message (
"Could not change binding because\n" );
1566 message += e.what ();
1568 "Data source error",
1583 const vector < double > & sv =
1584 controller -> getValueCtrlPts ( plotter );
1585 unsigned int size = sv.size ();
1587 brk_pt -> setEnabled (
true );
1589 brk_pt -> setValue ( static_cast <int> ( sv[0] *
brk_pt -> maxValue() ));
1610 brk_pt -> setEnabled (
false );
1633 int number = plotter -> getNumDataReps ();
1634 int index = plotter -> activePlotIndex ();
1635 yes = ( number < 2 ) || index >= 0;
1644 m_grid -> setEnabled ( yes );
1647 if ( yes ==
false ) {
1659 DataRep * datarep = controller -> activeDataRep ( plotter );
1661 assert ( datarep != 0 );
1663 yes = datarep -> hasErrorDisplay ();
1669 const vector <string> & pointreps = proj -> getPointReps();
1672 if ( pointreps.empty () == false ) {
1673 for (std::vector<string>::size_type i = 0; i < pointreps.size(); i++ ) {
1681 const string & curRep = rep->
name();
1685 if ( plotter -> hasAxis (
Axes::Z ) == false ) {
1691 int jndex = controller -> getValueTransformIndex ( plotter );
1703 const BinToColor * repp=plotter -> getValueRep ();
1706 bool yess = repp -> acceptChangeColor ();
1712 bool yes = controller -> hasControlPoints ( plotter );
1714 yes = controller -> isUserDefinedValueTransform ( plotter );
1721 const DataSource * nt = controller -> getDataSource ( plotter, 0 );
1723 if ( nt && nt -> empty () ) {
1732 const std::string & st = plotter->
getTitle();
1742 yes = controller -> hasSymbolRep ( plotter );
1747 unsigned int index = controller ->
getRepStyle ( plotter );
1752 yes = controller -> hasLineRep ( plotter );
1756 unsigned int style = controller -> getRepStyle ( plotter );
1757 #if QT_VERSION < 0x040000
1760 QAbstractButton * button =
m_line_group -> find ( style );
1763 rb -> setChecked (
true );
1766 float ptsize = controller -> pointSize ( plotter );
1780 const NTuple * ntuple = dynamic_cast <
const NTuple * > ( nt );
1781 yes = ntuple != 0 && ntuple -> isIntervalEnabled ();
1796 if ( plotter != 0 ) {
1799 controller -> setValueTransform ( plotter, index );
1801 const BinToColor * rep = plotter -> getValueRep();
1804 yes = rep -> acceptChangeColor ();
1809 yes = controller -> hasControlPoints ( plotter );
1811 bool y = rep -> isUserDefined ();
1826 if ( canvas != 0 ) {
1847 = settings.
entryList ( model_name_key );
1849 QStringList::size_type
size = model_list.size ();
1850 for ( QStringList::size_type i = 0; i <
size ; i++ )
1852 QString number = model_list [ i ];
1854 = settings.
readEntry ( model_name_key + number );
1863 string mname ( name.
latin1() );
1864 vector < double > cpts;
1865 cpts.push_back ( brk_pt );
1866 cpts.push_back ( flat_width );
1867 cpts.push_back ( color_scale );
1870 controller -> addValueTransform ( mname, cpts );
1883 vector < double > sv;
1885 double m =
brk_pt -> maxValue ();
1887 sv.push_back ( (
brk_pt -> value()) / m + 0.001);
1891 sv.push_back ( (
flat_width -> value()) / w + 0.001);
1895 sv.push_back ( ( ( (
color_scale -> value()) / c ) ) * 1.5 );
1898 if ( plotter != 0 ) {
1900 controller -> setValueCtrlPts (plotter,sv );
1911 brk_pt -> setValue ( 50 );
1924 int ibp =
brk_pt -> value ();
1928 double bp = static_cast <
double > ( ibp) /
1929 static_cast <double>(
brk_pt -> maxValue () );
1931 double fw = static_cast <
double > ( ifw ) /
1932 static_cast <double>(
flat_width -> maxValue () );
1934 double cs = static_cast <
double > ( ics ) /
1935 static_cast <double>(
color_scale -> maxValue () );
1937 sv.push_back ( bp );
1938 sv.push_back ( fw );
1939 sv.push_back ( cs );
1957 const string name ( text.
latin1() );
1958 vector < double > sv;
1961 controller -> addValueTransform ( name, sv );
1966 controller -> setValueTransform ( plotter, name );
1967 int index = controller -> getValueTransformIndex ( plotter );
1975 = settings.
entryList ( model_name_key );
1980 if ( index == -1 )
break;
1998 bool isFirstVR =
true;
2001 vector < double > sv;
2008 controller -> saveValueCtrlPts ( plotter, sv );
2015 = settings.
entryList ( model_name_key );
2017 #if QT_VERSION < 0x040000
2018 for (
unsigned int i = 0; i < model_list.size(); i++ ) {
2020 for (
int i = 0; i < model_list.size(); i++ ) {
2023 QString name_key ( model_name_key + at );
2025 if ( name == item ) {
2040 if ( index == -1 )
break;
2057 const string name ( item.
latin1() );
2060 bool yes = controller -> removeValueTransform ( name );
2064 controller -> setValueTransform ( plotter,
"Rainbow" );
2070 = settings.
entryList ( model_name_key );
2071 QStringList::size_type
size = model_list.size ();
2073 for (QStringList::size_type i = 0; i <
size; i++ ) {
2074 QString at ( model_list [ i ] );
2075 QString name_key ( model_name_key + at );
2077 if ( name == item ) {
2094 if ( !plotter )
return;
2099 controller -> setErrorDisplayed ( plotter,
Axes::Y, checked );
2104 const QString message (
"HippoDraw was not built with TeX support on "
2121 for (
unsigned int i = 0; i <
size; i++ ) {
2130 #ifdef HAVE_TEX_UTILS
2131 plotter -> setTopMargin ( needMargin?10.0:0.0 );
2132 plotter -> setNeedUpdate(
true);
2133 plotter -> notifyObservers ();
2150 if ( !plotter ) return ;
2153 DataRep * rep = controller -> activeDataRep ( plotter );
2159 rep -> setRepStyle (
id );
2167 if ( !plotter ) return ;
2170 DataRep * rep = controller -> activeDataRep ( plotter );
2176 rep -> setRepStyle (
id );
2183 if ( !plotter )
return;
2186 DataRep * rep = controller -> activeDataRep ( plotter );
2202 if ( plotter == 0 )
return;
2214 if ( plotter == 0 )
return;
2218 unsigned int interval = text.
toUInt ();
2227 if ( !plotter )
return;
2241 if ( color.isValid() == false )
return;
2245 Color c ( color.red(), color.green(), color.blue() );
2255 if ( plotter != 0 ) {
2257 const string rep ( qstr.
latin1() );
2259 controller -> setPointRep ( plotter, rep );
2261 if ( plotter -> hasAxis (
Axes::Z ) ==
true ) {
2264 controller -> setValueTransform ( plotter, index );
2288 if ( !plotter )
return;
2301 std::map < const PlotterBase *, bool >::const_iterator it
2367 if ( !plotter )
return;
2370 int index = controller -> activeDataRepIndex ( plotter );
2371 bool yes = controller -> hasNTupleBindings ( plotter, index );
2377 if ( width == 0 )
return;
2403 if ( !plotter )
return;
2415 if ( !plotter )
return;
2418 int index = controller -> activeDataRepIndex ( plotter );
2419 bool yes = controller -> hasNTupleBindings ( plotter, index );
2425 int value = static_cast <
int > ( 50.0 * offset ) + 49;
2448 if ( !plotter )
return;
2460 if ( plotter != 0 ) {
2462 string ltext = text.
latin1();
2471 #ifdef HAVE_TEX_UTILS
2473 plotter -> setBottomMargin ( needMargin?8.0:0.0 );
2475 plotter -> setLeftMargin ( needMargin?0.0:0.0 );
2477 plotter -> setZMargin ( needMargin?7.0:0.0 );
2478 plotter -> setNeedUpdate(
true);
2479 plotter -> notifyObservers ();
2482 ltext.erase( 0, 4 );
2485 plotter -> setLabel (
m_axis, ltext );
2497 if ( !plotter )
return;
2526 if ( !plotter )
return;
2536 double low = r.
low();
2565 if ( !plotter )
return;
2575 double high = r.
high();
2592 double offset(0.0), incr(0.0);
2633 if ( !plotter )
return;
2657 if ( !plotter )
return;
2669 const std::vector < PlotterBase * > &
2673 vector < PlotterBase * > plotterlist;
2678 const DataSource * tuple = controller -> getDataSource ( plotter );
2680 return cutcontroller->
getCutList ( plotterlist, tuple );
2690 bool fit_cut =
id == 2;
2696 if ( fit_cut ==
false ) {
2698 const Range & fullRange = plotter -> getRange ( cut_axis,
false );
2703 const Range & fullRange = plotter -> getRange (
Axes::X,
false );
2721 while ( number-- > 0 ) {
2735 unsigned int size = cutlist.size ();
2737 for (
unsigned int i = 0; i <
size; i++ ) {
2740 plotter -> fillCutList ( cuts );
2742 for (
unsigned int j = 0; j < cuts.size (); j++ ) {
2756 while ( numberItems-- > 0 ) {
2772 for (
unsigned int i = 0; i <
size; i++ ) {
2774 const string &
label = cut -> getLabel ();
2775 QString item = label.c_str ();
2777 if ( item == old_current ) index = i;
2783 map < PlotterBase *, int > ::iterator first
2791 index = first -> second;
2794 if ( index >= count ) {
2814 assert ( cut != 0 );
2815 bool yes = cut -> isEnabled ();
2829 for (
unsigned int i = 0; i <
size; i++ ) {
2851 bool fit_cut =
id == 2;
2852 if ( fit_cut ==
false ) {
2855 const Range & fullRange = cplotter->
getRange ( cut_axis,
false );
2861 = controller -> isZoomPan ( cplotter, cut_axis );
2883 const std::vector < const TupleCut * > &
2888 int index = controller -> activeDataRepIndex ( plotter );
2890 string what (
"Inspector::getCutList: " );
2891 what +=
"no active DataRep in PlotterBase object.";
2892 throw std::logic_error ( what );
2894 const DataRep * datarep = plotter -> getDataRep ( index );
2897 return cut_controller ->
getCutList ( datarep );
2909 bool yes = plotter != 0;
2910 if ( yes ) yes = plotter -> isTargetable ();
2912 if ( yes ==
false )
return;
2914 vector < PlotterBase * > cutlist;
2918 controller -> fillCutList ( plotter, cutlist );
2922 if ( cutlist.empty () ) {
2929 cutlist.push_back ( plotter );
2967 if ( !plotter ) return ;
2971 controller -> addCut ( cp, plotter );
2980 if ( plotter == 0 )
return;
2983 const vector < PlotterBase * > & cut_list =
getDataCutList ( plotter );
2985 controller -> addCuts ( cut_list, plotter );
2987 unsigned int size = cut_list.size ();
2988 for (
unsigned int i = 0; i <
size; i++ ) {
2991 if ( cut_plotter == plotter ) {
3005 if ( !plotter ) return ;
3008 if ( is_fit_radio ) {
3011 DataRep * rep = plotter -> getDataRep ( index );
3035 bool yes = plotter != 0;
3036 if ( yes ) yes = plotter -> isTargetable ();
3039 if ( yes ==
false )
return;
3041 const vector < PlotterBase * > & cutlist =
getDataCutList ( plotter );
3047 if ( cutlist.empty () ) {
3061 const PlotterBase * cut_plotter = cutlist.back ();
3083 if ( plotter == 0 )
return 0;
3109 bool yes = plotter != 0;
3111 if ( yes ) yes = plotter -> isTargetable ();
3112 if ( yes ==
false ) {
3113 int index = plotter -> activePlotIndex ();
3118 const QString message (
"Can not apply cut to a function" );
3120 "Cut application error",
3131 assert ( index >= 0 );
3133 const DataRep * rep = plotter -> getDataRep ( index );
3134 if ( rep -> hasNTupleBindings () ==
false ) {
3135 const QString message (
"Can not apply cut to a static histogram" );
3137 "Cut application error",
3145 vector < string > bindings;
3148 #if QT_VERSION < 0x030100 // 3.1.0
3153 string label1 = text1.
latin1();
3155 string label2 = text2.
latin1();
3160 bindings.push_back( label1 );
3163 bindings.push_back( label1 );
3164 bindings.push_back( label2 );
3168 PlotterBase * cutplotter = cutcontroller -> addCut ( plotter, bindings );
3170 if ( canvas == 0 )
return;
3172 canvas -> addPlotDisplay ( cutplotter,
false );
3175 DataRep * datarep = plotter -> getDataRep ( index );
3177 controller -> setTupleCut ( plotter, datarep );
3192 for (
int i = 0; i <
size; i++ ) {
3194 if ( text == label ) {
3209 bool yes = plotter != 0;
3212 if ( yes ) yes = plotter -> isTargetable ();
3217 bool is_fit_radio =
id == 2;
3221 if ( is_fit_radio ==
false ) {
3263 const vector < PlotterBase * > & cuts =
getDataCutList ( plotter );
3264 if ( cuts.empty() ) {
3279 vector < PlotterBase * > plotters;
3282 if ( plotters.empty () == false ) {
3284 vector < CutPlotter * > cutters;
3285 controller -> fillCutList ( plotters, cutters );
3286 vector < CutPlotter * > ::iterator first = cutters.begin ();
3288 while ( first != cutters.end () ) {
3290 cutter -> setActive ( yes );
3314 const vector < string > & cols = tuple->
getLabels();
3315 #ifdef ITERATOR_MEMBER_DEFECT
3318 vector < string > ::const_iterator first = cols.begin ();
3319 while ( first != cols.end() ) {
3320 const string & str = *first++;
3331 if ( index1 >= 0 ) {
3334 if ( index2 >= 0 ) {
3385 const vector < string > & fitters = controller -> getFitterNames ();
3386 for (
unsigned int i = 0; i < fitters.size(); i++ ) {
3387 if ( name == fitters[i] )
3400 const vector < string > & names = controller -> getFunctionNames ();
3404 static_cast < int > ( names.size () ) ) {
3407 for (
unsigned int i = 0; i < names.size(); i++) {
3408 if ( names[i] !=
"Linear Sum" ) {
3415 bool yes = plotter != 0;
3418 if ( yes ) yes = plotter -> isTargetable ();
3424 if ( yes ==
false ) {
3431 if ( nt && nt -> empty () )
3446 if ( current >= 0 ) {
3453 bool to_enable =
false;
3455 int index = d_controller -> activeDataRepIndex ( plotter );
3461 if ( f_controller -> hasFunction ( plotter, datarep ) ) {
3463 const vector < string > & fnames
3464 = f_controller -> functionNames ( plotter, datarep );
3466 if ( fnames.size() != 0 )
3471 for (
unsigned i = 0; i < fnames.size(); i++)
3473 if ( fnames[i].find (
"Linear Sum" ) == string::npos )
3486 if ( to_enable ==
false ) {
3492 Fitter * fitter = f_controller -> getFitter ( plotter );
3493 string name =
"none";
3494 if ( fitter != 0 ) {
3495 name = f_controller -> getFitterName ( plotter );
3500 m_resid->setEnabled ( to_enable );
3520 if ( !plotter ) return ;
3524 controller -> removeFunction ( plotter, frep );
3539 if ( !plotter ) return ;
3542 int index = dcontroller -> activeDataRepIndex ( plotter );
3543 if ( index < 0 )
return;
3544 DataRep * datarep = plotter -> getDataRep ( index );
3547 if ( ! ( fcontroller -> hasFunction ( plotter, datarep ) ) ) {
3551 fcontroller -> restoreParameters ( plotter );
3565 DataRep * datarep = plotter -> getDataRep ( index );
3566 assert ( datarep != 0 );
3569 if ( ! ( controller -> hasFunction ( plotter, datarep ) ) )
3574 const vector < string > & fnames
3575 = controller -> functionNames ( plotter, datarep );
3577 if ( fnames.empty () ) {
3582 vector < FunctionRep * > freps;
3583 controller -> fillTopLevelFunctionReps ( freps, plotter, datarep );
3584 for (
unsigned int i = 0; i < freps.size (); i++ ) {
3586 const string & func_name = frep -> functionName ();
3588 #if QT_VERSION < 0x040000
3592 Q3ListViewItem * parent
3595 parent -> setOpen (
true );
3596 parent -> setText (
Index,
QString ( func_name.c_str() ) );
3600 bool ignoreFlag =
true;
3602 Fitter * fitter = frep -> getFitter ();
3603 if ( fitter != 0 ) {
3605 ignoreFlag = frep -> getIgnoreErrors ();
3607 const vector < double > & parms = frep -> parameters ();
3608 unsigned int start_index = parms.size();
3612 #if QT_VERSION < 0x040000
3615 Q3ListViewItem * firstItem = parent -> firstChild ();
3619 if ( firstItem != 0 ) {
3633 #if QT_VERSION < 0x040000
3636 unsigned int & index )
3640 unsigned int & index )
3646 if ( composite != 0 ) {
3647 const vector < FunctionRep * > & freps
3648 = composite -> getFunctionReps ();
3649 unsigned int size = freps.size();
3653 for (
int i = size -1; i >= 0; i-- ) {
3655 const string & func_name = rep -> functionName ();
3656 #if QT_VERSION < 0x040000
3660 Q3ListViewItem * child
3661 =
new Q3ListViewItem ( parent );
3663 child -> setOpen (
true );
3664 child -> setText (
Index,
QString ( func_name.c_str() ) );
3671 vector < FunctionParameter > function_parameters;
3679 unsigned int size = function_parameters.size ();
3681 for (
int pindex = size-1; pindex >= 0; pindex-- ) {
3684 #if QT_VERSION < 0x040000
3687 QCheckListItem::CheckBox );
3689 Q3CheckListItem * item
3690 =
new Q3CheckListItem ( parent, dummy,
3691 Q3CheckListItem::CheckBox );
3693 item -> setText(
Index,
QString(
"%1" ).arg( index-- ) );
3695 const string & name = fp.
name ();
3698 fixedFlag = fp.
isFixed () ? qyes : qno;
3700 item -> setText(
Name,
QString(
"%1" ).arg( pname ) );
3703 item -> setText(
Fixed,
QString(
"%1" ).arg( fixedFlag ) );
3704 item -> setText(
Dummy,
QString(
"%1" ).arg( pindex ) );
3717 if ( !plotter ) return ;
3719 bool yes = plotter -> isTargetable ();
3720 if ( yes ==
false ) {
3727 DataRep * datarep = dc -> activeDataRep ( plotter );
3728 assert ( datarep != 0 );
3738 std::string fun_name = qstr.
latin1();
3743 const string fit_name = s.
latin1();
3746 yes = fc -> isCompatible ( fun_name, fit_name );
3748 if ( yes ==
false ) {
3755 #if QT_VERSION < 0x040000
3762 if ( is_selected ) {
3766 new_rep = fc->
addFunction ( plotter, fun_name, frep, datarep );
3768 catch ( std::exception & e ) {
3782 if ( new_rep != 0 ) {
3783 ok = fc -> tryFitFunction ( plotter, new_rep );
3798 const vector < string > & names = controller -> getFitterNames ();
3799 const string & def_fitter = names [ index ];
3800 controller -> setDefaultFitter ( def_fitter );
3803 if ( plotter != 0 ) {
3804 const DataRep * datarep = plotter -> getTarget ();
3805 bool yes = controller -> hasFunction ( plotter, datarep );
3807 bool ok = controller -> changeFitter ( plotter, datarep,
3809 if ( ok ==
false ) {
3824 const QString message (
"The Fit failed to converge" );
3835 #if QT_VERSION < 0x040000
3851 #if QT_VERSION < 0x040000
3868 #if QT_VERSION < 0x040000
3881 #if QT_VERSION < 0x040000
3887 if ( item -> childCount() == 0 ) {
3888 item = item -> parent ();
3899 if ( !plotter ) return ;
3902 if ( ! ( fcnt -> hasFunction ( plotter, 0 ) ) ) {
3906 fcnt -> saveParameters ( plotter );
3910 bool ok = fcnt -> fitFunction ( plotter, fun_rep );
3917 int index = dcontroller -> activeDataRepIndex ( plotter );
3926 QString text_str = box -> text ();
3927 int i = text_str.
find (
"=" );
3928 text_str.
remove ( i + 1, 1024 );
3929 box -> setText ( text_str );
3937 bool yes = plotter == 0;
3938 if ( yes ==
false ) {
3942 bool enable = ! yes;
3945 if ( enable ==
false )
return;
3948 const DataSource * nt = dcontroller -> getDataSource ( plotter, 0 );
3950 if ( nt && nt -> empty () ) {
3956 int index = dcontroller -> activeDataRepIndex ( plotter );
3958 DataRep * datarep = plotter -> getDataRep ( index );
3961 enable = controller->
hasFunction ( plotter, datarep );
3963 if ( enable ==
false ) {
3991 int number = dcontroller -> getNumberOfEntries ( plotter, index );
3999 int underflow = dcontroller -> getUnderflow ( plotter, index );
4001 if ( underflow == -1 ) str =
"meaningless";
4002 else str.
setNum ( underflow );
4007 int overflow = dcontroller -> getOverflow ( plotter, index );
4009 if ( overflow == -1 ) str =
"meaningless";
4010 else str.
setNum ( overflow );
4015 double average = dcontroller -> getAverage ( plotter,
Axes::X, index );
4022 average = dcontroller -> getAverage ( plotter,
Axes::Y, index );
4045 if ( !plotter )
return;
4056 string nullstring (
"");
4060 const string s (
"Total Entries");
4066 const string s (
"Underflow");
4072 const string s (
"Overflow");
4078 const string s (
"averagex");
4084 const string s (
"averagey");
4090 const string s (
"Function Parameters");
4092 assert ( controller -> hasFunction ( plotter, 0 ) );
4099 const string s (
"Chi-squared");
4101 assert ( controller -> hasFunction ( plotter, 0 ) );
4110 const string t = qtext.
latin1();
4113 #ifdef HAVE_TEX_UTILS
4119 string text (qtext.
latin1());
4120 const string s (
"Text From Box");
4130 if ( plotter == 0 )
return;
4135 = controller -> createResidualsDisplay ( plotter, func_rep );
4136 const Range & range = plotter -> getRange (
Axes::X,
false );
4137 res_plotter -> setRange (
Axes::X, range,
false );
4141 canvas -> addPlotDisplay ( res_plotter,
true );
4149 #if QT_VERSION < 0x040000
4154 while ( it.current () ) {
4155 #if QT_VERSION < 0x040000
4159 Q3ListViewItem * item = it.current ();
4160 Q3CheckListItem * check_item = dynamic_cast < Q3CheckListItem * > ( item );
4162 if ( check_item != 0 ) {
4163 bool yes = check_item -> isOn ();
4181 if ( plotter == 0 )
return;
4188 message (
"Two and only two function parameters should be\n"
4189 "checked to create error contour display.\n" );
4191 "Invalid parameter pair selection",
4199 #if QT_VERSION < 0x040000
4208 "Both checked function parameters must\n"
4209 "have same parent function.";
4211 "Invalid parameter pair selection",
4220 int index = text.
toInt ( & ok ) - 1;
4221 fcontroller -> setEllpsoidParamIndex (
Axes::X , index );
4223 text = second -> text (
Index );
4225 index = text.
toInt ( & ok ) -1 ;
4226 fcontroller -> setEllpsoidParamIndex (
Axes::Y , index );
4232 #if QT_VERSION < 0x040000
4238 if( stat ==
QString(
"Change Error Plot" ) )
4240 fcontroller -> refreshEllipsoidDisplay ( plotter, frep );
4247 fcontroller -> createNewEllipsoidDisplay ( plotter, frep );
4248 assert( err_plotter != 0);
4255 assert( canvas != 0 );
4259 canvas -> addPlotDisplay ( err_plotter,
false );
4267 if ( axis ==
Axes::X )
return "X";
4268 else if ( axis ==
Axes::Y )
return "Y";
4269 else if ( axis ==
Axes::Z )
return "Z";
4296 bool scaled = plotter -> isAutoRanging (
m_axis );
4311 bool reversed = plotter -> isReverse ();
4331 bool yes = plotter == 0;
4332 if ( yes ==
false ) {
4342 if ( plotter -> isTargetable () ) {
4351 if ( nt && nt -> empty () )
return;
4356 const string &
label = plotter -> getLabel (
m_axis );
4357 const QString ltext = label.c_str();
4361 bool axis_bined = controller -> isAxisBinned ( plotter, s_axis );
4363 double low = r.
low();
4364 double high = r.
high();
4367 axis_bined ==
true &&
4368 has_ntuple ==
false );
4370 axis_bined ==
true &&
4371 has_ntuple ==
false );
4408 if ( axis_bined ==
false )
4440 bool disable_log = has_ntuple ==
false && axis_bined ==
true;
4441 logScale -> setDisabled ( disable_log );
4464 bool isZoomPan =
false;
4466 std::map < const PlotterBase *, bool >::const_iterator it
4469 isZoomPan = it->second;
4490 const DataRep * datarep = plotter -> getDataRep ( index );
4491 RepBase * rep = datarep -> getRepresentation ();
4493 yes = contourRep != 0;
4509 #if QT_VERSION < 0x040000
4515 #if QT_VERSION < 0x040000
4521 bool is_parm = item -> childCount () == 0;
4522 bool enable = is_selected && is_parm;
4532 setChecked(( fixedFlag == qyes ) ?
true :
false );
4536 enable = is_selected && (! is_parm);
4540 #if QT_VERSION < 0x040000
4548 if ( t == 0 )
break;
4556 Q3ListViewItem * parent = item;
4558 Q3ListViewItem * t = parent -> parent ();
4559 if ( t == 0 )
break;
4573 if ( !plotter )
return;
4576 if ( ! ( fcontroller -> hasFunction ( plotter, 0 ) ) ) {
4580 fcontroller -> saveParameters ( plotter );
4582 #if QT_VERSION < 0x040000
4591 vector < int > fixed = frep -> getFixedFlags ();
4594 int paramindex = pidx.
toUInt() - 1;
4599 fixed[ paramindex ] = flag ==
true ? 1 : 0;
4600 frep -> setFixedFlags( fixed );
4602 if ( item -> childCount () == 0 ) {
4605 QString fixedFlag = ( flag == true ) ? qyes : qno;
4606 item -> setText (
Fixed, fixedFlag );
4619 if ( !plotter )
return;
4623 if ( ! ( fcontroller -> hasFunction ( plotter, 0 ) ) )
4627 fcontroller -> saveParameters ( plotter );
4630 #if QT_VERSION < 0x040000
4638 int paramindex = pidx.
toUInt() -1;
4641 vector < double > parameters = frep-> parameters();
4645 parameters[ paramindex ] = text.
toDouble();
4650 item -> setText (
Value,
QString (
"%1" ).arg ( parameters[ paramindex ] ) );
4662 if ( !plotter )
return;
4665 if ( ! ( fcontroller -> hasFunction ( plotter, 0 ) ) )
4669 fcontroller -> saveParameters ( plotter );
4687 if ( !plotter )
return;
4690 if ( ! ( fcontroller -> hasFunction ( plotter, 0 ) ) )
4693 #if QT_VERSION < 0x040000
4702 int paramindex = pidx.
toUInt() - 1;
4709 newParameters[ paramindex ]
4711 pow ( 2.0, static_cast<double>( (sliderValue - 50) * sign) / 50.0 );
4716 item -> setText(
Value,
QString (
"%1" ).arg ( newParameters[ paramindex ]));
4718 setText (
QString (
"%1" ).arg ( newParameters[ paramindex ] ) );
4747 bool log =
logScale -> isChecked();
4750 vector < PlotterBase * > ::iterator first =
m_plotter_list.begin ();
4756 plotter -> setAutoRanging (
m_axis, auto_scale );
4758 catch (
const runtime_error & e ) {
4768 bool reverse =
m_reverse -> isChecked();
4770 vector < PlotterBase * > ::iterator first =
m_plotter_list.begin ();
4774 plotter -> setReverse ( reverse );
4783 vector < PlotterBase * > ::iterator first =
m_plotter_list.begin ();
4787 plotter -> setAutoRanging (
m_axis, scale );
4808 bool fit_cut =
id == 2;
4810 if ( fit_cut ==
false ) {
4813 const Range & fullRange = plotter -> getRange ( axis,
false );
4814 axisWidget2 -> processHighSliderMoved ( value, currentRange, fullRange );
4815 plotter -> setCutRangeAt ( currentRange, axis );
4819 const Range & fullRange = plotter -> getRange (
Axes::X,
false );
4820 axisWidget2 -> processHighSliderMoved ( value, currentRange, fullRange );
4821 plotter -> setCutRangeAt ( currentRange, index );
4834 if ( fit_cut ==
false ) {
4837 const Range & fullRange = plotter -> getRange ( axis,
false );
4838 axisWidget2 -> processLowSliderMoved ( value, currentRange, fullRange );
4839 plotter -> setCutRangeAt ( currentRange, axis );
4843 const Range & fullRange = plotter -> getRange (
Axes::X,
false );
4844 axisWidget2 -> processLowSliderMoved ( value, currentRange, fullRange );
4845 plotter -> setCutRangeAt ( currentRange, index );
4853 if ( cd == 0 )
return;
4863 if ( cd == 0 )
return;
4876 bool fit_cut =
id ==2;
4879 if ( fit_cut ==
false ) {
4884 controller -> setZoomPan ( plotter, axis, yes );
4887 const Range & fullRange = plotter -> getRange ( axis,
false );
4889 axisWidget2 -> processZoomPanCheckBoxClicked ( currentRange, fullRange ) ;
4896 bool fit_cut =
id == 2;
4898 if ( fit_cut ==
false ) {
4901 cp -> toggleInverted ();
4905 bool state = !
m_tuple_cuts [ index ] -> getInversion ();
4908 xyplotter -> setCutInverted ( index, state );
4920 if ( fit_cut ==
false ) {
4923 cut_plotter -> setEnabled ( ! on );
4929 xyplotter -> setCutEnabled ( index, ! on );
4938 bool fit_cut =
id == 2;
4945 const Color & rep_color = cp -> getCutColor ();
4946 QColor color ( rep_color.getRed(),
4947 rep_color.getGreen(),
4948 rep_color.getBlue () );
4952 if ( color.isValid() == true ) {
4953 Color c( color.red(), color.green(), color.blue() );
4954 cp -> setCutColor ( c );
4965 if ( !plotter )
return;
4973 if ( !contourRep )
return;
4989 if ( !plotter )
return;
4997 if ( !contourRep )
return;
5000 int val = text.
toInt();
5002 if ( val < 1 || val > 100 ) {
5022 if ( !plotter )
return;
5023 if ( plotter -> isTargetable () ==
false )
return;
5025 DataRep * datarep = plotter -> getTarget ( );
5030 if ( !contourRep )
return;
5069 "Invalid Input String.\n"
5070 "Please check that the string contains only numbers,\n"
5071 "separated by commas or white space.\n";
5073 "Invalid Input String",
5087 if ( !plotter )
return;
5095 if ( !contourRep )
return;
5098 if ( qstr1.
isEmpty () )
return;
5102 vector < double > values;
5105 #if QT_VERSION < 0x040000
5106 std::string contourLevels(qstr2.
ascii());
5108 std::string contourLevels(qstr2.toAscii());
5112 std::vector<std::string> tokens;
5114 for (
size_t i = 0; i < tokens.size(); i++) {
5115 QString strval(tokens.at(i).c_str() );
5117 double value(strval.toDouble(&ok));
5122 values.push_back(value);
5126 std::stable_sort(values.begin(), values.end());
5127 vector<double>::iterator leftover =
5128 std::unique(values.begin(), values.end());
5129 values.erase(leftover, values.end());
5138 if ( !plotter ) return ;
5144 assert ( xyplotter != 0 );
5151 const QtFont * qtfont = dynamic_cast <
const QtFont * > ( fb );
5152 const QFont & qfont = qtfont -> font ();
5159 font -> setFont( labelFont );
5160 xyplotter -> setLabelFont( font,
m_axis );
5165 xyplotter -> setNeedUpdate(
true);
5166 xyplotter -> notifyObservers ();
5173 if ( plotter == 0 ) return ;
5176 assert( xyplotter != 0 );
5181 const FontBase * fb = xyplotter -> titleFont ();
5188 const QtFont * qtfont = dynamic_cast <
const QtFont * > ( fb );
5189 const QFont & qfont = qtfont -> font ();
5196 font -> setFont( titleFont );
5197 xyplotter -> setTitleFont( font );
5202 xyplotter -> setNeedUpdate(
true);
5203 xyplotter -> notifyObservers ();
5212 if ( !plotter )
return;
5216 if ( ! ( fcontroller -> hasFunction ( plotter, 0 ) ) ) {
5221 Fitter * fitter = frep -> getFitter ();
5225 if ( fitter != 0 ) {
5226 frep -> setIgnoreError ( flag );
5237 bool yes = plotter == 0;
5238 if ( yes ==
false ) {
5251 bool hasZ = plotter -> hasAxis (
Axes::Z );
5254 m_Car -> setEnabled ( hasZ );
5255 m_Mer -> setEnabled ( hasZ );
5256 m_Gls -> setEnabled ( hasZ );
5257 m_Arc -> setEnabled ( hasZ );
5258 m_Tan -> setEnabled ( hasZ );
5259 m_Sin -> setEnabled ( hasZ );
5260 m_Stg -> setEnabled ( hasZ );
5261 m_Air -> setEnabled ( hasZ );
5266 bool xlog = d_controller -> getLog ( plotter,
Axes::X );
5267 bool ylog = d_controller -> getLog ( plotter,
Axes::Y );
5270 if ( ( !xlog ) && ( !ylog ) ){
5275 if (( t -> name () ==
"HammerAito" ) || ( t->
name() ==
"HammerAito2")){
5279 else if (( t -> name() ==
"Lambert" ) || ( t->
name() ==
"Lambert2")) {
5283 else if (( t -> name() ==
"Cartesian" ) || ( t->
name() ==
"Cartesian2")){
5284 m_Car -> setChecked (
true );
5287 else if (( t -> name() ==
"Mercator" ) || ( t->
name() ==
"Mecator2")){
5288 m_Mer -> setChecked (
true );
5291 else if (( t -> name() ==
"GlobalSinusoidal" ) || ( t->
name() ==
"GlobalSinusoidal2")) {
5292 m_Gls -> setChecked (
true );
5295 else if (( t -> name() ==
"ARC" ) || (t->
name()==
"ARC2")){
5296 m_Arc -> setChecked (
true );
5299 else if (( t -> name() ==
"TAN" ) || (t->
name()==
"TAN2")){
5300 m_Tan -> setChecked (
true );
5303 else if (( t -> name() ==
"SIN" ) || (t->
name()==
"SIN2")){
5304 m_Sin -> setChecked (
true );
5307 else if (( t -> name() ==
"STG" ) || (t->
name()==
"STG2")){
5308 m_Stg -> setChecked (
true );
5311 else if (( t -> name() ==
"AIR" ) || (t->
name()==
"AIR2")){
5312 m_Air -> setChecked (
true );
5326 int xoffset = (int) tp->
xOffset();
5327 int yoffset = (int) tp->
yOffset();
5337 else if ( ( !xlog ) && ( ylog ) ){
5338 m_logy -> setChecked (
true );
5341 else if ( ( xlog ) && ( !ylog ) ){
5342 m_logx -> setChecked (
true );
5345 else if ( ( xlog ) && ( ylog ) ){
5346 m_logxy -> setChecked (
true );
5356 "A transform of this type can not be used because\n"
5357 "this application was not compiled with WCSLIB support." );
5360 "Invalid transform",
5389 if ( !plotter )
return;
5403 bool valid2 =
false;
5407 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5408 d_controller -> setTransform ( plotter,
"Linear Linear" );
5413 d_controller -> setTransformAxis ( plotter,
"Linear",
"Log" );
5414 d_controller -> setTransform ( plotter,
"Linear Log");
5419 d_controller -> setTransformAxis ( plotter,
"Log",
"Linear" );
5420 d_controller -> setTransform ( plotter,
"Log Linear" );
5425 d_controller -> setTransformAxis ( plotter,
"Log",
"Log" );
5426 d_controller -> setTransform ( plotter,
"Log Log" );
5431 if ( max_x == 180 ) {
5432 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5433 d_controller -> setTransform ( plotter,
"HammerAito" );
5436 else if ( max_x == 360 ) {
5437 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5438 d_controller -> setTransform ( plotter,
"HammerAito2" );
5443 "The range of current plotter is not valid for.\n"
5444 "HammerAito transform.\n\n"
5445 "A valid range should be within: \n"
5446 "X axis [-180, 180] or [0, 360]\n"
5447 "Y axis [ -90, 90]\n" );
5458 if ( max_x == 180 ) {
5459 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5460 d_controller -> setTransform ( plotter,
"Lambert" );
5463 else if ( max_x == 360 ) {
5464 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5465 d_controller -> setTransform ( plotter,
"Lambert2" );
5470 "The range of current plotter is not valid for.\n"
5471 "Lambert transform.\n\n"
5472 "A valid range should be within: \n"
5473 "X axis [-180, 180] or [0, 360]\n"
5474 "Y axis [ -90, 90]\n" );
5486 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5487 d_controller -> setTransform ( plotter,
"Cartesian" );
5490 else if ( max_x==360 ) {
5491 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5492 d_controller -> setTransform ( plotter,
"Cartesian2" );
5497 "The range of current plotter is not valid for.\n"
5498 "Cartesian transform.\n\n"
5499 "A valid range should be within: \n"
5500 "X axis [-180, 180]\n"
5501 "Y axis [ -90, 90]\n" );
5512 if ( max_x == 180 ) {
5513 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5514 d_controller -> setTransform ( plotter,
"Mercator" );
5517 else if ( max_x == 360 ) {
5518 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5519 d_controller -> setTransform ( plotter,
"Mercator2" );
5524 "The range of current plotter is not valid for.\n"
5525 "Mercator transform.\n\n"
5526 "A valid range should be within: \n"
5527 "X axis [-180, 180] or [0, 360]\n"
5528 "Y axis [ -90, 90]\n" );
5539 if ( max_x == 180 ) {
5540 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5541 d_controller -> setTransform ( plotter,
"GlobalSinusoidal" );
5544 else if ( max_x == 360 ) {
5545 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5546 d_controller -> setTransform ( plotter,
"GlobalSinusoidal2" );
5551 "The range of current plotter is not valid for.\n"
5552 "GlobalSinusoidal transform.\n\n"
5553 "A valid range should be within: \n"
5554 "X axis [-180, 180] or [0, 360]\n"
5555 "Y axis [ -90, 90]\n" );
5566 if ( max_x == 180 ) {
5567 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5568 d_controller -> setTransform ( plotter,
"ARC" );
5571 else if ( max_x == 360 ) {
5572 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5573 d_controller -> setTransform ( plotter,
"ARC" );
5578 "The range of current plotter is not valid for.\n"
5579 "ARC transform.\n\n"
5580 "A valid range should be within: \n"
5581 "X axis [-180, 180] or [0, 360]\n"
5582 "Y axis [ -90, 90]\n" );
5594 if ( max_x == 180 && valid2 ) {
5595 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5596 d_controller -> setTransform ( plotter,
"TAN" );
5599 else if ( max_x == 360 && valid2 ) {
5600 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5601 d_controller -> setTransform ( plotter,
"TAN2" );
5606 "The range of current plotter is not valid for.\n"
5607 "TAN transform.\n\n"
5608 "A valid range should be within: \n"
5609 "X axis [-180, 180] or [0, 360]\n"
5610 "Y axis ( 0, 90]\n" );
5622 if ( max_x==180 && valid2 ) {
5623 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5624 d_controller -> setTransform ( plotter,
"SIN" );
5627 if ( max_x==360 && valid2 ) {
5628 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5629 d_controller -> setTransform ( plotter,
"SIN2" );
5634 "The range of current plotter is not valid for.\n"
5635 "SIN transform.\n\n"
5636 "A valid range should be within: \n"
5637 "X axis [-180, 180] or [0, 360]\n"
5638 "Y axis ( 0, 90]\n" );
5650 if ( max_x==180 && valid2 ) {
5651 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5652 d_controller -> setTransform ( plotter,
"STG" );
5655 if ( max_x==360 && valid2 ) {
5656 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5657 d_controller -> setTransform ( plotter,
"STG2" );
5662 "The range of current plotter is not valid for.\n"
5663 "STG transform.\n\n"
5664 "A valid range should be within: \n"
5665 "X axis [-180, 180] or [0, 360]\n"
5666 "Y axis ( -90, 90]\n" );
5678 if ( max_x==180 && valid2 ) {
5679 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5680 d_controller -> setTransform ( plotter,
"AIR" );
5683 if ( max_x==360 && valid2 ) {
5684 d_controller -> setTransformAxis ( plotter,
"Linear",
"Linear" );
5685 d_controller -> setTransform ( plotter,
"AIR2" );
5690 "The range of current plotter is not valid for.\n"
5691 "AIR transform.\n\n"
5692 "A valid range should be within: \n"
5693 "X axis [-180, 180] or [0, 360]\n"
5694 "Y axis ( -90, 90]\n" );
5706 catch (
const std::runtime_error & e ) {
5719 const Range & rx = plotter -> getDataRange (
Axes::X );
5720 const Range & ry = plotter -> getDataRange (
Axes::Y );
5722 if ( ( rx.
low() > -181 ) && ( rx.
high() < 181 ) &&
5723 ( ry.
low() > -91 ) && ( ry.
high() < 91 )) {
5727 if ( ( rx.
low() > -1 ) && ( rx.
high() < 361 ) &&
5728 ( ry.
low() > -91 ) && ( ry.
high() < 91 )) {
5742 const Range & rx = plotter -> getRange (
Axes::X,
false );
5743 const Range & ry = plotter -> getRange (
Axes::Y,
false );
5745 if ( ( rx.
low() < -180 ) || ( rx.
high() > 180 ) ||
5746 ( ry.
low() <= miny ) || ( ry.
high() > 90 ) ) {
5763 if (offset>180) offset = offset-360 ;
5764 if (offset< -180) offset = offset+360;
5767 if ( !plotter )
return;
5797 if (offset>180) offset = offset-360 ;
5798 if (offset< -180) offset = offset+360;
5801 if ( !plotter )
return;
5850 if ( !plotter )
return;
5860 if ( !plotter )
return;
5870 if ( !plotter )
return;
5885 if ( minEntries < 0 ) minEntries = 0;
5888 if ( !plotter )
return;
5906 if ( !plotter )
return -1;
5916 if ( !plotter )
return;
5929 if ( !plotter )
return;
5936 if (offset>180) offset = offset-360 ;
5937 if (offset< -180) offset = offset+360;
5966 if ( !plotter )
return;
5973 if (offset>180) offset = offset-360 ;
5974 if (offset< -180) offset = offset+360;
6006 if ( !plotter )
return;
6008 int num_rep = plotter -> getNumDataReps();
6015 "You must have two DataReps in this view.";
6018 "Unable to compare DataRep",
6031 = controller -> createDifferenceDisplay ( plotter );
6032 const Range & range = plotter -> getRange (
Axes::X,
false );
6033 res_plotter -> setRange (
Axes::X, range,
false );
6037 canvas -> addPlotDisplay ( res_plotter,
true );