#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