go-hep.org/x/hep@v0.38.1/hepmc/decoder.go (about)

     1  // Copyright ©2017 The go-hep Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package hepmc
     6  
     7  import (
     8  	"bufio"
     9  	"fmt"
    10  	"io"
    11  	"sort"
    12  	"strconv"
    13  	"strings"
    14  )
    15  
    16  type rstream struct {
    17  	tokens tokens
    18  	err    error
    19  }
    20  
    21  // Decoder decodes a hepmc Event from a stream
    22  type Decoder struct {
    23  	stream     chan rstream
    24  	seenEvtHdr bool
    25  	ftype      hepmcFileType
    26  
    27  	sigProcBc int // barcode of signal vertex
    28  	bp1       int // barcode of beam1
    29  	bp2       int // barcode of beam2
    30  }
    31  
    32  // NewDecoder returns a new hepmc Decoder that reads from the io.Reader.
    33  func NewDecoder(r io.Reader) *Decoder {
    34  	dec := &Decoder{
    35  		stream: make(chan rstream),
    36  	}
    37  	go dec.readlines(bufio.NewReader(r))
    38  
    39  	return dec
    40  }
    41  
    42  func (dec *Decoder) readlines(r *bufio.Reader) {
    43  	s := bufio.NewScanner(r)
    44  	for s.Scan() {
    45  		dec.stream <- rstream{
    46  			tokens: newtokens(strings.Split(s.Text(), " ")),
    47  			err:    nil,
    48  		}
    49  	}
    50  
    51  	err := s.Err()
    52  	if err == nil {
    53  		err = io.EOF
    54  	}
    55  
    56  	dec.stream <- rstream{
    57  		err: err,
    58  	}
    59  }
    60  
    61  func (dec *Decoder) readline() (tokens, error) {
    62  	state := <-dec.stream
    63  	return state.tokens, state.err
    64  }
    65  
    66  // Decode reads the next value from the stream and stores it into evt.
    67  func (dec *Decoder) Decode(evt *Event) error {
    68  	var err error
    69  
    70  	// search for event listing key
    71  	if !dec.seenEvtHdr {
    72  		err = dec.findFileType()
    73  		if err != nil {
    74  			return err
    75  		}
    76  		dec.seenEvtHdr = true
    77  	}
    78  
    79  	dec.sigProcBc = 0
    80  	dec.bp1 = 0
    81  	dec.bp2 = 0
    82  
    83  	// test to be sure the next entry is of type 'E'
    84  	// FIXME: implement more of the logic from HepMC::IO_GenEvent
    85  	tokens, err := dec.readline()
    86  	if err != nil {
    87  		return err
    88  	}
    89  
    90  	peek := tokens.toks[0]
    91  	if peek[0] != 'E' {
    92  		err = dec.findEndKey(tokens)
    93  		if err == io.EOF {
    94  			return err
    95  		}
    96  		if err != nil {
    97  			return fmt.Errorf(
    98  				"hepmc.decode: invalid file (expected 'E' got '%v'. line=%q): %w",
    99  				string(peek[0]), tokens, err,
   100  			)
   101  		}
   102  	}
   103  
   104  	nVtx := 0
   105  loop:
   106  	for {
   107  		switch tokens.at(0)[0] {
   108  		case 'E':
   109  			// call appropriate decoder method
   110  			switch dec.ftype {
   111  			case hepmcGenEvent:
   112  				err = dec.decodeEvent(evt, &nVtx, tokens)
   113  			case hepmcASCII:
   114  				err = dec.decodeASCII(evt, &nVtx, tokens)
   115  			case hepmcExtendedASCII:
   116  				err = dec.decodeExtendedASCII(evt, &nVtx, tokens)
   117  			case hepmcASCIIPdt:
   118  				err = fmt.Errorf("hepmc.decode: HepMC::IO_Ascii-PARTICLE_DATA is NOT implemented (yet)")
   119  			case hepmcExtendedASCIIPdt:
   120  				err = fmt.Errorf("hepmc.decode: HepMC::IO_ExtendedAscii-PARTICLE_DATA is NOT implemented (yet)")
   121  			default:
   122  				err = fmt.Errorf("hepmc.decode: unknown file format (%v)", dec.ftype)
   123  			}
   124  			if err != nil {
   125  				return err
   126  			}
   127  		case 'N':
   128  			_ = tokens.next() // header 'N'
   129  			nWeights, err := tokens.int()
   130  			if err != nil {
   131  				return fmt.Errorf("hepmc: could not decode N token: %w", err)
   132  			}
   133  			names := make(map[string]int, nWeights)
   134  			for i := range nWeights {
   135  				tok := tokens.next()
   136  				nn, err := strconv.Unquote(tok)
   137  				if err != nil {
   138  					return fmt.Errorf("hepmc: could not unquote weight %q: %w", tok, err)
   139  				}
   140  				names[nn] = i
   141  			}
   142  
   143  			//fmt.Printf("== weights: %v\n", names)
   144  			evt.Weights.Map = names
   145  
   146  		case 'U':
   147  			if dec.ftype == hepmcGenEvent {
   148  				err = dec.decodeUnits(evt, tokens)
   149  				if err != nil {
   150  					return err
   151  				}
   152  			}
   153  		case 'C':
   154  			err = dec.decodeCrossSection(evt, tokens)
   155  			if err != nil {
   156  				return err
   157  			}
   158  		case 'H':
   159  			switch dec.ftype {
   160  			case hepmcGenEvent, hepmcExtendedASCII:
   161  				var hi HeavyIon
   162  				err = dec.decodeHeavyIon(&hi, tokens)
   163  				if err != nil {
   164  					return err
   165  				}
   166  				evt.HeavyIon = &hi
   167  			}
   168  		case 'F':
   169  			switch dec.ftype {
   170  			case hepmcGenEvent, hepmcExtendedASCII:
   171  				var pdf PdfInfo
   172  				err = dec.decodePdfInfo(&pdf, tokens)
   173  				if err != nil {
   174  					return err
   175  				}
   176  				evt.PdfInfo = &pdf
   177  			}
   178  		case 'V', 'P':
   179  			break loop
   180  
   181  		default:
   182  
   183  			return fmt.Errorf(
   184  				"hepmc.decoder: invalid file (got '%v')",
   185  				peek[0],
   186  			)
   187  		}
   188  
   189  		tokens, err = dec.readline()
   190  		if err != nil {
   191  			return err
   192  		}
   193  	}
   194  	// dec.r.Read(peek[0:])
   195  	// end vertices of particles are not connected until
   196  	// after the full event is read
   197  	//  => store the values in a map until then
   198  	pidxToEndVtx := make(map[int]int, nVtx) // particle-idx to end_vtx barcode
   199  
   200  	// decode the vertices
   201  	for i := range nVtx {
   202  		if i != 0 {
   203  			tokens, err = dec.readline()
   204  			if err != nil {
   205  				return err
   206  			}
   207  		}
   208  		vtx := &Vertex{}
   209  		vtx.Event = evt
   210  		err = dec.decodeVertex(evt, vtx, pidxToEndVtx, tokens)
   211  		if err != nil {
   212  			return err
   213  		}
   214  		evt.Vertices[vtx.Barcode] = vtx
   215  		sort.Sort(Particles(vtx.ParticlesOut))
   216  	}
   217  
   218  	// set the signal process vertex
   219  	if dec.sigProcBc != 0 {
   220  		for _, vtx := range evt.Vertices {
   221  			if vtx.Barcode == dec.sigProcBc {
   222  				evt.SignalVertex = vtx
   223  				break
   224  			}
   225  		}
   226  		if evt.SignalVertex == nil {
   227  			return fmt.Errorf("hepmc.decode: could not find signal vertex (barcode=%d)", dec.sigProcBc)
   228  		}
   229  	}
   230  
   231  	// connect particles to their end vertices
   232  	for i, endVtxBc := range pidxToEndVtx {
   233  		p := evt.Particles[i]
   234  		vtx := evt.Vertices[endVtxBc]
   235  		vtx.ParticlesIn = append(vtx.ParticlesIn, p)
   236  		p.EndVertex = vtx
   237  		// also look for the beam particles
   238  		if p.Barcode == dec.bp1 {
   239  			evt.Beams[0] = p
   240  		}
   241  		if p.Barcode == dec.bp2 {
   242  			evt.Beams[1] = p
   243  		}
   244  		sort.Sort(Particles(vtx.ParticlesIn))
   245  	}
   246  	return err
   247  }
   248  
   249  func (dec *Decoder) findFileType() error {
   250  
   251  	for {
   252  		tokens, err := dec.readline()
   253  		if err != nil {
   254  			if err == io.EOF {
   255  				err = io.ErrUnexpectedEOF
   256  			}
   257  			return err
   258  		}
   259  		if len(tokens.toks) <= 0 {
   260  			continue
   261  		}
   262  		line := tokens.next()
   263  		switch line {
   264  		case "":
   265  			// no-op
   266  
   267  		case startGenEvent:
   268  			dec.ftype = hepmcGenEvent
   269  			return nil
   270  
   271  		case startASCII:
   272  			dec.ftype = hepmcASCII
   273  			return nil
   274  
   275  		case startExtendedASCII:
   276  			dec.ftype = hepmcExtendedASCII
   277  			return nil
   278  
   279  		case startPdt:
   280  			dec.ftype = hepmcASCIIPdt
   281  			return nil
   282  
   283  		case startExtendedASCIIPdt:
   284  			dec.ftype = hepmcExtendedASCIIPdt
   285  			return nil
   286  		}
   287  	}
   288  }
   289  
   290  func (dec *Decoder) findEndKey(tokens tokens) error {
   291  	var err error = io.EOF
   292  	line := tokens.next()
   293  	if line[0] != 'H' {
   294  		err = fmt.Errorf("hepmc.decode: not an end-key (line=%q)", line)
   295  		return err
   296  	}
   297  
   298  	var ftype hepmcFileType
   299  	switch line {
   300  	default:
   301  		err = fmt.Errorf("hepmc.decode: invalid file type (value=%q)", line)
   302  		return err
   303  
   304  	case endGenEvent:
   305  		ftype = hepmcGenEvent
   306  
   307  	case endASCII:
   308  		ftype = hepmcASCII
   309  
   310  	case endExtendedASCII:
   311  		ftype = hepmcExtendedASCII
   312  
   313  	case endPdt:
   314  		ftype = hepmcASCIIPdt
   315  
   316  	case endExtendedASCIIPdt:
   317  		ftype = hepmcExtendedASCIIPdt
   318  	}
   319  
   320  	if ftype != dec.ftype {
   321  		err = fmt.Errorf(
   322  			"hepmc.decode: file type changed from %v to %v",
   323  			dec.ftype, ftype,
   324  		)
   325  	}
   326  	return err
   327  }
   328  
   329  func (dec *Decoder) decodeUnits(evt *Event, tokens tokens) error {
   330  	var err error
   331  	peek := tokens.next()
   332  	if peek[0] != 'U' {
   333  		return fmt.Errorf("hepmc.decode: expected 'U'. got '%s'", string(peek[0]))
   334  	}
   335  
   336  	momUnit := tokens.next()
   337  	evt.MomentumUnit, err = MomentumUnitFromString(momUnit)
   338  	if err != nil {
   339  		return err
   340  	}
   341  
   342  	lenUnit := tokens.next()
   343  	evt.LengthUnit, err = LengthUnitFromString(lenUnit)
   344  	if err != nil {
   345  		return err
   346  	}
   347  	return err
   348  }
   349  
   350  func (dec *Decoder) decodeCrossSection(evt *Event, tokens tokens) error {
   351  	var err error
   352  	peek := tokens.next()
   353  	if peek[0] != 'C' {
   354  		return fmt.Errorf("hepmc.decode: expected 'C'. got '%s'", string(peek[0]))
   355  	}
   356  	var x CrossSection
   357  	x.Value, err = tokens.float64()
   358  	if err != nil {
   359  		return err
   360  	}
   361  	x.Error, err = tokens.float64()
   362  	if err != nil {
   363  		return err
   364  	}
   365  	evt.CrossSection = &x
   366  	return err
   367  }
   368  
   369  func (dec *Decoder) decodeEvent(evt *Event, nVtx *int, tokens tokens) error {
   370  	var (
   371  		err       error
   372  		evtNbr    int
   373  		mpi       int
   374  		scale     float64
   375  		aqcd      float64
   376  		aqed      float64
   377  		sigProcID int
   378  		nRndm     int
   379  		nWeights  int
   380  	)
   381  
   382  	peek := tokens.next()
   383  	if peek[0] != 'E' {
   384  		return fmt.Errorf("hepmc.decode: expected 'E'. got '%s'", string(peek[0]))
   385  	}
   386  
   387  	evtNbr, err = tokens.int()
   388  	if err != nil {
   389  		return err
   390  	}
   391  
   392  	mpi, err = tokens.int()
   393  	if err != nil {
   394  		return err
   395  	}
   396  
   397  	scale, err = tokens.float64()
   398  	if err != nil {
   399  		return err
   400  	}
   401  
   402  	aqcd, err = tokens.float64()
   403  	if err != nil {
   404  		return err
   405  	}
   406  
   407  	aqed, err = tokens.float64()
   408  	if err != nil {
   409  		return err
   410  	}
   411  
   412  	sigProcID, err = tokens.int()
   413  	if err != nil {
   414  		return err
   415  	}
   416  
   417  	dec.sigProcBc, err = tokens.int()
   418  	if err != nil {
   419  		return err
   420  	}
   421  
   422  	*nVtx, err = tokens.int()
   423  	if err != nil {
   424  		return err
   425  	}
   426  
   427  	dec.bp1, err = tokens.int()
   428  	if err != nil {
   429  		return err
   430  	}
   431  
   432  	dec.bp2, err = tokens.int()
   433  	if err != nil {
   434  		return err
   435  	}
   436  
   437  	nRndm, err = tokens.int()
   438  	if err != nil {
   439  		return err
   440  	}
   441  
   442  	rndmStates := make([]int64, nRndm)
   443  	for i := range nRndm {
   444  		rndmStates[i], err = tokens.int64()
   445  		if err != nil {
   446  			return err
   447  		}
   448  	}
   449  
   450  	nWeights, err = tokens.int()
   451  	if err != nil {
   452  		return err
   453  	}
   454  
   455  	weights := make([]float64, nWeights)
   456  	for i := range nWeights {
   457  		weights[i], err = tokens.float64()
   458  		if err != nil {
   459  			return err
   460  		}
   461  	}
   462  
   463  	// fill infos gathered so far
   464  	evt.SignalProcessID = sigProcID
   465  	evt.EventNumber = evtNbr
   466  	evt.Mpi = mpi
   467  	if evt.Weights.Slice == nil {
   468  		evt.Weights = NewWeights()
   469  	}
   470  	evt.Weights.Slice = weights
   471  	evt.RandomStates = rndmStates
   472  	evt.Scale = scale
   473  	evt.AlphaQCD = aqcd
   474  	evt.AlphaQED = aqed
   475  
   476  	evt.Vertices = make(map[int]*Vertex, *nVtx)
   477  	evt.Particles = make(map[int]*Particle, *nVtx*2)
   478  	return err
   479  }
   480  
   481  func (dec *Decoder) decodeVertex(evt *Event, vtx *Vertex, pidxToEndVtx map[int]int, tokens tokens) error {
   482  
   483  	var err error
   484  	peek := tokens.next()
   485  	if peek[0] != 'V' {
   486  		return fmt.Errorf(
   487  			"hepmc.decode: invalid file (expected 'V', got '%v') line=%q",
   488  			peek[0],
   489  			tokens,
   490  		)
   491  	}
   492  
   493  	orphans := 0
   494  	nPartsOut := 0
   495  	nWeights := 0
   496  
   497  	vtx.Barcode, err = tokens.int()
   498  	if err != nil {
   499  		return err
   500  	}
   501  
   502  	vtx.ID, err = tokens.int()
   503  	if err != nil {
   504  		return err
   505  	}
   506  
   507  	vtx.Position.P4.X, err = tokens.float64()
   508  	if err != nil {
   509  		return err
   510  	}
   511  
   512  	vtx.Position.P4.Y, err = tokens.float64()
   513  	if err != nil {
   514  		return err
   515  	}
   516  
   517  	vtx.Position.P4.Z, err = tokens.float64()
   518  	if err != nil {
   519  		return err
   520  	}
   521  
   522  	vtx.Position.P4.T, err = tokens.float64()
   523  	if err != nil {
   524  		return err
   525  	}
   526  
   527  	orphans, err = tokens.int()
   528  	if err != nil {
   529  		return err
   530  	}
   531  
   532  	nPartsOut, err = tokens.int()
   533  	if err != nil {
   534  		return err
   535  	}
   536  
   537  	nWeights, err = tokens.int()
   538  	if err != nil {
   539  		return err
   540  	}
   541  
   542  	// FIXME: reuse buffers ?
   543  	vtx.Weights.Slice = make([]float64, nWeights)
   544  	for i := range nWeights {
   545  		vtx.Weights.Slice[i], err = tokens.float64()
   546  		if err != nil {
   547  			return err
   548  		}
   549  	}
   550  
   551  	// read and create the associated particles
   552  	// outgoing particles are added to their production vertices immediately.
   553  	// incoming particles are added to a map and handled later.
   554  	for range orphans {
   555  		p := &Particle{}
   556  		tokens, err = dec.readline()
   557  		if err != nil {
   558  			return err
   559  		}
   560  		err = dec.decodeParticle(evt, p, pidxToEndVtx, tokens)
   561  		if err != nil {
   562  			return err
   563  		}
   564  		evt.Particles[p.Barcode] = p
   565  	}
   566  	// FIXME: reuse buffers ?
   567  	vtx.ParticlesOut = make([]*Particle, nPartsOut)
   568  	for i := range nPartsOut {
   569  		p := &Particle{ProdVertex: vtx}
   570  		tokens, err = dec.readline()
   571  		if err != nil {
   572  			return err
   573  		}
   574  		err = dec.decodeParticle(evt, p, pidxToEndVtx, tokens)
   575  		if err != nil {
   576  			return err
   577  		}
   578  		evt.Particles[p.Barcode] = p
   579  		vtx.ParticlesOut[i] = p
   580  	}
   581  	return err
   582  }
   583  
   584  func (dec *Decoder) decodeParticle(evt *Event, p *Particle, pidxToEndVtx map[int]int, tokens tokens) error {
   585  
   586  	var err error
   587  	peek := tokens.next()
   588  	if peek[0] != 'P' {
   589  		return fmt.Errorf(
   590  			"hepmc.decode: invalid file (expected 'P', got '%v')",
   591  			peek[0],
   592  		)
   593  	}
   594  	endBc := 0
   595  
   596  	p.Barcode, err = tokens.int()
   597  	if err != nil {
   598  		return err
   599  	}
   600  
   601  	p.PdgID, err = tokens.int64()
   602  	if err != nil {
   603  		return err
   604  	}
   605  
   606  	p.Momentum.P4.X, err = tokens.float64()
   607  	if err != nil {
   608  		return err
   609  	}
   610  
   611  	p.Momentum.P4.Y, err = tokens.float64()
   612  	if err != nil {
   613  		return err
   614  	}
   615  
   616  	p.Momentum.P4.Z, err = tokens.float64()
   617  	if err != nil {
   618  		return err
   619  	}
   620  
   621  	p.Momentum.P4.T, err = tokens.float64()
   622  	if err != nil {
   623  		return err
   624  	}
   625  
   626  	if dec.ftype != hepmcASCII {
   627  		p.GeneratedMass, err = tokens.float64()
   628  		if err != nil {
   629  			return err
   630  		}
   631  	}
   632  
   633  	p.Status, err = tokens.int()
   634  	if err != nil {
   635  		return err
   636  	}
   637  
   638  	p.Polarization.Theta, err = tokens.float64()
   639  	if err != nil {
   640  		return err
   641  	}
   642  
   643  	p.Polarization.Phi, err = tokens.float64()
   644  	if err != nil {
   645  		return err
   646  	}
   647  
   648  	endBc, err = tokens.int()
   649  	if err != nil {
   650  		return err
   651  	}
   652  
   653  	err = dec.decodeFlow(&p.Flow, &tokens)
   654  	if err != nil {
   655  		return err
   656  	}
   657  	p.Flow.Particle = p
   658  
   659  	// all particles are connected to their end vertex separately
   660  	// after all particles and vertices have been created
   661  	if endBc != 0 {
   662  		pidxToEndVtx[p.Barcode] = endBc
   663  	}
   664  	return err
   665  }
   666  
   667  func (dec *Decoder) decodeFlow(flow *Flow, tokens *tokens) error {
   668  	nFlow, err := tokens.int()
   669  	if err != nil {
   670  		return err
   671  	}
   672  	flow.Icode = make(map[int]int, nFlow)
   673  	for range nFlow {
   674  		k, err := tokens.int()
   675  		if err != nil {
   676  			return err
   677  		}
   678  		v, err := tokens.int()
   679  		if err != nil {
   680  			return err
   681  		}
   682  		flow.Icode[k] = v
   683  	}
   684  	return err
   685  }
   686  
   687  func (dec *Decoder) decodeHeavyIon(hi *HeavyIon, tokens tokens) error {
   688  	var err error
   689  	peek := tokens.next()
   690  	if peek[0] != 'H' {
   691  		return fmt.Errorf(
   692  			"hepmc.decode: invalid file (expected 'H', got '%v')",
   693  			peek[0],
   694  		)
   695  	}
   696  
   697  	hi.NCollHard, err = tokens.int()
   698  	if err != nil {
   699  		return err
   700  	}
   701  
   702  	hi.NPartProj, err = tokens.int()
   703  	if err != nil {
   704  		return err
   705  	}
   706  
   707  	hi.NPartTarg, err = tokens.int()
   708  	if err != nil {
   709  		return err
   710  	}
   711  
   712  	hi.NColl, err = tokens.int()
   713  	if err != nil {
   714  		return err
   715  	}
   716  
   717  	hi.NNwColl, err = tokens.int()
   718  	if err != nil {
   719  		return err
   720  	}
   721  
   722  	hi.NwNColl, err = tokens.int()
   723  	if err != nil {
   724  		return err
   725  	}
   726  
   727  	hi.NwNwColl, err = tokens.int()
   728  	if err != nil {
   729  		return err
   730  	}
   731  
   732  	hi.SpectatorNeutrons, err = tokens.int()
   733  	if err != nil {
   734  		return err
   735  	}
   736  
   737  	hi.SpectatorProtons, err = tokens.int()
   738  	if err != nil {
   739  		return err
   740  	}
   741  
   742  	hi.ImpactParameter, err = tokens.float32()
   743  	if err != nil {
   744  		return err
   745  	}
   746  
   747  	hi.EventPlaneAngle, err = tokens.float32()
   748  	if err != nil {
   749  		return err
   750  	}
   751  
   752  	hi.Eccentricity, err = tokens.float32()
   753  	if err != nil {
   754  		return err
   755  	}
   756  
   757  	hi.SigmaInelNN, err = tokens.float32()
   758  	if err != nil {
   759  		return err
   760  	}
   761  
   762  	return err
   763  }
   764  
   765  func (dec *Decoder) decodePdfInfo(pdf *PdfInfo, tokens tokens) error {
   766  	var err error
   767  	peek := tokens.next()
   768  	if peek[0] != 'F' {
   769  		return fmt.Errorf(
   770  			"hepmc.decode: invalid file (expected 'F', got '%v')",
   771  			peek[0],
   772  		)
   773  	}
   774  
   775  	pdf.ID1, err = tokens.int()
   776  	if err != nil {
   777  		return err
   778  	}
   779  
   780  	pdf.ID2, err = tokens.int()
   781  	if err != nil {
   782  		return err
   783  	}
   784  
   785  	pdf.X1, err = tokens.float64()
   786  	if err != nil {
   787  		return err
   788  	}
   789  
   790  	pdf.X2, err = tokens.float64()
   791  	if err != nil {
   792  		return err
   793  	}
   794  
   795  	pdf.ScalePDF, err = tokens.float64()
   796  	if err != nil {
   797  		return err
   798  	}
   799  
   800  	pdf.Pdf1, err = tokens.float64()
   801  	if err != nil {
   802  		return err
   803  
   804  	}
   805  
   806  	pdf.Pdf2, err = tokens.float64()
   807  	if err != nil {
   808  		return err
   809  	}
   810  
   811  	pdf.LHAPdf1, err = tokens.int()
   812  	if err != nil {
   813  		return err
   814  	}
   815  
   816  	pdf.LHAPdf2, err = tokens.int()
   817  	if err != nil {
   818  		return err
   819  	}
   820  
   821  	return err
   822  }
   823  
   824  func (dec *Decoder) decodeASCII(evt *Event, nVtx *int, tokens tokens) error {
   825  	var (
   826  		err       error
   827  		evtNbr    int
   828  		mpi       int
   829  		scale     float64
   830  		aqcd      float64
   831  		aqed      float64
   832  		sigProcID int
   833  		nRndm     int
   834  		nWeights  int
   835  	)
   836  
   837  	evtNbr, err = tokens.int()
   838  	if err != nil {
   839  		return err
   840  	}
   841  
   842  	scale, err = tokens.float64()
   843  	if err != nil {
   844  		return err
   845  	}
   846  
   847  	aqcd, err = tokens.float64()
   848  	if err != nil {
   849  		return err
   850  	}
   851  
   852  	aqed, err = tokens.float64()
   853  	if err != nil {
   854  		return err
   855  	}
   856  
   857  	sigProcID, err = tokens.int()
   858  	if err != nil {
   859  		return err
   860  	}
   861  
   862  	dec.sigProcBc, err = tokens.int()
   863  	if err != nil {
   864  		return err
   865  	}
   866  
   867  	*nVtx, err = tokens.int()
   868  	if err != nil {
   869  		return err
   870  	}
   871  
   872  	nRndm, err = tokens.int()
   873  	if err != nil {
   874  		return err
   875  
   876  	}
   877  
   878  	rndmStates := make([]int64, nRndm)
   879  	for i := range nRndm {
   880  		rndmStates[i], err = tokens.int64()
   881  		if err != nil {
   882  			return err
   883  		}
   884  	}
   885  
   886  	nWeights, err = tokens.int()
   887  	if err != nil {
   888  		return err
   889  	}
   890  
   891  	weights := make([]float64, nWeights)
   892  	for i := range nWeights {
   893  		weights[i], err = tokens.float64()
   894  		if err != nil {
   895  			return err
   896  		}
   897  	}
   898  
   899  	// fill infos gathered so far
   900  	evt.SignalProcessID = sigProcID
   901  	evt.EventNumber = evtNbr
   902  	evt.Mpi = mpi
   903  	if evt.Weights.Slice == nil {
   904  		evt.Weights = NewWeights()
   905  	}
   906  	evt.Weights.Slice = weights
   907  	evt.RandomStates = rndmStates
   908  	evt.Scale = scale
   909  	evt.AlphaQCD = aqcd
   910  	evt.AlphaQED = aqed
   911  
   912  	evt.Vertices = make(map[int]*Vertex, *nVtx)
   913  	evt.Particles = make(map[int]*Particle, *nVtx*2)
   914  	return err
   915  }
   916  
   917  func (dec *Decoder) decodeExtendedASCII(evt *Event, nVtx *int, tokens tokens) error {
   918  	return dec.decodeEvent(evt, nVtx, tokens)
   919  }