#ifndef HPARTICLECONSTANTS_H
#define HPARTICLECONSTANTS_H
#include "TObject.h"
#include "TString.h"
#include <map>
#include <vector>
#include <iostream>
#include <iomanip>
using namespace std;
class HGeantKine;
typedef struct {
TString fName;
TString fSpace;
Long_t fId;
Int_t fFormat;
TString fDescription;
TString printBitsString(Long_t data){
TString tmp;
for(Int_t i = 31; i >= 0; i --){
if((i+1)%4==0&&i<31) tmp+=" ";
tmp+=((data >> i) & 0x1);
}
return tmp;
}
void printBits(Long_t data){
for(Int_t i = 31; i >= 0; i --){
if(i%4==0) cout<<" "<<flush;
cout<< ((data >> i) & 0x1) <<flush;
}
cout<<endl;
}
void fill(Long_t id, TString name, Int_t form,TString space,TString descr)
{
fName = name;
fSpace = space;
fId = id;
fFormat = form;
fDescription = descr;
}
void print(){
if (fFormat==0) cout<<setw(35)<<left <<fName.Data()<<" from "<<setw(35)<<fSpace<<" " <<setw(15)<<left<<dec<<fId<<" : "<<fDescription.Data()<<endl;
else if(fFormat==1) cout<<setw(35)<<left <<fName.Data()<<" from "<<setw(35)<<fSpace<<" 0x"<<setw(15)<<left<<hex<<fId<<" bits "<< printBitsString(fId)<<" : "<<fDescription.Data()<<endl;
};
} constantproperties;
class HParticleConstants : public TObject
{
static map<TString,constantproperties> nameToProp;
static vector<TString> vnames;
public:
static Int_t getValue(TString name);
static void printValue(TString name);
static void printValueMatch(TString name);
static void printSpace(TString space);
static Bool_t addConstant(Long_t id, TString name,Int_t form,TString space,TString descr);
static void clearConstants();
static vector<TString> initConstantNamesV();
static map<TString,constantproperties> initConstantNames();
static void print(Bool_t sort=kFALSE);
ClassDef(HParticleConstants,0)
};
#endif