RE: [ROOT] graphing huge datasets -- possible fix

From: Colley, Tony (Tony.Colley@itt.com)
Date: Tue Mar 19 2002 - 14:44:43 MET


Has anyone had time to examine this issue lately...

-----Original Message-----
From: Colley, Tony 
Sent: Monday, March 04, 2002 17:01
To: Colley, Tony; 'Faine, Valeri'; 'Eddy Offermann '
Cc: 'roottalk@pcroot.cern.ch '
Subject: RE: [ROOT] graphing huge datasets -- possible fix



I modified the DrawPolyLine function in TGX11.cxx to split polylines with
too many points into drawable chunks. This would not handle the case where
someone wanted to draw a filled curve with too many points; but I don't need
really big filled curves anyway. This change enabled ROOT to successfully
handle a TGraph of 10^7 points (not quickly, by any means, but at least it
draws the graph and doesn't crash).

Here is a cvs diff output of my changes:

===================================================================
654a655,657
> #define MAX_DRAW_PTS 1000001
> #define MDP_MINUS_1  1000000
> 
661d663
< 
664c666,678
<    if (n > 1) {
---
>    if (n > MAX_DRAW_PTS) {
>       int ibeg = 0;
>       int iend = MDP_MINUS_1;
>       while (iend < n) {
>          DrawPolyLine( MAX_DRAW_PTS, &xyt[ibeg] );
>          ibeg = iend;
>          iend += MDP_MINUS_1;
>       }
>       if (ibeg < n) {
>          int npt = n - ibeg;
>          DrawPolyLine( npt, &xyt[ibeg] );
>       }
>    } else if (n > 1) {

=====================================================================

Here's an extract from TGX11.cxx showing the modifications:

=====================================================================
#define MAX_DRAW_PTS 1000001                               // NEW
#define MDP_MINUS_1  1000000                               // NEW

void TGX11::DrawPolyLine(int n, TPoint *xyt)
{
   // Draw a line through all points.
   // n         : number of points
   // xy        : list of points
   XPoint *xy = (XPoint*)xyt;

   if (n > MAX_DRAW_PTS) {                                 // NEW
      int ibeg = 0;                                        // NEW
      int iend = MDP_MINUS_1;                              // NEW
      while (iend < n) {                                   // NEW
         DrawPolyLine( MAX_DRAW_PTS, &xyt[ibeg] );         // NEW
         ibeg = iend;                                      // NEW
         iend += MDP_MINUS_1;                              // NEW
      }                                                    // NEW
      if (ibeg < n) {                                      // NEW
         int npt = n - ibeg;                               // NEW
         DrawPolyLine( npt, &xyt[ibeg] );                  // NEW
      }                                                    // NEW
   } else if (n > 1) {                                     // CHANGED
      if (gLineStyle == LineSolid)
         XDrawLines(fDisplay, gCws->drawing, *gGCline, xy, n,
CoordModeOrigin);
      else {
         int i;
         XSetDashes(fDisplay, *gGCdash,
                    gDashOffset, gDashList, sizeof(gDashList));
         XDrawLines(fDisplay, gCws->drawing, *gGCdash, xy, n,
CoordModeOrigin);

         // calculate length of line to update dash offset
         for (i = 1; i < n; i++) {
            int dx = xy[i].x - xy[i-1].x;
            int dy = xy[i].y - xy[i-1].y;
            if (dx < 0) dx = - dx;
            if (dy < 0) dy = - dy;
            gDashOffset += dx > dy ? dx : dy;
         }
         gDashOffset %= gDashLength;
      }
   } else {
      int px,py;
      px=xy[0].x;
      py=xy[0].y;
      XDrawPoint(fDisplay, gCws->drawing,
                 gLineStyle == LineSolid ? *gGCline : *gGCdash, px, py);
   }
}

=====================================================================

If this doesn't break something I didn't try, then I think it is a
reasonable way to fix the 2^20 data point limit.

+------------------------------------------------+
| Tony Colley                ITT Industries A/CD |
| Modeling/Simulation Group  Fort Wayne, IN  USA |
+------------------------------------------------+
| Using ROOT 3.03/02 on RedHat Linux 7.2         |
| Last CVS update: 26 Feb 2002 at 2218 GMT       |
+------------------------------------------------+
\I'm not responsible for anything below this line/

************************************ 
If this email is not intended for you, or you are not responsible for the
delivery of this message to the addressee, please note that this message may
contain ITT Privileged/Proprietary Information.  In such a case, you may not
copy or deliver this message to anyone.  You should destroy this message and
kindly notify the sender by reply email.  Information contained in this
message that does not relate to the business of ITT is neither endorsed by
nor attributable to ITT. 
************************************ 



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:46 MET