ROOT logo
// @(#)root/graf:$Id: TCurlyLine.cxx 20882 2007-11-19 11:31:26Z rdm $
// Author: Otto Schaile   20/11/99

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//______________________________________________________________________________
//
// This class implements curly or wavy polylines typically used to draw Feynman diagrams.
// Amplitudes and wavelengths may be specified in the constructors,
// via commands or interactively from popup menus.
// The class make use of TPolyLine by inheritance, ExecuteEvent methods
// are highly inspired from the methods used in TPolyLine and TArc.
// The picture below has been generated by the tutorial feynman.
//Begin_Html
/*
<img src="gif/feynman.gif">
*/
//End_Html
//______________________________________________________________________________

#include "Riostream.h"
#include "TCurlyLine.h"
#include "TROOT.h"
#include "TVirtualPad.h"
#include "TVirtualX.h"
#include "TMath.h"

Double_t TCurlyLine::fgDefaultWaveLength = 0.02;
Double_t TCurlyLine::fgDefaultAmplitude  = 0.01; 
Bool_t   TCurlyLine::fgDefaultIsCurly    = kTRUE;   

ClassImp(TCurlyLine)


//______________________________________________________________________________
TCurlyLine::TCurlyLine(Double_t x1, Double_t y1, Double_t x2, Double_t y2, Double_t wl, Double_t amp)
{
   // Create a new TCurlyLine with starting point (x1, y1), end point (x2,y2).
   // The wavelength and amplitude are given in percent of the pad height.

   fX1         = x1;
   fY1         = y1;
   fX2         = x2;
   fY2         = y2;
   fWaveLength = wl;
   fAmplitude  = amp;
   fIsCurly    = fgDefaultIsCurly;
   Build();
}


//______________________________________________________________________________
void TCurlyLine::Build()
{
   // Create a curly (Gluon) or wavy (Gamma) line.

   Double_t pixeltoX = 1;
   Double_t pixeltoY = 1;

   Double_t wavelengthPix,amplitudePix, lengthPix, hPix;
   Double_t px1, py1, px2, py2;
   if (gPad) {
      Double_t ww = (Double_t)gPad->GetWw();
      Double_t wh = (Double_t)gPad->GetWh();
      Double_t pxrange = gPad->GetAbsWNDC()*ww;
      Double_t pyrange = - gPad->GetAbsHNDC()*wh;
      Double_t xrange  = gPad->GetX2() - gPad->GetX1();
      Double_t yrange  = gPad->GetY2() - gPad->GetY1();
      pixeltoX  = xrange / pxrange;
      pixeltoY  = yrange/pyrange;
      hPix  = TMath::Max(gPad->GetAbsHNDC() * gPad->GetWh(), gPad->GetAbsWNDC() * gPad->GetWw());
      px1      = gPad->XtoAbsPixel(fX1);
      py1      = gPad->YtoAbsPixel(fY1);
      px2      = gPad->XtoAbsPixel(fX2);
      py2      = gPad->YtoAbsPixel(fY2);

      lengthPix = TMath::Sqrt((px2-px1)*(px2-px1) + (py1-py2)*(py1-py2));
      wavelengthPix = hPix*fWaveLength;
      amplitudePix  = hPix*fAmplitude;
   } else {
      wavelengthPix = fWaveLength;
      amplitudePix  = fAmplitude;
      px1           = fX1;
      py1           = fY1;
      px2           = fX2;
      py2           = fY2;
      lengthPix = TMath::Sqrt((px2-px1)*(px2-px1) + (py1-py2)*(py1-py2));
   }
   if(lengthPix <= wavelengthPix){
      Warning("Build","CurlyLine is too short, length %g is < wavelength: %g ",lengthPix,wavelengthPix);
      SetBit(kTooShort);
      return;
   }
   // construct the curly / wavy line in pixel coordinates at angle 0
   Double_t anglestep = 40;
   Double_t phimaxle  = TMath::Pi() * 2. / anglestep ;
   Double_t dx        = wavelengthPix / 40;
   Double_t len2pi    = dx * anglestep;

   // make sure there is a piece of straight line a both ends

   Double_t  lengthcycle = 0.5 * len2pi + 2 * amplitudePix;
   // if (fIsCurly) lengthcycle +=  amplitudePix;
   Int_t nperiods = (Int_t)((lengthPix - lengthcycle) / len2pi);
   Double_t restlength = 0.5 * (lengthPix - nperiods * len2pi - lengthcycle);
   fNsteps = (Int_t)(anglestep * nperiods + anglestep / 2 + 4);
   SetPolyLine(fNsteps);
   Double_t *xv = GetX();
   Double_t *yv = GetY();
   xv[0] = 0;          yv[0] = 0;
   xv[1] = restlength; yv[1] = 0;
   Double_t phase =  1.5 * TMath::Pi();
   Double_t x0 = amplitudePix + restlength;
   Int_t i;
   for(i = 2; i < fNsteps-1; i++){
   // distinguish between curly and wavy
      if(fIsCurly) xv[i] = x0 + amplitudePix * TMath::Sin(phase);
      else         xv[i] = x0;
      yv[i]  = amplitudePix*TMath::Cos(phase);
      phase += phimaxle;
      x0    += dx;
   }
   xv[fNsteps-1] = lengthPix; yv[fNsteps-1] = 0;
   
   if (InheritsFrom("TCurlyArc")) return;  // called by TCurlyArc

   // rotate object and transform back to user coordinates 
   Double_t angle = TMath::ATan2(py2-py1, px2-px1);
   if(angle < 0) angle += 2*TMath::Pi();

   Double_t cosang = TMath::Cos(angle);
   Double_t sinang = TMath::Sin(angle);
   Double_t xx, yy;

   for(i = 0; i < fNsteps; i++){
      xx = xv[i] * cosang - yv[i] * sinang;
      yy = xv[i] * sinang + yv[i] * cosang;
      if (gPad) {
         xx *= pixeltoX;
         yy *= pixeltoY;
      }
      xv[i] = xx + fX1;
      yv[i] = yy + fY1;
   }
   if (gPad) gPad->Modified();
}


//______________________________________________________________________________
Int_t TCurlyLine::DistancetoPrimitive(Int_t px, Int_t py)
{
   // Compute distance from point px,py to a line.

   return DistancetoLine(px,py,fX1,fY1,fX2,fY2);
}


//______________________________________________________________________________
void TCurlyLine::ExecuteEvent(Int_t event, Int_t px, Int_t py)
{
   // Execute action corresponding to one event.
   //
   //  This member function is called when a  TCurlyLine is clicked with the locator
   //
   //  If Left button clicked on one of the line end points, this point
   //     follows the cursor until button is released.
   //
   //  if Middle button clicked, the line is moved parallel to itself
   //     until the button is released.
   //

   Int_t kMaxDiff = 20;
   static Int_t d1,d2,px1,px2,py1,py2;
   static Int_t pxold, pyold, px1old, py1old, px2old, py2old;
   static Bool_t p1, p2, pL;
   Int_t dx, dy;


   switch (event) {

   case kButton1Down:
      gVirtualX->SetLineColor(-1);
      TAttLine::Modify();  //Change line attributes only if necessary

      // No break !!!

   case kMouseMotion:

      px1 = gPad->XtoAbsPixel(fX1);
      py1 = gPad->YtoAbsPixel(fY1);
      px2 = gPad->XtoAbsPixel(fX2);
      py2 = gPad->YtoAbsPixel(fY2);

      p1 = p2 = pL = kFALSE;

      d1  = TMath::Abs(px1 - px) + TMath::Abs(py1-py); //simply take sum of pixels differences
      if (d1 < kMaxDiff) { //*-*================>OK take point number 1
         px1old = px1; py1old = py1;
         p1 = kTRUE;
         gPad->SetCursor(kPointer);
         return;
      }
      d2  = TMath::Abs(px2 - px) + TMath::Abs(py2-py); //simply take sum of pixels differences
      if (d2 < kMaxDiff) { //*-*================>OK take point number 2
         px2old = px2; py2old = py2;
         p2 = kTRUE;
         gPad->SetCursor(kPointer);
         return;
      }

      pL = kTRUE;
      pxold = px; pyold = py;
      gPad->SetCursor(kMove);

      break;

   case kButton1Motion:

      if (p1) {
         gVirtualX->DrawLine(px1old, py1old, px2, py2);
         gVirtualX->DrawLine(px, py, px2, py2);
         px1old = px;
         py1old = py;
      }
      if (p2) {
         gVirtualX->DrawLine(px1, py1, px2old, py2old);
         gVirtualX->DrawLine(px1, py1, px, py);
         px2old = px;
         py2old = py;
      }
      if (pL) {
         gVirtualX->DrawLine(px1, py1, px2, py2);
         dx = px-pxold;  dy = py-pyold;
         px1 += dx; py1 += dy; px2 += dx; py2 += dy;
         gVirtualX->DrawLine(px1, py1, px2, py2);
         pxold = px;
         pyold = py;
      }
      break;

   case kButton1Up:

      if (p1) {
         fX1 = gPad->AbsPixeltoX(px);
         fY1 = gPad->AbsPixeltoY(py);
      }
      if (p2) {
         fX2 = gPad->AbsPixeltoX(px);
         fY2 = gPad->AbsPixeltoY(py);
      }
      if (pL) {
         fX1 = gPad->AbsPixeltoX(px1);
         fY1 = gPad->AbsPixeltoY(py1);
         fX2 = gPad->AbsPixeltoX(px2);
         fY2 = gPad->AbsPixeltoY(py2);
      }
      Build();
      gPad->Modified();
      gVirtualX->SetLineColor(-1);
   }
}


//______________________________________________________________________________
void TCurlyLine::SavePrimitive(ostream &out, Option_t * /*= ""*/)
{
   // Save primitive as a C++ statement(s) on output stream out

   if (gROOT->ClassSaved(TCurlyLine::Class())) {
      out<<"   ";
   } else {
      out<<"   TCurlyLine *";
   }
   out<<"curlyline = new TCurlyLine("
     <<fX1<<","<<fY1<<","<<fX2<<","<<fY2<<","
     <<fWaveLength<<","<<fAmplitude<<");"<<endl;
   if (!fIsCurly) {
      out<<"   curlyline->SetWavy();"<<endl;
   }
   SaveLineAttributes(out,"curlyline",1,1,1);
   out<<"   curlyline->Draw();"<<endl;
}


//______________________________________________________________________________
void TCurlyLine::SetCurly()
{
   // Set curly.

   fIsCurly = kTRUE;
   Build();
}


//______________________________________________________________________________
void TCurlyLine::SetWavy()
{
   // Set wavy.

   fIsCurly = kFALSE;
   Build();
}


//______________________________________________________________________________
void TCurlyLine::SetWaveLength(Double_t x)
{
   // Set wave length.

   fWaveLength = x;
   Build();
}


//______________________________________________________________________________
void TCurlyLine::SetAmplitude(Double_t x)
{
   // Set amplitude.

   fAmplitude = x;
   Build();
}


//______________________________________________________________________________
void TCurlyLine::SetStartPoint(Double_t x, Double_t y)
{
   // Set start point.

   fX1 = x;
   fY1 = y;
   Build();
}


//______________________________________________________________________________
void TCurlyLine::SetEndPoint(Double_t x, Double_t y)
{
   // Set edn point.

   fX2 = x;
   fY2 = y;
   Build();
}


//______________________________________________________________________________
void TCurlyLine::SetDefaultWaveLength(Double_t WaveLength)
{
   // Set default wave length.

   fgDefaultWaveLength = WaveLength;
}


//______________________________________________________________________________
void TCurlyLine::SetDefaultAmplitude(Double_t Amplitude)
{
   // Set default amplitude.

   fgDefaultAmplitude  = Amplitude;
}


//______________________________________________________________________________
void TCurlyLine::SetDefaultIsCurly(Bool_t IsCurly)
{
   // Set defaul "IsCurly".

   fgDefaultIsCurly    = IsCurly;
}


//______________________________________________________________________________
Double_t TCurlyLine::GetDefaultWaveLength()
{
   // Get default wave length.

   return fgDefaultWaveLength;
}


//______________________________________________________________________________
Double_t TCurlyLine::GetDefaultAmplitude()
{
   // Get default amplitude.

   return fgDefaultAmplitude;
}


//______________________________________________________________________________
Bool_t TCurlyLine::GetDefaultIsCurly()
{
   // Get default "IsCurly".
   
   return fgDefaultIsCurly;
}
 TCurlyLine.cxx:1
 TCurlyLine.cxx:2
 TCurlyLine.cxx:3
 TCurlyLine.cxx:4
 TCurlyLine.cxx:5
 TCurlyLine.cxx:6
 TCurlyLine.cxx:7
 TCurlyLine.cxx:8
 TCurlyLine.cxx:9
 TCurlyLine.cxx:10
 TCurlyLine.cxx:11
 TCurlyLine.cxx:12
 TCurlyLine.cxx:13
 TCurlyLine.cxx:14
 TCurlyLine.cxx:15
 TCurlyLine.cxx:16
 TCurlyLine.cxx:17
 TCurlyLine.cxx:18
 TCurlyLine.cxx:19
 TCurlyLine.cxx:20
 TCurlyLine.cxx:21
 TCurlyLine.cxx:22
 TCurlyLine.cxx:23
 TCurlyLine.cxx:24
 TCurlyLine.cxx:25
 TCurlyLine.cxx:26
 TCurlyLine.cxx:27
 TCurlyLine.cxx:28
 TCurlyLine.cxx:29
 TCurlyLine.cxx:30
 TCurlyLine.cxx:31
 TCurlyLine.cxx:32
 TCurlyLine.cxx:33
 TCurlyLine.cxx:34
 TCurlyLine.cxx:35
 TCurlyLine.cxx:36
 TCurlyLine.cxx:37
 TCurlyLine.cxx:38
 TCurlyLine.cxx:39
 TCurlyLine.cxx:40
 TCurlyLine.cxx:41
 TCurlyLine.cxx:42
 TCurlyLine.cxx:43
 TCurlyLine.cxx:44
 TCurlyLine.cxx:45
 TCurlyLine.cxx:46
 TCurlyLine.cxx:47
 TCurlyLine.cxx:48
 TCurlyLine.cxx:49
 TCurlyLine.cxx:50
 TCurlyLine.cxx:51
 TCurlyLine.cxx:52
 TCurlyLine.cxx:53
 TCurlyLine.cxx:54
 TCurlyLine.cxx:55
 TCurlyLine.cxx:56
 TCurlyLine.cxx:57
 TCurlyLine.cxx:58
 TCurlyLine.cxx:59
 TCurlyLine.cxx:60
 TCurlyLine.cxx:61
 TCurlyLine.cxx:62
 TCurlyLine.cxx:63
 TCurlyLine.cxx:64
 TCurlyLine.cxx:65
 TCurlyLine.cxx:66
 TCurlyLine.cxx:67
 TCurlyLine.cxx:68
 TCurlyLine.cxx:69
 TCurlyLine.cxx:70
 TCurlyLine.cxx:71
 TCurlyLine.cxx:72
 TCurlyLine.cxx:73
 TCurlyLine.cxx:74
 TCurlyLine.cxx:75
 TCurlyLine.cxx:76
 TCurlyLine.cxx:77
 TCurlyLine.cxx:78
 TCurlyLine.cxx:79
 TCurlyLine.cxx:80
 TCurlyLine.cxx:81
 TCurlyLine.cxx:82
 TCurlyLine.cxx:83
 TCurlyLine.cxx:84
 TCurlyLine.cxx:85
 TCurlyLine.cxx:86
 TCurlyLine.cxx:87
 TCurlyLine.cxx:88
 TCurlyLine.cxx:89
 TCurlyLine.cxx:90
 TCurlyLine.cxx:91
 TCurlyLine.cxx:92
 TCurlyLine.cxx:93
 TCurlyLine.cxx:94
 TCurlyLine.cxx:95
 TCurlyLine.cxx:96
 TCurlyLine.cxx:97
 TCurlyLine.cxx:98
 TCurlyLine.cxx:99
 TCurlyLine.cxx:100
 TCurlyLine.cxx:101
 TCurlyLine.cxx:102
 TCurlyLine.cxx:103
 TCurlyLine.cxx:104
 TCurlyLine.cxx:105
 TCurlyLine.cxx:106
 TCurlyLine.cxx:107
 TCurlyLine.cxx:108
 TCurlyLine.cxx:109
 TCurlyLine.cxx:110
 TCurlyLine.cxx:111
 TCurlyLine.cxx:112
 TCurlyLine.cxx:113
 TCurlyLine.cxx:114
 TCurlyLine.cxx:115
 TCurlyLine.cxx:116
 TCurlyLine.cxx:117
 TCurlyLine.cxx:118
 TCurlyLine.cxx:119
 TCurlyLine.cxx:120
 TCurlyLine.cxx:121
 TCurlyLine.cxx:122
 TCurlyLine.cxx:123
 TCurlyLine.cxx:124
 TCurlyLine.cxx:125
 TCurlyLine.cxx:126
 TCurlyLine.cxx:127
 TCurlyLine.cxx:128
 TCurlyLine.cxx:129
 TCurlyLine.cxx:130
 TCurlyLine.cxx:131
 TCurlyLine.cxx:132
 TCurlyLine.cxx:133
 TCurlyLine.cxx:134
 TCurlyLine.cxx:135
 TCurlyLine.cxx:136
 TCurlyLine.cxx:137
 TCurlyLine.cxx:138
 TCurlyLine.cxx:139
 TCurlyLine.cxx:140
 TCurlyLine.cxx:141
 TCurlyLine.cxx:142
 TCurlyLine.cxx:143
 TCurlyLine.cxx:144
 TCurlyLine.cxx:145
 TCurlyLine.cxx:146
 TCurlyLine.cxx:147
 TCurlyLine.cxx:148
 TCurlyLine.cxx:149
 TCurlyLine.cxx:150
 TCurlyLine.cxx:151
 TCurlyLine.cxx:152
 TCurlyLine.cxx:153
 TCurlyLine.cxx:154
 TCurlyLine.cxx:155
 TCurlyLine.cxx:156
 TCurlyLine.cxx:157
 TCurlyLine.cxx:158
 TCurlyLine.cxx:159
 TCurlyLine.cxx:160
 TCurlyLine.cxx:161
 TCurlyLine.cxx:162
 TCurlyLine.cxx:163
 TCurlyLine.cxx:164
 TCurlyLine.cxx:165
 TCurlyLine.cxx:166
 TCurlyLine.cxx:167
 TCurlyLine.cxx:168
 TCurlyLine.cxx:169
 TCurlyLine.cxx:170
 TCurlyLine.cxx:171
 TCurlyLine.cxx:172
 TCurlyLine.cxx:173
 TCurlyLine.cxx:174
 TCurlyLine.cxx:175
 TCurlyLine.cxx:176
 TCurlyLine.cxx:177
 TCurlyLine.cxx:178
 TCurlyLine.cxx:179
 TCurlyLine.cxx:180
 TCurlyLine.cxx:181
 TCurlyLine.cxx:182
 TCurlyLine.cxx:183
 TCurlyLine.cxx:184
 TCurlyLine.cxx:185
 TCurlyLine.cxx:186
 TCurlyLine.cxx:187
 TCurlyLine.cxx:188
 TCurlyLine.cxx:189
 TCurlyLine.cxx:190
 TCurlyLine.cxx:191
 TCurlyLine.cxx:192
 TCurlyLine.cxx:193
 TCurlyLine.cxx:194
 TCurlyLine.cxx:195
 TCurlyLine.cxx:196
 TCurlyLine.cxx:197
 TCurlyLine.cxx:198
 TCurlyLine.cxx:199
 TCurlyLine.cxx:200
 TCurlyLine.cxx:201
 TCurlyLine.cxx:202
 TCurlyLine.cxx:203
 TCurlyLine.cxx:204
 TCurlyLine.cxx:205
 TCurlyLine.cxx:206
 TCurlyLine.cxx:207
 TCurlyLine.cxx:208
 TCurlyLine.cxx:209
 TCurlyLine.cxx:210
 TCurlyLine.cxx:211
 TCurlyLine.cxx:212
 TCurlyLine.cxx:213
 TCurlyLine.cxx:214
 TCurlyLine.cxx:215
 TCurlyLine.cxx:216
 TCurlyLine.cxx:217
 TCurlyLine.cxx:218
 TCurlyLine.cxx:219
 TCurlyLine.cxx:220
 TCurlyLine.cxx:221
 TCurlyLine.cxx:222
 TCurlyLine.cxx:223
 TCurlyLine.cxx:224
 TCurlyLine.cxx:225
 TCurlyLine.cxx:226
 TCurlyLine.cxx:227
 TCurlyLine.cxx:228
 TCurlyLine.cxx:229
 TCurlyLine.cxx:230
 TCurlyLine.cxx:231
 TCurlyLine.cxx:232
 TCurlyLine.cxx:233
 TCurlyLine.cxx:234
 TCurlyLine.cxx:235
 TCurlyLine.cxx:236
 TCurlyLine.cxx:237
 TCurlyLine.cxx:238
 TCurlyLine.cxx:239
 TCurlyLine.cxx:240
 TCurlyLine.cxx:241
 TCurlyLine.cxx:242
 TCurlyLine.cxx:243
 TCurlyLine.cxx:244
 TCurlyLine.cxx:245
 TCurlyLine.cxx:246
 TCurlyLine.cxx:247
 TCurlyLine.cxx:248
 TCurlyLine.cxx:249
 TCurlyLine.cxx:250
 TCurlyLine.cxx:251
 TCurlyLine.cxx:252
 TCurlyLine.cxx:253
 TCurlyLine.cxx:254
 TCurlyLine.cxx:255
 TCurlyLine.cxx:256
 TCurlyLine.cxx:257
 TCurlyLine.cxx:258
 TCurlyLine.cxx:259
 TCurlyLine.cxx:260
 TCurlyLine.cxx:261
 TCurlyLine.cxx:262
 TCurlyLine.cxx:263
 TCurlyLine.cxx:264
 TCurlyLine.cxx:265
 TCurlyLine.cxx:266
 TCurlyLine.cxx:267
 TCurlyLine.cxx:268
 TCurlyLine.cxx:269
 TCurlyLine.cxx:270
 TCurlyLine.cxx:271
 TCurlyLine.cxx:272
 TCurlyLine.cxx:273
 TCurlyLine.cxx:274
 TCurlyLine.cxx:275
 TCurlyLine.cxx:276
 TCurlyLine.cxx:277
 TCurlyLine.cxx:278
 TCurlyLine.cxx:279
 TCurlyLine.cxx:280
 TCurlyLine.cxx:281
 TCurlyLine.cxx:282
 TCurlyLine.cxx:283
 TCurlyLine.cxx:284
 TCurlyLine.cxx:285
 TCurlyLine.cxx:286
 TCurlyLine.cxx:287
 TCurlyLine.cxx:288
 TCurlyLine.cxx:289
 TCurlyLine.cxx:290
 TCurlyLine.cxx:291
 TCurlyLine.cxx:292
 TCurlyLine.cxx:293
 TCurlyLine.cxx:294
 TCurlyLine.cxx:295
 TCurlyLine.cxx:296
 TCurlyLine.cxx:297
 TCurlyLine.cxx:298
 TCurlyLine.cxx:299
 TCurlyLine.cxx:300
 TCurlyLine.cxx:301
 TCurlyLine.cxx:302
 TCurlyLine.cxx:303
 TCurlyLine.cxx:304
 TCurlyLine.cxx:305
 TCurlyLine.cxx:306
 TCurlyLine.cxx:307
 TCurlyLine.cxx:308
 TCurlyLine.cxx:309
 TCurlyLine.cxx:310
 TCurlyLine.cxx:311
 TCurlyLine.cxx:312
 TCurlyLine.cxx:313
 TCurlyLine.cxx:314
 TCurlyLine.cxx:315
 TCurlyLine.cxx:316
 TCurlyLine.cxx:317
 TCurlyLine.cxx:318
 TCurlyLine.cxx:319
 TCurlyLine.cxx:320
 TCurlyLine.cxx:321
 TCurlyLine.cxx:322
 TCurlyLine.cxx:323
 TCurlyLine.cxx:324
 TCurlyLine.cxx:325
 TCurlyLine.cxx:326
 TCurlyLine.cxx:327
 TCurlyLine.cxx:328
 TCurlyLine.cxx:329
 TCurlyLine.cxx:330
 TCurlyLine.cxx:331
 TCurlyLine.cxx:332
 TCurlyLine.cxx:333
 TCurlyLine.cxx:334
 TCurlyLine.cxx:335
 TCurlyLine.cxx:336
 TCurlyLine.cxx:337
 TCurlyLine.cxx:338
 TCurlyLine.cxx:339
 TCurlyLine.cxx:340
 TCurlyLine.cxx:341
 TCurlyLine.cxx:342
 TCurlyLine.cxx:343
 TCurlyLine.cxx:344
 TCurlyLine.cxx:345
 TCurlyLine.cxx:346
 TCurlyLine.cxx:347
 TCurlyLine.cxx:348
 TCurlyLine.cxx:349
 TCurlyLine.cxx:350
 TCurlyLine.cxx:351
 TCurlyLine.cxx:352
 TCurlyLine.cxx:353
 TCurlyLine.cxx:354
 TCurlyLine.cxx:355
 TCurlyLine.cxx:356
 TCurlyLine.cxx:357
 TCurlyLine.cxx:358
 TCurlyLine.cxx:359
 TCurlyLine.cxx:360
 TCurlyLine.cxx:361
 TCurlyLine.cxx:362
 TCurlyLine.cxx:363
 TCurlyLine.cxx:364
 TCurlyLine.cxx:365
 TCurlyLine.cxx:366
 TCurlyLine.cxx:367
 TCurlyLine.cxx:368
 TCurlyLine.cxx:369
 TCurlyLine.cxx:370
 TCurlyLine.cxx:371
 TCurlyLine.cxx:372
 TCurlyLine.cxx:373
 TCurlyLine.cxx:374
 TCurlyLine.cxx:375
 TCurlyLine.cxx:376
 TCurlyLine.cxx:377
 TCurlyLine.cxx:378
 TCurlyLine.cxx:379
 TCurlyLine.cxx:380
 TCurlyLine.cxx:381
 TCurlyLine.cxx:382
 TCurlyLine.cxx:383
 TCurlyLine.cxx:384
 TCurlyLine.cxx:385
 TCurlyLine.cxx:386
 TCurlyLine.cxx:387
 TCurlyLine.cxx:388
 TCurlyLine.cxx:389
 TCurlyLine.cxx:390
 TCurlyLine.cxx:391
 TCurlyLine.cxx:392
 TCurlyLine.cxx:393
 TCurlyLine.cxx:394
 TCurlyLine.cxx:395
 TCurlyLine.cxx:396
 TCurlyLine.cxx:397
 TCurlyLine.cxx:398
 TCurlyLine.cxx:399
 TCurlyLine.cxx:400
 TCurlyLine.cxx:401
 TCurlyLine.cxx:402
 TCurlyLine.cxx:403
 TCurlyLine.cxx:404