Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
% we'll read evr data from the first calib cycle of a tutorial file:
evrData = h5read('/reg/d/psdm/xpp/xpptut13/hdf5/xpptut13-r0179.h5','/Configure:0000/Run:0000/CalibCycle:0000/EvrData::DataV3/NoDetector.0:Evr.0/data');

% evrData is a struct with one element - fifoEvents. fifoEvents is a cell array with one entry per event in the CalibCycle
fifoEvents = evrData.fifoEvents;
numberOfEvents = length(fifoEvents);
% numberOfEvents is 483

% let's identify the smallest and largest event code codes in this calib cycle
minEventCode=99999;
maxEventCode=0;
for eventIdx = 1:numEventsnumOfEvents; maxEventCode = max(maxEventCode, max(fifoEvents{eventIdx}.eventCode)); end;
for eventIdx = 1:numEventsnumOfEvents; minEventCode = min(minEventCode, min(fifoEvents{eventIdx}.eventCode)); end;
assert(minEventCode>0, 'unexpected - minimum event code should be greater than 0. matlab uses 1-up array indexing, 0 will not work with below code');

% lets fill out a flat Array, each row is an event, and column k is 1 only if eventCode k occurred in that event
eventCodesFlat = int8(zeros(numberOfEvents, maxEventCode));
for i=1:numberOfEvents; eventCode = fifoEvents{i}.eventCode; for ec=eventCode; eventCodesFlat(i,ec)=1; end; end;

% here is an example of how you might work with the flat array
numberOfEventsWithEventCode42 = sum(eventCodesFlat(:,42));
% there are 121 events with event code 42
% lets say we want to average over the cspad data for just those 121 events. 
% The below code is easy to write, although it uses quite a bit of memory:

cspad = h5read('/reg/d/psdm/xpp/xpptut13/hdf5/xpptut13-r0179.h5','/Configure:0000/Run:0000/CalibCycle:0000/CsPad::ElementV2/XppGon.0:Cspad.0/data');
% That reads in 2GB - 483 events * 2 bytes per element * 32 * 185 * 388.
% cspad's size is 388   185    32   483

eventsWith42 = eventCodesFlat(:,42)==1;
assert(length(eventsWith42)==length(cspad), 'number of events with cspad != number of events with evr data, even if equal, should do more and check that all entries in time datasets are the same');
 cspadEventCode42 = cspad(:,:,:,eventsWith42);
% size(cspadEventCode42) returns  388   185    32   121

cspadAverageEventCode42 = mean(cspadEventCode42,4);

...