You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 25 Next »

This page provides an overview of the status and inner workings of the TES Readout development and eventual implementation.

Description of TES

 

TESMap.pdf

 

Error rendering macro 'viewpdf'

com.atlassian.confluence.macro.MacroExecutionException: com.atlassian.confluence.macro.MacroExecutionException: The viewfile macro is unable to locate the attachment "TESMap.pdf" on this page

 

PseudoCode

 

This is a proposed algorithm to handle the data produced by the TES detectors for LCLS-II.

 

The data is assumed to consist of several time streams per FPGA (250) sampled at 1 MHz. The beam repetition rate is 10 kHz, for a total of 100 samples minimum between valid (photon generated) events. The samples are assumed to be 16 bits.

Parfor : Parallel For

NumberOfChannels : number of channels to be handles by the FPGA

Samples per Window : Number of samples in a single pulse window

TotalNumberOfWindows : Maximum number of windows to be kept in memory for the configured filters. Currently only 3 for a total of four cases. The active window, the preceding one and the following one. Possibly more windows to be added before/after for more precision in the energy measurement.

Active Window : Window on which we are performing the filter calculation

Current Window : Window that is currently loading in buffers.

EventMatrix : Matrix containgin information about the presence of events in each window of each channel.

 

TES Algorithm
CreateCircularBuffers (NumberOfChannels,
SamplesPerWindow, TotalNumberOfWindows)
LoadFilters()
ConfigureDataChannel()

While IncomingData:
            LoadDatainBuffers()
            ApplyCrosstalkCorrection(All_Channels,CurrentWindow)

            EventMatrix = TagEvents(All_Channels)

	For each ActiveWindow : 
            WindowIncrement=+1
				Parfor each Channel:            
                	Switch (CheckEvents(EventMatrix)):
						Case No Event Before And After
						Energy = ApplyFilter(Filter00)
						Case Event Before And After
						Energy = ApplyFilter(Filter11)

						Case Event Before Only
						Energy = ApplyFilter(Filter10)

						Case Event After Only
						Energy = ApplyFilter(Filter00)


            SaveEnergyAndTimestamp(xtcFile)


		If WindowIncrement == SaveIncrement
			SaveWaveformtoXTC(xtcFile, TotalTimeWindow, AllChannels)


 


Def TagEvents:
	Parfor each channel : 
		If Slope > MinimumSlope:
			CurrentWindowEvent=True
		Else:
			CurrentWindowEvent=False
	
		EventMatrix(channel, currentWindowIndex) = CurrentWindowEvent
	Return EventMatrix

Def ApplyFilter(Filter):
	For each i, sample :
		Temp = linearFunction(sample) * sample 
		sum1 = temp* Filter(i) 
		sum2 = sample*Filter2(i) %More filters added if necessary
		Energy = sum1+sum2

 

 

 

Benchmarks

This table lists the latest benchmarks.

Currently, it evaluates the average time (over 1e6 iterations) to complete the number of products indicated as well as the sum of the resulting vector. The length of the vector varies according to the number of samples.

For a fixed number of samples, the code uses if statements to directly indicates how many filters to use. For the code using the binary decision tree, the number of filters is passed as a prepocessor argument. Once we know how many filters are necessary this will become a fixed value. 

These benchmarks were obtained os psanagpu116, using O3 and vectored optimization. As a reference, 10 kHz operation gives a time window of 100 µs.

Compile flags
g++ -std=c++11 -O3 -DNDEBUG -march=native -IEigen main.cpp

 

All values are in μs.

Number of products

Number of samples

12345
1000.0610.0740.0910.108 
2000.1130.1450.1760.210 
3000.1500.1900.2410.296 
4000.2000.2660.3290.397 
5000.2390.3210.4020.486 
6000.2790.3780.4760.576 
7000.3180.4350.5490.667 
Decision tree0.0920.1170.1380.1610.203

 

Latest code :

Latest integration iteration (Working copy)

11/7/2018 The current code is functional and creates random data, selects a case and runs the inner products on a self-renewing stream. It currently integrates Eigen u_int arrays in ring buffers with Eigen float arrays for filters  with the switch case strategy to distinguish between the 6 filter cases. However it suffers from slower than expected performance which has been partially fixed and the other part is still being tracked down. It seems to be slow loop behavior however the instruction causing the loop to hang is eluding me...

 

Original codes before combinations.

Code with Eigen (Audrey)

Code with switch case (Clemens)

References

Ullom and Bennet. Review of superconducting transition sensors for X-ray and gamma-ray spectroscopy

Irwin and Hilton. Transition-edge sensors.

 

Tasks

TaskStatusComment
Create fake data vectorsNOT STARTEDUsing random number vectors
Implement event detection algorithmNOT STARTED 
Program arguments for benchmarkingDONE

Arguments for the size of the vectors and the number of array products used

Preprocessor arguments

Decision tree for event casesDONESwitch case tree for given number of filters - reusable for different cases
Input data from simulationNOT STARTED 
Create circular bufferNOT STARTED 
   
  • No labels