ROOT logo
// @(#)root/eve:$Id: alice_esd.C 28586 2009-05-12 19:07:40Z matevz $
// Author: Matevz Tadel

// Complex example showing ALICE ESD track visualization.

/*
  alice_esd.C - a simple event-display for ALICE ESD tracks and clusters

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

  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.

*/



// 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       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";
// Temporarily disable reading of ESD friend.
// There seems to be no way to get it working without AliRoot.
// const char* esd_friends_file_name = "http://root.cern.ch/files/alice_ESDfriends.root";
const char* esd_friends_file_name = 0;

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

// For testing
// const char* esd_file_name         = "AliESDs.root";
// const char* esd_friends_file_name = "AliESDfriends.root";

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

TTree *esd_tree          = 0;

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

Int_t esd_event_id       = 0; // Current event id.

TEveTrackList *gTrackList = 0;

TEveGeoShape *gGeomGentle = 0;

// Implemented in MultiView.C
class MultiView;
MultiView* gMultiView = 0;

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

//______________________________________________________________________________
void alice_esd()
{
   // 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.

   const TString weh("alice_esd()");

   if (gROOT->LoadMacro("MultiView.C+") != 0)
   {
      Error(weh, "Failed loading MultiView.C in compiled mode.");
      return;
   }

   TFile::SetCacheFileDir(".");

   if (!alice_esd_loadlib("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;

   esd_tree = (TTree*)       esd_file->Get("esdTree");
   esd      = (AliESDEvent*) esd_tree->GetUserInfo()->FindObject("AliESDEvent");
   esd_objs = esd->fESDObjects;

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

      esd_tree->SetBranchStatus ("ESDfriend*", 1);
   }

   // Set the branch addresses.
   {
      TIter next(esd_objs);
      TObject *el;
      while ((el = (TNamed*)next()))
      {
         TString bname(el->GetName());
         if (bname == "AliESDfriend")
         {
            // AliESDfriend needs special treatment.
            TBranch *br = esd_tree->GetBranch("ESDfriend.");
            br->SetAddress(esd_objs->GetObjectRef(el));
         }
         else
         {
            TBranch *br = esd_tree->GetBranch(bname);
            if (br)
            {
               br->SetAddress(esd_objs->GetObjectRef(el));
            }
            else
            {
               br = esd_tree->GetBranch(bname + ".");
               if (br)
               {
                  br->SetAddress(esd_objs->GetObjectRef(el));
               }
               else
               {
                  Warning("AliESDEvent::ReadFromTree() No Branch found with Name '%s' or '%s.'.",
                          bname.Data(),bname.Data());
               }
            }
         }
      }
   }


   TEveManager::Create();

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


   // Standard multi-view
   //=====================

   gMultiView = new MultiView;

   gMultiView->ImportGeomRPhi(gGeomGentle);
   gMultiView->ImportGeomRhoZ(gGeomGentle);


   // HTML summary view
   //===================

   gROOT->LoadMacro("alice_esd_html_summary.C");
   fgHtmlSummary = new HtmlSummary("Alice Event Display Summary Table");
   slot = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
   fgHtml = new TGHtml(0, 100, 100);
   TEveWindowFrame *wf = slot->MakeFrame(fgHtml);
   fgHtml->MapSubwindows();
   wf->SetElementName("Summary");


   // Final stuff
   //=============

   gEve->GetBrowser()->GetTabRight()->SetTab(1);

   make_gui();

   load_event();

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

//______________________________________________________________________________
Bool_t alice_esd_loadlib(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(esd_file_name, "CACHEREAD");
      if (f == 0)
         return kFALSE;
      TFile *f2 = TFile::Open(esd_friends_file_name, "CACHEREAD");
      TTree *tree = (TTree*) f->Get("esdTree");
      tree->SetBranchStatus ("ESDfriend*", 1);
      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);

   gEve->GetViewers()->DeleteAnnotations();

   if (gTrackList)
      gTrackList->DestroyElements();

   esd_tree->GetEntry(esd_event_id);
   // esd_tree->Show();

   alice_esd_read();

   TEveElement* top = gEve->GetCurrentEvent();

   gMultiView->DestroyEventRPhi();
   gMultiView->ImportEventRPhi(top);

   gMultiView->DestroyEventRhoZ();
   gMultiView->ImportEventRhoZ(top);

   update_html_summary();

   gEve->Redraw3D(kFALSE, kTRUE);
}


/******************************************************************************/
// 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();
      } else {
         printf("Already at last event.\n");
      }
   }
   void Bck()
   {
      if (esd_event_id > 0) {
         --esd_event_id;
         load_event();
      } else {
         printf("Already at first event.\n");
      }
   }
};

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

   TEveBrowser* browser = gEve->GetBrowser();
   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);
      b->Connect("Clicked()", "EvNavHandler", fh, "Bck()");

      b = new TGPictureButton(hf, gClient->GetPicture(icondir + "GoForward.gif"));
      hf->AddFrame(b);
      b->Connect("Clicked()", "EvNavHandler", fh, "Fwd()");
   }
   frmMain->AddFrame(hf);

   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_objs->FindObject("AliESDRun");
   TClonesArray *tracks = (TClonesArray*) esd_objs->FindObject("Tracks");

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

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

      gEve->AddElement(gTrackList);
   }

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

   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(gTrackList);
      gTrackList->AddElement(track);

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

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