Sgutil
SGLIB/SGUTIL package contains Dave Haddle's noise reduction software with segment finding extensions. It resides in $CODA/src/codatt/sgutil.c and is called from $CLON/src/cmon/prlib/sglib.c.
SGLIB contains following functions:
- sginit() - must be called once at initialization stage; creates differencial shift table and fills lookup tables
- sgtrigger() - works for specified sector; return 0 if sector does not have required track information, otherwise returns the number of superlayers with segments; calls function RemoveNoise() from SGUTIL
- sgremovenoise() - works for specified sector; rewrites all DC banks removing single hits; calls function RemoveNoise() from SGUTIL
- sglib() - find segments for one sector; three options can be specified: noise removing only, segment finding only, noise removing and then segment finding; calls functions RemoveNoise(), SegmentSearch128() and SegmentSearch192() from SGUTIL
- sgprint() - print results for one sector
- sgroad() - fill road finding structures, SWAPING region 1
SGUTIL contains following functions:
- BinaryPrint32(), PrintWord192(), CopyWord192(), ANDWord192(), ORWord192(), XORWord192(), CheckBitWord192(), SetBitWord192(), ClearWord192(), NegateWord192(), BleedRightWord192(), BleedLeftWord192() - functions for 192-bit words operations
- RightShiftWord192(), LeftShiftWord192(), RIGHTSHIFT(), RightShiftWord192_00(), RightShiftWord192_01(), RightShiftWord192_02(), RightShiftWord192_03(), LEFTSHIFT(), LeftShiftWord192_00(), LeftShiftWord192_01(), LeftShiftWord192_02(), LeftShiftWord192_03() - macroses for 192-bit words operations
- RemoveNoise() - works for one superlayer, removes single hits; it is very much the same as original Dave's program, with some optimization; it returns 0 if nothing left after single hits removing, or 1 otherwise
- SuperLayerSum() - used by RemoveNoise() only; does fast summing of the 6 192-bit words following algorithm suggested by Pavel Degtiarenko; output is the 192-bit word where every bit contains result of the summing of the corresponding 6-bit vertical column
ALGORITHMS DESCRIPTION
192-bit words were summed using binary numbers adding procedure. As it was suggested by Pavel Degtyarenko, simple adder was implemented, and following adding procedure was used to get a sum of 6 192-bit words representing 6 layers of the Drift Chamber superlayer. This method was used in SuperLayerSum/RemoveNoise procedure to found areas with segments, and in the first stage of SegmentSearch192 procedure.
SegmentSearch192 searches for segments in 3 steps. On the first step shift-and-sum operation is performed separately for axial and stereo superlayers. Results are stored in 3 192-bit words, where vertical 3-bit columns contains the number of hits. Using lookup tables those numbers are converted into integers to be used on following step.
On second step one of the superlayers is shifted against another one, search is conducted for the region-based segments, and list of segment candidates is produced.
On the third step segment list is processed to select the segment with the maximum number of hits, and final list of segments is created.
SegmentSearch192 calls 4 macros:
TWOSLPROCESS(192):
- input: superlayer data in a form of 6 192-bit words (layers); dshift table
- action: loop over NSHIFT shifts, shifting layers in according to dshift table, binary summing 6 layers, store results in 3 192-bit words, convert bit sums to integer sums using '3 layers 4 bits' lookup table method
- output: char tmp1[NSHIFT][192] (superlayer1) and char tmp2[NSHIFT][192] (superlayer2) - the number of hits for every wire and every shift
REGIONPROCESS(192):
- input: tmp1[NSHIFT][192] and tmp2[NSHIFT][192] from previous macro
- action: loop over NSHIFT shifts, nested loop over superlayer-to-superlayer shift
- output: list of region-based segments:
PEAKSEARCH(192):
SEGMENTLIST(192):
NIM paper draft
Described approach was used to search for the track segments. The segment finding process can be explained using data sample shown on fig.1. Drift chamber consists of 3 regions, each contains axial and stereo superlayers. Track segment inside the region can be considered as straight line, so program is looking for the segments with the same slope in both superlayers. Such segments can be spaced few wires from each other due to the phi angle of the track, which creates another degree of freedom.
Noise removing is usually running first to cleanup data as much as possible. Red color hits on fig.1 will be removed at that point.
Segment search is conducted in 3 steps. On the first step shift-and-sum operation is performed separately for axial and stereo superlayers for the set of shift patterns representing different track segment angles from +30 to -30 degrees approximately. In our example (as it shown on fig.2) shift pattern was (0,0,1,1,1) for layers 2 through 6, which means layers 4,5 and 6 were shifted one step to the left. After every shift,192-bit words were summed using binary numbers adding procedure as it was suggested by Pavel Degtyarenko (fig.3). Results are stored in 3 192-bit words, where vertical 3-bit columns contains the number of hits in binary format. Using 3x8 lookup tables those numbers are converted into integers to be used on following step (fig.2).
192-bit words were summed using binary numbers adding procedure. As it was suggested by Pavel Degtyarenko, simple adder was implemented, and following adding procedure was used to get a sum of 6 192-bit words representing 6 layers of the Drift Chamber superlayer. This method was used in SuperLayerSum/RemoveNoise procedure to found areas with segments, and in the first stage of SegmentSearch192 procedure.
On second step one of the superlayers is shifted against another one, search is conducted for the region-based segments, and list of segment candidates is produced.
On the third step segment list is processed to select the segment with the maximum number of hits, and final list of segments is created.