Back Midas Rome Roody Rootana
  Rome Analyzer Framework, Page 5 of 6  Not logged in ELOG logo
Entry  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
    Reply  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
Entry  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.
    Reply  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/
Entry  16 Jan 2005, Ryu Sawada, Bug Report, user input 
After change of ROMEEventLoop.cpp 1.39, Program steerings don't work on Linux.
    Reply  17 Jan 2005, Matthias Schneebeli, Bug Report, user input 
> After change of ROMEEventLoop.cpp 1.39, Program steerings don't work on Linux.

Sorry.
Entry  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
Entry  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).
    Reply  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.
Entry  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;
      }
    Reply  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.
    Reply  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.
Entry  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;
    Reply  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
Entry  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;
      }
    Reply  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
Entry  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>
    Reply  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
Entry  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.
    Reply  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
Entry  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.
Entry  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.
Entry  12 Nov 2004, Ryu Sawada, Bug Report, GlobalSteering 
When I define several "SteeringParameterGroup"s, builder maked nesting classes instead to make each 
classes.
    Reply  18 Nov 2004, Matthias Schneebeli, Bug Report, GlobalSteering 
> When I define several "SteeringParameterGroup"s, builder maked nesting classes instead to make each 
> classes.

done
       Reply  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>
Entry  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.
Entry  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)
Entry  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;
    Reply  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.
Entry  16 Oct 2004, Ryu Sawada, Info, MIDAS status update midas_status.jpg
"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 ?
Entry  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 ?
    Reply  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.
Entry  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.
    Reply  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.
       Reply  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>
          Reply  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.
Entry  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);
    Reply  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
ELOG V3.1.4-2e1708b5