|
|
STAR Coding and naming Standards |
|
|
|
|
STAR StRoot/ makers naming standards
HTML, postscript
The programming guidelines refer to how programming language features are used. They have to do with things like adhesion to object oriented programming (data-hiding, encapsulation, etc ...), performance and portability.
ClassName& operator=(const ClassName&)
and a copy constructor:
ClassName(const ClassName&)when they allocate subsidiary data structures on the heap or consume any other kind of shared resources.
int count;
should NOT be used but instead
namespace MyNameSpace {
int count;
}
We recommend to for MyNameSpace to be of the explicit form TLATypes, TLAGlobals where TLA stands for your sub-system 3 letters acronym. This will avoid further clashes and a clear separation of namespace.
const
if they do not alter the state of any data member.const
in the argument list of the function.
{ LOG_XXX << "StZdcVertexMaker::Init(): in ZdcVertexMaker did not find ZdcCalPars." << endm; }
where XXX is either
Then, you can filter in/out the wanted / unwanted messages using the logger filter mechanizm. The Logger documentation is available here and its use is encouraged.
enum EReturnCodes{ kStOK=0, // OK kStOk=0, // OK kStWarn, // Warning, something wrong but work can be continued kStEOF, // End Of File kStErr, // Error, drop this and go to the next event kStFatal // Fatal error, processing impossible };
Outside Makers in your application code AND for testing
conditions that should never happen and indicate disaster
if they do, we recommend the use of assert()
(it aborts the program if the assertion is false). Don't use exit().
For info on assert() see the
man page ('man assert').
Generally speaking though, it is BAD to just abort the
program and should be avoided. Better to message an error and
propagate up a fatal error flag. Unless your Maker is a fundamental
and base maker (DAQ detecting a corruption, db finding an unlikely
condition which should really never happen, IO maker not able to
stream, ...) the use of assert()
is prohibited as a single detector sub-system error shall not lead
to an entire chain abort. The use of clear messages with level FATAL
is emphasized.
The coding-style guidelines are the ones which refer to the editing styles of the source code. They have to do with things like the code maintainability and readability (see motivations).
The code must be properly indented ex. >= 2 characters indentation when inside a control structure) for readability reasons. Try to avoid spanning of lines beyond reasonable (ideally, the reader should see it fit within a screen width without having to scroll or follow the wrapped lines).
StTrack::whatever();
)
Each header file should contain only one or related class declarations for maintainability and for easier retrieval of class definitions.
Each class implementation source code should go into a single source file. for maintainability and for easier retrieval of class implementations.
Each header file must be protected from multiple inclusions in order to avoid multiple declarations and circular dependences in the code. e.g.:
#ifndef NAME_HH #define NAME_HH ... #endif
It is understood that shall you copy codes from a template, the value of 'NAME' will be meaningful and different from the original.
Each file should contain a
short header about the author, updates (CVS) and date.
All
files should begin with
// $Id$ // // $Log$
and a half line comment with the name of the original author, update
notes and dates.
The $Id$ expands to filename and last
updater in CVS, and $Log$ includes the CVS notes logged when
the file was committed.
The CVS code example StRoot/St_TLA_Maker/
can serve as a template to any new code.
C++ header files containing ROOT related code must have the extension .h, the referring source files must have the extension .cxx. This rule is imposed on us by ROOT.
Plain C++ header files, i.e. those without ROOT related code have the extension .hh, the source files the extension .cc. Only header files which contains definitions usable in C and C++ may have the extension .h. This is a convention commonly used in HEP (e.g. CLHEP, Geant4).
Inline comments should be avoided unless necessary. Often they can be replaced by self-explaining names. For example:
hit->setLocalCoordinates(); instead of hit->slc(); // set local coordinates
Use tactical comments to describe the next logical block.
malloc/free
)
and surely, DO NOT mix memory allocation method between C and C++:
they are often not interchangeable i.e. free
does not
work on memory allocated with new
. Preferably use
operators new
and delete
. They are part of
the language (malloc/free
are library routines) and
therefore easily portable across platforms.
This document attempts to explain
the code directory structure and layout in STAR
the rules and assumptions triggered in the make system (cons) solely on the basis of the name choice
the existing exceptions to the rules
Naming
convention in green are user discouraged (proliferation
prevention) and such request should be accompanied with a strong
reasoning. Items in magenta are obsolete
forms (and code) which will disappear and rendered
obsolete in a near future. Anything appearing in
red should be forgotten immediately as they are
forbidden (and were introduced due to unfortunate
momentary laps of reason, power surge or extreme special needs).
Why a naming convention ??
Naming convention keeps
consistency between code and packages written by many users. Not only
it enables users to have a feel for what-does-what but also, it
allows managers to define basic default set of compilation rules
depending sometimes naming convention. Naming conventions in general
are fundamental to all large projects and although N users will
surely have N best-solution, the rules should be enforced as much as
possible.
The StRoot/ tree Is of the following form
StRoot/ |
XXX/ |
ONLY base class should be freely named. Example: StarClassLibrary, StarRoot, Star2Root |
|
StXXX/ |
A directory tree which will contain a
base class many makers will use and derive from. |
|
St_XXX_Maker/ |
XXX not being a detector sub-system but a set of character with underscores: the code is FORtran derived. XXX is a sub-system in a general sens (not necessarily a detector-sub-system) |
|
StXXXMaker/ |
A tree for a Maker, that is, code compiled in this tree will be assembled as one self-sufficient package. A maker is a particular class deriving from StMaker. Its purpose is to run from within a chain (StChain) of makers and perform a specific task. In this category, sub-name convention are as follow while XXX is in principle a detector sub-system identification (3 to 4 letters uniquely designating the sub-system), it may also be anything but a detector sub-system (StAssociationMaker, StMiniMcMaker, StDbMaker) or of the form XX=analysis or physics study. |
|
StXXXUtil/ |
Code compiled in a Util
or Utilities tree should
be code which do not perform any action (nor a maker) but
constitute by itself a set of utility classes and functions.
Other classes may depend on a Utility library. |
|
StXXXPool/ |
This tree will contain a set of sub-directories chosen by the
user, each sub-directory maybe a self-contained project with no
relation with anything else. Each sub-directory will therefore
lead to the creation of a separate library. The naming convention
for the library creation is as follow : |
|
StXXXClient/ |
This tree will behave like the Pool trees in terms of library naming creation (separate libraries will be created, one per compilable sub-directory). XXX can be anything relevant for a sub-system. Client directories MUST compile (unlike the pools). |
StRoot/ |
StXXX./ |
README |
A basic documentation in plain text (not mandatory). If exists, the software guide will display the information contained in this file. |
|
|
A directory containing more elaborate documentation, either in
html or in LaTeX |
|
|
|
local/ |
A subdirectory containing stand-alone Makefiles for the package. |
|
|
A directory having a collection of code using the Maker or utility package of interest |
|
|
|
A directory containing root macros example making use of the maker |
|
|
|
kumac/ |
This is an obsolete directory name (from staf time) but still considered by the make system. It may also appears in the pams/ tree structure. |
|
|
test/ |
This directory may contain test programs |
|
|
html/ |
A directory possibly containing cross-linked information for Web purposes. However, note that the documentation is, since 2002, auto-generated via the doxygen documentation system (see the sofi page for more information). |
|
|
wrk/ |
|
|
|
run/ |
|
|
|
include/ |
A directory containing a set of common include files |
|
|
Any other name |
Will be searched for code one level down only. |
|
doc/
|
As noted above (i.e. the content of those directories will be skipped by the make system) |
|
|
|
Any other name |
The presence of every sub-directory will create a different
dynamic library. Note that this is NOT the case with the other
name format (all compiled code would go in a unique library
name) |
|
Directories within this pattern will be compiled using the extra include path pointed by the environment variable QTDIR. The moc program will run on any include containing the Q_OBJECT directive, -DR__QT define is added to CXXFLAGS. |
|
|
Those are special. Compilation will consider MySQL includes and the created dynamic library will be linked against MySQL |
|
|
St.*Db.* |
Any directory following this pattern will use the MySQL include as an extra include path for the CPPPATH directive |
|
StTrsMaker |
Are two exceptions of kind (b) [see footnote 1] and uses its own include/ directory as a general extraneous include path. |
|
StHbtMaker |
For this maker, a pre-defined list of sub-directories is being added to the (CPPPATH) |
|
StAssociationMaker |
This form will include in the CPPPATH every sub-directories found one level below. Only macros/, examples/ and doc/ are excluded withing this form noted in (a). For the Pool directory, the extraneous rule mentioned here is additive to the one of Pool directories. |
1However, if there is a need for StRoot/StXXX sub-directories compilation to include every available sub-paths (other than the exceptions noted above) (a) as a list of default path in a compiler option or if you want a default include/ directory (b) to be always added in a default include path compiler option statement, you may request this feature to be enabled. To do that, send an Email to STARSOFI .
2In this form, the sub-directory MUST be self-sufficient i.e. all code and include (apart from the default paths) must be in the sub-directory StZZZ