ID |
Date |
Author |
Topic |
Subject |
213
|
23 Jul 2019 |
Yusuke Uchiyama | Forum | Change of MIDAS library path | Dear all,
From the recent release of MIDAS, "midas-2019-06", the MIDAS library path is changed:
it was $MIDASSYS/linux/lib, but now $MIDASSYS/lib.
See https://midas.triumf.ca/elog/Midas/1564 for the detail.
Due to this change, ROME analyzers cannot be built with -midas option.
The solution seems easy: change the path in
$ROMESYS/buildersrc/ROMEBuilderMakeFile.cpp AddDAQLibraries().
However, directly changing the code will loose backward compatibility.
Do you have any suggestions?
Regards,
Yusuke |
Draft
|
28 Feb 2018 |
Francesco Renga | Forum | DB path | Dear all,
I need to perform a DB query in ROME, where I have to select an array of |
211
|
29 Nov 2017 |
Ryu Sawada | Info | Compiler warning | Hi.
Thank you for testing.
-U_FORTIFY_SOURCE is fine, and can be implemented in ROME.
Ryu
> Hi Ryu,
>
> Thank you.
> You are right. We add -D_FORTIFY_SOURCE=2 in CFLAGS and CXXFLAGS in our project Makefile.
> If we remove it, the warnings go away.
>
> I tried your suggestion but I got the following warning:
>
> [346/369] compiling obj/MEGAnalyzer3.o
> <command-line>:0:0: warning: "_FORTIFY_SOURCE" redefined [enabled by default]
> <command-line>:0:0: note: this is the location of the previous definition
>
> However, if I add
> '-U_FORTIFY_SOURCE' instead the warning above disappears.
>
> Do you think it is OK for all?
>
> Regards,
> Yusuke
>
> > Hi Yusuke
> >
> > NOOPT is added for potentially large source files to reduce the compile time and memory usage.
> >
> > I guess -D_FORTIFY_SOURCE option is added in your project Makefile or in your environment variable, instead of by
> > ROME.
> > However, we could modify ROME to explicitly disable it by adding -D_FORTIFY_SOURCE=0 to NOOPT.
> > That can be done by modifying builder/src/ROMEBuildMakeFile.cpp line 1348.
> >
> > Could you try to do it ?
> >
> > Ryu
> >
> >
> > > Dear all,
> > >
> > > Under the environment with GCC4.8.5 and ROOT6.08.04,
> > > we get the following warning messages when compiling XXXAnalyzer3, XXXAnalyzer4,
> > > XXXConfig, XXXConfig2,3,4, XXXDBAccess, and XXXConfigToForm.
> > >
> > >
> > > In file included from /usr/include/stdlib.h:24:0,
> > > from /meg/data1/shared/mc/benchmark_test/rome3-root6.08.04-
> > > gcc485/include/ROMEAnalyzer.h:10,
> > > from include/generated/MEGPrecompile.h:23,
> > > from <command-line>:0:
> > > /usr/include/features.h:330:4: warning: #warning _FORTIFY_SOURCE requires compiling
> > > with optimization (-O) [-Wcpp]
> > > # warning _FORTIFY_SOURCE requires compiling with optimization (-O)
> > > ^
> > > [345/369] compiling obj/MEGAnalyzer4.o
> > > In file included from /usr/include/stdlib.h:24:0,
> > > from /meg/data1/shared/mc/benchmark_test/rome3-root6.08.04-
> > > gcc485/include/ROMEAnalyzer.h:10,
> > > from include/generated/MEGPrecompile.h:23,
> > > from <command-line>:0:
> > > /usr/include/features.h:330:4: warning: #warning _FORTIFY_SOURCE requires compiling
> > > with optimization (-O) [-Wcpp]
> > > # warning _FORTIFY_SOURCE requires compiling with optimization (-O)
> > > ^
> > >
> > > It seems due to 'NOOPT' flag added to those objects in the Makefile.
> > > Is the 'NOOPT' flag necessary? If not, how can we remove it?
> > >
> > > Regards,
> > > Yusuke |
210
|
29 Nov 2017 |
Yusuke Uchiyama | Info | Compiler warning | Hi Ryu,
Thank you.
You are right. We add -D_FORTIFY_SOURCE=2 in CFLAGS and CXXFLAGS in our project Makefile.
If we remove it, the warnings go away.
I tried your suggestion but I got the following warning:
[346/369] compiling obj/MEGAnalyzer3.o
<command-line>:0:0: warning: "_FORTIFY_SOURCE" redefined [enabled by default]
<command-line>:0:0: note: this is the location of the previous definition
However, if I add
'-U_FORTIFY_SOURCE' instead the warning above disappears.
Do you think it is OK for all?
Regards,
Yusuke
> Hi Yusuke
>
> NOOPT is added for potentially large source files to reduce the compile time and memory usage.
>
> I guess -D_FORTIFY_SOURCE option is added in your project Makefile or in your environment variable, instead of by
> ROME.
> However, we could modify ROME to explicitly disable it by adding -D_FORTIFY_SOURCE=0 to NOOPT.
> That can be done by modifying builder/src/ROMEBuildMakeFile.cpp line 1348.
>
> Could you try to do it ?
>
> Ryu
>
>
> > Dear all,
> >
> > Under the environment with GCC4.8.5 and ROOT6.08.04,
> > we get the following warning messages when compiling XXXAnalyzer3, XXXAnalyzer4,
> > XXXConfig, XXXConfig2,3,4, XXXDBAccess, and XXXConfigToForm.
> >
> >
> > In file included from /usr/include/stdlib.h:24:0,
> > from /meg/data1/shared/mc/benchmark_test/rome3-root6.08.04-
> > gcc485/include/ROMEAnalyzer.h:10,
> > from include/generated/MEGPrecompile.h:23,
> > from <command-line>:0:
> > /usr/include/features.h:330:4: warning: #warning _FORTIFY_SOURCE requires compiling
> > with optimization (-O) [-Wcpp]
> > # warning _FORTIFY_SOURCE requires compiling with optimization (-O)
> > ^
> > [345/369] compiling obj/MEGAnalyzer4.o
> > In file included from /usr/include/stdlib.h:24:0,
> > from /meg/data1/shared/mc/benchmark_test/rome3-root6.08.04-
> > gcc485/include/ROMEAnalyzer.h:10,
> > from include/generated/MEGPrecompile.h:23,
> > from <command-line>:0:
> > /usr/include/features.h:330:4: warning: #warning _FORTIFY_SOURCE requires compiling
> > with optimization (-O) [-Wcpp]
> > # warning _FORTIFY_SOURCE requires compiling with optimization (-O)
> > ^
> >
> > It seems due to 'NOOPT' flag added to those objects in the Makefile.
> > Is the 'NOOPT' flag necessary? If not, how can we remove it?
> >
> > Regards,
> > Yusuke |
209
|
29 Nov 2017 |
Ryu Sawada | Info | Compiler warning | Hi Yusuke
NOOPT is added for potentially large source files to reduce the compile time and memory usage.
I guess -D_FORTIFY_SOURCE option is added in your project Makefile or in your environment variable, instead of by
ROME.
However, we could modify ROME to explicitly disable it by adding -D_FORTIFY_SOURCE=0 to NOOPT.
That can be done by modifying builder/src/ROMEBuildMakeFile.cpp line 1348.
Could you try to do it ?
Ryu
> Dear all,
>
> Under the environment with GCC4.8.5 and ROOT6.08.04,
> we get the following warning messages when compiling XXXAnalyzer3, XXXAnalyzer4,
> XXXConfig, XXXConfig2,3,4, XXXDBAccess, and XXXConfigToForm.
>
>
> In file included from /usr/include/stdlib.h:24:0,
> from /meg/data1/shared/mc/benchmark_test/rome3-root6.08.04-
> gcc485/include/ROMEAnalyzer.h:10,
> from include/generated/MEGPrecompile.h:23,
> from <command-line>:0:
> /usr/include/features.h:330:4: warning: #warning _FORTIFY_SOURCE requires compiling
> with optimization (-O) [-Wcpp]
> # warning _FORTIFY_SOURCE requires compiling with optimization (-O)
> ^
> [345/369] compiling obj/MEGAnalyzer4.o
> In file included from /usr/include/stdlib.h:24:0,
> from /meg/data1/shared/mc/benchmark_test/rome3-root6.08.04-
> gcc485/include/ROMEAnalyzer.h:10,
> from include/generated/MEGPrecompile.h:23,
> from <command-line>:0:
> /usr/include/features.h:330:4: warning: #warning _FORTIFY_SOURCE requires compiling
> with optimization (-O) [-Wcpp]
> # warning _FORTIFY_SOURCE requires compiling with optimization (-O)
> ^
>
> It seems due to 'NOOPT' flag added to those objects in the Makefile.
> Is the 'NOOPT' flag necessary? If not, how can we remove it?
>
> Regards,
> Yusuke |
208
|
29 Nov 2017 |
Yusuke Uchiyama | Info | Compiler warning | Dear all,
Under the environment with GCC4.8.5 and ROOT6.08.04,
we get the following warning messages when compiling XXXAnalyzer3, XXXAnalyzer4,
XXXConfig, XXXConfig2,3,4, XXXDBAccess, and XXXConfigToForm.
In file included from /usr/include/stdlib.h:24:0,
from /meg/data1/shared/mc/benchmark_test/rome3-root6.08.04-
gcc485/include/ROMEAnalyzer.h:10,
from include/generated/MEGPrecompile.h:23,
from <command-line>:0:
/usr/include/features.h:330:4: warning: #warning _FORTIFY_SOURCE requires compiling
with optimization (-O) [-Wcpp]
# warning _FORTIFY_SOURCE requires compiling with optimization (-O)
^
[345/369] compiling obj/MEGAnalyzer4.o
In file included from /usr/include/stdlib.h:24:0,
from /meg/data1/shared/mc/benchmark_test/rome3-root6.08.04-
gcc485/include/ROMEAnalyzer.h:10,
from include/generated/MEGPrecompile.h:23,
from <command-line>:0:
/usr/include/features.h:330:4: warning: #warning _FORTIFY_SOURCE requires compiling
with optimization (-O) [-Wcpp]
# warning _FORTIFY_SOURCE requires compiling with optimization (-O)
^
It seems due to 'NOOPT' flag added to those objects in the Makefile.
Is the 'NOOPT' flag necessary? If not, how can we remove it?
Regards,
Yusuke |
207
|
11 May 2016 |
Ryu Sawada | Info | Can we reset histograms at the middle of a run in ROME? | Dear Sudeshna,
I added a new button to clear histograms.
Please update your ROME and use the 'develop' branch.
Best regards,
Ryu
> Hi All,
>
> Suppose I want to pause a run, at the middle, and change some run conditions. So
> I want to clear histograms at the middle of a run. Is that possible to do in ROME?
>
> That when I pause the run, I want to clear histograms. So with the new run
> conditions, when we resume that run, we will get clear pads and histograms will
> be filled in new.
>
>
> Thanks a lot!
> Sudeshna |
206
|
06 May 2016 |
SUDESHNA GANGULY | Info | Can we reset histograms at the middle of a run in ROME? | Hi All,
Suppose I want to pause a run, at the middle, and change some run conditions. So
I want to clear histograms at the middle of a run. Is that possible to do in ROME?
That when I pause the run, I want to clear histograms. So with the new run
conditions, when we resume that run, we will get clear pads and histograms will
be filled in new.
Thanks a lot!
Sudeshna |
204
|
21 Apr 2016 |
Ryu Sawada | Info | Clear histogram/group of histograms at the beginning of run in ROME | Dear Sudeshna,
In ROME, histograms are associated with a task (not with a tab).
Histograms are reset at the beginning of runs when "HistAccumulate" is false.
You can set it in your configuration XML like,
<Histogram>
<HistName>MyHisto</HistName>
<HistAccumulate>false</HistAccumulate>
</Histogram>
If you want to clear by hand, you can use ResetHisto() function of your tasks; the function is automatically implemented by ROMEbuilder.
Ryu
> Hi All,
>
> Is there any way in ROME that I can clear histograms at:
>
> 1)Run start.
> 2) Clear by group (tab) ?
>
>
> Thanks a lot!
> Sudeshna |
203
|
18 Apr 2016 |
SUDESHNA GANGULY | Info | Clear histogram/group of histograms at the beginning of run in ROME | Hi All,
Is there any way in ROME that I can clear histograms at:
1)Run start.
2) Clear by group (tab) ?
Thanks a lot!
Sudeshna |
202
|
15 Apr 2016 |
Ryu Sawada | Info | Error with maximum number of tabs in Argus section | Dear Sudeshna
I commit the change to the 'develop' branch.
Ryu
> I've fixed the problem of not being able to define 18 tabs. I edited
> /argus/include/ArgusHistoDisplay.h file:
> I changed the parameter values to:
>
> class ArgusHistoDisplay : public ArgusTab
> {
> protected:
> enum {
> kMaxNumberOfPads = 360,
> kMaxNumberOfPadsX = 10,
> kMaxNumberOfPadsY = 20,
> kNumberOfDisplayViewSelections0 = 54,
> kNumberOfDisplayViewSelections1 = 10,
> kNumberOfDisplayViewSelections2 = 10,
> kMaxNumberOfLines = 81
> };
>
> Now I can define 18 tabs with 3 pads in each.
>
>
>
>
> > Hi Ryu,
> >
> > I am trying to use <Argus> for tabbing like this:
> > <Argus>
> > <Tab>
> > <TabName>Tab1</TabName>
> > <ObjectArrayIndex>0</ObjectArrayIndex>
> >
> > <Index>0</Index>
> > </Tab>
> > <Tab>
> > <TabName>Tab1</TabName>
> > <ObjectArrayIndex>1</ObjectArrayIndex>
> > <Index>1</Index>
> > </Tab>
> > <Tab>
> > <TabName>Tab1</TabName>
> > <ObjectArrayIndex>2</ObjectArrayIndex>
> >
> > <Index>2</Index>
> > </Tab>
> >
> >
> >
> >
> > And I need to add 18 tabs with each tab having three pads.
> > Now I when ever I cross Tab6 with three pads on it, it gives me this error:
> >
> > [sganguly@g2be1 rometest]$ /home/sganguly/dqm/rome/bin/romebuilder.exe -i
> > midas.xml -midas
> > Maximal number of Tabs in the Argus section of Histogram 'h1_wf' reached : 20 !
> >
> > I have noticed that currently I can define 6 tabs and 5 pads on each tab maximum.
> >
> > Could you please help me with this?
> >
> > Thanks a lot!
> > Sudeshna |
201
|
15 Apr 2016 |
Ryu Sawada | Info | Is auto-update available for tabs with user-defined codes (not with <Argus>) ? | Dear Sudeshna
The easiest way would be to call your "Update" function from EventHandler function of your tabs.
You may or may not have a function named "Update", but I believe you must have a function to update your graphics
when your "Update" button is clicked.
You can call the same thing from EventHandler function, then it will keep the display updated.
If you want to control the frequency of the update of each tab, you can see two examples,
$ROMESYS/examples/argus/thread/
$ROMESYS/examples/argus/timer/
The examples update the display with using different tools (making other update thread or by using TTimer of ROOT).
Ryu
> Is it possible to have the pads automatically updated with the update frequency
> (set at romeConfig.xml) while using user-defined src/tabs codes?
> Suppose I write a tab code under src/tabs where I have created an "update" button.
> Now on the Argus display monitor, if I click on the "update" button, the display
> will be updated. But what I've noticed is that clicking on the update button
> introduces a delay. By the time the display is actually updated I've missed some
> events already.
>
> Is there any way to sync the update button with the update frequency in the
> romeConfig.xml? So that it keeps up with every event?
>
> I would really appreciate if anyone have any suggestion for this situation.
>
> Thanks a lot!
> Sudeshna |
200
|
14 Apr 2016 |
SUDESHNA GANGULY | Info | Is auto-update available for tabs with user-defined codes (not with <Argus>) ? | Is it possible to have the pads automatically updated with the update frequency
(set at romeConfig.xml) while using user-defined src/tabs codes?
Suppose I write a tab code under src/tabs where I have created an "update" button.
Now on the Argus display monitor, if I click on the "update" button, the display
will be updated. But what I've noticed is that clicking on the update button
introduces a delay. By the time the display is actually updated I've missed some
events already.
Is there any way to sync the update button with the update frequency in the
romeConfig.xml? So that it keeps up with every event?
I would really appreciate if anyone have any suggestion for this situation.
Thanks a lot!
Sudeshna |
199
|
14 Apr 2016 |
SUDESHNA GANGULY | Info | Error with maximum number of tabs in Argus section | I've fixed the problem of not being able to define 18 tabs. I edited
/argus/include/ArgusHistoDisplay.h file:
I changed the parameter values to:
class ArgusHistoDisplay : public ArgusTab
{
protected:
enum {
kMaxNumberOfPads = 360,
kMaxNumberOfPadsX = 10,
kMaxNumberOfPadsY = 20,
kNumberOfDisplayViewSelections0 = 54,
kNumberOfDisplayViewSelections1 = 10,
kNumberOfDisplayViewSelections2 = 10,
kMaxNumberOfLines = 81
};
Now I can define 18 tabs with 3 pads in each.
> Hi Ryu,
>
> I am trying to use <Argus> for tabbing like this:
> <Argus>
> <Tab>
> <TabName>Tab1</TabName>
> <ObjectArrayIndex>0</ObjectArrayIndex>
>
> <Index>0</Index>
> </Tab>
> <Tab>
> <TabName>Tab1</TabName>
> <ObjectArrayIndex>1</ObjectArrayIndex>
> <Index>1</Index>
> </Tab>
> <Tab>
> <TabName>Tab1</TabName>
> <ObjectArrayIndex>2</ObjectArrayIndex>
>
> <Index>2</Index>
> </Tab>
>
>
>
>
> And I need to add 18 tabs with each tab having three pads.
> Now I when ever I cross Tab6 with three pads on it, it gives me this error:
>
> [sganguly@g2be1 rometest]$ /home/sganguly/dqm/rome/bin/romebuilder.exe -i
> midas.xml -midas
> Maximal number of Tabs in the Argus section of Histogram 'h1_wf' reached : 20 !
>
> I have noticed that currently I can define 6 tabs and 5 pads on each tab maximum.
>
> Could you please help me with this?
>
> Thanks a lot!
> Sudeshna |
198
|
13 Apr 2016 |
SUDESHNA GANGULY | Bug Report | Error with maximum number of tabs in Argus section | Hi Ryu,
I am trying to use <Argus> for tabbing like this:
<Argus>
<Tab>
<TabName>Tab1</TabName>
<ObjectArrayIndex>0</ObjectArrayIndex>
<Index>0</Index>
</Tab>
<Tab>
<TabName>Tab1</TabName>
<ObjectArrayIndex>1</ObjectArrayIndex>
<Index>1</Index>
</Tab>
<Tab>
<TabName>Tab1</TabName>
<ObjectArrayIndex>2</ObjectArrayIndex>
<Index>2</Index>
</Tab>
And I need to add 18 tabs with each tab having three pads.
Now I when ever I cross Tab6 with three pads on it, it gives me this error:
[sganguly@g2be1 rometest]$ /home/sganguly/dqm/rome/bin/romebuilder.exe -i
midas.xml -midas
Maximal number of Tabs in the Argus section of Histogram 'h1_wf' reached : 20 !
I have noticed that currently I can define 6 tabs and 5 pads on each tab maximum.
Could you please help me with this?
Thanks a lot!
Sudeshna |
197
|
11 Apr 2016 |
SUDESHNA GANGULY | Info | Getting an error while compiling a code with <ARGUS> tabs for 2-D histograms | Hi Ryu,
I am trying to display a 2-D histogram with the <Argus> tab in the user xml file.
Here is what I have in the xml:
<Histogram>
<HistName>h2_Exy</HistName>
<HistFolderName>CT</HistFolderName>
<HistArraySize>2</HistArraySize>
<HistType>TH2F</HistType>
<HistXLabel>xseg</HistXLabel>
<HistYLabel>yseg</HistYLabel>
<HistXNbins>9</HistXNbins>
<HistXmin>0.5</HistXmin>
<HistXmax>9.5</HistXmax>
<HistYNbins>6</HistYNbins>
<HistYmin>0.5</HistYmin>
<HistYmax>6.5</HistYmax>
<Argus>
<Tab>
<TabName>Summary</TabName>
<ObjectArrayIndex>0</ObjectArrayIndex>
<Index>0</Index>
</Tab>
</Argus>
</Histogram>
But when I compile the code it throws the following error message:
src/generated/HGUITSummary_Base.cpp:87: error: cannot convert TH1F* to TH2F*
in assignment
I am getting this error when ever I am trying to display 2-D histograms with
<Argus> tabs.
Any help will be much appreciated.
Sudeshna |
196
|
08 Apr 2016 |
Ryu Sawada | Bug Report | Running ROME remotely | Dear Sudeshna
I modified ROME to try to fix problems related <ARGUS> block histograms in run-mode 3.
Could you please pull ROME and use the 'develop' branch ?
(You can switch branches with "git checkout develop' command)
There is an example, examples/argus/histogram.
I tested with the example and it works.
'romeproject' in the directory works as a server.
What you need to use the example for the test is,
0) 'make' in $ROMESYS
1) Build and compile both examples/argus/histogram and examples/argus/histogram/romeproject
2) Start analyzer in romeproject with using romeConfig.xml
3) Start monitor with using argusConfig.xml
In the second tab, you must see an <ARGUS> block histogram updated periodically.
Ryu
> Hi Ryu,
>
> After following your instructions to run ROME remotely, using run mode 3 on the
> client machine, and mode 0 on the server machine, we can see ARGUS display
> appearing on the client machine.
> But that does not work if we have the <ARGUS> block for tabbing in the user xml
> file. I see a bunch of error messages and then ROME crashes on the client machine.
> There might be some conflict with using ARGUS and using run mode 3?
>
> If I take off the <ARGUS> tab block and write my own src/tabs/tab codes, then on
> my client machine, using run mode 3 works, the display appears with histograms
> without a crash.
>
> Any thought on this issue will be much appreciated.
>
> Thanks,
> Sudeshna |
195
|
05 Apr 2016 |
SUDESHNA GANGULY | Bug Report | Running ROME remotely | Hi Ryu,
After following your instructions to run ROME remotely, using run mode 3 on the
client machine, and mode 0 on the server machine, we can see ARGUS display
appearing on the client machine.
But that does not work if we have the <ARGUS> block for tabbing in the user xml
file. I see a bunch of error messages and then ROME crashes on the client machine.
There might be some conflict with using ARGUS and using run mode 3?
If I take off the <ARGUS> tab block and write my own src/tabs/tab codes, then on
my client machine, using run mode 3 works, the display appears with histograms
without a crash.
Any thought on this issue will be much appreciated.
Thanks,
Sudeshna |
194
|
05 Apr 2016 |
Ryu Sawada | Info | ROME in online mode using an intermediary machine | Dear Wes,
-R is used for starting an interactive session connected to a server.
If you want to see Argus windows, please change <ProgramMode> to 3 (or use "-p 3" comman-line option).
Ryu
Wes Gohn wrote: |
Hi Ryu, here is the method we've followed. I tried to simplify things by connecting to the server directly, so we can skip the port tunnelling. On the server side, in the romeConfig.xml, I set
<SocketServer>
<Active>true</Active>
<PortNumber>9091</PortNumber>
</SocketServer>
I then started rome in batch mode
./midanalyzer.exe -i romeConfig.xml -b
It connects to a running experiment as expected, and is processing data.
On the client machine, I set in romeConfig.xml:
<SocketClient>
<Host>myhost</Host>
<Port>9091</Port>
</SocketClient>
I then start rome using the -R option:
./midanalyzer.exe -R myhost:9091
*****************************************
* *
* MIDAnalyzer *
* *
* generated by the ROME Environment *
* Version 3.2.6 *
* *
*****************************************
Remote session to myhost:9091
midanalyzer [0]
At which point it does establish the socket connection to the server side, but it just sits there (I can establish this because if I run commands at the prompt, I see some errors pop up on my server terminal). How do I open my Argus browser on the client side to see the plots?
Or is there something we're doing that is fundamentally wrong?
Thanks,
Wes |
|
193
|
04 Apr 2016 |
Wes Gohn | Info | ROME in online mode using an intermediary machine |
Hi Ryu, here is the method we've followed. I tried to simplify things by connecting to the server directly, so we can skip the port tunnelling. On the server side, in the romeConfig.xml, I set
<SocketServer>
<Active>true</Active>
<PortNumber>9091</PortNumber>
</SocketServer>
I then started rome in batch mode
./midanalyzer.exe -i romeConfig.xml -b
It connects to a running experiment as expected, and is processing data.
On the client machine, I set in romeConfig.xml:
<SocketClient>
<Host>myhost</Host>
<Port>9091</Port>
</SocketClient>
I then start rome using the -R option:
./midanalyzer.exe -R myhost:9091
*****************************************
* *
* MIDAnalyzer *
* *
* generated by the ROME Environment *
* Version 3.2.6 *
* *
*****************************************
Remote session to myhost:9091
midanalyzer [0]
At which point it does establish the socket connection to the server side, but it just sits there (I can establish this because if I run commands at the prompt, I see some errors pop up on my server terminal). How do I open my Argus browser on the client side to see the plots?
Or is there something we're doing that is fundamentally wrong?
Thanks,
Wes |
192
|
31 Mar 2016 |
Ryu Sawada | Info | ROME in online mode using an intermediary machine | The local port 21175 may be too large, please replace 21175 by, for example, 8175.
You can specify the host name and the port number in your config XML for your ROME program like, <Online>
<Host>localhost:8175</Host>
</Online>
Can you connect the MIDAS experiment from the host B with using other midas applications, e.g odbedit ?
Can you try odbedit -h A -e EXP (replace EXP with your experiment name)
If you can not connect, I think there is a problem which is not related to ROME.
Can you also check if you can connect the MIDAS experiment from the host C with using other midas applications, e.g odbedit, after establishing the SSH tunnel ?
Can you try odbedit -h localhost:8175 -e EXP (replace EXP with your experiment name)
Ryu
Farrukh Azfar wrote: | Hi Ryu
Thanks for your reply
so we did do that - it seems that the path to MIDASYS needs to be defined on the localhost too ? Anyhow the program does not run complaining that it is unable to read from the online database -
[HGUIExample,ERROR] [ROMEPrint.cpp:177:ROMEPrint::Error,ERROR] Can not read run status from the online database
So the ODB cannot be read through this port ? Do you have an example of running ROME through an ssh tunnel via an intermediary (gateway) machine ?
many thanks
Farrukh
Ryu Sawada wrote: | Hello,
I think you need to use SSH port forwarding,
On C, you open a terminal and type a command like, ssh -L 21175:A:1175 B 1175 is the MIDAS server port number.
For avoiding the connection being terminated, you may better to type a command to keep the communication, for
example, top
Then, on C, you configure ROME to connect to localhost and port number is 21175, and start the ROME analyzer.
Ryu
> Dear Folks
>
> Complete newby on online mode - hence this easy question :
>
> I have three machines, A, B, and C.
>
> A is where a MIDAS EventBuilder is running
> B is a gateway machine
> C is my local machine on which I want to run ROME analyser (in online mode)
>
> A is not accessible from C. B is accesible from both A and C -
>
> I want to utilize the fact that I have a gateway to run ROME analyser in online
> mode reading data from A via B -
>
> If someone could explain how to do this in detail - but in simple terms - I'd be
> grateful
>
> Thank you !
>
> Farrukh |
|
|
191
|
30 Mar 2016 |
Farrukh Azfar | Info | ROME in online mode using an intermediary machine | Hi Ryu
Thanks for your reply
so we did do that - it seems that the path to MIDASYS needs to be defined on the localhost too ? Anyhow the program does not run complaining that it is unable to read from the online database -
[HGUIExample,ERROR] [ROMEPrint.cpp:177:ROMEPrint::Error,ERROR] Can not read run status from the online database
So the ODB cannot be read through this port ? Do you have an example of running ROME through an ssh tunnel via an intermediary (gateway) machine ?
many thanks
Farrukh
Ryu Sawada wrote: | Hello,
I think you need to use SSH port forwarding,
On C, you open a terminal and type a command like, ssh -L 21175:A:1175 B 1175 is the MIDAS server port number.
For avoiding the connection being terminated, you may better to type a command to keep the communication, for
example, top
Then, on C, you configure ROME to connect to localhost and port number is 21175, and start the ROME analyzer.
Ryu
> Dear Folks
>
> Complete newby on online mode - hence this easy question :
>
> I have three machines, A, B, and C.
>
> A is where a MIDAS EventBuilder is running
> B is a gateway machine
> C is my local machine on which I want to run ROME analyser (in online mode)
>
> A is not accessible from C. B is accesible from both A and C -
>
> I want to utilize the fact that I have a gateway to run ROME analyser in online
> mode reading data from A via B -
>
> If someone could explain how to do this in detail - but in simple terms - I'd be
> grateful
>
> Thank you !
>
> Farrukh |
|
190
|
27 Mar 2016 |
Ryu Sawada | Info | ROME in online mode using an intermediary machine | Hello,
I think you need to use SSH port forwarding,
On C, you open a terminal and type a command like, ssh -L 21175:A:1175 B 1175 is the MIDAS server port number.
For avoiding the connection being terminated, you may better to type a command to keep the communication, for
example, top
Then, on C, you configure ROME to connect to localhost and port number is 21175, and start the ROME analyzer.
Ryu
> Dear Folks
>
> Complete newby on online mode - hence this easy question :
>
> I have three machines, A, B, and C.
>
> A is where a MIDAS EventBuilder is running
> B is a gateway machine
> C is my local machine on which I want to run ROME analyser (in online mode)
>
> A is not accessible from C. B is accesible from both A and C -
>
> I want to utilize the fact that I have a gateway to run ROME analyser in online
> mode reading data from A via B -
>
> If someone could explain how to do this in detail - but in simple terms - I'd be
> grateful
>
> Thank you !
>
> Farrukh |
189
|
23 Mar 2016 |
Farrukh Azfar | Info | ROME in online mode using an intermediary machine | Dear Folks
Complete newby on online mode - hence this easy question :
I have three machines, A, B, and C.
A is where a MIDAS EventBuilder is running
B is a gateway machine
C is my local machine on which I want to run ROME analyser (in online mode)
A is not accessible from C. B is accesible from both A and C -
I want to utilize the fact that I have a gateway to run ROME analyser in online
mode reading data from A via B -
If someone could explain how to do this in detail - but in simple terms - I'd be
grateful
Thank you !
Farrukh |
Draft
|
21 Mar 2016 |
Farrukh Azfar | Info | speeding up ROME | |
187
|
13 Mar 2016 |
Ryu Sawada | Forum | Option to analyse every Nth event | I added a new parameter <EventStep> to configuration XML file.
The default is 1.
If you change it to, for example 2, every second events are analyzed.
For using it, you need to
- update ROME
- compile ROME
- re-build and make your project
Once you use an existing config XML file, a new parameter will be automatically added to it.
Ryu
> Dear Colleagues
>
> I was wondering if there was an option to analyse only ever N events in ROME. If
> this is doable via an xml switch I am guessing this would be the best and most
> convenient solution.
>
> Else any advice on how to do this in code would be great as well -
>
> many thanks
> Farrukh |
186
|
13 Mar 2016 |
Ryu Sawada | Suggestion | Problem in adding two TGraphs in the same pad using <Argus> block in tabbing | I tried to reproduce the problem with using histoGUI example.
However I couldn't reproduce it; namely two graphs are shown.
I attached a modification for the example, which I applied for the test.
If you attach something similar which can reproduce the problem, it will be easier for me to find the reason.
Ryu
diff --git a/examples/histoGUI/histoGUI.xml b/examples/histoGUI/histoGUI.xml
index 3043dec..489052a 100644
--- a/examples/histoGUI/histoGUI.xml
+++ b/examples/histoGUI/histoGUI.xml
@@ -34,6 +34,7 @@
<GraphName>MyGraph</GraphName>
<GraphFolderName>mygraphs</GraphFolderName>
<GraphType>TGraph</GraphType>
+ <GraphArraySize>2</GraphArraySize>
<GraphXLabel>X</GraphXLabel>
<GraphYLabel>Y</GraphYLabel>
<GraphXmin>0</GraphXmin>
@@ -43,7 +44,9 @@
<Argus>
<Tab>
<TabName>GeneratedHisto</TabName>
+ <ObjectArrayIndex>0-1</ObjectArrayIndex>
<Index>4</Index>
+ <DrawSamePad>true</DrawSamePad>
</Tab>
</Argus>
</Graph>
diff --git a/examples/histoGUI/src/tasks/HGUITFillHisto.cpp b/examples/histoGUI/src/tasks/HGUITFillHisto.cpp
index 6ada840..c4dd95f 100644
--- a/examples/histoGUI/src/tasks/HGUITFillHisto.cpp
+++ b/examples/histoGUI/src/tasks/HGUITFillHisto.cpp
@@ -51,7 +51,10 @@ ClassImp(HGUITFillHisto)
void HGUITFillHisto::Init()
{
- GetMyGraph()->SetMarkerStyle(31);
+ GetMyGraphAt(0)->SetMarkerStyle(31);
+ GetMyGraphAt(1)->SetMarkerStyle(31);
+ GetMyGraphAt(0)->SetMarkerColor(2);
+ GetMyGraphAt(1)->SetMarkerColor(4);
GetMyGraphError()->SetMarkerStyle(8);
GetMyGraphError()->SetMarkerColor(4);
}
@@ -69,17 +72,23 @@ void HGUITFillHisto::Event()
GetMyHistoAt(2)->SetLineColor(2);
GetMyHistoAt(3)->SetLineColor(4);
GetMyOtherHisto()->Fill(gRandom->Gaus(0,40));
- GetMyGraph()->SetPoint(0,0,gRandom->Rndm());
- GetMyGraph()->SetPoint(1,1,gRandom->Rndm());
- GetMyGraph()->SetPoint(2,2,gRandom->Rndm());
- GetMyGraph()->SetPoint(3,3,gRandom->Rndm());
- GetMyGraph()->SetPoint(4,4,gRandom->Rndm());
+ GetMyGraphAt(0)->SetPoint(0,0,gRandom->Rndm());
+ GetMyGraphAt(0)->SetPoint(1,1,gRandom->Rndm());
+ GetMyGraphAt(0)->SetPoint(2,2,gRandom->Rndm());
+ GetMyGraphAt(0)->SetPoint(3,3,gRandom->Rndm());
+ GetMyGraphAt(0)->SetPoint(4,4,gRandom->Rndm());
+ GetMyGraphAt(1)->SetPoint(0,0,gRandom->Rndm());
+ GetMyGraphAt(1)->SetPoint(1,1,gRandom->Rndm());
+ GetMyGraphAt(1)->SetPoint(2,2,gRandom->Rndm());
+ GetMyGraphAt(1)->SetPoint(3,3,gRandom->Rndm());
+ GetMyGraphAt(1)->SetPoint(4,4,gRandom->Rndm());
GetMyGraphError()->SetPoint(0,0,gRandom->Rndm());
GetMyGraphError()->SetPoint(1,1,gRandom->Rndm());
GetMyGraphError()->SetPoint(2,2,gRandom->Rndm());
GetMyGraphError()->SetPoint(3,3,gRandom->Rndm());
GetMyGraphError()->SetPoint(4,4,gRandom->Rndm());
- ArgusHistoDisplay::SetLimits(GetMyGraph());
+ ArgusHistoDisplay::SetLimits(GetMyGraphAt(0));
+ ArgusHistoDisplay::SetLimits(GetMyGraphAt(1));
ArgusHistoDisplay::SetLimits(GetMyGraphError());
}
> I wanted to add two different TGraphs (Corresponding to two calorimeters) into
> the same pad.
> So in the xml file I did:
> <Graph>
> <GraphName>MyGraph</GraphName>
> <GraphFolderName>mygraphs</GraphFolderName>
> <GraphType>TGraph</GraphType>
> <GraphArraySize>2</GraphArraySize>
> <GraphXLabel>Event no.</GraphXLabel>
> <GraphYLabel>Island no.</GraphYLabel>
> <GraphXmin>0</GraphXmin>
> <GraphXmax>10000</GraphXmax>
> <GraphYmin>0</GraphYmin>
> <GraphYmax>100000</GraphYmax>
> <Argus>
> <Tab>
> <TabName>SummaryFCBank</TabName>
> <ObjectArrayIndex>0-1</ObjectArrayIndex>
> <Index>1</Index>
> <DrawSamePad>true</DrawSamePad>
> </Tab>
> </Argus>
> </Graph>
>
>
> And in src/tasks:
> in the HGUITFillHisto.cpp code I did:
> for(int icalo=1; icalo<3; icalo++) [For each calorimeter there is one bank, and one n_islands value from that
> bank per event.]
> {
> GetMyGraphAt(icalo-1)->SetPoint(gAnalyzer->GetCurrentEventNumber(),gAnalyzer->GetCurrentEventNumber(),n_islands);
>
> GetMyGraphAt(0)->SetMarkerColor(2);
>
> GetMyGraphAt(1)->SetMarkerColor(3);
>
> ArgusHistoDisplay::SetLimits(GetMyGraphAt(icalo-1));
>
> }
>
> But then I get an empty pad in the tab.
> It works when I create the TGraph for only one calorimeter, using GetMyGraph().
>
> Any help would be much appreciated.
>
> Thanks!
> Sudeshna |
Attachment 1: screen.jpg
|
|
185
|
10 Mar 2016 |
Farrukh Azfar | Forum | Option to analyse every Nth event | Dear Colleagues
I was wondering if there was an option to analyse only ever N events in ROME. If
this is doable via an xml switch I am guessing this would be the best and most
convenient solution.
Else any advice on how to do this in code would be great as well -
many thanks
Farrukh |
184
|
07 Mar 2016 |
SUDESHNA GANGULY | Suggestion | Problem in adding two TGraphs in the same pad using <Argus> block in tabbing | I wanted to add two different TGraphs (Corresponding to two calorimeters) into
the same pad.
So in the xml file I did:
<Graph>
<GraphName>MyGraph</GraphName>
<GraphFolderName>mygraphs</GraphFolderName>
<GraphType>TGraph</GraphType>
<GraphArraySize>2</GraphArraySize>
<GraphXLabel>Event no.</GraphXLabel>
<GraphYLabel>Island no.</GraphYLabel>
<GraphXmin>0</GraphXmin>
<GraphXmax>10000</GraphXmax>
<GraphYmin>0</GraphYmin>
<GraphYmax>100000</GraphYmax>
<Argus>
<Tab>
<TabName>SummaryFCBank</TabName>
<ObjectArrayIndex>0-1</ObjectArrayIndex>
<Index>1</Index>
<DrawSamePad>true</DrawSamePad>
</Tab>
</Argus>
</Graph>
And in src/tasks:
in the HGUITFillHisto.cpp code I did:
for(int icalo=1; icalo<3; icalo++) [For each calorimeter there is one bank, and one n_islands value from that
bank per event.]
{
GetMyGraphAt(icalo-1)->SetPoint(gAnalyzer->GetCurrentEventNumber(),gAnalyzer->GetCurrentEventNumber(),n_islands);
GetMyGraphAt(0)->SetMarkerColor(2);
GetMyGraphAt(1)->SetMarkerColor(3);
ArgusHistoDisplay::SetLimits(GetMyGraphAt(icalo-1));
}
But then I get an empty pad in the tab.
It works when I create the TGraph for only one calorimeter, using GetMyGraph().
Any help would be much appreciated.
Thanks!
Sudeshna |
183
|
02 Mar 2016 |
Ryu Sawada | Forum | Online mode issue | Dear Joe
There is a working example for the online access to midas.
Please see,
https://bitbucket.org/muegamma/rome3/wiki/Midas
The example is $ROMESYS/examples/midas.
There is a README file in the directory.
The example works with an example experiment in MIDAS package so you can try.
If you look at ADC2 tab, the histograms should be updated when DAQ is running.
The "Trigger" events are polled in the MIDAS frontend, and "Scaler" data are taken periodically.
So I guess the "Scaler" corresponds to your INPT and "Trigger" corresponds to your other event types.
You may compare the examples and your analyzer/frontend for finding the cause of your problem.
Ryu
> Hello all,
>
> I'm having an issue with getting rome to run in online mode in some cases only.
> That is, when I run the analyzer that accesses the INPT bank (standard for PSI
> slow control buses) the online mode works just fine. But when I access other
> banks, when I run in online mode only blank canvases are updated and no data
> appears.
>
> I can run all of these analyzers in offline mode and they all work as expected
> so this eliminates many common user bugs. Any ideas how I might debug further?
> I also tried printing the data in the various tasks and indeed in online mode
> no data is being accessed.
>
> Thanks,
> Joe |
182
|
02 Mar 2016 |
Ryu Sawada | Info | Adding different tabs under a single parent tab | Yes, it can be done easily by nesting the tab definition in your definition XML file.
An example is $ROMESYS/examples/argus/tabs
Ryu
> Hi Everyone,
>
> Is there any way I can put different tabs under a single click-able menu in ROME?
> Suppose I have tabs A, B, C, D. Each one of these tabs contains histograms. Can
> I now, put A, B, C, D under another click-able menu called "calorimeters" ?
>
> So that when I click on "calorimeters", I will see A, B, C, D. And then when I
> click on A/B/C/D I will see the histograms.
>
> Can that be done?
> Is there any example available?
>
> Thanks for any help!
> Sudeshna |
181
|
01 Mar 2016 |
SUDESHNA GANGULY | Info | Adding different tabs under a single parent tab | Hi Everyone,
Is there any way I can put different tabs under a single click-able menu in ROME?
Suppose I have tabs A, B, C, D. Each one of these tabs contains histograms. Can
I now, put A, B, C, D under another click-able menu called "calorimeters" ?
So that when I click on "calorimeters", I will see A, B, C, D. And then when I
click on A/B/C/D I will see the histograms.
Can that be done?
Is there any example available?
Thanks for any help!
Sudeshna |
180
|
18 Feb 2016 |
Joe Grange | Forum | Online mode issue | Hello all,
I'm having an issue with getting rome to run in online mode in some cases only.
That is, when I run the analyzer that accesses the INPT bank (standard for PSI
slow control buses) the online mode works just fine. But when I access other
banks, when I run in online mode only blank canvases are updated and no data
appears.
I can run all of these analyzers in offline mode and they all work as expected
so this eliminates many common user bugs. Any ideas how I might debug further?
I also tried printing the data in the various tasks and indeed in online mode
no data is being accessed.
Thanks,
Joe |
179
|
28 Jan 2016 |
Ryu Sawada | Suggestion | Adding texts on a histigram while using <Argus> block for tabbing | Dear Sudeshna
Unfortunately, with the current ROME, it is not possible to insert own code when you use <Argus> blocks for
which the source code is supposed to be generated automatically (and not editable).
If you want to do more than the automatically generated code, you can use the normal type tabs although you
need to program it by yourself (as you program tasks).
An example is $ROMESYS/examples/midas.
In midas.xml, you can find <Tabs> section where several normal tabs are defined.
Corresponding source files will be generated in src/tabs when you run romebuilder after modifying the
definition
XML.
As for source files of tasks, you can edit the source files of tabs as you want.
ROMEbuilder will not overwrite the files.
You can draw any ROOT GUI objects in the tabs including text.
You can get the pointer of histograms associated to a task.
For example, in the midas example, src/tabs/MIDTADCTab.cpp, a pointer of a histogram 'ADC' of
'FillHistogram'
task is obtained by
gAnalyzer->GetFillHistogramTask()->GetADCAt(i)
Please let me know if you have any problems to write code for your tabs.
Best regards,
Ryu
> Hi,
>
> I am defining a histogram in the xml file like this:
>
> <Histogram>
> <HistName>h2_dt_tcpgotheader</HistName>
> <HistFolderName>BC</HistFolderName>
> <HistType>TH2D</HistType>
> <HistXLabel>time(us)</HistXLabel>
> <HistYLabel>Entries</HistYLabel>
> <HistXNbins>300000</HistXNbins>
> <HistXmin>-20000</HistXmin>
> <HistXmax>100000</HistXmax>
> <HistYNbins>10</HistYNbins>
> <HistYmin>0.0</HistYmin>
> <HistYmax>10</HistYmax>-->
> <Argus>
> <Tab>
> <TabName>SummaryBCBank</TabName>
> <Index>0</Index>
> </Tab>
> </Argus>
> <Histogram>
> <HistName>h2_dt_tcpgotheader</HistName>
> <HistFolderName>BC</HistFolderName>
> <HistType>TH2D</HistType>
> <HistXLabel>time(us)</HistXLabel>
> <HistYLabel>Entries</HistYLabel>
> <HistXNbins>300000</HistXNbins>
> <HistXmin>-20000</HistXmin>
> <HistXmax>100000</HistXmax>
> <HistYNbins>10</HistYNbins>
> <HistYmin>0.0</HistYmin>
> <HistYmax>10</HistYmax>-->
> <Argus>
> <Tab>
> <TabName>SummaryBCBank</TabName>
> <Index>0</Index>
> </Tab>
> </Argus>
> </Histogram>
>
> Now I want to add few texts and arrows on the same pad where the histogram is
> being written.
>
> I want to add this piece of code:
>
> TLatex title;
> title.SetTextFont(12);
> title.SetTextSize(0.03);
> title.SetNDC();
>
>
> title.SetTextColor(2);
> title.DrawLatex(0.01,0.32,"tcp header #rightarrow");
> title.SetTextColor(3);
> title.DrawLatex(0.01,0.4,"tcp data #rightarrow");
> title.SetTextColor(4);
> title.DrawLatex(0.01,0.48,"copy to GPU #rightarrow");
> title.SetTextColor(5);
> title.DrawLatex(0.01,0.56,"GPU processing #rightarrow");
> title.SetTextColor(6);
> title.DrawLatex(0.01,0.64,"MFE start #rightarrow");
> title.SetTextColor(7);
> title.DrawLatex(0.01,0.72,"MFE stop #rightarrow");
>
> The problem is that if I add this piece of code in the src/tasks, where I fill
> in the histogram, then the problem is that this histogram replaces whatever is
> on the last tab on the canvas.
>
> As I recall that I am not supposed to add extra tabbing codes in the src codes
> when I am using the <Argus> block for tabbing.
>
> So where can I add these texts while still using <Argus> block for tabbing?
>
> Any help might be very much appreciated. |
178
|
22 Jan 2016 |
SUDESHNA GANGULY | Suggestion | Adding texts on a histigram while using <Argus> block for tabbing | Hi,
I am defining a histogram in the xml file like this:
<Histogram>
<HistName>h2_dt_tcpgotheader</HistName>
<HistFolderName>BC</HistFolderName>
<HistType>TH2D</HistType>
<HistXLabel>time(us)</HistXLabel>
<HistYLabel>Entries</HistYLabel>
<HistXNbins>300000</HistXNbins>
<HistXmin>-20000</HistXmin>
<HistXmax>100000</HistXmax>
<HistYNbins>10</HistYNbins>
<HistYmin>0.0</HistYmin>
<HistYmax>10</HistYmax>-->
<Argus>
<Tab>
<TabName>SummaryBCBank</TabName>
<Index>0</Index>
</Tab>
</Argus>
<Histogram>
<HistName>h2_dt_tcpgotheader</HistName>
<HistFolderName>BC</HistFolderName>
<HistType>TH2D</HistType>
<HistXLabel>time(us)</HistXLabel>
<HistYLabel>Entries</HistYLabel>
<HistXNbins>300000</HistXNbins>
<HistXmin>-20000</HistXmin>
<HistXmax>100000</HistXmax>
<HistYNbins>10</HistYNbins>
<HistYmin>0.0</HistYmin>
<HistYmax>10</HistYmax>-->
<Argus>
<Tab>
<TabName>SummaryBCBank</TabName>
<Index>0</Index>
</Tab>
</Argus>
</Histogram>
Now I want to add few texts and arrows on the same pad where the histogram is
being written.
I want to add this piece of code:
TLatex title;
title.SetTextFont(12);
title.SetTextSize(0.03);
title.SetNDC();
title.SetTextColor(2);
title.DrawLatex(0.01,0.32,"tcp header #rightarrow");
title.SetTextColor(3);
title.DrawLatex(0.01,0.4,"tcp data #rightarrow");
title.SetTextColor(4);
title.DrawLatex(0.01,0.48,"copy to GPU #rightarrow");
title.SetTextColor(5);
title.DrawLatex(0.01,0.56,"GPU processing #rightarrow");
title.SetTextColor(6);
title.DrawLatex(0.01,0.64,"MFE start #rightarrow");
title.SetTextColor(7);
title.DrawLatex(0.01,0.72,"MFE stop #rightarrow");
The problem is that if I add this piece of code in the src/tasks, where I fill
in the histogram, then the problem is that this histogram replaces whatever is
on the last tab on the canvas.
As I recall that I am not supposed to add extra tabbing codes in the src codes
when I am using the <Argus> block for tabbing.
So where can I add these texts while still using <Argus> block for tabbing?
Any help might be very much appreciated. |
177
|
11 Dec 2015 |
Ryu Sawada | Suggestion | writing data to mySQL via ROME | Dear Sudeshna
Yes, you can write,
There is an example project for showing the access to databases.
$ROMESYS/examples/dbexample/
For writing, an example is
$ROMESYS/examples/dbexample/src/tasks/RDBTWriteFolders.cpp
If you prefer to use normal SQL queries rather than using the ROME DB path. An example is,
$ROMESYS/examples/dbexample/src/tasks/RDBTMakeQuery.cpp
By using SQL query, you can do anything about DB.
More information is in wiki,
https://bitbucket.org/muegamma/rome3/wiki/Database
Best regards,
Ryu
> I need some suggestions on how to write some data to a mySQL database via ROME.
>
> I am calculating a quantity CTag and making a TGraph of CTag/event in ROME. Now
> if I want to write it to a mySQL what shall I do?
>
> From the manual I found that we can read from a database DAQ (SQL) system. That
> it reads the main input data from a database. And I looked into the example
> under'rome/examples/stepbystepdbdaq'.
>
> But is there any way I can write the calculated CTags and Event Numbers to a SQL
> database?
>
> Thanks for any suggestion! |
176
|
10 Dec 2015 |
SUDESHNA GANGULY | Suggestion | writing data to mySQL via ROME | I need some suggestions on how to write some data to a mySQL database via ROME.
I am calculating a quantity CTag and making a TGraph of CTag/event in ROME. Now
if I want to write it to a mySQL what shall I do?
From the manual I found that we can read from a database DAQ (SQL) system. That
it reads the main input data from a database. And I looked into the example
under'rome/examples/stepbystepdbdaq'.
But is there any way I can write the calculated CTags and Event Numbers to a SQL
database?
Thanks for any suggestion! |
175
|
07 Dec 2015 |
Ryu Sawada | Suggestion | Drawing multiple histograms on the same pad and dispalying them in the online mode in ROME | Hello,
First of all, the histograms are supposed to be drawn by the automatically generated code.
You don't need (and should not) draw them from a task.
If you do so, the histograms are drawn on the active pad (gPad) which is, in your case, the last pad on a tab.
I added a new feature to ROME development branch.
For using the feature, you can try
cd $ROMESYS
git checkout develop
git pull
make
cd your_project
make build
make
As you can see in the updated examples/histoGUI/histoGUI.xml, a new option <DrawSamePad>true</DrawSamePad> is
available.
When it is true, the array of histograms are drawn on the same pad.
If you have any problems, please let me know.
Best regards,
Ryu
> I need some suggestions regarding drawing multiple histograms on the same pad in
> ROME.
> Here is what I have been doing. I am making a summary histogram online dispaly
> with ARGUS. The displays is gonna show multiple different types of histograms.
>
> So I made a module with four different types of histograms all on the same canvas,
> so that I can look at them in real time in an online run.
>
> Now in one of the histograms, I am looping over multiple banks, so in one of the
> pads, I want to see two different lines of different colors (to indicate two
> different histograms of the same type from two banks).
> So I used histoGUI.xml (from examples/histoGUI) and used this way of histogram
> and tab declarations:
> <Tasks>
> <Task>
> <TaskName>FillHisto</TaskName>
> <Histogram>
> <HistName>h1_Esum</HistName>
>
>
> <HistArraySize>2</HistArraySize>
> <HistFolderName>myhistos</HistFolderName>
> <HistType>TH1F</HistType>
>
> <HistXLabel>ESum</HistXLabel>
> <HistYLabel>Entries</HistYLabel>
> <HistXNbins>300</HistXNbins>
> <HistXmin>0</HistXmin>
> <HistXmax>3.1</HistXmax>
> </Histogram>
>
>
>
>
> <Histogram>
> <HistName>h1_amplitude</HistName>
> <HistFolderName>myotherhistos</HistFolderName>
> <HistArraySize>108</HistArraySize>
>
>
> <HistType>TH1F</HistType>
> <HistXLabel>Amplitude</HistXLabel>
> <HistYLabel>Entries</HistYLabel>
> <HistXNbins>4096</HistXNbins>
> <HistXmin>-0.5</HistXmin>
> <HistXmax>4095.5</HistXmax>
> <Argus>
> <Tab>
> <TabName>GeneratedHisto</TabName>
>
> <ObjectArrayIndex>0</ObjectArrayIndex>
>
> <Index>1</Index>
> </Tab>
> </Argus>
> </Histogram>
>
> etc. and two other histograms have been defined in the same way.
>
> And then in the src/task: HGUITFillHisto.cpp
> I added this: (to draw two histograms on the same pad)
>
> if(icalo==1)
> {
> Geth1_EsumAt(0)->Fill(0.00009118*sum);
>
> Geth1_EsumAt(0)->SetLineColor(3);
>
> }
>
> Geth1_EsumAt(0)->Draw();
>
> if(icalo==2)
> {
> Geth1_EsumAt(1)->Fill(0.00009118*sum);
>
> }
>
> Geth1_EsumAt(1)->Draw("same");
>
> And attached is the screen shot from ARGUS.
>
> Now the problem is: when I add the Draw() and Draw("same") codes in the src/task
> code, it always creates two copies of the same pad. The 0th pad and the very last
> pad. So what ever is on the last pad in the attachment is being replaced by the
> same copy of the 0th pad. I kept chaning the Index number in histoGUI.xml, but what
> ever I do, if I try to draw two histograms on the same pad and add those codes in
> the srdc/task .cpp file, it always creates two copies.
>
> I don't know where to look at to fix the problem.
>
> Is there any other way I can add multiple histograms on a pad, while keeping the
> other pads on the canvas intact?
>
> Any help on this issue will be much appreciated. |
174
|
03 Dec 2015 |
SUDESHNA GANGULY | Suggestion | Drawing multiple histograms on the same pad and dispalying them in the online mode in ROME | I need some suggestions regarding drawing multiple histograms on the same pad in
ROME.
Here is what I have been doing. I am making a summary histogram online dispaly
with ARGUS. The displays is gonna show multiple different types of histograms.
So I made a module with four different types of histograms all on the same canvas,
so that I can look at them in real time in an online run.
Now in one of the histograms, I am looping over multiple banks, so in one of the
pads, I want to see two different lines of different colors (to indicate two
different histograms of the same type from two banks).
So I used histoGUI.xml (from examples/histoGUI) and used this way of histogram
and tab declarations:
<Tasks>
<Task>
<TaskName>FillHisto</TaskName>
<Histogram>
<HistName>h1_Esum</HistName>
<HistArraySize>2</HistArraySize>
<HistFolderName>myhistos</HistFolderName>
<HistType>TH1F</HistType>
<HistXLabel>ESum</HistXLabel>
<HistYLabel>Entries</HistYLabel>
<HistXNbins>300</HistXNbins>
<HistXmin>0</HistXmin>
<HistXmax>3.1</HistXmax>
</Histogram>
<Histogram>
<HistName>h1_amplitude</HistName>
<HistFolderName>myotherhistos</HistFolderName>
<HistArraySize>108</HistArraySize>
<HistType>TH1F</HistType>
<HistXLabel>Amplitude</HistXLabel>
<HistYLabel>Entries</HistYLabel>
<HistXNbins>4096</HistXNbins>
<HistXmin>-0.5</HistXmin>
<HistXmax>4095.5</HistXmax>
<Argus>
<Tab>
<TabName>GeneratedHisto</TabName>
<ObjectArrayIndex>0</ObjectArrayIndex>
<Index>1</Index>
</Tab>
</Argus>
</Histogram>
etc. and two other histograms have been defined in the same way.
And then in the src/task: HGUITFillHisto.cpp
I added this: (to draw two histograms on the same pad)
if(icalo==1)
{
Geth1_EsumAt(0)->Fill(0.00009118*sum);
Geth1_EsumAt(0)->SetLineColor(3);
}
Geth1_EsumAt(0)->Draw();
if(icalo==2)
{
Geth1_EsumAt(1)->Fill(0.00009118*sum);
}
Geth1_EsumAt(1)->Draw("same");
And attached is the screen shot from ARGUS.
Now the problem is: when I add the Draw() and Draw("same") codes in the src/task
code, it always creates two copies of the same pad. The 0th pad and the very last
pad. So what ever is on the last pad in the attachment is being replaced by the
same copy of the 0th pad. I kept chaning the Index number in histoGUI.xml, but what
ever I do, if I try to draw two histograms on the same pad and add those codes in
the srdc/task .cpp file, it always creates two copies.
I don't know where to look at to fix the problem.
Is there any other way I can add multiple histograms on a pad, while keeping the
other pads on the canvas intact?
Any help on this issue will be much appreciated. |
Attachment 1: Screenshot-11.png
|
|
173
|
16 Nov 2015 |
Joe Grange | Forum | Running ROME in online mode | Dear Ryu,
Thanks very much, indeed it was user error and I did not set -midas option at the compilation stage.
Joe
Ryu Sawada wrote: | Dear Joe,
Did you run ROMEBuilder for your application with -midas option ?
With this option, MIDAS library is linked to the application for communicating with MIDAS experiments.
Actual connection is done with using a function implemented in the MIDAS library.
This is the code where a ROME application connects to MIDAS.
(You can see this in $ROMESYS/src/ROMEMidasDAQ.cpp)
cm_connect_experiment is implemented in $MIDASSYS/src/midas.c
//______________________________________________________________________________
Bool_t ROMEMidasDAQ::ConnectExperiment(ROMEMidasDAQ *localThis)
{
// Connect to the experiment
#if defined( HAVE_MIDAS )
if (cm_connect_experiment(const_cast<char*>(gROME->GetOnlineHost()),
const_cast<char*>(gROME->GetOnlineExperiment()),
const_cast<char*>(gROME->GetOnlineAnalyzerName()), 0) != SUCCESS) {
ROMEPrint::Error("\nCan not connect to experiment\n");
return kFALSE;
}
Can you check if this function is called by adding
cout<<"HERE"<<endl;
before the 'if' line and compile your application ?
If you didn't use -midas option when you run ROMEBuilder, HAVE_MIDAS will not be defined and cm_connect_experiment will not be called.
When nothing is written in <online> section of XML, I think the application tries to connect to the localhost with the experiment name defined in /etc/exptab.
I didn't mean anything specific about odbedit.
I guess if you can connect the MIDAS system with odbedit, then the system is ready to accept analyzer too.
But you could ask also MIDAS experts about this issue.
Ryu
> Dear Ryu,
>
> Thanks for your response. Unfortunately setting these parameters in the XML file does not change the apparent
> behavior and I still cannot connect to the experiment in online mode. I also notice that other colleagues
> working with independent experiments successfully run ROME in the online mode without setting the parameters
> in the <online> section of the XML file.
>
> Can you tell me how I can verify the system is ready to accept the connection with the odbedit command? I can
> verify all basic information such as experiment name, run number, are as expected but I wonder if you mean
> something more specific.
>
> Thank you,
> Joe |
|
172
|
08 Nov 2015 |
Ryu Sawada | Forum | Running ROME in online mode | Dear Joe,
Did you run ROMEBuilder for your application with -midas option ?
With this option, MIDAS library is linked to the application for communicating with MIDAS experiments.
Actual connection is done with using a function implemented in the MIDAS library.
This is the code where a ROME application connects to MIDAS.
(You can see this in $ROMESYS/src/ROMEMidasDAQ.cpp)
cm_connect_experiment is implemented in $MIDASSYS/src/midas.c
//______________________________________________________________________________
Bool_t ROMEMidasDAQ::ConnectExperiment(ROMEMidasDAQ *localThis)
{
// Connect to the experiment
#if defined( HAVE_MIDAS )
if (cm_connect_experiment(const_cast<char*>(gROME->GetOnlineHost()),
const_cast<char*>(gROME->GetOnlineExperiment()),
const_cast<char*>(gROME->GetOnlineAnalyzerName()), 0) != SUCCESS) {
ROMEPrint::Error("\nCan not connect to experiment\n");
return kFALSE;
}
Can you check if this function is called by adding
cout<<"HERE"<<endl;
before the 'if' line and compile your application ?
If you didn't use -midas option when you run ROMEBuilder, HAVE_MIDAS will not be defined and cm_connect_experiment will not be called.
When nothing is written in <online> section of XML, I think the application tries to connect to the localhost with the experiment name defined in /etc/exptab.
I didn't mean anything specific about odbedit.
I guess if you can connect the MIDAS system with odbedit, then the system is ready to accept analyzer too.
But you could ask also MIDAS experts about this issue.
Ryu
> Dear Ryu,
>
> Thanks for your response. Unfortunately setting these parameters in the XML file does not change the apparent
> behavior and I still cannot connect to the experiment in online mode. I also notice that other colleagues
> working with independent experiments successfully run ROME in the online mode without setting the parameters
> in the <online> section of the XML file.
>
> Can you tell me how I can verify the system is ready to accept the connection with the odbedit command? I can
> verify all basic information such as experiment name, run number, are as expected but I wonder if you mean
> something more specific.
>
> Thank you,
> Joe |
171
|
05 Nov 2015 |
Joe Grange | Forum | Running ROME in online mode | Dear Ryu,
Thanks for your response. Unfortunately setting these parameters in the XML file does not change the apparent
behavior and I still cannot connect to the experiment in online mode. I also notice that other colleagues
working with independent experiments successfully run ROME in the online mode without setting the parameters
in the <online> section of the XML file.
Can you tell me how I can verify the system is ready to accept the connection with the odbedit command? I can
verify all basic information such as experiment name, run number, are as expected but I wonder if you mean
something more specific.
Thank you,
Joe |
170
|
29 Oct 2015 |
Ryu Sawada | Forum | ROME / Argus crashing between runs with MIDAS | Hello,
You can try to set <MidasOnlineCommunicationThread>to be true in your config XML file.
By doing it, the communication with the midas system will be done in a dedicated thread so it runs independently
of analysis tasks.
Ryu
> I'm running ROME+Argus as an online analyzer and display for a MIDAS DAQ system.
> In our set up there is generally a few seconds between MIDAS runs. ROME
> handles the first run just fine, but always crashes when runs are taken in quick
> succession like this. When running in a slower mode, letting ROME finish
> whatever run of end task exist, the online analyzer does not have this problem.
> I've suppressed writing all output files while in the online mode and I don't
> have any end of run operations in any of the tasks. What is happening at the
> end of running that is causing ROME to crash?
>
> Thanks for any help. |
169
|
29 Oct 2015 |
Ryu Sawada | Forum | Running ROME in online mode | Dear Joe
In the online mode, the analyzer does not read midas files.
Instead, it connects to a midas experiment over the network or to the local shared memory.
Same as other midas online applications, you may need to specify the hostname of the midas system and the
experiment name.
You can set the parameters in the <Online> section of your configuration XML file.
Of course, the midas system has to be ready to accept the connection.
You can check it, for example, using 'odbedit' command.
Best regards,
Ryu
> Hi folks,
>
> I've been a happy and successful user of rome in the offline mode for some time,
> and now when I try and connect it to a current run the analyzer does not find
> the current file. I attach a screenshot - you can see when I run the analyzer
> instead of reporting a successful connection to a midas file it says it starts Run
> #-1. I use a file path specified in romeConfig.xml which is successful when I run
> in offline mode but not in online mode, even when I specify the file path with the
> run-time argument -pi. Any ideas what may be the trouble?
>
> I did verify that my romeConfig.xml file specifies the online mode run configuration.
>
> Thanks very much,
> Joe |
168
|
29 Oct 2015 |
Ryu Sawada | Forum | TGraph objects | Hello,
You can find an example in $ROMESYS/examples/histoGUI
Graphs are defined in histoGUI.xml and the data points are set in src/tasks/HGUITFillHisto.cpp
Best regards,
Ryu
> Does anyone have an example of how to add TGraph objects in ROME? We often use these in our MIDAS analyzers to create plots of quantities vs. event number (i.e. bank size, number of triggers, etc). Thanks! |
167
|
26 Oct 2015 |
Konstantin Olchanski | Forum | ROME / Argus crashing between runs with MIDAS | > I'm running ROME+Argus as an online analyzer and display for a MIDAS DAQ system.
> In our set up there is generally a few seconds between MIDAS runs. ROME
> handles the first run just fine, but always crashes when runs are taken in quick
> succession like this. When running in a slower mode, letting ROME finish
> whatever run of end task exist, the online analyzer does not have this problem.
> I've suppressed writing all output files while in the online mode and I don't
> have any end of run operations in any of the tasks. What is happening at the
> end of running that is causing ROME to crash?
>
> Thanks for any help.
You have to provide a stack trace from your crash. RTFM the gdb command "where".
K.O. |
166
|
24 Oct 2015 |
Robert Pattie | Forum | ROME / Argus crashing between runs with MIDAS | I'm running ROME+Argus as an online analyzer and display for a MIDAS DAQ system.
In our set up there is generally a few seconds between MIDAS runs. ROME
handles the first run just fine, but always crashes when runs are taken in quick
succession like this. When running in a slower mode, letting ROME finish
whatever run of end task exist, the online analyzer does not have this problem.
I've suppressed writing all output files while in the online mode and I don't
have any end of run operations in any of the tasks. What is happening at the
end of running that is causing ROME to crash?
Thanks for any help. |
165
|
23 Oct 2015 |
Joe Grange | Forum | Running ROME in online mode | Hi folks,
I've been a happy and successful user of rome in the offline mode for some time,
and now when I try and connect it to a current run the analyzer does not find
the current file. I attach a screenshot - you can see when I run the analyzer
instead of reporting a successful connection to a midas file it says it starts Run
#-1. I use a file path specified in romeConfig.xml which is successful when I run
in offline mode but not in online mode, even when I specify the file path with the
run-time argument -pi. Any ideas what may be the trouble?
I did verify that my romeConfig.xml file specifies the online mode run configuration.
Thanks very much,
Joe |
Attachment 1: Screen_Shot_2015-10-23_at_11.56.12_AM.png
|
|
164
|
23 Oct 2015 |
Wes Gohn | Forum | TGraph objects | Does anyone have an example of how to add TGraph objects in ROME? We often use these in our MIDAS analyzers to create plots of quantities vs. event number (i.e. bank size, number of triggers, etc). Thanks! |
163
|
22 Oct 2015 |
Ryu Sawada | Info | Adding Trees and Branches in ROME | Dear Sudeshna Ganguly
It might be my misunderstanding, but do you mean that you want to add a new branch every time when you take one
event ? (namely, the number of branches n equals to the number of events ?)
In ROME, ( and I guess in most of user applications), each entry in the tree (instead of each branch) refers to one
event. Namely, the number of branches n is independent of the number of events; and the number of entries
increases as you take more events.
In the ROME applications, there is a one to one relation between,
- ROME Folder and Branch in Tree
- ROME Field in Folder and Leave in Tree
ROME folder and field are supposed to be defined in an XML file and the implementation (i.e. conversion to C++ code)
is done by ROMEBuilder.
Folders and fileds can be arrays.
I think, in your case, ROME folder could be like one of the followings depending on your data structure and preference,
Since I guess WFD stands for Wave Form Digitizer and guess has many numbers (instead of one), I expect you may use the 2nd or 3rd example,
1) A single variable 'WFD' is in five 'Data' folder instances
<FolderName>Data</FolderName>
<ArraySize>5</ArraySize>
<Field>
<FieldName>WFD</FieldName>
<FieldType>Double_t</FieldType>
<FieldComment>WFD Values</FieldComment>
</Field>
2) A variable-length array 'WFD' is in five 'Data' folder instances <FolderName>Data</FolderName>
<ArraySize>5</ArraySize>
<Field>
<FieldName>WFD</FieldName>
<FieldType>Double_t</FieldType>
<ArraySize>vector</ArraySize>
<FieldComment>WFD Values</FieldComment>
</Field>
3) A fixed-length array 'WFD' is in five 'Data' folder instances <FolderName>Data</FolderName>
<ArraySize>5</ArraySize>
<Field>
<FieldName>WFD</FieldName>
<FieldType>Double_t</FieldType>
<ArraySize>1024</ArraySize>
<FieldComment>WFD Values</FieldComment>
</Field>
4) An array 'WFD' is in one 'Data' folder instance, and the array size of 'WFD' is five. <FolderName>Data</FolderName>
<Field>
<FieldName>WFD</FieldName>
<FieldType>Double_t</FieldType>
<ArraySize>5</ArraySize>
<FieldComment>WFD Values</FieldComment>
</Field>
Once you add a relation between the 'Data' folder and a branch in a tree (as shown <Tree> section of $ROMESYS/examples/midas/midas.xml),
The generated application,
- reads the tree and copies data in to the folder before every event (if the <DAQSystem> in config XML is rome)
- fills the tree with copying data from the folder
So you don't need to write code to read/write tees.
Instead you need to access the folders.
The access method depends on the folder structure. For the example above,
1) Int_t nCh = 5;
for (Int_t iCh = 0; iCh < nCh; iCh++) {
gAnalyzer->GetDataAt(iCh)->SetWFD(some_number);
}
2) Int_t nCh = 5;
for (Int_t iCh = 0; iCh < nCh; iCh++) {
gAnalyzer->GetDataAt(iCh)->SetWFDSize(1024);
Int_t wfdSize = gAnalyzer->GetDataAt(iCh)->GetWFDSize();
for (Int_t i = 0; i < wfdSize; i++) {
gAnalyzer->GetDataAt(iCh)->SetWFDAt(i, some_number);
}
}
3) Int_t nCh = 5;
for (Int_t iCh = 0; iCh < nCh; iCh++) {
for (Int_t i = 0; i < 1024; i++) {
gAnalyzer->GetDataAt(iCh)->SetWFDAt(i, some_number);
}
}
4) Int_t nCh = 5;
for (Int_t iCh = 0; iCh < nCh; iCh++) {
gAnalyzer->GetData()->SetWFDAt(iCh, some_number);
}
You can read the variables by using GetWFD (or GetWFDAt if WFD is an array) function.
You can find more example of the folder structure in $ROMESYS/examples/argus/folders/folderEntries.xml.
Ryu
> Hi,
>
> I need to add a tree, the tree will have n branches. Each branch will refer to
> one event. Now Each branch will have 5 leaves. Each leaf will have data from one
> WFD channel. There are data from total 5 WFD channels per event in our midas bank.
>
> I have seen some examples of trees and branches in ROME, but I don't know how I
> can loop over one channel to another channel and save those data into each leaf.
>
> Any help will be appreciated greatly.
>
> Sudeshna Ganguly |
162
|
21 Oct 2015 |
SUDESHNA GANGULY | Info | Adding Trees and Branches in ROME | Hi,
I need to add a tree, the tree will have n branches. Each branch will refer to
one event. Now Each branch will have 5 leaves. Each leaf will have data from one
WFD channel. There are data from total 5 WFD channels per event in our midas bank.
I have seen some examples of trees and branches in ROME, but I don't know how I
can loop over one channel to another channel and save those data into each leaf.
Any help will be appreciated greatly.
Sudeshna Ganguly |
161
|
07 Sep 2015 |
Farrukh Azfar | Bug Report | Saving canvas as pdf via a button one vs many pads | Dear Ryu,
thanks very much for trying this out. Perhaps Sudeshna can verify that the problem is still
there in her code or if its fixed ?
- thanks
Farrukh
> Dear Farrukh
>
> I tried your code, but the problem was not reproduced.
> I can save the canvas as attached without crash.
>
> Only the difference from your code is the histograms.
> Since I don't have your task I took and draw 'ADC' histograms from 'FillHistogram' task.
> No other changes were made from your code.
> I edited .h file of the tab from the automatically generated ones.
>
> Ryu
>
>
>
> > Dear Colleagues
> >
> > we have implemented in one of our tabs a button to call a function which saves a
> > canvas to a pdf file with a time date stamp.
> >
> > 1) This works fine when there is only one histogram on the canvas and this code
> > is MIDTBCTab.cpp (attached)
> >
> > 2) When the canvas is divided up into a 5x11 pads with 55 histograms and
> > we want to save the _whole_ canvas with the whole picture (_not_ any individual
> > pads) the code crashes and no file is generated - the tab code is MIDTRCTab.cpp
> > and this is also attached
> >
> > I am wondering what is going on - is there anything obviously wrong ?
> >
> > many thanks
> >
> > Farrukh |
160
|
07 Sep 2015 |
Ryu Sawada | Bug Report | Saving canvas as pdf via a button one vs many pads | Dear Farrukh
I tried your code, but the problem was not reproduced.
I can save the canvas as attached without crash.
Only the difference from your code is the histograms.
Since I don't have your task I took and draw 'ADC' histograms from 'FillHistogram' task.
No other changes were made from your code.
I edited .h file of the tab from the automatically generated ones.
Ryu
> Dear Colleagues
>
> we have implemented in one of our tabs a button to call a function which saves a
> canvas to a pdf file with a time date stamp.
>
> 1) This works fine when there is only one histogram on the canvas and this code
> is MIDTBCTab.cpp (attached)
>
> 2) When the canvas is divided up into a 5x11 pads with 55 histograms and
> we want to save the _whole_ canvas with the whole picture (_not_ any individual
> pads) the code crashes and no file is generated - the tab code is MIDTRCTab.cpp
> and this is also attached
>
> I am wondering what is going on - is there anything obviously wrong ?
>
> many thanks
>
> Farrukh |
Attachment 1: SampleCanvas.20150907.175151.pdf
|
|
159
|
07 Sep 2015 |
Ryu Sawada | Forum | ARGUS display with canvas and pads ... | I found rather easy way for the Method 3 (click on pad).
I implemented in the same example,
namely, the third tab in $ROMESYS/examples/argus/menu.
You can add a macro which is executed when an event occurs on each pad with,
fCanvas->GetCanvas()->GetPad(1)->AddExec("ex1", ".x OpenCanvas.C");
Then you can write any function in the macro.
In this example, it opens a copy of canvas and save the clicked pad into a PDF file.
Ryu
> Dear Farrukh
>
> What you want to do is probably possible ( I will write a possible method later.).
> However TPad has already several mouse operations (zoom, right-click menu, select active pad
and so on); so I am not sure it is the best idea to add own mouse operation (which
> could override other pre-implemented operations.)
> I will write three solutions below.
> I wrote an example of the first method.
>
> == Method 1 : Menu ==
> For this solutions, I modified an example in the ROME package.
> The update is done only in the 'develop' branch.
> You can read the example by 'git checkout develop' command after you clone the ROME package.
> The example is in $ROMESYS/examples/argus/menu and the third tab (T3) is one for that.
> In ROME, you can easily add menu items in the menu bar. In the example, menu items to open and
save a specific tab are prepared.
>
> == Method 2 : dedicated buttons ==
> If you prefer buttons instead of menu, you can put dedicated buttons to trigger "OpenPad" function
in the example instead of adding menus. The buttons can be implemented
> either of the following two methods,
> 1) TGTextButton, which can work as the same way as your Save button
> 2) Writing own class derived from TBox or TMarker. A box or maker can be put on each canvas.
>
> I hope the first method is obvious for you. You can make another button similar to your Save button
and call "OpenPad" function.
>
> The second method is a little more complicated; you make your own class and override
"ExecuteEvent" method.
> In the overriding function, you can call any functions when the box or marker is single-clicked,
double-clicked, mouse-over and so on.
> A disadvantage is that the box or marker is always visible, and will be drawn in the output PDF files
too.
>
> == Method 3: click on Pad ==
> You can probably do what you write with making own class derived from TPad; then you override
"ExecuteEvent" function for calling a function to make a separated canvas and
> draw a clone of itself.
> You may also need own TCanvas and TRootEmbeddedCanvas for using the customized classes
instead of regular TPad and TCanvas.
>
> If you are satisfied with the first method, please try the example.
> The second method with TGTextButton must not be very difficult.
>
> If you prefer the second (using TBox or TMarker) and third method, I will investigate if it is actually
possible.
> For the two methods, I think you need to write your own classes.
>
> Best regards,
>
> Ryu
>
> > Dear Colleagues,
> >
> > We are succesfully running a ROME executable both online and offline with an
> > ARGUS display with a canvas that has multiple pads on it. We have also
> > implemented a "Save" button which one can click on and save the _entire_ canvas
> > (containing all the pads) and saves it to pdf.
> >
> > I was wondering how one would go about making the following modification :
> >
> > When a user moves a mouse over to a particular pad and clicks on it - then only
> > the histogram on that pad is displayed on a separate canvas (so the user can
> > examine it closely) and also save just this one histogram - with a save button
> > similar to the one we've already written.
> >
> > many thanks for any insight
> >
> > Farrukh |
158
|
07 Sep 2015 |
Ryu Sawada | Bug Fix | TMTT3.cpp -offset in index of the pads | Thank you.
You are right.
I modified and pushed the code.
Ryu
> Hi Ryu,
>
> I fixed the problem about the offset in the indexing of the pads. It's just in
> the TMTT3.cpp source code,
> Instead of wrtiting:
> case TMWindow::M_T3_Open_Pad1:
> OpenPad(0);
> break;
> one should write:
>
> case TMWindow::M_T3_Open_Pad1:
> OpenPad(1);
> break; |
157
|
04 Sep 2015 |
SUDESHNA GANGULY | Bug Fix | TMTT3.cpp -offset in index of the pads | Hi Ryu,
I fixed the problem about the offset in the indexing of the pads. It's just in
the TMTT3.cpp source code,
Instead of wrtiting:
case TMWindow::M_T3_Open_Pad1:
OpenPad(0);
break;
one should write:
case TMWindow::M_T3_Open_Pad1:
OpenPad(1);
break; |
156
|
04 Sep 2015 |
SUDESHNA GANGULY | Bug Report | TMTT3.cpp -offset in index of the pads | Hi Ryu,
I have been working with your /rome/examples/argus/menu/tab/TMTT3.cpp cpde and
I've run your menu.xml with a dummy midas file run0001.mid in the offline mode,
and in the AREGUS monitor, when I click on "open and save" menu, it shows
options for 4 pads. But if you click on the first pad, it is empty, if you click
on pad 2, it will have hist1, pad3 has hist2, and pad4 is hist3 and there is no
hist4.
So there is an offset of 1.
In case of my 55 histograms I am getting the same error. I am getting only upto
hist54 (my first hist is called hist00).
Could you please help me with this issue? |
155
|
04 Sep 2015 |
Ryu Sawada | Forum | ARGUS display with canvas and pads ... | Dear Farrukh
The menu items are defined in,
examples/argus/menu/menu.xml, in the part for 'T3' tab.
Did you modify the definition XML for your program ?
Ryu
> Dear Ryu,
>
> we've coded up our own example menu based on what you made for us - and thank you very much
for that - we notice however that the resulting menu is nowhere to be seen on the frame.
>
> When we did buttons we had to associate them with a frame - and I note that there seems to be no
association to a frame in the code you wrote for us - so we never see a menu - is
> this what is to be expceted ?
>
> thanks
> Farrukh
>
> > Hi Ryu
> >
> > thanks very much - I will certainly look at this example. In the meantime we are having some
issues with out save buttons - I will post a thread separately
> > -Farrukh
> >
> > > Dear Farrukh
> > >
> > > What you want to do is probably possible ( I will write a possible method later.).
> > > However TPad has already several mouse operations (zoom, right-click menu, select active pad
and so on); so I am not sure it is the best idea to add own mouse operation (which
> > > could override other pre-implemented operations.)
> > > I will write three solutions below.
> > > I wrote an example of the first method.
> > >
> > > == Method 1 : Menu ==
> > > For this solutions, I modified an example in the ROME package.
> > > The update is done only in the 'develop' branch.
> > > You can read the example by 'git checkout develop' command after you clone the ROME
package.
> > > The example is in $ROMESYS/examples/argus/menu and the third tab (T3) is one for that.
> > > In ROME, you can easily add menu items in the menu bar. In the example, menu items to open
and save a specific tab are prepared.
> > >
> > > == Method 2 : dedicated buttons ==
> > > If you prefer buttons instead of menu, you can put dedicated buttons to trigger "OpenPad"
function in the example instead of adding menus. The buttons can be implemented
> > > either of the following two methods,
> > > 1) TButton, which can work as the same way as your Save button
> > > 2) Writing own class derived from TBox or TMarker. A box or maker can be put on each
canvas.
> > >
> > > I hope the first method is obvious for you. You can make another button similar to your Save
button and call "OpenPad" function.
> > >
> > > The second method is a little more complicated; you make your own class and override
"ExecuteEvent" method.
> > > In the overriding function, you can call any functions when the box or marker is single-clicked,
double-clicked, mouse-over and so on.
> > > A disadvantage is that the box or marker is always visible, and will be drawn in the output PDF
files too.
> > >
> > > == Method 3: click on Pad ==
> > > You can probably do what you write with making own class derived from TPad; then you
override "ExecuteEvent" function for calling a function to make a separated canvas and
> > > draw a clone of itself.
> > > You may also need own TCanvas and TRootEmbeddedCanvas for using the customized classes
instead of regular TPad and TCanvas.
> > >
> > > If you are satisfied with the first method, please try the example.
> > > The second method with TButton must not be very difficult.
> > >
> > > If you prefer the second (using TBox or TMarker) and third method, I will investigate if it is
actually possible.
> > > For the two methods, I think you need to write your own classes.
> > >
> > > Best regards,
> > >
> > > Ryu
> > >
> > > > Dear Colleagues,
> > > >
> > > > We are succesfully running a ROME executable both online and offline with an
> > > > ARGUS display with a canvas that has multiple pads on it. We have also
> > > > implemented a "Save" button which one can click on and save the _entire_ canvas
> > > > (containing all the pads) and saves it to pdf.
> > > >
> > > > I was wondering how one would go about making the following modification :
> > > >
> > > > When a user moves a mouse over to a particular pad and clicks on it - then only
> > > > the histogram on that pad is displayed on a separate canvas (so the user can
> > > > examine it closely) and also save just this one histogram - with a save button
> > > > similar to the one we've already written.
> > > >
> > > > many thanks for any insight
> > > >
> > > > Farrukh |
154
|
04 Sep 2015 |
Farrukh Azfar | Forum | ARGUS display with canvas and pads ... | Dear Ryu,
we've coded up our own example menu based on what you made for us - and thank you very much for that - we notice however that the resulting menu is nowhere to be seen on the frame.
When we did buttons we had to associate them with a frame - and I note that there seems to be no association to a frame in the code you wrote for us - so we never see a menu - is
this what is to be expceted ?
thanks
Farrukh
> Hi Ryu
>
> thanks very much - I will certainly look at this example. In the meantime we are having some issues with out save buttons - I will post a thread separately
> -Farrukh
>
> > Dear Farrukh
> >
> > What you want to do is probably possible ( I will write a possible method later.).
> > However TPad has already several mouse operations (zoom, right-click menu, select active pad and so on); so I am not sure it is the best idea to add own mouse operation (which
> > could override other pre-implemented operations.)
> > I will write three solutions below.
> > I wrote an example of the first method.
> >
> > == Method 1 : Menu ==
> > For this solutions, I modified an example in the ROME package.
> > The update is done only in the 'develop' branch.
> > You can read the example by 'git checkout develop' command after you clone the ROME package.
> > The example is in $ROMESYS/examples/argus/menu and the third tab (T3) is one for that.
> > In ROME, you can easily add menu items in the menu bar. In the example, menu items to open and save a specific tab are prepared.
> >
> > == Method 2 : dedicated buttons ==
> > If you prefer buttons instead of menu, you can put dedicated buttons to trigger "OpenPad" function in the example instead of adding menus. The buttons can be implemented
> > either of the following two methods,
> > 1) TButton, which can work as the same way as your Save button
> > 2) Writing own class derived from TBox or TMarker. A box or maker can be put on each canvas.
> >
> > I hope the first method is obvious for you. You can make another button similar to your Save button and call "OpenPad" function.
> >
> > The second method is a little more complicated; you make your own class and override "ExecuteEvent" method.
> > In the overriding function, you can call any functions when the box or marker is single-clicked, double-clicked, mouse-over and so on.
> > A disadvantage is that the box or marker is always visible, and will be drawn in the output PDF files too.
> >
> > == Method 3: click on Pad ==
> > You can probably do what you write with making own class derived from TPad; then you override "ExecuteEvent" function for calling a function to make a separated canvas and
> > draw a clone of itself.
> > You may also need own TCanvas and TRootEmbeddedCanvas for using the customized classes instead of regular TPad and TCanvas.
> >
> > If you are satisfied with the first method, please try the example.
> > The second method with TButton must not be very difficult.
> >
> > If you prefer the second (using TBox or TMarker) and third method, I will investigate if it is actually possible.
> > For the two methods, I think you need to write your own classes.
> >
> > Best regards,
> >
> > Ryu
> >
> > > Dear Colleagues,
> > >
> > > We are succesfully running a ROME executable both online and offline with an
> > > ARGUS display with a canvas that has multiple pads on it. We have also
> > > implemented a "Save" button which one can click on and save the _entire_ canvas
> > > (containing all the pads) and saves it to pdf.
> > >
> > > I was wondering how one would go about making the following modification :
> > >
> > > When a user moves a mouse over to a particular pad and clicks on it - then only
> > > the histogram on that pad is displayed on a separate canvas (so the user can
> > > examine it closely) and also save just this one histogram - with a save button
> > > similar to the one we've already written.
> > >
> > > many thanks for any insight
> > >
> > > Farrukh |
153
|
04 Sep 2015 |
Ryu Sawada | Forum | ARGUS display with canvas and pads ... | Dear Farrukh
It is not necessary to build in 'develop' branch of ROME.
Ryu
> Hi Ryu
>
> thanks ever so much.
>
> We will modify our code as per your example - is it neccesary to build in development as well or is that only where your example is
>
> -Farrukh
>
> > Dear Farrukh
> >
> > What you want to do is probably possible ( I will write a possible method later.).
> > However TPad has already several mouse operations (zoom, right-click menu, select active pad and so on); so I am not sure it is the best idea to add own mouse operation (which
> > could override other pre-implemented operations.)
> > I will write three solutions below.
> > I wrote an example of the first method.
> >
> > == Method 1 : Menu ==
> > For this solutions, I modified an example in the ROME package.
> > The update is done only in the 'develop' branch.
> > You can read the example by 'git checkout develop' command after you clone the ROME package.
> > The example is in $ROMESYS/examples/argus/menu and the third tab (T3) is one for that.
> > In ROME, you can easily add menu items in the menu bar. In the example, menu items to open and save a specific tab are prepared.
> >
> > == Method 2 : dedicated buttons ==
> > If you prefer buttons instead of menu, you can put dedicated buttons to trigger "OpenPad" function in the example instead of adding menus. The buttons can be implemented
> > either of the following two methods,
> > 1) TGTextButton, which can work as the same way as your Save button
> > 2) Writing own class derived from TBox or TMarker. A box or maker can be put on each canvas.
> >
> > I hope the first method is obvious for you. You can make another button similar to your Save button and call "OpenPad" function.
> >
> > The second method is a little more complicated; you make your own class and override "ExecuteEvent" method.
> > In the overriding function, you can call any functions when the box or marker is single-clicked, double-clicked, mouse-over and so on.
> > A disadvantage is that the box or marker is always visible, and will be drawn in the output PDF files too.
> >
> > == Method 3: click on Pad ==
> > You can probably do what you write with making own class derived from TPad; then you override "ExecuteEvent" function for calling a function to make a separated canvas and
> > draw a clone of itself.
> > You may also need own TCanvas and TRootEmbeddedCanvas for using the customized classes instead of regular TPad and TCanvas.
> >
> > If you are satisfied with the first method, please try the example.
> > The second method with TGTextButton must not be very difficult.
> >
> > If you prefer the second (using TBox or TMarker) and third method, I will investigate if it is actually possible.
> > For the two methods, I think you need to write your own classes.
> >
> > Best regards,
> >
> > Ryu
> >
> > > Dear Colleagues,
> > >
> > > We are succesfully running a ROME executable both online and offline with an
> > > ARGUS display with a canvas that has multiple pads on it. We have also
> > > implemented a "Save" button which one can click on and save the _entire_ canvas
> > > (containing all the pads) and saves it to pdf.
> > >
> > > I was wondering how one would go about making the following modification :
> > >
> > > When a user moves a mouse over to a particular pad and clicks on it - then only
> > > the histogram on that pad is displayed on a separate canvas (so the user can
> > > examine it closely) and also save just this one histogram - with a save button
> > > similar to the one we've already written.
> > >
> > > many thanks for any insight
> > >
> > > Farrukh |
152
|
03 Sep 2015 |
Farrukh Azfar | Forum | ARGUS display with canvas and pads ... | Hi Ryu
thanks ever so much.
We will modify our code as per your example - is it neccesary to build in development as well or is that only where your example is
-Farrukh
> Dear Farrukh
>
> What you want to do is probably possible ( I will write a possible method later.).
> However TPad has already several mouse operations (zoom, right-click menu, select active pad and so on); so I am not sure it is the best idea to add own mouse operation (which
> could override other pre-implemented operations.)
> I will write three solutions below.
> I wrote an example of the first method.
>
> == Method 1 : Menu ==
> For this solutions, I modified an example in the ROME package.
> The update is done only in the 'develop' branch.
> You can read the example by 'git checkout develop' command after you clone the ROME package.
> The example is in $ROMESYS/examples/argus/menu and the third tab (T3) is one for that.
> In ROME, you can easily add menu items in the menu bar. In the example, menu items to open and save a specific tab are prepared.
>
> == Method 2 : dedicated buttons ==
> If you prefer buttons instead of menu, you can put dedicated buttons to trigger "OpenPad" function in the example instead of adding menus. The buttons can be implemented
> either of the following two methods,
> 1) TGTextButton, which can work as the same way as your Save button
> 2) Writing own class derived from TBox or TMarker. A box or maker can be put on each canvas.
>
> I hope the first method is obvious for you. You can make another button similar to your Save button and call "OpenPad" function.
>
> The second method is a little more complicated; you make your own class and override "ExecuteEvent" method.
> In the overriding function, you can call any functions when the box or marker is single-clicked, double-clicked, mouse-over and so on.
> A disadvantage is that the box or marker is always visible, and will be drawn in the output PDF files too.
>
> == Method 3: click on Pad ==
> You can probably do what you write with making own class derived from TPad; then you override "ExecuteEvent" function for calling a function to make a separated canvas and
> draw a clone of itself.
> You may also need own TCanvas and TRootEmbeddedCanvas for using the customized classes instead of regular TPad and TCanvas.
>
> If you are satisfied with the first method, please try the example.
> The second method with TGTextButton must not be very difficult.
>
> If you prefer the second (using TBox or TMarker) and third method, I will investigate if it is actually possible.
> For the two methods, I think you need to write your own classes.
>
> Best regards,
>
> Ryu
>
> > Dear Colleagues,
> >
> > We are succesfully running a ROME executable both online and offline with an
> > ARGUS display with a canvas that has multiple pads on it. We have also
> > implemented a "Save" button which one can click on and save the _entire_ canvas
> > (containing all the pads) and saves it to pdf.
> >
> > I was wondering how one would go about making the following modification :
> >
> > When a user moves a mouse over to a particular pad and clicks on it - then only
> > the histogram on that pad is displayed on a separate canvas (so the user can
> > examine it closely) and also save just this one histogram - with a save button
> > similar to the one we've already written.
> >
> > many thanks for any insight
> >
> > Farrukh |
151
|
03 Sep 2015 |
Farrukh Azfar | Bug Report | Saving canvas as pdf via a button one vs many pads | Dear Colleagues
we have implemented in one of our tabs a button to call a function which saves a
canvas to a pdf file with a time date stamp.
1) This works fine when there is only one histogram on the canvas and this code
is MIDTBCTab.cpp (attached)
2) When the canvas is divided up into a 5x11 pads with 55 histograms and
we want to save the _whole_ canvas with the whole picture (_not_ any individual
pads) the code crashes and no file is generated - the tab code is MIDTRCTab.cpp
and this is also attached
I am wondering what is going on - is there anything obviously wrong ?
many thanks
Farrukh |
Attachment 1: MIDTBCTab.cpp
|
////////////////////////////////////////////////////////////////////////////////
// //
// MIDTBCTab //
// //
// Begin_Html <!--
/*-->
<!--*/
// --> End_Html
// //
// //
////////////////////////////////////////////////////////////////////////////////
/* Generated header file containing necessary includes */
#include "generated/MIDTBCTabGeneratedIncludes.h"
////////////////////////////////////////////////////////////////////////////////
/* This header was generated by ROMEBuilder. Manual changes above the *
* following line will be lost next time ROMEBuilder is executed. */
/////////////////////////////////////----///////////////////////////////////////
#include "generated/MIDWindow.h"
#include "generated/MIDAnalyzer.h"
#include "tabs/MIDTBCTab.h"
#include "tasks/MIDTFillHistogram.h"
#include "TAxis.h"
#include "TLatex.h"
#include <TGClient.h>
#include <TCanvas.h>
#include <TRandom.h>
#include <TGButton.h>
#include <TGFrame.h>
#include <TRootEmbeddedCanvas.h>
#include <RQ_OBJECT.h>
#include<TString.h>
#include<TDatime.h>
// uncomment if you want to include headers of all folders
//#include "MIDAllFolders.h"
ClassImp(MIDTBCTab)
using namespace std;
//______________________________________________________________________________
void MIDTBCTab::Init()
{
// Create style for this tab
TStyle *orgStyle = gStyle;
fStyle = new TStyle(*orgStyle); // copy the original style
fStyle->SetOptTitle(1);
fStyle->SetTitleOffset(0.18, "y");
fStyle->SetPadGridX(1);
fStyle->SetPadGridY(1);
fStyle->SetPadTickX(1);
fStyle->SetPadTickY(1);
fStyle->SetFrameBorderSize(0);
fStyle->SetFrameBorderMode(0);
fStyle->SetFrameFillStyle(0);
fStyle->SetTitleSize(0.06, "t");
fStyle->SetStatH(0.09);
fStyle->SetStatW(0.09);
fStyle->cd();
// Create a vertical frame containing buttons and canvas
fVert = new TGVerticalFrame(this, (UInt_t) (700 * gAnalyzer->GetWindow()->GetWindowScale()), (UInt_t) (700 *gAnalyzer->GetWindow()->GetWindowScale()));
// Create an embedded canvas and add to the main frame, centered in x and y
// TString canvasname = "Sample Canvas";
// set data member
fCanvasName = new TString ("Sample Canvas");
fCanvas = new TRootEmbeddedCanvas(fCanvasName->Data(), fVert, (UInt_t) (600 * gAnalyzer->GetWindow()->GetWindowScale()), (UInt_t) (600 * gAnalyzer->GetWindow()->GetWindowScale()));
fCanvas->GetCanvas()->Divide(1,1);
TLatex title;
title.SetTextFont(12);
title.SetTextSize(0.03);
title.SetNDC();
//Create save button
ULong_t green;
gClient->GetColorByName("Green",green);
fSaveCanvas = new TGTextButton(fVert, "SaveCanvas");
fSaveCanvas->ChangeBackground(green);
fSaveCanvas->Associate(this);
fVert->AddFrame(fSaveCanvas, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
/// Create "Update" button
ULong_t yellow;
gClient->GetColorByName("Yellow",yellow);
fBUpdate = new TGTextButton(fVert, "Update");
fBUpdate->ChangeBackground(yellow);
fBUpdate->Associate(this);
// fVert->AddFrame(fCanvas, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 4, 4, 4, 4));
fVert->AddFrame(fBUpdate, new TGLayoutHints(kLHintsCenterX, 4, 4, 4, 4));
// AddFrame(fVert, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 4, 4, 4, 4));
//Create Exit button
ULong_t red;
gClient->GetColorByName("Red",red);
fExit = new TGTextButton(fVert,"&Exit", "gApplication->Terminate(0)");
fExit->ChangeBackground(red);
fExit->Associate(this);
// fVert->AddFrame(fCanvas, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 4, 4, 4, 4));
fVert->AddFrame(fExit, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
fVert->AddFrame(fCanvas, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 5, 5, 3, 4));
AddFrame(fVert, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 4, 4, 4, 4));
ConnectAll();
orgStyle->cd();
}
//______________________________________________________________________________
void MIDTBCTab::EndInit()
{
}
//______________________________________________________________________________
void MIDTBCTab::EventHandler()
{
}
//______________________________________________________________________________
void MIDTBCTab::MenuClicked(TGPopupMenu * /* menu */, Long_t /* param */)
{
}
//______________________________________________________________________________
void MIDTBCTab::TabSelected()
{
}
//______________________________________________________________________________
void MIDTBCTab::TabUnSelected()
{
}
// Save Canvas:
// you'll need a function of the same signature in your .h -> also make sure that TString is included in your .h
void MIDTBCTab::SaveCanvas()
{
TString * fileName = new TString (fCanvasName->Data());
//replace all spaces in your canvas name
fileName->ReplaceAll(" ", "");
//generate data and time stamp -> Recall you'll have to make sure TDatime is included
TDatime dateTime; // time and date remain frozen when this function was called
TString dateAsString = Form("%d", dateTime.GetDate());
TString timeAsString = Form("%d", dateTime.GetTime());
// append time date etc to canvas name
(*fileName) += ".";
(*fileName) += dateAsString;
(*fileName) += ".";
(*fileName) += timeAsString;
(*fileName) += ".pdf"; // pdf for now maybe think about png and other options for user later ?
// debug
// cout << " This is the filename " << fileName->Data() << endl;
// now print it and hope it works ....
fCanvas->GetCanvas()->Print(fileName->Data());
//cout << " Already attempted to print this file " << fileName->Data() << endl;
}
void MIDTBCTab::Update()
{
TLatex title;
title.SetTextFont(12);
title.SetTextSize(0.03);
title.SetNDC();
TStyle *orgStyle = gStyle;
fStyle->cd();
TH2 *histo;
for (Int_t i = 0; i < 1; i++) {
fCanvas->GetCanvas()->cd(i + 1);
histo = (TH2D *) gAnalyzer->GetFillHistogramTask()->Geth2_dt_tcpgotheaderAt(i);
if (!histo) {
cout << "Histo h2_dt_tcpgotheader not available." << endl;
} else {
histo->SetMarkerColor(1);
histo->GetXaxis()->SetRangeUser(-20000,100000);
histo->Draw("COLZ");
title.SetTextColor(2);
title.SetTextColor(2);
title.DrawLatex(0.01,0.32,"tcp header #rightarrow");
title.SetTextColor(3);
title.DrawLatex(0.01,0.4,"tcp data #rightarrow");
title.SetTextColor(4);
title.DrawLatex(0.01,0.48,"copy to GPU #rightarrow");
title.SetTextColor(5);
title.DrawLatex(0.01,0.56,"GPU processing #rightarrow");
title.SetTextColor(6);
title.DrawLatex(0.01,0.64,"MFE start #rightarrow");
title.SetTextColor(7);
title.DrawLatex(0.01,0.72,"MFE stop #rightarrow");
}
}
fCanvas->GetCanvas()->cd(0);
fCanvas->GetCanvas()->Modified();
fCanvas->GetCanvas()->Update();
orgStyle->cd();
return;
}
//______________________________________________________________________________
void MIDTBCTab::ConnectAll()
{
fBUpdate->Connect("Pressed()", "MIDTBCTab", this, "Update()");
fExit->Connect("Pressed()", "MIDTBCTab", this, "&Exit()");
fSaveCanvas->Connect("Pressed()","MIDTBCTab", this, "SaveCanvas()");
}
//______________________________________________________________________________
void MIDTBCTab::DisconnectAll()
{
if (fBUpdate) { fBUpdate->Disconnect(this); }
if (fExit) { fExit->Disconnect(this); }
if(fSaveCanvas) { fSaveCanvas->Disconnect(this);}
}
|
Attachment 2: MIDTRCTab.cpp
|
////////////////////////////////////////////////////////////////////////////////
// //
// MIDTRCTab //
// //
// Begin_Html <!--
/*-->
<!--*/
// --> End_Html
// //
// //
////////////////////////////////////////////////////////////////////////////////
/* Generated header file containing necessary includes */
#include "generated/MIDTRCTabGeneratedIncludes.h"
////////////////////////////////////////////////////////////////////////////////
/* This header was generated by ROMEBuilder. Manual changes above the *
* following line will be lost next time ROMEBuilder is executed. */
/////////////////////////////////////----///////////////////////////////////////
#include "generated/MIDWindow.h"
#include "generated/MIDAnalyzer.h"
#include "tabs/MIDTRCTab.h"
#include "tasks/MIDTFillHistogramraw.h"
#include "TAxis.h"
#include "TLatex.h"
#include <TGClient.h>
#include <TCanvas.h>
#include <TRandom.h>
#include <TGButton.h>
#include <TGFrame.h>
#include <TRootEmbeddedCanvas.h>
#include <RQ_OBJECT.h>
#include<TString.h>
#include<TDatime.h>
// uncomment if you want to include headers of all folders
#include "MIDAllFolders.h"
ClassImp(MIDTRCTab)
using namespace std;
//______________________________________________________________________________
void MIDTRCTab::Init()
{
// Create style for this tab
TStyle *orgStyle = gStyle;
fStyle = new TStyle(*orgStyle); // copy the original style
fStyle->SetOptTitle(1);
fStyle->SetTitleOffset(0.38, "y");
fStyle->SetPadGridX(1);
fStyle->SetPadGridY(1);
fStyle->SetPadTickX(1);
fStyle->SetPadTickY(1);
fStyle->SetFrameBorderSize(0);
fStyle->SetFrameBorderMode(0);
fStyle->SetFrameFillStyle(0);
fStyle->SetTitleSize(0.06, "t");
fStyle->SetStatH(0.30);
fStyle->SetStatW(0.30);
fStyle->cd();
// Create a vertical frame containing buttons and canvas
fVert = new TGVerticalFrame(this, (UInt_t) (700 * gAnalyzer->GetWindow()->GetWindowScale()), (UInt_t) (700 * gAnalyzer->GetWindow()->GetWindowScale()));
// Create an embedded canvas and add to the main frame, centered in x and y
// set data member
fCanvasName = new TString ("Sample Canvas");
fCanvas = new TRootEmbeddedCanvas("Sample Canvas", fVert, (UInt_t) (600 * gAnalyzer->GetWindow()->GetWindowScale()), (UInt_t) (600 * gAnalyzer->GetWindow()->GetWindowScale()));
fCanvas->GetCanvas()->Divide(5, 11);
// Create "Update" button
ULong_t yellow;
gClient->GetColorByName("Yellow",yellow);
fBUpdate = new TGTextButton(fVert, "Update");
fBUpdate->ChangeBackground(yellow);
fBUpdate->Associate(this);
// fVert->AddFrame(fCanvas, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 4, 4, 4, 4));
fVert->AddFrame(fBUpdate, new TGLayoutHints(kLHintsCenterX, 10, 10, 4, 4));
AddFrame(fVert, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10, 10, 4, 4));
//create Exit button
ULong_t red;
gClient->GetColorByName("Red",red);
fExit = new TGTextButton(fVert, "&Exit", "gApplication->Terminate(0)");
fExit->ChangeBackground(red);
fExit->Associate(this);
fVert->AddFrame(fExit, new TGLayoutHints(kLHintsCenterX, 10, 10, 4, 4));
//create save button
ULong_t green;
gClient->GetColorByName("Green",green);
fSaveCanvas = new TGTextButton(fVert, "SaveCanvas");
fSaveCanvas->ChangeBackground(green);
fSaveCanvas->Associate(this);
fVert->AddFrame(fSaveCanvas, new TGLayoutHints(kLHintsCenterX, 10, 10, 4, 4));
fVert->AddFrame(fCanvas, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 4, 4, 4, 4));
// AddFrame(fVert, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 4, 4, 4, 4));
ConnectAll();
orgStyle->cd();
}
//______________________________________________________________________________
void MIDTRCTab::EndInit()
{
}
//______________________________________________________________________________
void MIDTRCTab::EventHandler()
{
}
//______________________________________________________________________________
void MIDTRCTab::MenuClicked(TGPopupMenu * /* menu */, Long_t /* param */)
{
}
//______________________________________________________________________________
void MIDTRCTab::TabSelected()
{
}
//______________________________________________________________________________
void MIDTRCTab::TabUnSelected()
{
}
// Save Canvas:
// you'll need a function of the same signature in your .h -> also make sure that TString is included in your .h
void MIDTRCTab::SaveCanvas()
{
// if following doesn't work blame Sabato Leo
TString * fileName = new TString (fCanvasName->Data());
//replace all spaces in your canvas name
fileName->ReplaceAll(" ", "");
//generate data and time stamp -> Recall you'll have to make sure TDatime is included
TDatime dateTime; // time and date remain frozen when this function was called
TString dateAsString = Form("%d", dateTime.GetDate());
TString timeAsString = Form("%d", dateTime.GetTime());
// append time date etc to canvas name
(*fileName) += ".";
(*fileName) += dateAsString;
(*fileName) += ".";
(*fileName) += timeAsString;
(*fileName) += ".pdf"; // pdf for now maybe think about png and other options for user later ?
// debug
//cout << " This is the filename " << fileName->Data() << endl;
// now print it and hope it works ....
fCanvas->GetCanvas()->Print(fileName->Data());
// cout << " Already attempted to print this file " << fileName->Data() << endl;
}
void MIDTRCTab::Update()
{
TStyle *orgStyle = gStyle;
fStyle->cd();
TH1 *histo;
for (Int_t i = 0; i < 55; i++) { //loop over all 55 pads
fCanvas->GetCanvas()->cd(i + 1);
histo = (TH1F *) gAnalyzer->GetFillHistogramrawTask()->Geth1_wfAt(i);
if (!histo) {
cout << "Histo ADC not available." << endl;
} else {
histo->Draw();
}
}
fCanvas->GetCanvas()->cd(0);
fCanvas->GetCanvas()->Modified();
fCanvas->GetCanvas()->Update();
orgStyle->cd();
return;
}
//_____________________________________________________________________________\
_
void MIDTRCTab::ConnectAll()
{
fBUpdate->Connect("Pressed()", "MIDTRCTab", this, "Update()");
fExit->Connect("Pressed()", "MIDTRCTab", this, "&Exit()");
fSaveCanvas->Connect("Pressed()","MIDTRCTab", this, "SaveCanvas()");
}
//_____________________________________________________________________________\
_
void MIDTRCTab::DisconnectAll()
{
if (fBUpdate) { fBUpdate->Disconnect(this); }
if (fExit) { fExit->Disconnect(this); }
if(fSaveCanvas) { fSaveCanvas->Disconnect(this);}
}
|
150
|
03 Sep 2015 |
Farrukh Azfar | Forum | ARGUS display with canvas and pads ... | Hi Ryu
thanks very much - I will certainly look at this example. In the meantime we are having some issues with out save buttons - I will post a thread separately
-Farrukh
> Dear Farrukh
>
> What you want to do is probably possible ( I will write a possible method later.).
> However TPad has already several mouse operations (zoom, right-click menu, select active pad and so on); so I am not sure it is the best idea to add own mouse operation (which
> could override other pre-implemented operations.)
> I will write three solutions below.
> I wrote an example of the first method.
>
> == Method 1 : Menu ==
> For this solutions, I modified an example in the ROME package.
> The update is done only in the 'develop' branch.
> You can read the example by 'git checkout develop' command after you clone the ROME package.
> The example is in $ROMESYS/examples/argus/menu and the third tab (T3) is one for that.
> In ROME, you can easily add menu items in the menu bar. In the example, menu items to open and save a specific tab are prepared.
>
> == Method 2 : dedicated buttons ==
> If you prefer buttons instead of menu, you can put dedicated buttons to trigger "OpenPad" function in the example instead of adding menus. The buttons can be implemented
> either of the following two methods,
> 1) TButton, which can work as the same way as your Save button
> 2) Writing own class derived from TBox or TMarker. A box or maker can be put on each canvas.
>
> I hope the first method is obvious for you. You can make another button similar to your Save button and call "OpenPad" function.
>
> The second method is a little more complicated; you make your own class and override "ExecuteEvent" method.
> In the overriding function, you can call any functions when the box or marker is single-clicked, double-clicked, mouse-over and so on.
> A disadvantage is that the box or marker is always visible, and will be drawn in the output PDF files too.
>
> == Method 3: click on Pad ==
> You can probably do what you write with making own class derived from TPad; then you override "ExecuteEvent" function for calling a function to make a separated canvas and
> draw a clone of itself.
> You may also need own TCanvas and TRootEmbeddedCanvas for using the customized classes instead of regular TPad and TCanvas.
>
> If you are satisfied with the first method, please try the example.
> The second method with TButton must not be very difficult.
>
> If you prefer the second (using TBox or TMarker) and third method, I will investigate if it is actually possible.
> For the two methods, I think you need to write your own classes.
>
> Best regards,
>
> Ryu
>
> > Dear Colleagues,
> >
> > We are succesfully running a ROME executable both online and offline with an
> > ARGUS display with a canvas that has multiple pads on it. We have also
> > implemented a "Save" button which one can click on and save the _entire_ canvas
> > (containing all the pads) and saves it to pdf.
> >
> > I was wondering how one would go about making the following modification :
> >
> > When a user moves a mouse over to a particular pad and clicks on it - then only
> > the histogram on that pad is displayed on a separate canvas (so the user can
> > examine it closely) and also save just this one histogram - with a save button
> > similar to the one we've already written.
> >
> > many thanks for any insight
> >
> > Farrukh |
149
|
03 Sep 2015 |
Ryu Sawada | Forum | ARGUS display with canvas and pads ... | Dear Farrukh
What you want to do is probably possible ( I will write a possible method later.).
However TPad has already several mouse operations (zoom, right-click menu, select active pad and so on); so I am not sure it is the best idea to add own mouse operation (which
could override other pre-implemented operations.)
I will write three solutions below.
I wrote an example of the first method.
== Method 1 : Menu ==
For this solutions, I modified an example in the ROME package.
The update is done only in the 'develop' branch.
You can read the example by 'git checkout develop' command after you clone the ROME package.
The example is in $ROMESYS/examples/argus/menu and the third tab (T3) is one for that.
In ROME, you can easily add menu items in the menu bar. In the example, menu items to open and save a specific tab are prepared.
== Method 2 : dedicated buttons ==
If you prefer buttons instead of menu, you can put dedicated buttons to trigger "OpenPad" function in the example instead of adding menus. The buttons can be implemented
either of the following two methods,
1) TGTextButton, which can work as the same way as your Save button
2) Writing own class derived from TBox or TMarker. A box or maker can be put on each canvas.
I hope the first method is obvious for you. You can make another button similar to your Save button and call "OpenPad" function.
The second method is a little more complicated; you make your own class and override "ExecuteEvent" method.
In the overriding function, you can call any functions when the box or marker is single-clicked, double-clicked, mouse-over and so on.
A disadvantage is that the box or marker is always visible, and will be drawn in the output PDF files too.
== Method 3: click on Pad ==
You can probably do what you write with making own class derived from TPad; then you override "ExecuteEvent" function for calling a function to make a separated canvas and
draw a clone of itself.
You may also need own TCanvas and TRootEmbeddedCanvas for using the customized classes instead of regular TPad and TCanvas.
If you are satisfied with the first method, please try the example.
The second method with TGTextButton must not be very difficult.
If you prefer the second (using TBox or TMarker) and third method, I will investigate if it is actually possible.
For the two methods, I think you need to write your own classes.
Best regards,
Ryu
> Dear Colleagues,
>
> We are succesfully running a ROME executable both online and offline with an
> ARGUS display with a canvas that has multiple pads on it. We have also
> implemented a "Save" button which one can click on and save the _entire_ canvas
> (containing all the pads) and saves it to pdf.
>
> I was wondering how one would go about making the following modification :
>
> When a user moves a mouse over to a particular pad and clicks on it - then only
> the histogram on that pad is displayed on a separate canvas (so the user can
> examine it closely) and also save just this one histogram - with a save button
> similar to the one we've already written.
>
> many thanks for any insight
>
> Farrukh |
148
|
02 Sep 2015 |
Farrukh Azfar | Forum | ARGUS display with canvas and pads ... | Dear Colleagues,
We are succesfully running a ROME executable both online and offline with an
ARGUS display with a canvas that has multiple pads on it. We have also
implemented a "Save" button which one can click on and save the _entire_ canvas
(containing all the pads) and saves it to pdf.
I was wondering how one would go about making the following modification :
When a user moves a mouse over to a particular pad and clicks on it - then only
the histogram on that pad is displayed on a separate canvas (so the user can
examine it closely) and also save just this one histogram - with a save button
similar to the one we've already written.
many thanks for any insight
Farrukh |
147
|
15 Jun 2015 |
Ryu Sawada | Bug Report | Problems with programming tabs when using TGraph | Dear Farrukh
If you attach your code related to the problem, I can investigate the problem.
Best regards,
Ryu
Farrukh Azfar wrote: | Hi Ryu,
thanks for your reply. yes I am(was) using it.
Ryu Sawada wrote: | Dear Farrukh
I presume you implemented your tab which draws the graph.
Which option do you use for Draw function of the graph ?
I am afraid you might forget to add 'A' in the option.
For example, you need to use 'A' like,
graph->Draw("APL");
Best regards,
Ryu
> Dear Colleagues,
>
> I have been using the ROME framework and have succesfully implemented a program
> to run on MIDAS input and plot histograms.
>
> Not satisfied with the default settings of the Canvas, pads and text sizes etc I
> consulted Ryu who kindly showed me how to implement the event and init and update
> methods in the Tabs to bring the display closer to what I needed.
>
> This has worked fine with histograms. However not with TGraphs:
>
> I noticed that if I implemented the plotting of the TGraphs in the tab class then
> after setting points in the TGraph in the Fill tasks the Tab classes plot was
> empty -> is there something peculiar about TGraph ? Any tips would be great !
>
> many thanks
> Farrukh Azfar |
|
|
146
|
15 Jun 2015 |
Ryu Sawada | Info | ROME examples : histoGUI | Dear Farrukh
ProcessEvents is nothing to do with ROME.
It is a ROOT function to process events called by timer, click, sockets etc.
"event" is not MIDAS event, but for example, an event where someone clicked a button.
For example, if you click an "update" button, ROOT needs to call a function connected to the button; ProcessEvents does the job.
So if you want to use the GUI during the sleep of a task, you need to call ProcessEvents sometimes.
https://root.cern.ch/root/html604/TSystem.html#TSystem:ProcessEvents
You need not to overwrite ProcessEvents.
Best regards,
Ryu
Farrukh Azfar wrote: | Dear Ryu,
many thanks for your reply that's very useful.
For my knowledge and for the sake of understanding the basics.
1) Its the line : gSystem->ProcessEvents(); that calls all the event methods in the Fill classes and the Tabs classes yes ?
2) This way I am controlling the filling of the tabs at an interval regulated by "sleep" then what has happened to the program itself calling ProcessEvents ? Have I overriden that call by calling ProcessEvents or will it continue to be called - perhaps I just set the <UpdateFrequency> 0</UpdateFrequency> to disable the programs own calling and only use mine ?
I hope I've been clear. Thanks very much for your continued help.
-Farrukh
Ryu Sawada wrote: | Dear Farrukh
If you want to control the frequency of update of all tabs, maybe, you could use the same method (namely using 'none' DAQ') for calling event methods of tasks and tabs also for non-event based
application.
You may add a task in which you only call 'sleep' function for controlling the frequency.
For allowing you to use GUI buttons also during the sleep, you need to call the sleep function like following.
ProcessEvents function allows you to use GUI parts also during the sleep.
Int_t sec = GetSP()->GetSleepTime();
if (sec > 0) {
struct timespec req, rem;
req.tv_sec = 0;
req.tv_nsec = 100000000; // sleep time in loop
struct timeval endTime, currentTime;
gettimeofday(¤tTime, 0);
endTime.tv_sec = currentTime.tv_sec + sec;
endTime.tv_usec = currentTime.tv_usec;
int ret;
while(1) {
memset(&rem, 0, sizeof(rem));
ret = nanosleep(&req, &rem);
gettimeofday(¤tTime, 0);
if (currentTime.tv_sec > endTime.tv_sec ||
(currentTime.tv_sec == endTime.tv_sec && currentTime.tv_usec > endTime.tv_usec)) {
break;
}
gSystem->ProcessEvents();
}
}
gettimeofday is defined in sys/time.h header file in UNIX-like OS.
gSystem is in TSystem.h
For controlling the frequency, in this example, I added a new steering parameter for the task, which is defined like,
<Task>
... other definition of tasks ...
<SteeringParameters>
<SteeringParameterField>
<SPFieldName>SleepTime</SPFieldName>
<SPFieldType>Int_t</SPFieldType>
<SPFieldInitialization>10</SPFieldInitialization>
<SPFieldComment>Sleep time in sec</SPFieldComment>
</SteeringParameterField>
</SteeringParameters>
</Task>
Best regards,
Ryu
> Dear Farrukh
>
> The 'histoGUI' example was prepared as an example for displaying histograms.
> And the data are generated randomly in FillHisto task instead of reading from an input file.
> So the example is using 'none' DAQ as written in romeConfig.xml in the example; the DAQ class is
> implemented in include/ROMENoDAQSystem.h, and it actually does nothing.
>
> With 'none' DAQ, the program simply call Event method continuously without any control of the frequency.
>
> When you run the example, the frequency is not so fast because the CPU is used for updating the display.
> If you change <UpdateFrequency>, for example, to 10000, you will find the frequency of events through
> the task is increased because you update the display with a less frequency (thus lower CPU power is
> needed).
>
> If you are going to use ROME for non-event based application, there are two ways to call some functions
> defined in tabs.
> 1) With GUI parts, like buttons, menus, sliders and so on
> 2) With calling a function periodically.
>
> 1) is suitable if you want to actively control the GUI; a user needs to, for example, click a button for
> operate the tab.
>
> 2) is suitable if you want to update the display without any operations.
> You can see examples/argus/timer/ and examples/argus/thread as examples.
>
> Best regards,
>
> Ryu
>
> > Dear Colleagues,
> >
> > I have succesfully written a ROME application for monitoring MIDAS events and
> > understand that the appearance of a new MIDAS event record triggers the calling
> > of the event method in the Fill Histogram task.
> >
> > My two questions are however about the example in $ROMESYS/example/histoGUI -
> >
> > 1) In this example there is no MIDAS event nor event record - what then is
> > triggering the calling of the event method
> >
> > 2) Is it possible to regulate the frequency that the event method is called in
> > this example ?
> >
> > best wishes
> > Farrukh Azfar |
|
|
Draft
|
13 Jun 2015 |
Farrukh Azfar | Bug Report | Problems with programming tabs when using TGraph | Hi Ryu,
thanks for your reply. yes I am(was) using it.
Ryu Sawada wrote: | Dear Farrukh
I presume you implemented your tab which draws the graph.
Which option do you use for Draw function of the graph ?
I am afraid you might forget to add 'A' in the option.
For example, you need to use 'A' like,
graph->Draw("APL");
Best regards,
Ryu
> Dear Colleagues,
>
> I have been using the ROME framework and have succesfully implemented a program
> to run on MIDAS input and plot histograms.
>
> Not satisfied with the default settings of the Canvas, pads and text sizes etc I
> consulted Ryu who kindly showed me how to implement the event and init and update
> methods in the Tabs to bring the display closer to what I needed.
>
> This has worked fine with histograms. However not with TGraphs:
>
> I noticed that if I implemented the plotting of the TGraphs in the tab class then
> after setting points in the TGraph in the Fill tasks the Tab classes plot was
> empty -> is there something peculiar about TGraph ? Any tips would be great !
>
> many thanks
> Farrukh Azfar |
|
144
|
13 Jun 2015 |
Farrukh Azfar | Info | ROME examples : histoGUI | Dear Ryu,
many thanks for your reply that's very useful.
For my knowledge and for the sake of understanding the basics.
1) Its the line : gSystem->ProcessEvents(); that calls all the event methods in the Fill classes and the Tabs classes yes ?
2) This way I am controlling the filling of the tabs at an interval regulated by "sleep" then what has happened to the program itself calling ProcessEvents ? Have I overriden that call by calling ProcessEvents or will it continue to be called - perhaps I just set the <UpdateFrequency> 0</UpdateFrequency> to disable the programs own calling and only use mine ?
I hope I've been clear. Thanks very much for your continued help.
-Farrukh
Ryu Sawada wrote: | Dear Farrukh
If you want to control the frequency of update of all tabs, maybe, you could use the same method (namely using 'none' DAQ') for calling event methods of tasks and tabs also for non-event based
application.
You may add a task in which you only call 'sleep' function for controlling the frequency.
For allowing you to use GUI buttons also during the sleep, you need to call the sleep function like following.
ProcessEvents function allows you to use GUI parts also during the sleep.
Int_t sec = GetSP()->GetSleepTime();
if (sec > 0) {
struct timespec req, rem;
req.tv_sec = 0;
req.tv_nsec = 100000000; // sleep time in loop
struct timeval endTime, currentTime;
gettimeofday(¤tTime, 0);
endTime.tv_sec = currentTime.tv_sec + sec;
endTime.tv_usec = currentTime.tv_usec;
int ret;
while(1) {
memset(&rem, 0, sizeof(rem));
ret = nanosleep(&req, &rem);
gettimeofday(¤tTime, 0);
if (currentTime.tv_sec > endTime.tv_sec ||
(currentTime.tv_sec == endTime.tv_sec && currentTime.tv_usec > endTime.tv_usec)) {
break;
}
gSystem->ProcessEvents();
}
}
gettimeofday is defined in sys/time.h header file in UNIX-like OS.
gSystem is in TSystem.h
For controlling the frequency, in this example, I added a new steering parameter for the task, which is defined like,
<Task>
... other definition of tasks ...
<SteeringParameters>
<SteeringParameterField>
<SPFieldName>SleepTime</SPFieldName>
<SPFieldType>Int_t</SPFieldType>
<SPFieldInitialization>10</SPFieldInitialization>
<SPFieldComment>Sleep time in sec</SPFieldComment>
</SteeringParameterField>
</SteeringParameters>
</Task>
Best regards,
Ryu
> Dear Farrukh
>
> The 'histoGUI' example was prepared as an example for displaying histograms.
> And the data are generated randomly in FillHisto task instead of reading from an input file.
> So the example is using 'none' DAQ as written in romeConfig.xml in the example; the DAQ class is
> implemented in include/ROMENoDAQSystem.h, and it actually does nothing.
>
> With 'none' DAQ, the program simply call Event method continuously without any control of the frequency.
>
> When you run the example, the frequency is not so fast because the CPU is used for updating the display.
> If you change <UpdateFrequency>, for example, to 10000, you will find the frequency of events through
> the task is increased because you update the display with a less frequency (thus lower CPU power is
> needed).
>
> If you are going to use ROME for non-event based application, there are two ways to call some functions
> defined in tabs.
> 1) With GUI parts, like buttons, menus, sliders and so on
> 2) With calling a function periodically.
>
> 1) is suitable if you want to actively control the GUI; a user needs to, for example, click a button for
> operate the tab.
>
> 2) is suitable if you want to update the display without any operations.
> You can see examples/argus/timer/ and examples/argus/thread as examples.
>
> Best regards,
>
> Ryu
>
> > Dear Colleagues,
> >
> > I have succesfully written a ROME application for monitoring MIDAS events and
> > understand that the appearance of a new MIDAS event record triggers the calling
> > of the event method in the Fill Histogram task.
> >
> > My two questions are however about the example in $ROMESYS/example/histoGUI -
> >
> > 1) In this example there is no MIDAS event nor event record - what then is
> > triggering the calling of the event method
> >
> > 2) Is it possible to regulate the frequency that the event method is called in
> > this example ?
> >
> > best wishes
> > Farrukh Azfar |
|
143
|
11 Jun 2015 |
Ryu Sawada | Info | ROME examples : histoGUI | Dear Farrukh
If you want to control the frequency of update of all tabs, maybe, you could use the same method (namely using 'none' DAQ') for calling event methods of tasks and tabs also for non-event based
application.
You may add a task in which you only call 'sleep' function for controlling the frequency.
For allowing you to use GUI buttons also during the sleep, you need to call the sleep function like following.
ProcessEvents function allows you to use GUI parts also during the sleep.
Int_t sec = GetSP()->GetSleepTime();
if (sec > 0) {
struct timespec req, rem;
req.tv_sec = 0;
req.tv_nsec = 100000000; // sleep time in loop
struct timeval endTime, currentTime;
gettimeofday(¤tTime, 0);
endTime.tv_sec = currentTime.tv_sec + sec;
endTime.tv_usec = currentTime.tv_usec;
int ret;
while(1) {
memset(&rem, 0, sizeof(rem));
ret = nanosleep(&req, &rem);
gettimeofday(¤tTime, 0);
if (currentTime.tv_sec > endTime.tv_sec ||
(currentTime.tv_sec == endTime.tv_sec && currentTime.tv_usec > endTime.tv_usec)) {
break;
}
gSystem->ProcessEvents();
}
}
gettimeofday is defined in sys/time.h header file in UNIX-like OS.
gSystem is in TSystem.h
For controlling the frequency, in this example, I added a new steering parameter for the task, which is defined like,
<Task>
... other definition of tasks ...
<SteeringParameters>
<SteeringParameterField>
<SPFieldName>SleepTime</SPFieldName>
<SPFieldType>Int_t</SPFieldType>
<SPFieldInitialization>10</SPFieldInitialization>
<SPFieldComment>Sleep time in sec</SPFieldComment>
</SteeringParameterField>
</SteeringParameters>
</Task>
Best regards,
Ryu
> Dear Farrukh
>
> The 'histoGUI' example was prepared as an example for displaying histograms.
> And the data are generated randomly in FillHisto task instead of reading from an input file.
> So the example is using 'none' DAQ as written in romeConfig.xml in the example; the DAQ class is
> implemented in include/ROMENoDAQSystem.h, and it actually does nothing.
>
> With 'none' DAQ, the program simply call Event method continuously without any control of the frequency.
>
> When you run the example, the frequency is not so fast because the CPU is used for updating the display.
> If you change <UpdateFrequency>, for example, to 10000, you will find the frequency of events through
> the task is increased because you update the display with a less frequency (thus lower CPU power is
> needed).
>
> If you are going to use ROME for non-event based application, there are two ways to call some functions
> defined in tabs.
> 1) With GUI parts, like buttons, menus, sliders and so on
> 2) With calling a function periodically.
>
> 1) is suitable if you want to actively control the GUI; a user needs to, for example, click a button for
> operate the tab.
>
> 2) is suitable if you want to update the display without any operations.
> You can see examples/argus/timer/ and examples/argus/thread as examples.
>
> Best regards,
>
> Ryu
>
> > Dear Colleagues,
> >
> > I have succesfully written a ROME application for monitoring MIDAS events and
> > understand that the appearance of a new MIDAS event record triggers the calling
> > of the event method in the Fill Histogram task.
> >
> > My two questions are however about the example in $ROMESYS/example/histoGUI -
> >
> > 1) In this example there is no MIDAS event nor event record - what then is
> > triggering the calling of the event method
> >
> > 2) Is it possible to regulate the frequency that the event method is called in
> > this example ?
> >
> > best wishes
> > Farrukh Azfar |
142
|
11 Jun 2015 |
Konstantin Olchanski | Info | ROME examples : histoGUI | > I have succesfully written a ROME application ...
For the record, at TRIUMF we have moved away from ROME towards the ROOTANA ROOT-based analyzer
package which has some simple C++ classes for reading midas raw data, some simple classes and examples for
working with midas data in ROOT, and some fairly advanced graphical example applications.
https://bitbucket.org/tmidas/rootana
K.O. |
141
|
11 Jun 2015 |
Ryu Sawada | Bug Report | Problems with programming tabs when using TGraph | Dear Farrukh
I presume you implemented your tab which draws the graph.
Which option do you use for Draw function of the graph ?
I am afraid you might forget to add 'A' in the option.
For example, you need to use 'A' like,
graph->Draw("APL");
Best regards,
Ryu
> Dear Colleagues,
>
> I have been using the ROME framework and have succesfully implemented a program
> to run on MIDAS input and plot histograms.
>
> Not satisfied with the default settings of the Canvas, pads and text sizes etc I
> consulted Ryu who kindly showed me how to implement the event and init and update
> methods in the Tabs to bring the display closer to what I needed.
>
> This has worked fine with histograms. However not with TGraphs:
>
> I noticed that if I implemented the plotting of the TGraphs in the tab class then
> after setting points in the TGraph in the Fill tasks the Tab classes plot was
> empty -> is there something peculiar about TGraph ? Any tips would be great !
>
> many thanks
> Farrukh Azfar |
140
|
11 Jun 2015 |
Ryu Sawada | Info | ROME examples : histoGUI | Dear Farrukh
The 'histoGUI' example was prepared as an example for displaying histograms.
And the data are generated randomly in FillHisto task instead of reading from an input file.
So the example is using 'none' DAQ as written in romeConfig.xml in the example; the DAQ class is
implemented in include/ROMENoDAQSystem.h, and it actually does nothing.
With 'none' DAQ, the program simply call Event method continuously without any control of the frequency.
When you run the example, the frequency is not so fast because the CPU is used for updating the display.
If you change <UpdateFrequency>, for example, to 10000, you will find the frequency of events through
the task is increased because you update the display with a less frequency (thus lower CPU power is
needed).
If you are going to use ROME for non-event based application, there are two ways to call some functions
defined in tabs.
1) With GUI parts, like buttons, menus, sliders and so on
2) With calling a function periodically.
1) is suitable if you want to actively control the GUI; a user needs to, for example, click a button for
operate the tab.
2) is suitable if you want to update the display without any operations.
You can see examples/argus/timer/ and examples/argus/thread as examples.
Best regards,
Ryu
> Dear Colleagues,
>
> I have succesfully written a ROME application for monitoring MIDAS events and
> understand that the appearance of a new MIDAS event record triggers the calling
> of the event method in the Fill Histogram task.
>
> My two questions are however about the example in $ROMESYS/example/histoGUI -
>
> 1) In this example there is no MIDAS event nor event record - what then is
> triggering the calling of the event method
>
> 2) Is it possible to regulate the frequency that the event method is called in
> this example ?
>
> best wishes
> Farrukh Azfar |
139
|
09 Jun 2015 |
Farrukh Azfar | Bug Report | Problems with programming tabs when using TGraph | Dear Colleagues,
I have been using the ROME framework and have succesfully implemented a program
to run on MIDAS input and plot histograms.
Not satisfied with the default settings of the Canvas, pads and text sizes etc I
consulted Ryu who kindly showed me how to implement the event and init and update
methods in the Tabs to bring the display closer to what I needed.
This has worked fine with histograms. However not with TGraphs:
I noticed that if I implemented the plotting of the TGraphs in the tab class then
after setting points in the TGraph in the Fill tasks the Tab classes plot was
empty -> is there something peculiar about TGraph ? Any tips would be great !
many thanks
Farrukh Azfar |
138
|
09 Jun 2015 |
Farrukh Azfar | Info | ROME examples : histoGUI | Dear Colleagues,
I have succesfully written a ROME application for monitoring MIDAS events and
understand that the appearance of a new MIDAS event record triggers the calling
of the event method in the Fill Histogram task.
My two questions are however about the example in $ROMESYS/example/histoGUI -
1) In this example there is no MIDAS event nor event record - what then is
triggering the calling of the event method
2) Is it possible to regulate the frequency that the event method is called in
this example ?
best wishes
Farrukh Azfar |
137
|
09 Jun 2008 |
Stefan Ritt | Forum | Rome License | > I was wondering what type of license, if any, applies to the Rome distribution.
> Midas is using GPL and Root is using LGPL.
Midas uses GPL because when I started that project, the LGPL was not yet in
existence. If anybody want Midas under the LGPL, I could consider switching that.
ROME is under the LGPL. |
136
|
06 Jun 2008 |
Todd Bredeweg | Forum | Rome License | I was wondering what type of license, if any, applies to the Rome distribution.
Midas is using GPL and Root is using LGPL. |
135
|
18 Apr 2007 |
Ryu Sawada | Info | I/O system change | I changed default type of dictionaries. By this change we use new I/O system introduced at ROOT version 3.
A newly generated program can not read old files created by old programs by default. Error messages like following will be shown.Error in <TBuffer::CheckByteCount>: object of class PMTData read too few bytes: 21 instead of 169
There is one flag to avoid this problem. When <DictionaryType> in <Experiment> is 0, romebuilder will
generate a program with old dictionary type.
<Experiment>
<ExperimentName>MEG Analysis and monitor.</ExperimentName>
<ExperimentShortCut>MEG</ExperimentShortCut>
<ProgramName>Analyzer</ProgramName>
<ProgramDefinitionVersion>3</ProgramDefinitionVersion>
<FrameworkDescription>MEGAnalyzer is an analysis framework for MEG. It works as monitor as well.</FrameworkDescription>
<DictionaryType>0</DictionaryType> <!-- Add this line -->
</Experiment>
During development stage of version 2.9, we will check if there are problems in the new I/O system.
If we don't find any problems, The new I/O system will be the default of ROME version 2.9.
Even if we change the default, users can continue using the old I/O by using the flag. |
134
|
28 Feb 2007 |
Ryu Sawada | Forum | Duplicate header file | > > > > I just started using Rome v2.7 and Root v5.14.00. I have run into a rather
> > > > interesting issue trying to compile my analyzer. I tracked the problem to the
> > > > fact that both Root and Rome are loading their own version of a header file
> > > > called TArrayL64.h.
> >
> > I have just run into the TArrayL64.h problem myself. I recommend that we resolve
> > the clashing header files. We could ask Rene Brun to rename his file or we could
> > rename the clashing file in Rome.
> >
> > K.O.
>
> As Matthias mensioned, this problem is solved in SVN version of ROME.
> I propose to release ROME version 2.8, which will not have this problem.
>
> If there are users who want to continue to use 2.7, we could also release patch release of 2.7. (2.7.1), in which only compatibility problems
> are fixed.
I prepared a new release 2.8. It can be downloaded from http://midas.psi.ch/rome/download.html
The new release works with also ROOT 5.14 or 5.15.
At this release, style of configuration file was changed. Please see following message for details.
https://ladd00.triumf.ca/elog/Rome/129 |
133
|
28 Feb 2007 |
Ryu Sawada | Forum | Duplicate header file | > > > I just started using Rome v2.7 and Root v5.14.00. I have run into a rather
> > > interesting issue trying to compile my analyzer. I tracked the problem to the
> > > fact that both Root and Rome are loading their own version of a header file
> > > called TArrayL64.h.
>
> I have just run into the TArrayL64.h problem myself. I recommend that we resolve
> the clashing header files. We could ask Rene Brun to rename his file or we could
> rename the clashing file in Rome.
>
> K.O.
As Matthias mensioned, this problem is solved in SVN version of ROME.
I propose to release ROME version 2.8, which will not have this problem.
If there are users who want to continue to use 2.7, we could also release patch release of 2.7. (2.7.1), in which only compatibility problems
are fixed.
Ryu |
132
|
23 Feb 2007 |
Konstantin Olchanski | Forum | Duplicate header file | > > I just started using Rome v2.7 and Root v5.14.00. I have run into a rather
> > interesting issue trying to compile my analyzer. I tracked the problem to the
> > fact that both Root and Rome are loading their own version of a header file
> > called TArrayL64.h.
I have just run into the TArrayL64.h problem myself. I recommend that we resolve
the clashing header files. We could ask Rene Brun to rename his file or we could
rename the clashing file in Rome.
K.O. |
131
|
23 Feb 2007 |
Matthias Schneebeli | Forum | Duplicate header file | > I just started using Rome v2.7 and Root v5.14.00. I have run into a rather
> interesting issue trying to compile my analyzer. I tracked the problem to the
> fact that both Root and Rome are loading their own version of a header file
> called TArrayL64.h. The content of the two files are essentially identical. I
> solved the problem by changing the conditional at the start of the file
> $ROMESYS/include/TArrayL64.h from
>
> #ifndef TArrayL64_H
> #define TArrayL64_H
>
> to
>
> #ifndef ROOT_TArrayL64
> #define ROOT_TArrayL64
>
> The latter is what I found in the Root version of the file. Now it only gets
> loaded once. I looked at the svn sources that I just updated and it also uses
> TArrayL64_H.
>
> Question, why are there two copies.
>
> UPDATE 2-21-07:
> It seems that Root was the cause of this. Rome has used this header for some
> time, but earlier versions of Root did not include it.
As you already mentioned the older root version didn't include this header. But we
needed to include it in rome earlier. Now we still have it in the rome
distribution to be compatible with the older root versions.
There should not be any problem with this header in the current rome version. If
you have compilation problems do a make distclean and try again. |
130
|
20 Feb 2007 |
Todd Bredeweg | | Duplicate header file | I just started using Rome v2.7 and Root v5.14.00. I have run into a rather
interesting issue trying to compile my analyzer. I tracked the problem to the
fact that both Root and Rome are loading their own version of a header file
called TArrayL64.h. The content of the two files are essentially identical. I
solved the problem by changing the conditional at the start of the file
$ROMESYS/include/TArrayL64.h from
#ifndef TArrayL64_H
#define TArrayL64_H
to
#ifndef ROOT_TArrayL64
#define ROOT_TArrayL64
The latter is what I found in the Root version of the file. Now it only gets
loaded once. I looked at the svn sources that I just updated and it also uses
TArrayL64_H.
Question, why are there two copies.
UPDATE 2-21-07:
It seems that Root was the cause of this. Rome has used this header for some
time, but earlier versions of Root did not include it. |
129
|
20 Nov 2006 |
Matthias Schneebeli | Info | *** Important *** : Format of configuration file changed | The format of the configuration file has changed starting with rev. 1545. The
configuration files produced by an older version of rome are not anymore
compatible with the new versions of rome.
Please convert your configuration files with the converter program added under
/rome/tools/ConvertConfig/
Matthias |
128
|
07 Jul 2006 |
Ryu Sawada | Forum | ROME analyzer crashes on reading midas file. | I have tested midas file reading on 64 bit CPU. And there was no problem.
My environment is
-- Wring
Linux 2.6.9 SMP pentium4 32bit
ROOT v5.11/06 32 bit
MIDAS rev.3165 32 bit
midas files was written by frontend in midas/examples/experiment
-- Reading
Linux 2.6.17 SMP x86_64 AMD dual-core Athlon 64bit
ROME rev.1223 64 bit
ROOT v5.08/00b 64 bit
midas file was compressed with gzip 1.3.3 |
127
|
04 Jul 2006 |
Matthias Schneebeli | Forum | ROME analyzer crashes on reading midas file. | From the error message I don't see where the problem is.
Are you sure that your midas file is ok?
You can send me the xml definition file, all source files of your project and the midas file. Then I will take a look at it.
Matthias
Steven Sheets wrote: | Hello,
So I'm stuck on this problem. The ROME based analyzer I use crashes everytime it attempts to open a midas file giving me this error:
Reading Midas-File /home/sheets4/run04750.mid.gz
*** Break *** segmentation violation
Generating stack trace...
0x00002b93efa9cd5c in gzread + 0xfc from /home/sheets4/root/lib/libCore.so
0x00000000004c47d9 in ROMEMidasDAQ::Event(long long) + 0x165 from ./danceanalyzer.exe
0x00000000004c452e in ROMEMidasDAQ::BeginOfRun() + 0x534 from ./danceanalyzer.exe
0x00000000004bf3da in ROMEDAQSystem::BeginOfRunDAQ() + 0x32 from ./danceanalyzer.exe
0x00000000004c1555 in ROMEEventLoop::DAQBeginOfRun(long long) + 0x15d from ./danceanalyzer.exe
0x00000000004c0721 in ROMEEventLoop::ExecuteTask(char const*) + 0x2d5 from ./danceanalyzer.exe
0x00000000004bb395 in ROMEAnalyzer::Start(int, char**) + 0x35d from ./danceanalyzer.exe
0x00000000005d121d in main + 0x2b1 from ./danceanalyzer.exe
0x000000363331c4bb in __libc_start_main + 0xdb from /lib64/tls/libc.so.6
0x00000000004b2e1a in TApplicationImp::ShowMembers(TMemberInspector&, char*) + 0x82 from ./danceanalyzer.exe
Aborted
I'd guess the problem is connected with ROOT but I'm not sure how to fix it.
I run ROOT v5.10.00
ROME v2.4
on a machine with Dual AMD opterons, 64 Bit with Red Hat Enterprise.
Any help would be appreciated.
thanks,
Steven |
|
126
|
29 Jun 2006 |
Steven Sheets | Forum | ROME analyzer crashes on reading midas file. | Hello,
So I'm stuck on this problem. The ROME based analyzer I use crashes everytime it attempts to open a midas file giving me this error:
Reading Midas-File /home/sheets4/run04750.mid.gz
*** Break *** segmentation violation
Generating stack trace...
0x00002b93efa9cd5c in gzread + 0xfc from /home/sheets4/root/lib/libCore.so
0x00000000004c47d9 in ROMEMidasDAQ::Event(long long) + 0x165 from ./danceanalyzer.exe
0x00000000004c452e in ROMEMidasDAQ::BeginOfRun() + 0x534 from ./danceanalyzer.exe
0x00000000004bf3da in ROMEDAQSystem::BeginOfRunDAQ() + 0x32 from ./danceanalyzer.exe
0x00000000004c1555 in ROMEEventLoop::DAQBeginOfRun(long long) + 0x15d from ./danceanalyzer.exe
0x00000000004c0721 in ROMEEventLoop::ExecuteTask(char const*) + 0x2d5 from ./danceanalyzer.exe
0x00000000004bb395 in ROMEAnalyzer::Start(int, char**) + 0x35d from ./danceanalyzer.exe
0x00000000005d121d in main + 0x2b1 from ./danceanalyzer.exe
0x000000363331c4bb in __libc_start_main + 0xdb from /lib64/tls/libc.so.6
0x00000000004b2e1a in TApplicationImp::ShowMembers(TMemberInspector&, char*) + 0x82 from ./danceanalyzer.exe
Aborted
I'd guess the problem is connected with ROOT but I'm not sure how to fix it.
I run ROOT v5.10.00
ROME v2.4
on a machine with Dual AMD opterons, 64 Bit with Red Hat Enterprise.
Any help would be appreciated.
thanks,
Steven |
124
|
09 Jun 2006 |
Ryu Sawada | Bug Fix | Unable to run rome analyzer from crontab | I have made modification on batch mode and daemon mode at rev.1129, 1136 and 1137.
The difference of daemon and batch mode is written in ROME homepage
http://midas.psi.ch/rome/usersGuide.html#fwcommandline
You can disable all graphics with -ng option explicitly. And when ROME failed to open display, it goes into
no graphics mode automatically.
Please try. And please report when you still have a problem.
> (sorry for top-reply- I am trying to avoid elcode garbling my answer)
>
> In the past, I have seen problems like yours, there are at least two issues:
>
> 1) "non interactive" ROOT running from cron or some other incomplete user
> environment (no DISPLAY, no tty, no user)- a hello world script runs, but large
> app does not, because some silly class somewhere requires an X11 connection. I
> once had to fake it by running Xvnc and telling the cron jobs to use it as a
> DISPLAY. I know ROOT now have a "dummy" graphics module exactly for this
> purpose. I do not know how to activate it from the Rome environement, but I am
> sure it is documented somewhere on the ROOT web site.
>
> 2) some programs coming from the MIDAS family assume existance of a keyboard and
> display. Sometimes they can be faked by using "program < /dev/null", sometimes
> not, I do not know what Rome does.
>
> K.O.
>
>
> [quote="Todd Bredeweg"]I would like to use a bash script run from cron to
> analyze new midas event files automatically. Below is an abbreviated example
> script to test the way ROOT and ROME handle true batch mode
>
> [CODE]
> #! /bin/bash
>
> BASEDIR=/data/0/PostRunQA # Base directory for output files
> ROMEDIR=${BASEDIR}/dance-rome # Location of danceanalyzer
>
> NRUN=7581
> ROMECFG="romeConfig_Continuous.xml";
>
> # Set PATH and LD_LIBRARY_PATH for correct versions of ...
> # This also sets up the *SYS variables
> source /opt/wnr/new/bin/newVersion --new root rome wnr
>
> cd ${ROMEDIR};
>
> # Check that ROOT works correctly
> echo " Running ROOT batch mode test ";
> root -b -q ../jmodScript.C
>
> # Check that ROME works correctly
> echo " Running danceanalyzer batch mode test ";
> ./danceanalyzer.exe -b -ns -q -i ${ROMECFG} -r ${NRUN}
> [/CODE]
>
> The results for the ROOT section are the same when the script is run from the
> command line (full interactive environment) or when using at or crontab
> (non-interactive).
>
> [CODE]
> Running ROOT batch mode test
> *******************************************
> * *
> * W E L C O M E to R O O T *
> * *
> * Version 5.10/00 1 March 2006 *
> * *
> * You are welcome to visit our Web site *
> * http://root.cern.ch *
> * *
> *******************************************
>
>
> Compiled on 3 April 2006 for linux with thread support.
>
>
> CINT/ROOT C/C++ Interpreter version 5.16.8, February 9, 2006
> Type ? for help. Commands must be C++ statements.
> Enclose multiple statements between { }.
> Executing rootlogon.C (31-MAY-2006)... Finished setup
>
>
> Processing ../jmodScript.C...
> hello world
> This is the end of ROOT -- Goodbye
> [/CODE]
>
> jmodScript.C is merely a classic "hello world" script. The ROME test, on the
> other hand, returns quite different results for the two cases. When run from the
> command line it works as expected
>
> [CODE]
> ...
> Running danceanalyzer batch mode test
> Executing rootlogon.C (31-MAY-2006)... Finished setup
> reading configuration from romeConfig_Continuous.xml
> [bredeweg@enlil PostRunQA]$
> [/CODE]
>
> but when run from at or crontab we get
>
> [CODE] Running danceanalyzer batch mode test
> Executing rootlogon.C (31-MAY-2006)... Finished setup
>
>
> *** Break *** segmentation violation
> Generating stack trace...
> 0x081ec18b in main + 0x21b from ./danceanalyzer.exe
> 0x0734678a in __libc_start_main + 0xda from /lib/tls/libc.so.6
> 0x080dcd31 in TFile::TFile(char const*, char const*, char const*, int) + 0x51
> from ./danceanalyzer.exe
> /bin/bash: line 22: 28096 Aborted ./danceanalyzer.exe -b -ns -q
> -i ${ROMECFG} -r ${NRUN}[/CODE]
>
> One question that we have been unable to answer as yet is whether rome is
> requiring a real TTY, which I do not believe is provided by cron.
>
> We are using the following setup:
> Redhat Enterprise Linux v3
> ROOT v5.10.00
> ROME RELEASE_2_4_R1004
>
> I can provide additional information if needed.
>
> Thanks in advance.
>
> tab[/quote] |
123
|
09 Jun 2006 |
Matthias Schneebeli | Info | ChangeableClassFile in Definition XML removed | We removed the <ChangeableClassFile> under <Task> in the project definition XML file. ROME will always make a user editable class file.
This change does not affect your project.
You may get errors when validating the xml file. This can simply be fixed by removing all <ChangeableClassFile> tags under <Task> in your project definition file. |
122
|
08 Jun 2006 |
Konstantin Olchanski | Bug Report | Unable to run rome analyzer from crontab | (sorry for top-reply- I am trying to avoid elcode garbling my answer)
In the past, I have seen problems like yours, there are at least two issues:
1) "non interactive" ROOT running from cron or some other incomplete user
environment (no DISPLAY, no tty, no user)- a hello world script runs, but large
app does not, because some silly class somewhere requires an X11 connection. I
once had to fake it by running Xvnc and telling the cron jobs to use it as a
DISPLAY. I know ROOT now have a "dummy" graphics module exactly for this
purpose. I do not know how to activate it from the Rome environement, but I am
sure it is documented somewhere on the ROOT web site.
2) some programs coming from the MIDAS family assume existance of a keyboard and
display. Sometimes they can be faked by using "program < /dev/null", sometimes
not, I do not know what Rome does.
K.O.
[quote="Todd Bredeweg"]I would like to use a bash script run from cron to
analyze new midas event files automatically. Below is an abbreviated example
script to test the way ROOT and ROME handle true batch mode
[CODE]
#! /bin/bash
BASEDIR=/data/0/PostRunQA # Base directory for output files
ROMEDIR=${BASEDIR}/dance-rome # Location of danceanalyzer
NRUN=7581
ROMECFG="romeConfig_Continuous.xml";
# Set PATH and LD_LIBRARY_PATH for correct versions of ...
# This also sets up the *SYS variables
source /opt/wnr/new/bin/newVersion --new root rome wnr
cd ${ROMEDIR};
# Check that ROOT works correctly
echo " Running ROOT batch mode test ";
root -b -q ../jmodScript.C
# Check that ROME works correctly
echo " Running danceanalyzer batch mode test ";
./danceanalyzer.exe -b -ns -q -i ${ROMECFG} -r ${NRUN}
[/CODE]
The results for the ROOT section are the same when the script is run from the
command line (full interactive environment) or when using at or crontab
(non-interactive).
[CODE]
Running ROOT batch mode test
*******************************************
* *
* W E L C O M E to R O O T *
* *
* Version 5.10/00 1 March 2006 *
* *
* You are welcome to visit our Web site *
* http://root.cern.ch *
* *
*******************************************
Compiled on 3 April 2006 for linux with thread support.
CINT/ROOT C/C++ Interpreter version 5.16.8, February 9, 2006
Type ? for help. Commands must be C++ statements.
Enclose multiple statements between { }.
Executing rootlogon.C (31-MAY-2006)... Finished setup
Processing ../jmodScript.C...
hello world
This is the end of ROOT -- Goodbye
[/CODE]
jmodScript.C is merely a classic "hello world" script. The ROME test, on the
other hand, returns quite different results for the two cases. When run from the
command line it works as expected
[CODE]
...
Running danceanalyzer batch mode test
Executing rootlogon.C (31-MAY-2006)... Finished setup
reading configuration from romeConfig_Continuous.xml
[bredeweg@enlil PostRunQA]$
[/CODE]
but when run from at or crontab we get
[CODE] Running danceanalyzer batch mode test
Executing rootlogon.C (31-MAY-2006)... Finished setup
*** Break *** segmentation violation
Generating stack trace...
0x081ec18b in main + 0x21b from ./danceanalyzer.exe
0x0734678a in __libc_start_main + 0xda from /lib/tls/libc.so.6
0x080dcd31 in TFile::TFile(char const*, char const*, char const*, int) + 0x51
from ./danceanalyzer.exe
/bin/bash: line 22: 28096 Aborted ./danceanalyzer.exe -b -ns -q
-i ${ROMECFG} -r ${NRUN}[/CODE]
One question that we have been unable to answer as yet is whether rome is
requiring a real TTY, which I do not believe is provided by cron.
We are using the following setup:
Redhat Enterprise Linux v3
ROOT v5.10.00
ROME RELEASE_2_4_R1004
I can provide additional information if needed.
Thanks in advance.
tab[/quote] |
121
|
08 Jun 2006 |
Todd Bredeweg | Bug Report | Unable to run rome analyzer from crontab | I would like to use a bash script run from cron to analyze new midas event files automatically. Below is an abbreviated example script to test the way ROOT and ROME handle true batch mode
#! /bin/bash
BASEDIR=/data/0/PostRunQA # Base directory for output files
ROMEDIR=${BASEDIR}/dance-rome # Location of danceanalyzer
NRUN=7581
ROMECFG="romeConfig_Continuous.xml";
# Set PATH and LD_LIBRARY_PATH for correct versions of ...
# This also sets up the *SYS variables
source /opt/wnr/new/bin/newVersion --new root rome wnr
cd ${ROMEDIR};
# Check that ROOT works correctly
echo " Running ROOT batch mode test ";
root -b -q ../jmodScript.C
# Check that ROME works correctly
echo " Running danceanalyzer batch mode test ";
./danceanalyzer.exe -b -ns -q -i ${ROMECFG} -r ${NRUN}
The results for the ROOT section are the same when the script is run from the command line (full interactive environment) or when using at or crontab (non-interactive).
Running ROOT batch mode test
*******************************************
* *
* W E L C O M E to R O O T *
* *
* Version 5.10/00 1 March 2006 *
* *
* You are welcome to visit our Web site *
* http://root.cern.ch *
* *
*******************************************
Compiled on 3 April 2006 for linux with thread support.
CINT/ROOT C/C++ Interpreter version 5.16.8, February 9, 2006
Type ? for help. Commands must be C++ statements.
Enclose multiple statements between { }.
Executing rootlogon.C (31-MAY-2006)... Finished setup
Processing ../jmodScript.C...
hello world
This is the end of ROOT -- Goodbye
jmodScript.C is merely a classic "hello world" script. The ROME test, on the other hand, returns quite different results for the two cases. When run from the command line it works as expected
...
Running danceanalyzer batch mode test
Executing rootlogon.C (31-MAY-2006)... Finished setup
reading configuration from romeConfig_Continuous.xml
[bredeweg@enlil PostRunQA]$
but when run from at or crontab we get
Running danceanalyzer batch mode test
Executing rootlogon.C (31-MAY-2006)... Finished setup
*** Break *** segmentation violation
Generating stack trace...
0x081ec18b in main + 0x21b from ./danceanalyzer.exe
0x0734678a in __libc_start_main + 0xda from /lib/tls/libc.so.6
0x080dcd31 in TFile::TFile(char const*, char const*, char const*, int) + 0x51 from ./danceanalyzer.exe
/bin/bash: line 22: 28096 Aborted ./danceanalyzer.exe -b -ns -q -i ${ROMECFG} -r ${NRUN}
One question that we have been unable to answer as yet is whether rome is requiring a real TTY, which I do not believe is provided by cron.
We are using the following setup:
Redhat Enterprise Linux v3
ROOT v5.10.00
ROME RELEASE_2_4_R1004
I can provide additional information if needed.
Thanks in advance.
tab |
120
|
02 Apr 2006 |
Matthias Schneebeli | Bug Report | gAnalyzer->GetEventID() fails if EventID>127-48 |
Giovanni Signorelli wrote: | This bug happened when reading a .MID file containing events with event_id=99.
The ReadMidas task is not able to read the event because it is not recognized.
This event_id, when recovered with GetEventID() method was transformed to a negative value. This probably happened because there is a +48 addition at some place (in SetEventID) and a -48 on GetEventID. This casuses the unsigned char to be recovered as a signed number (lots of FFFF in front of it).
Furthermore it is not writtenanywhere that EventID<0xFF.
I could solve the problem
1) by setting EventID = 16, for instance
2) by modifying ROMEAnalyzer.h as follows
// Event ID
Int_t GetEventID() { return (fEventID-48)&0xFF; }
char GetEventIDChar() { return (fEventID)&0xFF; } |
This should be fixed now. |
119
|
08 Mar 2006 |
Giovanni Signorelli | Bug Report | gAnalyzer->GetEventID() fails if EventID>127-48 | This bug happened when reading a .MID file containing events with event_id=99.
The ReadMidas task is not able to read the event because it is not recognized.
This event_id, when recovered with GetEventID() method was transformed to a negative value. This probably happened because there is a +48 addition at some place (in SetEventID) and a -48 on GetEventID. This casuses the unsigned char to be recovered as a signed number (lots of FFFF in front of it).
Furthermore it is not writtenanywhere that EventID<0xFF.
I could solve the problem
1) by setting EventID = 16, for instance
2) by modifying ROMEAnalyzer.h as follows
// Event ID
Int_t GetEventID() { return (fEventID-48)&0xFF; }
char GetEventIDChar() { return (fEventID)&0xFF; } |
118
|
22 Feb 2006 |
Ryu Sawada | Suggestion | Text database suggestion | I improved TextDataBase as Giovanni suggested. |
117
|
22 Feb 2006 |
Stefan Ritt | Suggestion | Text database suggestion | > This is maybe a bug report that happens reading long lines in a text database.
This does not only affect ROME, but also the MXML library which has to read the long lines. I haven't carefully
checked, but I presume that MXML can handle long lines. So it might maybe be better to keep the long lines in a
text database, and modify ROME such that there is no buffer overflow. This maybe makes it easier to read the
database and to import it in programs like a spreadsheet. |
116
|
22 Feb 2006 |
Giovanni Signorelli | Suggestion | Text database suggestion | This is maybe a bug report that happens reading long lines in a text database.
I am currently handling large data base files for linear fit analysis, basically I have to handle a 828 x 828
matrix. Writing in the text db 828 lines containing each 828 comma separated values with a single
new-line at the end does not work, maybe the read buffer is too large.
So I propose the following modification to ROMETextDataBase.cpp:
Suppose you have a field named "coefficients" which is declared "array", say of four numbers, in the
xml file. In the text data base it appears as:
<coefficients>
one,two,three,four
one,two,three,four
one,two,three,four
...
</coefficients>
One should be able to write the same code as follows:
<coefficients>
one,
two,
three,
four <----- note there is NO COMMA here!
one,
two,
three,
four
one,two,three,four
...
</coefficients>
or
<coefficients>
one,two,
three,four
one,two,three,
four
one,
two,three,four
...
</coefficients>
In this way I can write a single column of (comma separated) values. Can somebody (Ryu?) take care of
this (I hope simple) modification?
Thanks.
|
115
|
09 Feb 2006 |
Ryu Sawada | Bug Report | ROMENetFolderServer | I investigated the problem.
On my machine (Scientific Linux 4.2, gcc3.3.2, glibc2.3.2, ROOT5.08.00), following simple program reproduced the problem.
There was no probelm with ROOT version4.
Is it bug of ROOT ?
When I put -lpthread at the last. This problem stopped.
Actually without this option, my analyzer workes.
I guess -lpthread is not necessary.
I will check more and if not necessary, I will remove -lpthread.
--- Makefile ---
rootlibs := $(shell $(ROOTSYS)/bin/root-config --libs)
rootcflags := $(shell $(ROOTSYS)/bin/root-config --cflags)
test: main.cpp
g++ $(rootcflags) -o $@ $< -lpthread $(rootlibs) -lThread
------
--- main.cpp ---
#include <Riostream.h>
#include <TThread.h>
void* TestLoop(void *arg)
{
return NULL;
}
int main(int argc, char *argv[])
{
TThread *thread = new TThread("TestLoop", TestLoop);
cout<<"OK"<<endl;
return 0;
}
------ |
114
|
08 Feb 2006 |
Ryu Sawada | Bug Report | ROMENetFolderServer | When I run ROME analyzer in online MIDAS mode.
It stopps with making core (segmentation fault).
It seems it makes core after "return" in main.cpp, namely finishing all code.
When I comment out following line in ROMEAnalyzer.cpp, it works propery.
tnet->StartServer(gROME->GetApplication(),gROME->GetPortNumber());
Probably it is relating to ROMENetServer or thread for this. |
113
|
08 Feb 2006 |
Ryu Sawada | Bug Report | ROMEEventLoop:Update | Recently the place to call ROMEEventLoop:Update was moved.
Probably because of this, in MIDAS online mode, event number is always incremented even when DAQ is not running. |
112
|
13 Jan 2006 |
Ryu Sawada | Suggestion | Quit mode | done.
Users can specify quit mode with option -q or configuration file. |
111
|
13 Jan 2006 |
Ryu Sawada | Suggestion | Configuration file | done.
Program searches configuration XML file in ./ and ./config |
110
|
09 Jan 2006 |
Ryu Sawada | Suggestion | Quit mode | Sometimes I hear that going to interactive session after end of analysis is uncomfortable. In fact it is possible to quit program immediately with -b option.
But -b is not only for that, It suppresses print. So I propose to make QuidMode in which program exit without going interactive session.
-q option is good, because ROOT has same option which means quit program just after macro is executed. |
109
|
09 Jan 2006 |
Ryu Sawada | Suggestion | Configuration file | About configuration XML files.
Now we merged ROME and ARGUS.
So I expect that users often have several configuration files for one project.
But I realized many people don't know that they can specify configuration file.
So I propose following scheme.
* When a program starts, it searches all XML files located in current directory which has <Configuration> tag at the top.
* If it does not find any XML file, it asks user to generate new one.
* ask configuration type [R/A/M/N]
* ask filename. Default is romeConfig.xml
* If it find only one XML file, it reads the XML file.
* If it find several XML files, it asks user which file should be used with a prompt like,
Which configuration file do you use ?
[1] filename1.xml
[2] romeConfig.xml
[3] filename2.xml
[q] quit program
* When user starts program with option -c, it asks creates new configuration anyway.
* When user starts program with option -i, it uses specified file. |
108
|
06 Jan 2006 |
Ryu Sawada | Forum | TNetFolder.h | You can download the latest TNetFolder.h from the repository with web browser.
http://savannah.psi.ch/websvn/listing.php?repname=rome&path=%2Ftrunk%2Frome%2F&rev=0&sc=0
TNetFolder.h was added to "rome/include" in two weeks ago. Please make sure you have recent version.
If your copy is old, please update your copy with "svn update" command.
If the problem is not still fixed, could you paste error message from compiler ? |
107
|
06 Jan 2006 |
Steven Sheets | Forum | TNetFolder.h | I just downloaded ROME v 2.0, I think. After running the make file I try and use romebuilder.exe
on the example stepbystep given in the download. When running romebuilder.exe
on stepbystep.xml I found it could not locate the file TNetFolder.h.
I googled this file and found a version of it which I copied to rome/include but still the builder will not build the analyzer. At this point I'm not sure how to get around this problem. If you have suggestions I'd appreciate it.
thanks,
Steven Sheets |
106
|
18 Dec 2005 |
Ryu Sawada | Info | Re-organization of directory structure | I and Matthias discussed about directory structure. In previous structure, files which can be overwritten and others were placed in the same directory.
We thought it would be better to separate two kinds of files clearly. So I modified directory structure like following.
|-- include
| |-- daqs : include files of user defined DAQs.
| |-- databases : include files of user defined databases.
| |-- folders : include files of folders come when 'ChangeableClassFile" is true.
| |-- generated : include files which can be overwritten by builder.
| `-- tasks : include files of tasks come when 'ChangeableClassFile" is true.
`-- src
|-- daqs : source files of user defined DAQs.
|-- databases : source files of user defined databases.
|-- folders : source files of folders come when 'ChangeableClassFile" is true.
|-- generated : source files which can be overwritten by builder.
`-- tasks : source files of tasks.
All ROME user need to modify the place of files and also #include statement. |
105
|
07 Dec 2005 |
Ryu Sawada | Suggestion | Proposal reorganiztion directory structure | *) Currently, builder makes many files in the top directory.
XXXFolderDict.cpp
XXXFrameworkDict.cpp
XXXROMEDict.cpp
XXXTaskDict.cpp
XXXUserDict.cpp
XXXFolderDict.h
XXXFrameworkDict.h
XXXROMEDict.h
XXXTaskDict.h
XXXUserDict.h
xxxproject.exe
XXXProject.html
XXXUserHTML.html
libXXXProject.so
(romeConfig.xml)
Makefile
Makefile.usr
But I think it makes hard to find important files. And I'm afraid people feel ROME difficult.
Really important files are romeConfig.xml, Makefile and xxxproject.exe. So I propose followings
1) make "dict" directory and put all dictionary related files in it.
2) I have proposed to make XXXUserHTML.html before. But I started to feel this feature is not necessary any more.
3) remove libXXXProject.so from "all:" in Makefile. Users need to type "make so" to create shared library.
Makefile will look like
.
.
all: obj blank.d xxxproject.exe
.
.
so: libxxxproject.so
libxxxproject.so: $(objects)
g++ $(Flags) $(soflags) -o libxxxproject.so $(objects) $(Libraries)
*) There are still some complains that it is not easy to know which files are overwritten by builder
For instance, there is no warning messages in the header of XXXProject.html and Makefile.
And some files under "framework" directory are persistent. For instance user defined DAQ, user defined
database and folders with "editable class" flag are persistent. So I propose to separate them
at the first level instead of separating "framework" and "task". It will look like
top
|-- framework
`-- user
|-- daqs
|-- databases
|-- folders
`-- tasks
daqs, databases and folders may appear only when necessary.
All files which will be overwritten are put in framework. And others go under user.
When a task does not have "editable class" flag. the .cpp will go to user/tasks/ and
the .h file will go to framework/
This change is more like matter of favor.
And there are disadvantages.
.h will be various places, and it becomes difficult to find a .h file to know the class structure.
And the file with the same name can be in different places.
For instance, normally .h file of folder will be put in framework, but if it has "editable class" flag it will be put in user/folders/.
And if one changes "editable class" flag meanwhile, there can be two files with the same name. It may cause problem
With this change all ROME users need to move their files, so we have to think carefully.
( Anoter possibility is preparing nice document on ROME homepage instead of changing directory structure. )
P.S.
This is a very small point and is not related to directory structure.
Normally people associate online data taking with the word "DAQ". But in ROME, DAQSystem is something like input data format. ROME and database are not clearly DAQ.
When we have chanse, it may be good to rename nicer. |
104
|
16 Nov 2005 |
Matthias Schneebeli | Info | Changed Root DAQ to Rome DAQ | I have changed the name of ROMEs input/output DAQ system from Root to Rome.
This has to implications for the user :
1. One has to select 'rome' intead of 'root' for the <DAQSystem> tag in the romeConfig file.
2. To access this DAQ system one has to call GetRome() instead of GetRoot()
Matthias |
103
|
17 Oct 2005 |
Matthias Schneebeli | Info | Moved ROME from cvs to subversion | ROME moved from the cvs repository to a subversion repository.
Subversion repositories are much easier to maintain.
For the user almost nothing changes.
'cvs checkout' translates to 'svn checkout' and so on.
Subversion can be downloaded from http://subversion.tigris.org/project_packages.html
I hope this will not cause much inconvenience.
Matthias |
102
|
14 Oct 2005 |
Ryu Sawada | Info | EventID | It seems that when tasks have different eventID from 'a', event methods are not executed.
I modified ROMETask.cpp for temporary solution like
else if ( strncmp(gROME->GetNameOfActiveDAQ(),"midas",5) ||
( !strncmp(&fEventID,"a",1) || !strncmp(option,&fEventID,1) )
) {
fCurrentEventMethod = "Event";
TimeStart();
if (gROME->isFillEvent())
Event();
TimeEnd();
}
By this change, eventID does not have meaning for DAQSystems other than midas.
If eventID should have meaning also in root mode, please impleament something to fill ROMEAnalyzer::fEventID in this mode. |
101
|
07 Oct 2005 |
Ryu Sawada | Forum | Dividing xml the definition xml file. | > I made a patch to enable it with mxml.
> Please test it.
>
> If it is reliable, I will commit it.
>
> ----
> cd $ROMESYS
> patch -p0 < mxml.diff
> ----
I modified bugs, and commited. |
Attachment 1: mxml.patch
|
? mxml.c
? mxml.h
? mxml.patch
? obj
? src/indent.txt
Index: include/mxml.h
===================================================================
RCS file: /usr/local/cvsroot/rome/include/mxml.h,v
retrieving revision 1.7
diff -u -r1.7 mxml.h
--- include/mxml.h 12 Jul 2005 09:04:15 -0000 1.7
+++ include/mxml.h 7 Oct 2005 13:15:53 -0000
@@ -43,6 +43,11 @@
#define PROCESSING_INSTRUCTION_NODE 3
#define COMMENT_NODE 4
#define DOCUMENT_NODE 5
+#define ENTITY_NODE 6
+
+#define INTERNAL_ENTITY 0
+#define EXTERNAL_ENTITY 1
+#define MXML_MAX_ENTITY 1000
typedef struct {
int fh;
@@ -115,6 +120,7 @@
PMXML_NODE mxml_create_root_node();
PMXML_NODE mxml_parse_file(char *file_name, char *error, int error_size);
PMXML_NODE mxml_parse_buffer(char *buffer, char *error, int error_size);
+PMXML_NODE mxml_parse_entity(char **buf, char *error, int error_size);
int mxml_write_tree(char *file_name, PMXML_NODE tree);
void mxml_debug_tree(PMXML_NODE tree, int level);
void mxml_free_tree(PMXML_NODE tree);
Index: src/mxml.c
===================================================================
RCS file: /usr/local/cvsroot/rome/src/mxml.c,v
retrieving revision 1.8
diff -u -r1.8 mxml.c
--- src/mxml.c 11 May 2005 12:50:02 -0000 1.8
+++ src/mxml.c 7 Oct 2005 13:15:53 -0000
@@ -1209,6 +1209,30 @@
p += 2;
+ } else if (strncmp(p, "!ENTITY", 7) == 0) {
+
+ /* found !ENTITY element */
+ pnew = mxml_add_special_node(ptree, ENTITY_NODE, "ENTYTY", NULL);
+ pv = p + 1;
+
+ p++;
+ if (strstr(p, ">") == NULL)
+ return read_error(HERE, "Unterminated !ENTITY element");
+
+ while (*p != '>') {
+ if (*p == '\n')
+ line_number++;
+ p++;
+ }
+
+ len = (size_t)p - (size_t)pv;
+ pnew->value = (char *)malloc(len+1);
+ memcpy(pnew->value, pv, len);
+ pnew->value[len] = 0;
+ mxml_decode(pnew->value);
+
+ p ++;
+
} else {
/* found normal element */
@@ -1407,6 +1431,422 @@
/*------------------------------------------------------------------*/
+PMXML_NODE mxml_parse_entity(char **buf, char *error, int error_size)
+/* parse !ENTYTY entries of XML files and replace with references. Return NULL
+ in case of error, return error description. Optional file_name is used
+ for error reporting if called from mxml_parse_file() */
+{
+ char *p;
+ char *pv;
+ char delimiter;
+ int i, j, k, line_number;
+ char *replacement;
+ char entity_name[MXML_MAX_ENTITY][256];
+ char entity_reference_name[MXML_MAX_ENTITY][256];
+ char *entity_value[MXML_MAX_ENTITY];
+ int entity_type[MXML_MAX_ENTITY]; /* internal or external */
+ int nentity;
+ int fh, length, len;
+ char *buffer;
+ PMXML_NODE root = mxml_create_root_node(); /* dummy for 'HERE' */
+ char *file_name = NULL; /* dummy for 'HERE' */
+ int ip; /* counter for entity value */
+
+ for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
+ entity_value[ip] = NULL;
+
+ line_number = 1;
+ nentity = -1;
+
+ /* copy string to temporary space */
+ buffer = (char *) malloc(strlen(*buf) + 1);
+ if (buffer == NULL) {
+ return read_error(HERE, "Cannot allocate memory.");
+ }
+
+ p = buffer;
+
+ strcpy(buffer, *buf);
+ free(*buf);
+
+ /* search !ENTITY */
+ do {
+ if (*p == '<') {
+
+ /* found new entity */
+ p++;
+ while (*p && isspace(*p)) {
+ if (*p == '\n')
+ line_number++;
+ p++;
+ }
+ if (!*p) {
+/*
+ free(buffer);
+ for(ip=0;ip<MXML_MAX_ENTITY;ip++)
+ free(entity_value[ip]);
+*/
+ return read_error(HERE, "Unexpected end of file");
+ }
+
+ if (strncmp(p, "!ENTITY", 7) == 0) {
+
+ /* found entity */
+ nentity++;
+ if (nentity >= MXML_MAX_ENTITY) {
+/*
+ free(buffer);
+ for(ip=0;ip<MXML_MAX_ENTITY;ip++)
+ free(entity_value[ip]);
+*/
+ return read_error(HERE, "Too much entities");
+ }
+
+ pv = p + 7;
+ while (*pv == ' ')
+ pv++;
+
+ /* extract entity name */
+ p = pv;
+
+ while (*p && isspace(*p) && *p != '<' && *p != '>') {
+ if (*p == '\n')
+ line_number++;
+ p++;
+ }
+ if (!*p) {
+/*
+ free(buffer);
+ for(ip=0;ip<MXML_MAX_ENTITY;ip++)
+ free(entity_value[ip]);
+*/
+ return read_error(HERE, "Unexpected end of file");
+ }
+ if (*p == '<' || *p == '>') {
+/*
+ free(buffer);
+ for(ip=0;ip<MXML_MAX_ENTITY;ip++)
+ free(entity_value[ip]);
+*/
+ return read_error(HERE, "Unexpected \'%c\' inside !ENTITY", *p);
+ }
+
+ pv = p;
+ while (*pv && !isspace(*pv) && *pv != '<' && *pv != '>')
+ pv++;
+
+ if (!*pv) {
+/*
+ free(buffer);
+ for(ip=0;ip<MXML_MAX_ENTITY;ip++)
+ free(entity_value[ip]);
+*/
+ return read_error(HERE, "Unexpected end of file");
+ }
+ if (*pv == '<' || *pv == '>') {
+/*
+ free(buffer);
+ for(ip=0;ip<MXML_MAX_ENTITY;ip++)
+ free(entity_value[ip]);
+*/
+ return read_error(HERE, "Unexpected \'%c\' inside entity \"%s\"", *pv,
+ &entity_name[nentity][1]);
+ }
+
+ len = (size_t) pv - (size_t) p;
+
+ entity_name[nentity][0] = '&';
+ i = 1;
+ entity_name[nentity][i] = 0;
+ while (*p && !isspace(*p) && *p != '/' && *p != '>' && *p != '<' && i < 253)
+ entity_name[nentity][i++] = *p++;
+ entity_name[nentity][i++] = ';';
+ entity_name[nentity][i] = 0;
+
+ if (!*p) {
+/*
+ free(buffer);
+ for(ip=0;ip<MXML_MAX_ENTITY;ip++)
+ free(entity_value[ip]);
+*/
+ return read_error(HERE, "Unexpected end of file");
+ }
+ if (*p == '<') {
+/*
+ free(buffer);
+ for(ip=0;ip<MXML_MAX_ENTITY;ip++)
+ free(entity_value[ip]);
+*/
+ return read_error(HERE, "Unexpected \'<\' inside entity \"%s\"", &entity_name[nentity][1]);
+ }
+
+ /* extract replacement or SYSTEM */
+ while (*p && isspace(*p)) {
+ if (*p == '\n')
+ line_number++;
+ p++;
+ }
+ if (!*p) {
+/*
+ free(buffer);
+ for(ip=0;ip<MXML_MAX_ENTITY;ip++)
+ free(entity_value[ip]);
+*/
+ return read_error(HERE, "Unexpected end of file");
+ }
+ if (*p == '>') {
+/*
+ free(buffer);
+ for(ip=0;ip<MXML_MAX_ENTITY;ip++)
+ free(entity_value[ip]);
+*/
+ return read_error(HERE, "Unexpected \'>\' inside entity \"%s\"", &entity_name[nentity][1]);
+ }
+
+ /* check if SYSTEM */
+ if (strncmp(p, "SYSTEM", 6) == 0) {
+ entity_type[nentity] = EXTERNAL_ENTITY;
+ p += 6;
+ } else {
+ entity_type[nentity] = INTERNAL_ENTITY;
+ }
+
+ /* extract replacement */
+ while (*p && isspace(*p)) {
+ if (*p == '\n')
+ line_number++;
+ p++;
+ }
+ if (!*p) {
+/*
+ free(buffer);
+ for(ip=0;ip<MXML_MAX_ENTITY;ip++)
+ free(entity_value[ip]);
+*/
+ return read_error(HERE, "Unexpected end of file");
+ }
+ if (*p == '>') {
+/*
+ free(buffer);
+ for(ip=0;ip<MXML_MAX_ENTITY;ip++)
+ free(entity_value[ip]);
+*/
+ return read_error(HERE, "Unexpected \'>\' inside entity \"%s\"", &entity_name[nentity][1]);
+ }
+
+ if (*p != '\"' && *p != '\'') {
+/*
+ free(buffer);
+ for(ip=0;ip<MXML_MAX_ENTITY;ip++)
+ free(entity_value[ip]);
+*/
+ return read_error(HERE, "Replacement was not found for entity \"%s\"",
+ &entity_name[nentity][1]);
+ }
+ delimiter = *p;
+ p++;
+ if (!*p) {
+/*
+ free(buffer);
+ for(ip=0;ip<MXML_MAX_ENTITY;ip++)
+ free(entity_value[ip]);
+*/
+ return read_error(HERE, "Unexpected end of file");
+ }
+ pv = p;
+ while (*pv && *pv != delimiter)
+ pv++;
+
... 207 more lines ...
|
100
|
06 Oct 2005 |
Ryu Sawada | Forum | Dividing xml the definition xml file. | > I am thinking to divide my definition xml file into several files.
>
> I do not know if there is a general way, but I found some web pages mentioning about it. According to
> these pages we can include an xml document to other one like.
>
> ---------- booklist.xml ------------
> <?xml version="1.0"?>
> <!DOCTYPE books [
> <!ENTITY book1 SYSTEM "book1.xml">
> ]>
>
> <books>
> &book1;
> </books>
> ------------------------------------
> ------------ book1.xml -------------
> <?xml version="1.0"?>
> <book>
> <title>Title of the book</title>
> <author>Author of the book</author>
> </book>
> ------------------------------------
>
> Is it possible to do it with mxml ?
I made a patch to enable it with mxml.
Please test it.
If it is reliable, I will commit it.
----
cd $ROMESYS
patch -p0 < mxml.diff
---- |
Attachment 1: mxml.diff
|
Index: include/mxml.h
===================================================================
RCS file: /usr/local/cvsroot/rome/include/mxml.h,v
retrieving revision 1.7
diff -u -r1.7 mxml.h
--- include/mxml.h 12 Jul 2005 09:04:15 -0000 1.7
+++ include/mxml.h 6 Oct 2005 21:53:13 -0000
@@ -43,6 +43,10 @@
#define PROCESSING_INSTRUCTION_NODE 3
#define COMMENT_NODE 4
#define DOCUMENT_NODE 5
+#define ENTITY_NODE 6
+
+#define INTERNAL_ENTITY 0
+#define EXTERNAL_ENTITY 1
typedef struct {
int fh;
@@ -115,6 +119,7 @@
PMXML_NODE mxml_create_root_node();
PMXML_NODE mxml_parse_file(char *file_name, char *error, int error_size);
PMXML_NODE mxml_parse_buffer(char *buffer, char *error, int error_size);
+PMXML_NODE mxml_parse_entity(char *buf, char *error, int error_size);
int mxml_write_tree(char *file_name, PMXML_NODE tree);
void mxml_debug_tree(PMXML_NODE tree, int level);
void mxml_free_tree(PMXML_NODE tree);
Index: src/mxml.c
===================================================================
RCS file: /usr/local/cvsroot/rome/src/mxml.c,v
retrieving revision 1.8
diff -u -r1.8 mxml.c
--- src/mxml.c 11 May 2005 12:50:02 -0000 1.8
+++ src/mxml.c 6 Oct 2005 21:53:13 -0000
@@ -1209,6 +1209,30 @@
p += 2;
+ } else if (strncmp(p, "!ENTITY", 7) == 0) {
+
+ /* found !ENTITY element */
+ pnew = mxml_add_special_node(ptree, ENTITY_NODE, "ENTYTY", NULL);
+ pv = p+1;
+
+ p++;
+ if (strstr(p, ">") == NULL)
+ return read_error(HERE, "Unterminated !ENTITY element");
+
+ while (*p != '>') {
+ if (*p == '\n')
+ line_number++;
+ p++;
+ }
+
+ len = (size_t)p - (size_t)pv;
+ pnew->value = (char *)malloc(len+1);
+ memcpy(pnew->value, pv, len);
+ pnew->value[len] = 0;
+ mxml_decode(pnew->value);
+
+ p ++;
+
} else {
/* found normal element */
@@ -1407,6 +1431,249 @@
/*------------------------------------------------------------------*/
+PMXML_NODE mxml_parse_entity(char *buf, char *error, int error_size)
+/* parse !ENTYTY entries of XML files and replace with references. Return NULL
+ in case of error, return error description. Optional file_name is used
+ for error reporting if called from mxml_parse_file() */
+{
+ char *p;
+ char *pv;
+ char delimiter;
+ int i,j,k, line_number;
+ char replacement[1000];
+ char entity_name[256][256];
+ char entity_reference_name[256][256];
+ char *entity_value[256];
+ int entity_type[256]; /* internal or external */
+ int nentity;
+ int fh, length,len;
+ char *buffer;
+ PMXML_NODE root = mxml_create_root_node(); // dummy for 'HERE'
+ char *file_name = NULL; // dummy for 'HERE'
+
+ /* copy string to temporary space */
+ buffer = (char *)malloc(strlen(buf)+1);
+ strcpy(buffer,buf);
+ free(buf);
+
+ p = buffer;
+ line_number = 1;
+ nentity = -1;
+
+ /* search !ENTITY */
+ do {
+ if (*p == '<') {
+
+ /* found new entity */
+ p++;
+ while (*p && isspace(*p)) {
+ if (*p == '\n')
+ line_number++;
+ p++;
+ }
+ if (!*p)
+ return read_error(HERE, "Unexpected end of file");
+
+ if (strncmp(p, "!ENTITY", 7) == 0) {
+
+ /* found entity */
+ nentity++;
+ if(nentity>=1000)
+ return read_error(HERE, "Too much entities");
+
+ pv = p+7;
+ while (*pv == ' ')
+ pv++;
+
+ /* extract entity name */
+ p = pv;
+
+ while (*p && isspace(*p) && *p != '<' && *p != '>') {
+ if (*p == '\n')
+ line_number++;
+ p++;
+ }
+ if (!*p)
+ return read_error(HERE, "Unexpected end of file");
+ if (*p == '<' || *p == '>')
+ return read_error(HERE, "Unexpected \'%c\' inside !ENTITY", *p);
+
+ pv = p;
+ while (*pv && !isspace(*pv) && *pv != '<' && *pv != '>')
+ pv++;
+
+ if (!*pv)
+ return read_error(HERE, "Unexpected end of file");
+ if (*pv == '<' || *pv == '>' )
+ return read_error(HERE, "Unexpected \'%c\' inside entity \"%s\"", *pv, &entity_name[nentity][1]);
+
+ len = (size_t)pv - (size_t)p;
+ if (len > (int)sizeof(replacement)-1)
+ len = sizeof(replacement)-1;
+ memcpy(replacement, p, len);
+ replacement[len] = 0;
+ mxml_decode(replacement);
+
+ entity_name[nentity][0] = '&';
+ i = 1;
+ entity_name[nentity][i] = 0;
+ while (*p && !isspace(*p) && *p != '/' && *p != '>' && *p != '<' && i<253)
+ entity_name[nentity][i++] = *p++;
+ entity_name[nentity][i++] = ';';
+ entity_name[nentity][i] = 0;
+
+ if (!*p)
+ return read_error(HERE, "Unexpected end of file");
+ if (*p == '<')
+ return read_error(HERE, "Unexpected \'<\' inside entity \"%s\"", &entity_name[nentity][1]);
+
+ /* extract replacement or SYSTEM*/
+ while (*p && isspace(*p)) {
+ if (*p == '\n')
+ line_number++;
+ p++;
+ }
+ if (!*p)
+ return read_error(HERE, "Unexpected end of file");
+ if (*p == '>')
+ return read_error(HERE, "Unexpected \'>\' inside entity \"%s\"", &entity_name[nentity][1]);
+
+ /* check if SYSTEM */
+ if(strncmp(p, "SYSTEM", 6) == 0){
+ entity_type[nentity] = EXTERNAL_ENTITY;
+ p += 6;
+ }
+ else{
+ entity_type[nentity] = INTERNAL_ENTITY;
+ }
+
+ /* extract replacement */
+ while (*p && isspace(*p)) {
+ if (*p == '\n')
+ line_number++;
+ p++;
+ }
+ if (!*p)
+ return read_error(HERE, "Unexpected end of file");
+ if (*p == '>')
+ return read_error(HERE, "Unexpected \'>\' inside entity \"%s\"", &entity_name[nentity][1]);
+
+ if (*p != '\"' && *p != '\'')
+ return read_error(HERE, "Replacement was not found for entity \"%s\"", &entity_name[nentity][1]);
+ delimiter = *p;
+ p++;
+ if (!*p)
+ return read_error(HERE, "Unexpected end of file");
+ pv = p;
+ while (*pv && *pv != delimiter )
+ pv++;
+
+ if (!*pv)
+ return read_error(HERE, "Unexpected end of file");
+ if (*pv == '<' )
+ return read_error(HERE, "Unexpected \'%c\' inside entity \"%s\"", *pv, &entity_name[nentity][1]);
+
+ len = (size_t)pv - (size_t)p;
+ if (len > (int)sizeof(replacement)-1)
+ len = sizeof(replacement)-1;
+ memcpy(replacement, p, len);
+ replacement[len] = 0;
+
+ if(entity_type[nentity] == EXTERNAL_ENTITY){
+ strcpy(entity_reference_name[nentity],replacement);
+ }
+ else{
+ entity_value[nentity] = (char *)malloc(strlen(replacement));
+ strcpy(entity_value[nentity],replacement);
+ }
+
+ p = pv;
+ while (*p && isspace(*p)) {
+ if (*p == '\n')
+ line_number++;
+ p++;
+ }
+ if (!*p)
+ return read_error(HERE, "Unexpected end of file");
+ }
+ }
+
+ /* go to next element */
+ while (*p && *p != '<') {
+ if (*p == '\n')
+ line_number++;
+ p++;
+ }
+ } while (*p);
+ nentity++;
+
+ /* read external file */
+ for(i=0;i<nentity;i++){
+ if(entity_type[i] == EXTERNAL_ENTITY){
+ fh = open(entity_reference_name[i], O_RDONLY | O_TEXT, 0644);
+
+ if (fh == -1) {
+ return read_error(HERE, "Unable to open file \"%s\"",entity_reference_name[i]);
+ }
+
+ length = lseek(fh, 0, SEEK_END);
+ lseek(fh, 0, SEEK_SET);
+ entity_value[i] = (char *)malloc(length+1);
+ if (entity_value[i] == NULL) {
+ close(fh);
+ return read_error(HERE, "Cannot allocate buffer of %d bytes for \"%s\".",length+1,&entity_name[1]);
+ }
+
+ /* read complete file at once */
+ length = read(fh, entity_value[i], length);
+ entity_value[i][length] = 0;
+ close(fh);
+ }
+ }
+
+ /* count length of output string */
+ length = strlen(buffer);
+ for(i=0;i<nentity;i++){
+ p = buffer;
+ while(1){
+ pv =strstr(entity_name[i],p);
+ if(pv){
+ length += -strlen(entity_name[i]) + strlen(entity_value[i]);
+ p = pv+1;
+ }
+ else{
+ break;
+ }
+ }
+ }
+
+ /* allocate memory */
+ buf = (char *)malloc(length+1);
+
+ /* replace entities */
+ p = buffer;
+ pv = buf;
+ do {
+ if (*p == '&') {
+ /* found entity */
+ for(j=0;j<nentity;j++){
+ if(strncmp(p,entity_name[j],strlen(entity_name[j])) == 0){
+ for(k=0;k<(int)strlen(entity_value[j]);k++)
+ *pv++ = entity_value[j][k];
+ p += strlen(entity_name[j]);
+ break;
+ }
... 27 more lines ...
|
99
|
08 Sep 2005 |
Ryu Sawada | Forum | Dividing xml the definition xml file. | I am thinking to divide my definition xml file into several files.
I do not know if there is a general way, but I found some web pages mentioning about it. According to
these pages we can include an xml document to other one like.
---------- booklist.xml ------------
<?xml version="1.0"?>
<!DOCTYPE books [
<!ENTITY book1 SYSTEM "book1.xml">
]>
<books>
&book1;
</books>
------------------------------------
------------ book1.xml -------------
<?xml version="1.0"?>
<book>
<title>Title of the book</title>
<author>Author of the book</author>
</book>
------------------------------------
Is it possible to do it with mxml ?
I have two reasons.
1.
I have two ROME programs. I call them as "writer" and "reader" in this message. "reader" reads output
file from "writer". In this case, "reader" needs to know the structure of branch folder defined in "writer"'s
xml file.
What I am doing is adding headers of "writer" to DictionaryHeaders in Makefile.user of "reader". At least,
it works, but this way I have to write reading function of trees by hand. On the other hand, If it is
possible to include a part of xml file of "writer" in that of "reader", romebuilder can create proper
functions automatically.
2.
My project definition file is already big. It has more than 2000 lines. If one has good XML editor, it may
not be a problem. But unfortunately I do not know good editor on Linux. What I am thinking is making a
directory structure like this.
.
|-- main_definition.xml
`-- xml
|-- folders
| |-- folder_1.xml
| |-- folder_2.xml
| `-- folder_3.xml
`-- tasks
|-- task_1.xml
|-- task_2.xml
`-- task_3.xml
folder_[1-3].xml and task_[1-3].xml will be included in main_definition.xml. |
98
|
30 Aug 2005 |
Matthias Schneebeli | Bug Report | TFile creation and TTree | > When the filename base IO was added, it seems that TFile creation was moved from
> ROMEEventLoop::DAQInit to ROMEEventLoop:DAQEndOfRun.
>
> So ROME makes TTrees without outputfile.
>
> This is dangerous when a TTree becomes huge.
> It can consume large amount of memory.
Your right. I have changed it back. |
97
|
29 Aug 2005 |
Ryu Sawada | Bug Report | TFile creation and TTree | When the filename base IO was added, it seems that TFile creation was moved from
ROMEEventLoop::DAQInit to ROMEEventLoop:DAQEndOfRun.
So ROME makes TTrees without outputfile.
This is dangerous when a TTree becomes huge.
It can consume large amount of memory. |
96
|
21 Jul 2005 |
Ryu Sawada | Suggestion | An idea of file I/O | Current file handling of ROME is based on run number. This way is simple and easy to understand. But
there are some arguments on it.
(i) In case of .mid file. ROME assume the file name is like run00001.mid. But this is not always true.
MIDAS users can have different name.
(ii) ROME saves one TTree in one file. But there are cases that user want to save several TTrees in a file
(iii) Especially rare event search experiments like MEG, one file may contain signal candidate events
from several runs.
To solve this issue one idea is to move from run base I/O to filename base I/O.
* Input
Users may specify filename instead of run number with command line option like.
XXXanalyzer.exe -f run00001.mid,run00002.mid
Then ROMEAnalyzer provides information of filename to DAQ class.
How files are handled is depending on DAQ class. Normally each files will be read one by one.
But in case of bartender program, they will be read in parallel to mix.
In case of .mid file, run number is written in run header of files.
ROMEMidas should change current run number at the BeginOfRun.
* Output
For the output filename we can employ same technique as database path.
This way users can use also run number and some other parameters.
And they can store several TTrees in a file.
<Tree>
<TreeName>tree</TreeName>
<TreeOutputFileName>"%s#.root",gAnalyzer->GetGSP()->GetFilePrefix()<TreeOutputFileName>
<Branch>
<BranchName>kine</BranchName>
<RelatedFolder>Kinematics</RelatedFolder>
</Branch>
</Tree>
This change is quite big, and it affects all ROME users.
We have to discuss enough on it before changing.
(One choice is to remain run number base I/O.) |
95
|
21 Jul 2005 |
Ryu Sawada | Suggestion | ResetFolders | > ResetFolders are called in DAQEvent for every events.
>
> I have some folders who's information have to be kept during the run.
>
> One possibility is to add new tag like <ResetBoforeEvents> in folder definition.
> The other is give up reset in ROMEEventLoop and give users resposibility of reset.
done.
The name of the tag is <NoResetByFramework> |
94
|
10 Jul 2005 |
Ryu Sawada | Suggestion | ResetFolders | ResetFolders are called in DAQEvent for every events.
I have some folders who's information have to be kept during the run.
One possibility is to add new tag like <ResetBoforeEvents> in folder definition.
The other is give up reset in ROMEEventLoop and give users resposibility of reset. |
93
|
28 Jun 2005 |
Ryu Sawada | Bug Report | support folder object in folder. | When one makes a support folder type field in folder, pointer to the support folder or pointer of
TClonesArray is in the folder.
But There is no "new" statement to create the object. |
92
|
28 Jun 2005 |
Ryu Sawada | Suggestion | class members in TTree | > This is just a matter of favor.
> We sometimes use TTree interactively. At that time, I feel fRunNumber, fEventNumber, fTimeStamp,
> fSequentialNumber are long to type.
> I prefer shorter without upper case letter.
> If many people agree it, I would like to ask to change them run,event,timestamp,number like MIDAS analyzer.
changed to run, event, time and number. |
91
|
28 Jun 2005 |
Ryu Sawada | Bug Report | Need to include stdarg.h in file ROMEString.h | > > Hello,
> >
> > It seems some compliers have a problem with making ROME, sending error message
> > saying,
> >
> > In file included from builder/src/ROMEBuilder.cpp:574:
> > /home/pekochan/rome/20050626/rome/include/ROMEString.h:41: type spec ifier
> > omitted for parameter `va_list'
> > ...etc
> >
> >
> > This problem can be fixed in file "ROMEString.h" by adding the following
> > either line;
> >
> > #include <stdarg.h>
> >
> > or
> >
> > #include <Varargs.h>
>
>
> Thanks for reporting that problem.
>
> #include <stdarg.h>
> is added now in the cvs.
replaced with #include <Varargs.h> |
90
|
28 Jun 2005 |
Matthias Schneebeli | Suggestion | class members in TTree | > I think that fUniqueID and fBits in TObject is not useful to store in TTree.
> I found in ROOT users guide that we can disable that with
> MyClass::Class()->IgnoreTObjectStreamer();
> .
>
> If you also think these are useless information, please implement it in ROME.
>
>
>
> second topic.
> This is just a matter of favor.
> We sometimes use TTree interactively. At that time, I feel fRunNumber, fEventNumber, fTimeStamp,
> fSequentialNumber are long to type.
> I prefer shorter without upper case letter.
> If many people agree it, I would like to ask to change them run,event,timestamp,number like MIDAS analyzer.
MyClass::Class()->IgnoreTObjectStreamer(); is implemented. |
89
|
28 Jun 2005 |
Ryu Sawada | Suggestion | Folder reset. | In Reset method of folders. Support folder members are ignored currently.
Reset method of support folder member had better to be called.
In addition, isModified() should check if the member support folders were modified.
For example
class A : public TObject
{
protected:
TypeB* B;
TClonesArray* C;
.
.
public:
A() {
B = 0;
C = 0;
};
.
.
.
void Reset() {
int i;
fModified = false;
if(B) B->Reset();
if(C) for(i=0;i<C->GetEntries();i++) { ((TypeC*)C->At(i))->Reset(); }
};
ClassDef(A,1)
}; |
88
|
27 Jun 2005 |
Matthias Schneebeli | Bug Report | Need to include stdarg.h in file ROMEString.h | > Hello,
>
> It seems some compliers have a problem with making ROME, sending error message
> saying,
>
> In file included from builder/src/ROMEBuilder.cpp:574:
> /home/pekochan/rome/20050626/rome/include/ROMEString.h:41: type spec ifier
> omitted for parameter `va_list'
> ...etc
>
>
> This problem can be fixed in file "ROMEString.h" by adding the following
> either line;
>
> #include <stdarg.h>
>
> or
>
> #include <Varargs.h>
Thanks for reporting that problem.
#include <stdarg.h>
is added now in the cvs. |
87
|
26 Jun 2005 |
Yasuko HISAMATSU | Bug Report | Need to include stdarg.h in file ROMEString.h | Hello,
It seems some compliers have a problem with making ROME, sending error message
saying,
In file included from builder/src/ROMEBuilder.cpp:574:
/home/pekochan/rome/20050626/rome/include/ROMEString.h:41: type spec ifier
omitted for parameter `va_list'
...etc
This problem can be fixed in file "ROMEString.h" by adding the following
either line;
#include <stdarg.h>
or
#include <Varargs.h> |
86
|
11 Jun 2005 |
Ryu Sawada | Suggestion | class members in TTree | I think that fUniqueID and fBits in TObject is not useful to store in TTree.
I found in ROOT users guide that we can disable that with
MyClass::Class()->IgnoreTObjectStreamer();
.
If you also think these are useless information, please implement it in ROME.
second topic.
This is just a matter of favor.
We sometimes use TTree interactively. At that time, I feel fRunNumber, fEventNumber, fTimeStamp,
fSequentialNumber are long to type.
I prefer shorter without upper case letter.
If many people agree it, I would like to ask to change them run,event,timestamp,number like MIDAS analyzer. |
85
|
01 Jun 2005 |
Ryu Sawada | Forum | TaskHierarchy | This is a proposal on specifying relation of tasks.
Currently, ROME has task hierarchy system. It may be enough.
But a missing thing is that we can not use "||".
So a possibility is like this.
For example, there are two calibration tasks B and D, and a calculation task A requires one of B or D.
B and D dependes on data filling task C.
This case, one writes down the relation in definition file.
<TaskDependenses>
<TaskDependense taskname="A"/> B || D </TaskDependense>
<TaskDependense taskname="B"/> C </TaskDependense>
<TaskDependense taskname="D"/> C && !B </TaskDependense>
</TaskDependeses>
Then, builder analyzes the relation and re-arranges the execution order like,
C->B->D->A
At run time, ROMEEventLoop checks if depending tasks were executed before calling a task. And when
B or C is executed, it calls A.
This way users can specify complicated relation like ((A && B) || C ) || !D )....
A problem is that you can not express the relation with indent in configuration file and documentation.
This is just a proposal, I'm not sure which is better, TaskHierarcy or TaskDependense.
Personaly, I am not using task controll. |
84
|
13 May 2005 |
Ryu Sawada | Bug Report | Mismatch of [Set/Append]Formatted | done.
> In ROMEBuilder.cpp, there are some mismatchs of formart and argument of ROMEString::Set or
> AppendFormatted.
>
> 1000 format.SetFormatted(" void Set%%s%%%ds(%%-%ds %%s%%%ds) { f%%s%%%ds = %%s; };
> \n",lb,typeLen,lb,lb,lb);
>
> 3980 format.SetFormatted(" %%s%%s*%%%ds Get%%sAt(int index)%%%ds\n",typeLen-
> folderName[i].Length()-scl,0+nameLen-folderName[i].Length(),lt);
>
> 5875 buffer.AppendFormatted(" bool CheckConfiguration(int runNumber);\n",shortCut.Data());
>
> 6487 buffer.AppendFormatted("#include <TBranchElement.h>\n",shortCut.Data());
>
> 7231 buffer.AppendFormatted(" return buffer;\n",stringBuffer.Data());
>
> 7271 buffer.AppendFormatted(" if (!this->GetDataBase(name.Data())->Read
> (values,path,gAnalyzer->GetCurrentRunNumber())) {\n",folderName[i].Data(),valueName[i][j].Data());
>
> 7358 buffer.AppendFormatted("%s xml->WriteElement(\"HistArrayStartIndex\",\"0\");
> \n",blank.Data(),pointerI.Data(),histoName[taskHierarchyClassIndex[i]][j].Data());
>
> 8771 buffer.AppendFormatted(" obj/%sAnalyzer.obj obj/%sEventLoop.obj obj/%sConfig.obj obj/
> main.obj",shortCut.Data(),shortCut.Data(),shortCut.Data(),shortCut.Data(),shortCut.Data());
>
> 8815 buffer.AppendFormatted(" g++ $(Flags) -o $@ $(objects) $(Libraries)\n\n",shortCut.Data
> (),mainProgName.Data());
>
> 8872 buffer.AppendFormatted("obj/%sFAnalyzer.obj: src/framework/%sFAnalyzer.f src/framework/%
> sAnalyzer.cpp include/framework/%sAnalyzer.h\n",shortCut.Data(),shortCut.Data(),shortCut.Data());
>
> 9341 htmlFile.SetFormatted("%s%sUserHTML.html",outDir.Data(),shortCut.Data(),mainProgName.Data
> ()); |
83
|
13 May 2005 |
Ryu Sawada | Info | Identical check in builder | done.
> About identical check of new and existing file in builder.
>
> Currently there is a limit of file size defined by "bufferLength".
> When the file size exceed the size, the file will be always overwritten by builder.
> And if the file is existing task cpp file, user will lose a part of his code.
>
> Actually, LPConfig.cpp is larger than that.
>
> So I wrote a simple function. it will be called recursively when the file is larger than buffer.
> bufferLength is not necessary to be so large.
>
> bool checkIdentical(const int fileHandle,const char* pattern,bool flag=true)
> {
> static int position
> int i;
> char fileBuffer[bufferLength];
>
> if(flag)
> position = 0;
>
> int nb = read(fileHandle,&fileBuffer, sizeof(fileBuffer));
>
> if(nb == bufferLength){
> if((int)strlen(pattern)-position < bufferLength)
> return false;
>
> for (i=0;i<nb;i++)
> if (pattern[position+i] != fileBuffer[i])
> return false;
> position += bufferLength;
> return checkIdentical(fileHandle,pattern,false);
> }
> else{
> if (nb != (int)strlen(pattern) - position)
> return false;
>
> for (i=0;i<nb;i++)
> if (pattern[position+i] != fileBuffer[i])
> return false;
> }
> return true;
> }
>
>
> You may use this function in builder like,
> int fileHandle = open("test.txt",O_RDONLY);
> bool identical = checkIdentical(fileHandle,buffer);
> close(fileHandle);
>
> And there is another way. TString can read file. this featrue can be used when you read existing Task cpp file.
>
> ifstream ifile("test.txt");
> TString fileBuffer;
> str.ReadFile(ifile);
> bool identical = ( fileBuffer == buffer ); |
82
|
07 May 2005 |
Ryu Sawada | Bug Report | Mismatch of [Set/Append]Formatted | In ROMEBuilder.cpp, there are some mismatchs of formart and argument of ROMEString::Set or
AppendFormatted.
1000 format.SetFormatted(" void Set%%s%%%ds(%%-%ds %%s%%%ds) { f%%s%%%ds = %%s; };
\n",lb,typeLen,lb,lb,lb);
3980 format.SetFormatted(" %%s%%s*%%%ds Get%%sAt(int index)%%%ds\n",typeLen-
folderName[i].Length()-scl,0+nameLen-folderName[i].Length(),lt);
5875 buffer.AppendFormatted(" bool CheckConfiguration(int runNumber);\n",shortCut.Data());
6487 buffer.AppendFormatted("#include <TBranchElement.h>\n",shortCut.Data());
7231 buffer.AppendFormatted(" return buffer;\n",stringBuffer.Data());
7271 buffer.AppendFormatted(" if (!this->GetDataBase(name.Data())->Read
(values,path,gAnalyzer->GetCurrentRunNumber())) {\n",folderName[i].Data(),valueName[i][j].Data());
7358 buffer.AppendFormatted("%s xml->WriteElement(\"HistArrayStartIndex\",\"0\");
\n",blank.Data(),pointerI.Data(),histoName[taskHierarchyClassIndex[i]][j].Data());
8771 buffer.AppendFormatted(" obj/%sAnalyzer.obj obj/%sEventLoop.obj obj/%sConfig.obj obj/
main.obj",shortCut.Data(),shortCut.Data(),shortCut.Data(),shortCut.Data(),shortCut.Data());
8815 buffer.AppendFormatted(" g++ $(Flags) -o $@ $(objects) $(Libraries)\n\n",shortCut.Data
(),mainProgName.Data());
8872 buffer.AppendFormatted("obj/%sFAnalyzer.obj: src/framework/%sFAnalyzer.f src/framework/%
sAnalyzer.cpp include/framework/%sAnalyzer.h\n",shortCut.Data(),shortCut.Data(),shortCut.Data());
9341 htmlFile.SetFormatted("%s%sUserHTML.html",outDir.Data(),shortCut.Data(),mainProgName.Data
()); |
81
|
06 May 2005 |
Ryu Sawada | Info | Identical check in builder | About identical check of new and existing file in builder.
Currently there is a limit of file size defined by "bufferLength".
When the file size exceed the size, the file will be always overwritten by builder.
And if the file is existing task cpp file, user will lose a part of his code.
Actually, LPConfig.cpp is larger than that.
So I wrote a simple function. it will be called recursively when the file is larger than buffer.
bufferLength is not necessary to be so large.
bool checkIdentical(const int fileHandle,const char* pattern,bool flag=true)
{
static int position
int i;
char fileBuffer[bufferLength];
if(flag)
position = 0;
int nb = read(fileHandle,&fileBuffer, sizeof(fileBuffer));
if(nb == bufferLength){
if((int)strlen(pattern)-position < bufferLength)
return false;
for (i=0;i<nb;i++)
if (pattern[position+i] != fileBuffer[i])
return false;
position += bufferLength;
return checkIdentical(fileHandle,pattern,false);
}
else{
if (nb != (int)strlen(pattern) - position)
return false;
for (i=0;i<nb;i++)
if (pattern[position+i] != fileBuffer[i])
return false;
}
return true;
}
You may use this function in builder like,
int fileHandle = open("test.txt",O_RDONLY);
bool identical = checkIdentical(fileHandle,buffer);
close(fileHandle);
And there is another way. TString can read file. this featrue can be used when you read existing Task cpp file.
ifstream ifile("test.txt");
TString fileBuffer;
str.ReadFile(ifile);
bool identical = ( fileBuffer == buffer ); |
80
|
03 May 2005 |
Ryu Sawada | Suggestion | ROOTCINT path | > > As ROOTSYS is required for the ROME build, I would suggest to
> > include the code below in the builder for the application Makefile.
> > This will make Rome less dependent on the ROOT path.
> >
> > Replace in ROMEBuilder.cpp:
> >
> > buffer.AppendFormatted("rootcint -f %sDict.cpp -c -p ",shortCut.Data());
> >
> > by
> >
> > buffer.AppendFormatted("LD_LIBRARY_PATH=$(ROOTSYS)/lib $(ROOTSYS)/bin/rootcint
> > -f %sDict.cpp -c -p ",shortCut.Data());
>
> That's in the cvs now, thanks.
LD_LIBRARY_PATH is not dedecated for ROOT. One can already have it, and overwriting it may cause error.
For instance, if he installed libstdc++ in non-standard place, he will set LD_LIBRARY_PATH there.
In case of GNU Makefile, we can use "if" statemente like,
ifdef LD_LIBRARY_PATH
LD_LIBRARY_PATH += $(ROOTSYS)/lib
else
LD_LIBRARY_PATH := $(ROOTSYS)/lib
endif |
79
|
22 Apr 2005 |
Ryu Sawada | Suggestion | user defined command line options | >
> > Then user can change the variable with command line option like
> > ./megframework -m -t 2;
> >
> > Then builder creates new method.
> > (Bool_t) MEGAnalyzer::GetisMC()
> > (Int_t) MEGAnalyzer::GetTriggerType()
>
> I realized better way. In this way users can add or remove command line options without changing their
> task files. And it is not necessary to add new object in ROME.
>
> What I propose is to make it in steering parameter. That is <SPCOmmandOption> in steering parameter's
> properties.
>
> <SteeringParameterField>
> <SPFieldName>isMC</SPFieldName>
> <SPFieldType>Bool_t</SPFieldType>
> <SPCommandOption>m</SPCommandOption>
> </SteeringParameterField>
> <SteeringParameterField>
> <SPFieldName>TriggerType</SPFieldName>
> <SPFieldType>Int_t</SPFieldType>
> <SPCommandOption>t</SPCommandOption>
> </SteeringParameterField>
>
> Then user can change the variable with command line option like
> ./megframework -m -t 2;
> when -m is typed, isMC becomes true.
> Trigger type will be 2.
>
> They can specify the value both with config file and command line option just same as run numbers.
> Values in config file will be overwritten by command line option.
>
>
done. |
78
|
22 Apr 2005 |
Ryu Sawada | Suggestion | user defined command line options |
> Then user can change the variable with command line option like
> ./megframework -m -t 2;
>
> Then builder creates new method.
> (Bool_t) MEGAnalyzer::GetisMC()
> (Int_t) MEGAnalyzer::GetTriggerType()
I realized better way. In this way users can add or remove command line options without changing their
task files. And it is not necessary to add new object in ROME.
What I propose is to make it in steering parameter. That is <SPCOmmandOption> in steering parameter's
properties.
<SteeringParameterField>
<SPFieldName>isMC</SPFieldName>
<SPFieldType>Bool_t</SPFieldType>
<SPCommandOption>m</SPCommandOption>
</SteeringParameterField>
<SteeringParameterField>
<SPFieldName>TriggerType</SPFieldName>
<SPFieldType>Int_t</SPFieldType>
<SPCommandOption>t</SPCommandOption>
</SteeringParameterField>
Then user can change the variable with command line option like
./megframework -m -t 2;
when -m is typed, isMC becomes true.
Trigger type will be 2.
They can specify the value both with config file and command line option just same as run numbers.
Values in config file will be overwritten by command line option.
|
77
|
18 Apr 2005 |
Matthias Schneebeli | Suggestion | ROOTCINT path | > As ROOTSYS is required for the ROME build, I would suggest to
> include the code below in the builder for the application Makefile.
> This will make Rome less dependent on the ROOT path.
>
> Replace in ROMEBuilder.cpp:
>
> buffer.AppendFormatted("rootcint -f %sDict.cpp -c -p ",shortCut.Data());
>
> by
>
> buffer.AppendFormatted("LD_LIBRARY_PATH=$(ROOTSYS)/lib $(ROOTSYS)/bin/rootcint
> -f %sDict.cpp -c -p ",shortCut.Data());
That's in the cvs now, thanks. |
76
|
18 Apr 2005 |
Pierre-Andre Amaudruz | Suggestion | ROOTCINT path | As ROOTSYS is required for the ROME build, I would suggest to
include the code below in the builder for the application Makefile.
This will make Rome less dependent on the ROOT path.
Replace in ROMEBuilder.cpp:
buffer.AppendFormatted("rootcint -f %sDict.cpp -c -p ",shortCut.Data());
by
buffer.AppendFormatted("LD_LIBRARY_PATH=$(ROOTSYS)/lib $(ROOTSYS)/bin/rootcint
-f %sDict.cpp -c -p ",shortCut.Data()); |
75
|
15 Apr 2005 |
Ryu Sawada | Suggestion | <Online> in configuration file | <Online> in configuration file is MIDAS specific thing. Non MIDAS users don't need it.
And it can be used when MIDAS is linked.
So it is better that <Online> appears only when MIDAS is linked. |
74
|
15 Apr 2005 |
Ryu Sawada | Suggestion | About parameters in definition and configuration file | At first there must be several opinions and discussions. Following is just my opinion.
Probably asking opinion some users before changing ROME is better.
There are some properties for histograms and databases.
* database name
* database type and connection
* field database name and path
* histogram properties
I assume that definition file is shared by several persons in experimental group and configuration files
are created for each users at the first execution. If you assume that we should share also configuration
file, story written below is different.
My basic concept is that
*Parameters which is complicated or will be shared among several users should be in definition file.
*Parameters which can be often changed at run time should be in configuration file.
The good point to specify values in definition file is that they are flexible, because we can use
ROMEString::SetFormatted.
It is outstanding point of ROME that we can design framework very flexibly due to builder.
Other point is that parameters in definition file will be written by programer while those in
configuration file can be written by non-experts. It is better that the application can work with few
changes of configuration file as possible. In my feeling, to specify database paths and histogram
parameters in configuration file correctly is too tough for normal users.
In my opinion, they are separated like,
Definition file:
* field database name and path
* histogram properties
Configuration file:
* database type and connection
* (histogram properties)
-- about database path
Normally, users share the same database structure. So I think it should be in definition file. I don't think
paths are changed so often.
-- about database type and connection
At first type and connection can be written in one line like,
xml://directory_of_database/database_name
mysql://[user_name]:[passwd]@[hostname]:[port]/database_name
none://
( odb://[host_name]/[experiment] or odb://experiment@host_name )
(parameters in [] are optional)
These parameters will be changed user by user, because they can have xml files in different place, and
they can use replicated SQL servers.
Password can be written in connection. So it should be in configuration file.
-- about histogram parameters
We can specify them with calculation if they are in definition file. I think it should be in definition file.
And to allow to overwrite in configuration file is also attractive. In my opinion overwriting with normal
type like Float_t,Int_t... is enough.
---------
In result, my opinion is like following.
Database name, database paths and histogram parameters are in definition file.
In default configuration file, config class writes database entries appeared in definition file.
Config class writes histogram parameters entries with empty values if the histogram is <Configurable>.
Only when
some value is written there, analyzer overwrite these parameters.
As I wrote above I think normal number like following are enough as values of histogram parameters in
configuration file.
<HistXmax>1000</HistXmax>
I don't think following is necessary.
</HistXmax>/GSP/parameter</HistXmax>
Definition file
<Folder>
<FolderName>foldername</FolderName>
<DataBaseAccess>true</DataBaseAccess>
<Field>
<FieldName>fieldname</FieldName>
<FieldType>Float_t</FieldType>
<DataBaseName>first_database</DataBaseName>
<DataBasePath>"/Path/to/record"</DataBasePath>
</Field>
<Field>
<FieldName>fieldname2</FieldName>
<FieldType>Float_t</FieldType>
<DataBaseName>second_database</DataBaseName>
<DataBasePath>"/Path/to/record2"</DataBasePath>
</Field>
</Folder>
...
<Histogram>
<HistName>histname</HistName>
<Configurable>true</Configurable>
<HistType>TH1F</HistType>
<HistTitle>ADC0 Bank</HistTitle>
<HistFolderTitle>ADC</HistFolderTitle>
<HistArraySize>gAnalyzer->GetGSP()->GetNumberOfADC()</HistArraySize>
<HistXNbins>4094</HistXNbins>
<HistXmin>1</HistXmin>
<HistXmax>4095</HistXmax>
</Histogram>
Default configuration file
<DataBases>
<DataBase>
<Name>first_database</Name>
<Connection>none://</Connection>
</DataBase>
<DataBase>
<Name>second_database</Name>
<Connection>none://</Connection>
</DataBase>
</DataBases>
...
<Histogram>
<HistName>histname</HistName>
<HistFolderTitle></HistFolderTitle>
<HistArraySize></HistArraySize>
<HistXNbins></HistXNbins>
<HistXmin></HistXmin>
<HistXmax></HistXmax>
</Histogram> |
73
|
15 Apr 2005 |
Matthias Schneebeli | Suggestion | GetDataBase, GetActiveDAQ | > There is no check if the pointer returned by GetDataBase,GetActiveDAQ is valid. This can result
> segmentation fault.
> For instance, if one specifies DAQ system as "none", or one does not specify DataBaseName, rome
> stops without error message.
>
> It is better to modify this behavior.
>
>
> * One way is to stop application like.
> ROMEDAQSystem* GetActiveDAQ() {
> if(!fActiveDAQ){
> gAnalyzer->Println("some error message");
> fApplication->Terminate(1);
> }
> return fActiveDAQ;
> };
>
> *Other way is to use a dummy DAQSystem and DataBase which does nothing when user does not
> specify DAQ or DataBase. When dummy is used, warning message must be shown, because it is
> dangerous that users do not realize they are using dummy.
done |
72
|
14 Apr 2005 |
Ryu Sawada | Suggestion | GetDataBase, GetActiveDAQ | There is no check if the pointer returned by GetDataBase,GetActiveDAQ is valid. This can result
segmentation fault.
For instance, if one specifies DAQ system as "none", or one does not specify DataBaseName, rome
stops without error message.
It is better to modify this behavior.
* One way is to stop application like.
ROMEDAQSystem* GetActiveDAQ() {
if(!fActiveDAQ){
gAnalyzer->Println("some error message");
fApplication->Terminate(1);
}
return fActiveDAQ;
};
*Other way is to use a dummy DAQSystem and DataBase which does nothing when user does not
specify DAQ or DataBase. When dummy is used, warning message must be shown, because it is
dangerous that users do not realize they are using dummy. |
71
|
09 Apr 2005 |
Daniele Barbareschi | Bug Report | Compiling Builder | I am Daniele Barbareschi, I am a Corrado Gatto's student
I work to interfacing between ALIROOT and MYSQL for CONSTANT CALIBRATION of
subdetector.
There's a bug in compiling...
NAME of file "ROMEXML.h,ROMEXML.cpp" in the ultimate version ROME is lowercase.
The gmake program return error.
Maybe ROMESQL too.
See you those files and similar.
D.B. |
70
|
07 Apr 2005 |
Ryu Sawada | Info | Compiler warning | Followings are warning message from compiler, please check if they are correct.
When I changed line-490 like,
490 while ((obj = iterFolders->Next())) {
warning disappeared.
ROMEAnalyzer.cpp:490: warning: suggest parentheses around assignment used as truth value
//get folder names
485 TObject *obj;
486 TObjArray *names = new TObjArray(100);
487
488 TCollection *folders = folder->GetListOfFolders();
489 TIterator *iterFolders = folders->MakeIterator();
490 while (obj = iterFolders->Next()) {
491 ROMEString str;
492 str.SetFormatted("%s",obj->GetName());
493 names->Add(new TObjString(str.Data()));
494 }
495
ROMEString.cpp:74: warning: `int numberOfDigits' might be used uninitialized in this function
ROMEXMLDataBase.cpp:83: warning: `ROMEXML*xml' might be used uninitialized in this function |
69
|
03 Apr 2005 |
Ryu Sawada | Suggestion | user defined command line options | This is not strong request, just a proposal because the same thing can be done by configuration file.
It may be useful if users can have his command line options.
For instance.
<CommandOptions>
<CommandOption>
<OptionFlag>m<OptionFlag>
<OptionName>isMC<OptionName>
<OptionType>Bool_t<OptionType>
<OptionInitialization>false<OptionInitialization>
</CommandOption>
<CommandOption>
<OptionFlag>t<OptionFlag>
<OptionName>TriggerType<OptionName>
<OptionType>Int_t<OptionType>
<OptionInitialization>0<OptionInitialization>
</COmmandOption>
</CommandOptions>
Then user can change the variable with command line option like
./megframework -m -t 2;
Then builder creates new method.
(Bool_t) MEGAnalyzer::GetisMC()
(Int_t) MEGAnalyzer::GetTriggerType() |
68
|
01 Apr 2005 |
Matthias Schneebeli | Info | Inportant !!! -> Changes in the user code requiered | In the current cvs version of ROME several things have changed that require
changes in the user code.
- Most of the histogram parameters have been moved form the definition file to
the configuration file. Please consult the users guide.
- Database paths have also been moved to the configuration file. Furthermore
the format has changed for string replacements. It looks now like this :
<DataBasePath>"/AAA/BBB[0,%s]",/GSP/NumberOfBBB</DataBasePath>
For folders write : '/FolderName/FieldName'.
The format statement must always be %s!
- The tag 'InputDataFormat' has changed to 'DAQSystem' in the configuration
file.
- All bank access methods have to be accessed by gAnalyzer->GetMidas() not only
gAnalyzer.
Matthias |
67
|
30 Mar 2005 |
Matthias Schneebeli | Info | CVS_RSH | > I recommended to my friend trying ROME, but he couldn't download it, because he didn't set CVS_RSH.
> There is no instruction for setting CVS_RSH in ROME download page.
>
> You had better to write about it.
Yes, thanks |
66
|
29 Mar 2005 |
Ryu Sawada | Suggestion | Input file format | I am going to make a new ROME project to analyze MC data. Input file will be ROOT which is created by
h2root.
And my friend who is working on dark matter search at Columbia university in NY is going to use
ROME. His file format is special binary format.
If I understand correctly, currently ROME can read midas and ROOT format.
Midas file names are always assumed as "run99999.mid". (99999 is run number)
ROOT files need to have structure defined in definition xml file.
I guess this is not enough to analyze special binary format or ROOT files created by h2root.
What I propose is to allow users to have own daq class. It might be something like
<DAQs>
<DAQ>
<DAQName>daqname</DAQName>
</DAQ>
</DAQs>
Then builder creates [shortcut][daqname].h, [shortcut][daqname].cpp.
[shortcut][daqname] class inherits ROMEDAQSystem class, and users must fill GetTimeStamp(),
Initialize(), Connect(), ReadEvent(int event), Disconnect(), Termination()
When "InputDataFormat" in configuration xml file is "daqname" analyzer uses this class.
|
65
|
29 Mar 2005 |
Ryu Sawada | Info | Histograms | It does not seem that fHistoNameTitleOverWritten,fHistoNameFolderTitleOverWritten and so on are not
initialized.
I'm afraid it is not safe
,because when ***OverWritten is "true" parameters are not supposed to be initialized.
In my case, framework tries to make a histogram whose number of bins is 1701143923.
This is my definition of the histogram. Do I need to add something?
<Histogram>
<HistName>hXeQsum</HistName>
<HistTitle>Qsum</HistTitle>
<HistFolderName>Xenon</HistFolderName>
<HistFolderTitle>Xenon</HistFolderTitle>
<HistType>TH1F</HistType>
<HistXNbins>4096</HistXNbins>
<HistXmin>0</HistXmin>
<HistXmax>5e5</HistXmax>
</Histogram> |
64
|
26 Mar 2005 |
Ryu Sawada | Bug Report | problem after changing xml library | After changing xml library from libxml2 to mxml, examples (sample and MEG) can not be compiled.
My project does not work too. What is necessary to make it work? |
63
|
24 Mar 2005 |
Ryu Sawada | Info | CVS_RSH | I recommended to my friend trying ROME, but he couldn't download it, because he didn't set CVS_RSH.
There is no instruction for setting CVS_RSH in ROME download page.
You had better to write about it. |
62
|
23 Mar 2005 |
Matthias Schneebeli | Bug Report | ResetFolders | > > > In ROMEEventLoop.cpp::ReadEvent
> > > this->ResetFolders is called before fActiveDAQ->ReadEvent, so data in event headers are not updated
> > > properly.
> >
> > done
> I wonder if this is the reason why Jan couldn't read scaler events.
> Event ID was shifted by two events, so when scaler event comes, ROME can always recognize it as trigger events.
No the reason for Jan's problem was that rome never requested scaler events from the frontend. This is fixed now. |
61
|
23 Mar 2005 |
Matthias Schneebeli | Info | xmlwriter.h | > I realized that some unix system distribution does not provide xmlwriter.h in standard libxml2-devel
> package.
>
> For instance, scientific linux (also PSI linux) does not.
> I installed it from source.
>
> Macintosh has xmlreader.h by default, and does not xmlwriter.h.
> I installed it by using FINK.
> (FINK is a unix package porter like CYGWIN.)
>
> Someone may ask about it someday.
> A problem is that compiler will find xmlwriter.h even if the system does not have it, because ROME has.
> This may make it hard that users find out the problem.
>
>
> How to install libxml2.
> ---- UNIX OS ----
> In most cases, to use standard way of the system is good. But some system does not provide xmlwriter.h. In this case you may need to
> install it from source.
> 1. download source from <a href="http://xmlsoft.org/">http://xmlsoft.org/</a>.
> 2. decompress it and go to created directory.
> 3. % ./configure [options as you like];
> 4. % make;
> 5. become super user, if you are going to install it in system.
> 6. % make install
>
> ---- MacOSX ----
> By default, Macintosh does not have xmlwriter.h. You can follow the same way as other UNIX OS. And other way is to use FINK. (I hope
> many users already installed it.)
> 1. install FINK (<a href="http://fink.sourceforge.net">http://fink.sourceforge.net</a>)
> 2. become super user.
> 3. apt-get update;
> 4. apt-get install libxml2 libxml2-shlibs libxml2-bin
> If you are goint to use also MySQL.
> 5. apt-get install mysql12-dev mysql12-shlibs
> (* package name can be changed in future, you may find it with "apt-cache search libxml2" or "apt-cache search mysql")
I have replaced libxml with mxml (written by Stefan) which is now included in the rome distribution.
So there's no install problem on linux anymore. |
60
|
21 Mar 2005 |
Ryu Sawada | Bug Report | ResetFolders | > > In ROMEEventLoop.cpp::ReadEvent
> > this->ResetFolders is called before fActiveDAQ->ReadEvent, so data in event headers are not updated
> > properly.
>
> done
I wonder if this is the reason why Jan couldn't read scaler events.
Event ID was shifted by two events, so when scaler event comes, ROME can always recognize it as trigger events. |
59
|
21 Mar 2005 |
Matthias Schneebeli | Bug Report | Unanalyzed events | > In online mode, ROME often stops before finishing to analyze all events of runs.
> When it happens, gAnalyzer->GetCurrentEventNumber() starts not from 1 but from analyzed event
> number at previous run. And unanalyzed events at the previous run are mixed with the new run.
>
> In mana.c of MIDAS, I found a part to wait until all events in buffers are analyzed when analyzer gets
> TR_STOP signal, while ROME does not have.
>
> I personaly don't need that all events are analyzed, but it is really problem that data of two runs are
> mixed.
>
> One way is to take similar way as midas analyzer, and the another way is just discard unanalyzed
> events.
done |
58
|
21 Mar 2005 |
Matthias Schneebeli | Bug Report | ResetFolders | > In ROMEEventLoop.cpp::ReadEvent
> this->ResetFolders is called before fActiveDAQ->ReadEvent, so data in event headers are not updated
> properly.
done |
57
|
21 Mar 2005 |
Matthias Schneebeli | Info | Run number in online mode | > We usually use ROME framework without specifying run number in romeConfig.xml and command line
> in online mode.
>
> Then it warns that "Error in <TArrayI::At>: index 0 out of bounds" when gROME-
> >GetRunNumberStringAt(runNumberString,0) is called in ROMEEventLoop::Initialize.
done |
56
|
21 Mar 2005 |
Matthias Schneebeli | Bug Report | small problem of XML definition file | > About <EventHeader> in xml definition file.
>
> In description page in ROME homepage, It is wirtten that <EventId> specifies the field.
> But It seems that 'd' shoud be capital.
done |
55
|
18 Mar 2005 |
Ryu Sawada | Info | xmlwriter.h | I realized that some unix system distribution does not provide xmlwriter.h in standard libxml2-devel
package.
For instance, scientific linux (also PSI linux) does not.
I installed it from source.
Macintosh has xmlreader.h by default, and does not xmlwriter.h.
I installed it by using FINK.
(FINK is a unix package porter like CYGWIN.)
Someone may ask about it someday.
A problem is that compiler will find xmlwriter.h even if the system does not have it, because ROME has.
This may make it hard that users find out the problem.
How to install libxml2.
---- UNIX OS ----
In most cases, to use standard way of the system is good. But some system does not provide xmlwriter.h. In this case you may need to
install it from source.
1. download source from http://xmlsoft.org/.
2. decompress it and go to created directory.
3. % ./configure [options as you like];
4. % make;
5. become super user, if you are going to install it in system.
6. % make install
---- MacOSX ----
By default, Macintosh does not have xmlwriter.h. You can follow the same way as other UNIX OS. And other way is to use FINK. (I hope
many users already installed it.)
1. install FINK (http://fink.sourceforge.net)
2. become super user.
3. apt-get update;
4. apt-get install libxml2 libxml2-shlibs libxml2-bin
If you are goint to use also MySQL.
5. apt-get install mysql12-dev mysql12-shlibs
(* package name can be changed in future, you may find it with "apt-cache search libxml2" or "apt-cache search mysql") |
54
|
13 Mar 2005 |
Ryu Sawada | Info | Warning message from compiler (These are just warnings, not problems) | I will summarize some points which g++ warned.
(1) I fixed following points.
*Made destructor of ROMEConfig and ROMEDataBase virtual.
*Removed or comment out unused variables.
int i in ROMEPATH::~ROMEPath()
char* defaultRow in ROMESQL::ReadField
char* c in ROMEString::SetFormatted
int istart,iend,iValue,jValue in ROMEXMLDataBase::Read
int istep,iValue,jValue in ROMEXMLDataBase::Write
ROMEStrArray *array in ROMEXMLDataBase::Write
(2) Following points are not fixed yet.
* There can be unused "int i" in several codes which builder generates. (ex. XXAnalyzer::InitMidasBanks
)
This is not a problem, but a little bit annoying. If it is very easy, please fix it.
* Please make sure this is not a problem.
in ROMEAnalyzer:: ResponseFunction
while (obj = iterFolders->Next()) {
ROMEString str;
str.SetFormatted("%s",obj->GetName());
names->Add(new TObjString(str.Data()));
}
*ROMEString.cpp:74: warning: `int numberOfDigits' might be used uninitialized in this function
*ROMEXMLDataBase.cpp:80: warning: `ROMEXML*xml' might be used uninitialized in this function
(3) This is not warning from g++, but request from me.
If it is very easy, please make ROMEString::SetFormatted,AppendFormatted to check that number of
arguments is correct. |
53
|
11 Mar 2005 |
Ryu Sawada | Info | make build | I added new make target "build" in ARGUS. It may be useful also for ROME users.
in WriteMakefile(char* xmlFile)
.
.
.
int pdnameend = 0;
int pbnamestart = 0;
ROMEString xmlfile = xmlFile;
while((pdnameend = xmlfile.Index("/",1,pbnamestart,TString::kExact))!=-1)
pbnamestart = pdnameend+1;
ROMEString xmlbasename = xmlfile(pbnamestart,xmlfile.Length());
buffer.AppendFormatted("build::\n");
buffer.AppendFormatted(" $(ROMESYS)/bin/romebuilder.exe -i %s -o .",xmlbasename.Data());
if (makeOutput)
buffer.AppendFormatted(" -v");
if(noLink)
buffer.AppendFormatted(" -nl");
if(midas)
buffer.AppendFormatted(" -midas");
if(!sql)
buffer.AppendFormatted(" -nosql");
buffer.AppendFormatted("\n");
.
.
. |
52
|
10 Mar 2005 |
Ryu Sawada | Bug Report | ResetFolders | In ROMEEventLoop.cpp::ReadEvent
this->ResetFolders is called before fActiveDAQ->ReadEvent, so data in event headers are not updated
properly. |
51
|
09 Mar 2005 |
Ryu Sawada | Bug Report | default values in romeConfig.xml | Recently, default values of steering parameters in romeConfig.xml are always 0. They are not as same
as values in SPFieldInitialization of definition XML file. |
50
|
09 Mar 2005 |
Ryu Sawada | Bug Report | Unanalyzed events | In online mode, ROME often stops before finishing to analyze all events of runs.
When it happens, gAnalyzer->GetCurrentEventNumber() starts not from 1 but from analyzed event
number at previous run. And unanalyzed events at the previous run are mixed with the new run.
In mana.c of MIDAS, I found a part to wait until all events in buffers are analyzed when analyzer gets
TR_STOP signal, while ROME does not have.
I personaly don't need that all events are analyzed, but it is really problem that data of two runs are
mixed.
One way is to take similar way as midas analyzer, and the another way is just discard unanalyzed
events. |
49
|
06 Mar 2005 |
Ryu Sawada | Suggestion | Cint mode on online | We sometimes want to use trees in ROME.
One way is to read it by TSocket connection. But treees are larger than histograms in general, and it
takes time to download.
And I need to make shared library when I changed the structure of folders.
So, I want to propose is to prepare Cint mode with continueing analysis in background.
Currently, when user press "i", ROME stops analysis and goes into cint mode. This is good for offline
mode, but this is not good for online mode. So I propose that when user press "I", ROME goes cint
mode, and continue analysis in background.
Then we can see Trees at run time.
In addition, If you are going to implement this feature, please prepare short way to call trees in cint mode.
If I understand correctly, the way to call a tree is like,
gAnalyzer->GetTreeObjectAt(0)->GetTree()->Draw("");
but it is too long to use in interactively and we need to remeber the number of trees.
gAnalyzer->GetTree("trigger")->Draw(); is better. |
48
|
28 Feb 2005 |
Ryu Sawada | Info | Run number in online mode | We usually use ROME framework without specifying run number in romeConfig.xml and command line
in online mode.
Then it warns that "Error in <TArrayI::At>: index 0 out of bounds" when gROME-
>GetRunNumberStringAt(runNumberString,0) is called in ROMEEventLoop::Initialize. |
47
|
05 Feb 2005 |
Ryu Sawada | Bug Report | small problem of XML definition file | About <EventHeader> in xml definition file.
In description page in ROME homepage, It is wirtten that <EventId> specifies the field.
But It seems that 'd' shoud be capital. |
46
|
28 Jan 2005 |
Matthias Schneebeli | Suggestion | messaging system | > > I implemented the cm_msg calls.
>
> You should implement a central "message dispatcher". So all errors etc. should go to someting linke
> rome_msg(). If compiled with midas online support, rome_msg() should call cm_msg(). If rome is compiled
> without midas libraries, a printf() there would be enough. If someone uses rome in a different
> environment, only can function needs to be changed to reroute all messages to somewhere else.
Of course, that's the way I implemented that. |
45
|
27 Jan 2005 |
Stefan Ritt | Suggestion | messaging system | > I implemented the cm_msg calls.
You should implement a central "message dispatcher". So all errors etc. should go to someting linke
rome_msg(). If compiled with midas online support, rome_msg() should call cm_msg(). If rome is compiled
without midas libraries, a printf() there would be enough. If someone uses rome in a different
environment, only can function needs to be changed to reroute all messages to somewhere else. |
44
|
27 Jan 2005 |
Matthias Schneebeli | Suggestion | messaging system | > About warnings,errors and informations output in online mode.
>
> Probably we lauch ROME from web interface of MIDAS. And we don't see console of ROME.
> But we need to hear what ROME is saying.
>
> Normally midas analyzer and other applications use cm_msg function. This function shows messages
> proper place like web interface or ODBEdit windows and so on.
>
> I do not have much knowledge about it. Stefan may know better way.
I implemented the cm_msg calls. |
43
|
25 Jan 2005 |
Matthias Schneebeli | Info | small problems | > These are not critical, but someone may complain some day.
>
> 1. ROMEBuilder.cpp:2315
> I wonder if maxNumberOfTasks should be maxNumberOfSteering.
> // count steering parameters
> 2316 numOfSteering[iTask]++;
> 2317 currentNumberOfSteerings = numOfSteering[iTask];
> 2318 if (numOfSteering[iTask]>=maxNumberOfTasks+1) {
> 2319 cout << "Maximal number of steering parameters reached : " << (max 2319
> NumberOfTasks+1) << " !" << endl;
> 2320 cout << "Terminating program." << endl;
> 2321 return false;
> 2322 }
>
> 2. ROMEBuilder.cpp:2437
> I wonder if maxNumberOfSteering should be maxNumberOfSteeringField.
> if (numOfSteerFields[iTask][actualSteerIndex]>=maxNumberOfSteer
> 2437 ing) {
> 2438 cout << "Maximal number of steering parameter fields in task 2438 '" <<
> taskName[iTask].Data() << "' reached : " << maxNumberOfSteering < 2438 < " !" << endl;
> 2439 cout << "Terminating program." << endl;
> 2440 return false;
> 2441 }
>
>
> 3. ROMEBuilder.cpp:6327
> I wonder if ROOTSYS should be ROOTSYS/include.
> 6327 #if defined( _MSC_VER )
> 6328 buffer.AppendFormatted("-I%%ROMESYS%%/include ");
> 6329 buffer.AppendFormatted("-I%%ROOTSYS%% ");
> 6330 #endif
> 6331 #if defined ( __linux__ ) || defined ( __APPLE__ )
> 6332 buffer.AppendFormatted("-I$ROMESYS/include ");
> 6333 buffer.AppendFormatted("-I$ROOTSYS ");
> 6334 #endif
>
> 4. ROMEBuilder.cpp:6806
> in ROMEBuilder::isNumber, there are some missing number types such as.
> Double32_t,Long64_t,ULong64_t
>
> 5. ROMEBuilder.cpp:6821
> in ROMEBuilder::isFloatingType, there are some missing floating types such as.
> Double32_t
Thanks |
42
|
24 Jan 2005 |
Ryu Sawada | Info | small problems | These are not critical, but someone may complain some day.
1. ROMEBuilder.cpp:2315
I wonder if maxNumberOfTasks should be maxNumberOfSteering.
// count steering parameters
2316 numOfSteering[iTask]++;
2317 currentNumberOfSteerings = numOfSteering[iTask];
2318 if (numOfSteering[iTask]>=maxNumberOfTasks+1) {
2319 cout << "Maximal number of steering parameters reached : " << (max 2319
NumberOfTasks+1) << " !" << endl;
2320 cout << "Terminating program." << endl;
2321 return false;
2322 }
2. ROMEBuilder.cpp:2437
I wonder if maxNumberOfSteering should be maxNumberOfSteeringField.
if (numOfSteerFields[iTask][actualSteerIndex]>=maxNumberOfSteer
2437 ing) {
2438 cout << "Maximal number of steering parameter fields in task 2438 '" <<
taskName[iTask].Data() << "' reached : " << maxNumberOfSteering < 2438 < " !" << endl;
2439 cout << "Terminating program." << endl;
2440 return false;
2441 }
3. ROMEBuilder.cpp:6327
I wonder if ROOTSYS should be ROOTSYS/include.
6327 #if defined( _MSC_VER )
6328 buffer.AppendFormatted("-I%%ROMESYS%%/include ");
6329 buffer.AppendFormatted("-I%%ROOTSYS%% ");
6330 #endif
6331 #if defined ( __linux__ ) || defined ( __APPLE__ )
6332 buffer.AppendFormatted("-I$ROMESYS/include ");
6333 buffer.AppendFormatted("-I$ROOTSYS ");
6334 #endif
4. ROMEBuilder.cpp:6806
in ROMEBuilder::isNumber, there are some missing number types such as.
Double32_t,Long64_t,ULong64_t
5. ROMEBuilder.cpp:6821
in ROMEBuilder::isFloatingType, there are some missing floating types such as.
Double32_t |
41
|
20 Jan 2005 |
Ryu Sawada | Suggestion | headers of midas,xml2 and mysql | > This is not so strong suggestion. I am just wondering.
>
> Currently ROME include headers of midas, xml2 and mysql.
> There are libraries for windows but no libraries for linux.
>
> I am afraid that there can be inconsequence between headers and libraries in futrue updates of these
> libraries, if compiler reads headers from rome/include instead of correct one.
>
> So, my suggestion is that move midas.h,libxml2 and mysql outside of header files search path for linux.
>
> for instance
> Make new directory rome/include/win.
> Put midas.h,libxml2 and mysql into it.
> Add $ROMESYS/include/win into header files search path in case of Windows.
>
>
> P.S.
> If midas.h is already very different from midas.h in MIDAS. This may be difficult.
I looked into gcc, then I found the header file which is found first is supposed to be used.
In ROME's case $(shell xml2-config --cflags) and $(shell mysql_config --cflags) are located before -I$(ROMESYS)/include/, so in principle
it is safe.
But about midas.h there still can be inconsequence, because -I$(ROMESYS)/include/ is located before -I$(MIDASSYS)/include/.
It this done on purpose to enable special features for ROME ?
---
One more thing. about libpaths.
If libpaths will be used only for specify the place where midas libraries were put. Followings can also work and more simple.
And I added midascflags, because to use same way as root,xml2 and mysql seems more beautiful.
And I moved -DHAVE_SQL and -DHAVE_MIDAS to sqlcflags and midascflags.
rootlibs := $(shell root-config --libs)
rootglibs := $(shell root-config --glibs)
rootcflags := $(shell root-config --cflags)
rootthreadlibs := -lThread
xmllibs := $(shell xml2-config --libs)
xmlcflags := $(shell xml2-config --cflags)
sqllibs := $(shell mysql_config --libs)
sqlcflags := $(shell mysql_config --cflags) -DHAVE_SQL
midaslibs := -L$(MIDASSYS)/lib -lmidas
midascflags := -I$(MIDASSYS)/include -DHAVE_MIDAS
clibs :=-lpthread -lHtml $(SYSLIBS)
clibs += -lutil
Libraries := $(libpaths) $(rootlibs) $(rootglibs) $(rootthreadlibs) $(xmllibs) $(clibs) $(sqllibs) $(midaslibs)
Flags := $(lpuserflags) $(rootcflags) $(xmlcflags) $(sqlcflags) $(midascflags)
Includes := -I$(ROMESYS)/include/ -I. -Iinclude/ -Iinclude/tasks/ -Iinclude/framework/ |
40
|
19 Jan 2005 |
Ryu Sawada | Suggestion | messaging system | About warnings,errors and informations output in online mode.
Probably we lauch ROME from web interface of MIDAS. And we don't see console of ROME.
But we need to hear what ROME is saying.
Normally midas analyzer and other applications use cm_msg function. This function shows messages
proper place like web interface or ODBEdit windows and so on.
I do not have much knowledge about it. Stefan may know better way. |
39
|
19 Jan 2005 |
Ryu Sawada | Suggestion | headers of midas,xml2 and mysql | This is not so strong suggestion. I am just wondering.
Currently ROME include headers of midas, xml2 and mysql.
There are libraries for windows but no libraries for linux.
I am afraid that there can be inconsequence between headers and libraries in futrue updates of these
libraries, if compiler reads headers from rome/include instead of correct one.
So, my suggestion is that move midas.h,libxml2 and mysql outside of header files search path for linux.
for instance
Make new directory rome/include/win.
Put midas.h,libxml2 and mysql into it.
Add $ROMESYS/include/win into header files search path in case of Windows.
P.S.
If midas.h is already very different from midas.h in MIDAS. This may be difficult. |
38
|
17 Jan 2005 |
Matthias Schneebeli | Bug Report | user input | > After change of ROMEEventLoop.cpp 1.39, Program steerings don't work on Linux.
Sorry. |
37
|
16 Jan 2005 |
Ryu Sawada | Bug Report | user input | After change of ROMEEventLoop.cpp 1.39, Program steerings don't work on Linux. |
36
|
12 Jan 2005 |
Ryu Sawada | Bug Report | invalid header | When I built my application with romebuilder.
It complained like,
Error : File './/src/tasks/LPTXEGainCalib.cpp' has an invalid header !!!
Error : File './/src/tasks/LPTXETimeCalib.cpp' has an invalid header !!!
Error : File './/src/tasks/LPTUTTask.cpp' has an invalid header !!!
Headers looks like,
//// Author: Ryu Sawada
/////////////^@//////////////////////////////////////////////////////////////////
// //
Thre first time to build Just after I removed ^@, builder stopped warning.
But after that ^@ appeared again and builder starts warning.
I have several task files, but builder adds ^@ always these three files.
My source files are here.
cvs -d :ext:pc4466.psi.ch:/usr/local/cvsroot co lpframework |
35
|
11 Jan 2005 |
Matthias Schneebeli | Suggestion | user defined link in html file | > I was asked to put change log of my rome application(LPframewok). I think the best place to put it is the
> html file which builder created. But of course to modify it is not good, because it will be overwritten by
> builder again.
>
> So, I want to propose to allow user to add links in the html file with the way like followings.
>
> (i) User defines links.
> ------ in LPframewok.xml ------
> <DocumentLinks>
> <DocumentLink>
> <Href>html/changelog.html</Href>
> <Text>Change log</Text>
> </DocumentLink>
> </DocumentLinks>
> -----------------------------------
>
> (ii)And html files looks like
> -----------------------------------
> Table of Contents
>
> Introduction
> Objects in the LPframework
> ? Tasks
> ? Folders
> ? Trees
> ? Midas Banks
> Access Methods to Objects in the LPframework
> ? Folders
> ? Data Base
> ? Steering Parameters
> ? Histograms
> ? Midas Banks
> ? General
> Class Overview
> Links
> ? Change log
> -----------------------------------
>
> (iii)Users must write the target(html/changelog.html).
There will be a new link available "Additional Info" after "Class Overview".
This points to a file named "UserHTML.html" which can be modified by the user. |
34
|
10 Jan 2005 |
Matthias Schneebeli | Bug Report | long task description | > When I made task description longer than about 80 characters. The description was not written in html
> file propery. It was shorten.
>
> I guess following lines in ROMEBuilder.cpp are relating to this.
>
>
> -----------
> pos = (char*)taskDescription[iTask].Data();
> lenTot = taskDescription[iTask].Length();
> while (pos-taskDescription[iTask].Data() < lenTot) {
> if (lenTot+(taskDescription[iTask].Data()-pos)<74)
> i=TMath::Min(75,lenTot);
> else for (i=74;pos[i]!=32&&i>0;i--) {}
> if (i<=0)
> i=TMath::Min(75,lenTot);
> pos[i] = 0;
> buffer.AppendFormatted("// %-74.74s \n",pos);
> pos = pos+i+1;
> }
done. thanks. |
33
|
10 Jan 2005 |
Matthias Schneebeli | Bug Report | long task description | > When I made task description longer than about 80 characters. The description was not written in html
> file propery. It was shorten.
>
> I guess following lines in ROMEBuilder.cpp are relating to this.
>
>
> -----------
> pos = (char*)taskDescription[iTask].Data();
> lenTot = taskDescription[iTask].Length();
> while (pos-taskDescription[iTask].Data() < lenTot) {
> if (lenTot+(taskDescription[iTask].Data()-pos)<74)
> i=TMath::Min(75,lenTot);
> else for (i=74;pos[i]!=32&&i>0;i--) {}
> if (i<=0)
> i=TMath::Min(75,lenTot);
> pos[i] = 0;
> buffer.AppendFormatted("// %-74.74s \n",pos);
> pos = pos+i+1;
> }
done. thanks. |
32
|
09 Jan 2005 |
Ryu Sawada | Bug Report | long task description | When I made task description longer than about 80 characters. The description was not written in html
file propery. It was shorten.
I guess following lines in ROMEBuilder.cpp are relating to this.
-----------
pos = (char*)taskDescription[iTask].Data();
lenTot = taskDescription[iTask].Length();
while (pos-taskDescription[iTask].Data() < lenTot) {
if (lenTot+(taskDescription[iTask].Data()-pos)<74)
i=TMath::Min(75,lenTot);
else for (i=74;pos[i]!=32&&i>0;i--) {}
if (i<=0)
i=TMath::Min(75,lenTot);
pos[i] = 0;
buffer.AppendFormatted("// %-74.74s \n",pos);
pos = pos+i+1;
} |
31
|
06 Jan 2005 |
Ryu Sawada | Suggestion | user defined link in html file | I was asked to put change log of my rome application(LPframewok). I think the best place to put it is the
html file which builder created. But of course to modify it is not good, because it will be overwritten by
builder again.
So, I want to propose to allow user to add links in the html file with the way like followings.
(i) User defines links.
------ in LPframewok.xml ------
<DocumentLinks>
<DocumentLink>
<Href>html/changelog.html</Href>
<Text>Change log</Text>
</DocumentLink>
</DocumentLinks>
-----------------------------------
(ii)And html files looks like
-----------------------------------
Table of Contents
Introduction
Objects in the LPframework
? Tasks
? Folders
? Trees
? Midas Banks
Access Methods to Objects in the LPframework
? Folders
? Data Base
? Steering Parameters
? Histograms
? Midas Banks
? General
Class Overview
Links
? Change log
-----------------------------------
(iii)Users must write the target(html/changelog.html). |
30
|
04 Jan 2005 |
Matthias Schneebeli | Bug Report | Multiple TTree writing | > When I make two TTree's write flag true. Both TTrees is written in one file. And the other file is empty.
>
> I added some lines to fix it in ROMEEventLoop.cpp
>
> -------
> This is other topic.
> Probably, to close TFile after each run is good.
> Because, when program runs for several run,
> even if program aborts after some runs, files of former runs are safe.
>
>
>
> -------
> 941 // Write non accumulative output tree files
> 942 ROMEString filename;
> 943 ROMETree *romeTree;
> 944 TTree *tree;
> 945 TFile *fTreeFile;
> 946 ROMEString runNumberString;
> 947 gROME->GetCurrentRunNumberString(runNumberString);
> 948 for (int j=0;j<gROME->GetTreeObjectEntries();j++) {
> 949 romeTree = gROME->GetTreeObjectAt(j);
> 950 fTreeFile = fTreeFiles[j];
> 951 if (romeTree->isWrite() && !gROME->isTreeAccumulation()) {
> 952 tree = romeTree->GetTree();
> 953 cout << "Writing Root-File " << tree->GetName() << runNumberString.Data() << ".root"
> << endl;
> 954 fTreeFile->cd();
> 955 tree->Write("",TObject::kOverwrite);
> 956 }
> 957 }
> 958 cout << endl;
Thanks |
29
|
01 Jan 2005 |
Ryu Sawada | Bug Report | Multiple TTree writing | When I make two TTree's write flag true. Both TTrees is written in one file. And the other file is empty.
I added some lines to fix it in ROMEEventLoop.cpp
-------
This is other topic.
Probably, to close TFile after each run is good.
Because, when program runs for several run,
even if program aborts after some runs, files of former runs are safe.
-------
941 // Write non accumulative output tree files
942 ROMEString filename;
943 ROMETree *romeTree;
944 TTree *tree;
945 TFile *fTreeFile;
946 ROMEString runNumberString;
947 gROME->GetCurrentRunNumberString(runNumberString);
948 for (int j=0;j<gROME->GetTreeObjectEntries();j++) {
949 romeTree = gROME->GetTreeObjectAt(j);
950 fTreeFile = fTreeFiles[j];
951 if (romeTree->isWrite() && !gROME->isTreeAccumulation()) {
952 tree = romeTree->GetTree();
953 cout << "Writing Root-File " << tree->GetName() << runNumberString.Data() << ".root"
<< endl;
954 fTreeFile->cd();
955 tree->Write("",TObject::kOverwrite);
956 }
957 }
958 cout << endl; |
28
|
21 Dec 2004 |
Matthias Schneebeli | Bug Report | -e option | > When I used "-e" option in generated framework. It stopped immediately after starting analysis.
>
> When I commented out following two lines in ROMEEventLoop.cpp. It worked.
>
> // check event numbers
> int status = gROME->CheckEventNumber(event);
> if (status==0) {
> // this->SetContinue();
> // return true;
> }
the syntax is : -e 100-200,205,300-400 |
27
|
21 Dec 2004 |
Matthias Schneebeli | Bug Report | ReadConfiguration | > I can not change some global steering parameters.
> In my LPConfig::ReadConfiguration in LPConfig.cpp which was generated by builder.
>
> There is a line like
> xml->GetPathValue(path+"/GlobalSteeringParameters/child::SteeringParameterGroup[child::
> SPGroupName='Switch']/child::SteeringParameterGroup[child::SPGroupName='RunMode']/child::
> SteeringParameterField[child::SPName='Pedestal']/SPValue",fConfigData[index]->fGlobalSteering-
> >fRunMode->fPedestal,"");
>
> but it should be
> xml->GetPathValue(path+"/GlobalSteeringParameters/child::SteeringParameterGroup[child::
> SPGroupName='RunMode']/child::SteeringParameterField[child::SPName='Pedestal']/
> SPValue",fConfigData[index]->fGlobalSteering->fRunMode->fPedestal,"");
>
>
> ****
> one small other bug.
> when I start my framework with -h option, rome shows
> -i Configuration file (default ROMEConfig.xml)
> but default is romeConfig.xml
> ***
>
> <GlobalSteeringParameters>
> <SteeringParameterGroup>
> <SPGroupName>Switch</SPGroupName>
> <SteeringParameterField>
> <SPFieldName>ADC1</SPFieldName>
> <SPFieldType>Bool_t</SPFieldType>
> <SPFieldInitialization>1</SPFieldInitialization>
> </SteeringParameterField>
> <SteeringParameterField>
> <SPFieldName>WriteDataBase</SPFieldName>
> <SPFieldType>Bool_t</SPFieldType>
> <SPFieldInitialization>0</SPFieldInitialization>
> </SteeringParameterField>
> </SteeringParameterGroup>
> <SteeringParameterGroup>
> <SPGroupName>RunMode</SPGroupName>
> <SteeringParameterField>
> <SPFieldName>Pedestal</SPFieldName>
> <SPFieldType>Short_t</SPFieldType>
> <SPFieldInitialization>0</SPFieldInitialization>
> </SteeringParameterField>
> <SteeringParameterField>
> <SPFieldName>Normal</SPFieldName>
> <SPFieldType>Short_t</SPFieldType>
> <SPFieldInitialization>1</SPFieldInitialization>
> </SteeringParameterField>
> </SteeringParameterGroup>
> </GlobalSteeringParameters>
done |
26
|
06 Dec 2004 |
Ryu Sawada | Bug Report | ReadConfiguration | I can not change some global steering parameters.
In my LPConfig::ReadConfiguration in LPConfig.cpp which was generated by builder.
There is a line like
xml->GetPathValue(path+"/GlobalSteeringParameters/child::SteeringParameterGroup[child::
SPGroupName='Switch']/child::SteeringParameterGroup[child::SPGroupName='RunMode']/child::
SteeringParameterField[child::SPName='Pedestal']/SPValue",fConfigData[index]->fGlobalSteering-
>fRunMode->fPedestal,"");
but it should be
xml->GetPathValue(path+"/GlobalSteeringParameters/child::SteeringParameterGroup[child::
SPGroupName='RunMode']/child::SteeringParameterField[child::SPName='Pedestal']/
SPValue",fConfigData[index]->fGlobalSteering->fRunMode->fPedestal,"");
****
one small other bug.
when I start my framework with -h option, rome shows
-i Configuration file (default ROMEConfig.xml)
but default is romeConfig.xml
***
<GlobalSteeringParameters>
<SteeringParameterGroup>
<SPGroupName>Switch</SPGroupName>
<SteeringParameterField>
<SPFieldName>ADC1</SPFieldName>
<SPFieldType>Bool_t</SPFieldType>
<SPFieldInitialization>1</SPFieldInitialization>
</SteeringParameterField>
<SteeringParameterField>
<SPFieldName>WriteDataBase</SPFieldName>
<SPFieldType>Bool_t</SPFieldType>
<SPFieldInitialization>0</SPFieldInitialization>
</SteeringParameterField>
</SteeringParameterGroup>
<SteeringParameterGroup>
<SPGroupName>RunMode</SPGroupName>
<SteeringParameterField>
<SPFieldName>Pedestal</SPFieldName>
<SPFieldType>Short_t</SPFieldType>
<SPFieldInitialization>0</SPFieldInitialization>
</SteeringParameterField>
<SteeringParameterField>
<SPFieldName>Normal</SPFieldName>
<SPFieldType>Short_t</SPFieldType>
<SPFieldInitialization>1</SPFieldInitialization>
</SteeringParameterField>
</SteeringParameterGroup>
</GlobalSteeringParameters> |
25
|
06 Dec 2004 |
Matthias Schneebeli | Bug Report | ss_getchar | > When romeConfig.xml does not exist. Rome goes to infinite loop.
>
> I think the problem is ss_getchar.
> ROMEAnalyzer::ss_getchar does not seem to work on Linux ,because OS_UNIX is not defined.
>
> "ends" is needed in following line.
> cout << "Do you like the framework to generate a new configuration file ([y]/n) ? "<<ends;
> otherwise this line does not appear before user hits keyboard.
done |
24
|
06 Dec 2004 |
Ryu Sawada | Info | Changeable folder as branch a tree | I tried to make changeable folder a branch of tree.
I could process data. Rome succeeded to write the tree.
But when I tried to draw a leaf of the branch, root complains that the class name is invalid. |
23
|
03 Dec 2004 |
Ryu Sawada | Bug Report | -e option | When I used "-e" option in generated framework. It stopped immediately after starting analysis.
When I commented out following two lines in ROMEEventLoop.cpp. It worked.
// check event numbers
int status = gROME->CheckEventNumber(event);
if (status==0) {
// this->SetContinue();
// return true;
} |
22
|
02 Dec 2004 |
Ryu Sawada | Suggestion | Midas event definition | I finished Macintosh porting.
I checked it in offline mode , but not yet online mode.
I needed to add byte swapping code.
For bank swapping, if HAVE_MIDAS is defined it uses bk_swap in midas.h, in the other case it uses
ROMEEventLoop::bk_swap.
Byte swapping will be done if cpu is PowerPC (MacOSX or Linux on Macintosh). Data should be written
on little-endian machine like Intel.
Important point is If there is banks whose type is not MIDAS, rome may not work on Macintosh.
I want to propose a new MidasBanks scheme of xml file to fix this problem. Structure of EventDefinition
is according to EVENT_DEF in mana.c.
When rome reads Midas file(offline) or ODB(odb), if the event ID is listed in xml configuration file and
"Disabled" is false and Format is MIDAS, rome reads banks listed for the event ID, in the other case rome skips the event and goes to next
event.
Probably this way will help statistics handling in online mode for also Intel platform. Because at this
moment, rome assumes "Equipment" in ODB is always "Trigger" and "Scaler". But of coarse there can be
other equipments. (There is possibility that ODB does not have "Scaler" too)
<MidasBanks>
<EventHeader>
<Folder>Event</Folder>
<EventId>ID</EventId>
<TriggerMask>Mask</TriggerMask>
<SerialNumber>Eventnumber</SerialNumber>
<TimeStamp>Time</TimeStamp>
</EventHeader>
<EventDefinition>
<EventName>Trigger</EventName>
<EventId>1</EventId>
<Format>MIDAS</Format>
<Disabled>false</Disabled>
<Banks>
<Bank>
<BankName>ADC0</BankName>
<BankType>unsigned short</BankType>
</Bank>
<Bank>
<BankName>TDC0</BankName>
<BankType>unsigned short</BankType>
</Bank>
</Banks>
</EventDefinition>
<EventDefinition>
<EventName>Scaler</EventName>
<EventId>2</EventId>
<Format>YBOS</Format>
<Disabled>true</Disabled>
<Banks>
<Bank>
<BankName>SCLR</BankName>
<BankType>unsigned long</BankType>
<Bank>
</Banks>
</EventDefinition>
<EventDefinition>
<EventName>HV</EventName>
<EventId>3</EventId>
<Format>FIXED</Format>
<Disabled>true</Disabled>
</EventDefinition>
</MidasBanks>
P.S.
If there is no plan to support YBOS and FIXED format. <Format> is not needed definitly. |
21
|
27 Nov 2004 |
Ryu Sawada | Bug Report | ss_getchar | When romeConfig.xml does not exist. Rome goes to infinite loop.
I think the problem is ss_getchar.
ROMEAnalyzer::ss_getchar does not seem to work on Linux ,because OS_UNIX is not defined.
"ends" is needed in following line.
cout << "Do you like the framework to generate a new configuration file ([y]/n) ? "<<ends;
otherwise this line does not appear before user hits keyboard. |
20
|
19 Nov 2004 |
Ryu Sawada | Bug Report | GlobalSteering | > > When I define several "SteeringParameterGroup"s, builder maked nesting classes instead to make each
> > classes.
>
> done
It is still not fixed. In case of following configuration.
"InvalidValue" was in "Switch" class.
Is it invalid to put a SteeringParameterField after SteeringParameterGroup ?
<GlobalSteeringParameters>
<SteeringParameterGroup>
<SPGroupName>Switch</SPGroupName>
<SteeringParameterField>
<SPFieldName>Piedi</SPFieldName>
<SPFieldType>Bool_t</SPFieldType>
<SPFieldInitialization>0</SPFieldInitialization>
<SPFieldComment>Switch for pedestal calculation</SPFieldComment>
</SteeringParameterField>
</SteeringParameterGroup>
<SteeringParameterField>
<SPFieldName>InvalidValue</SPFieldName>
<SPFieldType>Float_t</SPFieldType>
<SPFieldInitialization>-1000</SPFieldInitialization>
<SPFieldComment>Invalid value</SPFieldComment>
</SteeringParameterField>
</GlobalSteeringParameters> |
19
|
18 Nov 2004 |
Matthias Schneebeli | Bug Report | GlobalSteering | > When I define several "SteeringParameterGroup"s, builder maked nesting classes instead to make each
> classes.
done |
18
|
17 Nov 2004 |
Ryu Sawada | Suggestion | Reverse sorting of database | User may want to read database in inverse order.
To add new rule to specify wheather the order is normal or opposit may be useful.
For instance following path gives the latest version of pedestal in database.
"/LPPedestal(id=%d)/version;LPPedestal/version(-)",gAnalyzer->GetCurrentRunNumber()
Concerning SQL database. To sort opposite is easy. Just put keyword "DESC" after "ORDER BY" phrase. |
17
|
12 Nov 2004 |
Ryu Sawada | Bug Report | GlobalSteering | When I define several "SteeringParameterGroup"s, builder maked nesting classes instead to make each
classes. |
16
|
12 Nov 2004 |
Ryu Sawada | Suggestion | Makefile | In Makefile xmlibs and sqllibs is defined like this.
xmllibs := -lxml2 -lz
sqllibs := -lmysql
But this is not correct sometimes.
Actually sqllibs for my environment should be -L'/usr/lib/mysql' -lmysqlclient
If you use the same way as rootlibs. It may be better.
xmllibs := $(shell xml2-config --libs)
xmlcflags := $(shell xml2-config --cflags)
sqllibs := $(shell mysql_config --libs)
sqlcflags := $(shell mysql_config --cflags) |
15
|
10 Nov 2004 |
Ryu Sawada | Suggestion | Bank size check | > in ROMEEventLoop::ReadEvent(), if gROME->isOffline() and gROME->isMidas(),
> ROME checks if bank size is greater than 0.
>
> But It can happen that the bank size is 0 in normal file.
> (Actually in my midas file bank size of "environment data" is 0 at this moment)
Point may be that data format of "environment data" in my midas file is "FIXED".
According to MIDAS document, MIDAS analyzer cannnot work with this format too.
I guess it can happen that bank size seems negative when ROME reads FIXED data. |
14
|
09 Nov 2004 |
Ryu Sawada | Suggestion | Bank size check | in ROMEEventLoop::ReadEvent(), if gROME->isOffline() and gROME->isMidas(),
ROME checks if bank size is greater than 0.
But It can happen that the bank size is 0 in normal file.
(Actually in my midas file bank size of "environment data" is 0 at this moment)
---------------------------------------------
else if (gROME->isOffline()&&gROME->isMidas()) {
// read event header
EVENT_HEADER *pevent = (EVENT_HEADER*)gROME->GetMidasEvent();
bool readError = false;
.
.
.
if (pevent->data_size <= 0) readError = true;
else {
n = read(fMidasFileHandle, pevent+1, pevent->data_size);
if (n != (int) pevent->data_size) readError = true;
if ((int) ((BANK_HEADER*)(pevent+1))->data_size < 0) readError = true; <-- I changed here
}
}
// check input
if (readError) {
if (n > 0) cout << "Unexpected end of file\n";
this->SetEndOfRun();
return true; |
13
|
16 Oct 2004 |
Ryu Sawada | Info | MIDAS status update | "Analyzed" fields in MIDAS status display are always 0.0% as you can see in the attached file.
Is it possible to implement function to update this field ? |
Attachment 1: midas_status.jpg
|
|
12
|
14 Oct 2004 |
Matthias Schneebeli | Suggestion | TTree filling in online mode. | > In my case, in online mode, I don't need to wirte TTree.
> But I want to fill it, because we use it to see data with using TSocket connection.
>
> How do you think about filling TTree even if write flag is not toggled ?
I implemented a fill flag for the trees in the romeConfig file.
However, if your fill flag is true and your write flag false, then the tree will be
filled in memory completely. Which means that, if the tree is large, a memory overflow
occurs. Therefore you should only do this for circular trees. |
11
|
14 Oct 2004 |
Matthias Schneebeli | Suggestion | TBranch compression | > > Yes your right.
> >
> > I added that.
>
> The compression level should not be "hard-wired" in the builder. Some people might consider not
> using compression in favour of higher speed. So maybe an option in the XML File like
>
> <Tree>
> <TreeName>Test</TreeName>
> <TreeTitle>Test Data</TreeTitle>
> <CompressionLevel>1</CompressionLevel>
> ...
> </Tree>
Ok, that's done. |
10
|
14 Oct 2004 |
Stefan Ritt | Suggestion | TBranch compression | > Yes your right.
>
> I added that.
The compression level should not be "hard-wired" in the builder. Some people might consider not
using compression in favour of higher speed. So maybe an option in the XML File like
<Tree>
<TreeName>Test</TreeName>
<TreeTitle>Test Data</TreeTitle>
<CompressionLevel>1</CompressionLevel>
...
</Tree> |
9
|
13 Oct 2004 |
Matthias Schneebeli | Bug Report | serial number and event ID | > In "ROMEEventLoop.cpp"
> in function "ReadEvent(Int_t event)"
> after "if (gROME->isOnline()&&gROME->isMidas()) {"
>
> gROME should get serial_number and event ID from event header.
> There should be following 2 lines
>
> gROME->SetCurrentEventNumber(((EVENT_HEADER*)mEvent)->serial_number);
> gROME->SetEventID(((EVENT_HEADER*)mEvent)->event_id);
done |
8
|
13 Oct 2004 |
Matthias Schneebeli | Suggestion | TBranch compression | > It seems that branchs in TTree which is created by ROME is not compressed.
>
> So I changed src/framework/XXEventLoop.cpp like
>
> .
> .
> .
> tree = new TTree("Trigger","Trigger");
> tree->Branch("Info","ROMETreeInfo",&fTreeInfo,32000,99);
> tree->GetBranch("Info")->SetCompressionLevel(1);
> tree->Branch("LPADCData","TClonesArray",gAnalyzer->GetLPADCDataObjectsAddress(),32000,99);
> tree->GetBranch("LPADCData")->SetCompressionLevel(1);
> .
> .
> .
>
> After this change, file size which was 739MB became 235MB.
Yes your right.
I added that. |
7
|
13 Oct 2004 |
ryu | Bug Report | serial number and event ID | In "ROMEEventLoop.cpp"
in function "ReadEvent(Int_t event)"
after "if (gROME->isOnline()&&gROME->isMidas()) {"
gROME should get serial_number and event ID from event header.
There should be following 2 lines
gROME->SetCurrentEventNumber(((EVENT_HEADER*)mEvent)->serial_number);
gROME->SetEventID(((EVENT_HEADER*)mEvent)->event_id); |
6
|
13 Oct 2004 |
ryu | Suggestion | TTree filling in online mode. | In my case, in online mode, I don't need to wirte TTree.
But I want to fill it, because we use it to see data with using TSocket connection.
How do you think about filling TTree even if write flag is not toggled ? |
5
|
13 Oct 2004 |
ryu | Suggestion | TBranch compression | It seems that branchs in TTree which is created by ROME is not compressed.
So I changed src/framework/XXEventLoop.cpp like
.
.
.
tree = new TTree("Trigger","Trigger");
tree->Branch("Info","ROMETreeInfo",&fTreeInfo,32000,99);
tree->GetBranch("Info")->SetCompressionLevel(1);
tree->Branch("LPADCData","TClonesArray",gAnalyzer->GetLPADCDataObjectsAddress(),32000,99);
tree->GetBranch("LPADCData")->SetCompressionLevel(1);
.
.
.
After this change, file size which was 739MB became 235MB. |
4
|
11 Oct 2004 |
Matthias Schneebeli | Info | Schema evolution in root and rome | For your information:
ROOT has an automatic schema evolution implemented. That means, that all trees
can be filled into a class from a file, even if the class definition has
changed (take a look at the input/output section in the root manual).
This works also in the rome environment. All you have to do is to increment the
version number of a folder, every time you change the folder.
This works for adding, removeing or changing fields. However, if you remove or
change a field you will have to change your user code, because the Get and Set
methods will be changed or removed too. So you better think twice about the
contents of a folder.
Matthias |
3
|
08 Oct 2004 |
Matthias Schneebeli | Suggestion | xml and ROME | > > After looking at the example xml document for the MEG detector I would like to make the following suggestion.
> > Only a small portion of the power of XML is used with the MEG example i.e., the ability to express the data as a
> > hierarchical tree. Missing is the powerful feature of XML to establish a schema for the XML document specific
> > to ROME that enforces a valid structure.
> >
> > XML uses the XML Schema language, which is in turn based on XML, to define a schema for a document. I
> > propose that a ROME schema be developed that defines an XML document that the ROME builder can read
> > and process. By having such a schema, general purpose XML editors can validate the XML document prior to
> > invoking the ROME builder. Thus the schema greatly simplifies a user's task of developing a ROME xml
> > document describing their experiment. In addition, a good XML editor uses the schema to indicate to the user
> > the elements available at any particular point in the document so that the user doesn't have to remember all the
> > entries, which are required or optional to describe an experiment.
> >
> > With this e-mail I include two documents. The first is an example schema for ROME. This schema is
> > incomplete, but illustrates the major concepts of using a schema to specify the acceptable format of the XML
> > document and providing help to the user for building the document. The second is an example XML document
> > built using the ROME sample schema. It is for an experiment currently in production at the Los Alamos
> > National Laboratory.
> >
> > To get this example to work you will have to change the second line of DANCESchema.xml so that it properly
> > points to the ROME.xsd document. For this example I used the Java based XML editor Oxygen.
> >
> > Notes on Schema:
> > 1) Every element in the schema has a fixed name. All experimental data is included as either xml data or an
> > xml attribute.
> > 2) Based on the suggestion by <a
> href="<a
href="http://www.xmlfiles.com/xml/xml_attributes.asp">http://www.xmlfiles.com/xml/xml_attributes.asp</a>">http://www.xml
files.com/xml/xml_attributes.asp"><a
href="http://www.xmlfiles.com/xml/xml_attributes.asp</a>">http://www.xmlfiles.com/xml/xml_attributes.asp</a></a></a>
attributes
> are used sparingly or
> > not at all. Instead data is specified as XML data e.g. <data>the actual data</data>.
> >
> > If you have any questions concerning this example please e-mail jwouters@lanl.gov.
>
>
> Thank you for your advice.
>
> I have implemented the suggested xml format in rome. I have also inluded a rome.xsd schema file in the rome
> distribution under ROMESYS/.
>
> Now, the current cvs version of rome expects the new format.
> The samples are updated.
>
> The documentation is not yet updated.
> Is there any way of using the .xsd file for documentation?
>
> For example I'd like to have somting like this:
> I would like to have a docu attribute in the xsd file :
>
> <xs:element name="Folders" minOccurs="1" maxOccurs="1" docu="Defines all folder of the framework">
> <xs:complexType>
> <xs:sequence>
> <xs:element name="Folder" type="FolderDesc" minOccurs="1" maxOccurs="unbounded"
> docu="Defines a folder of the framework"/>
> </xs:sequence>
> </xs:complexType>
> </xs:element>
>
> The xsd file should then be translated into an html file, that documents the structure of my xml file with comments
> on every field.
>
> Is there any tool, that provides a documentation mechanism like that.
>
> If not I will write that by myself.
For get my question, I have found some schema documentation generators. |
2
|
08 Oct 2004 |
Matthias Schneebeli | Suggestion | xml and ROME | > After looking at the example xml document for the MEG detector I would like to make the following suggestion.
> Only a small portion of the power of XML is used with the MEG example i.e., the ability to express the data as a
> hierarchical tree. Missing is the powerful feature of XML to establish a schema for the XML document specific
> to ROME that enforces a valid structure.
>
> XML uses the XML Schema language, which is in turn based on XML, to define a schema for a document. I
> propose that a ROME schema be developed that defines an XML document that the ROME builder can read
> and process. By having such a schema, general purpose XML editors can validate the XML document prior to
> invoking the ROME builder. Thus the schema greatly simplifies a user's task of developing a ROME xml
> document describing their experiment. In addition, a good XML editor uses the schema to indicate to the user
> the elements available at any particular point in the document so that the user doesn't have to remember all the
> entries, which are required or optional to describe an experiment.
>
> With this e-mail I include two documents. The first is an example schema for ROME. This schema is
> incomplete, but illustrates the major concepts of using a schema to specify the acceptable format of the XML
> document and providing help to the user for building the document. The second is an example XML document
> built using the ROME sample schema. It is for an experiment currently in production at the Los Alamos
> National Laboratory.
>
> To get this example to work you will have to change the second line of DANCESchema.xml so that it properly
> points to the ROME.xsd document. For this example I used the Java based XML editor Oxygen.
>
> Notes on Schema:
> 1) Every element in the schema has a fixed name. All experimental data is included as either xml data or an
> xml attribute.
> 2) Based on the suggestion by <a
href="http://www.xmlfiles.com/xml/xml_attributes.asp">http://www.xmlfiles.com/xml/xml_attributes.asp</a> attributes
are used sparingly or
> not at all. Instead data is specified as XML data e.g. <data>the actual data</data>.
>
> If you have any questions concerning this example please e-mail jwouters@lanl.gov.
Thank you for your advice.
I have implemented the suggested xml format in rome. I have also inluded a rome.xsd schema file in the rome
distribution under ROMESYS/.
Now, the current cvs version of rome expects the new format.
The samples are updated.
The documentation is not yet updated.
Is there any way of using the .xsd file for documentation?
For example I'd like to have somting like this:
I would like to have a docu attribute in the xsd file :
<xs:element name="Folders" minOccurs="1" maxOccurs="1" docu="Defines all folder of the framework">
<xs:complexType>
<xs:sequence>
<xs:element name="Folder" type="FolderDesc" minOccurs="1" maxOccurs="unbounded"
docu="Defines a folder of the framework"/>
</xs:sequence>
</xs:complexType>
</xs:element>
The xsd file should then be translated into an html file, that documents the structure of my xml file with comments
on every field.
Is there any tool, that provides a documentation mechanism like that.
If not I will write that by myself. |
1
|
05 Oct 2004 |
Jan Wouters | Suggestion | xml and ROME | After looking at the example xml document for the MEG detector I would like to make the following suggestion.
Only a small portion of the power of XML is used with the MEG example i.e., the ability to express the data as a
hierarchical tree. Missing is the powerful feature of XML to establish a schema for the XML document specific
to ROME that enforces a valid structure.
XML uses the XML Schema language, which is in turn based on XML, to define a schema for a document. I
propose that a ROME schema be developed that defines an XML document that the ROME builder can read
and process. By having such a schema, general purpose XML editors can validate the XML document prior to
invoking the ROME builder. Thus the schema greatly simplifies a user's task of developing a ROME xml
document describing their experiment. In addition, a good XML editor uses the schema to indicate to the user
the elements available at any particular point in the document so that the user doesn't have to remember all the
entries, which are required or optional to describe an experiment.
With this e-mail I include two documents. The first is an example schema for ROME. This schema is
incomplete, but illustrates the major concepts of using a schema to specify the acceptable format of the XML
document and providing help to the user for building the document. The second is an example XML document
built using the ROME sample schema. It is for an experiment currently in production at the Los Alamos
National Laboratory.
To get this example to work you will have to change the second line of DANCESchema.xml so that it properly
points to the ROME.xsd document. For this example I used the Java based XML editor Oxygen.
Notes on Schema:
1) Every element in the schema has a fixed name. All experimental data is included as either xml data or an
xml attribute.
2) Based on the suggestion by http://www.xmlfiles.com/xml/xml_attributes.asp attributes are used sparingly or
not at all. Instead data is specified as XML data e.g. <data>the actual data</data>.
If you have any questions concerning this example please e-mail jwouters@lanl.gov. |
Attachment 1: DANCESchema.xml
|
<?xml version="1.0" encoding="UTF-8"?>
<Experiment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:/Users/jwouters/Dev/DANCE/ROME/DANCE.xsd">
<ExperimentName>DANCE</ExperimentName>
<Author>
<AuthorName>Jan M. Wouters</AuthorName>
<AuthorInstitute>LANL</AuthorInstitute>
<AuthorCollaboration>DANCE</AuthorCollaboration>
<AuthorEmail>jwouters@lanl.gov</AuthorEmail>
</Author>
<Folder>
<SubFolder>
<SubFolderName>OEDDanceEvent</SubFolderName>
<SubFolderTitle>Dance Event</SubFolderTitle>
<ArraySize>2</ArraySize>
<Field>
<FieldName>OEDgGammaEnergy</FieldName>
<FieldType>Float_t</FieldType>
<FieldComment>Total Gamma Energy</FieldComment>
</Field>
<Field>
<FieldName>OEDgNeutronEnergy</FieldName>
<FieldType>Float_t</FieldType>
</Field>
</SubFolder>
<SubFolder>
<SubFolderName>OCDOneDanceCrystal</SubFolderName>
<SubFolderTitle>Crystal</SubFolderTitle>
<ArraySize>1</ArraySize>
<Field>
<FieldName>OCDgHiGainRaw</FieldName>
<FieldType>ULong_t</FieldType>
<FieldComment>Hi gain raw value"</FieldComment>
</Field>
<Field>
<FieldName>OCDgLoGainRaw</FieldName>
<FieldType>ULong_t</FieldType>
<FieldComment>Lo gain raw value</FieldComment>
</Field>
<Field>
<FieldName>OCDgHiGainCalib</FieldName>
<FieldType>Float_t</FieldType>
<FieldComment>Hi gain calib value</FieldComment>
</Field>
</SubFolder>
</Folder>
<Task>
<SubTask>
<TaskName>ReadData</TaskName>
<TaskEventId>1</TaskEventId>
<Author>
<AuthorName>Jan M. Wouters</AuthorName>
</Author>
<TaskVersion>1</TaskVersion>
<TaskDesc>reads data</TaskDesc>
</SubTask>
<SubTask>
<TaskName>CalibData</TaskName>
<TaskEventId>1</TaskEventId>
<Author>
<AuthorName>Jan M. Wouters</AuthorName>
</Author>
<TaskVersion>1</TaskVersion>
<Histograms>
<Histogram>
<HistFolder>RawData</HistFolder>
<HistTitle>Raw Histograms</HistTitle>
<HistType>TH1S</HistType>
<HistArraySize>160</HistArraySize>
<HistSize>1024</HistSize>
<xMax>1024</xMax>
</Histogram>
<Histogram>
<HistFolder>CalibData</HistFolder>
<HistTitle>Calib Histograms</HistTitle>
<HistType>TH1F</HistType>
<HistArraySize>160</HistArraySize>
<HistSize>2048</HistSize>
<xMax>2047</xMax>
</Histogram>
</Histograms>
<TaskDesc>Calibrates the raw data</TaskDesc>
</SubTask>
</Task>
<MidasBanks>
<EventHeader>
<Folder>Trigger</Folder>
<EventId>ID</EventId>
<TriggerMask>Mask</TriggerMask>
<SerialNumber>EventNumber</SerialNumber>
<TimeStamp>Time</TimeStamp>
</EventHeader>
<EventStructure>
<EventName>TM01</EventName>
<EventData>
<DataName>Time</DataName>
<DataType>DWORD</DataType>
</EventData>
</EventStructure>
<EventStructure>
<EventName>EV01</EventName>
<EventData>
<DataName>OCRgAreaHG</DataName>
<DataType>DWORD</DataType>
</EventData>
<EventData>
<DataName>OCRgAreaLG</DataName>
<DataType>DWORD</DataType>
</EventData>
<EventData>
<DataName>OCRgTimeHi</DataName>
<DataType>DWORD</DataType>
</EventData>
<EventData>
<DataName>OCRgDetId</DataName>
<DataType>DWORD</DataType>
</EventData>
</EventStructure>
</MidasBanks>
</Experiment>
|
Attachment 2: ROME.xsd
|
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:annotation>
<xs:documentation>Described some enumerated types</xs:documentation>
</xs:annotation>
<xs:simpleType name="RootType">
<xs:restriction base="xs:string">
<xs:enumeration value="Float_t"/>
<xs:enumeration value="ULong_t"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="HistTypeDesc">
<xs:restriction base="xs:string">
<xs:enumeration value="TH1C"/>
<xs:enumeration value="TH1S"/>
<xs:enumeration value="TH1F"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="MidasType">
<xs:restriction base="xs:string">
<xs:enumeration value="DWORD"/>
<xs:enumeration value="float"/>
</xs:restriction>
</xs:simpleType>
<xs:annotation>
<xs:documentation>Describe general types</xs:documentation>
</xs:annotation>
<xs:complexType name="AuthorDesc">
<xs:sequence>
<xs:element name="AuthorName" type="xs:string"/>
<xs:element name="AuthorInstitute" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="AuthorCollaboration" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="AuthorEmail" type="xs:string" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<xs:annotation>
<xs:documentation>Describe types used by subfolders</xs:documentation>
</xs:annotation>
<xs:complexType name="FieldDesc">
<xs:sequence>
<xs:element name="FieldName" type="xs:string"/>
<xs:element name="FieldType" type="RootType"/>
<xs:element name="FieldComment" type="xs:string" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="SubFolderDesc">
<xs:sequence>
<xs:element name="SubFolderName" type="xs:string"/>
<xs:element name="SubFolderTitle" type="xs:string"/>
<xs:element name="ArraySize" type="xs:integer"/>
<xs:element name="Field" type="FieldDesc" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:annotation>
<xs:documentation>Describe tasks</xs:documentation>
</xs:annotation>
<xs:complexType name="HistDesc">
<xs:sequence>
<xs:element name="HistFolder" type="xs:string"/>
<xs:element name="HistTitle" type="xs:string"/>
<xs:element name="HistType" type="HistTypeDesc"/>
<xs:element name="HistArraySize" type="xs:integer" minOccurs="0" default="1"/>
<xs:element name="HistSize" type="xs:integer"/>
<xs:element name="xMin" type="xs:integer" minOccurs="0" default="0"/>
<xs:element name="xMax" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="HistogramsDesc">
<xs:sequence>
<xs:element name="Histogram" type="HistDesc" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="SubTaskDesc">
<xs:sequence>
<xs:element name="TaskName" type="xs:string"/>
<xs:element name="TaskEventId" type="xs:integer"/>
<xs:element name="Author" type="AuthorDesc"/>
<xs:element name="TaskVersion" type="xs:integer"/>
<xs:element name="Histograms" type="HistogramsDesc" minOccurs="0" maxOccurs="1"/>
<xs:element name="TaskDesc" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:annotation>
<xs:documentation>Describe elements used by MidasBanks</xs:documentation>
</xs:annotation>
<xs:complexType name="EventHeaderDesc">
<xs:sequence>
<xs:element name="Folder" type="xs:string"/>
<xs:element name="EventId" type="xs:string"/>
<xs:element name="TriggerMask" type="xs:string"/>
<xs:element name="SerialNumber" type="xs:string"/>
<xs:element name="TimeStamp" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="EventDataDesc">
<xs:sequence>
<xs:element name="DataName" type="xs:string"/>
<xs:element name="DataType" type="MidasType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="EventStructDesc">
<xs:sequence>
<xs:element name="EventName" type="xs:string"/>
<xs:element name="EventData" type="EventDataDesc" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:annotation>
<xs:documentation>Describe overall document</xs:documentation>
</xs:annotation>
<xs:element name="Experiment">
<xs:complexType>
<xs:sequence>
<xs:element name="ExperimentName" type="xs:string"/>
<xs:element name="Author" type="AuthorDesc"/>
<xs:element name="Folder">
<xs:complexType>
<xs:sequence>
<xs:element name="SubFolder" type="SubFolderDesc" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Task">
<xs:complexType>
<xs:sequence>
<xs:element name="SubTask" type="SubTaskDesc" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="MidasBanks">
<xs:complexType>
<xs:sequence>
<xs:element name="EventHeader" type="EventHeaderDesc"/>
<xs:element name="EventStructure" type="EventStructDesc" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
|
|