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 }