00001
00012 #ifdef HAVE_CONFIG_H
00013 #include "config.h"
00014 #endif
00015
00016
00017 #ifdef _MSC_VER
00018 #include "msdevstudio/MSconfig.h"
00019 #endif
00020
00021 #include "CutPlotter.h"
00022
00023 #include "CompositePlotter.h"
00024
00025 #include "datareps/DataRep.h"
00026
00027 #include "datasrcs/DataSource.h"
00028 #include "datasrcs/TupleCut.h"
00029
00030 #include "projectors/NTupleProjector.h"
00031
00032 #include "reps/CutRangeRep.h"
00033 #include "reps/ColorBoxPointRep.h"
00034
00035 #include <algorithm>
00036 #include <functional>
00037
00038 #include <cassert>
00039
00040 using namespace hippodraw;
00041
00042 using std::list;
00043 using std::mem_fun;
00044 using std::swap;
00045 using std::string;
00046 using std::vector;
00047
00048 CutPlotter::
00049 CutPlotter ( const std::string & name )
00050 : XyPlotter( name )
00051 {
00052 }
00053
00054 CutPlotter::CutPlotter ( const CutPlotter & plotter )
00055 : XyPlotter ( plotter )
00056 {
00057 }
00058
00059 CutPlotter::~CutPlotter ()
00060 {
00061 removeFromTargets ();
00062 }
00063
00067 void
00068 CutPlotter::
00069 setAxisBinding ( const std::string & axis,
00070 const std::string & label )
00071 {
00072 DataRep * datarep = selectedDataRep ();
00073 ProjectorBase * pbase = datarep->getProjector ();
00074 NTupleProjector * projector = dynamic_cast < NTupleProjector * > ( pbase );
00075
00076 projector->setAxisBinding ( axis, label );
00077
00078 autoScale ();
00079
00080 int index = projector -> indexOf( label );
00081 const vector < TupleCut > & cuts = m_datarep -> getCuts ();
00082 vector < TupleCut > & cut_list
00083 = const_cast < vector < TupleCut > & > ( cuts );
00084 unsigned int i = Axes::convert ( axis );
00085 TupleCut & cut = cut_list[i];
00086 cut.setColumn ( index );
00087 cut.setLabel ( label );
00088
00089 updateTargets();
00090 }
00091
00092 void
00093 CutPlotter::
00094 setCutRangeAt ( const Range & range, unsigned int index )
00095 {
00096 m_datarep -> setCutRangeAt ( range, index );
00097
00098 updateTargets ();
00099 }
00100
00101 void
00102 CutPlotter::
00103 setCutRange ( double low, double high )
00104 {
00105 const Range range ( low, high );
00106 setCutRangeAt ( range, 0 );
00107 }
00108
00109 void
00110 CutPlotter::
00111 removeFromTarget ( DataRep * rep )
00112 {
00113
00114
00115 ProjectorBase * proj = rep->getProjector ();
00116 NTupleProjector * projector =
00117 dynamic_cast < NTupleProjector * > ( proj );
00118 assert( projector );
00119
00120 const vector < TupleCut > & cuts = m_datarep -> getCuts ();
00121 for ( unsigned int i = 0; i < cuts.size(); i++ ) {
00122 projector -> removeCut( & cuts[i] );
00123 }
00124 rep -> removeObserver( this );
00125
00126 TargetList_t::iterator first
00127 = find ( m_targets.begin(), m_targets.end(), rep );
00128 assert ( first != m_targets.end() );
00129 m_targets.erase ( first );
00130
00131 rep -> setDirty();
00132 }
00133
00134 void
00135 CutPlotter::
00136 removeFromTargets()
00137 {
00138 TargetList_t::const_iterator first = m_targets.begin();
00139 while ( first != m_targets.end() ) {
00140 DataRep * rep = *first++;
00141 removeFromTarget ( rep );
00142 }
00143
00144 assert ( m_targets.empty () );
00145 }
00146
00147 void
00148 CutPlotter::
00149 willDelete ( const Observable * obs )
00150 {
00151 const DataRep * rep = dynamic_cast < const DataRep * > ( obs );
00152 assert ( rep );
00153
00154 TargetList_t::iterator first
00155 = find ( m_targets.begin(), m_targets.end(), rep );
00156
00157 if ( first == m_targets.end () ) return;
00158
00159 m_targets.erase ( first );
00160 }
00161
00162 void CutPlotter::updateTargets ()
00163 {
00164 #ifdef BIND2ND_DEFECT
00165 TargetList_t::iterator first = m_targets.begin();
00166 while ( first != m_targets.end() )
00167 {
00168 DataRep * rep = *first++;
00169 rep->setDirty ( true );
00170 }
00171 #else
00172 #ifdef MEMFUN1_DEFECT
00173 for_each ( m_targets.begin(), m_targets.end(),
00174 bind2nd ( mem_fun1 ( &DataRep::setDirty ), true ) );
00175 #else
00176 for_each ( m_targets.begin(), m_targets.end(),
00177 bind2nd ( mem_fun ( &DataRep::setDirty ), true ) );
00178 #endif
00179 #endif
00180 notifyObservers ();
00181 }
00182
00183 const vector < TupleCut > &
00184 CutPlotter::
00185 getCuts () const
00186 {
00187 return m_datarep -> getCuts ();
00188 }
00189
00190 void
00191 CutPlotter::setCuts ( const std::vector < const TupleCut * > & new_cuts )
00192 {
00193 unsigned int size = new_cuts.size ();
00194
00195 const vector < TupleCut > & cuts = m_datarep -> getCuts ();
00196 vector < TupleCut > & cut_list
00197 = const_cast < vector < TupleCut > & > ( cuts );
00198 cut_list.resize ( size, TupleCut () );
00199 for ( unsigned int i = 0; i < cut_list.size (); i++ ) {
00200 cut_list[i] = *new_cuts[i];
00201 }
00202 }
00203
00204
00205 bool CutPlotter::hasNTupleBindings () const
00206 {
00207 return true;
00208 }
00209
00210 void CutPlotter::clearCutTargets ()
00211 {
00212 m_targets.clear();
00213 }
00214
00215 void CutPlotter::addCutTarget ( DataRep * rep )
00216 {
00217 m_targets.push_back ( rep );
00218 rep->addObserver ( this );
00219 }
00220
00221 const list < DataRep * > & CutPlotter::getCutTargets () const
00222 {
00223 return m_targets;
00224 }
00225
00226 bool CutPlotter::
00227 isTarget ( DataRep * rep ) const
00228 {
00229 return find ( m_targets.begin(), m_targets.end(), rep ) != m_targets.end();
00230 }
00231
00232 void CutPlotter::setCutRepresentation ( RepBase * rep )
00233 {
00234 ColorBoxPointRep * old_rep = dynamic_cast < ColorBoxPointRep * > ( rep );
00235
00236 if ( old_rep != 0 ) {
00237 const Color & color = old_rep -> getColor ();
00238 CutRangeRep * new_rep = new CutRangeRep ();
00239 new_rep -> setColor ( color );
00240 delete rep;
00241 rep = new_rep;
00242 }
00243
00244 m_datarep -> setCutRep ( rep );
00245 }
00246
00247 void CutPlotter::setCutColor ( const Color & color )
00248 {
00249 RepBase * rep = m_datarep -> getCutRep ();
00250 rep -> setColor ( color );
00251
00252 XyPlotter::update ();
00253
00254 notifyObservers ();
00255 }
00256
00257 const Color & CutPlotter::getCutColor () const
00258 {
00259 RepBase * rep = m_datarep -> getCutRep ();
00260
00261 return rep -> getColor ();
00262 }
00263
00264 void CutPlotter::setNTuple ( const DataSource * ntuple )
00265 {
00266 DataRep * datarep = selectedDataRep ();
00267 ProjectorBase * pbase = datarep->getProjector ();
00268 NTupleProjector * projector = dynamic_cast < NTupleProjector * > ( pbase );
00269
00270 projector->setNTuple ( ntuple );
00271 DataSource * nt = const_cast < DataSource * > ( ntuple );
00272 nt->addObserver ( projector );
00273 }
00274
00275 void
00276 CutPlotter::
00277 setEnabled ( bool yes )
00278 {
00279 bool no = false;
00280
00281 const vector < TupleCut > & cuts = m_datarep -> getCuts ();
00282 for ( unsigned int i = 0; i < cuts.size(); i++ ) {
00283 no |= cuts[i].isEnabled ();
00284 m_datarep -> setEnabled ( i, yes );
00285 }
00286
00287 if ( yes != no ) {
00288 updateTargets ();
00289 }
00290 }
00291
00292 void
00293 CutPlotter::
00294 update ( const Observable * object )
00295 {
00296 TargetList_t::const_iterator first
00297 = find ( m_targets.begin(), m_targets.end(), object );
00298
00299 if ( first == m_targets.end () ) {
00300 notifyObservers ();
00301 }
00302 }
00303
00304 void
00305 CutPlotter::
00306 setActive ( bool yes )
00307 {
00308 RepBase * rep = m_datarep -> getCutRep ();
00309 rep -> setSelected ( yes );
00310
00311 notifyObservers ();
00312 }