ROOT logo
// @(#)root/graf:$Id$
// Author: Rene Brun   17/10/95

/*************************************************************************
 * 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.             *
 *************************************************************************/

#include "Riostream.h"
#include "TROOT.h"
#include "TMath.h"
#include "TArrow.h"
#include "TVirtualPad.h"

Float_t TArrow::fgDefaultAngle      = 60;
Float_t TArrow::fgDefaultArrowSize  = 0.05;
TString TArrow::fgDefaultOption     = ">";

ClassImp(TArrow)

//______________________________________________________________________________
/* Begin_Html
<center><h2>TArrow : to draw all kinds of arrows</h2></center>
The different arrow's formats are explained in TArrow::TArrow.
The picture below gives some examples.
<P>
Once an arrow is drawn on the screen:
<ul>
<li> One can click on one of the edges and move this edge.</li>
<li> One can click on any other arrow part to move the entire arrow.</li>
</ul>
End_Html
Begin_Macro(source)
../../../tutorials/graphics/arrow.C
End_Macro */

//______________________________________________________________________________
TArrow::TArrow(): TLine(),TAttFill()
{
   // Arrow default constructor.

   fAngle     = fgDefaultAngle;
   fArrowSize = 0.;
}

//______________________________________________________________________________
TArrow::TArrow(Double_t x1, Double_t y1,Double_t x2, Double_t  y2,
             Float_t arrowsize ,Option_t *option)
       :TLine(x1,y1,x2,y2), TAttFill(0,1001)
{
   // Arrow normal constructor.
   //
   // Define an arrow between points x1,y1 and x2,y2
   // the arrowsize is in percentage of the pad height
   // Opening angle between the two sides of the arrow is fAngle (60 degrees)
   //
   //  option = ">"      -------->
   //  option = "|->"    |------->
   //  option = "<"      <--------
   //  option = "<-|"    <-------|
   //  option = "->-"    ---->----
   //  option = "-<-"    ----<----
   //  option = "-|>-"   ---|>----
   //  option = "<>"     <------->
   //  option = "<|>"    <|-----|>  arrow defined by a triangle
   //
   //  Note:
   //  - If FillColor == 0 draw open triangle else  draw full triangle with fillcolor
   //    default is filled with LineColor
   //  - "Begin" and "end" bars can be combined with any other options.

   fAngle       = fgDefaultAngle;
   fArrowSize   = arrowsize;
   fOption      = option;
   SetFillColor(this->GetLineColor());
}

//______________________________________________________________________________
TArrow::~TArrow()
{
   // Arrow default destructor.
}

//______________________________________________________________________________
TArrow::TArrow(const TArrow &arrow) : TLine(arrow), TAttFill(arrow)
{
   // Copy constructor.

   fAngle     = fgDefaultAngle;
   fArrowSize = 0.;
   ((TArrow&)arrow).Copy(*this);
}

//______________________________________________________________________________
void TArrow::Copy(TObject &obj) const
{
   // Copy this arrow to arrow.

   TLine::Copy(obj);
   TAttFill::Copy(((TArrow&)obj));
   ((TArrow&)obj).fAngle      = fAngle;
   ((TArrow&)obj).fArrowSize  = fArrowSize;
   ((TArrow&)obj).fOption     = fOption;
}

//______________________________________________________________________________
void TArrow::Draw(Option_t *option)
{
   // Draw this arrow with its current attributes.

   Option_t *opt;
   if (option && strlen(option)) opt = option;
   else                          opt = (char*)GetOption();

   AppendPad(opt);

}

//______________________________________________________________________________
void TArrow::DrawArrow(Double_t x1, Double_t y1,Double_t x2, Double_t  y2,
                     Float_t arrowsize ,Option_t *option)
{
   // Draw this arrow with new coordinates.
   //
   // if arrowsize is <= 0, arrowsize will be the current arrow size
   // if option="", option will be the current arrow option

   Float_t size = arrowsize;
   if (size <= 0) size = fArrowSize;
   if (size <= 0) size = 0.05;
   const char* opt = option;
   if (!opt || strlen(opt) == 0) opt = fOption.Data();
   if (!opt || strlen(opt) == 0) opt = "|>";
   TArrow *newarrow = new TArrow(x1,y1,x2,y2,size,opt);
   newarrow->SetAngle(fAngle);
   TAttLine::Copy(*newarrow);
   TAttFill::Copy(*newarrow);
   newarrow->SetBit(kCanDelete);
   newarrow->AppendPad(opt);
}

//______________________________________________________________________________
void TArrow::Paint(Option_t *option)
{
   // Paint this arrow with its current attributes.

   Option_t *opt;
   if (option && strlen(option)) opt = option;
   else                          opt = (char*)GetOption();
   PaintArrow(gPad->XtoPad(fX1),gPad->YtoPad(fY1),gPad->XtoPad(fX2),gPad->YtoPad(fY2), fArrowSize, opt);
}


//______________________________________________________________________________
void TArrow::PaintArrow(Double_t x1, Double_t y1, Double_t x2, Double_t y2,
                        Float_t arrowsize, Option_t *option)
{
   // Draw this arrow
   //
   //
   //                             +
   //                             |.
   //                             | .
   //                             |  .
   //     +-----------------------|---+------------------+
   //  (x1,y1)                    |  .                (x2,y2)
   //                             | .
   //                             |.
   //                             +

   Int_t i;

   // Option and attributes
   TString opt = option;
   opt.ToLower();
   TAttLine::Modify();
   TAttFill::Modify();

   // Compute the gPad coordinates in TRUE normalized space (NDC)
   Int_t ix1,iy1,ix2,iy2;
   Int_t iw = gPad->GetWw();
   Int_t ih = gPad->GetWh();
   Double_t x1p,y1p,x2p,y2p;
   gPad->GetPadPar(x1p,y1p,x2p,y2p);
   ix1 = (Int_t)(iw*x1p);
   iy1 = (Int_t)(ih*y1p);
   ix2 = (Int_t)(iw*x2p);
   iy2 = (Int_t)(ih*y2p);
   Double_t wndc  = TMath::Min(1.,(Double_t)iw/(Double_t)ih);
   Double_t hndc  = TMath::Min(1.,(Double_t)ih/(Double_t)iw);
   Double_t rh    = hndc/(Double_t)ih;
   Double_t rw    = wndc/(Double_t)iw;
   Double_t x1ndc = (Double_t)ix1*rw;
   Double_t y1ndc = (Double_t)iy1*rh;
   Double_t x2ndc = (Double_t)ix2*rw;
   Double_t y2ndc = (Double_t)iy2*rh;

   // Ratios to convert user space in TRUE normalized space (NDC)
   Double_t rx1,ry1,rx2,ry2;
   gPad->GetRange(rx1,ry1,rx2,ry2);
   Double_t rx = (x2ndc-x1ndc)/(rx2-rx1);
   Double_t ry = (y2ndc-y1ndc)/(ry2-ry1);

   // Arrow position and arrow's middle in NDC space
   Double_t x1n, y1n, x2n, y2n, xm, ym;
   x1n = rx*(x1-rx1)+x1ndc;
   x2n = rx*(x2-rx1)+x1ndc;
   y1n = ry*(y1-ry1)+y1ndc;
   y2n = ry*(y2-ry1)+y1ndc;
   xm  = (x1n+x2n)/2;
   ym  = (y1n+y2n)/2;

   // Arrow heads size
   Double_t length = TMath::Sqrt(Double_t((x2n-x1n)*(x2n-x1n)+(y2n-y1n)*(y2n-y1n)));
   Double_t rSize  = 0.7*arrowsize;
   Double_t dSize  = rSize*TMath::Tan(TMath::Pi()*fAngle/360);
   Double_t cosT   = 1;
   Double_t sinT   = 0;
   if (length > 0) {
      cosT   = (x2n-x1n)/length;
      sinT   = (y2n-y1n)/length;
   }
   // Arrays holding the arrows coordinates
   Double_t x1ar[4], y1ar[4];
   Double_t x2ar[4], y2ar[4];

   // Draw the start and end bars if needed
   if (opt.BeginsWith("|-")) {
      x1ar[0] = x1n-sinT*dSize;
      y1ar[0] = y1n+cosT*dSize;
      x1ar[1] = x1n+sinT*dSize;
      y1ar[1] = y1n-cosT*dSize;
      // NDC to user coordinates
      for (i=0; i<2; i++) {
         x1ar[i] = (1/rx)*(x1ar[i]-x1ndc)+rx1;
         y1ar[i] = (1/ry)*(y1ar[i]-y1ndc)+ry1;
      }
      gPad->PaintLine(x1ar[0],y1ar[0],x1ar[1],y1ar[1]);
      opt(0) = ' ';
   }
   if (opt.EndsWith("-|")) {
      x2ar[0] = x2n-sinT*dSize;
      y2ar[0] = y2n+cosT*dSize;
      x2ar[1] = x2n+sinT*dSize;
      y2ar[1] = y2n-cosT*dSize;
      // NDC to user coordinates
      for (i=0; i<2; i++) {
         x2ar[i] = (1/rx)*(x2ar[i]-x1ndc)+rx1;
         y2ar[i] = (1/ry)*(y2ar[i]-y1ndc)+ry1;
      }
      gPad->PaintLine(x2ar[0],y2ar[0],x2ar[1],y2ar[1]);
      opt(opt.Length()-1) = ' ';
   }

   // Move arrow head's position if needed
   Double_t x1h = x1n;
   Double_t y1h = y1n;
   Double_t x2h = x2n;
   Double_t y2h = y2n;
   if (opt.Contains("->-") || opt.Contains("-|>-")) {
      x2h = xm + cosT*rSize/2;
      y2h = ym + sinT*rSize/2;
   }
   if (opt.Contains("-<-") || opt.Contains("-<|-")) {
      x1h = xm - cosT*rSize/2;
      y1h = ym - sinT*rSize/2;
   }

   // Define the arrow's head coordinates
   if (opt.Contains(">")) {
      x2ar[0] = x2h - rSize*cosT - sinT*dSize;
      y2ar[0] = y2h - rSize*sinT + cosT*dSize;
      x2ar[1] = x2h;
      y2ar[1] = y2h;
      x2ar[2] = x2h - rSize*cosT + sinT*dSize;
      y2ar[2] = y2h - rSize*sinT - cosT*dSize;
      x2ar[3] = x2ar[0];
      y2ar[3] = y2ar[0];
   }

   if (opt.Contains("<")) {
      x1ar[0] = x1h + rSize*cosT + sinT*dSize;
      y1ar[0] = y1h + rSize*sinT - cosT*dSize;
      x1ar[1] = x1h;
      y1ar[1] = y1h;
      x1ar[2] = x1h + rSize*cosT - sinT*dSize;
      y1ar[2] = y1h + rSize*sinT + cosT*dSize;
      x1ar[3] = x1ar[0];
      y1ar[3] = y1ar[0];
   }

   // Paint Arrow body
   if (opt.Contains("|>") && !opt.Contains("-|>-")) {
      x2n = x2n-cosT*rSize;
      y2n = y2n-sinT*rSize;
   }
   if (opt.Contains("<|") && !opt.Contains("-<|-")) {
      x1n = x1n+cosT*rSize;
      y1n = y1n+sinT*rSize;
   }
   x1n = (1/rx)*(x1n-x1ndc)+rx1;
   y1n = (1/ry)*(y1n-y1ndc)+ry1;
   x2n = (1/rx)*(x2n-x1ndc)+rx1;
   y2n = (1/ry)*(y2n-y1ndc)+ry1;
   gPad->PaintLine(x1n,y1n,x2n,y2n);

   // Draw the arrow's head(s)
   if (opt.Contains(">")) {
      // NDC to user coordinates
      for (i=0; i<4; i++) {
         x2ar[i] = (1/rx)*(x2ar[i]-x1ndc)+rx1;
         y2ar[i] = (1/ry)*(y2ar[i]-y1ndc)+ry1;
      }
      if (opt.Contains("|>")) {
         if (GetFillColor()) {
            gPad->PaintFillArea(3,x2ar,y2ar);
            gPad->PaintPolyLine(4,x2ar,y2ar);
         } else {
            gPad->PaintPolyLine(4,x2ar,y2ar);
         }
      } else {
         gPad->PaintPolyLine(3,x2ar,y2ar);
      }
   }
   if (opt.Contains("<")) {
      // NDC to user coordinates
      for (i=0; i<4; i++) {
         x1ar[i] = (1/rx)*(x1ar[i]-x1ndc)+rx1;
         y1ar[i] = (1/ry)*(y1ar[i]-y1ndc)+ry1;
      }
      if (opt.Contains("<|")) {
         if (GetFillColor()) {
            gPad->PaintFillArea(3,x1ar,y1ar);
            gPad->PaintPolyLine(4,x1ar,y1ar);
         } else {
            gPad->PaintPolyLine(4,x1ar,y1ar);
         }
      } else {
         gPad->PaintPolyLine(3,x1ar,y1ar);
      }
   }
}

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

   char quote = '"';
   if (gROOT->ClassSaved(TArrow::Class())) {
      out<<"   ";
   } else {
      out<<"   TArrow *";
   }
   out<<"arrow = new TArrow("<<fX1<<","<<fY1<<","<<fX2<<","<<fY2
      <<","<<fArrowSize<<","<<quote<<GetDrawOption()<<quote<<");"<<endl;

   SaveFillAttributes(out,"arrow",0,1);
   SaveLineAttributes(out,"arrow",1,1,1);

   if (fAngle !=60) {
      out << "   arrow->SetAngle(" << GetAngle() << ");" << endl;
   }

   out<<"   arrow->Draw();"<<endl;
}


//______________________________________________________________________________
void TArrow::SetDefaultAngle(Float_t Angle)
{
   // Set default angle.

   fgDefaultAngle = Angle;
}


//______________________________________________________________________________
void TArrow::SetDefaultArrowSize (Float_t ArrowSize)
{
   // Set default arrow sive.

   fgDefaultArrowSize = ArrowSize;
}


//______________________________________________________________________________
void TArrow::SetDefaultOption(Option_t *Option)
{
   // Set default option.

   fgDefaultOption = Option;
}


//______________________________________________________________________________
Float_t TArrow::GetDefaultAngle()
{
   // Get default angle.

   return fgDefaultAngle;
}


//______________________________________________________________________________
Float_t TArrow::GetDefaultArrowSize()
{
   // Get default arrow size.

   return fgDefaultArrowSize;
}


//______________________________________________________________________________
Option_t *TArrow::GetDefaultOption()
{
   // Get default option.

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