ROOT logo
/**
 * @file   TupleSelector.C
 * @author Christian Holm Christensen <cholm@nbi.dk>
 * @date   Thu Nov 13 14:12:11 2014
 * 
 * @brief A selector to draw stuff from the a track tuple as made by
 * AliFMDMCTrackELoss.
 * 
 * This class assumes that the files with the TTree's created by 
 * AliFMDMCTrackELoss lives in tuple/forward_tuple_N.root. 
 * 
 * The trees are made by AliFMDMCTrackELoss, which in turn is embedded
 * in a AliFMDMCTrackInspector object.  This code, which also does
 * fits of the MC 'true' energy loss spectra is contained in the task
 * AliFMDMCTrackInspectorTask.  This task can be executed via the
 * train MakeFMDMCTrackTrain.C
 *
 * To run this selector do 
 *
 * @code 
 void
 Run(Bool_t proof=true, Long64_t maxEvents=-1)
 {
   const char* fwd = "${ALICE_ROOT}/PWGLF/FORWARD/analysis2";
   gSystem->AddIncludePath("-I${ALICE_ROOT}/include");
   gROOT->Macro(Form("%s/scripts/LoadLibs.C"));
   gROOT->LoadMacro(Form("%s/TupleSelector.C++g",fwd));

   if (proof) TupleSelector::Proof(maxEvents);
   else       TupleSelector::Run(maxEvents);
 }
 * @endcode 
 * 
 * Here, $ANA_SRC is assumed to point to the source directory of 
 * PWGLF/FORWARD/analysis2 
 */

#ifndef SELECTOR_C
#define SELECTOR_C

#include <TSelector.h>
#include <TQObject.h>
#ifndef __CINT__
# include <TH1.h>
# include <TString.h>
# include <TCanvas.h>
# include <TLegend.h>
# include <TLegendEntry.h>
# include <TError.h>
# include <TMath.h>
# include <THStack.h>
# include <TTree.h>
# include <TClonesArray.h>
# include <TChain.h>
# include <TSystem.h>
# include <TOutputListSelectorDataMap.h>
# include <TLatex.h>
# include <TROOT.h>
# include <TFile.h>
# include <TDirectory.h>
# include <TSystemDirectory.h>
# include <TRegexp.h>
# include <TKey.h>
# include <TFileCollection.h>
# include <THashList.h>
# include <TDSet.h>
# include <TQConnection.h>
# include <iostream>
# include <TProof.h>
# include <TStopwatch.h>
# include "AliFMDMCTrackELoss.h"
#else
// Forward declarations of types in the interface, and to trigger
// autoloading of some libraries
class TTree;
class TChain;
class TCanvas;
class TH1;
class THStack;
class TLegend;
class TCanvas;
class TString;
class TDirectory;
class TSystemDirectory;
class TRegexp;
class TDSet;
class TProof;
class AliFMDMCTrackELoss;
class AliFMDMCTrackELoss::Hit;
#endif

//====================================================================
/** 
 * Container of primary/secondary histograms 
 */
struct Spectra : public TObject
{
  /** The name */
  TString fName;
  /** Primaries */
  TH1*    fPrimary;
  /** Secondaries */
  TH1*    fSecondary;
  /** 
   * I/O CTOR
   */
  Spectra() 
    : TObject(), fName(""), fPrimary(0), fSecondary(0)
  {}
  /** 
   * User CTOR 
   * 
   * @param name   Name 
   * @param title  Title 
   * @param color  Color 
   * @param bins   Bin definition 
   */
  Spectra(const char*    name, 
	  const char*    title, 
	  Color_t        color,
	  const TArrayD& bins)
    : TObject(), 
      fName(name),
      fPrimary(0), 
      fSecondary(0)
  {
    fPrimary = new TH1D(Form("primary%s", name), 
			title, bins.GetSize()-1, 
			bins.GetArray());
    fPrimary->SetXTitle("#beta#gamma");
    fPrimary->SetMarkerColor(color);
    fPrimary->SetLineColor(color);
    fPrimary->SetMarkerStyle(20);
    fPrimary->SetFillStyle(0);
    fPrimary->SetDirectory(0);
    fPrimary->Sumw2();
      
    fSecondary = static_cast<TH1*>(fPrimary->Clone(Form("secondary%s",name)));
    fSecondary->SetMarkerStyle(24);
    fSecondary->SetMarkerSize(1.2);
    fSecondary->SetDirectory(0);
  }
  /** 
   * Copy CTOR
   * 
   * @param o Object to copy from 
   */ 
  Spectra(const Spectra& o) 
    : TObject(o), 
      fName(o.fName),
      fPrimary(0), 
      fSecondary(0) 
  {
    if (o.fPrimary)
      fPrimary = static_cast<TH1*>(o.fPrimary->Clone());
    if (o.fSecondary)
      fSecondary = static_cast<TH1*>(o.fSecondary->Clone());
  }
  /** 
   * DTOR
   */
  virtual ~Spectra() 
  {
    if (fPrimary)   delete fPrimary;
    if (fSecondary) delete fSecondary;
  }
  /** 
   * Assigment operator 
   * 
   * @param o Object to assign from 
   * 
   * @return Reference to this 
   */
  Spectra& operator=(const Spectra& o) 
  {
    if (&o == this) return *this;
      
    TObject::operator=(o);
    fName = o.fName;
    if (fPrimary)   { delete fPrimary;   fPrimary   = 0; }
    if (fSecondary) { delete fSecondary; fSecondary = 0; }
    if (o.fPrimary)
      fPrimary = static_cast<TH1*>(o.fPrimary->Clone());
    if (o.fSecondary)
      fSecondary = static_cast<TH1*>(o.fSecondary->Clone());
      
    return *this;
  }
  /** 
   * Get the name 
   * 
   * @return name 
   */
  const char* GetName() const { return fName.Data(); }
  /** 
   * Fill into histogram 
   * 
   * @param primary true if for primary 
   * @param x       What to fill
   */
  void Fill(Bool_t primary, Double_t x) 
  {
    if (primary) fPrimary->Fill(x);
    else         fSecondary->Fill(x);
  }
  /** 
   * Get a histogram 
   * 
   * @param primary If true, get histogram for primaries, otherwise
   * for secondaries.
   * 
   * @return Pointer to histogram (possibly null)
   */
  TH1* Hist(Bool_t primary) const 
  {
    return (primary ? fPrimary : fSecondary);
  }
  /** 
   * Add the histograms to a stack and legend 
   * 
   * @param stack Stack to add to 
   * @param leg   Legend
   */ 
  virtual void Stack(THStack* stack, TLegend* leg)
  {
    TH1* hists[] = { fPrimary, fSecondary, 0 };
    for (Int_t i = 0; i < 2; i++) { 
      if (!hists[i]) continue;

      Int_t n = hists[i]->GetEntries();
      if (n <= 0) continue;
	
      if (stack) {
	hists[i]->Scale(1. / n, "width");
	stack->Add(hists[i]);

	if (i != 0) continue;
	if (!leg) continue;
	  
	leg->AddEntry(hists[i], hists[i]->GetTitle(), "p");
      }
      else if (leg) { 
	TLegendEntry* e = leg->AddEntry("", 
					(i == 0 ? "Primary" : "Secondary"), 
					"p");
	e->SetMarkerStyle(hists[i]->GetMarkerStyle());
	e->SetFillStyle(hists[i]->GetFillStyle());
	e->SetFillColor(kBlack);
      }
    }
  }
  /** 
   * Merge this object with similar objects in the list.  
   * 
   * @param list list of objects 
   * 
   * @return Number of merged objects 
   */
  Long64_t Merge(TCollection *list)
  {
    TIter    nxt(list);
    TObject* obj = 0;
    Long64_t cnt = 0;
    while ((obj = nxt())) { 
      if (!obj->IsA()->InheritsFrom(this->IsA())) {
	Warning("Merge", "Will not merge a Spectra with a %s", 
		obj->IsA()->GetName());
	continue;
      }
      Spectra* oth  = static_cast<Spectra*>(obj);
      if (Add(oth)) cnt++;
    }
    // Info("Merge", "%s merged %lld entries", fName.Data(), cnt);
    return cnt;
  }
  Bool_t Add(const Spectra* oth) 
  {
    if (!oth->fName.EqualTo(fName)) {
      Warning("Merge", "Will not merge %s with %s", 
	      oth->fName.Data(), fName.Data());
      return false;
    }
    // Int_t nPrmOld = fPrimary->GetEntries();
    // Int_t nSecOld = fPrimary->GetEntries();

    fPrimary  ->Add(oth->fPrimary);
    fSecondary->Add(oth->fSecondary);

    // Int_t nPrmNow = fPrimary->GetEntries();
    // Int_t nSecNow = fPrimary->GetEntries();

    // Info("Add", "%s: %d/%d merged to %d/%d", 
    //      fName.Data(), nPrmOld, nSecOld, nPrmNow, nSecNow);
    return true;
  }
  /** 
   * List this object 
   * 
   * @param option Not used
   */	
  void ls(Option_t* option="") const 
  {
    TObject::ls(option);
    gROOT->IncreaseDirLevel();
    TH1* hists[] = { fPrimary, 
		     fSecondary, 
		     0 };
    for (Int_t i = 0; i < 2; i++) if (hists[i]) hists[i]->ls();
    gROOT->DecreaseDirLevel();
  }
  /** 
   * Store this on file 
   *
   * @param dir Parent directory 
   */
  void Store(TDirectory* dir)
  {
    TDirectory* out = dir->mkdir(fName);
    out->cd();
    fPrimary->Clone("primary")->Write();
    fSecondary->Clone("secondary")->Write();
    dir->cd();
  }
  ClassDef(Spectra,1);
};
//====================================================================
/** 
 * Container to type histograms
 */
struct Type : public Spectra 
{
  /** 
   * I/O CTOR
   */
  Type() : Spectra() {}
  /** 
   * User CTOR 
   * 
   * @param name   Name 
   * @param title  Title 
   * @param color  Color
   */
  Type(const char*    name, 
       const char*    title, 
       Color_t        color)
    : Spectra() // Do not use the base class ctor 
  {
    fName = name;
    fPrimary = new TH1D(Form("primary%s", name),
			title, 6, .5, 6.5);
    fPrimary->SetXTitle("particle type");
    fPrimary->SetMarkerColor(color);
    fPrimary->SetMarkerStyle(20);
    fPrimary->SetFillColor(color);
    fPrimary->SetFillStyle(3001);
    fPrimary->SetLineColor(color);
    fPrimary->SetDirectory(0);
    fPrimary->Sumw2();
    fPrimary->GetXaxis()->SetBinLabel(1, "e^{#pm}");
    fPrimary->GetXaxis()->SetBinLabel(2, "#pi^{#pm}");
    fPrimary->GetXaxis()->SetBinLabel(3, "K^{#pm}");
    fPrimary->GetXaxis()->SetBinLabel(4, "p/#bar{p}");
    fPrimary->GetXaxis()->SetBinLabel(5, "strange");
    fPrimary->GetXaxis()->SetBinLabel(6, "other");
      
    fSecondary = 
      static_cast<TH1*>(fPrimary->Clone(Form("secondary%s",name)));
    fSecondary->SetMarkerStyle(24);
    fSecondary->SetMarkerSize(1.2);
    fSecondary->SetFillStyle(3002);
    fSecondary->SetDirectory(0);
  }
  ClassDef(Type,1); 
};

//====================================================================
struct Ring : public TObject
{

  /** Detector number */
  UShort_t fD;
  /** Ring identifier */
  Char_t   fR;
  /** Cached name */
  TString  fName;
  /** Collection of spectra */
  TObjArray* fSpectra; 

  /** Enumeration of our spectra */
  enum { 
    kBetaGamma = 0,
    kBetaGammaPi, 
    kBetaGammaElectron, 
    kTypes,
    kNSpectra
  };
    
  /** 
   * I/O constructor 
   */
  Ring() 
    : TObject(),
      fD(0), 
      fR('\0'),
      fName(),
      fSpectra(0)
  {}
  /** 
   * Constructor 
   * 
   * @param d Detector 
   * @param r Ring 
   */
  Ring(UShort_t d, Char_t r) 
    : fD(d), 
      fR(r),
      fName(Form("FMD%d%c", d, r)),
      fSpectra(0)
  {
    Color_t color = AliForwardUtil::RingColor(fD, fR);
    TArrayD bgArray(601);
    AliForwardUtil::MakeLogScale(300, -2, 5, bgArray);
    
    fSpectra   = new TObjArray(kNSpectra);
    fSpectra->SetOwner(true);
    fSpectra->AddAt(new Spectra("BetaGamma", fName, color, bgArray), 
		    kBetaGamma);
    fSpectra->AddAt(new Spectra("BetaGammaPi", fName, color, bgArray), 
		    kBetaGammaPi);
    fSpectra->AddAt(new Spectra("BetaGammaElectron", fName, color, bgArray), 
		    kBetaGammaElectron);
    fSpectra->AddAt(new Type("Type", fName, color), kTypes);
    // fSpectra->ls();
  }
  /** 
   * Copy constructor 
   * 
   * @param r Other to copy from 
   */
  Ring(const Ring& r)
    : TObject(r), 
      fD(r.fD), 
      fR(r.fR), 
      fName(r.fName),
      fSpectra(0)
  {
    if (r.fSpectra) fSpectra = new TObjArray(*r.fSpectra);
  }    
  /** 
   * Assignment operator 
   * 
   * @param r Other to assign from 
   * 
   * @return Reference to this obect 
   */
  Ring& operator=(const Ring& r) 
  {
    if (&r == this) return *this;
    
    fD                     = r.fD;
    fR                     = r.fR;
    fName                  = r.fName;
    if (fSpectra) { delete fSpectra; fSpectra = 0; }
    if (r.fSpectra) fSpectra = new TObjArray(*r.fSpectra);

    return *this;
  }
  const char* GetName() const { return fName.Data(); }
  /** 
   * Get a spectra 
   * 
   * @param which Identifier 
   * 
   * @return Pointer to Spectra object or null
   */
  Spectra* Get(UInt_t which) 
  {
    if (!fSpectra) return 0;
    Int_t i = which;
    if (i > fSpectra->GetEntriesFast()) return 0;
    return static_cast<Spectra*>(fSpectra->At(i));
  }
  /** 
   * Get a spectra 
   * 
   * @param which Identifier 
   * 
   * @return Pointer to Spectra object or null
   */
  const Spectra* Get(UInt_t which) const
  {
    if (!fSpectra) return 0;
    Int_t i = which;
    if (i > fSpectra->GetEntriesFast()) return 0;
    return static_cast<Spectra*>(fSpectra->At(i));
  }
  /** 
   * Fill histograms 
   * 
   * @param hit Hit structure 
   */
  void Fill(AliFMDMCTrackELoss::Hit* hit)
  {
    Bool_t prim = hit->IsPrimary();
    Int_t  apdg = hit->AbsPdg();
    Int_t  mfl  = Int_t(apdg/TMath::Power(10,Int_t(TMath::Log10(apdg))));
    Int_t  type = (hit->IsElectron() ? 1 : 
		   hit->IsPion()     ? 2 : 
		   hit->IsKaon()     ? 3 : 
		   hit->IsProton()   ? 4 : 
		   mfl == 3          ? 5 : 6);
    
    Get(kBetaGamma)        ->Fill(prim, hit->BetaGamma());
    Get(kTypes)            ->Fill(prim, type);
    if (hit->IsPion() || hit->IsProton() || hit->IsKaon() || apdg > 100)
      Get(kBetaGammaPi)      ->Fill(prim, hit->BetaGamma());
    if (hit->IsElectron())
      Get(kBetaGammaElectron)->Fill(prim, hit->BetaGamma());

  }
  /** 
   * Get histograms
   * 
   * @param primary If true, for primaries  
   * @param which   Which histogram to get 
   * 
   * @return Histogram or null
   */
  TH1* Hist(Bool_t primary, UShort_t which) const
  {
    const Spectra* spe = Get(which); 
    if (!spe) return 0;
    return spe->Hist(primary);
  }
  /** 
   * Merge this object with similar objects in the list.  
   * 
   * @param list list of objects 
   * 
   * @return Number of merged objects 
   */
  Long64_t Merge(TCollection *list)
  {
    TIter    nxt(list);
    TObject* obj = 0;
    Long64_t cnt = 0;
    while ((obj = nxt())) { 
      if (!obj->IsA()->InheritsFrom(this->IsA())) {
	Warning("Merge", "Will not merge a Ring with a %s", 
		obj->IsA()->GetName());
	continue;
      }
      Ring* oth = static_cast<Ring*>(obj);
      if (oth->fD != fD || oth->fR != fR) {
	Warning("Merge", "Will not merge FMD%d%c with FMD%d%c", 
		fD, fR, oth->fD, oth->fR);
	continue;
      }
      
      if (fSpectra) {
	// fSpectra->Merge(oth->fSpectra);
	TIter thsNext(fSpectra);
	TIter othNext(oth->fSpectra);
	Spectra* thsSpec = 0;
	Spectra* othSpec = 0;
	
	while ((thsSpec = static_cast<Spectra*>(thsNext())) && 
	       (othSpec = static_cast<Spectra*>(othNext()))) 
	  thsSpec->Add(othSpec);

      }
      cnt++;
    }
    // Info("Merge", "FMD%d%c merged %lld entries", fD, fR, cnt);
    return cnt;
  }
  void Draw(Option_t* opt="") 
  { 
    Info("Draw", "Should draw rings here");
    ls(opt); 
  }
  /** 
   * List this object 
   * 
   * @param option Not used
   */
  void ls(Option_t* option="") const 
  {
    TObject::ls(option);
    gROOT->IncreaseDirLevel();
    if (fSpectra) fSpectra->ls(option);
    gROOT->DecreaseDirLevel();
  }
  /** 
   * Store this on file 
   *
   * @param dir Parent directory 
   */
  void Store(TDirectory* dir)
  {
    TDirectory* out = dir->mkdir(fName);
    out->cd();
    TIter next(fSpectra);
    Spectra* spec = 0;
    while ((spec = static_cast<Spectra*>(next()))) 
      spec->Store(out);
    dir->cd();
  }
  
  ClassDef(Ring,2);
};

//====================================================================
struct Monitor : public TObject, public TQObject 
{
  Monitor()
  {
    if (!gProof) return;

    fName = gProof->GetSessionTag();
    gDirectory->Add(this);
    // _must_ specify signal _exactly_ like below, or we won't be called
    Bool_t ret = gProof->Connect("Feedback(TList *objs)", "Monitor", this, 
				 "Feedback(TList *objs)");
    if (!ret) 
      Warning("Monitor", "Failed to connect to Proof");
  }
  virtual ~Monitor() 
  {
    if (!gProof) return;
    gProof->Disconnect("Feedback(TList *objs)",this, 
		       "Feedback(TList* objs)");
  }
  void SetName(const char* name) { fName = name; }
  const char* GetName() const { return fName.Data(); }
  void Feedback(TList* objs)
  {
    Info("Feedback", "Got a list of objects (%p)", objs);
    if (!objs) return;
    objs->ls();
  }
  TString fName;
  ClassDef(Monitor,1);
};


//====================================================================
struct TupleSelector : public TSelector 
{
  TString       fTitle; //! Must not be persistent 
  TTree*        fTree;  //! Must not be persistent 
  TClonesArray* fHits;  //! Must not be persistent 
  Int_t         fI;     //! Not persistent 
  TObjArray*    fRings; //! Not persistent

  /** 
   * Constructor 
   * 
   * @param name Optional title 
   */
  TupleSelector(const char* name="") :  
    fTitle(name), fTree(0), fHits(0), fI(0), fRings(0) 
  {
    if (fTitle.IsNull()) 
      fTitle = gSystem->BaseName(gSystem->WorkingDirectory());
    // SetOption("fb=rings");
    
  }
  const char* GetName() const { return fTitle.Data(); }
  /** 
   * @{ 
   * @name Setup 
   */
  /** 
   * Get index for a particular ring 
   * 
   * @param d Detector 
   * @param r Ring 
   * 
   * @return Index, or 0xFFFF
   */
  UShort_t Index(UShort_t d, Char_t r) const
  {
    Bool_t inner = (r == 'i' || r == 'I');
    switch (d) { 
    case 1: return 0;
    case 2: return (inner ? 1 : 2);
    case 3: return (inner ? 4 : 3);
    }
    ::Warning("", "Unknown ring FMD%d%c", d, r);
    return 0xFFFF;
  }
  void Init(TTree* tree) 
  {
    Info("Init", "Got a tree: %p", tree);

    if (!tree) { 
      Warning("Init", "No tree passed");
      return;
    }
    
    fTree = tree;
    fHits = new TClonesArray("AliFMDMCTrackELoss::Hit");
    fTree->SetBranchAddress("hits", &fHits);
  }    
  void Begin(TTree* tree)
  {
    Info("Begin", "Called w/tree @ %p", tree);
    // if (tree) SlaveBegin(tree);
    new Monitor;
  }
  /** 
   * Begin on slave 
   * 
   * @param tree Tree to process 
   */  
  void SlaveBegin(TTree* tree)
  {
    Info("SlaveBegin", "Got a tree: %p", tree);
    fRings = new TObjArray(5);
    fRings->SetName("rings");
    fRings->SetOwner(true);
    fRings->AddAt(new Ring(1,'I'), Index(1,'I'));
    fRings->AddAt(new Ring(2,'I'), Index(2,'I'));
    fRings->AddAt(new Ring(2,'O'), Index(2,'O'));
    fRings->AddAt(new Ring(3,'O'), Index(3,'O'));
    fRings->AddAt(new Ring(3,'I'), Index(3,'I'));

    fOutput->Add(fRings);
    if (tree) {
      // In case of local mode, we get the tree here, 
      // and init isn't called 
      Init(tree);
    }
  }
  /* @} */

  /** 
   * @{ 
   * @name Event processing 
   */
  Bool_t Notify() 
  {
    TFile* file = (fTree ? fTree->GetCurrentFile() : 0);
    Info("Notify","processing file: %p (%s)", 
	 file, (file ? file->GetName() : "nil"));
    return true;
  }
  /** 
   * Process an entry 
   * 
   * @param entry Entry 
   * 
   * @return true on success 
   */
  Bool_t Process(Long64_t entry)
  {
    if (!fTree) {
      Warning("Process", "No tree");
      return false;
    }
    if (!fTree->GetTree()) {
      Warning("Process", "No real tree");
      return false;
    }
    fHits->Clear();
    fTree->GetTree()->GetEntry(entry);
    fI++;
    // if (fI % 100 == 0) {
    //   printf("Event # %6d (%6d hits)\r", fI, fHits->GetEntries());
    //   fflush(stdout);
    // }
    // Printf("Event # %7d, %6d hits", fI, fHits->GetEntries());
  
    TIter next(fHits);
    AliFMDMCTrackELoss::Hit* hit = 0;
    while ((hit = static_cast<AliFMDMCTrackELoss::Hit*>(next()))) 
      Fill(hit);
   return true;
  }
  /** 
   * Get a Ring 
   * 
   * @param d Detector 
   * @param r Ring 
   *
   * @return Pointer to ring object or null
   */
  Ring* Get(UShort_t d, Char_t r) 
  {
    return static_cast<Ring*>(fRings->At(Index(d,r)));
  }
  /** 
   * Get a Ring 
   * 
   * @param d Detector 
   * @param r Ring 
   *
   * @return Pointer to constant ring object or null
   */
  const Ring* Get(UShort_t d, Char_t r) const
  {
    return static_cast<Ring*>(fRings->At(Index(d,r)));
  }
  /** 
   * Fill in to a ring object 
   * 
   * @param hit Hit information
   */
  void Fill(AliFMDMCTrackELoss::Hit* hit)
  {
    Ring* r = Get(hit->D(), hit->R());
    r->Fill(hit);
  }
  /* @} */

  /** 
   * @{ 
   * @name Final processing 
   */
  void SlaveTerminate()
  {
  }
  /** 
   * Terminate the job 
   * 
   */
  void Terminate()
  {
    Printf("\nDone (rings=%p)", fRings);

    if (!fRings) 
      fRings = static_cast<TObjArray*>(fOutput->FindObject("rings"));
    if (!fRings) { 
      Error("Terminate", "No rings in output array");
      return;
    }
    // fRings->ls();
    
    TFile* out = TFile::Open("tuple_summary.root", "RECREATE");
    Store(out);

    PlotOne(Ring::kBetaGamma,        "#beta#gamma - all",     out);
    PlotOne(Ring::kBetaGammaPi,      "#beta#gamma - Hadrons", out);
    PlotOne(Ring::kBetaGammaElectron,"#beta#gamma - e^{#pm}", out);
    PlotOne(Ring::kTypes,            "Relative abundance",    out);
  }
  /** 
   * Plot one quantity 
   * 
   * @param which 
   * @param what 
   */
  void PlotOne(UShort_t which, const char* title, 
	       TDirectory* dir=0, Option_t* opt="")
  {
    static Int_t cnt  = 1;
    const char*  name = Form("c%02d", cnt++);
      
    TCanvas* c = new TCanvas(name, title, 1000, 1000);
    c->SetFillColor(0);
    c->SetFillStyle(0);
    c->SetTopMargin(0.01);
    c->SetRightMargin(0.03);

    TLegend* leg   = new TLegend(0.65, 0.65, 0.975, 0.975);
    leg->SetFillStyle(0);
    leg->SetBorderSize(0);

    TString xTitle = "";
    THStack* stack = new THStack(name, title);
    for (Int_t i = 0; i < 5; i++) { 
      Ring*    ring = static_cast<Ring*>(fRings->At(i));
      Spectra* spec = ring->Get(which);
      if (!spec) { 
	Warning("PlotOne", "No spectra for %d", which);
	continue;
      }

      // Add to our stack 
      spec->Stack(stack, leg);

      // Get X title 
      if (xTitle.IsNull() && spec->Hist(true))
	xTitle = spec->Hist(true)->GetXaxis()->GetTitle();
      
      // If we're not at the last one continue 
      if (i < 4) continue;

      // Add primary/secondary entry to legend 
      spec->Stack(0, leg);

    }
    c->cd();
    if (!stack->GetHists() || 
	stack->GetHists()->GetEntries() < 0) {
      Warning("PlotOne", "No histograms added");
      return;
    }
    stack->Draw(Form("nostack %s", opt));
    stack->GetHistogram()->SetXTitle(xTitle);
    stack->GetHistogram()->GetListOfFunctions()->Add(leg);
    
    leg->Draw();

    if (which != Ring::kTypes) {
      c->SetLogx();
      c->SetLogy();
    }

    TLatex* ltx = new TLatex(0.02, 0.02, fTitle);
    ltx->SetNDC();
    ltx->SetTextColor(kRed+2);
    ltx->SetTextAlign(11);
    ltx->SetTextSize(0.02);
    ltx->Draw();
    stack->GetHistogram()->GetListOfFunctions()->Add(ltx);

    if (dir) {
      dir->cd();
      stack->Clone()->Write();
    }
      

    c->Modified();
    c->Update();
    c->cd();

    c->Print(Form("%s.pdf", name));
  }
  /** 
   * Store this on file 
   *
   * @param dir Parent directory 
   */
  void Store(TDirectory* dir)
  {
    TDirectory* out = dir->mkdir(fTitle);
    out->cd();
    TIter next(fRings);
    Ring* ring = 0;
    while ((ring = static_cast<Ring*>(next()))) 
      ring->Store(out);
    dir->cd();
  }
  /* @} */

  /** 
   * @{
   * @name Other interface 
   */
  /** 
   * Get the version of the selector 
   * 
   * @return 1 
   */
  Int_t Version() const { return 1; }
  /** 
   * Get the status
   * 
   * @return Number of processedd events 
   */
  Long64_t GetStatus() const { return fI; }
  
  /* @} */
    
  //------------------------------------------------------------------
  /** 
   * @{ 
   * @name Service functions 
   */
  //------------------------------------------------------------------
  /** 
   * Get a chain or data set from the given file 
   * 
   * @param file File to look in 
   * 
   * @return Pointer to object or null
   */
  static TObject* GetChainOrDataSet(const char* file)
  {
    if (gSystem->AccessPathName(file)) return 0;

    TFile* in = TFile::Open(file, "READ");
    if (!in) return 0;

    TObject* ret = in->Get("tree");
    if (!ret) { 
      in->Close();
      return 0;
    }
    
    if (ret->IsA()->InheritsFrom(TChain::Class())) 
      static_cast<TChain*>(ret)->SetDirectory(0);
    else if (ret->IsA()->InheritsFrom(TDSet::Class())) 
      static_cast<TDSet*>(ret)->SetDirectory(0);
    else { 
      ::Warning("GetChainOrDataSet", "Found object is a %s", 
		ret->IsA()->GetName());
      ret = 0;
    }
    in->Close();
    return ret;
  }
  //------------------------------------------------------------------
  /** 
   * make our data set
   * 
   * @param src        Source directory 
   * @param recursive  Whether to scan recursively 
   * @param verbose    Be verbose
   * 
   * @return Data set or null
   */
  static TDSet* MakeDataSet(const TString& src=".", 
			    Bool_t recursive=false, 
			    Bool_t verbose=false)
  {
    TString dsFile(Form("%s/dataset.root", src.Data()));
    TDSet* dataset = static_cast<TDSet*>(GetChainOrDataSet(dsFile));
    if (dataset) {
      /// dataset->Print("a");
      return dataset;
    }

    TChain* c = DoMakeChain(src, recursive, verbose);
    if (!c) return 0;
    
    dataset = new TDSet(*c, false);
    dataset->SetName("tree");
    dataset->SetLookedUp();
    dataset->Validate();
    
    delete c;
    if (dataset) { 
      TFile* out = TFile::Open(dsFile, "RECREATE");
      dataset->Write();
      dataset->SetDirectory(0);
      out->Close();
    }
      
    return dataset;
    
  }
  //------------------------------------------------------------------
  /** 
   * Create our chain 
   * 
   * @param src        Source directory 
   * @param recursive  Whether to scan recursively 
   * @param verbose    Be verbose
   * 
   * @return Chain or null
   */
  static TChain* MakeChain(const TString& src=".", 
			   Bool_t recursive=false,
			   Bool_t verbose=false)
  {
    TString chFile(Form("%s/chain.root", src.Data()));
    if (!gSystem->AccessPathName(chFile)) { 
      TFile* in = TFile::Open(chFile, "READ");
      if (in) { 
	TChain* ret = static_cast<TChain*>(in->Get("tree"));
	if (ret) {
	  ret->SetDirectory(0);
	  // ret->GetListOfFiles()->ls();
	}
	in->Close();
	if (ret) return ret;
      }
    }
	  
    TChain* chain = DoMakeChain(src, recursive, verbose);
    if (chain) { 
      TFile* out = TFile::Open(chFile, "RECREATE");
      chain->Write();
      chain->SetDirectory(0);
      out->Close();
    }
      
    return chain;
  }
  //------------------------------------------------------------------
  /** 
   * Create our chain 
   * 
   * @param src        Source directory 
   * @param recursive  Whether to scan recursively 
   * @param verbose    Be verbose
   * 
   * @return Chain or null
   */
  static TChain* DoMakeChain(const TString& src=".", 
			     Bool_t recursive=false,
			     Bool_t verbose=false)
  {
    TChain* chain = new TChain("tree"); 
    TString savdir(gSystem->WorkingDirectory());
    TSystemDirectory d(gSystem->BaseName(src.Data()), src.Data());
    if (!ScanDirectory(&d, chain, "forward_tree_*", recursive, verbose)) {
      delete chain;
      chain = 0;
    }
    else if (!chain->GetListOfFiles() || 
	chain->GetListOfFiles()->GetEntries() <= 0) {
      delete chain;
      chain = 0;
    }
    return chain;
  }

  //------------------------------------------------------------------
  /** 
   * Scan directory @a dir (possibly recursive) for tree files to add
   * to the chain.    This does not follow sym-links
   * 
   * @param dir        Directory to scan
   * @param chain      Chain to add to
   * @param pattern    File name pattern 
   * @param anchor     Anchor (tree name)
   * @param flags      Flags
   *
   * @return true if any files where added 
   */
  static Bool_t ScanDirectory(TSystemDirectory* dir,
			      TChain*           chain, 
			      const TString&    pattern, 
			      Bool_t            recursive,
			      Bool_t            verbose) 
  {
    if (!dir) {
      ::Error("ScanDirectory", "No diretory passed");
      return false;
    }
    if (verbose) ::Info("ScanDirectory", "Scanning %s", dir->GetName());

    Bool_t  ret = false;
    TRegexp wild(pattern, true);
    TString oldDir(gSystem->WorkingDirectory());
    TList* files = dir->GetListOfFiles();

    if (!gSystem->ChangeDirectory(oldDir)) { 
      ::Error("ScanDirectory", "Failed to go back to %s", 
	      oldDir.Data());
      return false;
    }
    if (!files) {
      ::Warning("ScanDirectory", "No files");
      return false;
    }

    TList toAdd;
    toAdd.SetOwner();

    // Sort list of files and check if we should add it 
    files->Sort();
    TIter next(files);
    TSystemFile* file = 0;
    while ((file = static_cast<TSystemFile*>(next()))) {
      TString name(file->GetName());
      TString title(file->GetTitle());
      TString full(gSystem->ConcatFileName(file->GetTitle(), name.Data()));
      if (file->IsA()->InheritsFrom(TSystemDirectory::Class())) full = title;


      if (name.EqualTo(".")||name.EqualTo(".."))  {
	// Ignore special links 
	if (verbose) ::Info("ScanDirectory", "Ignoring special %s",
			    name.Data());
	continue;
      }

      if (verbose) ::Info("ScanDirectory", "Looking at %s", full.Data());

      FileStat_t fs;
      if (gSystem->GetPathInfo(full.Data(), fs)) {
	::Warning("ScanDirectory", "Cannot stat %s (%s)", 
		  full.Data(), gSystem->WorkingDirectory());
	continue;
      }
      // Check if this is a directory 
      if (file->IsDirectory(full)) { 
	if (verbose) ::Info("ScanDirectory", "Got a directory: %s", 
			    full.Data());
	if (recursive) {
	  // if (title[0] == '/') 
	  TSystemDirectory* d = new TSystemDirectory(file->GetName(),
						     full.Data());
	  if (ScanDirectory(d, chain, pattern, recursive, verbose))
	    ret = true;
	  delete d;
	}
	continue;
      }

      // If this is not a root file, ignore 
      if (!name.EndsWith(".root") && 
	  !name.EndsWith(".zip",TString::kIgnoreCase)) {
	if (verbose) ::Info("ScanDirectory", "Ignoring non-ROOT or ZIP %s",
			    name.Data());
	continue;
      }

      // If this file does not contain AliESDs, ignore 
      if (!name.Contains(wild)) {
	if (verbose) ::Info("ScanDirectory", "%s does not match %s",
			    name.Data(), pattern.Data());
	continue;
      }
      // Add 
      if (verbose) 
	::Info("::ScanDirectory", "Candidate %s", full.Data());
      toAdd.Add(new TObjString(full));
    }
    TIter nextAdd(&toAdd);
    TObjString* s = 0;
    Int_t added = 0;
    while ((s = static_cast<TObjString*>(nextAdd()))) {
      // Info("ChainBuilder::ScanDirectory", 
      //      "Adding %s", s->GetString().Data());
      TString fn = s->GetString();
      if (!CheckFile(fn, chain, true/*verbose*/)) continue;
       
      added++;
    }
    if (added > 0) ret = true;
    if (verbose) ::Info("ScanDirectory", "Added %d files", added);

    gSystem->ChangeDirectory(oldDir);
    return ret;  
  }
  //------------------------------------------------------------------
  /** 
   * Check if we can add a file to the chain 
   * 
   * @param path   Full path to file 
   * @param chain  Chain 
   * 
   * @return true on success, false otherwise
   */
  static Bool_t CheckFile(const TString& path, 
			  TChain* chain,
			  Bool_t verbose)
  {
    // Info("", "Checking %s", path.Data());
    TString fn   = path;

    gSystem->RedirectOutput("/dev/null", "w");
    TFile*  test = TFile::Open(fn, "READ");
    gSystem->RedirectOutput(0);
    if (!test) { 
      ::Warning("CheckFile", "Failed to open %s", fn.Data());
      return false;
    }
    
    Bool_t           ok = false;
    TObject*         o  = test->Get(chain->GetName());
    TTree*           t  = dynamic_cast<TTree*>(o);
    TFileCollection* c  = dynamic_cast<TFileCollection*>(o);
    if (t) {
      Int_t n = t->GetEntries();
      test->Close();
      chain->Add(fn, n);
      ok = true;
      if (verbose) ::Info("CheckFile", "Added file %s (%d)", fn.Data(), n);
    } else if (c) {
      chain->AddFileInfoList(c->GetList());
      ok = true;
      if (verbose) ::Info("CheckFile", "Added file collection %s", fn.Data());
    } else {
      // Let's try to find a TFileCollection 
      TList* l = test->GetListOfKeys();
      TIter next(l);
      TKey* k = 0;
      while ((k = static_cast<TKey*>(next()))) {
	TString cl(k->GetClassName());
	if (!cl.EqualTo("TFileCollection")) continue;
	c = dynamic_cast<TFileCollection*>(k->ReadObj());
	if (!c) { 
	  ::Warning("CheckFile", "Returned collection invalid");
	  continue;
	}
	// Info("", "Adding file collection");
	chain->AddFileInfoList(c->GetList());
	ok = true;
	if (verbose) ::Info("CheckFile", "Added file collection %s", fn.Data());
      }
      test->Close();
    }

    if (!ok) 
      ::Warning("CheckFile", 
		"The file %s does not contain the tree %s "
		"or a file collection", 
		path.Data(), chain->GetName());
    return ok;
  }

  /** 
   * Run this selector on a chain locally 
   * 
   * @param maxEvents Maximum number of events 
   * @param title     Optional title 
   * @param maxFiles  Maximum number of files to put in chain 
   * 
   * @return true on sucess 
   */
  static Bool_t Run(Long64_t maxEvents=-1, 
		    const char* title="")
  {
    TStopwatch timer;
    timer.Start();
    TChain* chain = MakeChain("tuple");
    if (!chain) { 
      ::Error("Run", "No chain!");
      return false;
    }

    TupleSelector* s = new TupleSelector(title);
    Int_t status= chain->Process(s, "", maxEvents);
    timer.Print();
    return status >= 0;
  }
  /** 
   * Run this selector on a chain in Proof 
   * 
   * @param maxEvents Maximum number of events 
   * @param title     Optional title 
   * @param maxFiles  Maximum number of files to put in chain 
   * 
   * @return true on sucess 
   */
  static Bool_t Proof(Long64_t    maxEvents, 
		      const char* opt="",
		      const char* title="")
  {
    TStopwatch timer;
    timer.Start();
    TProof::Reset("lite:///?workers=8");
    TProof::Open("lite:///?workers=8");
    gProof->ClearCache();
    TString ali = gSystem->ExpandPathName("$(ALICE_ROOT)");
    TString fwd = ali + "/PWGLF/FORWARD/analysis2";
    gProof->AddIncludePath(Form("%s/include", ali.Data()));
    gProof->Load(Form("%s/scripts/LoadLibs.C",fwd.Data()), true);
    gProof->Exec("LoadLibs()");
    // gROOT->ProcessLine("gProof->SetLogLevel(5);");
    gProof->Load(Form("%s/scripts/TupleSelector.C+%s", fwd.Data(), opt),true);

    TDSet* dataset = MakeDataSet("tuple");
    if (!dataset) { 
      ::Error("Proof", "No dataset");
      return false;
    }
    
    TupleSelector* s = new TupleSelector(title);
    gProof->AddFeedback("rings");
    gProof->Process(dataset, s, "", maxEvents);
    timer.Print();
    return true; // status >= 0;
  }    

  /* @} */
  ClassDef(TupleSelector,2);

private:
  /** 
   * Copy constructor 
   */
  TupleSelector(const TupleSelector&); // {}
  /** 
   * Assignment operator
   * 
   * @return Reference to this object 
   */
  TupleSelector& operator=(const TupleSelector&); // { return *this; } 

};


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