| ID |
Date |
Author |
Topic |
Subject |
|
3157
|
27 Nov 2025 |
Stefan Ritt | Suggestion | Improve process for adding new variables that can be shown in history plots | > 1) history is independent from "runs", we see a change, we apply it (even if it takes 10 sec or 2 minutes).
>
> 2) "nothing should change during a run", we must process all changes before we start a run (starting a run takes forever),
> and we must ignore changes during a run (i.e. updated frontend starts to write new data to history). (this is why
> the trick to "start a new run twice" used to work).
"nothing should change during a run" violates the action when a user adds a new variable during a run. So if the user does that, they don't
care if things change during a run. Then we can also modify the history DB during the run. Note that some MIDAS installations are purely
slow control (kind of a replacement of LabView, have no runs at all). In those installations runs do not make sense at all, so keeping the
history independent of runs makes sense to me.
> It is "free" to rescan ODB every 10 second or so. Then we can output a midas message "please restart the logger",
> and set an ODB flag, then when user opens the history panel editor, it will see this flag
> and tell the user "please restart the logger to see the latest changes in history". It can even list
> the specific changes, if we want ot be verbose about it.
Sounds good to me.
> I say, let's take the low road for now and see if it's good enough:
>
> a) have the history system report any changes in midas.log - "history event added", "new history variable added" (or "renamed"),
> this will let user see that their changes to the equipment frontend "took" and flag any accidental/unwanted changes.
>
> b) have mlogger periodically scan ODB and set a "please restart me" flag. observe this flag in the history editor
> and tell the user "please restart the logger to see latest changes in the history".
Actually you don't have to actively "scan" the ODB. You have hotlinks to the logger anyway from the equipment variables. All we need
in addition is a hotline to the settings array in the ODB. The logger receives the hotline update, checks if the names changed or got
extended, then flags this as a change.
Stefan |
|
3158
|
27 Nov 2025 |
Stefan Ritt | Suggestion | mvodb WS and family type matching | > 2) "advanced" c++ code:
>
> void foo(const std::string& xxx) { ... };
> int main() { foo("bar"); }
>
> copy-created 2nd string is avoided, but string object to hold "bar" is still must be
> made, 1 malloc(), 1 memcpy().
Are you sure about this? I always thought that foo only receives a pointer to xxx which it puts on the stack, so
no additional malloc/free is involved.
Have a look here: https://en.cppreference.com/w/cpp/language/reference.html
It says "References are not objects; they do not necessarily occupy storage".
Stefan |
|
3159
|
28 Nov 2025 |
Konstantin Olchanski | Suggestion | mvodb WS and family type matching | > > 2) "advanced" c++ code:
> >
> > void foo(const std::string& xxx) { ... };
> > int main() { foo("bar"); }
> >
> > copy-created 2nd string is avoided, but string object to hold "bar" is still must be
> > made, 1 malloc(), 1 memcpy().
>
> Are you sure about this? I always thought that foo only receives a pointer to xxx which it puts on the stack, so
> no additional malloc/free is involved.
Yes, "bar" is not an std::string, cannot be used to call foo(), and the c++ compiler has to automagically rewrite
the function call
from: int main() { foo("bar"); }
to: int main() { foo(std::string("bar"); }
the temporary std::string object may be on the stack, but storage for text "bar" is on the heap (unless std::string
is optimized to store short strings internally).
one can put a printf() inside foo() to print the address of xxx (should be on the stack) and xxx.c_str() (should be
on the heap). one could also try to print the address of "bar" (should be in the read-only-constant-strings memory
area). (I am not sure if compiler-linker combines all instances of "bar" into one, this is also easy to check).
K.O. |
|
3160
|
28 Nov 2025 |
Konstantin Olchanski | Suggestion | mvodb WS and family type matching | Just in time, enter std::string_view.
https://stackoverflow.com/questions/40127965/how-exactly-is-stdstring-view-faster-than-const-stdstring
I was looking at https://root.cern/doc/v638/classROOT_1_1Experimental_1_1RFile.html and they use it everywhere instead of
std::string and const char*.
(so now we have 4 string types to deal with, counting ROOT's TString).
P.S. For extra safety, this code compiles, then explodes:
std::string_view get_temporary_string() {
std::string s = "temporary";
return s; // DANGER! 's' is destroyed, view dangles.
}
K.O. |
|
3166
|
03 Dec 2025 |
Konstantin Olchanski | Suggestion | Improve process for adding new variables that can be shown in history plots | > 3b) mlogger used to rescan ODB each time a new run is started, this code was removed
One more kink turned out.
One of the computers ran out of disk space, mlogger dutifully recorded the "disk full" errors to midas.log and
disabling writing to history (all history variables).
This was only noticed about one week later (it is not a busy computer).
In the past, when mlogger reopened the history at each begin of run, the "disk full" errors would have shown
up in midas.log and somebody would have noticed. Or the problem would have gone away if disk space was cleared
up.
Now, mlogger just silently continues not writing to history. There is no ongoing error message, there is no
ongoing alarm, only sign of trouble is empty history plots and history files not growing.
Perhaps we should add an mlogger action to ask the history, "are you ok?" and report in midas.log or alarm if
history is not happy.
Or have mlogger at the begin of run automatically reenable all disabled history variables. If these variables
are still unhappy (error writing to disk or to mysql), there will be an error message in midas.log (and
automatic self-disable).
All these solutions should be okey as long as they do not touch disk storage and so do not cause any long
delay in run start.
K.O. |
|
3167
|
03 Dec 2025 |
Stefan Ritt | Suggestion | Improve process for adding new variables that can be shown in history plots | > Now, mlogger just silently continues not writing to history. There is no ongoing error message, there is no
> ongoing alarm, only sign of trouble is empty history plots and history files not growing.
I would recommend to use an "internal alarm". This is not an "ODB alarm" where values are compared limits, but it is directly triggered by C code. To do
so, call
if (disk_full)
al_trigger-alarm("Disk full", "Disk full, no history will be written", "Alarm", "Disk full", AT_INTERNAL);
This will cause an alarm to show up prominently on the status page and beep every few minutes.
Stefan |
|
3171
|
07 Dec 2025 |
Konstantin Olchanski | Suggestion | Get manalyzer to configure midas::odb when running offline | > #include "manalyzer.h"
> #include "midasio.h"
> +#include "odbxx.h"
This commit broke the standalone ("no MIDAS") build of manalyzer. Either odbxx has to be an independant package
(like mvodb) or it has to be conditioned on HAVE_MIDAS.
(this was flagged by failed bitbucket build of rootana)
K.O. |
|
3174
|
08 Dec 2025 |
Konstantin Olchanski | Suggestion | Get manalyzer to configure midas::odb when running offline | > > #include "manalyzer.h"
> > #include "midasio.h"
> > +#include "odbxx.h"
>
> This commit broke the standalone ("no MIDAS") build of manalyzer. Either odbxx has to be an independant package
> (like mvodb) or it has to be conditioned on HAVE_MIDAS.
>
> (this was flagged by failed bitbucket build of rootana)
Corrected. You can only use odbxx is manalyzer is built with HAVE_MIDAS. (mvodb is an independant package and is
always available, no need to pull and build the full MIDAS).
Also notice how I now initialize odbxx from fBorOdbDump and fEorOdbDump. Also tested against multithreaded access, it
works (as Stefan promised).
K.O. |
|
3175
|
08 Dec 2025 |
Konstantin Olchanski | Suggestion | manalyzer root output file with custom filename including run number | I updated the root helper constructor to give the user more control over ROOT output file names.
You can now change it to anything you want in the module run constructor, see manalyzer_example_esoteric.cxx
Is this good enough?
struct ExampleE1: public TARunObject
{
ExampleE1(TARunInfo* runinfo)
: TARunObject(runinfo)
{
#ifdef HAVE_ROOT
if (runinfo->fRoot)
runinfo->fRoot->fOutputFileName = "my_custom_file_name.root";
#endif
}
}
K.O. |
|
293
|
12 Aug 2006 |
Pierre-André Amaudruz | Release | Midas updates | Midas development:
Over the last 2 weeks (Jul26-Aug09), Stefan Ritt has been at Triumf for the "becoming" traditional Midas development 'brainstorming/hackathon' (every second year).
A list with action items has been setup combining the known problems and the wish list from several Midas users.
The online documentation has been updated to reflect the modifications.
Not all the points have been covered, as more points were added daily but the main issues that have been dealt or at least discussed are:
- ODB over Frontend precedence.
When starting a FE client, the equipment settings are taken from the ODB if this equipment already existed. This meant the ODB has precedence over the EQUIPEMENT structure and whatever change you apply to the C-Structure, it will NOT be taken in consideration until you clean (remove) the equipment tree in ODB.
- Revived 64 bit support. This was required as more OS are already supporting such architecture. Originally Midas did support Alpha/OSF/1 which operated on 64 bit machine. This new code has been tested on SL4.2 with Dual-Core 64-bit AMD Opterons.
- Multi-threading in Slow Control equipments.
Check entry 289 in Midas Elog from Stefan.
- mhttpd using external Elog.
The standalone ELOG package can be coupled to an existing experiment and therefore supersede the internal elog functionality from mhttpd.
This requires a particular configuration which is described in the documentation.
- MySQL test in mlogger
A reminder that mlogger can generate entries in a MySQL database as long as the pre-compilation flag -HAVE_MYSQL is enabled during system built. The access and form filling is then defined from the ODB under Logger/SQL once the logger is running, see documentation.
- Directory destination for midas.log and odb dump files
It is now possible to specify an individual directory to the default midas.log file as well as to the "ODB Dump file" destination. If either of these fields contains a preceding directory, it will take the string as an absolute path to the file.
- User defined "event Data buffer size" (ODB)
The event buffer size has been until now defined at the system level in midas.h. It is now possible to optimize the memory allocation specific to the event buffer with an entry in the ODB under /experiment, see documentation.
- History group display
It is now possible to display an individual group of history plots. No documentation on that topics as it should be self explanatory.
- History export option
From the History web page, it is possible to export to a ASCII .csv file the history content. This file can later be imported into excel for example. No documentation on that topics as it should be self explanatory.
- Multiple "minor" corrections:
- Alarm reset for multiple experiment (return directly to the experiment).
- mdump -b option bug fixed.
- Alarm evaluation function fixed.
- mlogger/SQL boolean handling fixed.
- bm_get_buffer_level() was returning a wrong value which has been fixed now.
- Event buffer bug traced and exterminated (Thanks to Konstantin).
|
|
666
|
30 Oct 2009 |
Konstantin Olchanski | Release | new lazylogger release | I committed an updated lazylogger with updated documentation. The new version supports subruns and
can save to external storage arbitrary files (i.e. odb dump files). It also moves most book keeping out of
odb to permit handling more files on bigger storage disks.
Example lazylogger scripts for castor (CERN) and dcache (TRIUMF) are in the directory "utils".
The lazylogger documentation was updated to remove obsolete information and to describe the new
functions. As usual "make dox; cd doxfiles/html; firefox index.html" or see my copy at:
http://ladd00.triumf.ca/~olchansk/midas/Utilities.html#lazylogger_task
svn rev 4615, 4616.
K.O. |
|
731
|
12 Nov 2010 |
Pierre-Andre Amaudruz | Release | Documentation | The general Midas documentation has been rejuvenated by Suzannah Daviel through
a proof reading and with a collection of custom perl scripts to improve the
Doxygen capabilities for the document itself. In particular, a contents list and
alphabetical index of the documentation is generated automatically.
The new content is based on the previous version but with more cross-references,
examples and descriptive images where necessary. Many of the previously
undocumented features are now included.
The layout and organization is slightly different and requires getting used to,
but hopefully will be an improvement.
Some of the changes are:
- The main topics are maintained, but we try to regroup all the aspects
related to a particular topic in the same section.
- The Yellow icons provide navigation within the index section.
- The Blue icons provide navigation within the section content.
The full documentation is included under the midas/doc/src directory in the
Midas distribution (SVN) and can be generated with the Doxygen tool.
The midasdoc-images.tar.gz from either https://midas.psi.ch/download/ or
http://ladd00.triumf.ca/~daqweb/ftp/ needs to be extracted to the midas
directory under doc/images for complete local web pages generation.
There are a few "ToDo" items which hopefully will be ironed out soon.
Feel free to contact us for pointing out omissions or improvements.
We hope this online documentation will serve as a better tool for your
understanding of the Midas capabilities. |
|
1148
|
30 Nov 2015 |
Konstantin Olchanski | Release | Final MIDAS JSON-RPC API | The final bits of the JSON-RPC API to MIDAS are committed. The API uses the Javascript Promise mechanism (supported on all
supported platforms - MacOS, Windows, Linux Ubuntu, el5, el6, el7).
Simple example for pasting the current run number into an html element:
mjsonrpc_db_get_values(["/runinfo/run number"]).then(function(rpc) {
document.getElementById("run_number").innerHTML = rpc.response.data[0];
}).catch(function(error) {
mjsonrpc_error_alert(error);
});
The documentation for the JSON-RPC API, including special quirks in JSON encoding of ODB data is here:
https://midas.triumf.ca/MidasWiki/index.php/Mjsonrpc
Documentation (with examples) for the related Javascript functions in mhttpd.js is here (via Doxygen):
https://daq.triumf.ca/~daqweb/doc/midas-devel/html/group__mjsonrpc__js.html
Examples of using all mhttpd.js functions is in .../examples/javascript1/example.html
The experimental git branch feature/mhttpd_js implements the MIDAS "programs" page purely in html and javascript,
go there to see all this new JSON and RPC stuff in action. See .../resources/programs.html.
K.O. |
|
1149
|
02 Dec 2015 |
Konstantin Olchanski | Release | Final MIDAS JSON-RPC API | > The final bits of the JSON-RPC API to MIDAS are committed.
Here is example conversion of the function "generate midas message" from old-style AJAX to JSON-RPC:
before (mhttpd.cxx):
/* process "jgenmsg" command */
if (equal_ustring(getparam("cmd"), "jgenmsg")) {
if (getparam("facility") && *getparam("facility"))
strlcpy(facility, getparam("facility"), sizeof(facility));
else
strlcpy(facility, "midas", sizeof(facility));
if (getparam("user") && *getparam("user"))
strlcpy(user, getparam("user"), sizeof(user));
else
strlcpy(user, "javascript_commands", sizeof(user));
if (getparam("type") && *getparam("type"))
type = atoi(getparam("type"));
else
type = MT_INFO;
if (getparam("msg") && *getparam("msg")) {
cm_msg1(type, __FILE__, __LINE__, facility, user, "%s", getparam("msg"));
}
show_text_header();
rsputs("Message successfully created\n");
return;
}
after: (mjsonrpc.cxx)
static MJsonNode* js_cm_msg1(const MJsonNode* params)
{
if (!params) {
MJSO *doc = MJSO::I();
doc->D("Generate a midas message using cm_msg1()");
doc->P("facility?", MJSON_STRING, "message facility, default is \"midas\"");
doc->P("user?", MJSON_STRING, "message user, default is \"javascript_commands\"");
doc->P("type?", MJSON_INT, "message type, MT_xxx from midas.h, default is MT_INFO");
doc->P("message", MJSON_STRING, "message text");
doc->R("status", MJSON_INT, "return status of cm_msg1()");
return doc;
}
MJsonNode* error = NULL;
const char* facility = mjsonrpc_get_param(params, "facility", &error)->GetString().c_str();
const char* user = mjsonrpc_get_param(params, "user", &error)->GetString().c_str();
int type = mjsonrpc_get_param(params, "type", &error)->GetInt();
const char* message = mjsonrpc_get_param(params, "message", &error)->GetString().c_str(); if (error) return error;
if (strlen(facility)<1)
facility = "midas";
if (strlen(user)<1)
user = "javascript_commands";
if (type == 0)
type = MT_INFO;
int status = cm_msg1(type, __FILE__, __LINE__, facility, user, "%s", message);
return mjsonrpc_make_result("status", MJsonNode::MakeInt(status));
}
With the corresponding javascript-side stabs:
before:
function ODBGenerateMsg(type,facility,user,msg)
{
var request = XMLHttpRequestGeneric();
var url = ODBUrlBase + '?cmd=jgenmsg';
url += '&type='+type;
url += '&facility='+facility;
url += '&user='+user;
url += '&msg=' + encodeURIComponent(msg);
request.open('GET', url, false);
request.send(null);
return request.responseText;
}
after:
function mjsonrpc_cm_msg(message, type, id) {
/// \ingroup mjsonrpc_js
/// Get values of ODB variables
///
/// RPC method: "cm_msg1"
///
/// \code
/// mjsonrpc_cm_msg("this is a new message").then(function(rpc) {
/// var req = rpc.request; // reference to the rpc request
/// var id = rpc.id; // rpc response id (should be same as req.id)
/// var status = rpc.result.status; // return status of MIDAS cm_msg1()
/// ...
/// }).catch(function(error) {
/// mjsonrpc_error_alert(error);
/// });
/// \endcode
/// @param[in] message Text of midas message (string)
/// @param[in] type optional message type, one of MT_xxx. Default is MT_INFO (integer)
/// @param[in] id optional request id (see JSON-RPC specs) (object)
/// @returns new Promise
///
var req = new Object();
req.message = message;
if (type)
req.type = type;
return mjsonrpc_call("cm_msg1", req, id);
}
K.O |
|
1156
|
28 Jan 2016 |
Konstantin Olchanski | Release | Final MIDAS JSON-RPC API | > > The final bits of the JSON-RPC API to MIDAS are committed.
JSON-RPC methods are now provided for all old ODBxxx() javascript functions, except ODBGetMsg().
The currently present RPC methods are sufficient to write the MIDAS "programs" and "alarms" pages
purely in HTML+Javascript (see the git branch feature/mhttpd_js). These pages can be served i.e. by apache httpd
with midas mhttpd only required to service the RPC requests.
Please see .../examples/javascript1/example.html on how to use the new RPC methods.
K.O.
P.S. Note how many examples use the generic mjsonrpc_call() because I did not write the corresponding
javascript functions - I wore out the cut-and-paste button on my keyboard. All are welcome to contribute
the missing functions, post them here or email them to me, I will commit them to midas git. |
|
1189
|
08 Aug 2016 |
Konstantin Olchanski | Release | Merged - new pure html web pages: programs and alarms. | The code for the new pure html and javascript web pages was merged into main midas.
In this release, the "programs" and "alarms" pages are implemented as html files, see
resources/programs.html and alarms.html.
Eventually we hope to implement all midas web pages in html, so this is just a start.
If you see problems with the new html code, you can revert to the old mhttpd-generated web
pages by removing the files programs.html and alarms.html.
The new code for starting and stopping runs (start.html and transition.html) is also merged, but not
yet enabled, pending a few more tests.
K.O. |
|
1329
|
21 Nov 2017 |
Konstantin Olchanski | Release | Pending release of midas | We are readying a new release of midas and it is almost here except for a few buglets on the new html status page.
The current release candidate branch is "feature/midas-2017-10" and if you have problems with the older versions
of midas, I recommend that you try this release candidate to check if your problem is already fixed. If the problem
still exists, please file a bug report on this forum or on the bitbucket issue tracker
https://bitbucket.org/tmidas/midas/issues?status=new&status=open
Highlights of the new release include
- new and improved web pages done in html and javascript
- many bug fixes and improvements for json and json-rpc support, including improvements in handling of long strings in odb
- locked (protected) operation of odb, where odb shared memory is not writable outside of odb operations
- improved multithead support for odb
- fixes for odb corruption when odb becomes 100% full
For the next release we hope to switch midas from C to fully C++ (building everything with C++ already works). To support el6 we avoid use of
c++11 language constructs.
K.O. |
|
1513
|
28 Mar 2019 |
Konstantin Olchanski | Release | midas-2019-03-f | the midas release 2019-03 is ready for general use.
main changes from previous releases (midas-2017-10, midas-2018-12 and midas-2019-02):
- change to the midas URL scheme
- removal of cm_watchdog()
- rewrite of event buffer code (and fix of hard to trigger event buffer corruption bug)
- fully thread safe odb and event buffer code (except for rpc_send_event())
- corrected compatibility problems wrt older versions of midas when serving custom web pages via odb /custom/path
To obtain this release, either checkout the top of branch feature/midas-2019-03 (recommended)
or checkout the tag midas-2019-03-f.
K.O. |
|
1530
|
22 May 2019 |
Konstantin Olchanski | Release | midas-2019-03-g | > the midas release 2019-03 is ready for general use.
first ever bug fix release on a git release branch.
fixed a crash if frontend built against this midas is connected to mserver from old (pre-db_watch) midas (size mismatch of MSG_ODB
message).
to use this update:
# recommended:
git pull
git checkout feature/midas-2019-03
git pull
make ...
# or checkout "detached HEAD"
git pull
git checkout midas-2019-03-g
make ...
odbedit "ver" should report:
GIT revision: Wed May 22 07:35:11 2019 -0700 - midas-2019-03-g on branch feature/midas-2019-03
K.O.
P.S. Thanks for finding this bug go to Greg Hackman on TIGRESS and EMMA experiments at TRIUMF.
K.O. |
|
1543
|
06 Jun 2019 |
Konstantin Olchanski | Release | midas-2019-03-h | > > the midas release 2019-03 is ready for general use.
A bug fix update for midas-2019-03:
- fix broken expand_env() in mhttpd
- fix "Invalid name passed to db_create_key: should not be an empty string" in midas.log when loading the MIDAS status page if one of the alarms has empty
class name.
odbedit "ver" should report: Thu Jun 6 18:02:14 2019 -0700 - midas-2019-03-h on branch feature/midas-2019-03
K.O. |
|