ROOT logo
// @(#)root/test:$Id$
// Author: Rene Brun   19/08/96

////////////////////////////////////////////////////////////////////////
//
//                       Event and Track classes
//                       =======================
//
//  The Event class is a naive/simple example of an event structure.
//     public:
//        char           fType[20];
//        char          *fEventName;         //run+event number in character format
//        Int_t          fNtrack;
//        Int_t          fNseg;
//        Int_t          fNvertex;
//        UInt_t         fFlag;
//        Double32_t     fTemperature;
//        Int_t          fMeasures[10];
//        Double32_t     fMatrix[4][4];
//        Double32_t    *fClosestDistance; //[fNvertex] indexed array! 
//        EventHeader    fEvtHdr;
//        TClonesArray  *fTracks;
//        TRefArray     *fHighPt;            //array of High Pt tracks only
//        TRefArray     *fMuons;             //array of Muon tracks only
//        TRef           fLastTrack;         //pointer to last track
//        TRef           fHistoWeb;          //EXEC:GetHistoWeb reference to an histogram in a TWebFile
//        TH1F          *fH;
//        TBits          fTriggerBits;       //Bits triggered by this event.
//
//   The EventHeader class has 3 data members (integers):
//     public:
//        Int_t          fEvtNum;
//        Int_t          fRun;
//        Int_t          fDate;
//
//
//   The Event data member fTracks is a pointer to a TClonesArray.
//   It is an array of a variable number of tracks per event.
//   Each element of the array is an object of class Track with the members:
//     private:
//        Float_t      fPx;           //X component of the momentum
//        Float_t      fPy;           //Y component of the momentum
//        Float_t      fPz;           //Z component of the momentum
//        Float_t      fRandom;       //A random track quantity
//        Float_t      fMass2;        //The mass square of this particle
//        Float_t      fBx;           //X intercept at the vertex
//        Float_t      fBy;           //Y intercept at the vertex
//        Float_t      fMeanCharge;   //Mean charge deposition of all hits of this track
//        Float_t      fXfirst;       //X coordinate of the first point
//        Float_t      fXlast;        //X coordinate of the last point
//        Float_t      fYfirst;       //Y coordinate of the first point
//        Float_t      fYlast;        //Y coordinate of the last point
//        Float_t      fZfirst;       //Z coordinate of the first point
//        Float_t      fZlast;        //Z coordinate of the last point
//        Double32_t   fCharge;       //Charge of this track
//        Double32_t   fVertex[3];    //Track vertex position
//        Int_t        fNpoint;       //Number of points for this track
//        Short_t      fValid;        //Validity criterion
//        Int_t        fNsp;          //Number of points for this track with a special value
//        Double32_t  *fPointValue;   //[fNsp] a special quantity for some point.
//        TBits        fTriggerBits;  //Bits triggered by this track.
//
//   An example of a batch program to use the Event/Track classes is given
//   in this directory: MainEvent.
//   Look also in the same directory at the following macros:
//     - eventa.C  an example how to read the tree
//     - eventb.C  how to read events conditionally
//
//   During the processing of the event (optionally) also a large number
//   of histograms can be filled. The creation and handling of the
//   histograms is taken care of by the HistogramManager class.
//
//   Note:  This version of the class Event (see EventMT.h and EventMT.cxx
//   for an alternative) uses static variables to improve performance (by
//   reducing the number of memory allocations).  Consequently, only one
//   instance of the class Event should be in use at a time (a 2nd instance 
//   would share the array of Tracks with the first instance).
//
////////////////////////////////////////////////////////////////////////

#include "RVersion.h"
#include "TRandom.h"
#include "TDirectory.h"
#include "TProcessID.h"

#include "Event.h"


ClassImp(EventHeader)
ClassImp(Event)
ClassImp(Track)
ClassImp(HistogramManager)

TClonesArray *Event::fgTracks = 0;
TH1F *Event::fgHist = 0;

//______________________________________________________________________________
Event::Event() : fIsValid(kFALSE)
{
   // Create an Event object.
   // When the constructor is invoked for the first time, the class static
   // variable fgTracks is 0 and the TClonesArray fgTracks is created.

   if (!fgTracks) fgTracks = new TClonesArray("Track", 1000);
   fTracks = fgTracks;
   fHighPt = new TRefArray;
   fMuons  = new TRefArray;
   fNtrack = 0;
   fH      = 0;
   Int_t i0,i1;
   for (i0 = 0; i0 < 4; i0++) {
      for (i1 = 0; i1 < 4; i1++) {
         fMatrix[i0][i1] = 0.0;
      }
   }
   for (i0 = 0; i0 <10; i0++) fMeasures[i0] = 0;
   for (i0 = 0; i0 <20; i0++) fType[i0] = 0;
   fClosestDistance = 0;
   fEventName = 0;
   fWebHistogram.SetAction(this);
}

//______________________________________________________________________________
Event::~Event()
{
   Clear();
   if (fH == fgHist) fgHist = 0;
   delete fH; fH = 0;
   delete fHighPt; fHighPt = 0;
   delete fMuons;  fMuons = 0;
   delete [] fClosestDistance;
   if (fEventName) delete [] fEventName;
}

//______________________________________________________________________________
void Event::Build(Int_t ev, Int_t arg5, Float_t ptmin) {
  fIsValid = kTRUE;
  char etype[20];
  Float_t sigmat, sigmas;
  gRandom->Rannor(sigmat,sigmas);
  Int_t ntrack   = Int_t(arg5 +arg5*sigmat/120.);
  Float_t random = gRandom->Rndm(1);

  //Save current Object count
  Int_t ObjectNumber = TProcessID::GetObjectCount();
  Clear();
  fHighPt->Delete();
  fMuons->Delete();
  
  Int_t nch = 15;
  if (ev >= 100)   nch += 3;
  if (ev >= 10000) nch += 3;
  if (fEventName) delete [] fEventName;
  fEventName = new char[nch];
  snprintf(fEventName,nch,"Event%d_Run%d",ev,200);
  snprintf(etype,20,"type%d",ev%5);
  SetType(etype);
  SetHeader(ev, 200, 960312, random);
  SetNseg(Int_t(10*ntrack+20*sigmas));
  SetNvertex(Int_t(1+20*gRandom->Rndm()));
  SetFlag(UInt_t(random+0.5));
  SetTemperature(random+20.);

  for(UChar_t m = 0; m < 10; m++) {
     SetMeasure(m, Int_t(gRandom->Gaus(m,m+1)));
  }
  for(UChar_t i0 = 0; i0 < 4; i0++) {
    for(UChar_t i1 = 0; i1 < 4; i1++) {
       SetMatrix(i0,i1,gRandom->Gaus(i0*i1,1));
    }
  }

  fTriggerBits.SetBitNumber((UInt_t)(64*gRandom->Rndm(1)));
  fTriggerBits.SetBitNumber((UInt_t)(64*gRandom->Rndm(1)));
  fTriggerBits.SetBitNumber((UInt_t)(64*gRandom->Rndm(1)));

  //  Create and Fill the Track objects
  for (Int_t t = 0; t < ntrack; t++) AddTrack(random,ptmin);
  
  //Restore Object count 
  //To save space in the table keeping track of all referenced objects
  //we assume that our events do not address each other. We reset the 
  //object count to what it was at the beginning of the event.
  TProcessID::SetObjectCount(ObjectNumber);
}  

//______________________________________________________________________________
Track *Event::AddTrack(Float_t random, Float_t ptmin)
{
   // Add a new track to the list of tracks for this event.
   // To avoid calling the very time consuming operator new for each track,
   // the standard but not well know C++ operator "new with placement"
   // is called. If tracks[i] is 0, a new Track object will be created
   // otherwise the previous Track[i] will be overwritten.
#if ROOT_VERSION_CODE >= ROOT_VERSION(5,32,0)
   Track *track = (Track*)fTracks->ConstructedAt(fNtrack++);
   track->Set(random);
#else
   TClonesArray &tracks = *fTracks;
   Track *track = new(tracks[fNtrack++]) Track(random);
#endif
   //Save reference to last Track in the collection of Tracks
   fLastTrack = track;
   //Save reference in fHighPt if track is a high Pt track
   if (track->GetPt() > ptmin)   fHighPt->Add(track);
   //Save reference in fMuons if track is a muon candidate
   if (track->GetMass2() < 0.11) fMuons->Add(track);
   return track;
}

//______________________________________________________________________________
void Event::Clear(Option_t * /*option*/)
{
   fTracks->Clear("C"); //will also call Track::Clear
   fHighPt->Delete();
   fMuons->Delete();
   fTriggerBits.Clear();
}

//______________________________________________________________________________
void Event::Reset(Option_t * /*option*/)
{
// Static function to reset all static objects for this event
//   fgTracks->Delete(option);

   delete fgTracks; fgTracks = 0;
   fgHist   = 0;
}

//______________________________________________________________________________
void Event::SetHeader(Int_t i, Int_t run, Int_t date, Float_t random)
{
   fNtrack = 0;
   fEvtHdr.Set(i, run, date);
   if (!fgHist) fgHist = new TH1F("hstat","Event Histogram",100,0,1);
   fH = fgHist;
   fH->Fill(random);
}

//______________________________________________________________________________
void Event::SetMeasure(UChar_t which, Int_t what) {
   if (which<10) fMeasures[which] = what;
}

//______________________________________________________________________________
void Event::SetRandomVertex() {
   // This delete is to test the relocation of variable length array
   if (fClosestDistance) delete [] fClosestDistance;
   if (!fNvertex) {
      fClosestDistance = 0;
      return;
   }
   fClosestDistance = new Double32_t[fNvertex];
   for (Int_t k = 0; k < fNvertex; k++ ) {
      fClosestDistance[k] = gRandom->Gaus(1,1);
   }
}

//______________________________________________________________________________
Track::Track(const Track &orig) : TObject(orig),fTriggerBits(orig.fTriggerBits)
{
   // Copy a track object

   fPx = orig.fPx;
   fPy = orig.fPy;
   fPz = orig.fPx; 
   fRandom = orig.fRandom;
   fMass2 = orig.fMass2;
   fBx = orig.fBx;
   fBy = orig.fBy;
   fMeanCharge = orig.fMeanCharge;
   fXfirst = orig.fXfirst;
   fXlast  = orig.fXlast;
   fYfirst = orig.fYfirst;
   fYlast  = orig.fYlast;
   fZfirst = orig.fZfirst;
   fZlast  = orig.fZlast;
   fCharge = orig.fCharge;

   fVertex[0] = orig.fVertex[0];
   fVertex[1] = orig.fVertex[1];
   fVertex[2] = orig.fVertex[2];
   fNpoint = orig.fNpoint;
   fNsp = orig.fNsp;
   if (fNsp) {
      fPointValue = new Double32_t[fNsp];
      for(int i=0; i<fNsp; i++) {
         fPointValue[i] = orig.fPointValue[i];
      }
   } else {
      fPointValue = 0;
   }
   fValid  = orig.fValid;
}

//______________________________________________________________________________
Track::Track(Float_t random) : TObject(),fTriggerBits(64)
{
   // Create a track object.
   // Note that in this example, data members do not have any physical meaning.

   Float_t a,b,px,py;
   gRandom->Rannor(px,py);
   fPx = px;
   fPy = py;
   fPz = TMath::Sqrt(px*px+py*py);
   fRandom = 1000*random;
   if (fRandom < 10) fMass2 = 0.106;
   else if (fRandom < 100) fMass2 = 0.8;
   else if (fRandom < 500) fMass2 = 4.5;
   else if (fRandom < 900) fMass2 = 8.9;
   else  fMass2 = 9.8;
   gRandom->Rannor(a,b);
   fBx = 0.1*a;
   fBy = 0.1*b;
   fMeanCharge = 0.01*gRandom->Rndm(1);
   gRandom->Rannor(a,b);
   fXfirst = a*10;
   fXlast  = b*10;
   gRandom->Rannor(a,b);
   fYfirst = a*12;
   fYlast  = b*16;
   gRandom->Rannor(a,b);
   fZfirst = 50 + 5*a;
   fZlast  = 200 + 10*b;
   fCharge = Double32_t(Int_t(3*gRandom->Rndm(1)) - 1);

   fTriggerBits.SetBitNumber((UInt_t)(64*gRandom->Rndm(1)));
   fTriggerBits.SetBitNumber((UInt_t)(64*gRandom->Rndm(1)));
   fTriggerBits.SetBitNumber((UInt_t)(64*gRandom->Rndm(1)));

   fVertex[0] = gRandom->Gaus(0,0.1);
   fVertex[1] = gRandom->Gaus(0,0.2);
   fVertex[2] = gRandom->Gaus(0,10);
   fNpoint = Int_t(60+10*gRandom->Rndm(1));
   fNsp = Int_t(3*gRandom->Rndm(1));
   if (fNsp) {
      fPointValue = new Double32_t[fNsp];
      for(int i=0; i<fNsp; i++) {
         fPointValue[i] = i+1;
      }
   } else {
      fPointValue = 0;
   }
   fValid  = Int_t(0.6+gRandom->Rndm(1));
}

//______________________________________________________________________________
Track &Track::operator=(const Track &orig)
{
   // Copy a track
 
   TObject::operator=(orig);
   fPx = orig.fPx;
   fPy = orig.fPy;
   fPz = orig.fPx; 
   fRandom = orig.fRandom;
   fMass2 = orig.fMass2;
   fBx = orig.fBx;
   fBy = orig.fBy;
   fMeanCharge = orig.fMeanCharge;
   fXfirst = orig.fXfirst;
   fXlast  = orig.fXlast;
   fYfirst = orig.fYfirst;
   fYlast  = orig.fYlast;
   fZfirst = orig.fZfirst;
   fZlast  = orig.fZlast;
   fCharge = orig.fCharge;
   
   fVertex[0] = orig.fVertex[0];
   fVertex[1] = orig.fVertex[1];
   fVertex[2] = orig.fVertex[2];
   fNpoint = orig.fNpoint;
   if (fNsp > orig.fNsp) {
      fNsp = orig.fNsp;
      if (fNsp == 0) {
         delete [] fPointValue;
         fPointValue = 0;
      } else {
         for(int i=0; i<fNsp; i++) {
            fPointValue[i] = orig.fPointValue[i];
         }         
      }
   } else {
      if (fNsp) {
         delete [] fPointValue;
      }
      fNsp = orig.fNsp;
      if (fNsp) {
         fPointValue = new Double32_t[fNsp];
         for(int i=0; i<fNsp; i++) {
            fPointValue[i] = orig.fPointValue[i];
         }
      } else {
         fPointValue = 0;
      }
   }
   fValid  = orig.fValid;
   
   fTriggerBits = orig.fTriggerBits;
   
   return *this;
}

//______________________________________________________________________________
void Track::Clear(Option_t * /*option*/)
{
   // Note that we intend on using TClonesArray::ConstructedAt, so we do not
   // need to delete any of the arrays.

   TObject::Clear();
   fTriggerBits.Clear(); 
}

//______________________________________________________________________________
void Track::Set(Float_t random)
{
   // Set the values of the Track data members.
   
   Float_t a,b,px,py;
   gRandom->Rannor(px,py);
   fPx = px;
   fPy = py;
   fPz = TMath::Sqrt(px*px+py*py);
   fRandom = 1000*random;
   if (fRandom < 10) fMass2 = 0.106;
   else if (fRandom < 100) fMass2 = 0.8;
   else if (fRandom < 500) fMass2 = 4.5;
   else if (fRandom < 900) fMass2 = 8.9;
   else  fMass2 = 9.8;
   gRandom->Rannor(a,b);
   fBx = 0.1*a;
   fBy = 0.1*b;
   fMeanCharge = 0.01*gRandom->Rndm(1);
   gRandom->Rannor(a,b);
   fXfirst = a*10;
   fXlast  = b*10;
   gRandom->Rannor(a,b);
   fYfirst = a*12;
   fYlast  = b*16;
   gRandom->Rannor(a,b);
   fZfirst = 50 + 5*a;
   fZlast  = 200 + 10*b;
   fCharge = Double32_t(Int_t(3*gRandom->Rndm(1)) - 1);
   
   fTriggerBits.SetBitNumber((UInt_t)(64*gRandom->Rndm(1)));
   fTriggerBits.SetBitNumber((UInt_t)(64*gRandom->Rndm(1)));
   fTriggerBits.SetBitNumber((UInt_t)(64*gRandom->Rndm(1)));
   
   fVertex[0] = gRandom->Gaus(0,0.1);
   fVertex[1] = gRandom->Gaus(0,0.2);
   fVertex[2] = gRandom->Gaus(0,10);
   fNpoint = Int_t(60+10*gRandom->Rndm(1));
   Int_t newNsp = Int_t(3*gRandom->Rndm(1));
   if (fNsp > newNsp) {
      fNsp = newNsp;
      if (fNsp == 0) {
         delete [] fPointValue;
         fPointValue = 0;
      } else {
         for(int i=0; i<fNsp; i++) {
            fPointValue[i] = i+1;
         }         
      }
      
   } else {
      if (fNsp) {
         delete [] fPointValue;
      }
      fNsp = newNsp;
      if (fNsp) {
         fPointValue = new Double32_t[fNsp];
         for(int i=0; i<fNsp; i++) {
            fPointValue[i] = i+1;
         }
      } else {
         fPointValue = 0;
      }
   }
   fValid  = Int_t(0.6+gRandom->Rndm(1));
}

//______________________________________________________________________________
HistogramManager::HistogramManager(TDirectory *dir)
{
   // Create histogram manager object. Histograms will be created
   // in the "dir" directory.

   // Save current directory and cd to "dir".
   TDirectory *saved = gDirectory;
   dir->cd();

   fNtrack      = new TH1F("hNtrack",    "Ntrack",100,575,625);
   fNseg        = new TH1F("hNseg",      "Nseg",100,5800,6200);
   fTemperature = new TH1F("hTemperature","Temperature",100,19.5,20.5);
   fPx          = new TH1F("hPx",        "Px",100,-4,4);
   fPy          = new TH1F("hPy",        "Py",100,-4,4);
   fPz          = new TH1F("hPz",        "Pz",100,0,5);
   fRandom      = new TH1F("hRandom",    "Random",100,0,1000);
   fMass2       = new TH1F("hMass2",     "Mass2",100,0,12);
   fBx          = new TH1F("hBx",        "Bx",100,-0.5,0.5);
   fBy          = new TH1F("hBy",        "By",100,-0.5,0.5);
   fMeanCharge  = new TH1F("hMeanCharge","MeanCharge",100,0,0.01);
   fXfirst      = new TH1F("hXfirst",    "Xfirst",100,-40,40);
   fXlast       = new TH1F("hXlast",     "Xlast",100,-40,40);
   fYfirst      = new TH1F("hYfirst",    "Yfirst",100,-40,40);
   fYlast       = new TH1F("hYlast",     "Ylast",100,-40,40);
   fZfirst      = new TH1F("hZfirst",    "Zfirst",100,0,80);
   fZlast       = new TH1F("hZlast",     "Zlast",100,0,250);
   fCharge      = new TH1F("hCharge",    "Charge",100,-1.5,1.5);
   fNpoint      = new TH1F("hNpoint",    "Npoint",100,50,80);
   fValid       = new TH1F("hValid",     "Valid",100,0,1.2);

   // cd back to original directory
   saved->cd();
}

//______________________________________________________________________________
HistogramManager::~HistogramManager()
{
   // Clean up all histograms.

   // Nothing to do. Histograms will be deleted when the directory
   // in which tey are stored is closed.
}

//______________________________________________________________________________
void HistogramManager::Hfill(Event *event)
{
   // Fill histograms.

   fNtrack->Fill(event->GetNtrack());
   fNseg->Fill(event->GetNseg());
   fTemperature->Fill(event->GetTemperature());

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