go-hep.org/x/hep@v0.38.1/lcio/cluster_test.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 lcio_test 6 7 import ( 8 "compress/flate" 9 "reflect" 10 "testing" 11 12 "go-hep.org/x/hep/lcio" 13 ) 14 15 func TestRWCluster(t *testing.T) { 16 for _, test := range []struct { 17 fname string 18 complvl int 19 }{ 20 {"testdata/cluster.slcio", flate.NoCompression}, 21 {"testdata/cluster-compressed.slcio", flate.BestCompression}, 22 } { 23 testRWCluster(t, test.complvl, test.fname) 24 } 25 } 26 27 func testRWCluster(t *testing.T, compLevel int, fname string) { 28 w, err := lcio.Create(fname) 29 if err != nil { 30 t.Error(err) 31 return 32 } 33 defer w.Close() 34 w.SetCompressionLevel(compLevel) 35 36 const ( 37 nevents = 10 38 N = 100 39 CLUS = "Clusters" 40 CLUSERR = "ClustersWithEnergyError" 41 ) 42 43 for i := range nevents { 44 evt := lcio.Event{ 45 RunNumber: 4711, 46 EventNumber: int32(i), 47 } 48 49 var ( 50 clus = lcio.ClusterContainer{Flags: lcio.BitsRChLong} 51 clusErr = lcio.ClusterContainer{Flags: lcio.BitsRChLong | lcio.BitsRChEnergyError} 52 ) 53 for j := range N { 54 clu := lcio.Cluster{ 55 Energy: float32(i*j) + 117, 56 Pos: [3]float32{float32(i), float32(j), float32(i * j)}, 57 } 58 clus.Clusters = append(clus.Clusters, clu) 59 60 clu.EnergyErr = float32(i*j) * 0.117 61 clusErr.Clusters = append(clusErr.Clusters, clu) 62 } 63 64 evt.Add(CLUS, &clus) 65 evt.Add(CLUSERR, &clusErr) 66 67 err = w.WriteEvent(&evt) 68 if err != nil { 69 t.Errorf("%s: error writing event %d: %v", fname, i, err) 70 return 71 } 72 } 73 74 err = w.Close() 75 if err != nil { 76 t.Errorf("%s: error closing file: %v", fname, err) 77 return 78 } 79 80 r, err := lcio.Open(fname) 81 if err != nil { 82 t.Errorf("%s: error opening file: %v", fname, err) 83 } 84 defer r.Close() 85 86 for i := range nevents { 87 if !r.Next() { 88 t.Errorf("%s: error reading event %d", fname, i) 89 return 90 } 91 evt := r.Event() 92 if got, want := evt.RunNumber, int32(4711); got != want { 93 t.Errorf("%s: run-number error. got=%d. want=%d", fname, got, want) 94 return 95 } 96 97 if got, want := evt.EventNumber, int32(i); got != want { 98 t.Errorf("%s: run-number error. got=%d. want=%d", fname, got, want) 99 return 100 } 101 102 if !evt.Has(CLUS) { 103 t.Errorf("%s: no %s collection", fname, CLUS) 104 return 105 } 106 107 if !evt.Has(CLUSERR) { 108 t.Errorf("%s: no %s collection", fname, CLUSERR) 109 return 110 } 111 112 clus := evt.Get(CLUS).(*lcio.ClusterContainer) 113 clusErr := evt.Get(CLUSERR).(*lcio.ClusterContainer) 114 115 for j := range N { 116 got := clus.Clusters[j] 117 want := lcio.Cluster{ 118 Clusters: []*lcio.Cluster{}, 119 Hits: []*lcio.CalorimeterHit{}, 120 PIDs: []lcio.ParticleID{}, 121 Shape: []float32{}, 122 SubDetEnes: []float32{}, 123 Weights: []float32{}, 124 Energy: float32(i*j) + 117, 125 Pos: [3]float32{float32(i), float32(j), float32(i * j)}, 126 } 127 128 if !reflect.DeepEqual(got, want) { 129 t.Errorf("%s: event %d clu[%d]\ngot= %#v\nwant=%#v\n", 130 fname, i, j, 131 got, want, 132 ) 133 return 134 } 135 136 want.EnergyErr = float32(i*j) * 0.117 137 got = clusErr.Clusters[j] 138 if !reflect.DeepEqual(got, want) { 139 t.Errorf("%s: event %d clu[%d]\ngot= %#v\nwant=%#v\n", 140 fname, i, j, 141 got, want, 142 ) 143 return 144 } 145 } 146 } 147 148 err = r.Close() 149 if err != nil { 150 t.Errorf("%s: error closing file: %v", fname, err) 151 return 152 } 153 154 }