G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 > Struct Template Reference

#include <G4CascadeData.hh>


Public Types

 N02 = N2
 N23 = N2+N3
 N24 = N23+N4
 N25 = N24+N5
 N26 = N25+N6
 N27 = N26+N7
 N28 = N27+N8
 N29 = N28+N9
 N8D = N8?N8:1
 N9D = N9?N9:1
 NM = N9?8:N8?7:6
 NXS = N29
enum  {
  N02 = N2, N23 = N2+N3, N24 = N23+N4, N25 = N24+N5,
  N26 = N25+N6, N27 = N26+N7, N28 = N27+N8, N29 = N28+N9
}
enum  { N8D = N8?N8:1, N9D = N9?N9:1 }
enum  { NM = N9?8:N8?7:6, NXS = N29 }

Public Member Functions

const G4int (&x2bfs)[N2][2]
const G4int (&x3bfs)[N3][3]
const G4int (&x4bfs)[N4][4]
const G4int (&x5bfs)[N5][5]
const G4int (&x6bfs)[N6][6]
const G4int (&x7bfs)[N7][7]
const G4int (&x8bfs)[N8D][8]
const G4int (&x9bfs)[N9D][9]
const G4double (&crossSections)[NXS][NE]
const G4double (&tot)[NE]
G4int maxMultiplicity () const
void print (std::ostream &os=G4cout) const
void print (G4int mult, std::ostream &os) const
void printXsec (const G4double(&xsec)[NE], std::ostream &os) const
 G4CascadeData (const G4int(&the2bfs)[N2][2], const G4int(&the3bfs)[N3][3], const G4int(&the4bfs)[N4][4], const G4int(&the5bfs)[N5][5], const G4int(&the6bfs)[N6][6], const G4int(&the7bfs)[N7][7], const G4double(&xsec)[NXS][NE], G4int ini, const G4String &aName="G4CascadeData")
 G4CascadeData (const G4int(&the2bfs)[N2][2], const G4int(&the3bfs)[N3][3], const G4int(&the4bfs)[N4][4], const G4int(&the5bfs)[N5][5], const G4int(&the6bfs)[N6][6], const G4int(&the7bfs)[N7][7], const G4double(&xsec)[NXS][NE], const G4double(&theTot)[NE], G4int ini, const G4String &aName="G4CascadeData")
 G4CascadeData (const G4int(&the2bfs)[N2][2], const G4int(&the3bfs)[N3][3], const G4int(&the4bfs)[N4][4], const G4int(&the5bfs)[N5][5], const G4int(&the6bfs)[N6][6], const G4int(&the7bfs)[N7][7], const G4int(&the8bfs)[N8D][8], const G4int(&the9bfs)[N9D][9], const G4double(&xsec)[NXS][NE], G4int ini, const G4String &aName="G4CascadeData")
 G4CascadeData (const G4int(&the2bfs)[N2][2], const G4int(&the3bfs)[N3][3], const G4int(&the4bfs)[N4][4], const G4int(&the5bfs)[N5][5], const G4int(&the6bfs)[N6][6], const G4int(&the7bfs)[N7][7], const G4int(&the8bfs)[N8D][8], const G4int(&the9bfs)[N9D][9], const G4double(&xsec)[NXS][NE], const G4double(&theTot)[NE], G4int ini, const G4String &aName="G4CascadeData")
void initialize ()

Data Fields

G4int index [9]
G4double multiplicities [NM][NE]
G4double sum [NE]
G4double inelastic [NE]
const G4String name
const G4int initialState

Static Public Attributes

static const G4int empty8bfs [1][8] = {{0}}
static const G4int empty9bfs [1][9] = {{0}}


Detailed Description

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
struct G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >

Definition at line 53 of file G4CascadeData.hh.


Member Enumeration Documentation

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
anonymous enum

Enumerator:
N02 
N23 
N24 
N25 
N26 
N27 
N28 
N29 

Definition at line 56 of file G4CascadeData.hh.

00056        { N02=N2, N23=N2+N3, N24=N23+N4, N25=N24+N5, N26=N25+N6, N27=N26+N7,
00057          N28=N27+N8, N29=N28+N9 };

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
anonymous enum

Enumerator:
N8D 
N9D 

Definition at line 59 of file G4CascadeData.hh.

00059 { N8D=N8?N8:1, N9D=N9?N9:1 };   // SPECIAL: Can't dimension arrays [0]

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
anonymous enum

Enumerator:
NM 
NXS 

Definition at line 61 of file G4CascadeData.hh.

00061 { NM=N9?8:N8?7:6, NXS=N29 };    // Multiplicity and cross-section bins


Constructor & Destructor Documentation

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4CascadeData ( const G4int &  the2bfs[N2][2],
const G4int &  the3bfs[N3][3],
const G4int &  the4bfs[N4][4],
const G4int &  the5bfs[N5][5],
const G4int &  the6bfs[N6][6],
const G4int &  the7bfs[N7][7],
const G4double &  xsec[NXS][NE],
G4int  ini,
const G4String aName = "G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >" 
) [inline]

Definition at line 95 of file G4CascadeData.hh.

References G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::initialize().

00100     : x2bfs(the2bfs), x3bfs(the3bfs), x4bfs(the4bfs), x5bfs(the5bfs),
00101       x6bfs(the6bfs), x7bfs(the7bfs), x8bfs(empty8bfs), x9bfs(empty9bfs),
00102       crossSections(xsec), tot(sum), name(aName), initialState(ini) {
00103     initialize();
00104   }

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4CascadeData ( const G4int &  the2bfs[N2][2],
const G4int &  the3bfs[N3][3],
const G4int &  the4bfs[N4][4],
const G4int &  the5bfs[N5][5],
const G4int &  the6bfs[N6][6],
const G4int &  the7bfs[N7][7],
const G4double &  xsec[NXS][NE],
const G4double &  theTot[NE],
G4int  ini,
const G4String aName = "G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >" 
) [inline]

Definition at line 107 of file G4CascadeData.hh.

References G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::initialize().

00112     : x2bfs(the2bfs), x3bfs(the3bfs), x4bfs(the4bfs), x5bfs(the5bfs),
00113       x6bfs(the6bfs), x7bfs(the7bfs), x8bfs(empty8bfs), x9bfs(empty9bfs),
00114       crossSections(xsec), tot(theTot), name(aName), initialState(ini) {
00115     initialize();
00116   }

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4CascadeData ( const G4int &  the2bfs[N2][2],
const G4int &  the3bfs[N3][3],
const G4int &  the4bfs[N4][4],
const G4int &  the5bfs[N5][5],
const G4int &  the6bfs[N6][6],
const G4int &  the7bfs[N7][7],
const G4int &  the8bfs[N8D][8],
const G4int &  the9bfs[N9D][9],
const G4double &  xsec[NXS][NE],
G4int  ini,
const G4String aName = "G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >" 
) [inline]

Definition at line 119 of file G4CascadeData.hh.

References G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::initialize().

00125     : x2bfs(the2bfs), x3bfs(the3bfs), x4bfs(the4bfs), x5bfs(the5bfs),
00126       x6bfs(the6bfs), x7bfs(the7bfs), x8bfs(the8bfs), x9bfs(the9bfs),
00127       crossSections(xsec), tot(sum), name(aName), initialState(ini) {
00128     initialize();
00129   }

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4CascadeData ( const G4int &  the2bfs[N2][2],
const G4int &  the3bfs[N3][3],
const G4int &  the4bfs[N4][4],
const G4int &  the5bfs[N5][5],
const G4int &  the6bfs[N6][6],
const G4int &  the7bfs[N7][7],
const G4int &  the8bfs[N8D][8],
const G4int &  the9bfs[N9D][9],
const G4double &  xsec[NXS][NE],
const G4double &  theTot[NE],
G4int  ini,
const G4String aName = "G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >" 
) [inline]

Definition at line 132 of file G4CascadeData.hh.

References G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::initialize().

00138     : x2bfs(the2bfs), x3bfs(the3bfs), x4bfs(the4bfs), x5bfs(the5bfs),
00139       x6bfs(the6bfs), x7bfs(the7bfs), x8bfs(the8bfs), x9bfs(the9bfs),
00140       crossSections(xsec), tot(theTot), name(aName), initialState(ini) {
00141     initialize();
00142   }


Member Function Documentation

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
const G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4double ( tot  ) 

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
const G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4double ( crossSections  ) 

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
const G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4int ( x9bfs  ) 

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
const G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4int ( x8bfs  ) 

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
const G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4int ( x7bfs  ) 

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
const G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4int ( x6bfs  ) 

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
const G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4int ( x5bfs  ) 

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
const G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4int ( x4bfs  ) 

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
const G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4int ( x3bfs  ) 

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
const G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4int ( x2bfs  ) 

Referenced by G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::initialize(), G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::print(), and G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::printXsec().

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8, int N9>
void G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::initialize (  ) 

Definition at line 48 of file G4CascadeData.icc.

References G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4int(), G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::index, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::inelastic, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::initialState, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::multiplicities, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::N02, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::N23, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::N24, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::N25, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::N26, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::N27, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::N28, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::N29, NE, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::NM, and G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::sum.

Referenced by G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4CascadeData().

00048                                                            {
00049   // Initialize index offsets for cross-section array (can't do globally)
00050   index[0] = 0;   index[1] = N02; index[2] = N23; index[3] = N24;
00051   index[4] = N25; index[5] = N26; index[6] = N27; index[7] = N28;
00052   index[8] = N29;
00053 
00054   // Initialize multiplicity array
00055   for (G4int im = 0; im < NM; im++) {
00056     G4int start = index[im];
00057     G4int stop = index[im+1];
00058     for (G4int k = 0; k < NE; k++) {
00059       multiplicities[im][k] = 0.0;
00060       for (G4int i = start; i < stop; i++) {
00061         multiplicities[im][k] += crossSections[i][k];
00062       }
00063     }
00064   }
00065 
00066   // Initialize total cross section arrays
00067   for (G4int k = 0; k < NE; k++) {
00068     sum[k] = 0.0;
00069     for (G4int im = 0; im < NM; im++) {
00070       sum[k] += multiplicities[im][k];
00071     }
00072   }
00073 
00074   // Identify elastic scattering channel and subtract from inclusive
00075   G4int i2b = 0;
00076   for (i2b=index[0]; i2b<index[1]; i2b++) {
00077     if (x2bfs[i2b][0]*x2bfs[i2b][1] == initialState) break;     // Found it
00078   }
00079 
00080   for (G4int k = 0; k < NE; k++) {
00081     if (i2b<index[1]) inelastic[k] = tot[k] - crossSections[i2b][k];
00082     else inelastic[k] = tot[k];         // FIXME:  No elastic channel in table!
00083   }
00084 }

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
G4int G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::maxMultiplicity (  )  const [inline]

Definition at line 87 of file G4CascadeData.hh.

References G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::NM.

00087 { return NM+1; }  // Used by G4CascadeFunctions

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8, int N9>
void G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::print ( G4int  mult,
std::ostream &  os 
) const

Definition at line 105 of file G4CascadeData.icc.

References G4endl, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4int(), G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::index, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::multiplicities, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::print(), and G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::printXsec().

00105                                         {
00106   if (mult < 0) {               // Old interface used mult == -1 for all
00107     print(os);
00108     return;
00109   }
00110 
00111   G4int im = mult-2;            // Convert multiplicity to array index
00112 
00113   G4int start = index[im];
00114   G4int stop = index[im+1];
00115   os << "\n Mulitplicity " << mult << " (indices " << start << " to "
00116          << stop-1 << ") summed cross section:" << G4endl;
00117 
00118   printXsec(multiplicities[im], os);
00119   
00120   for (G4int i=start; i<stop; i++) {
00121     G4int ichan=i-start;
00122     os << "\n final state x" << mult << "bfs[" << ichan << "] : ";
00123     for (G4int fsi=0; fsi<mult; fsi++) {
00124       switch (mult) {
00125       case 2: os << " " << x2bfs[ichan][fsi]; break;
00126       case 3: os << " " << x3bfs[ichan][fsi]; break;
00127       case 4: os << " " << x4bfs[ichan][fsi]; break;
00128       case 5: os << " " << x5bfs[ichan][fsi]; break;
00129       case 6: os << " " << x6bfs[ichan][fsi]; break;
00130       case 7: os << " " << x7bfs[ichan][fsi]; break;
00131       case 8: os << " " << x8bfs[ichan][fsi]; break;
00132       case 9: os << " " << x9bfs[ichan][fsi]; break;
00133       default: ;
00134       }
00135     }
00136     os << " -- cross section [" << i << "]:" << G4endl;
00137     printXsec(crossSections[i], os);
00138   }
00139 }

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8, int N9>
void G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::print ( std::ostream &  os = G4cout  )  const

Definition at line 89 of file G4CascadeData.icc.

References G4endl, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::inelastic, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::name, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::NM, G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::printXsec(), and G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::sum.

Referenced by G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::print().

00089                                                                           {
00090   os << "\n " << name << " Total cross section:" << G4endl;
00091   printXsec(tot, os);
00092   os << "\n Summed cross section:" << G4endl;
00093   printXsec(sum, os);
00094   os << "\n Inelastic cross section:" << G4endl;
00095   printXsec(inelastic, os);
00096   os << "\n Individual channel cross sections" << G4endl;
00097   
00098   for (int im=2; im<NM+2; im++) print(im, os);
00099   return;
00100 }

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8, int N9>
void G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::printXsec ( const G4double &  xsec[NE],
std::ostream &  os 
) const

Definition at line 144 of file G4CascadeData.icc.

References G4endl, and G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::G4int().

Referenced by G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::print().

00144                                                             {
00145   for (G4int k=0; k<NE; k++) {
00146     os << std::setw(6) << xsec[k];              // Use sign-gap as separator
00147     if ((k+1)%12 == 0) os << G4endl;
00148   }
00149   os << G4endl;
00150 }


Field Documentation

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
const G4int G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::empty8bfs = {{0}} [static]

Definition at line 81 of file G4CascadeData.hh.

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
const G4int G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::empty9bfs = {{0}} [static]

Definition at line 82 of file G4CascadeData.hh.

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
G4int G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::index[9]

Definition at line 63 of file G4CascadeData.hh.

Referenced by G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::initialize(), and G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::print().

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
G4double G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::inelastic[NE]

Definition at line 79 of file G4CascadeData.hh.

Referenced by G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::initialize(), and G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::print().

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
const G4int G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::initialState

Definition at line 85 of file G4CascadeData.hh.

Referenced by G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::initialize().

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
G4double G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::multiplicities[NM][NE]

Definition at line 64 of file G4CascadeData.hh.

Referenced by G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::initialize(), and G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::print().

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
const G4String G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::name

Definition at line 84 of file G4CascadeData.hh.

Referenced by G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::print().

template<int NE, int N2, int N3, int N4, int N5, int N6, int N7, int N8 = 0, int N9 = 0>
G4double G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::sum[NE]

Definition at line 76 of file G4CascadeData.hh.

Referenced by G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::initialize(), and G4CascadeData< NE, N2, N3, N4, N5, N6, N7, N8, N9 >::print().


The documentation for this struct was generated from the following files:
Generated on Mon May 27 17:51:35 2013 for Geant4 by  doxygen 1.4.7