<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:14pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<p><br>
</p>
<meta content="text/html; charset=UTF-8">
<div dir="ltr">
<div id="x_divtagdefaultwrapper" dir="ltr" style="font-size: 14pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, "EmojiFont", "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;">
<p>Dear <span>Hċkan,</span></p>
<p><span><br>
</span></p>
<p><span>thank you. This explanation makes some sense.</span></p>
<p><span><br>
</span></p>
<p><span>Could you also explain the concept of "shadow module". What is it good for?</span></p>
<p><span><br>
</span></p>
<p><span>Also I would like to point out that the implementation of readout_dt for the V560 module that we used as a reference looks weird to us:<br>
</span></p>
<p><span><br>
</span></p>
<p><span></span></p>
<div style="color:#cccccc; background-color:#1f1f1f; font-family:Consolas,'Courier New',monospace; font-weight:normal; font-size:14px; line-height:19px; white-space:pre">
<div><span style="color:#4ec9b0">uint32_t</span></div>
<div><span style="color:#dcdcaa">caen_v560_readout_dt</span><span style="color:#cccccc">(</span><span style="color:#569cd6">struct</span><span style="color:#cccccc">
</span><span style="color:#4ec9b0">Crate</span><span style="color:#cccccc"> </span>
<span style="color:#d4d4d4">*</span><span style="color:#9cdcfe">a_crate</span><span style="color:#cccccc">,
</span><span style="color:#569cd6">struct</span><span style="color:#cccccc"> </span>
<span style="color:#4ec9b0">Module</span><span style="color:#cccccc"> </span><span style="color:#d4d4d4">*</span><span style="color:#9cdcfe">a_module</span><span style="color:#cccccc">)</span></div>
<div><span style="color:#cccccc">{</span></div>
<div><span style="color:#cccccc">    (</span><span style="color:#569cd6">void</span><span style="color:#cccccc">)</span><span style="color:#9cdcfe">a_crate</span><span style="color:#cccccc">;</span></div>
<div><span style="color:#cccccc">    </span><span style="color:#569cd6">LOGF</span><span style="color:#cccccc">(spam)(</span><span style="color:#569cd6">LOGL</span><span style="color:#cccccc">,
</span><span style="color:#569cd6">NAME</span><span style="color:#ce9178">" readout_dt {"</span><span style="color:#cccccc">);</span></div>
<div><span style="color:#cccccc">    </span><span style="color:#9cdcfe">a_module</span><span style="color:#cccccc">-></span><span style="color:#9cdcfe">event_counter</span><span style="color:#cccccc">.</span><span style="color:#9cdcfe">value</span><span style="color:#d4d4d4">++</span><span style="color:#cccccc">;</span></div>
<div><span style="color:#cccccc">    </span><span style="color:#569cd6">LOGF</span><span style="color:#cccccc">(spam)(</span><span style="color:#569cd6">LOGL</span><span style="color:#cccccc">,
</span><span style="color:#569cd6">NAME</span><span style="color:#ce9178">" readout_dt(ctr=0x</span><span style="color:#9cdcfe">%08x</span><span style="color:#ce9178">) }"</span><span style="color:#cccccc">,</span></div>
<div><span style="color:#cccccc">        </span><span style="color:#9cdcfe">a_module</span><span style="color:#cccccc">-></span><span style="color:#9cdcfe">event_counter</span><span style="color:#cccccc">.</span><span style="color:#9cdcfe">value</span><span style="color:#cccccc">);</span></div>
<div><span style="color:#cccccc">    </span><span style="color:#c586c0">return</span><span style="color:#cccccc">
</span><span style="color:#b5cea8">0</span><span style="color:#cccccc">;</span></div>
<div><span style="color:#cccccc">}</span></div>
</div>
<br>
<p></p>
<p><span>Here the counter is incremented every time the module is 'touched' by the readout_dt function. In the loop that starts at line 1240 in crate.c the function readout_dt is executed for the module until the test around line 1270 is passed or the timeout
 around line 1280 happens. Thus an initial mismatch between the (software) counter of module V560 and the crate that prevents the loop from being existed at the first trial will grow steadily as the module is accessed via readout_dt many, many times until it
 runs into the timeout. What is this good for?</span></p>
<p><span><br>
</span></p>
<p><span>To my (current) understanding it is pointless to try to mimic the function of a true hardware counter within the module by a counter that only exists in software. The better way would be to tell crate.c that this module does not have such a counter
 so that the check is pointless. Is this understanding correct? And if yes, how can I tell NURDLIB to skip this check?
<br>
</span></p>
<p><span><br>
</span></p>
<p><span><br>
</span></p>
<p><span><br>
</span></p>
<p><span>Best greetings</span></p>
<p><span>Günter<br>
</span></p>
<p><span><br>
</span></p>
<br>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="x_divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>Von:</b> subexp-daq <subexp-daq-bounces@lists.chalmers.se> im Auftrag von Hċkan T Johansson <f96hajo@chalmers.se><br>
<b>Gesendet:</b> Freitag, 16. Februar 2024 13:25:59<br>
<b>An:</b> Discuss use of Nurdlib, TRLO II, drasi and UCESB.<br>
<b>Betreff:</b> Re: [subexp-daq] Question on COUNTER_DIFF in crate.c</font>
<div> </div>
</div>
</div>
<font size="2"><span style="font-size:10pt">
<div class="PlainText"><br>
Dear Günter,<br>
<br>
I think Hans might have to correct me.<br>
<br>
This is not exactly what this code does, but typically the modules have a <br>
trigger/event counter, which is incremented for each gate/common signal <br>
they receive on the front-panel.<br>
<br>
When the readout is event-by-event, these counters are checked strictly by <br>
nurdlib, in order to detect cabling issues, double-triggers and so on. <br>
This is especially important for modules that have multi-event buffers, <br>
that otherwise easily can become desynchronised.  (It takes of course some <br>
time to read these counters, which contributes to the overall deadtime. <br>
But the amount of times this has 'saved' data-taking by detecting issues <br>
early make it very worthwhile.)<br>
<br>
<br>
What the code you refer to is doing is I think 'abusing' this a bit. <br>
There is typically some time (order of us) between the trigger, and when <br>
the signals have been digitised and the data becomes available.  Often, <br>
those counters are only updated after that is the case.  To me it looks <br>
like this function use the counters (which we anyhow want to check) to <br>
wait for the modules to have finished converting one event.<br>
<br>
<br>
Best regards,<br>
Hċkan<br>
<br>
<br>
<br>
<br>
<br>
On Fri, 16 Feb 2024, Weber, Guenter Dr. wrote:<br>
<br>
> <br>
> Dear friends,<br>
> <br>
> <br>
> we are now trying to add a new module into NURDLIB. At the beginning, we just want to have a 'software version' of the module, so no<br>
> hardware involved yet.<br>
> <br>
> <br>
> We are stuck with the following code in crate.c (line 1262 and following):<br>
> <br>
> <br>
>             diff_module = COUNTER_DIFF(*module->crate_counter,<br>
>                 module->event_counter, module->this_minus_crate);<br>
>             /* TODO: Clean this. */<br>
>             shadow_counter.value =<br>
>                 module->shadow.data_counter_value;<br>
>             shadow_counter.mask = module->event_counter.mask;<br>
>             diff_shadow = COUNTER_DIFF(*module->crate_counter,<br>
>                 shadow_counter, module->this_minus_crate);<br>
> <br>
> <br>
> As we understand, the idea here is to check with a call of readout_dt if the module's internal counter agrees with the counter of the<br>
> crate for the given module. Basicly when the crate thinks it has accessed the module n times, the module should report the same number of<br>
> access attempts. Is this understanding correct?<br>
> <br>
> <br>
> If yes, how exactly should the module increment it's internal counter? If this is done on readout_dt, a mismatch between the crate and the<br>
> internal counter occurs as soon as we stop the aquisition.<br>
> <br>
> <br>
> I can explain in more details, but maybe first you can explain to us what the whole idea behind this check is? To us it looks like also<br>
> the dummy module implementation will have problems with it.<br>
> <br>
> <br>
> <br>
> <br>
> Thank you very much!<br>
> <br>
> <br>
> <br>
> <br>
> Best greetings<br>
> <br>
> Günter<br>
> <br>
> <br>
> <br>
></div>
</span></font></div>
</body>
</html>