go-hep.org/x/hep@v0.38.1/groot/rsrv/plot.go (about)

     1  // Copyright ©2018 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 rsrv
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  	"reflect"
    11  
    12  	"go-hep.org/x/hep/groot/rtree"
    13  	"go-hep.org/x/hep/hplot"
    14  	"gonum.org/v1/plot/vg"
    15  	"gonum.org/v1/plot/vg/draw"
    16  	"gonum.org/v1/plot/vg/vgeps"
    17  	"gonum.org/v1/plot/vg/vgimg"
    18  	"gonum.org/v1/plot/vg/vgpdf"
    19  	"gonum.org/v1/plot/vg/vgsvg"
    20  	"gonum.org/v1/plot/vg/vgtex"
    21  )
    22  
    23  func (srv *Server) render(p *hplot.Plot, opt PlotOptions) ([]byte, error) {
    24  	var canvas vg.CanvasWriterTo
    25  
    26  	switch opt.Type {
    27  	case "eps":
    28  		canvas = vgeps.NewTitle(opt.Width, opt.Height, p.Title.Text)
    29  	case "jpg", "jpeg":
    30  		canvas = vgimg.JpegCanvas{Canvas: vgimg.New(opt.Width, opt.Height)}
    31  	case "pdf":
    32  		canvas = vgpdf.New(opt.Width, opt.Height)
    33  	case "png":
    34  		canvas = vgimg.PngCanvas{Canvas: vgimg.New(opt.Width, opt.Height)}
    35  	case "svg":
    36  		canvas = vgsvg.New(opt.Width, opt.Height)
    37  	case "tex":
    38  		canvas = vgtex.New(opt.Width, opt.Height)
    39  	case "tiff":
    40  		canvas = vgimg.TiffCanvas{Canvas: vgimg.New(opt.Width, opt.Height)}
    41  	}
    42  
    43  	p.Draw(draw.New(canvas))
    44  
    45  	out := new(bytes.Buffer)
    46  	_, err := canvas.WriteTo(out)
    47  	if err != nil {
    48  		return nil, fmt.Errorf("could not write canvas: %w", err)
    49  	}
    50  
    51  	return out.Bytes(), nil
    52  }
    53  
    54  type floats struct {
    55  	leaf rtree.Leaf
    56  	ptr  any
    57  	vals func() []float64
    58  }
    59  
    60  func newFloats(leaf rtree.Leaf) (floats, error) {
    61  	fv := floats{leaf: leaf}
    62  	n := 1 // scalar
    63  	switch {
    64  	case leaf.LeafCount() != nil:
    65  		n = -1
    66  	case leaf.Len() > 1:
    67  		n = leaf.Len()
    68  	}
    69  
    70  	switch leaf.TypeName() {
    71  	case "bool":
    72  		switch n {
    73  		case 1:
    74  			var vv bool
    75  			fv.ptr = &vv
    76  			fv.vals = func() []float64 {
    77  				b := *fv.ptr.(*bool)
    78  				if b {
    79  					return []float64{1}
    80  				}
    81  				return []float64{0}
    82  			}
    83  		case -1:
    84  			var vv []bool
    85  			fv.ptr = &vv
    86  			fv.vals = func() []float64 {
    87  				bs := *fv.ptr.(*[]bool)
    88  				vs := make([]float64, len(bs))
    89  				for i, b := range bs {
    90  					if b {
    91  						vs[i] = 1
    92  					} else {
    93  						vs[i] = 0
    94  					}
    95  				}
    96  				return vs
    97  			}
    98  		default:
    99  			vv := newArrB(n)
   100  			fv.ptr = vv.Interface()
   101  			fv.vals = func() []float64 {
   102  				vs := make([]float64, n)
   103  				for i := range vs {
   104  					b := vv.Elem().Index(i).Bool()
   105  					if b {
   106  						vs[i] = 1
   107  					} else {
   108  						vs[i] = 0
   109  					}
   110  				}
   111  				return vs
   112  			}
   113  		}
   114  	case "uint8", "byte":
   115  		switch n {
   116  		case 1:
   117  			var vv uint8
   118  			fv.ptr = &vv
   119  			fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*uint8))} }
   120  		case -1:
   121  			var vv []uint8
   122  			fv.ptr = &vv
   123  			fv.vals = func() []float64 {
   124  				vv := *fv.ptr.(*[]uint8)
   125  				vs := make([]float64, len(vv))
   126  				for i, v := range vv {
   127  					vs[i] = float64(v)
   128  				}
   129  				return vs
   130  			}
   131  		default:
   132  			vv := newArrU8(n)
   133  			fv.ptr = vv.Interface()
   134  			fv.vals = func() []float64 {
   135  				vs := make([]float64, n)
   136  				for i := range vs {
   137  					vs[i] = float64(vv.Elem().Index(i).Int())
   138  				}
   139  				return vs
   140  			}
   141  		}
   142  	case "uint16":
   143  		switch n {
   144  		case 1:
   145  			var vv uint16
   146  			fv.ptr = &vv
   147  			fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*uint16))} }
   148  		case -1:
   149  			var vv []uint16
   150  			fv.ptr = &vv
   151  			fv.vals = func() []float64 {
   152  				vv := *fv.ptr.(*[]uint16)
   153  				vs := make([]float64, len(vv))
   154  				for i, v := range vv {
   155  					vs[i] = float64(v)
   156  				}
   157  				return vs
   158  			}
   159  		default:
   160  			vv := newArrU16(n)
   161  			fv.ptr = vv.Interface()
   162  			fv.vals = func() []float64 {
   163  				vs := make([]float64, n)
   164  				for i := range vs {
   165  					vs[i] = float64(vv.Elem().Index(i).Int())
   166  				}
   167  				return vs
   168  			}
   169  		}
   170  	case "uint32":
   171  		switch n {
   172  		case 1:
   173  			var vv uint32
   174  			fv.ptr = &vv
   175  			fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*uint32))} }
   176  		case -1:
   177  			var vv []uint32
   178  			fv.ptr = &vv
   179  			fv.vals = func() []float64 {
   180  				vv := *fv.ptr.(*[]uint32)
   181  				vs := make([]float64, len(vv))
   182  				for i, v := range vv {
   183  					vs[i] = float64(v)
   184  				}
   185  				return vs
   186  			}
   187  		default:
   188  			vv := newArrU32(n)
   189  			fv.ptr = vv.Interface()
   190  			fv.vals = func() []float64 {
   191  				vs := make([]float64, n)
   192  				for i := range vs {
   193  					vs[i] = float64(vv.Elem().Index(i).Int())
   194  				}
   195  				return vs
   196  			}
   197  		}
   198  	case "uint64":
   199  		switch n {
   200  		case 1:
   201  			var vv uint64
   202  			fv.ptr = &vv
   203  			fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*uint64))} }
   204  		case -1:
   205  			var vv []uint64
   206  			fv.ptr = &vv
   207  			fv.vals = func() []float64 {
   208  				vv := *fv.ptr.(*[]uint64)
   209  				vs := make([]float64, len(vv))
   210  				for i, v := range vv {
   211  					vs[i] = float64(v)
   212  				}
   213  				return vs
   214  			}
   215  		default:
   216  			vv := newArrU64(n)
   217  			fv.ptr = vv.Interface()
   218  			fv.vals = func() []float64 {
   219  				vs := make([]float64, n)
   220  				for i := range vs {
   221  					vs[i] = float64(vv.Elem().Index(i).Int())
   222  				}
   223  				return vs
   224  			}
   225  		}
   226  	case "int8":
   227  		switch n {
   228  		case 1:
   229  			var vv int8
   230  			fv.ptr = &vv
   231  			fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*int8))} }
   232  		case -1:
   233  			var vv []int8
   234  			fv.ptr = &vv
   235  			fv.vals = func() []float64 {
   236  				vv := *fv.ptr.(*[]int8)
   237  				vs := make([]float64, len(vv))
   238  				for i, v := range vv {
   239  					vs[i] = float64(v)
   240  				}
   241  				return vs
   242  			}
   243  		default:
   244  			vv := newArrI8(n)
   245  			fv.ptr = vv.Interface()
   246  			fv.vals = func() []float64 {
   247  				vs := make([]float64, n)
   248  				for i := range vs {
   249  					vs[i] = float64(vv.Elem().Index(i).Int())
   250  				}
   251  				return vs
   252  			}
   253  		}
   254  	case "int16":
   255  		switch n {
   256  		case 1:
   257  			var vv int16
   258  			fv.ptr = &vv
   259  			fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*int16))} }
   260  		case -1:
   261  			var vv []int16
   262  			fv.ptr = &vv
   263  			fv.vals = func() []float64 {
   264  				vv := *fv.ptr.(*[]int16)
   265  				vs := make([]float64, len(vv))
   266  				for i, v := range vv {
   267  					vs[i] = float64(v)
   268  				}
   269  				return vs
   270  			}
   271  		default:
   272  			vv := newArrI16(n)
   273  			fv.ptr = vv.Interface()
   274  			fv.vals = func() []float64 {
   275  				vs := make([]float64, n)
   276  				for i := range vs {
   277  					vs[i] = float64(vv.Elem().Index(i).Int())
   278  				}
   279  				return vs
   280  			}
   281  		}
   282  	case "int32":
   283  		switch n {
   284  		case 1:
   285  			var vv int32
   286  			fv.ptr = &vv
   287  			fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*int32))} }
   288  		case -1:
   289  			var vv []int32
   290  			fv.ptr = &vv
   291  			fv.vals = func() []float64 {
   292  				vv := *fv.ptr.(*[]int32)
   293  				vs := make([]float64, len(vv))
   294  				for i, v := range vv {
   295  					vs[i] = float64(v)
   296  				}
   297  				return vs
   298  			}
   299  		default:
   300  			vv := newArrI32(n)
   301  			fv.ptr = vv.Interface()
   302  			fv.vals = func() []float64 {
   303  				vs := make([]float64, n)
   304  				for i := range vs {
   305  					vs[i] = float64(vv.Elem().Index(i).Int())
   306  				}
   307  				return vs
   308  			}
   309  		}
   310  	case "int64":
   311  		switch n {
   312  		case 1:
   313  			var vv int64
   314  			fv.ptr = &vv
   315  			fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*int64))} }
   316  		case -1:
   317  			var vv []int64
   318  			fv.ptr = &vv
   319  			fv.vals = func() []float64 {
   320  				vv := *fv.ptr.(*[]int64)
   321  				vs := make([]float64, len(vv))
   322  				for i, v := range vv {
   323  					vs[i] = float64(v)
   324  				}
   325  				return vs
   326  			}
   327  		default:
   328  			vv := newArrI64(n)
   329  			fv.ptr = vv.Interface()
   330  			fv.vals = func() []float64 {
   331  				vs := make([]float64, n)
   332  				for i := range vs {
   333  					vs[i] = float64(vv.Elem().Index(i).Int())
   334  				}
   335  				return vs
   336  			}
   337  		}
   338  	case "float32":
   339  		switch n {
   340  		case 1:
   341  			var vv float32
   342  			fv.ptr = &vv
   343  			fv.vals = func() []float64 { return []float64{float64(*fv.ptr.(*float32))} }
   344  		case -1:
   345  			var vv []float32
   346  			fv.ptr = &vv
   347  			fv.vals = func() []float64 {
   348  				vv := *fv.ptr.(*[]float32)
   349  				vs := make([]float64, len(vv))
   350  				for i, v := range vv {
   351  					vs[i] = float64(v)
   352  				}
   353  				return vs
   354  			}
   355  		default:
   356  			vv := newArrF32(n)
   357  			fv.ptr = vv.Interface()
   358  			fv.vals = func() []float64 {
   359  				vs := make([]float64, n)
   360  				for i := range vs {
   361  					vs[i] = vv.Elem().Index(i).Float()
   362  				}
   363  				return vs
   364  			}
   365  		}
   366  	case "float64":
   367  		switch n {
   368  		case 1:
   369  			var vv float64
   370  			fv.ptr = &vv
   371  			fv.vals = func() []float64 { return []float64{*fv.ptr.(*float64)} }
   372  		case -1:
   373  			var vv []float64
   374  			fv.ptr = &vv
   375  			fv.vals = func() []float64 { return *fv.ptr.(*[]float64) }
   376  		default:
   377  			vv := newArrF64(n)
   378  			fv.ptr = vv.Interface()
   379  			fv.vals = func() []float64 {
   380  				vs := make([]float64, n)
   381  				for i := range vs {
   382  					vs[i] = vv.Elem().Index(i).Float()
   383  				}
   384  				return vs
   385  			}
   386  		}
   387  	default:
   388  		return fv, fmt.Errorf("unhandled value of type %q", leaf.TypeName())
   389  	}
   390  	return fv, nil
   391  }
   392  
   393  func newArrB(n int) reflect.Value {
   394  	typ := reflect.ArrayOf(n, reflect.TypeOf((*bool)(nil)).Elem())
   395  	return reflect.New(typ)
   396  }
   397  
   398  func newArrU8(n int) reflect.Value {
   399  	typ := reflect.ArrayOf(n, reflect.TypeOf((*uint8)(nil)).Elem())
   400  	return reflect.New(typ)
   401  }
   402  
   403  func newArrU16(n int) reflect.Value {
   404  	typ := reflect.ArrayOf(n, reflect.TypeOf((*uint16)(nil)).Elem())
   405  	return reflect.New(typ)
   406  }
   407  
   408  func newArrU32(n int) reflect.Value {
   409  	typ := reflect.ArrayOf(n, reflect.TypeOf((*uint32)(nil)).Elem())
   410  	return reflect.New(typ)
   411  }
   412  
   413  func newArrU64(n int) reflect.Value {
   414  	typ := reflect.ArrayOf(n, reflect.TypeOf((*uint64)(nil)).Elem())
   415  	return reflect.New(typ)
   416  }
   417  
   418  func newArrI8(n int) reflect.Value {
   419  	typ := reflect.ArrayOf(n, reflect.TypeOf((*int8)(nil)).Elem())
   420  	return reflect.New(typ)
   421  }
   422  
   423  func newArrI16(n int) reflect.Value {
   424  	typ := reflect.ArrayOf(n, reflect.TypeOf((*int16)(nil)).Elem())
   425  	return reflect.New(typ)
   426  }
   427  
   428  func newArrI32(n int) reflect.Value {
   429  	typ := reflect.ArrayOf(n, reflect.TypeOf((*int32)(nil)).Elem())
   430  	return reflect.New(typ)
   431  }
   432  
   433  func newArrI64(n int) reflect.Value {
   434  	typ := reflect.ArrayOf(n, reflect.TypeOf((*int64)(nil)).Elem())
   435  	return reflect.New(typ)
   436  }
   437  
   438  func newArrF32(n int) reflect.Value {
   439  	typ := reflect.ArrayOf(n, reflect.TypeOf((*float32)(nil)).Elem())
   440  	return reflect.New(typ)
   441  }
   442  
   443  func newArrF64(n int) reflect.Value {
   444  	typ := reflect.ArrayOf(n, reflect.TypeOf((*float64)(nil)).Elem())
   445  	return reflect.New(typ)
   446  }