Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

CutPlotter.cxx

Go to the documentation of this file.
00001 
00012 #ifdef HAVE_CONFIG_H
00013 #include "config.h"
00014 #endif
00015 
00016 // for truncation warning
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]; // so Doxygen can find it.
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   // Does not remove rep from m_targets because that would invalidate
00114   // iterators in the function removeFromTargets().
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 ); // only observes DataRep objects
00153 
00154   TargetList_t::iterator first
00155     = find ( m_targets.begin(), m_targets.end(),  rep );
00156   
00157   if ( first == m_targets.end () ) return; // not a target
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 /* virtual */
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 ) { // have old version
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 }

Generated for HippoDraw-1.14.8.5 by doxygen 1.4.3