ROOT logo

From $ROOTSYS/tutorials/eve/alice_esd_split.C

// @(#)root/eve:$Id: alice_esd_split.C 30749 2009-10-15 16:33:04Z brun $
// Author: Bertrand Bellenot

// Complex example showing ALICE ESD visualization in several views.

/*
  alice_esd_split.C - a simple event-display for ALICE ESD tracks and clusters
                      version with several windows in the same workspace

  ------------------------------------------------------------------------
  ------------------------------------------------------------------------

  Only standard ROOT is used to process the ALICE ESD files.

  No ALICE code is needed, only four simple coordinate-transformation
  functions declared in this macro.

  A simple geometry of 10KB, extracted from the full TGeo-geometry, is
  used to outline the central detectors of ALICE.

  All files are access from the web by using the "CACHEREAD" option.

  ------------------------------------------------------------------------
  ------------------------------------------------------------------------

  1. Automatic building of ALICE ESD class declarations and dictionaries.
  ------------------------------------------------------------------------

  ALICE ESD is a TTree containing tracks and other event-related
  information with one entry per event. All these classes are part of
  the AliROOT offline framework and are not available to standard
  ROOT.

  To be able to access the event data in a natural way, by using
  data-members of classes and object containers, the header files and
  class dictionaries are automatically generated from the
  TStreamerInfo classes stored in the ESD file by using the
  TFile::MakeProject() function. The header files and a shared library
  is created in the aliesd/ directory and can be loaded dynamically
  into the ROOT session.

  See alice_esd_loadlib().
  

  2. Creation of simple GUI for event navigation.
  ------------------------------------------------------------------------

  Most common use of the event-display is to browse through a
  collection of events. Thus a simple GUI allowing this is created in
  the function make_gui().

  Eve uses the configurable ROOT-browser as its main window and so we
  create an extra tab in the left working area of the browser and
  provide backward/forward buttons.


  3. Event-navigation functions.
  ------------------------------------------------------------------------

  As this is a simple macro, we store the information about the
  current event in the global variable 'Int_t esd_event_id'. The
  functions for event-navigation simply modify this variable and call
  the load_event() function which does the following:
  1. drop the old visualization objects;
  2. retrieve given event from the ESD tree;
  3. call alice_esd_read() function to create visualization objects
     for the new event.


  4. Reading of ALICE data and creation of visualization objects.
  ------------------------------------------------------------------------

  This is performed in alice_esd_read() function, with the following
  steps:
  1. create the track container object - TEveTrackList;
  2. iterate over the ESD tracks, create TEveTrack objects and append
     them to the container;
  3. instruct the container to extrapolate the tracks and set their
     visual attributes.

*/


R__EXTERN TEveProjectionManager *gRPhiMgr;
R__EXTERN TEveProjectionManager *gRhoZMgr;
TEveGeoShape *gGeoShape;

// Forward declarations.

class AliESDEvent;
class AliESDfriend;
class AliESDtrack;
class AliExternalTrackParam;

Bool_t     alice_esd_loadlib(const char* file, const char* project);
void       make_gui();
void       load_event();
void       update_projections();

void       alice_esd_read();
TEveTrack* esd_make_track(TEveTrackPropagator* trkProp, Int_t index, AliESDtrack* at,
			  AliExternalTrackParam* tp=0);
Bool_t     trackIsOn(AliESDtrack* t, Int_t mask);
void       trackGetPos(AliExternalTrackParam* tp, Double_t r[3]);
void       trackGetMomentum(AliExternalTrackParam* tp, Double_t p[3]);
Double_t   trackGetP(AliExternalTrackParam* tp);


// Configuration and global variables.

const char* esd_file_name         = "http://root.cern.ch/files/alice_ESDs.root";
const char* esd_friends_file_name = "http://root.cern.ch/files/alice_ESDfriends.root";
const char* esd_geom_file_name    = "http://root.cern.ch/files/alice_ESDgeometry.root";

TFile *esd_file          = 0;
TFile *esd_friends_file  = 0;

TTree *esd_tree          = 0;

AliESDEvent  *esd        = 0;
AliESDfriend *esd_friend = 0;

Int_t esd_event_id       = 0; // Current event id.

TEveTrackList *track_list = 0;

TGTextEntry *gTextEntry;
TGHProgressBar *gProgress;

/******************************************************************************/
// Initialization and steering functions
/******************************************************************************/

//______________________________________________________________________________
void alice_esd_split(Bool_t auto_size=kFALSE)
{
   // Main function, initializes the application.
   //
   // 1. Load the auto-generated library holding ESD classes and ESD dictionaries.
   // 2. Open ESD data-files.
   // 3. Load cartoon geometry.
   // 4. Spawn simple GUI.
   // 5. Load first event.

   TFile::SetCacheFileDir(".");

   if (!alice_esd_loadlib(esd_file_name, "aliesd"))
   {
      Error("alice_esd", "Can not load project libraries.");
      return;
   }

   printf("*** Opening ESD ***\n");
   esd_file = TFile::Open(esd_file_name, "CACHEREAD");
   if (!esd_file)
      return;

   printf("*** Opening ESD-friends ***\n");
   esd_friends_file = TFile::Open(esd_friends_file_name, "CACHEREAD");
   if (!esd_friends_file)
      return;

   esd_tree = (TTree*) esd_file->Get("esdTree");

   esd = (AliESDEvent*) esd_tree->GetUserInfo()->FindObject("AliESDEvent");

   // Set the branch addresses.
   {
      TIter next(esd->fESDObjects);
      TObject *el;
      while ((el=(TNamed*)next()))
      {
         TString bname(el->GetName());
         if(bname.CompareTo("AliESDfriend")==0)
         {
            // AliESDfriend needs some '.' magick.
            esd_tree->SetBranchAddress("ESDfriend.", esd->fESDObjects->GetObjectRef(el));
         }
         else
         {
            esd_tree->SetBranchAddress(bname, esd->fESDObjects->GetObjectRef(el));
         }
      }
   }

   TEveManager::Create();

   // Adapt the main frame to the screen size...
   if (auto_size)
   {
      Int_t qq; 
      UInt_t ww, hh;
      gVirtualX->GetWindowSize(gVirtualX->GetDefaultRootWindow(), qq, qq, ww, hh);
      Float_t screen_ratio = (Float_t)ww/(Float_t)hh;
      if (screen_ratio > 1.5) {
         gEve->GetBrowser()->MoveResize(100, 50, ww - 300, hh - 100);
      } else {
         gEve->GetBrowser()->Move(50, 50);
      }
   }

   { // Simple geometry
      TFile* geom = TFile::Open(esd_geom_file_name, "CACHEREAD");
      if (!geom)
         return;
      TEveGeoShapeExtract* gse = (TEveGeoShapeExtract*) geom->Get("Gentle");
      gGeoShape = TEveGeoShape::ImportShapeExtract(gse, 0);
      geom->Close();
      delete geom;
      gEve->AddGlobalElement(gGeoShape);
   }

   make_gui();

   // import the geometry in the projection managers
   if (gRPhiMgr) {
      TEveProjectionAxes* a = new TEveProjectionAxes(gRPhiMgr);
      a->SetNdivisions(3);
      gEve->GetScenes()->FindChild("R-Phi Projection")->AddElement(a);
      gRPhiMgr->ImportElements(gGeoShape);
   }
   if (gRhoZMgr) {
      TEveProjectionAxes* a = new TEveProjectionAxes(gRhoZMgr);
      a->SetNdivisions(3);
      gEve->GetScenes()->FindChild("Rho-Z Projection")->AddElement(a);
      gRhoZMgr->ImportElements(gGeoShape);
   }

   load_event();

   update_projections();
   
   gEve->Redraw3D(kTRUE); // Reset camera after the first event has been shown.
}

//______________________________________________________________________________
Bool_t alice_esd_loadlib(const char* file, const char* project)
{
   // Make sure that shared library created from the auto-generated project
   // files exists and load it.

   TString lib(Form("%s/%s.%s", project, project, gSystem->GetSoExt()));

   if (gSystem->AccessPathName(lib, kReadPermission)) {
      TFile* f = TFile::Open(file, "CACHEREAD");
      if (f == 0)
         return kFALSE;
      f->MakeProject(project, "*", "++");
      f->Close();
      delete f;
   }
   return gSystem->Load(lib) >= 0;
}

//______________________________________________________________________________
void load_event()
{
   // Load event specified in global esd_event_id.
   // The contents of previous event are removed.

   printf("Loading event %d.\n", esd_event_id);
   gTextEntry->SetTextColor(0xff0000);
   gTextEntry->SetText(Form("Loading event %d...",esd_event_id));
   gSystem->ProcessEvents();

   if (track_list)
      track_list->DestroyElements();

   esd_tree->GetEntry(esd_event_id);

   alice_esd_read();

   gEve->Redraw3D(kFALSE, kTRUE);
   gTextEntry->SetTextColor(0x000000);
   gTextEntry->SetText(Form("Event %d loaded",esd_event_id));
   gROOT->ProcessLine("SplitGLView::UpdateSummary()");
}

//______________________________________________________________________________
void update_projections()
{
   // cleanup then import geometry and event 
   // in the projection managers
   
   TEveElement* top = gEve->GetCurrentEvent();
   if (gRPhiMgr && top) {
      gRPhiMgr->DestroyElements();
      gRPhiMgr->ImportElements(gGeoShape);
      gRPhiMgr->ImportElements(top);
   }
   if (gRhoZMgr && top) {
      gRhoZMgr->DestroyElements();
      gRhoZMgr->ImportElements(gGeoShape);
      gRhoZMgr->ImportElements(top);
   }
}

/******************************************************************************/
// GUI
/******************************************************************************/

//______________________________________________________________________________
// 
// EvNavHandler class is needed to connect GUI signals.

class EvNavHandler
{
public:
   void Fwd()
   {
      if (esd_event_id < esd_tree->GetEntries() - 1) {
         ++esd_event_id;
         load_event();
         update_projections();
      } else {
         gTextEntry->SetTextColor(0xff0000);
         gTextEntry->SetText("Already at last event");
         printf("Already at last event.\n");
      }
   }
   void Bck()
   {
      if (esd_event_id > 0) {
         --esd_event_id;
         load_event();
         update_projections();
      } else {
         gTextEntry->SetTextColor(0xff0000);
         gTextEntry->SetText("Already at first event");
         printf("Already at first event.\n");
      }
   }
};

//______________________________________________________________________________
void make_gui()
{
   // Create minimal GUI for event navigation.

   gROOT->ProcessLine(".L SplitGLView.C+");

   TEveBrowser* browser = gEve->GetBrowser();

   browser->ShowCloseTab(kFALSE);
   browser->ExecPlugin("SplitGLView", 0, "new SplitGLView(gClient->GetRoot(), 600, 450, kTRUE)");
   browser->ShowCloseTab(kTRUE);

   browser->StartEmbedding(TRootBrowser::kLeft);

   TGMainFrame* frmMain = new TGMainFrame(gClient->GetRoot(), 1000, 600);
   frmMain->SetWindowName("XX GUI");
   frmMain->SetCleanup(kDeepCleanup);

   TGHorizontalFrame* hf = new TGHorizontalFrame(frmMain);
   {
      
      TString icondir( Form("%s/icons/", gSystem->Getenv("ROOTSYS")) );
      TGPictureButton* b = 0;
      EvNavHandler    *fh = new EvNavHandler;

      b = new TGPictureButton(hf, gClient->GetPicture(icondir + "GoBack.gif"));
      hf->AddFrame(b, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 10, 2, 10, 10));
      b->Connect("Clicked()", "EvNavHandler", fh, "Bck()");

      b = new TGPictureButton(hf, gClient->GetPicture(icondir + "GoForward.gif"));
      hf->AddFrame(b, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 10, 10, 10));
      b->Connect("Clicked()", "EvNavHandler", fh, "Fwd()");

      gTextEntry = new TGTextEntry(hf);
      gTextEntry->SetEnabled(kFALSE);
      hf->AddFrame(gTextEntry, new TGLayoutHints(kLHintsLeft | kLHintsCenterY  | 
                   kLHintsExpandX, 2, 10, 10, 10));
   }
   frmMain->AddFrame(hf, new TGLayoutHints(kLHintsTop | kLHintsExpandX,0,0,20,0));

   gProgress = new TGHProgressBar(frmMain, TGProgressBar::kFancy, 100);
   gProgress->ShowPosition(kTRUE, kFALSE, "%.0f tracks");
   gProgress->SetBarColor("green");
   frmMain->AddFrame(gProgress, new TGLayoutHints(kLHintsExpandX, 10, 10, 5, 5));

   frmMain->MapSubwindows();
   frmMain->Resize();
   frmMain->MapWindow();

   browser->StopEmbedding();
   browser->SetTabTitle("Event Control", 0);
}


/******************************************************************************/
// Code for reading AliESD and creating visualization objects
/******************************************************************************/

enum ESDTrackFlags {
   kITSin=0x0001,kITSout=0x0002,kITSrefit=0x0004,kITSpid=0x0008,
   kTPCin=0x0010,kTPCout=0x0020,kTPCrefit=0x0040,kTPCpid=0x0080,
   kTRDin=0x0100,kTRDout=0x0200,kTRDrefit=0x0400,kTRDpid=0x0800,
   kTOFin=0x1000,kTOFout=0x2000,kTOFrefit=0x4000,kTOFpid=0x8000,
   kHMPIDpid=0x20000,
   kEMCALmatch=0x40000,
   kTRDbackup=0x80000,
   kTRDStop=0x20000000,
   kESDpid=0x40000000,
   kTIME=0x80000000
};

//______________________________________________________________________________
void alice_esd_read()
{
   // Read tracks and associated clusters from current event.

   AliESDRun    *esdrun = (AliESDRun*)    esd->fESDObjects->FindObject("AliESDRun");
   TClonesArray *tracks = (TClonesArray*) esd->fESDObjects->FindObject("Tracks");

   // This needs further investigation. Clusters not shown.
   // AliESDfriend *frnd   = (AliESDfriend*) esd->fESDObjects->FindObject("AliESDfriend");
   // printf("Friend %p, n_tracks:%d\n", frnd, frnd->fTracks.GetEntries());

   if (track_list == 0) {
      track_list = new TEveTrackList("ESD Tracks"); 
      track_list->SetMainColor(6);
      //track_list->SetLineWidth(2);
      track_list->SetMarkerColor(kYellow);
      track_list->SetMarkerStyle(4);
      track_list->SetMarkerSize(0.5);

      gEve->AddElement(track_list);
   }

   TEveTrackPropagator* trkProp = track_list->GetPropagator();
   trkProp->SetMagField( 0.1 * esdrun->fMagneticField ); // kGaus to Tesla

   gProgress->Reset();
   gProgress->SetMax(tracks->GetEntriesFast());
   for (Int_t n=0; n<tracks->GetEntriesFast(); ++n)
   {
      AliESDtrack* at = (AliESDtrack*) tracks->At(n);

      // If ITS refit failed, take track parameters at inner TPC radius.
      AliExternalTrackParam* tp = at;
      if (! trackIsOn(at, kITSrefit)) {
         tp = at->fIp;
      }

      TEveTrack* track = esd_make_track(trkProp, n, at, tp);
      track->SetAttLineAttMarker(track_list);
      track_list->AddElement(track);

      // This needs further investigation. Clusters not shown.
      // if (frnd)
      // {
      //     AliESDfriendTrack* ft = (AliESDfriendTrack*) frnd->fTracks->At(n);
      //     printf("%d friend = %p\n", ft);
      // }
      gProgress->Increment(1);
   }

   track_list->MakeTracks();
}

//______________________________________________________________________________
TEveTrack* esd_make_track(TEveTrackPropagator*   trkProp,
			  Int_t                  index,
			  AliESDtrack*           at,
			  AliExternalTrackParam* tp)
{
   // Helper function creating TEveTrack from AliESDtrack.
   //
   // Optionally specific track-parameters (e.g. at TPC entry point)
   // can be specified via the tp argument.

   Double_t      pbuf[3], vbuf[3];
   TEveRecTrack  rt;

   if (tp == 0) tp = at;

   rt.fLabel  = at->fLabel;
   rt.fIndex  = index;
   rt.fStatus = (Int_t) at->fFlags;
   rt.fSign   = (tp->fP[4] > 0) ? 1 : -1;

   trackGetPos(tp, vbuf);      rt.fV.Set(vbuf);
   trackGetMomentum(tp, pbuf); rt.fP.Set(pbuf);

   Double_t ep = trackGetP(at);
   Double_t mc = 0.138; // at->GetMass(); - Complicated function, requiring PID.

   rt.fBeta = ep/TMath::Sqrt(ep*ep + mc*mc);
 
   TEveTrack* track = new TEveTrack(&rt, trkProp);
   track->SetName(Form("TEveTrack %d", rt.fIndex));
   track->SetStdTitle();

   return track;
}

//______________________________________________________________________________
Bool_t trackIsOn(AliESDtrack* t, Int_t mask)
{
   // Check is track-flag specified by mask are set.

   return (t->fFlags & mask) > 0;
}

//______________________________________________________________________________
void trackGetPos(AliExternalTrackParam* tp, Double_t r[3])
{
   // Get global position of starting point of tp.

  r[0] = tp->fX; r[1] = tp->fP[0]; r[2] = tp->fP[1];

  Double_t cs=TMath::Cos(tp->fAlpha), sn=TMath::Sin(tp->fAlpha), x=r[0];
  r[0] = x*cs - r[1]*sn; r[1] = x*sn + r[1]*cs;
}

//______________________________________________________________________________
void trackGetMomentum(AliExternalTrackParam* tp, Double_t p[3])
{
   // Return global momentum vector of starting point of tp.

   p[0] = tp->fP[4]; p[1] = tp->fP[2]; p[2] = tp->fP[3];

   Double_t pt=1./TMath::Abs(p[0]);
   Double_t cs=TMath::Cos(tp->fAlpha), sn=TMath::Sin(tp->fAlpha);
   Double_t r=TMath::Sqrt(1 - p[1]*p[1]);
   p[0]=pt*(r*cs - p[1]*sn); p[1]=pt*(p[1]*cs + r*sn); p[2]=pt*p[2];
}

//______________________________________________________________________________
Double_t trackGetP(AliExternalTrackParam* tp)
{
   // Return magnitude of momentum of tp.

   return TMath::Sqrt(1.+ tp->fP[3]*tp->fP[3])/TMath::Abs(tp->fP[4]);
}
 alice_esd_split.C:1
 alice_esd_split.C:2
 alice_esd_split.C:3
 alice_esd_split.C:4
 alice_esd_split.C:5
 alice_esd_split.C:6
 alice_esd_split.C:7
 alice_esd_split.C:8
 alice_esd_split.C:9
 alice_esd_split.C:10
 alice_esd_split.C:11
 alice_esd_split.C:12
 alice_esd_split.C:13
 alice_esd_split.C:14
 alice_esd_split.C:15
 alice_esd_split.C:16
 alice_esd_split.C:17
 alice_esd_split.C:18
 alice_esd_split.C:19
 alice_esd_split.C:20
 alice_esd_split.C:21
 alice_esd_split.C:22
 alice_esd_split.C:23
 alice_esd_split.C:24
 alice_esd_split.C:25
 alice_esd_split.C:26
 alice_esd_split.C:27
 alice_esd_split.C:28
 alice_esd_split.C:29
 alice_esd_split.C:30
 alice_esd_split.C:31
 alice_esd_split.C:32
 alice_esd_split.C:33
 alice_esd_split.C:34
 alice_esd_split.C:35
 alice_esd_split.C:36
 alice_esd_split.C:37
 alice_esd_split.C:38
 alice_esd_split.C:39
 alice_esd_split.C:40
 alice_esd_split.C:41
 alice_esd_split.C:42
 alice_esd_split.C:43
 alice_esd_split.C:44
 alice_esd_split.C:45
 alice_esd_split.C:46
 alice_esd_split.C:47
 alice_esd_split.C:48
 alice_esd_split.C:49
 alice_esd_split.C:50
 alice_esd_split.C:51
 alice_esd_split.C:52
 alice_esd_split.C:53
 alice_esd_split.C:54
 alice_esd_split.C:55
 alice_esd_split.C:56
 alice_esd_split.C:57
 alice_esd_split.C:58
 alice_esd_split.C:59
 alice_esd_split.C:60
 alice_esd_split.C:61
 alice_esd_split.C:62
 alice_esd_split.C:63
 alice_esd_split.C:64
 alice_esd_split.C:65
 alice_esd_split.C:66
 alice_esd_split.C:67
 alice_esd_split.C:68
 alice_esd_split.C:69
 alice_esd_split.C:70
 alice_esd_split.C:71
 alice_esd_split.C:72
 alice_esd_split.C:73
 alice_esd_split.C:74
 alice_esd_split.C:75
 alice_esd_split.C:76
 alice_esd_split.C:77
 alice_esd_split.C:78
 alice_esd_split.C:79
 alice_esd_split.C:80
 alice_esd_split.C:81
 alice_esd_split.C:82
 alice_esd_split.C:83
 alice_esd_split.C:84
 alice_esd_split.C:85
 alice_esd_split.C:86
 alice_esd_split.C:87
 alice_esd_split.C:88
 alice_esd_split.C:89
 alice_esd_split.C:90
 alice_esd_split.C:91
 alice_esd_split.C:92
 alice_esd_split.C:93
 alice_esd_split.C:94
 alice_esd_split.C:95
 alice_esd_split.C:96
 alice_esd_split.C:97
 alice_esd_split.C:98
 alice_esd_split.C:99
 alice_esd_split.C:100
 alice_esd_split.C:101
 alice_esd_split.C:102
 alice_esd_split.C:103
 alice_esd_split.C:104
 alice_esd_split.C:105
 alice_esd_split.C:106
 alice_esd_split.C:107
 alice_esd_split.C:108
 alice_esd_split.C:109
 alice_esd_split.C:110
 alice_esd_split.C:111
 alice_esd_split.C:112
 alice_esd_split.C:113
 alice_esd_split.C:114
 alice_esd_split.C:115
 alice_esd_split.C:116
 alice_esd_split.C:117
 alice_esd_split.C:118
 alice_esd_split.C:119
 alice_esd_split.C:120
 alice_esd_split.C:121
 alice_esd_split.C:122
 alice_esd_split.C:123
 alice_esd_split.C:124
 alice_esd_split.C:125
 alice_esd_split.C:126
 alice_esd_split.C:127
 alice_esd_split.C:128
 alice_esd_split.C:129
 alice_esd_split.C:130
 alice_esd_split.C:131
 alice_esd_split.C:132
 alice_esd_split.C:133
 alice_esd_split.C:134
 alice_esd_split.C:135
 alice_esd_split.C:136
 alice_esd_split.C:137
 alice_esd_split.C:138
 alice_esd_split.C:139
 alice_esd_split.C:140
 alice_esd_split.C:141
 alice_esd_split.C:142
 alice_esd_split.C:143
 alice_esd_split.C:144
 alice_esd_split.C:145
 alice_esd_split.C:146
 alice_esd_split.C:147
 alice_esd_split.C:148
 alice_esd_split.C:149
 alice_esd_split.C:150
 alice_esd_split.C:151
 alice_esd_split.C:152
 alice_esd_split.C:153
 alice_esd_split.C:154
 alice_esd_split.C:155
 alice_esd_split.C:156
 alice_esd_split.C:157
 alice_esd_split.C:158
 alice_esd_split.C:159
 alice_esd_split.C:160
 alice_esd_split.C:161
 alice_esd_split.C:162
 alice_esd_split.C:163
 alice_esd_split.C:164
 alice_esd_split.C:165
 alice_esd_split.C:166
 alice_esd_split.C:167
 alice_esd_split.C:168
 alice_esd_split.C:169
 alice_esd_split.C:170
 alice_esd_split.C:171
 alice_esd_split.C:172
 alice_esd_split.C:173
 alice_esd_split.C:174
 alice_esd_split.C:175
 alice_esd_split.C:176
 alice_esd_split.C:177
 alice_esd_split.C:178
 alice_esd_split.C:179
 alice_esd_split.C:180
 alice_esd_split.C:181
 alice_esd_split.C:182
 alice_esd_split.C:183
 alice_esd_split.C:184
 alice_esd_split.C:185
 alice_esd_split.C:186
 alice_esd_split.C:187
 alice_esd_split.C:188
 alice_esd_split.C:189
 alice_esd_split.C:190
 alice_esd_split.C:191
 alice_esd_split.C:192
 alice_esd_split.C:193
 alice_esd_split.C:194
 alice_esd_split.C:195
 alice_esd_split.C:196
 alice_esd_split.C:197
 alice_esd_split.C:198
 alice_esd_split.C:199
 alice_esd_split.C:200
 alice_esd_split.C:201
 alice_esd_split.C:202
 alice_esd_split.C:203
 alice_esd_split.C:204
 alice_esd_split.C:205
 alice_esd_split.C:206
 alice_esd_split.C:207
 alice_esd_split.C:208
 alice_esd_split.C:209
 alice_esd_split.C:210
 alice_esd_split.C:211
 alice_esd_split.C:212
 alice_esd_split.C:213
 alice_esd_split.C:214
 alice_esd_split.C:215
 alice_esd_split.C:216
 alice_esd_split.C:217
 alice_esd_split.C:218
 alice_esd_split.C:219
 alice_esd_split.C:220
 alice_esd_split.C:221
 alice_esd_split.C:222
 alice_esd_split.C:223
 alice_esd_split.C:224
 alice_esd_split.C:225
 alice_esd_split.C:226
 alice_esd_split.C:227
 alice_esd_split.C:228
 alice_esd_split.C:229
 alice_esd_split.C:230
 alice_esd_split.C:231
 alice_esd_split.C:232
 alice_esd_split.C:233
 alice_esd_split.C:234
 alice_esd_split.C:235
 alice_esd_split.C:236
 alice_esd_split.C:237
 alice_esd_split.C:238
 alice_esd_split.C:239
 alice_esd_split.C:240
 alice_esd_split.C:241
 alice_esd_split.C:242
 alice_esd_split.C:243
 alice_esd_split.C:244
 alice_esd_split.C:245
 alice_esd_split.C:246
 alice_esd_split.C:247
 alice_esd_split.C:248
 alice_esd_split.C:249
 alice_esd_split.C:250
 alice_esd_split.C:251
 alice_esd_split.C:252
 alice_esd_split.C:253
 alice_esd_split.C:254
 alice_esd_split.C:255
 alice_esd_split.C:256
 alice_esd_split.C:257
 alice_esd_split.C:258
 alice_esd_split.C:259
 alice_esd_split.C:260
 alice_esd_split.C:261
 alice_esd_split.C:262
 alice_esd_split.C:263
 alice_esd_split.C:264
 alice_esd_split.C:265
 alice_esd_split.C:266
 alice_esd_split.C:267
 alice_esd_split.C:268
 alice_esd_split.C:269
 alice_esd_split.C:270
 alice_esd_split.C:271
 alice_esd_split.C:272
 alice_esd_split.C:273
 alice_esd_split.C:274
 alice_esd_split.C:275
 alice_esd_split.C:276
 alice_esd_split.C:277
 alice_esd_split.C:278
 alice_esd_split.C:279
 alice_esd_split.C:280
 alice_esd_split.C:281
 alice_esd_split.C:282
 alice_esd_split.C:283
 alice_esd_split.C:284
 alice_esd_split.C:285
 alice_esd_split.C:286
 alice_esd_split.C:287
 alice_esd_split.C:288
 alice_esd_split.C:289
 alice_esd_split.C:290
 alice_esd_split.C:291
 alice_esd_split.C:292
 alice_esd_split.C:293
 alice_esd_split.C:294
 alice_esd_split.C:295
 alice_esd_split.C:296
 alice_esd_split.C:297
 alice_esd_split.C:298
 alice_esd_split.C:299
 alice_esd_split.C:300
 alice_esd_split.C:301
 alice_esd_split.C:302
 alice_esd_split.C:303
 alice_esd_split.C:304
 alice_esd_split.C:305
 alice_esd_split.C:306
 alice_esd_split.C:307
 alice_esd_split.C:308
 alice_esd_split.C:309
 alice_esd_split.C:310
 alice_esd_split.C:311
 alice_esd_split.C:312
 alice_esd_split.C:313
 alice_esd_split.C:314
 alice_esd_split.C:315
 alice_esd_split.C:316
 alice_esd_split.C:317
 alice_esd_split.C:318
 alice_esd_split.C:319
 alice_esd_split.C:320
 alice_esd_split.C:321
 alice_esd_split.C:322
 alice_esd_split.C:323
 alice_esd_split.C:324
 alice_esd_split.C:325
 alice_esd_split.C:326
 alice_esd_split.C:327
 alice_esd_split.C:328
 alice_esd_split.C:329
 alice_esd_split.C:330
 alice_esd_split.C:331
 alice_esd_split.C:332
 alice_esd_split.C:333
 alice_esd_split.C:334
 alice_esd_split.C:335
 alice_esd_split.C:336
 alice_esd_split.C:337
 alice_esd_split.C:338
 alice_esd_split.C:339
 alice_esd_split.C:340
 alice_esd_split.C:341
 alice_esd_split.C:342
 alice_esd_split.C:343
 alice_esd_split.C:344
 alice_esd_split.C:345
 alice_esd_split.C:346
 alice_esd_split.C:347
 alice_esd_split.C:348
 alice_esd_split.C:349
 alice_esd_split.C:350
 alice_esd_split.C:351
 alice_esd_split.C:352
 alice_esd_split.C:353
 alice_esd_split.C:354
 alice_esd_split.C:355
 alice_esd_split.C:356
 alice_esd_split.C:357
 alice_esd_split.C:358
 alice_esd_split.C:359
 alice_esd_split.C:360
 alice_esd_split.C:361
 alice_esd_split.C:362
 alice_esd_split.C:363
 alice_esd_split.C:364
 alice_esd_split.C:365
 alice_esd_split.C:366
 alice_esd_split.C:367
 alice_esd_split.C:368
 alice_esd_split.C:369
 alice_esd_split.C:370
 alice_esd_split.C:371
 alice_esd_split.C:372
 alice_esd_split.C:373
 alice_esd_split.C:374
 alice_esd_split.C:375
 alice_esd_split.C:376
 alice_esd_split.C:377
 alice_esd_split.C:378
 alice_esd_split.C:379
 alice_esd_split.C:380
 alice_esd_split.C:381
 alice_esd_split.C:382
 alice_esd_split.C:383
 alice_esd_split.C:384
 alice_esd_split.C:385
 alice_esd_split.C:386
 alice_esd_split.C:387
 alice_esd_split.C:388
 alice_esd_split.C:389
 alice_esd_split.C:390
 alice_esd_split.C:391
 alice_esd_split.C:392
 alice_esd_split.C:393
 alice_esd_split.C:394
 alice_esd_split.C:395
 alice_esd_split.C:396
 alice_esd_split.C:397
 alice_esd_split.C:398
 alice_esd_split.C:399
 alice_esd_split.C:400
 alice_esd_split.C:401
 alice_esd_split.C:402
 alice_esd_split.C:403
 alice_esd_split.C:404
 alice_esd_split.C:405
 alice_esd_split.C:406
 alice_esd_split.C:407
 alice_esd_split.C:408
 alice_esd_split.C:409
 alice_esd_split.C:410
 alice_esd_split.C:411
 alice_esd_split.C:412
 alice_esd_split.C:413
 alice_esd_split.C:414
 alice_esd_split.C:415
 alice_esd_split.C:416
 alice_esd_split.C:417
 alice_esd_split.C:418
 alice_esd_split.C:419
 alice_esd_split.C:420
 alice_esd_split.C:421
 alice_esd_split.C:422
 alice_esd_split.C:423
 alice_esd_split.C:424
 alice_esd_split.C:425
 alice_esd_split.C:426
 alice_esd_split.C:427
 alice_esd_split.C:428
 alice_esd_split.C:429
 alice_esd_split.C:430
 alice_esd_split.C:431
 alice_esd_split.C:432
 alice_esd_split.C:433
 alice_esd_split.C:434
 alice_esd_split.C:435
 alice_esd_split.C:436
 alice_esd_split.C:437
 alice_esd_split.C:438
 alice_esd_split.C:439
 alice_esd_split.C:440
 alice_esd_split.C:441
 alice_esd_split.C:442
 alice_esd_split.C:443
 alice_esd_split.C:444
 alice_esd_split.C:445
 alice_esd_split.C:446
 alice_esd_split.C:447
 alice_esd_split.C:448
 alice_esd_split.C:449
 alice_esd_split.C:450
 alice_esd_split.C:451
 alice_esd_split.C:452
 alice_esd_split.C:453
 alice_esd_split.C:454
 alice_esd_split.C:455
 alice_esd_split.C:456
 alice_esd_split.C:457
 alice_esd_split.C:458
 alice_esd_split.C:459
 alice_esd_split.C:460
 alice_esd_split.C:461
 alice_esd_split.C:462
 alice_esd_split.C:463
 alice_esd_split.C:464
 alice_esd_split.C:465
 alice_esd_split.C:466
 alice_esd_split.C:467
 alice_esd_split.C:468
 alice_esd_split.C:469
 alice_esd_split.C:470
 alice_esd_split.C:471
 alice_esd_split.C:472
 alice_esd_split.C:473
 alice_esd_split.C:474
 alice_esd_split.C:475
 alice_esd_split.C:476
 alice_esd_split.C:477
 alice_esd_split.C:478
 alice_esd_split.C:479
 alice_esd_split.C:480
 alice_esd_split.C:481
 alice_esd_split.C:482
 alice_esd_split.C:483
 alice_esd_split.C:484
 alice_esd_split.C:485
 alice_esd_split.C:486
 alice_esd_split.C:487
 alice_esd_split.C:488
 alice_esd_split.C:489
 alice_esd_split.C:490
 alice_esd_split.C:491
 alice_esd_split.C:492
 alice_esd_split.C:493
 alice_esd_split.C:494
 alice_esd_split.C:495
 alice_esd_split.C:496
 alice_esd_split.C:497
 alice_esd_split.C:498
 alice_esd_split.C:499
 alice_esd_split.C:500
 alice_esd_split.C:501
 alice_esd_split.C:502
 alice_esd_split.C:503
 alice_esd_split.C:504
 alice_esd_split.C:505
 alice_esd_split.C:506
 alice_esd_split.C:507
 alice_esd_split.C:508
 alice_esd_split.C:509
 alice_esd_split.C:510
 alice_esd_split.C:511
 alice_esd_split.C:512
 alice_esd_split.C:513
 alice_esd_split.C:514
 alice_esd_split.C:515
 alice_esd_split.C:516
 alice_esd_split.C:517
 alice_esd_split.C:518
 alice_esd_split.C:519
 alice_esd_split.C:520
 alice_esd_split.C:521
 alice_esd_split.C:522
 alice_esd_split.C:523
 alice_esd_split.C:524
 alice_esd_split.C:525
 alice_esd_split.C:526
 alice_esd_split.C:527
 alice_esd_split.C:528
 alice_esd_split.C:529
 alice_esd_split.C:530
 alice_esd_split.C:531
 alice_esd_split.C:532
 alice_esd_split.C:533
 alice_esd_split.C:534
 alice_esd_split.C:535
 alice_esd_split.C:536
thumb