ROOT logo
#ifndef __CINT__
# include <TFile.h>
# include <TString.h>
# include <TGraphAsymmErrors.h>
# include <TMultiGraph.h>
# include <TROOT.h>
# include <TError.h>
# include <TSystem.h>
# include <TH1F.h>
# include <TStyle.h>
# include <TMath.h>
#else 
class TFile;
class TGraphAsymmErrors;
class TMultiGraph;
class TGraph;
class TH1;
#endif 


struct RefData
{
  //____________________________________________________________________
  /**
   * Values used 
   * 
   * @ingroup pwglf_forward_otherdata 
   */
  enum { 
    UA5, 
    CMS, 
    ALICE, 
    WIP,
    PYTHIA,
    INEL, 
    INELGt0, 
    NSD
  };
  
  //____________________________________________________________________
  /** 
   * Get a pointer to our data file.  @a path is the path to the file
   * containing the data.  If it is null, then first search the
   * current directory, and if not found there, search in specific
   * AliROOT directory. If @a rw is try the file is (re-)opened in
   * UPDATE mode.
   * 
   * @param path Path to file.
   * @param rw   If true, open read/write.  
   * 
   * @return Pointer to file, or null
   */
  static TFile* GetFile(const char* path=0, Bool_t rw=false) { 
    TString base = ((path && path[0] != '\0') ? 
		    gSystem->BaseName(path) : "other.root");
      
    TObject* o = gROOT->GetListOfFiles()->FindObject(base);
    
    TFile* f  = 0;
    if (o) {
      f = static_cast<TFile*>(o);
      if (!rw) return f;
      if (!f->IsWritable() && f->ReOpen("UPDATE") < 0) return 0;
      return f;
    }

    const char* mode = (rw ? "UPDATE" : "READ");
    if (path && path[0] != '\0' && !gSystem->AccessPathName(path)) 
      f = TFile::Open(path, mode);
    if (!f && !gSystem->AccessPathName("other.root")) 
      f = TFile::Open("other.root", mode);
    if (!f) 
      f = TFile::Open("$ALICE_ROOT/PWGLF/FORWARD/analysis2/other.root",mode);
    if (!f) 
      ::Error("", "Failed to open file");
    return f;
  }
  //____________________________________________________________________
  /** 
   * Get the collision system name from the identifier (1: pp, 2:
   * PbPb, 3: pPb)
   * 
   * @param sys Collision system identifier 
   * 
   * @return String or null
   */
  static const char* SysName(UShort_t sys) { 
    switch (sys) { 
    case 1: return "pp";
    case 2: return "PbPb";
    case 3: return "pPb";
    }
    ::Error("", "Unknown system: %d", sys);
    return 0;
  }
  //____________________________________________________________________
  /** 
   * Get the zero-padded collision energy name 
   * 
   * @param sNN Collision energy (in GeV)
   * 
   * @return Zero-padded collision energy
   */
  static const char* SNNName(UShort_t sNN) 
  { 
    return Form("%05d", sNN);
  }
  //____________________________________________________________________
  /** 
   * Get the centrality method prefix.  @a trg is a bit mask, of which
   * bits 4-7 are used here.  The flags are 
   *
   * - 0x10 V0M 
   * - 0x20 V0A
   * - 0x40 ZNA
   * - 0X80 ZNC
   * 
   * @param trg Bits
   * 
   * @return Prefix string or empty string 
   */
  static const char* CntName(UShort_t trg) 
  {
    switch (trg >> 4) { 
    case 1: return "V0M_";
    case 2: return "V0A_";
    case 4: return "ZNA_";
    case 8: return "ZNC_";
    }
    return "";
  }
  //____________________________________________________________________
  /** 
   * Get the trigger name.  If @f$ c_2 > c_1@f$ then the bits of @a
   * trg are ignored, save for the bits 4-7 which are interpreted
   * according to CntName.
   *
   * The meaning of the bits are 
   *
   * - 0x01 INEL
   * - 0x02 INEL>0
   * - 0x04 NSD 
   * - 0xf0 Mask for centrality estimator. 
   * 
   * @param trg Trigger mask.  
   * @param c1  Least centrality @f$ c_1@f$ 
   * @param c2  Largest centrality @f$ c_2@f$
   * 
   * @return Trigger string or null
   */
  static const char* TrgName(UShort_t trg, UShort_t c1, UShort_t c2)
  {
    if (c2 > c1) return Form("%s%03d_%03d", CntName(trg), c1, c2);

    switch (trg) { 
    case 1: return "INEL";
    case 2: return "INELGT0";
    case 4: return "NSD";
    }
    ::Error("", "Unknown trigger: %d", trg);
    return 0;
  }
  //____________________________________________________________________
  /** 
   * Get the experiment name.  
   *
   * - 0: UA5 
   * - 1: CMS 
   * - 2: ALICE (published or pre-print)
   * - 3: ALICE Work-in-progress 
   * - 4: PYTHIA (or MC)
   * 
   * @param which Experiment identifier 
   * 
   * @return Experiment name or null
   */
  static const char* ExpName(UShort_t which) 
  {
    switch (which) { 
    case 0: return "UA5";
    case 1: return "CMS";
    case 2: return "ALICE";
    case 3: return "WIP";
    case 4: return "PYTHIA";
    }
    ::Error("", "Unknown experiment: %d", which); 
    return 0;
  }
  // _________________________________________________________________
  /** 
   * Get graphs for selected experiments under @a d.  
   * 
   * @param d        Directory to search
   * @param which    Which experiments to get data from 
   * @param verbose  Whether to be verbose or not 
   * 
   * @return Graph of data, or null
   */
  static TMultiGraph* GetExps(TDirectory* d, UShort_t which, Bool_t verbose)
  {
    TMultiGraph* ret = 0;
    for (UShort_t w = UA5; w <= PYTHIA; w++) { 
      if (!(which & (1 << w))) continue;

      const char* expName = ExpName(w);
      TDirectory* expDir  = 0;
      if (!expName || !(expDir = d->GetDirectory(expName))) continue;

      TObject* o = expDir->Get("data");
      if (o) {
	if (!ret) ret = new TMultiGraph();
	TMultiGraph* mg = static_cast<TMultiGraph*>(o);
	if (w == WIP) { 
	  TIter   next(mg->GetListOfGraphs());
	  TGraph* g = 0;
	  while ((g = static_cast<TGraph*>(next()))) 
	    if (g->GetMarkerColor() == kMagenta+3) {
	      g->SetMarkerColor(kCyan-6);
	      g->SetLineColor(kCyan-6);
	    }
	}
	ret->Add(mg);
      }
    }
    if (!ret && verbose)
      ::Error("GetExps", "Didn't get any data for exp=0x%x in dir %s", 
	      which, d->GetPath());
    return ret;
  }

  // _________________________________________________________________
  /** 
   * Get data for selected trigger and experiments under @a d.  
   * 
   * @param d        Directory to seach 
   * @param type     Which triggers 
   * @param which    Which experiments
   * @param verbose  Whether to be verbose 
   * 
   * @return Graph of data, or null
   */
  static TMultiGraph* GetTrigs(TDirectory* d, UShort_t type, 
			       UShort_t which, Bool_t verbose) 
  {
    TMultiGraph* ret = 0;
    for (UShort_t t = INEL; t <= NSD; t++) { 
      UShort_t trg = (1 << (t-INEL));
      if (!(type & trg)) {
	if (verbose) 
	  ::Info("GetTrigs", "Skipping trigger 0x%x (0x%x)", trg, type);
	continue;
      }

      const char* trgName = TrgName(trg, 0, 0);
      TDirectory* trgDir  = 0;
      if (!trgName || !(trgDir = d->GetDirectory(trgName))) {
	if (verbose) 
	  ::Warning("GetTrigs", "No directory %s for 0x%x in %s", 
		    trgName, trg, d->GetPath());
	continue;
      }

      TMultiGraph* g = GetExps(trgDir, which, verbose);
      if (g) { 
	if (!ret) ret = new TMultiGraph();
	ret->Add(g);
      }
    }
    if (!ret) 
      ::Error("GetTrigs", 
	      "Didn't get any data for trigger=0x%x and exp=0x%x in dir %s", 
	      type, which, d->GetPath());
    return ret;
  }

  // _________________________________________________________________
  /** 
   * Get data for selected centrality range 
   * 
   * @param d            Directory to search
   * @param experiment   Which experiment 
   * @param trigger      Which centrality estimator (possibly 0)
   * @param centLow      Least centrality 
   * @param centHigh     Largetst centrality
   * @param verbose      Whether to be verbose 
   * 
   * @return Graph of data or null
   */
  static TMultiGraph* GetCents(TDirectory* d, UShort_t experiment, 
			       UShort_t trigger, UShort_t centLow, 
			       UShort_t centHigh, Bool_t verbose) 
  {
    // We need to find the bins we can and check for the
    // experiments
    TMultiGraph* ret = 0;
    TIter    next(d->GetListOfKeys());
    TObject* obj = 0;
    const char* cntPre = CntName(trigger);
    // Info("", "trigger=0x%x pre=%s", trigger, cntPre);
    while ((obj = next())) { 
      TString n(obj->GetName());
      if (n.EqualTo("all")) continue;
      UShort_t off = 0;
      if (cntPre && cntPre[0] != '\0') {
	if (!n.BeginsWith(cntPre, TString::kIgnoreCase)) continue;
	off = 4;
      }
      if (n.Length() != 7+off) continue;
      
      TString l1(n(off,  3)); TString l2 = l1.Strip(TString::kLeading, '0');
      TString h1(n(off+4,3)); TString h2 = h1.Strip(TString::kLeading, '0');
      UShort_t c1 = l2.Atoi();
      UShort_t c2 = h2.Atoi();
      
      // Info("", "n=%s off=%d c1=%d c2=%d", n.Data(), off, c1, c2);
      if (c1 < centLow || c2 > centHigh) {
	if (verbose) ::Info("", "Skipping %s in %s", n.Data(),d->GetPath());
	continue;
      }
      
      TDirectory* centDir = d->GetDirectory(obj->GetName());
      if (!centDir) continue;
      
      TMultiGraph* exps = GetExps(centDir, experiment, verbose);
      if (exps) {
	if (!ret) ret = new TMultiGraph();
	ret->Add(exps);
      }
    } // experiment (key)
    if (!ret && verbose) 
      ::Error("GetCents", "No graphs for centralities %d-%d%% in %s", 
	      centLow, centHigh, d->GetPath());
    return ret;
  }
  //____________________________________________________________________
  /** 
   * Get a multi graph of data for a given energy and trigger type 
   * 
   * @param sys      Collision system (1: pp, 2: PbPb, 3: pPb)
   * @param energy   Energy in GeV (900, 2360, 2760, 7000, 8000)
   * @param triggers Bit pattern of trigger type 
   *   - 0x01 INEL 
   *   - 0x02 INEL>0
   *   - 0x04 NSD 
   *   - 0xF0 Mask for centrality estimator 
   * @param centLow     Low centrality cut (not pp)
   * @param centHigh    High centrality cut (not pp)
   * @param experiments From which experiments 
   * 
   * @return A multi graph with the selected data. 
   * 
   * @ingroup pwglf_forward_otherdata
   */
  static TMultiGraph* GetData(UShort_t sys, 
			      UShort_t sNN,
			      UShort_t triggers=0x1, 
			      UShort_t centLow=0, 
			      UShort_t centHigh=0, 
			      UShort_t experiments=0x7)
  {
    Bool_t verbose = false;
    UShort_t trg = (triggers & 0xF7);
    if (triggers & 0x2000) trg |= 0x4;

    TFile* f = GetFile(0,false);
    if (!f) return 0;

    TDirectory* sysDir = 0;
    const char* sysName = SysName(sys);
    if (!sysName || !(sysDir = f->GetDirectory(sysName))) { 
      ::Error("", "Invalid system %d (%s)", sys, sysName);
      return 0;
    }

    TDirectory* sNNDir = 0;
    const char* sNNName = SNNName(sNN);
    if (!sNNName || !(sNNDir = sysDir->GetDirectory(sNNName))) { 
      ::Error("", "Invalid CMS energy %d (%s)", sNN, sNNName);
      return 0;
    }

    TMultiGraph* ret = 0;
    // If we have a centrality request 
    if (centHigh > centLow) { 
      if (centLow == 0 && centHigh >= 100) 
	ret = GetCents(sNNDir, experiments, trg, 
		       centLow, centHigh, verbose);
      else {
	// Look for specific centrality bin 
	TDirectory* centDir = sNNDir->GetDirectory(TrgName(trg, 
							   centLow,centHigh));
	if (!centDir) {
	  Warning("", "No directory '%s' (0x%x,%d%d)", 
		  TrgName(trg, centLow,centHigh), trg, centLow, centHigh);
	  return 0;
	}

	return GetExps(centDir, experiments, verbose);
      }
    } // centHigh > centLow
    else 
      ret = GetTrigs(sNNDir, trg, experiments, verbose);

    if (ret) {
      TString title;
      FormatTitle(title, sys, sNN, trg, centLow, centHigh);
      ret->SetTitle(title);
    }
    return ret;
  }
  //__________________________________________________________________
  /** 
   * Format title of a plot
   * 
   * @param title     On return, the title 
   * @param sys      Collision system (1: pp, 2: PbPb, 3: pPb)
   * @param energy   Energy in GeV (900, 2360, 2760, 7000, 8000)
   * @param triggers Bit pattern of trigger type 
   *   - 0x01 INEL 
   *   - 0x02 INEL>0
   *   - 0x04 NSD 
   *   - 0xF0 Mask for centrality estimator 
   * @param centLow  Low centrality cut (not pp)
   * @param centHigh High centrality cut (not pp)
   * @param seenUA5  If true and sys=1, then put in p-pbar
   */
  static void FormatTitle(TString& title,
			  UShort_t sys, 
			  UShort_t sNN,
			  UShort_t triggers, 
			  UShort_t centLow, 
			  UShort_t centHigh,
			  Bool_t   seenUA5=false)
  {
    TString sn(SysName(sys));
    if (seenUA5) sn.Append("(p#bar{p})");

    TString en(Form("#sqrt{s%s}=", (sys==1 ? "" : "_{NN}")));
    if (sNN < 1000)             en.Append(Form("%dGeV", sNN));
    else if ((sNN % 1000) == 0) en.Append(Form("%dTeV",  (sNN/1000)));
    else                        en.Append(Form("%.2fTeV",  Float_t(sNN)/1000));
    TString tn;
    if (centHigh > centLow) 
      tn = Form("%d%% - %d%% central", centLow, centHigh);
    else { 
      for (UShort_t t = INEL; t <= NSD; t++) { 
	UShort_t trg = (1 << (t-INEL));
	if (!(triggers & trg)) continue;
	if (!tn.IsNull()) tn.Append("|");
	switch (t) { 
	case INEL:    tn.Append("INEL"); break;
	case INELGt0: tn.Append("INEL>0"); break;
	case NSD:     tn.Append("NSD"); break;
	}
      } // for 
    }
    if (!en.IsNull()) en.Prepend(", ");
    if (!tn.IsNull()) tn.Prepend(", ");
    title.Form("%s%s%s", sn.Data(), en.Data(), tn.Data());
  }
  //=== Importing ====================================================
  enum { 
    /** Style used for UA5 data */
    UA5Style   = 21, 
    /** Style used for CMS data */
    CMSStyle   = 29, 
    /** Style used for ALICE published data */
    ALICEStyle = 27,
    /** Color used for ALICE work-in-progress data */
    WIPStyle = 33,
    /** Style used for Pythia data */
    PYTHIAStyle = 28,
    /** Color used for UA5 data */
    UA5Color   = kBlue+1,
    /** Color used for Pytia data */
    PYTHIAColor = kGray+2,
    /** Color used for CMS data */
    CMSColor   = kGreen+1,
    /** Color used for ALICE data */
    ALICEColor = kMagenta+1,
    /** Color used for ALICE work-in-progress data */
    WIPColor = kCyan+2
  }; 
  enum { 
    /** Marker style INEL data */
    INELStyle   = 22,
    /** Marker style INEL>0 data */
    INELGt0Style= 29,
    /** Marker style NSD data */
    NSDStyle    = 23,
    /** Color used for UA5 data */
    INELColor   = kBlue+1,
    /** Color used for CMS data */
    INELGt0Color = kGreen+1,
    /** Color used for ALICE data */
    NSDColor     = kMagenta+1
  };
  enum {
    /** Style offset for mirror data */
    MirrorOff  = 4
  };
  //____________________________________________________________________
  /** 
   * Set graph attributes based on trigger type and experiment. 
   * 
   * @param g        Graph
   * @param exp      Experiment 
   * @param mirror   True if mirrored data 
   * @param name     Name of graph 
   * @param title    Title of graph 
   * 
   * @ingroup pwglf_forward_otherdata
   */
  static void SetGraphAttributes(TGraph* g, 
				 Int_t /*trig*/, 
				 Int_t exp, 
				 bool mirror,
				 const Char_t* name, 
				 const Char_t* title)
  {
    Int_t color = 0;
    Int_t style = 0;
    switch (exp) { 
    case UA5:       color = UA5Color;    style = UA5Style;     break;
    case CMS:       color = CMSColor;    style = CMSStyle;     break;
    case ALICE:     color = ALICEColor;  style = ALICEStyle;   break;
    case WIP:       color = WIPColor;    style = WIPStyle;     break;
    case PYTHIA:    color = PYTHIAColor; style = PYTHIAStyle;  break;
    }
    Float_t size = g->GetMarkerSize();
    switch (style) {
    case 21: // fall-through
    case 25: size *= 0.8; break;
    case 27: size *= 1.4; break;
    case 33: size *= 1.4; break;
    }
    
    if (mirror) style += MirrorOff;

    if (name)  g->SetName(name);
    if (title) g->SetTitle(title);
    g->SetMarkerStyle(style);
    g->SetMarkerSize(size);
    g->SetMarkerColor(color);
    g->SetLineColor(color);
    g->SetFillColor(0);
    g->SetFillStyle(0);
    g->GetHistogram()->SetStats(kFALSE);
    g->GetHistogram()->SetXTitle("#eta");
    g->GetHistogram()->SetYTitle("#frac{1}{N} #frac{dN_{ch}}{#eta}");
  }
  //__________________________________________________________________
  /** 
   * Get the color for a centrality bin
   * 
   * @param centLow  Centrality bin 
   * @param centHigh Centrality bin 
   * 
   * @return Color 
   */
  static Int_t CentralityColor(UShort_t centLow, 
			       UShort_t centHigh,
			       UShort_t /*nBins*/=0)
  {
#if 0
    if (nBins > 0 && nBins < 6) { 
      switch (bin) { 
      case 1: return kRed+2;
      case 2: return kGreen+2;
      case 3: return kBlue+1;
      case 4: return kCyan+1;
      case 5: return kMagenta+1;
      case 6: return kYellow+2;
      }
    }
#endif
    gStyle->SetPalette(1);
    Float_t  fc       = (centLow+double(centHigh-centLow)/2) / 100;
    Int_t    nCol     = gStyle->GetNumberOfColors();
    Int_t    icol     = TMath::Min(nCol-1,int(fc * nCol + .5));
    Int_t    col      = gStyle->GetColorPalette(icol);
    //Info("GetCentralityColor","%3d: %3d-%3d -> %3d",bin,centLow,centHigh,col);
    return col;
  }
  /** 
   * Import a histogram into the data base
   * 
   * @param h            Histogram
   * @param title        Title on plot
   * @param experiment   Which experiement
   * @param sys          Collision system
   * @param sNN          Collision energy (in GeV)
   * @param trigger      Trigger type 
   * @param centLow      Lease centrality
   * @param centHigh     Largest centrality 
   * @param path         Possible path to database 
   * 
   * @return true on success
   */
  static Bool_t Import(TH1* h, 
		       const char* title, 
		       UShort_t experiment,
		       UShort_t sys, 
		       UShort_t sNN,
		       UShort_t trigger, 
		       UShort_t centLow=0, 
		       UShort_t centHigh=0,
		       const char* path=0)
  {
    TGraphAsymmErrors* g = new TGraphAsymmErrors();
    Int_t nx = h->GetNbinsX();
    Int_t j  = 0;
    for (Int_t i = 1; i <= nx; i++) { 
      Double_t x  = h->GetXaxis()->GetBinCenter(i);
      Double_t ex = h->GetXaxis()->GetBinWidth(i)/2;
      Double_t y  = h->GetBinContent(i);
      Double_t ey = h->GetBinError(i);
      
      if (TMath::Abs(y) < 1e-6 || ey < 1e-6) continue;
      
      g->SetPoint(j, x, y);
      g->SetPointError(j, ex, ex, ey, ey);
      j++;
    }
    if (j <= 0) return false;

    return Import(g, title, experiment, sys, sNN, trigger, centLow, centHigh, 
		  path);
  }
  /** 
   * Import a graph into the data base
   * 
   * @param g            Graph
   * @param title        Title on plot
   * @param experiment   Which experiement
   * @param sys          Collision system
   * @param sNN          Collision energy (in GeV)
   * @param trigger      Trigger type 
   * @param centLow      Lease centrality
   * @param centHigh     Largest centrality 
   * @param path         Possible path to database 
   * 
   * @return true on success
   */
  static Bool_t Import(TGraphAsymmErrors* g,
		       const char* title, 
		       UShort_t experiment,
		       UShort_t sys, 
		       UShort_t sNN,
		       UShort_t trigger, 
		       UShort_t centLow=0, 
		       UShort_t centHigh=0,
		       const char* path=0) 
  {
    if (!g) return false;

    TString     expName = ExpName(experiment); expName.ToLower();
    const char* sNNName = SNNName(sNN);
    const char* sysName = SysName(sys);        
    const char* trgName = TrgName(trigger,centLow,centHigh); 
    TString     name    = Form("%s%s%s%s", 
			       expName.Data(), sysName, sNNName, trgName);
    
    SetGraphAttributes(g, trigger, experiment, false, name, title);
    if (centLow < centHigh) { 
      Int_t col = CentralityColor(centLow, centHigh);
      g->SetMarkerColor(col);
      g->SetLineColor(col);
      g->SetFillColor(col);
    }
      
    TMultiGraph* mg = new TMultiGraph("data","");
    mg->Add(g);

    return Import(mg, experiment, sys, sNN, trigger, centLow, centHigh, path);
  }
  /** 
   * Import a graph into the data base
   * 
   * @param g            Graph
   * @param title        Title on plot
   * @param experiment   Which experiement
   * @param sys          Collision system
   * @param sNN          Collision energy (in GeV)
   * @param trigger      Trigger type 
   * @param centLow      Lease centrality
   * @param centHigh     Largest centrality 
   * @param path         Possible path to database 
   * 
   * @return true on success
   */
  static Bool_t Import(TMultiGraph* g,
		       UShort_t experiment,
		       UShort_t sys, 
		       UShort_t sNN,
		       UShort_t trigger, 
		       UShort_t centLow=0, 
		       UShort_t centHigh=0,
		       const char* path=0)
  {
    TFile* file = GetFile(path, true);
    
    const char* sysName = SysName(sys);
    const char* sNNName = SNNName(sNN);
    const char* trgName = TrgName(trigger, centLow, centHigh);
    const char* expName = ExpName(experiment);
    
    if (!sysName || !sNNName || !trgName || !expName) return false;
    
    TString dirName;
    dirName = Form("%s/%s/%s/%s", sysName, sNNName, trgName, expName);
    
    TDirectory* dir = file->GetDirectory(dirName);
    if (!dir) dir = file->mkdir(dirName);
    file->cd(dirName);

    if (dir->Get("data")) { 
      ::Warning("", "Already have data in %s", dirName.Data());
      // return false;
    }

    g->SetName("data");
    g->Write();
    
    file->cd();
    file->Close();

    return true;
  }
};

// EOF



    
      
 OtherData.C:1
 OtherData.C:2
 OtherData.C:3
 OtherData.C:4
 OtherData.C:5
 OtherData.C:6
 OtherData.C:7
 OtherData.C:8
 OtherData.C:9
 OtherData.C:10
 OtherData.C:11
 OtherData.C:12
 OtherData.C:13
 OtherData.C:14
 OtherData.C:15
 OtherData.C:16
 OtherData.C:17
 OtherData.C:18
 OtherData.C:19
 OtherData.C:20
 OtherData.C:21
 OtherData.C:22
 OtherData.C:23
 OtherData.C:24
 OtherData.C:25
 OtherData.C:26
 OtherData.C:27
 OtherData.C:28
 OtherData.C:29
 OtherData.C:30
 OtherData.C:31
 OtherData.C:32
 OtherData.C:33
 OtherData.C:34
 OtherData.C:35
 OtherData.C:36
 OtherData.C:37
 OtherData.C:38
 OtherData.C:39
 OtherData.C:40
 OtherData.C:41
 OtherData.C:42
 OtherData.C:43
 OtherData.C:44
 OtherData.C:45
 OtherData.C:46
 OtherData.C:47
 OtherData.C:48
 OtherData.C:49
 OtherData.C:50
 OtherData.C:51
 OtherData.C:52
 OtherData.C:53
 OtherData.C:54
 OtherData.C:55
 OtherData.C:56
 OtherData.C:57
 OtherData.C:58
 OtherData.C:59
 OtherData.C:60
 OtherData.C:61
 OtherData.C:62
 OtherData.C:63
 OtherData.C:64
 OtherData.C:65
 OtherData.C:66
 OtherData.C:67
 OtherData.C:68
 OtherData.C:69
 OtherData.C:70
 OtherData.C:71
 OtherData.C:72
 OtherData.C:73
 OtherData.C:74
 OtherData.C:75
 OtherData.C:76
 OtherData.C:77
 OtherData.C:78
 OtherData.C:79
 OtherData.C:80
 OtherData.C:81
 OtherData.C:82
 OtherData.C:83
 OtherData.C:84
 OtherData.C:85
 OtherData.C:86
 OtherData.C:87
 OtherData.C:88
 OtherData.C:89
 OtherData.C:90
 OtherData.C:91
 OtherData.C:92
 OtherData.C:93
 OtherData.C:94
 OtherData.C:95
 OtherData.C:96
 OtherData.C:97
 OtherData.C:98
 OtherData.C:99
 OtherData.C:100
 OtherData.C:101
 OtherData.C:102
 OtherData.C:103
 OtherData.C:104
 OtherData.C:105
 OtherData.C:106
 OtherData.C:107
 OtherData.C:108
 OtherData.C:109
 OtherData.C:110
 OtherData.C:111
 OtherData.C:112
 OtherData.C:113
 OtherData.C:114
 OtherData.C:115
 OtherData.C:116
 OtherData.C:117
 OtherData.C:118
 OtherData.C:119
 OtherData.C:120
 OtherData.C:121
 OtherData.C:122
 OtherData.C:123
 OtherData.C:124
 OtherData.C:125
 OtherData.C:126
 OtherData.C:127
 OtherData.C:128
 OtherData.C:129
 OtherData.C:130
 OtherData.C:131
 OtherData.C:132
 OtherData.C:133
 OtherData.C:134
 OtherData.C:135
 OtherData.C:136
 OtherData.C:137
 OtherData.C:138
 OtherData.C:139
 OtherData.C:140
 OtherData.C:141
 OtherData.C:142
 OtherData.C:143
 OtherData.C:144
 OtherData.C:145
 OtherData.C:146
 OtherData.C:147
 OtherData.C:148
 OtherData.C:149
 OtherData.C:150
 OtherData.C:151
 OtherData.C:152
 OtherData.C:153
 OtherData.C:154
 OtherData.C:155
 OtherData.C:156
 OtherData.C:157
 OtherData.C:158
 OtherData.C:159
 OtherData.C:160
 OtherData.C:161
 OtherData.C:162
 OtherData.C:163
 OtherData.C:164
 OtherData.C:165
 OtherData.C:166
 OtherData.C:167
 OtherData.C:168
 OtherData.C:169
 OtherData.C:170
 OtherData.C:171
 OtherData.C:172
 OtherData.C:173
 OtherData.C:174
 OtherData.C:175
 OtherData.C:176
 OtherData.C:177
 OtherData.C:178
 OtherData.C:179
 OtherData.C:180
 OtherData.C:181
 OtherData.C:182
 OtherData.C:183
 OtherData.C:184
 OtherData.C:185
 OtherData.C:186
 OtherData.C:187
 OtherData.C:188
 OtherData.C:189
 OtherData.C:190
 OtherData.C:191
 OtherData.C:192
 OtherData.C:193
 OtherData.C:194
 OtherData.C:195
 OtherData.C:196
 OtherData.C:197
 OtherData.C:198
 OtherData.C:199
 OtherData.C:200
 OtherData.C:201
 OtherData.C:202
 OtherData.C:203
 OtherData.C:204
 OtherData.C:205
 OtherData.C:206
 OtherData.C:207
 OtherData.C:208
 OtherData.C:209
 OtherData.C:210
 OtherData.C:211
 OtherData.C:212
 OtherData.C:213
 OtherData.C:214
 OtherData.C:215
 OtherData.C:216
 OtherData.C:217
 OtherData.C:218
 OtherData.C:219
 OtherData.C:220
 OtherData.C:221
 OtherData.C:222
 OtherData.C:223
 OtherData.C:224
 OtherData.C:225
 OtherData.C:226
 OtherData.C:227
 OtherData.C:228
 OtherData.C:229
 OtherData.C:230
 OtherData.C:231
 OtherData.C:232
 OtherData.C:233
 OtherData.C:234
 OtherData.C:235
 OtherData.C:236
 OtherData.C:237
 OtherData.C:238
 OtherData.C:239
 OtherData.C:240
 OtherData.C:241
 OtherData.C:242
 OtherData.C:243
 OtherData.C:244
 OtherData.C:245
 OtherData.C:246
 OtherData.C:247
 OtherData.C:248
 OtherData.C:249
 OtherData.C:250
 OtherData.C:251
 OtherData.C:252
 OtherData.C:253
 OtherData.C:254
 OtherData.C:255
 OtherData.C:256
 OtherData.C:257
 OtherData.C:258
 OtherData.C:259
 OtherData.C:260
 OtherData.C:261
 OtherData.C:262
 OtherData.C:263
 OtherData.C:264
 OtherData.C:265
 OtherData.C:266
 OtherData.C:267
 OtherData.C:268
 OtherData.C:269
 OtherData.C:270
 OtherData.C:271
 OtherData.C:272
 OtherData.C:273
 OtherData.C:274
 OtherData.C:275
 OtherData.C:276
 OtherData.C:277
 OtherData.C:278
 OtherData.C:279
 OtherData.C:280
 OtherData.C:281
 OtherData.C:282
 OtherData.C:283
 OtherData.C:284
 OtherData.C:285
 OtherData.C:286
 OtherData.C:287
 OtherData.C:288
 OtherData.C:289
 OtherData.C:290
 OtherData.C:291
 OtherData.C:292
 OtherData.C:293
 OtherData.C:294
 OtherData.C:295
 OtherData.C:296
 OtherData.C:297
 OtherData.C:298
 OtherData.C:299
 OtherData.C:300
 OtherData.C:301
 OtherData.C:302
 OtherData.C:303
 OtherData.C:304
 OtherData.C:305
 OtherData.C:306
 OtherData.C:307
 OtherData.C:308
 OtherData.C:309
 OtherData.C:310
 OtherData.C:311
 OtherData.C:312
 OtherData.C:313
 OtherData.C:314
 OtherData.C:315
 OtherData.C:316
 OtherData.C:317
 OtherData.C:318
 OtherData.C:319
 OtherData.C:320
 OtherData.C:321
 OtherData.C:322
 OtherData.C:323
 OtherData.C:324
 OtherData.C:325
 OtherData.C:326
 OtherData.C:327
 OtherData.C:328
 OtherData.C:329
 OtherData.C:330
 OtherData.C:331
 OtherData.C:332
 OtherData.C:333
 OtherData.C:334
 OtherData.C:335
 OtherData.C:336
 OtherData.C:337
 OtherData.C:338
 OtherData.C:339
 OtherData.C:340
 OtherData.C:341
 OtherData.C:342
 OtherData.C:343
 OtherData.C:344
 OtherData.C:345
 OtherData.C:346
 OtherData.C:347
 OtherData.C:348
 OtherData.C:349
 OtherData.C:350
 OtherData.C:351
 OtherData.C:352
 OtherData.C:353
 OtherData.C:354
 OtherData.C:355
 OtherData.C:356
 OtherData.C:357
 OtherData.C:358
 OtherData.C:359
 OtherData.C:360
 OtherData.C:361
 OtherData.C:362
 OtherData.C:363
 OtherData.C:364
 OtherData.C:365
 OtherData.C:366
 OtherData.C:367
 OtherData.C:368
 OtherData.C:369
 OtherData.C:370
 OtherData.C:371
 OtherData.C:372
 OtherData.C:373
 OtherData.C:374
 OtherData.C:375
 OtherData.C:376
 OtherData.C:377
 OtherData.C:378
 OtherData.C:379
 OtherData.C:380
 OtherData.C:381
 OtherData.C:382
 OtherData.C:383
 OtherData.C:384
 OtherData.C:385
 OtherData.C:386
 OtherData.C:387
 OtherData.C:388
 OtherData.C:389
 OtherData.C:390
 OtherData.C:391
 OtherData.C:392
 OtherData.C:393
 OtherData.C:394
 OtherData.C:395
 OtherData.C:396
 OtherData.C:397
 OtherData.C:398
 OtherData.C:399
 OtherData.C:400
 OtherData.C:401
 OtherData.C:402
 OtherData.C:403
 OtherData.C:404
 OtherData.C:405
 OtherData.C:406
 OtherData.C:407
 OtherData.C:408
 OtherData.C:409
 OtherData.C:410
 OtherData.C:411
 OtherData.C:412
 OtherData.C:413
 OtherData.C:414
 OtherData.C:415
 OtherData.C:416
 OtherData.C:417
 OtherData.C:418
 OtherData.C:419
 OtherData.C:420
 OtherData.C:421
 OtherData.C:422
 OtherData.C:423
 OtherData.C:424
 OtherData.C:425
 OtherData.C:426
 OtherData.C:427
 OtherData.C:428
 OtherData.C:429
 OtherData.C:430
 OtherData.C:431
 OtherData.C:432
 OtherData.C:433
 OtherData.C:434
 OtherData.C:435
 OtherData.C:436
 OtherData.C:437
 OtherData.C:438
 OtherData.C:439
 OtherData.C:440
 OtherData.C:441
 OtherData.C:442
 OtherData.C:443
 OtherData.C:444
 OtherData.C:445
 OtherData.C:446
 OtherData.C:447
 OtherData.C:448
 OtherData.C:449
 OtherData.C:450
 OtherData.C:451
 OtherData.C:452
 OtherData.C:453
 OtherData.C:454
 OtherData.C:455
 OtherData.C:456
 OtherData.C:457
 OtherData.C:458
 OtherData.C:459
 OtherData.C:460
 OtherData.C:461
 OtherData.C:462
 OtherData.C:463
 OtherData.C:464
 OtherData.C:465
 OtherData.C:466
 OtherData.C:467
 OtherData.C:468
 OtherData.C:469
 OtherData.C:470
 OtherData.C:471
 OtherData.C:472
 OtherData.C:473
 OtherData.C:474
 OtherData.C:475
 OtherData.C:476
 OtherData.C:477
 OtherData.C:478
 OtherData.C:479
 OtherData.C:480
 OtherData.C:481
 OtherData.C:482
 OtherData.C:483
 OtherData.C:484
 OtherData.C:485
 OtherData.C:486
 OtherData.C:487
 OtherData.C:488
 OtherData.C:489
 OtherData.C:490
 OtherData.C:491
 OtherData.C:492
 OtherData.C:493
 OtherData.C:494
 OtherData.C:495
 OtherData.C:496
 OtherData.C:497
 OtherData.C:498
 OtherData.C:499
 OtherData.C:500
 OtherData.C:501
 OtherData.C:502
 OtherData.C:503
 OtherData.C:504
 OtherData.C:505
 OtherData.C:506
 OtherData.C:507
 OtherData.C:508
 OtherData.C:509
 OtherData.C:510
 OtherData.C:511
 OtherData.C:512
 OtherData.C:513
 OtherData.C:514
 OtherData.C:515
 OtherData.C:516
 OtherData.C:517
 OtherData.C:518
 OtherData.C:519
 OtherData.C:520
 OtherData.C:521
 OtherData.C:522
 OtherData.C:523
 OtherData.C:524
 OtherData.C:525
 OtherData.C:526
 OtherData.C:527
 OtherData.C:528
 OtherData.C:529
 OtherData.C:530
 OtherData.C:531
 OtherData.C:532
 OtherData.C:533
 OtherData.C:534
 OtherData.C:535
 OtherData.C:536
 OtherData.C:537
 OtherData.C:538
 OtherData.C:539
 OtherData.C:540
 OtherData.C:541
 OtherData.C:542
 OtherData.C:543
 OtherData.C:544
 OtherData.C:545
 OtherData.C:546
 OtherData.C:547
 OtherData.C:548
 OtherData.C:549
 OtherData.C:550
 OtherData.C:551
 OtherData.C:552
 OtherData.C:553
 OtherData.C:554
 OtherData.C:555
 OtherData.C:556
 OtherData.C:557
 OtherData.C:558
 OtherData.C:559
 OtherData.C:560
 OtherData.C:561
 OtherData.C:562
 OtherData.C:563
 OtherData.C:564
 OtherData.C:565
 OtherData.C:566
 OtherData.C:567
 OtherData.C:568
 OtherData.C:569
 OtherData.C:570
 OtherData.C:571
 OtherData.C:572
 OtherData.C:573
 OtherData.C:574
 OtherData.C:575
 OtherData.C:576
 OtherData.C:577
 OtherData.C:578
 OtherData.C:579
 OtherData.C:580
 OtherData.C:581
 OtherData.C:582
 OtherData.C:583
 OtherData.C:584
 OtherData.C:585
 OtherData.C:586
 OtherData.C:587
 OtherData.C:588
 OtherData.C:589
 OtherData.C:590
 OtherData.C:591
 OtherData.C:592
 OtherData.C:593
 OtherData.C:594
 OtherData.C:595
 OtherData.C:596
 OtherData.C:597
 OtherData.C:598
 OtherData.C:599
 OtherData.C:600
 OtherData.C:601
 OtherData.C:602
 OtherData.C:603
 OtherData.C:604
 OtherData.C:605
 OtherData.C:606
 OtherData.C:607
 OtherData.C:608
 OtherData.C:609
 OtherData.C:610
 OtherData.C:611
 OtherData.C:612
 OtherData.C:613
 OtherData.C:614
 OtherData.C:615
 OtherData.C:616
 OtherData.C:617
 OtherData.C:618
 OtherData.C:619
 OtherData.C:620
 OtherData.C:621
 OtherData.C:622
 OtherData.C:623
 OtherData.C:624
 OtherData.C:625
 OtherData.C:626
 OtherData.C:627
 OtherData.C:628
 OtherData.C:629
 OtherData.C:630
 OtherData.C:631
 OtherData.C:632
 OtherData.C:633
 OtherData.C:634
 OtherData.C:635
 OtherData.C:636
 OtherData.C:637
 OtherData.C:638
 OtherData.C:639
 OtherData.C:640
 OtherData.C:641
 OtherData.C:642
 OtherData.C:643
 OtherData.C:644
 OtherData.C:645
 OtherData.C:646
 OtherData.C:647
 OtherData.C:648
 OtherData.C:649
 OtherData.C:650
 OtherData.C:651
 OtherData.C:652
 OtherData.C:653
 OtherData.C:654
 OtherData.C:655
 OtherData.C:656
 OtherData.C:657
 OtherData.C:658
 OtherData.C:659
 OtherData.C:660
 OtherData.C:661
 OtherData.C:662
 OtherData.C:663
 OtherData.C:664
 OtherData.C:665
 OtherData.C:666
 OtherData.C:667
 OtherData.C:668
 OtherData.C:669
 OtherData.C:670
 OtherData.C:671
 OtherData.C:672
 OtherData.C:673
 OtherData.C:674
 OtherData.C:675
 OtherData.C:676
 OtherData.C:677
 OtherData.C:678
 OtherData.C:679
 OtherData.C:680
 OtherData.C:681
 OtherData.C:682
 OtherData.C:683
 OtherData.C:684
 OtherData.C:685
 OtherData.C:686
 OtherData.C:687
 OtherData.C:688
 OtherData.C:689
 OtherData.C:690
 OtherData.C:691
 OtherData.C:692
 OtherData.C:693
 OtherData.C:694
 OtherData.C:695
 OtherData.C:696
 OtherData.C:697
 OtherData.C:698
 OtherData.C:699
 OtherData.C:700
 OtherData.C:701
 OtherData.C:702
 OtherData.C:703
 OtherData.C:704
 OtherData.C:705
 OtherData.C:706
 OtherData.C:707
 OtherData.C:708
 OtherData.C:709
 OtherData.C:710
 OtherData.C:711
 OtherData.C:712
 OtherData.C:713
 OtherData.C:714
 OtherData.C:715
 OtherData.C:716
 OtherData.C:717
 OtherData.C:718
 OtherData.C:719
 OtherData.C:720
 OtherData.C:721
 OtherData.C:722
 OtherData.C:723
 OtherData.C:724
 OtherData.C:725
 OtherData.C:726
 OtherData.C:727
 OtherData.C:728
 OtherData.C:729
 OtherData.C:730
 OtherData.C:731
 OtherData.C:732
 OtherData.C:733
 OtherData.C:734
 OtherData.C:735
 OtherData.C:736
 OtherData.C:737
 OtherData.C:738