ROOT logo
// @(#)root/treeviewer:$Id: TSpider.cxx 24145 2008-06-04 19:21:09Z brun $
// Author: Bastien Dalla Piazza  20/07/07

/*************************************************************************
 * Copyright (C) 1995-2007, 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 "TSpider.h"
#include "TAttFill.h"
#include "TAttText.h"
#include "TAttLine.h"
#include "TGraphPolargram.h"
#include "TPolyLine.h"
#include "TNtuple.h"
#include "TTreeFormula.h"
#include "TTreeFormulaManager.h"
#include "TList.h"
#include "TSelectorDraw.h"
#include "TROOT.h"
#include "TEntryList.h"
#include "TLatex.h"
#include "TPad.h"
#include "TMath.h"
#include "TCanvas.h"
#include "TArc.h"
#include "float.h"
#include "TEnv.h"

ClassImp(TSpider)

//______________________________________________________________________________
/* Begin_Html
<center><h2>Spider class</h2></center>
A spider view is a handy way to visualize a set of data stored in a TTree. It draws as
many polar axes as selected data members. For each of them, it draws on the axis
the position of the present event between the min and max of the data member.
Two modes are availables:
<ul>
<li> The spider view: With each points on the axes is drawn a polyline.</li>
<li> The segment view: For each data member is drawn an arc segment with the radius corresponding to the event.</li>
</ul>
The spider plot is available from the treeviewer called by "atree->StartViewer()", or simply by calling its constructor and defining the variables to display.
End_Html
Begin_Macro(source)
{
   TCanvas *c1 = new TCanvas("c1","TSpider example",200,10,700,700);
   TFile *f = new TFile("$(ROOTSYS)/tutorials/hsimple.root");
   if (!f || f->IsZombie()) {
      printf("Please run <ROOT location>/tutorials/hsimple.C before.");
      return;
   }
   TNtuple* ntuple = f->Get("ntuple");
   TString varexp = "px:py:pz:random:sin(px):log(px/py):log(pz)";
   TString select = "px>0 && py>0 && pz>0";
   TString options = "average";
   TSpider *spider = new TSpider(ntuple,varexp.Data(),select.Data(),options.Data());
   spider->Draw();
   c1->ToggleEditor();
   c1->Selected(c1,spider,1);
   return c1;
}
End_Macro
*/


//______________________________________________________________________________
TSpider::TSpider()
{
   // Default constructor.

   fDisplayAverage=kFALSE;
   fForceDim=kFALSE;
   fPolargram=NULL;
   fInput=NULL;
   fManager=NULL;
   fNcols=0;
   fNx=3;
   fNy=4;
   fPolyList=NULL;
   fSelect=NULL;
   fSelector=NULL;
   fTree=NULL;
   fMax=NULL;
   fMin=NULL;
   fAve=NULL;
   fCanvas=NULL;
   fAveragePoly=NULL;
   fEntry=0;
   fSuperposed=NULL;
   fShowRange=kFALSE;
   fAngularLabels=kFALSE;
   fAverageSlices=NULL;
   fSegmentDisplay=kFALSE;
   fNentries=0;
   fFirstEntry=0;
   fArraySize=0;
   fCurrentEntries = NULL;
   fFormulas = NULL;
}


//______________________________________________________________________________
TSpider::TSpider(TTree* tree ,const char *varexp, const char *selection,
                               Option_t *option, Long64_t nentries, Long64_t firstentry)
   : TAttFill(2,3003), TAttLine(1,1,1)
{
   // Normal constructor. Options are:

   UInt_t ui=0;

   fArraySize = 16;
   fTree=tree;
   fSelector= new TSelectorDraw();
   fFormulas= new TList();
   fInput= new TList();
   fInput->Add(new TNamed("varexp",""));
   fInput->Add(new TNamed("selection",""));
   fSelector->SetInputList(fInput);
   gROOT->GetListOfCleanups()->Add(this);
   fNx=2;
   fNy=2;
   fDisplayAverage=kFALSE;
   fSelect=NULL;
   fManager=NULL;
   fCanvas=NULL;
   fAveragePoly=NULL;
   fEntry=fFirstEntry;
   fSuperposed=NULL;
   fShowRange=kFALSE;
   fAngularLabels=kTRUE;
   fForceDim=kFALSE;
   fAverageSlices=NULL;
   fSegmentDisplay=kFALSE;
   if (firstentry < 0 || firstentry > tree->GetEstimate()) firstentry = 0;
   fFirstEntry = firstentry;
   if (nentries>0) fNentries = nentries;
   else fNentries = nentries = tree->GetEstimate()-firstentry;

   fEntry = fFirstEntry;

   fPolargram=NULL;
   fPolyList=NULL;

   fTree->SetScanField(fNx*fNy);
   fCurrentEntries = new Long64_t[fNx*fNy];
   for(ui=0;ui<fNx*fNy;++ui) fCurrentEntries[ui]=0;

   TString opt = option;

   if (opt.Contains("average")) fDisplayAverage=kTRUE;
   if (opt.Contains("showrange")) fShowRange=kTRUE;
   if (opt.Contains("segment")) fSegmentDisplay=kTRUE;

   fNcols=8;

   SetVariablesExpression(varexp);
   SetSelectionExpression(selection);
   SyncFormulas();
   InitVariables(firstentry,nentries);
}


//______________________________________________________________________________
TSpider::~TSpider()
{
   // Destructor.

   delete [] fCurrentEntries;
   if(fPolyList){
      fPolyList->Delete();
      delete fPolyList;
   }
   if(fAverageSlices)
      delete [] fAverageSlices;
   if(fFormulas){
      fFormulas->Delete();
      delete fFormulas;
   }
   if(fSelect) delete fSelect;
   if(fSelector) delete fSelector;
   if(fInput){
      fInput->Delete();
      delete fInput;
   }
   if(fMax) delete [] fMax;
   if(fMin) delete [] fMin;
   if(fAve) delete [] fAve;
   if(fSuperposed){
      fSuperposed->Delete();
      delete fSuperposed;
   }
   fCanvas->cd(0);
}


//______________________________________________________________________________
void TSpider::AddSuperposed(TSpider* sp)
{
   // Allow to superpose several spider views.

   if(!fSuperposed) fSuperposed=new TList();
   fSuperposed->Add(sp);
}


//______________________________________________________________________________
void TSpider::AddVariable(const char* varexp)
{
   // Add a variable to the plot from its expression.

   if(!strlen(varexp)) return;
   TTreeFormula *fvar = new TTreeFormula("Var1",varexp,fTree);
   if(fvar->GetNdim() <= 0) return;

   fFormulas->AddAfter(fFormulas->At(fNcols-1),fvar);

   InitArrays(fNcols + 1);
   ++fNcols;
   SyncFormulas();

   UInt_t ui=0;
   Long64_t notSkipped=0;
   Int_t tnumber=-1;
   Long64_t entryNumber;
   Long64_t entry = fFirstEntry;
   Int_t entriesToDisplay = fNentries;
   while(entriesToDisplay!=0){
      entryNumber = fTree->GetEntryNumber(entry);
      if(entryNumber < 0) break;
      Long64_t localEntry = fTree->LoadTree(entryNumber);
      if(localEntry < 0) break;
      if(tnumber != fTree->GetTreeNumber()) {
         tnumber = fTree->GetTreeNumber();
         if(fManager) fManager->UpdateFormulaLeaves();
         else {
            for(Int_t i=0;i<=fFormulas->LastIndex();++i)
               ((TTreeFormula*)fFormulas->At(i))->UpdateFormulaLeaves();
         }
      }
      Int_t ndata=1;
      if(fForceDim){
         if(fManager)
            ndata = fManager->GetNdata(kTRUE);
         else {
            for(ui=0;ui<fNcols;++ui){
               if(ndata<((TTreeFormula*)fFormulas->At(ui))->GetNdata())
                  ndata = ((TTreeFormula*)fFormulas->At(ui))->GetNdata();
            }
            if(fSelect && fSelect->GetNdata() == 0)
               ndata = 0;
         }
      }

      Bool_t loaded = kFALSE;
      Bool_t skip = kFALSE;
      // Loop over the instances of the selection condition
      for(Int_t inst=0;inst<ndata;++inst){
         if(fSelect){
            if(fSelect->EvalInstance(inst) == 0){
               skip = kTRUE;
               ++entry;
            }
         }
         if(inst == 0) loaded = kTRUE;
         else if(!loaded){
            // EvalInstance(0) always needs to be called so that
            // the proper branches are loaded.
            ((TTreeFormula*)fFormulas->At(fNcols-1))->EvalInstance(0);
            loaded = kTRUE;
         }
      }
      if(!skip){
         fTree->LoadTree(entryNumber);
         TTreeFormula* var = (TTreeFormula*)fFormulas->At(fNcols-1);
         if(var->EvalInstance()>fMax[fNcols-1]) fMax[fNcols-1]=var->EvalInstance();
         if(var->EvalInstance()<fMin[fNcols-1]) fMin[fNcols-1]=var->EvalInstance();
         fAve[fNcols-1]+=var->EvalInstance();
         ++notSkipped;
         --entriesToDisplay;
         ++entry;
      }
   }
   fAve[fNcols-1]/=notSkipped;

   Color_t lc;
   Style_t lt;
   Width_t lw;
   Color_t fc;
   Style_t fs;

   if(fAverageSlices){
      lc = fAverageSlices[0]->GetLineColor();
      lt = fAverageSlices[0]->GetLineStyle();
      lw = fAverageSlices[0]->GetLineWidth();
      fc = fAverageSlices[0]->GetFillColor();
      fs = fAverageSlices[0]->GetFillStyle();
   } else {
      lc = fAveragePoly->GetLineColor();
      lt = fAveragePoly->GetLineStyle();
      lw = fAveragePoly->GetLineWidth();
      fc = fAveragePoly->GetFillColor();
      fs = fAveragePoly->GetFillStyle();
   }

   delete fPolargram;
   fPolargram = NULL;

   if(fSegmentDisplay){
      for(ui=0;ui<fNx*fNy;++ui) ((TList*)fPolyList->At(ui))->Delete();
      for(ui=0;ui<fNcols-1;++ui) delete fAverageSlices[ui];
   }
   fPolyList->Delete();
   delete fPolyList;
   fPolyList = NULL;
   delete [] fAverageSlices;
   fAverageSlices = NULL;
   delete fAveragePoly;
   fAveragePoly = NULL;

   fCanvas->Clear();
   fCanvas->Divide(fNx,fNy);
   Draw("");

   if(fAverageSlices){
      for(ui = 0;ui<fNcols;++ui){
         fAverageSlices[ui]->SetLineColor(lc);
         fAverageSlices[ui]->SetLineStyle(lt);
         fAverageSlices[ui]->SetLineWidth(lw);
         fAverageSlices[ui]->SetFillColor(fc);
         fAverageSlices[ui]->SetFillStyle(fs);
      }
   } else {
      fAveragePoly->SetLineColor(lc);
      fAveragePoly->SetLineStyle(lt);
      fAveragePoly->SetLineWidth(lw);
      fAveragePoly->SetFillColor(fc);
      fAveragePoly->SetFillStyle(fs);
   }
}


//______________________________________________________________________________
void TSpider::DeleteVariable(const char* varexp)
{
   // Delete a variable from its expression.

   Int_t var=-1;
   UInt_t ui=0;

   if(fNcols == 2) return;
   for(ui=0; ui<fNcols;++ui){
      if(!strcmp(varexp,((TTreeFormula*)fFormulas->At(ui))->GetTitle())) var = ui;
   }
   if(var<0) return;

   fFormulas->Remove(fFormulas->At(var));
   SyncFormulas();

   for(ui=var+1;ui<fNcols;++ui){
      fMin[ui-1] = fMin[ui];
      fMax[ui-1] = fMax[ui];
      fAve[ui-1] = fAve[ui];
   }
   fMin[fNcols-1] = FLT_MAX;
   fMax[fNcols-1] = -FLT_MAX;
   fAve[fNcols-1] = 0;
   --fNcols;

   Color_t lc;
   Style_t lt;
   Width_t lw;
   Color_t fc;
   Style_t fs;

   if(fAverageSlices){
      lc = fAverageSlices[0]->GetLineColor();
      lt = fAverageSlices[0]->GetLineStyle();
      lw = fAverageSlices[0]->GetLineWidth();
      fc = fAverageSlices[0]->GetFillColor();
      fs = fAverageSlices[0]->GetFillStyle();
   } else {
      lc = fAveragePoly->GetLineColor();
      lt = fAveragePoly->GetLineStyle();
      lw = fAveragePoly->GetLineWidth();
      fc = fAveragePoly->GetFillColor();
      fs = fAveragePoly->GetFillStyle();
   }

   delete fPolargram;
   fPolargram = NULL;

   if(fSegmentDisplay){
      for(ui=0;ui<fNx*fNy;++ui) ((TList*)fPolyList->At(ui))->Delete();
      for(ui=0;ui<=fNcols;++ui) delete fAverageSlices[ui];
   }
   fPolyList->Delete();
   delete fPolyList;
   fPolyList = NULL;
   delete [] fAverageSlices;
   fAverageSlices = NULL;
   delete fAveragePoly;
   fAveragePoly = NULL;

   fCanvas->Clear();
   fCanvas->Divide(fNx,fNy);
   Draw("");
   if(fNcols == 2) SetSegmentDisplay(kTRUE);

   if(fAverageSlices){
      for(ui = 0;ui<fNcols;++ui){
         fAverageSlices[ui]->SetLineColor(lc);
         fAverageSlices[ui]->SetLineStyle(lt);
         fAverageSlices[ui]->SetLineWidth(lw);
         fAverageSlices[ui]->SetFillColor(fc);
         fAverageSlices[ui]->SetFillStyle(fs);
      }
   } else {
      fAveragePoly->SetLineColor(lc);
      fAveragePoly->SetLineStyle(lt);
      fAveragePoly->SetLineWidth(lw);
      fAveragePoly->SetFillColor(fc);
      fAveragePoly->SetFillStyle(fs);
   }
}


//______________________________________________________________________________
Int_t TSpider::DistancetoPrimitive(Int_t px, Int_t py)
{
   // Compute the distance to the spider.

   if(!gPad) return 9999;
   Double_t xx,yy,r2;
   xx=gPad->AbsPixeltoX(px);
   yy=gPad->AbsPixeltoY(py);
   r2 = xx*xx + yy*yy;
   if(r2>1 && r2<1.5)
      return 0;
   else return 9999;
}


//______________________________________________________________________________
void TSpider::Draw(Option_t *options)
{
   // Draw the spider.

   UInt_t ui=0;

   gEnv->SetValue("Canvas.ShowEditor",1);
   if(!gPad && !fCanvas){
      fCanvas = new TCanvas("screen","Spider Plot",fNx*256,fNy*256);
      fCanvas->Divide(fNx,fNy);
   } else if(!fCanvas){
      fCanvas = (TCanvas*)gPad;
      fCanvas->Divide(fNx,fNy);
   }
   if(fPolargram) delete fPolargram;
   fPolargram=new TGraphPolargram("fPolargram");
   fPolargram->SetNdivPolar(fNcols);
   fPolargram->SetNdivRadial(0);
   fCanvas->cd();
   SetCurrentEntries();
   AppendPad(options);
   for(ui=0;ui<fNx*fNy;++ui){
      fCanvas->cd(ui+1);
      fPolargram->Draw("pn");
      fTree->LoadTree(fCurrentEntries[ui]);
      if(fSegmentDisplay){
         if(fDisplayAverage) DrawSlicesAverage("");
         DrawSlices("");
      } else {
         if(fDisplayAverage) DrawPolyAverage("");
         DrawPoly("");
      }
      AppendPad();
   }
   fCanvas->Selected(fCanvas,this,1);
}


//______________________________________________________________________________
void TSpider::DrawPolyAverage(Option_t* /*options*/)
{
   // Paint the Polygon representing the average value of the variables.

   Int_t linecolor=4;
   Int_t fillstyle=0;
   Int_t fillcolor=linecolor;
   Int_t linewidth=1;
   Int_t linestyle=1;

   UInt_t ui=0;
   Double_t slice = 2*TMath::Pi()/fNcols;
   Double_t *x = new Double_t[fNcols+1];
   Double_t *y = new Double_t[fNcols+1];

   for(ui=0;ui<fNcols;++ui){
      x[ui]=(fAve[ui]-fMin[ui])/(fMax[ui]-fMin[ui])*TMath::Cos(ui*slice);
      y[ui]=(fAve[ui]-fMin[ui])/(fMax[ui]-fMin[ui])*TMath::Sin(ui*slice);
   }
   x[fNcols]=(fAve[0]-fMin[0])/(fMax[0]-fMin[0]);
   y[fNcols]=0;

   if(!fAveragePoly){
      fAveragePoly = new TPolyLine(fNcols+1,x,y);
      fAveragePoly->SetLineColor(linecolor);
      fAveragePoly->SetLineWidth(linewidth);
      fAveragePoly->SetLineStyle(linestyle);
      fAveragePoly->SetFillStyle(fillstyle);
      fAveragePoly->SetFillColor(fillcolor);
   }
   fAveragePoly->Draw();
   fAveragePoly->Draw("f");

   delete [] x;
   delete [] y;
}


//______________________________________________________________________________
void TSpider::DrawPoly(Option_t* /*options*/)
{
   // Paint the polygon representing the current entry.

   if(!fPolyList) fPolyList = new TList();
   Double_t *x = new Double_t[fNcols+1];
   Double_t *y = new Double_t[fNcols+1];

   Double_t slice = 2*TMath::Pi()/fNcols;
   for(UInt_t i=0;i<fNcols;++i){
      x[i]=(((TTreeFormula*)fFormulas->At(i))->EvalInstance()-fMin[i])/(fMax[i]-fMin[i])*TMath::Cos(i*slice);
      y[i]=(((TTreeFormula*)fFormulas->At(i))->EvalInstance()-fMin[i])/(fMax[i]-fMin[i])*TMath::Sin(i*slice);
   }
   x[fNcols]=(((TTreeFormula*)fFormulas->At(0))->EvalInstance()-fMin[0])/(fMax[0]-fMin[0]);
   y[fNcols]=0;

   TPolyLine* poly= new TPolyLine(fNcols+1,x,y);
   poly->SetFillColor(GetFillColor());
   poly->SetFillStyle(GetFillStyle());
   poly->SetLineWidth(GetLineWidth());
   poly->SetLineColor(GetLineColor());
   poly->SetLineStyle(GetLineStyle());
   poly->Draw("f");
   poly->Draw();
   fPolyList->Add(poly);
   delete [] x;
   delete [] y;
}


//______________________________________________________________________________
void TSpider::DrawSlices(Option_t* options)
{
   // Draw the slices of the segment plot.

   UInt_t ui=0;

   Double_t angle = 2*TMath::Pi()/fNcols;
   Double_t conv = 180.0/TMath::Pi();

   if(!fPolyList) fPolyList = new TList;
   TList* li = new TList();
   for(ui=0;ui<fNcols;++ui){
      Double_t r = (((TTreeFormula*)fFormulas->At(ui))->EvalInstance()-fMin[ui])/(fMax[ui]-fMin[ui]);
      TArc* slice = new TArc(0,0,r,(ui-0.25)*angle*conv,(ui+0.25)*angle*conv);
      slice->SetFillColor(GetFillColor());
      slice->SetFillStyle(GetFillStyle());
      slice->SetLineWidth(GetLineWidth());
      slice->SetLineColor(GetLineColor());
      slice->SetLineStyle(GetLineStyle());
      li->Add(slice);
      slice->Draw(options);
   }
   fPolyList->Add(li);
}


//______________________________________________________________________________
void TSpider::DrawSlicesAverage(Option_t* /*options*/)
{
   // Draw the slices representing the average for the segment plot.

   UInt_t ui=0;

   Int_t fillstyle=3002;
   Int_t linecolor=4;
   Int_t fillcolor=linecolor;
   Int_t linewidth=1;
   Int_t linestyle=1;

   Double_t angle = 2*TMath::Pi()/fNcols;
   Double_t conv = 180.0/TMath::Pi();

   if(!fAverageSlices){
      fAverageSlices = new TArc*[fNcols];
      for(ui=0;ui<fNcols;++ui){
         Double_t r = (fAve[ui]-fMin[ui])/(fMax[ui]-fMin[ui]);
         fAverageSlices[ui] = new TArc(0,0,r,(ui-0.5)*angle*conv,(ui+0.5)*angle*conv);
         fAverageSlices[ui]->SetFillColor(fillcolor);
         fAverageSlices[ui]->SetFillStyle(fillstyle);
         fAverageSlices[ui]->SetLineWidth(linewidth);
         fAverageSlices[ui]->SetLineColor(linecolor);
         fAverageSlices[ui]->SetLineStyle(linestyle);
      }
   }
   for(ui=0;ui<fNcols;++ui) fAverageSlices[ui]->Draw();
}


//______________________________________________________________________________
Style_t TSpider::GetAverageLineStyle() const
{
   // Get the LineStyle of the average.

   if(fAverageSlices) return fAverageSlices[0]->GetLineStyle();
   else if(fAveragePoly) return fAveragePoly->GetLineStyle();
   else return 0;
}


//______________________________________________________________________________
Color_t TSpider::GetAverageLineColor() const
{
   // Get the LineColor of the average.

   if(fAverageSlices) return fAverageSlices[0]->GetLineColor();
   else if(fAveragePoly) return fAveragePoly->GetLineColor();
   else return 0;
}


//______________________________________________________________________________
Width_t TSpider::GetAverageLineWidth() const
{
   // Get the LineWidth of the average.

   if(fAverageSlices) return fAverageSlices[0]->GetLineWidth();
   else if(fAveragePoly) return fAveragePoly->GetLineWidth();
   else return 0;
}


//______________________________________________________________________________
Color_t TSpider::GetAverageFillColor() const
{
   // Get the FillColor of the average.

   if(fAverageSlices) return fAverageSlices[0]->GetFillColor();
   else if(fAveragePoly) return fAveragePoly->GetFillColor();
   else return 0;
}


//______________________________________________________________________________
Style_t TSpider::GetAverageFillStyle() const
{
   // Get the FillStyle of the average.

   if(fAverageSlices) return fAverageSlices[0]->GetFillStyle();
   else if(fAveragePoly) return fAveragePoly->GetFillStyle();
   else return 0;
}


//______________________________________________________________________________
void TSpider::ExecuteEvent(Int_t /*event*/,Int_t /*px*/, Int_t /*py*/)
{
   // Execute the corresponding event.

   gPad->SetCursor(kHand);
}


//______________________________________________________________________________
Int_t TSpider::FindTextAlign(Double_t angle)
{
   // Find the alignement rule to apply for TText::SetTextAlign(Short_t).

   Double_t pi = TMath::Pi();

   while(angle < 0 || angle > 2*pi){
      if(angle < 0) angle+=2*pi;
      if(angle > 2*pi) angle-=2*pi;
   }
   if(!fAngularLabels){
      if(angle > 0 && angle < pi/2) return 11;
      else if(angle > pi/2 && angle < pi) return 31;
      else if(angle > pi && angle < 3*pi/2) return 33;
      else if(angle > 3*pi/2 && angle < 2*pi) return 13;
      else if(angle == 0 || angle == 2*pi) return 12;
      else if(angle == pi/2) return 21;
      else if(angle == pi) return 32;
      else if(angle == 3*pi/2) return 23;
      else return 0;
   }
   else{
      if(angle >= 0 && angle < pi) return 21;
      else if(angle >=pi && angle <= 2*pi) return 23;
      else return 0;
   }
}


//______________________________________________________________________________
Double_t TSpider::FindTextAngle(Double_t angle)
{
   // Determine the orientation of the polar labels according to their angle.

   Double_t pi = TMath::Pi();
   Double_t convraddeg = 180.0/pi;

   while(angle < 0 || angle > 2*pi){
      if(angle < 0) angle+=2*pi;
      if(angle > 2*pi) angle-=2*pi;
   }

   if(angle >= 0 && angle <= pi/2) return angle*convraddeg - 90;
   else if(angle > pi/2 && angle <= pi) return (angle + pi)*convraddeg + 90;
   else if(angle > pi && angle <= 3*pi/2) return (angle - pi)*convraddeg - 90;
   else if(angle > 3*pi/2 && angle <= 2*pi) return angle*convraddeg + 90;
   else return 0;
}


//______________________________________________________________________________
Long64_t TSpider::GetEntriesToProcess(Long64_t firstentry, Long64_t nentries) const
{
   // return the number of entries to be processed
   // this function checks that nentries is not bigger than the number
   // of entries in the Tree or in the associated TEventlist

   Long64_t lastentry = firstentry + nentries - 1;
   if (lastentry > fTree->GetEntriesFriend()-1) {
      lastentry  = fTree->GetEntriesFriend() - 1;
      nentries   = lastentry - firstentry + 1;
   }
   //TEventList *elist = fTree->GetEventList();
   //if (elist && elist->GetN() < nentries) nentries = elist->GetN();
   TEntryList *elist = fTree->GetEntryList();
   if (elist && elist->GetN() < nentries) nentries = elist->GetN();
   return nentries;
}


//______________________________________________________________________________
void TSpider::GotoEntry(Long64_t e)
{
   // Go to a specified entry.

   if(e<fFirstEntry || e+fTree->GetScanField()>=fFirstEntry + fNentries) return;
   fEntry = e;
   SetCurrentEntries();
}


//______________________________________________________________________________
void TSpider::GotoNext()
{
   // Go to the next entries.

   if(fEntry + 2*fTree->GetScanField() -1 >= fFirstEntry + fNentries) fEntry = fFirstEntry;
   else fEntry=fCurrentEntries[fTree->GetScanField()-1]+1;
   SetCurrentEntries();
}


//______________________________________________________________________________
void TSpider::GotoPrevious()
{
   // Go to the prevous entries.

   if(fEntry-fTree->GetScanField() < fFirstEntry) fEntry = fFirstEntry + fNentries -1 - fTree->GetScanField();
   else fEntry -= fTree->GetScanField();
   SetCurrentEntries();
}


//______________________________________________________________________________
void TSpider::GotoFollowing()
{
   // Go to the next entry.

   if(fEntry + fTree->GetScanField() >= fFirstEntry + fNentries) return;
   ++fEntry;
   SetCurrentEntries();
}


//______________________________________________________________________________
void TSpider::GotoPreceding()
{
   // Go to the last entry.

   if(fEntry - 1 < fFirstEntry) return;
   --fEntry;
   SetCurrentEntries();
}


//______________________________________________________________________________
void TSpider::InitArrays(Int_t newsize)
{
   // Check if the arrays size is enough and reallocate them if not.

   if(newsize>fArraySize){

      Int_t i;
      Int_t old = fArraySize;

      while(fArraySize<newsize) fArraySize*=2;

      Double_t *memmax = new Double_t[fArraySize];
      Double_t *memmin = new Double_t[fArraySize];
      Double_t *memave = new Double_t[fArraySize];

      for(i=0;i<fArraySize;++i){
         if(i<old){
            memmax[i] = fMax[i];
            memmin[i] = fMin[i];
            memave[i] = fAve[i];
         } else {
            memmax[i] = -FLT_MAX;
            memmin[i] = FLT_MAX;
            memave[i] = 0;
         }
      }

      delete [] fMax;
      delete [] fMin;
      delete [] fAve;

      fMax = memmax;
      fMin = memmin;
      fAve = memave;
   }
}


//______________________________________________________________________________
void TSpider::InitVariables(Long64_t firstentry, Long64_t nentries)
{
   // Browse the tree to set the min, max and average value of each variable of fVar.

   UInt_t ui=0;
   Int_t i;

   fMax = new Double_t [fArraySize];
   fMin= new Double_t [fArraySize];
   fAve= new Double_t [fArraySize];

   for(i=0;i<fArraySize;++i){
      fMax[i]= -FLT_MAX;
      fMin[i]= FLT_MAX;
      fAve[i]=0;
   }

   Long64_t notSkipped=0;
   Int_t tnumber=-1;
   Long64_t entryNumber;
   Long64_t entry = firstentry;
   Int_t entriesToDisplay = nentries;
   while(entriesToDisplay!=0){
      entryNumber = fTree->GetEntryNumber(entry);
      if(entryNumber < 0) break;
      Long64_t localEntry = fTree->LoadTree(entryNumber);
      if(localEntry < 0) break;
      if(tnumber != fTree->GetTreeNumber()) {
         tnumber = fTree->GetTreeNumber();
         if(fManager) fManager->UpdateFormulaLeaves();
         else {
            for(i=0;i<=fFormulas->LastIndex();++i)
               ((TTreeFormula*)fFormulas->At(i))->UpdateFormulaLeaves();
         }
      }
      Int_t ndata=1;
      if(fForceDim){
         if(fManager)
            ndata = fManager->GetNdata(kTRUE);
         else {
            for(ui=0;ui<fNcols;++ui){
               if(ndata<((TTreeFormula*)fFormulas->At(ui))->GetNdata())
                  ndata = ((TTreeFormula*)fFormulas->At(ui))->GetNdata();
            }
            if(fSelect && fSelect->GetNdata() == 0)
               ndata = 0;
         }
      }
      Bool_t loaded = kFALSE;
      Bool_t skip = kFALSE;
      // Loop over the instances of the selection condition
      for(Int_t inst=0;inst<ndata;++inst){
         if(fSelect){
            if(fSelect->EvalInstance(inst) == 0){
               skip = kTRUE;
               ++entry;
            }
         }
         if(inst == 0) loaded = kTRUE;
         else if(!loaded){
            // EvalInstance(0) always needs to be called so that
            // the proper branches are loaded.
            for (ui=0;ui<fNcols;ui++) {
               ((TTreeFormula*)fFormulas->At(ui))->EvalInstance(0);
            }
            loaded = kTRUE;
         }
      }
      if(!skip){
         fTree->LoadTree(entryNumber);
         for(ui=0;ui<fNcols;++ui){
            Double_t inst = ((TTreeFormula*)fFormulas->At(ui))->EvalInstance();
            if(inst > fMax[ui]) fMax[ui] = inst;
            if(inst < fMin[ui]) fMin[ui] = inst;
            fAve[ui] += inst;
         }
         ++notSkipped;
         --entriesToDisplay;
         ++entry;
      }
   }
   for(ui=0;ui<fNcols;++ui) fAve[ui]/=notSkipped;
}


//______________________________________________________________________________
void TSpider::Paint(Option_t* options)
{
   // Paint the spider.

   UInt_t ui=0;
   TString opt = options;

   if(opt.Contains("n")) return;

   Double_t slice = 2*TMath::Pi()/fNcols;
   Double_t offset(1.0);
   if (!fCanvas) {
      if (gPad) fCanvas = gPad->GetCanvas();
      else return;
   }

   TLatex *txt = new TLatex();
   for(ui=0;ui<fNx*fNy;++ui){
      txt->SetTextAlign(13);
      fCanvas->cd(ui+1);
      if (fCurrentEntries) {
         txt->PaintLatex(-1.2,1.2,0,0.08,Form("#%d",(int)fCurrentEntries[ui]));
      }
      txt->SetTextSize(0.035);
      for(UInt_t var=0;var<fNcols;++var){ // Print labels.
         if(ui==0){
            txt->SetTextAlign(FindTextAlign(var*slice));
            offset = 1.09 + txt->GetTextSize();
            txt->PaintLatex(offset*TMath::Cos(var*slice),offset*TMath::Sin(var*slice),
                            FindTextAngle(var*slice),0.035,fFormulas->At(var)->GetTitle());
            offset= 1.03;
            txt->PaintLatex(offset*TMath::Cos(var*slice),offset*TMath::Sin(var*slice),
                            FindTextAngle(var*slice),0.035,Form("[%5.3f,%5.3f]",fMin[var],fMax[var]));
         }
         else {
            txt->SetTextAlign(FindTextAlign(var*slice));
            if(var*slice >=0 && var*slice <= TMath::Pi()) offset =1.13 + txt->GetTextSize();
            else offset = 1.09 + txt->GetTextSize();
            txt->PaintLatex(offset*TMath::Cos(var*slice),offset*TMath::Sin(var*slice),
                            FindTextAngle(var*slice),0.035,fFormulas->At(var)->GetTitle());
         }
      }
   }
   delete txt;
}


//______________________________________________________________________________
void TSpider::SetAverageLineStyle(Style_t sty)
{
   // Set the LineStyle of the average.

   UInt_t ui=0;

   if(fAverageSlices){
      for(ui=0;ui<fNcols;++ui) fAverageSlices[ui]->SetLineStyle(sty);
   } else if(fAveragePoly) fAveragePoly->SetLineStyle(sty);
}


//______________________________________________________________________________
void TSpider::SetAverageLineColor(Color_t col)
{
   // Set the LineColor of the average.

   UInt_t ui=0;

   if(fAverageSlices){
      for(ui=0;ui<fNcols;++ui) fAverageSlices[ui]->SetLineColor(col);
   } else if(fAveragePoly) fAveragePoly->SetLineColor(col);
}


//______________________________________________________________________________
void TSpider::SetAverageLineWidth(Width_t wid)
{
   // Set the LineWidth of the average.

   UInt_t ui=0;

   if(fAverageSlices){
      for(ui=0;ui<fNcols;++ui) fAverageSlices[ui]->SetLineWidth(wid);
   } else if(fAveragePoly) fAveragePoly->SetLineWidth(wid);
}


//______________________________________________________________________________
void TSpider::SetAverageFillColor(Color_t col)
{
   // Set the FillColor of the average.

   UInt_t ui=0;

   if(fAverageSlices){
      for(ui=0;ui<fNcols;++ui) fAverageSlices[ui]->SetFillColor(col);
   } else if(fAveragePoly) fAveragePoly->SetFillColor(col);
}


//______________________________________________________________________________
void TSpider::SetAverageFillStyle(Style_t sty)
{
   // Set the FillStyle of the average.

   UInt_t ui=0;

   if(fAverageSlices){
      for(ui=0;ui<fNcols;++ui) fAverageSlices[ui]->SetFillStyle(sty);
   } else if(fAveragePoly) fAveragePoly->SetFillStyle(sty);
}


//______________________________________________________________________________
void TSpider::SetDisplayAverage(Bool_t disp)
{
   // Display or not the average.

   if(disp == fDisplayAverage) return;

   UInt_t ui=0;

   fDisplayAverage = disp;
   delete fAveragePoly;
   fAveragePoly = NULL;
   if(fAverageSlices){
      for(ui = 0;ui<fNcols;++ui) delete fAverageSlices[ui];
   }
   delete [] fAverageSlices;
   fAverageSlices = NULL;

   for(ui=0;ui<fNx*fNy;++ui){
      fCanvas->cd(ui+1);
      gPad->Clear();
   }

   for(ui = 0; ui < fNx*fNy; ++ui){
      fCanvas->cd(ui+1);
      fPolargram->Draw("pn");
      fTree->LoadTree(fCurrentEntries[ui]);
      if(fSegmentDisplay){
         if(disp) DrawSlicesAverage("");
         DrawSlices("");
      } else {
         if(disp) DrawPolyAverage("");
         DrawPoly("");
      }
      AppendPad();
   }
   fCanvas->Modified();
   fCanvas->Update();
}


//______________________________________________________________________________
void TSpider::SetCurrentEntries()
{
   // Set the current selected entries.

   Int_t i;
   UInt_t ui=0;
   Int_t tnumber=-1;
   Long64_t entryNumber;
   Long64_t entry = fEntry;
   Int_t entriesToDisplay = fTree->GetScanField();

   if(!fCurrentEntries) fCurrentEntries = new Long64_t[fTree->GetScanField()];

   while(entriesToDisplay!=0){
      entryNumber = fTree->GetEntryNumber(entry);
      if(entryNumber < 0) break;
      Long64_t localEntry = fTree->LoadTree(entryNumber);
      if(localEntry < 0) break;
      if(tnumber != fTree->GetTreeNumber()) {
         tnumber = fTree->GetTreeNumber();
         if(fManager) fManager->UpdateFormulaLeaves();
         else {
            for(i=0;i<=fFormulas->LastIndex();++i)
               ((TTreeFormula*)fFormulas->At(i))->UpdateFormulaLeaves();
         }
      }
      Int_t ndata=1;
      if(fForceDim){
         if(fManager)
            ndata = fManager->GetNdata(kTRUE);
         else {
            for(ui=0;ui<fNcols;++ui){
               if(ndata < ((TTreeFormula*)fFormulas->At(ui))->GetNdata())
                  ndata = ((TTreeFormula*)fFormulas->At(ui))->GetNdata();
            }
            if(fSelect && fSelect->GetNdata() == 0)
               ndata = 0;
         }
      }
      Bool_t loaded = kFALSE;
      Bool_t skip = kFALSE;
      // Loop over the instances of the selection condition
      for(Int_t inst=0;inst<ndata;++inst){
         if(fSelect){
            if(fSelect->EvalInstance(inst) == 0){
               skip = kTRUE;
               ++entry;
            }
         }
         if(inst == 0) loaded = kTRUE;
         else if(!loaded){
            // EvalInstance(0) always needs to be called so that
            // the proper branches are loaded.
            for (ui=0;ui<fNcols;ui++) {
               ((TTreeFormula*)fFormulas->At(ui))->EvalInstance(0);
            }
            loaded = kTRUE;
         }
      }
      if(!skip){
          fCurrentEntries[fTree->GetScanField()-entriesToDisplay] = entryNumber;
         --entriesToDisplay;
         ++entry;
      }
   }
   if(fPolyList) UpdateView();
}


//______________________________________________________________________________
void TSpider::SetLineStyle(Style_t sty)
{
   // Set line style.

   UInt_t ui=0;

   TAttLine::SetLineStyle(sty);
   for(ui=0; ui<fNx*fNy;++ui){
      if(fSegmentDisplay){
         TList *li = (TList*)fPolyList->At(ui);
         for(UInt_t var=0;var<fNcols;++var) ((TArc*)li->At(var))->SetLineStyle(sty);
      } else ((TPolyLine*)fPolyList->At(ui))->SetLineStyle(sty);
   }
}


//______________________________________________________________________________
void TSpider::SetLineColor(Color_t col)
{
   // Set lin color.

   UInt_t ui=0;

   TAttLine::SetLineColor(col);
   for(ui=0; ui<fNx*fNy;++ui){
      if(fSegmentDisplay){
         TList *li = (TList*)fPolyList->At(ui);
         for(UInt_t var=0;var<fNcols;++var) ((TArc*)li->At(var))->SetLineColor(col);
      } else ((TPolyLine*)fPolyList->At(ui))->SetLineColor(col);
   }
}


//______________________________________________________________________________
void TSpider::SetLineWidth(Width_t wid)
{
   //Set line width.

   UInt_t ui=0;

   TAttLine::SetLineWidth(wid);
   for(ui=0; ui<fNx*fNy;++ui){
      if(fSegmentDisplay){
         TList *li = (TList*)fPolyList->At(ui);
         for(UInt_t var=0;var<fNcols;++var) ((TArc*)li->At(var))->SetLineWidth(wid);
      } else ((TPolyLine*)fPolyList->At(ui))->SetLineWidth(wid);
   }
}


//______________________________________________________________________________
void TSpider::SetFillColor(Color_t col)
{
   // Set fill color.

   UInt_t ui=0;

   TAttFill::SetFillColor(col);
   for(ui=0; ui<fNx*fNy;++ui){
      if(fSegmentDisplay){
         TList *li = (TList*)fPolyList->At(ui);
         for(UInt_t var=0;var<fNcols;++var) ((TArc*)li->At(var))->SetFillColor(col);
      } else ((TPolyLine*)fPolyList->At(ui))->SetFillColor(col);
   }
}


//______________________________________________________________________________
void TSpider::SetFillStyle(Style_t sty)
{
   // Set fill style.

   UInt_t ui=0;

   TAttFill::SetFillStyle(sty);
   for(ui=0; ui<fNx*fNy;++ui){
      if(fSegmentDisplay){
         TList *li = (TList*)fPolyList->At(ui);
         for(UInt_t var=0;var<fNcols;++var) ((TArc*)li->At(var))->SetFillStyle(sty);
      } else ((TPolyLine*)fPolyList->At(ui))->SetFillStyle(sty);
   }
}


//______________________________________________________________________________
void TSpider::SetNdivRadial(Int_t ndiv)
{
   // Set number of radial divisions.

   if(fPolargram->GetNdivRadial() == ndiv) return;
   fPolargram->SetNdivRadial(ndiv);
}


//______________________________________________________________________________
void TSpider::SetNx(UInt_t nx)
{
   // Set the X number of subpads.

   if(fNx == nx || nx <= 0) return;
   fEntry = fCurrentEntries[0];

   UInt_t ui=0;
   Color_t lc;
   Style_t lt;
   Width_t lw;
   Color_t fc;
   Style_t fs;
   if(fAverageSlices){
      lc = fAverageSlices[0]->GetLineColor();
      lt = fAverageSlices[0]->GetLineStyle();
      lw = fAverageSlices[0]->GetLineWidth();
      fc = fAverageSlices[0]->GetFillColor();
      fs = fAverageSlices[0]->GetFillStyle();
   } else {
      lc = fAveragePoly->GetLineColor();
      lt = fAveragePoly->GetLineStyle();
      lw = fAveragePoly->GetLineWidth();
      fc = fAveragePoly->GetFillColor();
      fs = fAveragePoly->GetFillStyle();
   }

   if(fSegmentDisplay){
      for(ui=0; ui<fNx*fNy;++ui) ((TList*)fPolyList->At(ui))->Delete();
   }
   fPolyList->Delete();
   delete fPolyList;
   fPolyList = NULL;
   delete [] fCurrentEntries;
   fCurrentEntries = NULL;

   fNx = nx;

   fTree->SetScanField(fNx*fNy);
   SetCurrentEntries();
   fCanvas->Clear();
   fCanvas->Divide(fNx,fNy);

   for(ui=0; ui < fNx*fNy;++ui){
      fCanvas->cd(ui+1);
      fPolargram->Draw("pn");
      fTree->LoadTree(fCurrentEntries[ui]);
      if(fSegmentDisplay){
         if(fDisplayAverage) DrawSlicesAverage("");
         DrawSlices("");
      } else {
         if(fDisplayAverage) DrawPolyAverage("");
         DrawPoly("");
      }
      AppendPad();
   }

   if(fAverageSlices){
      for(ui = 0;ui<fNcols;++ui){
         fAverageSlices[ui]->SetLineColor(lc);
         fAverageSlices[ui]->SetLineStyle(lt);
         fAverageSlices[ui]->SetLineWidth(lw);
         fAverageSlices[ui]->SetFillColor(fc);
         fAverageSlices[ui]->SetFillStyle(fs);
      }
   } else {
      fAveragePoly->SetLineColor(lc);
      fAveragePoly->SetLineStyle(lt);
      fAveragePoly->SetLineWidth(lw);
      fAveragePoly->SetFillColor(fc);
      fAveragePoly->SetFillStyle(fs);
   }
}


//______________________________________________________________________________
void TSpider::SetNy(UInt_t ny)
{
   // Set the Y number of subpads.

   if(fNy == ny || ny <= 0) return;
   fEntry = fCurrentEntries[0];

   UInt_t ui=0;
   Color_t lc;
   Style_t lt;
   Width_t lw;
   Color_t fc;
   Style_t fs;
   if(fAverageSlices){
      lc = fAverageSlices[0]->GetLineColor();
      lt = fAverageSlices[0]->GetLineStyle();
      lw = fAverageSlices[0]->GetLineWidth();
      fc = fAverageSlices[0]->GetFillColor();
      fs = fAverageSlices[0]->GetFillStyle();
   } else {
      lc = fAveragePoly->GetLineColor();
      lt = fAveragePoly->GetLineStyle();
      lw = fAveragePoly->GetLineWidth();
      fc = fAveragePoly->GetFillColor();
      fs = fAveragePoly->GetFillStyle();
   }

   if(fSegmentDisplay){
      for(ui=0; ui<fNx*fNy;++ui) ((TList*)fPolyList->At(ui))->Delete();
   }
   fPolyList->Delete();
   delete fPolyList;
   fPolyList = NULL;
   delete [] fCurrentEntries;
   fCurrentEntries = NULL;

   fNy = ny;

   fTree->SetScanField(fNx*fNy);
   SetCurrentEntries();
   fCanvas->Clear();
   fCanvas->Divide(fNx,fNy);

   for(ui=0; ui < fNx*fNy;++ui){
      fCanvas->cd(ui+1);
      fPolargram->Draw("pn");
      fTree->LoadTree(fCurrentEntries[ui]);
      if(fSegmentDisplay){
         if(fDisplayAverage) DrawSlicesAverage("");
         DrawSlices("");
      } else {
         if(fDisplayAverage) DrawPolyAverage("");
         DrawPoly("");
      }
      AppendPad();
   }

   if(fAverageSlices){
      for(ui = 0;ui<fNcols;++ui){
         fAverageSlices[ui]->SetLineColor(lc);
         fAverageSlices[ui]->SetLineStyle(lt);
         fAverageSlices[ui]->SetLineWidth(lw);
         fAverageSlices[ui]->SetFillColor(fc);
         fAverageSlices[ui]->SetFillStyle(fs);
      }
   } else {
      fAveragePoly->SetLineColor(lc);
      fAveragePoly->SetLineStyle(lt);
      fAveragePoly->SetLineWidth(lw);
      fAveragePoly->SetFillColor(fc);
      fAveragePoly->SetFillStyle(fs);
   }
}


//______________________________________________________________________________
void TSpider::SetSegmentDisplay(Bool_t seg)
{
   // Set the segment display or not.

   if(seg == fSegmentDisplay) return;

   UInt_t ui=0;

   if(fSegmentDisplay){
      for(ui=0;ui<fNx*fNy;++ui){
         ((TList*)fPolyList->At(ui))->Delete();
      }
   }
   fPolyList->Delete();

   Color_t lc;
   Style_t lt;
   Width_t lw;
   Color_t fc;
   Style_t fs;
   if(fAverageSlices){
      lc = fAverageSlices[0]->GetLineColor();
      lt = fAverageSlices[0]->GetLineStyle();
      lw = fAverageSlices[0]->GetLineWidth();
      fc = fAverageSlices[0]->GetFillColor();
      fs = fAverageSlices[0]->GetFillStyle();
   } else {
      lc = fAveragePoly->GetLineColor();
      lt = fAveragePoly->GetLineStyle();
      lw = fAveragePoly->GetLineWidth();
      fc = fAveragePoly->GetFillColor();
      fs = fAveragePoly->GetFillStyle();
   }
   delete fPolyList;
   fPolyList = NULL;
   if(fAverageSlices){
      for(ui=0;ui<fNcols;++ui) delete fAverageSlices[ui];
   }
   delete [] fAverageSlices;
   fAverageSlices = NULL;
   delete fAveragePoly;
   fAveragePoly = NULL;

   for(ui=0;ui<fNx*fNy;++ui){
      fCanvas->cd(ui+1);
      gPad->Clear();
   }

   fSegmentDisplay = seg;

   for(ui=0; ui < fNx*fNy;++ui){
      fCanvas->cd(ui+1);
      fPolargram->Draw("pn");
      fTree->LoadTree(fCurrentEntries[ui]);
      if(fSegmentDisplay){
         if(fDisplayAverage) DrawSlicesAverage("");
         DrawSlices("");
      } else {
         if(fDisplayAverage) DrawPolyAverage("");
         DrawPoly("");
      }
      AppendPad();
   }

   if(fAverageSlices){
      for(ui=0;ui<fNcols;++ui){
         fAverageSlices[ui]->SetLineColor(lc);
         fAverageSlices[ui]->SetLineStyle(lt);
         fAverageSlices[ui]->SetLineWidth(lw);
         fAverageSlices[ui]->SetFillColor(fc);
         fAverageSlices[ui]->SetFillStyle(fs);
      }
   } else {
      fAveragePoly->SetLineColor(lc);
      fAveragePoly->SetLineStyle(lt);
      fAveragePoly->SetLineWidth(lw);
      fAveragePoly->SetFillColor(fc);
      fAveragePoly->SetFillStyle(fs);
   }

   fCanvas->Modified();
   fCanvas->Update();
}




//______________________________________________________________________________
void TSpider::SetSelectionExpression(const char* selection)
{
   // Compile selection expression if there is one.

   if (selection && strlen(selection)) {
      fSelect = new TTreeFormula("Selection",selection,fTree);
   //         if (!fSelect) return -1;
   //         if (!fSelect->GetNdim()) { delete fSelect; return -1; }
      fFormulas->Add(fSelect);
   }
}


//______________________________________________________________________________
void TSpider::SetVariablesExpression(const char* varexp)
{
   // Compile the variables expression from the given string varexp.

   UInt_t ui=0;
   Int_t nch,i;
   TString onerow;
   Int_t *index = NULL;

   fNcols=8;

   TObjArray *leaves = fTree->GetListOfLeaves();
   UInt_t nleaves = leaves->GetEntriesFast();
   if (nleaves < fNcols) fNcols = nleaves;
   nch = varexp ? strlen(varexp) : 0;

   // if varexp is empty, take first 8 columns by default
   Int_t allvar = 0;
   TString *cnames = new TString[fArraySize];
   if (!strcmp(varexp, "*")) { fNcols = nleaves; allvar = 1; }
   if (nch == 0 || allvar) {
      for(i=0;i<fArraySize;++i) cnames[i]="";
      UInt_t ncs = fNcols;
      fNcols = 0;
      for (ui=0;ui<ncs;++ui) {
         TLeaf *lf = (TLeaf*)leaves->At(ui);
         if (lf->GetBranch()->GetListOfBranches()->GetEntries() > 0) continue;
         cnames[fNcols] = lf->GetName();
         fNcols++;
      }
      // otherwise select only the specified columns
   } else {
      fNcols = 1;
      onerow = varexp;
      for (i=0;i<onerow.Length();i++) {
         if (onerow[i] == ':') {
            if (onerow[i+1] == ':') ++i;
            else fNcols++;
         }
      }
      for(i=0;i<fArraySize;++i) cnames[i]="";
      index  = new Int_t[fNcols+1];
      fSelector->MakeIndex(onerow,index);
      for (ui=0;ui<fNcols;ui++) {
         cnames[ui] = fSelector->GetNameByIndex(onerow,index,ui);
      }
      delete [] index;
   }

   // Create the TreeFormula objects corresponding to each column
   for (ui=0;ui<fNcols;ui++) {
      fFormulas->Add(new TTreeFormula("Var1",cnames[ui].Data(),fTree));
   }
}


//______________________________________________________________________________
void TSpider::SyncFormulas()
{
   // Create a TreeFormulaManager to coordinate the formulas.

   Int_t i;
   if (fFormulas->LastIndex()>=0) {
      if (fSelect) {
         if (fSelect->GetManager()->GetMultiplicity() > 0 ) {
            if(!fManager) fManager = new TTreeFormulaManager;
            for(i=0;i<=fFormulas->LastIndex();i++) {
               fManager->Add((TTreeFormula*)fFormulas->At(i));
            }
            fManager->Sync();
         }
      }
      for(i=0;i<=fFormulas->LastIndex();i++) {
         TTreeFormula *form = ((TTreeFormula*)fFormulas->At(i));
         switch( form->GetManager()->GetMultiplicity() ) {
            case  1:
            case  2:
            case -1:
               fForceDim = kTRUE;
               break;
            case  0:
               break;
         }

      }
   }
}


//______________________________________________________________________________
void TSpider::UpdateView()
{
   // Update the polylines or the arcs for the current entries.

   Double_t slice = 2*TMath::Pi()/fNcols;

   Double_t x,y,r;

   for(UInt_t pad=1;pad <= fNx*fNy;++pad){
      fTree->LoadTree(fCurrentEntries[pad-1]);
      for(UInt_t i=0;i<fNcols;++i){
         r = (((TTreeFormula*)fFormulas->At(i))->EvalInstance()-fMin[i])/(fMax[i]-fMin[i]);
         x=r*TMath::Cos(i*slice);
         y=r*TMath::Sin(i*slice);
         if(!fSegmentDisplay) ((TPolyLine*)fPolyList->At(pad-1))->SetPoint(i,x,y);
         else {
            ((TArc*)((TList*)fPolyList->At(pad-1))->At(i))->SetR1(r);
            ((TArc*)((TList*)fPolyList->At(pad-1))->At(i))->SetR2(r);
         }
      }
      x=(((TTreeFormula*)fFormulas->At(0))->EvalInstance()-fMin[0])/(fMax[0]-fMin[0]);
      y=0;
      if(!fSegmentDisplay) ((TPolyLine*)fPolyList->At(pad-1))->SetPoint(fNcols,x,y);
   }
}
 TSpider.cxx:1
 TSpider.cxx:2
 TSpider.cxx:3
 TSpider.cxx:4
 TSpider.cxx:5
 TSpider.cxx:6
 TSpider.cxx:7
 TSpider.cxx:8
 TSpider.cxx:9
 TSpider.cxx:10
 TSpider.cxx:11
 TSpider.cxx:12
 TSpider.cxx:13
 TSpider.cxx:14
 TSpider.cxx:15
 TSpider.cxx:16
 TSpider.cxx:17
 TSpider.cxx:18
 TSpider.cxx:19
 TSpider.cxx:20
 TSpider.cxx:21
 TSpider.cxx:22
 TSpider.cxx:23
 TSpider.cxx:24
 TSpider.cxx:25
 TSpider.cxx:26
 TSpider.cxx:27
 TSpider.cxx:28
 TSpider.cxx:29
 TSpider.cxx:30
 TSpider.cxx:31
 TSpider.cxx:32
 TSpider.cxx:33
 TSpider.cxx:34
 TSpider.cxx:35
 TSpider.cxx:36
 TSpider.cxx:37
 TSpider.cxx:38
 TSpider.cxx:39
 TSpider.cxx:40
 TSpider.cxx:41
 TSpider.cxx:42
 TSpider.cxx:43
 TSpider.cxx:44
 TSpider.cxx:45
 TSpider.cxx:46
 TSpider.cxx:47
 TSpider.cxx:48
 TSpider.cxx:49
 TSpider.cxx:50
 TSpider.cxx:51
 TSpider.cxx:52
 TSpider.cxx:53
 TSpider.cxx:54
 TSpider.cxx:55
 TSpider.cxx:56
 TSpider.cxx:57
 TSpider.cxx:58
 TSpider.cxx:59
 TSpider.cxx:60
 TSpider.cxx:61
 TSpider.cxx:62
 TSpider.cxx:63
 TSpider.cxx:64
 TSpider.cxx:65
 TSpider.cxx:66
 TSpider.cxx:67
 TSpider.cxx:68
 TSpider.cxx:69
 TSpider.cxx:70
 TSpider.cxx:71
 TSpider.cxx:72
 TSpider.cxx:73
 TSpider.cxx:74
 TSpider.cxx:75
 TSpider.cxx:76
 TSpider.cxx:77
 TSpider.cxx:78
 TSpider.cxx:79
 TSpider.cxx:80
 TSpider.cxx:81
 TSpider.cxx:82
 TSpider.cxx:83
 TSpider.cxx:84
 TSpider.cxx:85
 TSpider.cxx:86
 TSpider.cxx:87
 TSpider.cxx:88
 TSpider.cxx:89
 TSpider.cxx:90
 TSpider.cxx:91
 TSpider.cxx:92
 TSpider.cxx:93
 TSpider.cxx:94
 TSpider.cxx:95
 TSpider.cxx:96
 TSpider.cxx:97
 TSpider.cxx:98
 TSpider.cxx:99
 TSpider.cxx:100
 TSpider.cxx:101
 TSpider.cxx:102
 TSpider.cxx:103
 TSpider.cxx:104
 TSpider.cxx:105
 TSpider.cxx:106
 TSpider.cxx:107
 TSpider.cxx:108
 TSpider.cxx:109
 TSpider.cxx:110
 TSpider.cxx:111
 TSpider.cxx:112
 TSpider.cxx:113
 TSpider.cxx:114
 TSpider.cxx:115
 TSpider.cxx:116
 TSpider.cxx:117
 TSpider.cxx:118
 TSpider.cxx:119
 TSpider.cxx:120
 TSpider.cxx:121
 TSpider.cxx:122
 TSpider.cxx:123
 TSpider.cxx:124
 TSpider.cxx:125
 TSpider.cxx:126
 TSpider.cxx:127
 TSpider.cxx:128
 TSpider.cxx:129
 TSpider.cxx:130
 TSpider.cxx:131
 TSpider.cxx:132
 TSpider.cxx:133
 TSpider.cxx:134
 TSpider.cxx:135
 TSpider.cxx:136
 TSpider.cxx:137
 TSpider.cxx:138
 TSpider.cxx:139
 TSpider.cxx:140
 TSpider.cxx:141
 TSpider.cxx:142
 TSpider.cxx:143
 TSpider.cxx:144
 TSpider.cxx:145
 TSpider.cxx:146
 TSpider.cxx:147
 TSpider.cxx:148
 TSpider.cxx:149
 TSpider.cxx:150
 TSpider.cxx:151
 TSpider.cxx:152
 TSpider.cxx:153
 TSpider.cxx:154
 TSpider.cxx:155
 TSpider.cxx:156
 TSpider.cxx:157
 TSpider.cxx:158
 TSpider.cxx:159
 TSpider.cxx:160
 TSpider.cxx:161
 TSpider.cxx:162
 TSpider.cxx:163
 TSpider.cxx:164
 TSpider.cxx:165
 TSpider.cxx:166
 TSpider.cxx:167
 TSpider.cxx:168
 TSpider.cxx:169
 TSpider.cxx:170
 TSpider.cxx:171
 TSpider.cxx:172
 TSpider.cxx:173
 TSpider.cxx:174
 TSpider.cxx:175
 TSpider.cxx:176
 TSpider.cxx:177
 TSpider.cxx:178
 TSpider.cxx:179
 TSpider.cxx:180
 TSpider.cxx:181
 TSpider.cxx:182
 TSpider.cxx:183
 TSpider.cxx:184
 TSpider.cxx:185
 TSpider.cxx:186
 TSpider.cxx:187
 TSpider.cxx:188
 TSpider.cxx:189
 TSpider.cxx:190
 TSpider.cxx:191
 TSpider.cxx:192
 TSpider.cxx:193
 TSpider.cxx:194
 TSpider.cxx:195
 TSpider.cxx:196
 TSpider.cxx:197
 TSpider.cxx:198
 TSpider.cxx:199
 TSpider.cxx:200
 TSpider.cxx:201
 TSpider.cxx:202
 TSpider.cxx:203
 TSpider.cxx:204
 TSpider.cxx:205
 TSpider.cxx:206
 TSpider.cxx:207
 TSpider.cxx:208
 TSpider.cxx:209
 TSpider.cxx:210
 TSpider.cxx:211
 TSpider.cxx:212
 TSpider.cxx:213
 TSpider.cxx:214
 TSpider.cxx:215
 TSpider.cxx:216
 TSpider.cxx:217
 TSpider.cxx:218
 TSpider.cxx:219
 TSpider.cxx:220
 TSpider.cxx:221
 TSpider.cxx:222
 TSpider.cxx:223
 TSpider.cxx:224
 TSpider.cxx:225
 TSpider.cxx:226
 TSpider.cxx:227
 TSpider.cxx:228
 TSpider.cxx:229
 TSpider.cxx:230
 TSpider.cxx:231
 TSpider.cxx:232
 TSpider.cxx:233
 TSpider.cxx:234
 TSpider.cxx:235
 TSpider.cxx:236
 TSpider.cxx:237
 TSpider.cxx:238
 TSpider.cxx:239
 TSpider.cxx:240
 TSpider.cxx:241
 TSpider.cxx:242
 TSpider.cxx:243
 TSpider.cxx:244
 TSpider.cxx:245
 TSpider.cxx:246
 TSpider.cxx:247
 TSpider.cxx:248
 TSpider.cxx:249
 TSpider.cxx:250
 TSpider.cxx:251
 TSpider.cxx:252
 TSpider.cxx:253
 TSpider.cxx:254
 TSpider.cxx:255
 TSpider.cxx:256
 TSpider.cxx:257
 TSpider.cxx:258
 TSpider.cxx:259
 TSpider.cxx:260
 TSpider.cxx:261
 TSpider.cxx:262
 TSpider.cxx:263
 TSpider.cxx:264
 TSpider.cxx:265
 TSpider.cxx:266
 TSpider.cxx:267
 TSpider.cxx:268
 TSpider.cxx:269
 TSpider.cxx:270
 TSpider.cxx:271
 TSpider.cxx:272
 TSpider.cxx:273
 TSpider.cxx:274
 TSpider.cxx:275
 TSpider.cxx:276
 TSpider.cxx:277
 TSpider.cxx:278
 TSpider.cxx:279
 TSpider.cxx:280
 TSpider.cxx:281
 TSpider.cxx:282
 TSpider.cxx:283
 TSpider.cxx:284
 TSpider.cxx:285
 TSpider.cxx:286
 TSpider.cxx:287
 TSpider.cxx:288
 TSpider.cxx:289
 TSpider.cxx:290
 TSpider.cxx:291
 TSpider.cxx:292
 TSpider.cxx:293
 TSpider.cxx:294
 TSpider.cxx:295
 TSpider.cxx:296
 TSpider.cxx:297
 TSpider.cxx:298
 TSpider.cxx:299
 TSpider.cxx:300
 TSpider.cxx:301
 TSpider.cxx:302
 TSpider.cxx:303
 TSpider.cxx:304
 TSpider.cxx:305
 TSpider.cxx:306
 TSpider.cxx:307
 TSpider.cxx:308
 TSpider.cxx:309
 TSpider.cxx:310
 TSpider.cxx:311
 TSpider.cxx:312
 TSpider.cxx:313
 TSpider.cxx:314
 TSpider.cxx:315
 TSpider.cxx:316
 TSpider.cxx:317
 TSpider.cxx:318
 TSpider.cxx:319
 TSpider.cxx:320
 TSpider.cxx:321
 TSpider.cxx:322
 TSpider.cxx:323
 TSpider.cxx:324
 TSpider.cxx:325
 TSpider.cxx:326
 TSpider.cxx:327
 TSpider.cxx:328
 TSpider.cxx:329
 TSpider.cxx:330
 TSpider.cxx:331
 TSpider.cxx:332
 TSpider.cxx:333
 TSpider.cxx:334
 TSpider.cxx:335
 TSpider.cxx:336
 TSpider.cxx:337
 TSpider.cxx:338
 TSpider.cxx:339
 TSpider.cxx:340
 TSpider.cxx:341
 TSpider.cxx:342
 TSpider.cxx:343
 TSpider.cxx:344
 TSpider.cxx:345
 TSpider.cxx:346
 TSpider.cxx:347
 TSpider.cxx:348
 TSpider.cxx:349
 TSpider.cxx:350
 TSpider.cxx:351
 TSpider.cxx:352
 TSpider.cxx:353
 TSpider.cxx:354
 TSpider.cxx:355
 TSpider.cxx:356
 TSpider.cxx:357
 TSpider.cxx:358
 TSpider.cxx:359
 TSpider.cxx:360
 TSpider.cxx:361
 TSpider.cxx:362
 TSpider.cxx:363
 TSpider.cxx:364
 TSpider.cxx:365
 TSpider.cxx:366
 TSpider.cxx:367
 TSpider.cxx:368
 TSpider.cxx:369
 TSpider.cxx:370
 TSpider.cxx:371
 TSpider.cxx:372
 TSpider.cxx:373
 TSpider.cxx:374
 TSpider.cxx:375
 TSpider.cxx:376
 TSpider.cxx:377
 TSpider.cxx:378
 TSpider.cxx:379
 TSpider.cxx:380
 TSpider.cxx:381
 TSpider.cxx:382
 TSpider.cxx:383
 TSpider.cxx:384
 TSpider.cxx:385
 TSpider.cxx:386
 TSpider.cxx:387
 TSpider.cxx:388
 TSpider.cxx:389
 TSpider.cxx:390
 TSpider.cxx:391
 TSpider.cxx:392
 TSpider.cxx:393
 TSpider.cxx:394
 TSpider.cxx:395
 TSpider.cxx:396
 TSpider.cxx:397
 TSpider.cxx:398
 TSpider.cxx:399
 TSpider.cxx:400
 TSpider.cxx:401
 TSpider.cxx:402
 TSpider.cxx:403
 TSpider.cxx:404
 TSpider.cxx:405
 TSpider.cxx:406
 TSpider.cxx:407
 TSpider.cxx:408
 TSpider.cxx:409
 TSpider.cxx:410
 TSpider.cxx:411
 TSpider.cxx:412
 TSpider.cxx:413
 TSpider.cxx:414
 TSpider.cxx:415
 TSpider.cxx:416
 TSpider.cxx:417
 TSpider.cxx:418
 TSpider.cxx:419
 TSpider.cxx:420
 TSpider.cxx:421
 TSpider.cxx:422
 TSpider.cxx:423
 TSpider.cxx:424
 TSpider.cxx:425
 TSpider.cxx:426
 TSpider.cxx:427
 TSpider.cxx:428
 TSpider.cxx:429
 TSpider.cxx:430
 TSpider.cxx:431
 TSpider.cxx:432
 TSpider.cxx:433
 TSpider.cxx:434
 TSpider.cxx:435
 TSpider.cxx:436
 TSpider.cxx:437
 TSpider.cxx:438
 TSpider.cxx:439
 TSpider.cxx:440
 TSpider.cxx:441
 TSpider.cxx:442
 TSpider.cxx:443
 TSpider.cxx:444
 TSpider.cxx:445
 TSpider.cxx:446
 TSpider.cxx:447
 TSpider.cxx:448
 TSpider.cxx:449
 TSpider.cxx:450
 TSpider.cxx:451
 TSpider.cxx:452
 TSpider.cxx:453
 TSpider.cxx:454
 TSpider.cxx:455
 TSpider.cxx:456
 TSpider.cxx:457
 TSpider.cxx:458
 TSpider.cxx:459
 TSpider.cxx:460
 TSpider.cxx:461
 TSpider.cxx:462
 TSpider.cxx:463
 TSpider.cxx:464
 TSpider.cxx:465
 TSpider.cxx:466
 TSpider.cxx:467
 TSpider.cxx:468
 TSpider.cxx:469
 TSpider.cxx:470
 TSpider.cxx:471
 TSpider.cxx:472
 TSpider.cxx:473
 TSpider.cxx:474
 TSpider.cxx:475
 TSpider.cxx:476
 TSpider.cxx:477
 TSpider.cxx:478
 TSpider.cxx:479
 TSpider.cxx:480
 TSpider.cxx:481
 TSpider.cxx:482
 TSpider.cxx:483
 TSpider.cxx:484
 TSpider.cxx:485
 TSpider.cxx:486
 TSpider.cxx:487
 TSpider.cxx:488
 TSpider.cxx:489
 TSpider.cxx:490
 TSpider.cxx:491
 TSpider.cxx:492
 TSpider.cxx:493
 TSpider.cxx:494
 TSpider.cxx:495
 TSpider.cxx:496
 TSpider.cxx:497
 TSpider.cxx:498
 TSpider.cxx:499
 TSpider.cxx:500
 TSpider.cxx:501
 TSpider.cxx:502
 TSpider.cxx:503
 TSpider.cxx:504
 TSpider.cxx:505
 TSpider.cxx:506
 TSpider.cxx:507
 TSpider.cxx:508
 TSpider.cxx:509
 TSpider.cxx:510
 TSpider.cxx:511
 TSpider.cxx:512
 TSpider.cxx:513
 TSpider.cxx:514
 TSpider.cxx:515
 TSpider.cxx:516
 TSpider.cxx:517
 TSpider.cxx:518
 TSpider.cxx:519
 TSpider.cxx:520
 TSpider.cxx:521
 TSpider.cxx:522
 TSpider.cxx:523
 TSpider.cxx:524
 TSpider.cxx:525
 TSpider.cxx:526
 TSpider.cxx:527
 TSpider.cxx:528
 TSpider.cxx:529
 TSpider.cxx:530
 TSpider.cxx:531
 TSpider.cxx:532
 TSpider.cxx:533
 TSpider.cxx:534
 TSpider.cxx:535
 TSpider.cxx:536
 TSpider.cxx:537
 TSpider.cxx:538
 TSpider.cxx:539
 TSpider.cxx:540
 TSpider.cxx:541
 TSpider.cxx:542
 TSpider.cxx:543
 TSpider.cxx:544
 TSpider.cxx:545
 TSpider.cxx:546
 TSpider.cxx:547
 TSpider.cxx:548
 TSpider.cxx:549
 TSpider.cxx:550
 TSpider.cxx:551
 TSpider.cxx:552
 TSpider.cxx:553
 TSpider.cxx:554
 TSpider.cxx:555
 TSpider.cxx:556
 TSpider.cxx:557
 TSpider.cxx:558
 TSpider.cxx:559
 TSpider.cxx:560
 TSpider.cxx:561
 TSpider.cxx:562
 TSpider.cxx:563
 TSpider.cxx:564
 TSpider.cxx:565
 TSpider.cxx:566
 TSpider.cxx:567
 TSpider.cxx:568
 TSpider.cxx:569
 TSpider.cxx:570
 TSpider.cxx:571
 TSpider.cxx:572
 TSpider.cxx:573
 TSpider.cxx:574
 TSpider.cxx:575
 TSpider.cxx:576
 TSpider.cxx:577
 TSpider.cxx:578
 TSpider.cxx:579
 TSpider.cxx:580
 TSpider.cxx:581
 TSpider.cxx:582
 TSpider.cxx:583
 TSpider.cxx:584
 TSpider.cxx:585
 TSpider.cxx:586
 TSpider.cxx:587
 TSpider.cxx:588
 TSpider.cxx:589
 TSpider.cxx:590
 TSpider.cxx:591
 TSpider.cxx:592
 TSpider.cxx:593
 TSpider.cxx:594
 TSpider.cxx:595
 TSpider.cxx:596
 TSpider.cxx:597
 TSpider.cxx:598
 TSpider.cxx:599
 TSpider.cxx:600
 TSpider.cxx:601
 TSpider.cxx:602
 TSpider.cxx:603
 TSpider.cxx:604
 TSpider.cxx:605
 TSpider.cxx:606
 TSpider.cxx:607
 TSpider.cxx:608
 TSpider.cxx:609
 TSpider.cxx:610
 TSpider.cxx:611
 TSpider.cxx:612
 TSpider.cxx:613
 TSpider.cxx:614
 TSpider.cxx:615
 TSpider.cxx:616
 TSpider.cxx:617
 TSpider.cxx:618
 TSpider.cxx:619
 TSpider.cxx:620
 TSpider.cxx:621
 TSpider.cxx:622
 TSpider.cxx:623
 TSpider.cxx:624
 TSpider.cxx:625
 TSpider.cxx:626
 TSpider.cxx:627
 TSpider.cxx:628
 TSpider.cxx:629
 TSpider.cxx:630
 TSpider.cxx:631
 TSpider.cxx:632
 TSpider.cxx:633
 TSpider.cxx:634
 TSpider.cxx:635
 TSpider.cxx:636
 TSpider.cxx:637
 TSpider.cxx:638
 TSpider.cxx:639
 TSpider.cxx:640
 TSpider.cxx:641
 TSpider.cxx:642
 TSpider.cxx:643
 TSpider.cxx:644
 TSpider.cxx:645
 TSpider.cxx:646
 TSpider.cxx:647
 TSpider.cxx:648
 TSpider.cxx:649
 TSpider.cxx:650
 TSpider.cxx:651
 TSpider.cxx:652
 TSpider.cxx:653
 TSpider.cxx:654
 TSpider.cxx:655
 TSpider.cxx:656
 TSpider.cxx:657
 TSpider.cxx:658
 TSpider.cxx:659
 TSpider.cxx:660
 TSpider.cxx:661
 TSpider.cxx:662
 TSpider.cxx:663
 TSpider.cxx:664
 TSpider.cxx:665
 TSpider.cxx:666
 TSpider.cxx:667
 TSpider.cxx:668
 TSpider.cxx:669
 TSpider.cxx:670
 TSpider.cxx:671
 TSpider.cxx:672
 TSpider.cxx:673
 TSpider.cxx:674
 TSpider.cxx:675
 TSpider.cxx:676
 TSpider.cxx:677
 TSpider.cxx:678
 TSpider.cxx:679
 TSpider.cxx:680
 TSpider.cxx:681
 TSpider.cxx:682
 TSpider.cxx:683
 TSpider.cxx:684
 TSpider.cxx:685
 TSpider.cxx:686
 TSpider.cxx:687
 TSpider.cxx:688
 TSpider.cxx:689
 TSpider.cxx:690
 TSpider.cxx:691
 TSpider.cxx:692
 TSpider.cxx:693
 TSpider.cxx:694
 TSpider.cxx:695
 TSpider.cxx:696
 TSpider.cxx:697
 TSpider.cxx:698
 TSpider.cxx:699
 TSpider.cxx:700
 TSpider.cxx:701
 TSpider.cxx:702
 TSpider.cxx:703
 TSpider.cxx:704
 TSpider.cxx:705
 TSpider.cxx:706
 TSpider.cxx:707
 TSpider.cxx:708
 TSpider.cxx:709
 TSpider.cxx:710
 TSpider.cxx:711
 TSpider.cxx:712
 TSpider.cxx:713
 TSpider.cxx:714
 TSpider.cxx:715
 TSpider.cxx:716
 TSpider.cxx:717
 TSpider.cxx:718
 TSpider.cxx:719
 TSpider.cxx:720
 TSpider.cxx:721
 TSpider.cxx:722
 TSpider.cxx:723
 TSpider.cxx:724
 TSpider.cxx:725
 TSpider.cxx:726
 TSpider.cxx:727
 TSpider.cxx:728
 TSpider.cxx:729
 TSpider.cxx:730
 TSpider.cxx:731
 TSpider.cxx:732
 TSpider.cxx:733
 TSpider.cxx:734
 TSpider.cxx:735
 TSpider.cxx:736
 TSpider.cxx:737
 TSpider.cxx:738
 TSpider.cxx:739
 TSpider.cxx:740
 TSpider.cxx:741
 TSpider.cxx:742
 TSpider.cxx:743
 TSpider.cxx:744
 TSpider.cxx:745
 TSpider.cxx:746
 TSpider.cxx:747
 TSpider.cxx:748
 TSpider.cxx:749
 TSpider.cxx:750
 TSpider.cxx:751
 TSpider.cxx:752
 TSpider.cxx:753
 TSpider.cxx:754
 TSpider.cxx:755
 TSpider.cxx:756
 TSpider.cxx:757
 TSpider.cxx:758
 TSpider.cxx:759
 TSpider.cxx:760
 TSpider.cxx:761
 TSpider.cxx:762
 TSpider.cxx:763
 TSpider.cxx:764
 TSpider.cxx:765
 TSpider.cxx:766
 TSpider.cxx:767
 TSpider.cxx:768
 TSpider.cxx:769
 TSpider.cxx:770
 TSpider.cxx:771
 TSpider.cxx:772
 TSpider.cxx:773
 TSpider.cxx:774
 TSpider.cxx:775
 TSpider.cxx:776
 TSpider.cxx:777
 TSpider.cxx:778
 TSpider.cxx:779
 TSpider.cxx:780
 TSpider.cxx:781
 TSpider.cxx:782
 TSpider.cxx:783
 TSpider.cxx:784
 TSpider.cxx:785
 TSpider.cxx:786
 TSpider.cxx:787
 TSpider.cxx:788
 TSpider.cxx:789
 TSpider.cxx:790
 TSpider.cxx:791
 TSpider.cxx:792
 TSpider.cxx:793
 TSpider.cxx:794
 TSpider.cxx:795
 TSpider.cxx:796
 TSpider.cxx:797
 TSpider.cxx:798
 TSpider.cxx:799
 TSpider.cxx:800
 TSpider.cxx:801
 TSpider.cxx:802
 TSpider.cxx:803
 TSpider.cxx:804
 TSpider.cxx:805
 TSpider.cxx:806
 TSpider.cxx:807
 TSpider.cxx:808
 TSpider.cxx:809
 TSpider.cxx:810
 TSpider.cxx:811
 TSpider.cxx:812
 TSpider.cxx:813
 TSpider.cxx:814
 TSpider.cxx:815
 TSpider.cxx:816
 TSpider.cxx:817
 TSpider.cxx:818
 TSpider.cxx:819
 TSpider.cxx:820
 TSpider.cxx:821
 TSpider.cxx:822
 TSpider.cxx:823
 TSpider.cxx:824
 TSpider.cxx:825
 TSpider.cxx:826
 TSpider.cxx:827
 TSpider.cxx:828
 TSpider.cxx:829
 TSpider.cxx:830
 TSpider.cxx:831
 TSpider.cxx:832
 TSpider.cxx:833
 TSpider.cxx:834
 TSpider.cxx:835
 TSpider.cxx:836
 TSpider.cxx:837
 TSpider.cxx:838
 TSpider.cxx:839
 TSpider.cxx:840
 TSpider.cxx:841
 TSpider.cxx:842
 TSpider.cxx:843
 TSpider.cxx:844
 TSpider.cxx:845
 TSpider.cxx:846
 TSpider.cxx:847
 TSpider.cxx:848
 TSpider.cxx:849
 TSpider.cxx:850
 TSpider.cxx:851
 TSpider.cxx:852
 TSpider.cxx:853
 TSpider.cxx:854
 TSpider.cxx:855
 TSpider.cxx:856
 TSpider.cxx:857
 TSpider.cxx:858
 TSpider.cxx:859
 TSpider.cxx:860
 TSpider.cxx:861
 TSpider.cxx:862
 TSpider.cxx:863
 TSpider.cxx:864
 TSpider.cxx:865
 TSpider.cxx:866
 TSpider.cxx:867
 TSpider.cxx:868
 TSpider.cxx:869
 TSpider.cxx:870
 TSpider.cxx:871
 TSpider.cxx:872
 TSpider.cxx:873
 TSpider.cxx:874
 TSpider.cxx:875
 TSpider.cxx:876
 TSpider.cxx:877
 TSpider.cxx:878
 TSpider.cxx:879
 TSpider.cxx:880
 TSpider.cxx:881
 TSpider.cxx:882
 TSpider.cxx:883
 TSpider.cxx:884
 TSpider.cxx:885
 TSpider.cxx:886
 TSpider.cxx:887
 TSpider.cxx:888
 TSpider.cxx:889
 TSpider.cxx:890
 TSpider.cxx:891
 TSpider.cxx:892
 TSpider.cxx:893
 TSpider.cxx:894
 TSpider.cxx:895
 TSpider.cxx:896
 TSpider.cxx:897
 TSpider.cxx:898
 TSpider.cxx:899
 TSpider.cxx:900
 TSpider.cxx:901
 TSpider.cxx:902
 TSpider.cxx:903
 TSpider.cxx:904
 TSpider.cxx:905
 TSpider.cxx:906
 TSpider.cxx:907
 TSpider.cxx:908
 TSpider.cxx:909
 TSpider.cxx:910
 TSpider.cxx:911
 TSpider.cxx:912
 TSpider.cxx:913
 TSpider.cxx:914
 TSpider.cxx:915
 TSpider.cxx:916
 TSpider.cxx:917
 TSpider.cxx:918
 TSpider.cxx:919
 TSpider.cxx:920
 TSpider.cxx:921
 TSpider.cxx:922
 TSpider.cxx:923
 TSpider.cxx:924
 TSpider.cxx:925
 TSpider.cxx:926
 TSpider.cxx:927
 TSpider.cxx:928
 TSpider.cxx:929
 TSpider.cxx:930
 TSpider.cxx:931
 TSpider.cxx:932
 TSpider.cxx:933
 TSpider.cxx:934
 TSpider.cxx:935
 TSpider.cxx:936
 TSpider.cxx:937
 TSpider.cxx:938
 TSpider.cxx:939
 TSpider.cxx:940
 TSpider.cxx:941
 TSpider.cxx:942
 TSpider.cxx:943
 TSpider.cxx:944
 TSpider.cxx:945
 TSpider.cxx:946
 TSpider.cxx:947
 TSpider.cxx:948
 TSpider.cxx:949
 TSpider.cxx:950
 TSpider.cxx:951
 TSpider.cxx:952
 TSpider.cxx:953
 TSpider.cxx:954
 TSpider.cxx:955
 TSpider.cxx:956
 TSpider.cxx:957
 TSpider.cxx:958
 TSpider.cxx:959
 TSpider.cxx:960
 TSpider.cxx:961
 TSpider.cxx:962
 TSpider.cxx:963
 TSpider.cxx:964
 TSpider.cxx:965
 TSpider.cxx:966
 TSpider.cxx:967
 TSpider.cxx:968
 TSpider.cxx:969
 TSpider.cxx:970
 TSpider.cxx:971
 TSpider.cxx:972
 TSpider.cxx:973
 TSpider.cxx:974
 TSpider.cxx:975
 TSpider.cxx:976
 TSpider.cxx:977
 TSpider.cxx:978
 TSpider.cxx:979
 TSpider.cxx:980
 TSpider.cxx:981
 TSpider.cxx:982
 TSpider.cxx:983
 TSpider.cxx:984
 TSpider.cxx:985
 TSpider.cxx:986
 TSpider.cxx:987
 TSpider.cxx:988
 TSpider.cxx:989
 TSpider.cxx:990
 TSpider.cxx:991
 TSpider.cxx:992
 TSpider.cxx:993
 TSpider.cxx:994
 TSpider.cxx:995
 TSpider.cxx:996
 TSpider.cxx:997
 TSpider.cxx:998
 TSpider.cxx:999
 TSpider.cxx:1000
 TSpider.cxx:1001
 TSpider.cxx:1002
 TSpider.cxx:1003
 TSpider.cxx:1004
 TSpider.cxx:1005
 TSpider.cxx:1006
 TSpider.cxx:1007
 TSpider.cxx:1008
 TSpider.cxx:1009
 TSpider.cxx:1010
 TSpider.cxx:1011
 TSpider.cxx:1012
 TSpider.cxx:1013
 TSpider.cxx:1014
 TSpider.cxx:1015
 TSpider.cxx:1016
 TSpider.cxx:1017
 TSpider.cxx:1018
 TSpider.cxx:1019
 TSpider.cxx:1020
 TSpider.cxx:1021
 TSpider.cxx:1022
 TSpider.cxx:1023
 TSpider.cxx:1024
 TSpider.cxx:1025
 TSpider.cxx:1026
 TSpider.cxx:1027
 TSpider.cxx:1028
 TSpider.cxx:1029
 TSpider.cxx:1030
 TSpider.cxx:1031
 TSpider.cxx:1032
 TSpider.cxx:1033
 TSpider.cxx:1034
 TSpider.cxx:1035
 TSpider.cxx:1036
 TSpider.cxx:1037
 TSpider.cxx:1038
 TSpider.cxx:1039
 TSpider.cxx:1040
 TSpider.cxx:1041
 TSpider.cxx:1042
 TSpider.cxx:1043
 TSpider.cxx:1044
 TSpider.cxx:1045
 TSpider.cxx:1046
 TSpider.cxx:1047
 TSpider.cxx:1048
 TSpider.cxx:1049
 TSpider.cxx:1050
 TSpider.cxx:1051
 TSpider.cxx:1052
 TSpider.cxx:1053
 TSpider.cxx:1054
 TSpider.cxx:1055
 TSpider.cxx:1056
 TSpider.cxx:1057
 TSpider.cxx:1058
 TSpider.cxx:1059
 TSpider.cxx:1060
 TSpider.cxx:1061
 TSpider.cxx:1062
 TSpider.cxx:1063
 TSpider.cxx:1064
 TSpider.cxx:1065
 TSpider.cxx:1066
 TSpider.cxx:1067
 TSpider.cxx:1068
 TSpider.cxx:1069
 TSpider.cxx:1070
 TSpider.cxx:1071
 TSpider.cxx:1072
 TSpider.cxx:1073
 TSpider.cxx:1074
 TSpider.cxx:1075
 TSpider.cxx:1076
 TSpider.cxx:1077
 TSpider.cxx:1078
 TSpider.cxx:1079
 TSpider.cxx:1080
 TSpider.cxx:1081
 TSpider.cxx:1082
 TSpider.cxx:1083
 TSpider.cxx:1084
 TSpider.cxx:1085
 TSpider.cxx:1086
 TSpider.cxx:1087
 TSpider.cxx:1088
 TSpider.cxx:1089
 TSpider.cxx:1090
 TSpider.cxx:1091
 TSpider.cxx:1092
 TSpider.cxx:1093
 TSpider.cxx:1094
 TSpider.cxx:1095
 TSpider.cxx:1096
 TSpider.cxx:1097
 TSpider.cxx:1098
 TSpider.cxx:1099
 TSpider.cxx:1100
 TSpider.cxx:1101
 TSpider.cxx:1102
 TSpider.cxx:1103
 TSpider.cxx:1104
 TSpider.cxx:1105
 TSpider.cxx:1106
 TSpider.cxx:1107
 TSpider.cxx:1108
 TSpider.cxx:1109
 TSpider.cxx:1110
 TSpider.cxx:1111
 TSpider.cxx:1112
 TSpider.cxx:1113
 TSpider.cxx:1114
 TSpider.cxx:1115
 TSpider.cxx:1116
 TSpider.cxx:1117
 TSpider.cxx:1118
 TSpider.cxx:1119
 TSpider.cxx:1120
 TSpider.cxx:1121
 TSpider.cxx:1122
 TSpider.cxx:1123
 TSpider.cxx:1124
 TSpider.cxx:1125
 TSpider.cxx:1126
 TSpider.cxx:1127
 TSpider.cxx:1128
 TSpider.cxx:1129
 TSpider.cxx:1130
 TSpider.cxx:1131
 TSpider.cxx:1132
 TSpider.cxx:1133
 TSpider.cxx:1134
 TSpider.cxx:1135
 TSpider.cxx:1136
 TSpider.cxx:1137
 TSpider.cxx:1138
 TSpider.cxx:1139
 TSpider.cxx:1140
 TSpider.cxx:1141
 TSpider.cxx:1142
 TSpider.cxx:1143
 TSpider.cxx:1144
 TSpider.cxx:1145
 TSpider.cxx:1146
 TSpider.cxx:1147
 TSpider.cxx:1148
 TSpider.cxx:1149
 TSpider.cxx:1150
 TSpider.cxx:1151
 TSpider.cxx:1152
 TSpider.cxx:1153
 TSpider.cxx:1154
 TSpider.cxx:1155
 TSpider.cxx:1156
 TSpider.cxx:1157
 TSpider.cxx:1158
 TSpider.cxx:1159
 TSpider.cxx:1160
 TSpider.cxx:1161
 TSpider.cxx:1162
 TSpider.cxx:1163
 TSpider.cxx:1164
 TSpider.cxx:1165
 TSpider.cxx:1166
 TSpider.cxx:1167
 TSpider.cxx:1168
 TSpider.cxx:1169
 TSpider.cxx:1170
 TSpider.cxx:1171
 TSpider.cxx:1172
 TSpider.cxx:1173
 TSpider.cxx:1174
 TSpider.cxx:1175
 TSpider.cxx:1176
 TSpider.cxx:1177
 TSpider.cxx:1178
 TSpider.cxx:1179
 TSpider.cxx:1180
 TSpider.cxx:1181
 TSpider.cxx:1182
 TSpider.cxx:1183
 TSpider.cxx:1184
 TSpider.cxx:1185
 TSpider.cxx:1186
 TSpider.cxx:1187
 TSpider.cxx:1188
 TSpider.cxx:1189
 TSpider.cxx:1190
 TSpider.cxx:1191
 TSpider.cxx:1192
 TSpider.cxx:1193
 TSpider.cxx:1194
 TSpider.cxx:1195
 TSpider.cxx:1196
 TSpider.cxx:1197
 TSpider.cxx:1198
 TSpider.cxx:1199
 TSpider.cxx:1200
 TSpider.cxx:1201
 TSpider.cxx:1202
 TSpider.cxx:1203
 TSpider.cxx:1204
 TSpider.cxx:1205
 TSpider.cxx:1206
 TSpider.cxx:1207
 TSpider.cxx:1208
 TSpider.cxx:1209
 TSpider.cxx:1210
 TSpider.cxx:1211
 TSpider.cxx:1212
 TSpider.cxx:1213
 TSpider.cxx:1214
 TSpider.cxx:1215
 TSpider.cxx:1216
 TSpider.cxx:1217
 TSpider.cxx:1218
 TSpider.cxx:1219
 TSpider.cxx:1220
 TSpider.cxx:1221
 TSpider.cxx:1222
 TSpider.cxx:1223
 TSpider.cxx:1224
 TSpider.cxx:1225
 TSpider.cxx:1226
 TSpider.cxx:1227
 TSpider.cxx:1228
 TSpider.cxx:1229
 TSpider.cxx:1230
 TSpider.cxx:1231
 TSpider.cxx:1232
 TSpider.cxx:1233
 TSpider.cxx:1234
 TSpider.cxx:1235
 TSpider.cxx:1236
 TSpider.cxx:1237
 TSpider.cxx:1238
 TSpider.cxx:1239
 TSpider.cxx:1240
 TSpider.cxx:1241
 TSpider.cxx:1242
 TSpider.cxx:1243
 TSpider.cxx:1244
 TSpider.cxx:1245
 TSpider.cxx:1246
 TSpider.cxx:1247
 TSpider.cxx:1248
 TSpider.cxx:1249
 TSpider.cxx:1250
 TSpider.cxx:1251
 TSpider.cxx:1252
 TSpider.cxx:1253
 TSpider.cxx:1254
 TSpider.cxx:1255
 TSpider.cxx:1256
 TSpider.cxx:1257
 TSpider.cxx:1258
 TSpider.cxx:1259
 TSpider.cxx:1260
 TSpider.cxx:1261
 TSpider.cxx:1262
 TSpider.cxx:1263
 TSpider.cxx:1264
 TSpider.cxx:1265
 TSpider.cxx:1266
 TSpider.cxx:1267
 TSpider.cxx:1268
 TSpider.cxx:1269
 TSpider.cxx:1270
 TSpider.cxx:1271
 TSpider.cxx:1272
 TSpider.cxx:1273
 TSpider.cxx:1274
 TSpider.cxx:1275
 TSpider.cxx:1276
 TSpider.cxx:1277
 TSpider.cxx:1278
 TSpider.cxx:1279
 TSpider.cxx:1280
 TSpider.cxx:1281
 TSpider.cxx:1282
 TSpider.cxx:1283
 TSpider.cxx:1284
 TSpider.cxx:1285
 TSpider.cxx:1286
 TSpider.cxx:1287
 TSpider.cxx:1288
 TSpider.cxx:1289
 TSpider.cxx:1290
 TSpider.cxx:1291
 TSpider.cxx:1292
 TSpider.cxx:1293
 TSpider.cxx:1294
 TSpider.cxx:1295
 TSpider.cxx:1296
 TSpider.cxx:1297
 TSpider.cxx:1298
 TSpider.cxx:1299
 TSpider.cxx:1300
 TSpider.cxx:1301
 TSpider.cxx:1302
 TSpider.cxx:1303
 TSpider.cxx:1304
 TSpider.cxx:1305
 TSpider.cxx:1306
 TSpider.cxx:1307
 TSpider.cxx:1308
 TSpider.cxx:1309
 TSpider.cxx:1310
 TSpider.cxx:1311
 TSpider.cxx:1312
 TSpider.cxx:1313
 TSpider.cxx:1314
 TSpider.cxx:1315
 TSpider.cxx:1316
 TSpider.cxx:1317
 TSpider.cxx:1318
 TSpider.cxx:1319
 TSpider.cxx:1320
 TSpider.cxx:1321
 TSpider.cxx:1322
 TSpider.cxx:1323
 TSpider.cxx:1324
 TSpider.cxx:1325
 TSpider.cxx:1326
 TSpider.cxx:1327
 TSpider.cxx:1328
 TSpider.cxx:1329
 TSpider.cxx:1330
 TSpider.cxx:1331
 TSpider.cxx:1332
 TSpider.cxx:1333
 TSpider.cxx:1334
 TSpider.cxx:1335
 TSpider.cxx:1336
 TSpider.cxx:1337
 TSpider.cxx:1338
 TSpider.cxx:1339
 TSpider.cxx:1340
 TSpider.cxx:1341
 TSpider.cxx:1342
 TSpider.cxx:1343
 TSpider.cxx:1344
 TSpider.cxx:1345
 TSpider.cxx:1346
 TSpider.cxx:1347
 TSpider.cxx:1348
 TSpider.cxx:1349
 TSpider.cxx:1350
 TSpider.cxx:1351
 TSpider.cxx:1352
 TSpider.cxx:1353
 TSpider.cxx:1354
 TSpider.cxx:1355
 TSpider.cxx:1356
 TSpider.cxx:1357
 TSpider.cxx:1358
 TSpider.cxx:1359
 TSpider.cxx:1360
 TSpider.cxx:1361
 TSpider.cxx:1362
 TSpider.cxx:1363
 TSpider.cxx:1364
 TSpider.cxx:1365
 TSpider.cxx:1366
 TSpider.cxx:1367
 TSpider.cxx:1368
 TSpider.cxx:1369
 TSpider.cxx:1370
 TSpider.cxx:1371
 TSpider.cxx:1372
 TSpider.cxx:1373
 TSpider.cxx:1374
 TSpider.cxx:1375
 TSpider.cxx:1376
 TSpider.cxx:1377
 TSpider.cxx:1378
 TSpider.cxx:1379
 TSpider.cxx:1380
 TSpider.cxx:1381
 TSpider.cxx:1382
 TSpider.cxx:1383
 TSpider.cxx:1384
 TSpider.cxx:1385
 TSpider.cxx:1386
 TSpider.cxx:1387
 TSpider.cxx:1388
 TSpider.cxx:1389
 TSpider.cxx:1390
 TSpider.cxx:1391
 TSpider.cxx:1392
 TSpider.cxx:1393
 TSpider.cxx:1394
 TSpider.cxx:1395
 TSpider.cxx:1396
 TSpider.cxx:1397
 TSpider.cxx:1398
 TSpider.cxx:1399
 TSpider.cxx:1400
 TSpider.cxx:1401
 TSpider.cxx:1402
 TSpider.cxx:1403
 TSpider.cxx:1404
 TSpider.cxx:1405
 TSpider.cxx:1406
 TSpider.cxx:1407
 TSpider.cxx:1408
 TSpider.cxx:1409
 TSpider.cxx:1410
 TSpider.cxx:1411
 TSpider.cxx:1412
 TSpider.cxx:1413
 TSpider.cxx:1414
 TSpider.cxx:1415
 TSpider.cxx:1416
 TSpider.cxx:1417
 TSpider.cxx:1418
 TSpider.cxx:1419
 TSpider.cxx:1420
 TSpider.cxx:1421
 TSpider.cxx:1422
 TSpider.cxx:1423
 TSpider.cxx:1424
 TSpider.cxx:1425
 TSpider.cxx:1426
 TSpider.cxx:1427
 TSpider.cxx:1428
 TSpider.cxx:1429
 TSpider.cxx:1430
 TSpider.cxx:1431
 TSpider.cxx:1432
 TSpider.cxx:1433
 TSpider.cxx:1434
 TSpider.cxx:1435
 TSpider.cxx:1436
 TSpider.cxx:1437
 TSpider.cxx:1438
 TSpider.cxx:1439
 TSpider.cxx:1440
 TSpider.cxx:1441
 TSpider.cxx:1442
 TSpider.cxx:1443
 TSpider.cxx:1444
 TSpider.cxx:1445
 TSpider.cxx:1446
 TSpider.cxx:1447
 TSpider.cxx:1448
 TSpider.cxx:1449
 TSpider.cxx:1450
 TSpider.cxx:1451
 TSpider.cxx:1452
 TSpider.cxx:1453
 TSpider.cxx:1454
 TSpider.cxx:1455
 TSpider.cxx:1456
 TSpider.cxx:1457
 TSpider.cxx:1458
 TSpider.cxx:1459
 TSpider.cxx:1460
 TSpider.cxx:1461
 TSpider.cxx:1462
 TSpider.cxx:1463
 TSpider.cxx:1464
 TSpider.cxx:1465
 TSpider.cxx:1466
 TSpider.cxx:1467
 TSpider.cxx:1468
 TSpider.cxx:1469
 TSpider.cxx:1470
 TSpider.cxx:1471
 TSpider.cxx:1472
 TSpider.cxx:1473
 TSpider.cxx:1474
 TSpider.cxx:1475
 TSpider.cxx:1476
 TSpider.cxx:1477
 TSpider.cxx:1478
 TSpider.cxx:1479
 TSpider.cxx:1480
 TSpider.cxx:1481
 TSpider.cxx:1482
 TSpider.cxx:1483
 TSpider.cxx:1484
 TSpider.cxx:1485
 TSpider.cxx:1486
 TSpider.cxx:1487
 TSpider.cxx:1488
 TSpider.cxx:1489
 TSpider.cxx:1490
 TSpider.cxx:1491
 TSpider.cxx:1492
 TSpider.cxx:1493
 TSpider.cxx:1494
 TSpider.cxx:1495
 TSpider.cxx:1496
 TSpider.cxx:1497
 TSpider.cxx:1498
 TSpider.cxx:1499
 TSpider.cxx:1500
 TSpider.cxx:1501
 TSpider.cxx:1502
 TSpider.cxx:1503
 TSpider.cxx:1504
 TSpider.cxx:1505
 TSpider.cxx:1506
 TSpider.cxx:1507
 TSpider.cxx:1508
 TSpider.cxx:1509
 TSpider.cxx:1510
 TSpider.cxx:1511
 TSpider.cxx:1512
 TSpider.cxx:1513
 TSpider.cxx:1514
 TSpider.cxx:1515
 TSpider.cxx:1516
 TSpider.cxx:1517
 TSpider.cxx:1518
 TSpider.cxx:1519
 TSpider.cxx:1520
 TSpider.cxx:1521
 TSpider.cxx:1522
 TSpider.cxx:1523
 TSpider.cxx:1524
 TSpider.cxx:1525
 TSpider.cxx:1526
 TSpider.cxx:1527
 TSpider.cxx:1528
 TSpider.cxx:1529
 TSpider.cxx:1530
 TSpider.cxx:1531
 TSpider.cxx:1532
 TSpider.cxx:1533
 TSpider.cxx:1534
 TSpider.cxx:1535
 TSpider.cxx:1536
 TSpider.cxx:1537
 TSpider.cxx:1538
 TSpider.cxx:1539
 TSpider.cxx:1540
 TSpider.cxx:1541
 TSpider.cxx:1542
 TSpider.cxx:1543
 TSpider.cxx:1544
 TSpider.cxx:1545
 TSpider.cxx:1546
 TSpider.cxx:1547
 TSpider.cxx:1548
 TSpider.cxx:1549
 TSpider.cxx:1550
 TSpider.cxx:1551
 TSpider.cxx:1552
 TSpider.cxx:1553
 TSpider.cxx:1554
 TSpider.cxx:1555
 TSpider.cxx:1556
 TSpider.cxx:1557
 TSpider.cxx:1558
 TSpider.cxx:1559
 TSpider.cxx:1560
 TSpider.cxx:1561
 TSpider.cxx:1562
 TSpider.cxx:1563
 TSpider.cxx:1564
 TSpider.cxx:1565
 TSpider.cxx:1566
 TSpider.cxx:1567
 TSpider.cxx:1568
 TSpider.cxx:1569
 TSpider.cxx:1570
 TSpider.cxx:1571
 TSpider.cxx:1572
 TSpider.cxx:1573
 TSpider.cxx:1574
 TSpider.cxx:1575
 TSpider.cxx:1576
 TSpider.cxx:1577
 TSpider.cxx:1578
 TSpider.cxx:1579
 TSpider.cxx:1580
 TSpider.cxx:1581
 TSpider.cxx:1582
 TSpider.cxx:1583
 TSpider.cxx:1584
 TSpider.cxx:1585
 TSpider.cxx:1586
 TSpider.cxx:1587
 TSpider.cxx:1588
 TSpider.cxx:1589
 TSpider.cxx:1590
 TSpider.cxx:1591
 TSpider.cxx:1592
 TSpider.cxx:1593
 TSpider.cxx:1594
 TSpider.cxx:1595
 TSpider.cxx:1596
 TSpider.cxx:1597
 TSpider.cxx:1598
 TSpider.cxx:1599
 TSpider.cxx:1600
 TSpider.cxx:1601
 TSpider.cxx:1602
 TSpider.cxx:1603
 TSpider.cxx:1604
 TSpider.cxx:1605
 TSpider.cxx:1606
 TSpider.cxx:1607
 TSpider.cxx:1608
 TSpider.cxx:1609
 TSpider.cxx:1610
 TSpider.cxx:1611
 TSpider.cxx:1612
 TSpider.cxx:1613
 TSpider.cxx:1614
 TSpider.cxx:1615
 TSpider.cxx:1616
 TSpider.cxx:1617
 TSpider.cxx:1618