ZEBRA and HBOOK benchmark

      Program zevent
c.....................................................................
c          This program has been developed to compare the relative
c          performance of ZEBRA FZ Input/Output versus ROOT.
c          It creates a data structure (one event) identical to
c          the ROOT object Event described in root/test/Event.h.
c
c          Each Event top level bank has 3 substructures:
c            lHeader = lq(lEvent-1) : Event header
c            lTracks = lq(lEvent-2) : Support bank for all tracks
c            lHist   = lq(lEvent-3) : pointer to histogram bank
c          The track number itrack is described by:
c            lTrack = lq(lTracks-itrack)
c
c          The program is invoked with
c              zEvent  nevent  mode
c          where:
c             nevent is the number of events to be processed.
c             mode   can be:
c             mode = 'create'  create only the Zebra structures
c                  = 'fzwrite' create + write FZ file
c                  = 'rzwrite' create + write RZ file
c                  = 'fzread'  read FZ file
c                  = 'rzread'  read RZ file
c                  = 'hfill'   create + fill hbook histograms
c
c              Author: Rene Brun
c.....................................................................
      include "zEvent.h"

      integer npar, nevent, ievent, nuh, iuhead,istat,icycle, lrec
      character *80 gname
      character *8 mode, chtop
      integer isl,iquest,idate,itime,tstart,tend,realtime
      common/slate/isl(40)
      common/quest/iquest(100)
 
      call hlimit(nwpaw)

      call datime(idate,itime)
      tstart = 3600*isl(4) + 60*isl(5) + isl(6)
      npar = iargc()
      nevent = 1000
      mode = 'create'
      if (npar.gt.0) then
         call getarg(1,gname)
         read(gname,*) nevent
      endif
      if (npar.gt.1) then
         call getarg(2,gname)
         read(gname,*) mode
      endif
      call vzero(lEvent,5)
      lrec = 8000
c
c                 Create the Event division and a link area
c                 Declare bank formats
c
      call mzdiv(0,EventDiv,'EventDiv',100000,200000,' ')
      call mzlink(0,'/cevent/',lEvent,lHeader,lEvent)
      call mzform('Trak','15F 2I',ioTrack)
      call mzform('Head','3I',ioHeader)
      call mzform('Even','4I 1F',ioEvent)

      if (mode.eq.'fzwrite') then
c......         Open the Zebra FZoutput file (using C I/O)
         call cfopen(iquest(1),0,lrec,'w',0,'Event.fz',istat)
         call fzfile(1,lrec,'LO')
c
c                loop on events (write)
c
         do ievent = 1,nevent
            if (mod(ievent,50).eq.0) print *, mode,' event=',ievent
            call NewEvent(ievent)
            call fzout(1,EventDiv,lEvent,0,'L',0,0,0)
            call mzwipe(EventDiv)
         enddo
         call fzendo(1,' ')
      elseif (mode.eq.'rzwrite') then
c......           Open the Zebra RZ output file
         call rzopen(1,chtop,'Event.rz','NWX',lrec,istat)
         call rzmake(1,chtop,1,'I','EVENT',64000,'NX')
c
c                loop on events (write)
c
         do ievent = 1,nevent
            if (mod(ievent,50).eq.0) print *, mode,' event=',ievent
            call NewEvent(ievent)
            call rzout(EventDiv,lEvent,ievent,icycle,' ')
            call mzwipe(EventDiv)
         enddo
         call rzend(chtop)
      elseif (mode.eq.'create') then
c......           Only create structures
c                loop on events (create Zebra structures only)
c
         do ievent = 1,nevent
            if (mod(ievent,50).eq.0) print *, mode,' event=',ievent
            call NewEvent(ievent)
            call mzwipe(EventDiv)
         enddo
      elseif (mode.eq.'fzread') then
c......           Open the Zebra FZ input file
         call cfopen(iquest(1),0,lrec,'r',0,'Event.fz',istat)
         call fzfile(1,lrec,'L')
c
c                loop on events (read)
c
         do ievent = 1,nevent
            if (mod(ievent,50).eq.0) print *, mode,' event=',ievent
            call fzin(1,EventDiv,lEvent,1,' ',nuh, iuhead)
            call mzwipe(EventDiv)
         enddo
         call fzendi(1,' ')
      elseif (mode.eq.'rzread') then
c......           Open the Zebra RZ input file
         call rzopen(1,'//LUN1','Event.rz','X',lrec,istat)
         call rzfile(1,'//LUN1','X')
c
c                loop on events (rz read)
c
         do ievent = 1,nevent
            if (mod(ievent,50).eq.0) print *, mode,' event=',ievent
            call rzin(EventDiv,lEvent,1,ievent,1,' ')
            call mzwipe(EventDiv)
         enddo
         call rzend('//LUN1')
      elseif (mode.eq.'hfill') then
c......           Create and Fill histograms only
         call EventHbook
c                loop on events (create Zebra structures and fill histograms)
c
         do ievent = 1,nevent
            if (mod(ievent,50).eq.0) print *, mode,' event=',ievent
            call NewEvent(ievent)
            call EventHfill
            call mzwipe(EventDiv)
         enddo
      else
         print*,' Invalid mode'
      endif
      call datime(idate,itime)
      tend = 3600*isl(4) + 60*isl(5) + isl(6)
      realtime = tend - tstart
      print 1000, mode, realtime, realtime/float(nevent)
1000  format(a,' total real time= ',i5,' seconds',
     +' realtime/event = ',f8.4,' seconds')
      end

c___________________________________________________________________________
      subroutine EventHbook
c
c           create histograms 
c
      include "zEvent.h"

      call hbook1(hNtrack,    'Ntrack',100,575.,625.,0)
      call hbook1(hNseg,      'Nseg',100,5800.,6200.,0)
      call hbook1(hTemperature,'Temperature',100,19.5,20.5,0)
      call hbook1(hPx,        'Px',100,-4.,4.,0)
      call hbook1(hPy,        'Py',100,-4.,4.,0)
      call hbook1(hPz,        'Pz',100,0.,5.,0)
      call hbook1(hRandom,    'Random',100,0.,1000.,0)
      call hbook1(hMass2,     'Mass2',100,0.,12.,0)
      call hbook1(hBx,        'Bx',100,-0.5,0.5,0)
      call hbook1(hBy,        'By',100,-0.5,0.5,0)
      call hbook1(hMeanCharge,'MeanCharge',100,0.,0.01,0)
      call hbook1(hXfirst,    'Xfirst',100,-40.,40.,0)
      call hbook1(hXlast,     'Xlast',100,-40.,40.,0)
      call hbook1(hYfirst,    'Yfirst',100,-40.,40.,0)
      call hbook1(hYlast,     'Ylast',100,-40.,40.,0)
      call hbook1(hZfirst,    'Zfirst',100,0.,80.,0)
      call hbook1(hZlast,     'Zlast',100,0.,250.,0)
      call hbook1(hCharge,    'Charge',100,-1.5,1.5,0)
      call hbook1(hNpoint,    'Npoint',100,50.,80.,0)
      call hbook1(hValid,     'Valid',100,0.,1.2,0)
      end

c___________________________________________________________________________
      subroutine EventHfill
c
c           fill histograms 
c
      include "zEvent.h"
      integer ntrack, itrack

      ntrack = iq(lEvent+kNtrack)
      call hf1(hNtrack,      float(iq(lEvent+kNtrack)),1.)
      call hf1(hNseg  ,      float(iq(lEvent+kNseg)),1.)
      call hf1(hTemperature ,q(lEvent+kTemperature),1.)

c            Generate and fill the ntrack track banks
      do itrack = 1,ntrack
         lTrack = lq(lTracks-itrack)
         call hf1(hPx,        q(lTrack+kPx),1.)
         call hf1(hPy,        q(lTrack+kPy),1.)
         call hf1(hPz,        q(lTrack+kPz),1.)
         call hf1(hRandom,    q(lTrack+kRandom),1.)
         call hf1(hMass2,     q(lTrack+kMass2),1.)
         call hf1(hBx,        q(lTrack+kBx),1.)
         call hf1(hBy,        q(lTrack+kBy),1.)
         call hf1(hMeanCharge,q(lTrack+kMeanCharge),1.)
         call hf1(hXfirst,    q(lTrack+kXfirst),1.)
         call hf1(hXlast,     q(lTrack+kXlast),1.)
         call hf1(hYfirst,    q(lTrack+kYfirst),1.)
         call hf1(hYlast,     q(lTrack+kYlast),1.)
         call hf1(hZfirst,    q(lTrack+kZfirst),1.)
         call hf1(hZlast,     q(lTrack+kZlast),1.)
         call hf1(hCharge,    q(lTrack+kCharge),1.)
         call hf1(hNpoint,    float(iq(lTrack+kNpoint)),1.)
         call hf1(hValid,     float(iq(lTrack+kValid)),1.)
      enddo
      end
c___________________________________________________________________________
      Subroutine NewEvent(ievent)
c
c             Create and fill one event
      include "zEvent.h"

      integer hbook,lcid
      common/hcbook/hbook(51)

      integer ievent, ntrack, itrack
      real*4 sigmat,sigmas,random,Rndm

c           Create the top level Event bank with 3 down links and 3 data words
      call mzbook(EventDiv,lEvent,lEvent,1,'Even',3,3,3,ioEvent,0)
      call rannor(sigmat,sigmas)
      random = Rndm(1)
      ntrack = 600+5*sigmat
      iq(lEvent+kNtrack)     = ntrack
      iq(lEvent+kNseg)       = 10*ntrack + 20*sigmas
      iq(lEvent+kNvertex)    = 1
      iq(lEvent+kFlag)       = random+0.5
      q(lEvent+kTemperature) = random+20
      
c            Create the EventHeader bank
      call mzbook(EventDiv,lHeader,lEvent,-1,'Head',0,0,3,ioHeader,0)
      iq (lHeader+kEvtNum) = ievent
      iq(lHeader+kRun)     = 1
      iq(lHeader+kDate)    = 970125
      
c            Create the top level bank to support ntrack tracks
      call mzbook(EventDiv,lTracks,lEvent,-2,'Trks',ntrack,ntrack,0,0,0)

c            Generate and fill the ntrack track banks
      do itrack = 1,ntrack
         call NewTrack(itrack,random)
      enddo

c          Create histogram at first event. Fill histogram
      if (ievent.eq.1) call hbook1(1000,'hstat',100,0.,1.,0.)
      call hf1(1000,random,1.)
c
c          Copy histogram bank pointed by lcid=hbook(11) in lEvent structure
c
      lcid = hbook(11)
      call mzcopy(0,lcid,EventDiv,lEvent,-3,' ')
      end

c___________________________________________________________________________
      Subroutine NewTrack(itrack,random)
c
c              Create and fill one track
c
      include "zEvent.h"

      integer itrack, icharge
      real*4 a,b,px,py,random,fRandom,fMass2, Rndm

      call mzbook(EventDiv,lTrack,lTracks,-itrack,'TRAK',0,0,17
     +           ,ioTrack,0)

      call rannor(px,py)
      q(lTrack+kPx) = px
      q(lTrack+kPy) = py
      q(lTrack+kPz) = sqrt(px*px+py*py)
      fRandom = 1000*random
      q(lTrack+kRandom) = fRandom
      if (fRandom .lt. 10) then
         fMass2 = 0.08
      elseif (fRandom .lt. 100) then
         fMass2 = 0.8
      elseif (fRandom .lt. 500) then
         fMass2 = 4.5
      elseif (fRandom .lt. 900) then
         fMass2 = 8.9
      else  
         fMass2 = 9.8
      endif
      call Rannor(a,b)
      q(lTrack+kBx) = 0.1*a
      q(lTrack+kBy) = 0.1*b
      q(lTrack+kMeanCharge) = 0.01*Rndm(1)
      call Rannor(a,b)
      q(lTrack+kXfirst) = a*10
      q(lTrack+kXlast)  = b*10
      call Rannor(a,b)
      q(lTrack+kYfirst) = a*12
      q(lTrack+kYlast)  = b*16
      call Rannor(a,b)
      q(lTrack+kZfirst) = 50 + 5*a
      q(lTrack+kZlast)  = 200 + 10*b
      icharge = 3*Rndm(1) -1
      q(lTrack+kCharge)  = icharge
      iq(lTrack+kNpoint) = 60+10*Rndm(1)
      iq(lTrack+kValid)  = 0.6+Rndm(1)
      end


ROOT page - Class index - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.