20 #include "msdevstudio/MSconfig.h"
23 #endif // HAVE_CONFIG_H
87 using namespace hippodraw;
109 const vector < string > &
115 return factory -> names ();
123 BinToColor * model = factory -> create ( name );
125 plotter -> setValueRep ( model );
133 const vector < string > & names = factory -> names ();
134 BinToColor * rep = factory -> create ( names[index] );
136 plotter -> setValueRep ( rep );
142 const std::vector < double > & ctrl_points )
145 model -> setControlPoints ( ctrl_points );
148 factory -> add ( model );
156 BinToColor * prototype = factory -> prototype ( name );
157 bool yes = prototype -> isUserDefined ();
159 factory ->
remove ( name );
165 const vector <double > &
170 return r -> getControlPoints ();
176 const std::vector < double > & sv)
180 r -> setControlPoints ( sv );
181 DataRep * datarep = plotter -> selectedDataRep ();
182 datarep -> notifyObservers ();
189 const std::vector <double> & sv)
193 const std::string transformName = r->
name();
205 const BinToColor * rep = plotter -> getValueRep ();
207 const string & name = rep -> name ();
209 unsigned int size = names.size();
210 for (
unsigned int i = 0; i <
size; i++ ) {
211 if ( name == names[i] ) {
226 const BinToColor * rep = plotter -> getValueRep ();
239 const BinToColor * rep = plotter -> getValueRep ();
241 yes = rep -> isUserDefined ();
247 const vector < string > &
253 return factory -> names ();
261 DataRep * rep = controller -> createDataRep ( name );
272 string what (
"DisplayController: data rep of type " );
273 what += rep -> name();
274 what +=
"\nhas NTuple bindings.\n";
275 what +=
"Can not create without them";
281 plotter -> setAutoRanging (
true );
293 const std::vector< std::string > & bindings )
const
300 assert ( proto != 0 );
303 addDataRep ( plotter, name, &tuple, bindings );
305 if ( proto -> needsMatrixSet () ) {
307 controller -> checkForImage ( plotter, tuple );
311 plotter -> autoScale ();
322 unsigned int size = ntuple -> rows ();
324 vector < double > values ( size );
325 vector < double > residuals ( size );
326 DataRep * data1 = plotter -> getDataRep(0);
327 DataRep * data2 = plotter -> getDataRep(1);
331 vector < double > & x1 = ntuple1 -> getColumn ( 0 );
332 vector < double > & y1 = ntuple1 -> getColumn ( 1 );
333 vector < double > & deltaX1 = ntuple1 -> getColumn (2);
335 vector < double > & x2 = ntuple2 -> getColumn ( 0 );
336 vector < double > & y2 = ntuple2 -> getColumn ( 1 );
337 vector < double > & deltaX2 = ntuple2 -> getColumn (2);
339 vector <double> xDiff;
340 vector <double> yDiff;
341 vector <double> deltaXDiff;
342 vector <double> deltaYDiff;
346 while( i < x1.size() && j < x2.size() ) {
347 if (x1[i] + deltaX1[i] == x2[j] + deltaX2[j]) {
348 if ( xDiff.empty()) {
349 xDiff.push_back(x1[i]);
350 yDiff.push_back(y2[j] - y1[i]);
351 deltaXDiff.push_back(deltaX1[i]);
356 double tmpX = xDiff.back();
357 double tmpDeltaX = deltaXDiff.back();
358 double xLeft = tmpX + tmpDeltaX;
359 double xRight = x1[i] + deltaX1[i];
360 xDiff.push_back(xLeft+0.5*(xRight - xLeft));
361 yDiff.push_back(y2[j] - y1[i]);
362 deltaXDiff.push_back(0.5*(xRight - xLeft));
368 else if (x1[i] + deltaX1[i] < x2[j] + deltaX2[j]) {
369 if ( xDiff.empty()) {
370 xDiff.push_back(x1[i]);
371 yDiff.push_back(y2[j] - y1[i]);
372 deltaXDiff.push_back(deltaX1[i]);
376 double tmpX = xDiff.back();
377 double tmpDeltaX = deltaXDiff.back();
378 double xLeft = tmpX + tmpDeltaX;
379 double xRight = x1[i] + deltaX1[i];
380 xDiff.push_back(xLeft+0.5*(xRight - xLeft));
381 yDiff.push_back(y2[j] - y1[i]);
382 deltaXDiff.push_back(0.5*(xRight - xLeft));
387 if ( xDiff.empty() ) {
388 xDiff.push_back(x2[j]);
389 yDiff.push_back(y2[j] - y1[i]);
390 deltaXDiff.push_back(deltaX2[j]);
394 double tmpX = xDiff.back();
395 double tmpDeltaX = deltaXDiff.back();
396 double xLeft = tmpX + tmpDeltaX;
397 double xRight = x2[j] + deltaX2[j];
398 xDiff.push_back(xLeft+0.5*(xRight - xLeft));
399 yDiff.push_back(y2[j] - y1[i]);
400 deltaXDiff.push_back(0.5*(xRight - xLeft));
409 newNtuple->
addColumn (
"Residuals", yDiff );
410 newNtuple->
addColumn (
"DeltaX", deltaXDiff );
422 ntuple -> setTitle ( plotter -> getTitle () );
426 vector < string > bindings ( 3 );
428 bindings[0] = ntuple -> getLabelAt ( 0 );
429 bindings[1] = ntuple -> getLabelAt ( 1 );
430 bindings[2] = ntuple -> getLabelAt ( 2 );
438 controller->
setLog( new_plotter,
"x",
439 controller ->
getLog( plotter,
"x" ) );
450 plotter = factory -> create (
"XyPlotter" );
451 if ( rep -> hasAxis (
Axes::Z ) ) {
452 plotter -> setEnableZ (
true );
466 const std::string &
type,
468 const std::vector < std::string > & bindings )
const
471 if ( ! yes )
return 0;
491 const std::string &
type,
493 const std::vector < std::string > & bindings )
const
496 if ( ! yes )
return 0;
540 if ( plotter -> getNumDataReps () > 0 ) {
557 const std::string & datarep )
const
564 if ( proto -> hasAxis (
Axes::Z ) ) {
575 #ifdef ITERATOR_MEMBER_DEFECT
578 vector < const ViewBase * > ::const_iterator iter = views.begin();
580 while ( iter != views.end() ) {
585 const ViewBase * curview = ( * iter++ );
604 const std::vector < const ViewBase * > & src )
606 std::vector < const ViewBase * > ::const_iterator first = src.begin();
607 while ( first != src.end() ) {
610 vector < const ViewBase * > :: iterator i
611 = find ( dest.begin(), dest.end (), view );
612 if ( i != dest.end() )
continue;
616 if ( text_plotter == 0 )
continue;
619 bool add_to_list =
false;
620 for ( i = dest.begin (); i != dest.end(); ++i ) {
623 if ( plotter == 0 )
continue;
625 for (
int j = 0; j < num; j++ ) {
627 if ( rep == datarep ) {
632 if ( add_to_list )
break;
634 if ( add_to_list ) dest.push_back ( view );
641 const std::string & axis )
660 const std::string & name,
661 const std::string & text)
666 assert ( view != 0 );
674 const vector < string > &
680 return text_factory->
names ();
684 const std::string & text)
688 assert ( textrep != 0 );
698 const std::string & name,
699 const std::string & text)
711 const std::string & name,
712 const std::string & text)
737 rep = plotter -> getDataRep ( index );
747 plotter -> setActivePlot ( index,
true );
750 const vector < string > &
763 const vector < string > &
773 const vector < string > &
778 DataRep * rep = factory -> prototype ( type );
784 const vector < string > &
788 assert ( index < plotter->getNumDataReps () );
804 assert ( index < plotter->getNumDataReps () );
815 assert ( index < plotter->getNumDataReps () );
824 assert ( index < plotter->getNumDataReps () );
832 const std::string & axis,
int index )
const
845 assert ( index < plotter -> getNumDataReps () );
855 const std::string & axis,
int index )
const
859 return getRMS ( plotter, a, index );
868 assert ( index < plotter -> getNumDataReps () );
872 return projector ->
getRMS ( axis );
880 return datarep->
name ();
888 if ( datarep == 0 )
return 0;
900 if ( projbase != 0 ) {
910 for (
int i = 0; i < number; i++ ) {
913 if ( frep != 0 )
continue;
914 if ( projbase == 0 ) {
928 const NTuple * ntuple )
const
931 if ( projector == 0 )
return;
946 int numDataReps = plotter -> getNumDataReps ();
947 if ( index >= 0 || numDataReps < 2 ) {
952 for (
int i = 1; i< numDataReps; i++ ) {
954 if ( source != nt ) {
973 if ( projector != 0 ) {
974 source = projector -> getNTuple ();
1010 for (
int i = 0; i < number; i++ ) {
1025 for (
int i = 0; i < number; i++ ) {
1027 if ( source != 0 ) {
1028 yes = controller -> isFromFile ( source );
1030 if ( yes ==
false )
break;
1039 assert ( ! ( index < 0 ) );
1052 return source -> getName ();
1055 const vector < string > &
1074 int active = plotter -> activePlotIndex ();
1078 int number = plotter -> getNumDataReps ();
1079 for (
int i = 0; i < number; i++ ) {
1080 DataRep * trep = plotter -> getDataRep ( i );
1104 const std::string & axis,
1105 const std::string & label )
1107 DataRep * rep = plotter -> getTarget ();
1112 if ( axis[0] ==
'Y' ) a =
Axes::Y;
1113 plotter -> setAutoRanging ( a,
true );
1114 plotter -> autoScale ();
1120 const std::vector< std::string > & labels )
const
1123 if ( projector == 0 )
return;
1135 const DataRep * rep = plotter -> getTarget ();
1151 if ( projector != 0 ) {
1161 const std::string & axis)
const
1164 return getLog ( plotter, at );
1177 if ( xy_transform == 0 )
return false;
1191 assert ( transform );
1193 const string & name = transform->
name ();
1195 return name ==
"Log";
1207 if ( projector == 0 )
return;
1212 const Range & range = plotter -> getRange ( axis,
false );
1218 if ( model->
isLog() ) {
1219 binner = binner_factory -> create (
"BinnerLog" );
1221 binner = binner_factory -> create (
"BinnerLinear" );
1237 for (
int i = 0; i < number; i++ ) {
1248 const std::string &
type )
1255 if ( type ==
"Linear" ) {
1257 if ( !( model->
isLog() ) )
return;
1261 else if ( type ==
"Log" ) {
1263 if ( model->
isLog () )
return;
1264 const Range & range = plotter -> getRange ( axis,
false );
1265 if ( range.
high() < 0. ) {
1266 string what (
"Can not change axis to log scale since current "
1267 "range is negative" );
1268 throw std::runtime_error ( what );
1279 swap ( temp, model );
1293 const std::string & axis,
1297 setLog ( plotter, at, flag );
1313 if ( xy_transform != 0 ) {
1314 setLog ( plotter, axis, flag, xy_transform );
1321 if ( flag ) type =
"Log";
1322 else type =
"Linear";
1327 TransformBase * transform = factory -> createTransform ( type );
1329 b_transform -> setZTransform ( transform );
1342 string x_trans = transform->
name ();
1344 string y_trans = transform->
name ();
1346 string z_trans = transform->
name ();
1381 string t_name = x_trans;
1394 const std::string & name )
1409 const std::string & x,
1410 const std::string & y )
1413 const string name = x +
" " + y;
1430 return rep->
size ();
1437 RepBase * rep = plotter -> representation ();
1449 RepBase * rep = plotter -> representation ();
1452 if ( colrep != 0 ) {
1467 RepBase * rep = plotter -> representation ();
1469 return rep -> getStyle ();
1485 DataRep * datarep = plotter -> getDataRep ( index );
1488 RepBase * rep = factory -> create ( point_rep );
1497 const Range & range )
1507 const std::string & axis,
1521 const list < Observer * > & obs_list = datarep -> getObservers ();
1522 list < Observer * >::const_iterator first = obs_list.begin();
1523 while ( first != obs_list.end () ) {
1526 if ( plotter != 0 ) {
1527 plotter -> autoScale ();
1529 plotter -> setAutoRanging ( axis,
false );
1552 const std::string & axis,
1556 bool widths_are_same =
false;
1559 if ( axis ==
"Y" ) at =
Axes::Y;
1560 if ( axis ==
"Z" ) at =
Axes::Z;
1567 for (
int i = 0; i < number; i++ ) {
1569 projector->
setOffset ( axis, parm, dragging );
1572 widths_are_same =
true;
1576 projector->
setOffset ( axis, parm, dragging );
1587 bool widths_are_same =
false;
1593 for (
int i = 0; i < number; i++ ) {
1598 widths_are_same =
true;
1615 DataRep * rep = plotter -> getDataRep ( index );
1616 rep -> setErrorDisplay ( axis, state );
1624 int index = plotter -> activePlotIndex ();
1634 const std::string & x,
1635 const std::string & y)
1646 const std::string &
type )
1653 if ( type ==
"Linear" ) {
1655 if ( !( model->
isLog() ) )
return;
1659 else if ( type ==
"Log" ) {
1661 if ( model->
isLog () )
return;
1662 const Range & range = plotter -> getRange ( axis,
false );
1663 if ( range.
high () < 0. ) {
1664 string what (
"Can not change axis to Log scale since current "
1665 "range is negative." );
1666 throw std::runtime_error ( what );
1676 swap ( temp, model );