Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions RELEASE.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
The versions of EPICS base, asyn, ADCore, and other synApps modules used for each release can be obtained from
the configure/RELEASE file in each release of quadEM.

## Release 9-7 (unreleased)
- Added a Custom geometry that allows user-defined weights for computing the sum
and difference values from the four current inputs, along with custom X/Y axis labels.
Thanks to John Runchey from ANL for this.

## Release 9-6 (November 29, 2025)
- Added a software driver to get data into the quadEM. It is similar to the NDDriverStdArrays for areaDetector.
Thanks to Xiaoqiang Wang from PSI for this.
Expand Down
39 changes: 38 additions & 1 deletion docs/source/databases.rst
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,9 @@ minimum, maximum, and other statistics, including a histogram of array values.

- 0: Diamond
- 1: Square

- 2: SquareCC
- 3: Custom

* - QE_RESOLUTION
- $(P)$(R)Resolution, $(P)$(R)Resolution_RBV
- mbbo, mbbi
Expand Down Expand Up @@ -614,6 +616,41 @@ minimum, maximum, and other statistics, including a histogram of array values.
are typically between 1e-4 to 1e-12. It is convenient to use a CurrentScale of 1e9
or 1e12, for example, so that the data are displayed in units of nano-amps or pico-amps.
They are then reasonable sized integers, and the time series software can be used.
* - QE_WEIGHT_XSUM
- $(P)$(R)WeightXsum[1-4]
- ao
- asynFloat64 (addr=0-3)
- r/w
- All
- Weights applied to each current input when computing SumX in Custom geometry.
* - QE_WEIGHT_YSUM
- $(P)$(R)WeightYsum[1-4]
- ao
- asynFloat64 (addr=0-3)
- r/w
- All
- Weights applied to each current input when computing SumY in Custom geometry.
* - QE_WEIGHT_XDELTA
- $(P)$(R)WeightXdelta[1-4]
- ao
- asynFloat64 (addr=0-3)
- r/w
- All
- Weights applied to each current input when computing DiffX in Custom geometry.
* - QE_WEIGHT_YDELTA
- $(P)$(R)WeightYdelta[1-4]
- ao
- asynFloat64 (addr=0-3)
- r/w
- All
- Weights applied to each current input when computing DiffY in Custom geometry.
* - N.A.
- $(P)$(R)Xlabel, $(P)$(R)Ylabel
- stringin
- N.A.
- r/w
- All
- Custom labels for the X and Y axes, used with the Custom geometry.
* - N.A.
- $(P)$(R)CurrentPrec[1-4]
- mbbo
Expand Down
9 changes: 7 additions & 2 deletions docs/source/overview.rst
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,11 @@ R9-5 added a variant of the square geometry, SquareCC::

- It is similar to Square, but the 4 diodes are arranged counterclockwise.
SumX=SumY=(1+2+3+4), DiffX=(3+4)-(1+2), DiffY=(1+4)-(2+3).


A Custom geometry is also available for non-standard detector arrangements. In this mode
the user provides a set of four weights for each of the computed values (SumX, SumY, DiffX,
DiffY). Each output is computed as the weighted sum of the four input currents. Custom axis
labels can also be set via the Xlabel and Ylabel PVs.

For all geometries SumAll=(1+2+3+4), PositionX=DiffX/SumX, and PositionY=DiffY/SumY.
X positive is to the right and Y positive is up for both geometries.
X positive is to the right and Y positive is up for the standard geometries.
162 changes: 162 additions & 0 deletions quadEMApp/Db/quadEM.template
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,8 @@ record(mbbo,"$(P)$(R)Geometry") {
field(ONST, "Square")
field(TWVL, "2")
field(TWST, "SquareCC")
field(THVL, "3")
field(THST, "Custom")
field(DTYP, "asynInt32")
field(OUT, "@asyn($(PORT) 0)QE_GEOMETRY")
}
Expand All @@ -487,11 +489,25 @@ record(mbbi,"$(P)$(R)Geometry_RBV") {
field(ONST, "Square")
field(TWVL, "2")
field(TWST, "SquareCC")
field(THVL, "3")
field(THST, "Custom")
field(DTYP, "asynInt32")
field(INP, "@asyn($(PORT) 0)QE_GEOMETRY")
field(SCAN, "I/O Intr")
}

record(stringin,"$(P)$(R)Xlabel") {
field(PINI, "YES")
field(DESC, "X label")
field(VAL, "X")
}

record(stringin,"$(P)$(R)Ylabel") {
field(PINI, "YES")
field(DESC, "Y label")
field(VAL, "Y")
}

record(stringin,"$(P)$(R)CurrentName1") {
field(DESC, "Name")
field(VAL, "1")
Expand Down Expand Up @@ -768,6 +784,152 @@ record(ao,"$(P)$(R)CurrentScale4") {
field(PREC, "3")
}

record(ao,"$(P)$(R)WeightXsum1") {
field(DESC, "Wxsum 1")
field(PINI, "YES")
field(DTYP, "asynFloat64")
field(OUT, "@asyn($(PORT) 0)QE_WEIGHT_XSUM")
field(VAL, "1.0")
field(PREC, "3")
field(PREC, "3")
}

record(ao,"$(P)$(R)WeightXsum2") {
field(DESC, "Wxsum 2")
field(PINI, "YES")
field(DTYP, "asynFloat64")
field(OUT, "@asyn($(PORT) 1)QE_WEIGHT_XSUM")
field(VAL, "1.0")
field(PREC, "3")
}

record(ao,"$(P)$(R)WeightXsum3") {
field(DESC, "Wxsum 3")
field(PINI, "YES")
field(DTYP, "asynFloat64")
field(OUT, "@asyn($(PORT) 2)QE_WEIGHT_XSUM")
field(VAL, "1.0")
field(PREC, "3")
}

record(ao,"$(P)$(R)WeightXsum4") {
field(DESC, "Wxsum 4")
field(PINI, "YES")
field(DTYP, "asynFloat64")
field(OUT, "@asyn($(PORT) 3)QE_WEIGHT_XSUM")
field(VAL, "1.0")
field(PREC, "3")
}

record(ao,"$(P)$(R)WeightYsum1") {
field(DESC, "Wysum 1")
field(PINI, "YES")
field(DTYP, "asynFloat64")
field(OUT, "@asyn($(PORT) 0)QE_WEIGHT_YSUM")
field(VAL, "1.0")
field(PREC, "3")
field(PREC, "3")
}

record(ao,"$(P)$(R)WeightYsum2") {
field(DESC, "Wysum 2")
field(PINI, "YES")
field(DTYP, "asynFloat64")
field(OUT, "@asyn($(PORT) 1)QE_WEIGHT_YSUM")
field(VAL, "1.0")
field(PREC, "3")
}

record(ao,"$(P)$(R)WeightYsum3") {
field(DESC, "Wysum 3")
field(PINI, "YES")
field(DTYP, "asynFloat64")
field(OUT, "@asyn($(PORT) 2)QE_WEIGHT_YSUM")
field(VAL, "1.0")
field(PREC, "3")
}

record(ao,"$(P)$(R)WeightYsum4") {
field(DESC, "Wysum 4")
field(PINI, "YES")
field(DTYP, "asynFloat64")
field(OUT, "@asyn($(PORT) 3)QE_WEIGHT_YSUM")
field(VAL, "1.0")
field(PREC, "3")
}

record(ao,"$(P)$(R)WeightXdelta1") {
field(DESC, "Wxdelta 1")
field(PINI, "YES")
field(DTYP, "asynFloat64")
field(OUT, "@asyn($(PORT) 0)QE_WEIGHT_XDELTA")
field(VAL, "1.0")
field(PREC, "3")
field(PREC, "3")
}

record(ao,"$(P)$(R)WeightXdelta2") {
field(DESC, "Wxdelta 2")
field(PINI, "YES")
field(DTYP, "asynFloat64")
field(OUT, "@asyn($(PORT) 1)QE_WEIGHT_XDELTA")
field(VAL, "1.0")
field(PREC, "3")
}

record(ao,"$(P)$(R)WeightXdelta3") {
field(DESC, "Wxdelta 3")
field(PINI, "YES")
field(DTYP, "asynFloat64")
field(OUT, "@asyn($(PORT) 2)QE_WEIGHT_XDELTA")
field(VAL, "1.0")
field(PREC, "3")
}

record(ao,"$(P)$(R)WeightXdelta4") {
field(DESC, "Wxdelta 4")
field(PINI, "YES")
field(DTYP, "asynFloat64")
field(OUT, "@asyn($(PORT) 3)QE_WEIGHT_XDELTA")
field(VAL, "1.0")
field(PREC, "3")
}

record(ao,"$(P)$(R)WeightYdelta1") {
field(DESC, "Wydelta 1")
field(PINI, "YES")
field(DTYP, "asynFloat64")
field(OUT, "@asyn($(PORT) 0)QE_WEIGHT_YDELTA")
field(VAL, "1.0")
field(PREC, "3")
}

record(ao,"$(P)$(R)WeightYdelta2") {
field(DESC, "Wydelta 2")
field(PINI, "YES")
field(DTYP, "asynFloat64")
field(OUT, "@asyn($(PORT) 1)QE_WEIGHT_YDELTA")
field(VAL, "1.0")
field(PREC, "3")
}

record(ao,"$(P)$(R)WeightYdelta3") {
field(DESC, "Wydelta 3")
field(PINI, "YES")
field(DTYP, "asynFloat64")
field(OUT, "@asyn($(PORT) 2)QE_WEIGHT_YDELTA")
field(VAL, "1.0")
field(PREC, "3")
}

record(ao,"$(P)$(R)WeightYdelta4") {
field(DESC, "Wydelta 4")
field(PINI, "YES")
field(DTYP, "asynFloat64")
field(OUT, "@asyn($(PORT) 3)QE_WEIGHT_YDELTA")
field(VAL, "1.0")
field(PREC, "3")
}
record(mbbo,"$(P)$(R)PositionPrecX") {
field(DESC, "Precision")
field(OUT, "$(P)$(R)PositionPrecFanoutX PP")
Expand Down
Loading