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  }