#ifndef ROOT_TGDMLWRITE
#define ROOT_TGDMLWRITE
#ifndef ROOT_TGeoMatrix
#include "TGeoMatrix.h"
#endif
#ifndef ROOT_TXMLEngine
#include "TXMLEngine.h"
#endif
#ifndef ROOT_TGeoVolume
#include "TGeoVolume.h"
#endif
#ifndef ROOT_TGeoParaboloid
#include "TGeoParaboloid.h"
#endif
#ifndef ROOT_TGeoSphere
#include "TGeoSphere.h"
#endif
#ifndef ROOT_TGeoArb8
#include "TGeoArb8.h"
#endif
#ifndef ROOT_TGeoCone
#include "TGeoCone.h"
#endif
#ifndef ROOT_TGeoPara
#include "TGeoPara.h"
#endif
#ifndef ROOT_TGeoTrd1
#include "TGeoTrd1.h"
#endif
#ifndef ROOT_TGeoTrd2
#include "TGeoTrd2.h"
#endif
#ifndef ROOT_TGeoTube
#include "TGeoTube.h"
#endif
#ifndef ROOT_TGeoPcon
#include "TGeoPcon.h"
#endif
#ifndef ROOT_TGeoTorus
#include "TGeoTorus.h"
#endif
#ifndef ROOT_TGeoPgon
#include "TGeoPgon.h"
#endif
#ifndef ROOT_TGeoXtru
#include "TGeoXtru.h"
#endif
#ifndef ROOT_TGeoPgon
#include "TGeoPgon.h"
#endif
#ifndef ROOT_TGeoEltu
#include "TGeoEltu.h"
#endif
#ifndef ROOT_TGeoHype
#include "TGeoHype.h"
#endif
#ifndef ROOT_TGeoBoolNode
#include "TGeoBoolNode.h"
#endif
#ifndef ROOT_TGeoCompositeShape
#include "TGeoCompositeShape.h"
#endif
#ifndef ROOT_TGeoScaledShape
#include "TGeoScaledShape.h"
#endif
#include <map>
#include <vector>
#include <iostream>
class TGDMLWrite : public TObject {
public:
TGDMLWrite();
virtual ~TGDMLWrite();
static void StartGDMLWriting(TGeoManager * geomanager, const char* filename, TString option) {
TGDMLWrite *writer = new TGDMLWrite;
writer->WriteGDMLfile(geomanager, filename, option);
delete writer;
}
void WriteGDMLfile(TGeoManager * geomanager, const char* filename = "test.gdml", TString option = "");
enum ENamingType {
kelegantButSlow = 0,
kwithoutSufixNotUniq = 1,
kfastButUglySufix = 2
};
void SetNamingSpeed(ENamingType naming);
void SetG4Compatibility(Bool_t G4Compatible) {
fgG4Compatibility = G4Compatible;
};
private:
struct Xyz {
Double_t x;
Double_t y;
Double_t z;
};
typedef std::map<TString, Bool_t> NameList;
typedef std::map<TString, TString> NameListS;
typedef std::map<TString, Int_t> NameListI;
typedef std::map<TString, Float_t> NameListF;
struct StructLst {
NameList fLst;
};
struct NameLst {
NameListS fLst;
NameListI fLstIter;
};
StructLst *fIsotopeList;
StructLst *fElementList;
StructLst *fAccPatt;
StructLst *fRejShape;
NameLst *fNameList;
static TGDMLWrite *fgGDMLWrite;
Int_t fgNamingSpeed;
Bool_t fgG4Compatibility;
XMLDocPointer_t fGdmlFile;
TString fTopVolumeName;
TXMLEngine *fGdmlE;
XMLNodePointer_t fDefineNode;
XMLNodePointer_t fMaterialsNode;
XMLNodePointer_t fSolidsNode;
XMLNodePointer_t fStructureNode;
Int_t fVolCnt;
Int_t fPhysVolCnt;
UInt_t fActNameErr;
UInt_t fSolCnt;
static const UInt_t fgkProcBit = BIT(14);
static const UInt_t fgkProcBitVol = BIT(19);
static const UInt_t fgkMaxNameErr = 5;
XMLNodePointer_t ExtractMaterials(TList* materialsLst);
TString ExtractSolid(TGeoShape* volShape);
void ExtractVolumes(TGeoVolume* volume);
XMLNodePointer_t CreateAtomN(Double_t atom, const char * unit = "g/mole");
XMLNodePointer_t CreateDN(Double_t density, const char * unit = "g/cm3");
XMLNodePointer_t CreateFractionN(Double_t percentage, const char * refName);
XMLNodePointer_t CreateIsotopN(TGeoIsotope * isotope, const char * name);
XMLNodePointer_t CreateElementN(TGeoElement * element, XMLNodePointer_t materials, const char * name);
XMLNodePointer_t CreateMixtureN(TGeoMixture * mixture, XMLNodePointer_t materials, TString mname);
XMLNodePointer_t CreateMaterialN(TGeoMaterial * material, TString mname);
XMLNodePointer_t ChooseObject(TGeoShape *geoShape);
XMLNodePointer_t CreateZplaneN(Double_t z, Double_t rmin, Double_t rmax);
XMLNodePointer_t CreateBoxN(TGeoBBox * geoShape);
XMLNodePointer_t CreateParaboloidN(TGeoParaboloid * geoShape);
XMLNodePointer_t CreateSphereN(TGeoSphere * geoShape);
XMLNodePointer_t CreateArb8N(TGeoArb8 * geoShape);
XMLNodePointer_t CreateConeN(TGeoConeSeg * geoShape);
XMLNodePointer_t CreateConeN(TGeoCone * geoShape);
XMLNodePointer_t CreateParaN(TGeoPara * geoShape);
XMLNodePointer_t CreateTrapN(TGeoTrap * geoShape);
XMLNodePointer_t CreateTwistedTrapN(TGeoGtra * geoShape);
XMLNodePointer_t CreateTrdN(TGeoTrd1 * geoShape);
XMLNodePointer_t CreateTrdN(TGeoTrd2 * geoShape);
XMLNodePointer_t CreateTubeN(TGeoTubeSeg * geoShape);
XMLNodePointer_t CreateCutTubeN(TGeoCtub * geoShape);
XMLNodePointer_t CreateTubeN(TGeoTube * geoShape);
XMLNodePointer_t CreatePolyconeN(TGeoPcon * geoShape);
XMLNodePointer_t CreateTorusN(TGeoTorus * geoShape);
XMLNodePointer_t CreatePolyhedraN(TGeoPgon * geoShape);
XMLNodePointer_t CreateEltubeN(TGeoEltu * geoShape);
XMLNodePointer_t CreateHypeN(TGeoHype * geoShape);
XMLNodePointer_t CreateXtrusionN(TGeoXtru * geoShape);
XMLNodePointer_t CreateEllipsoidN(TGeoCompositeShape * geoShape, TString elName);
XMLNodePointer_t CreateElConeN(TGeoScaledShape * geoShape);
XMLNodePointer_t CreateCommonBoolN(TGeoCompositeShape *geoShape);
XMLNodePointer_t CreatePhysVolN(const char * volref, const char * posref, const char * rotref, XMLNodePointer_t scaleN);
XMLNodePointer_t CreateDivisionN(Double_t offset, Double_t width, Int_t number, const char * axis, const char * unit, const char * volref);
XMLNodePointer_t CreateSetupN(const char * topVolName , const char * name = "default", const char * version = "1.0");
XMLNodePointer_t StartVolumeN(const char * name, const char * solid, const char * material);
XMLNodePointer_t StartAssemblyN(const char * name);
Xyz GetXYZangles(const Double_t * rotationMatrix);
XMLNodePointer_t CreatePositionN(const char * name, Xyz position, const char * type = "position", const char * unit = "cm");
XMLNodePointer_t CreateRotationN(const char * name, Xyz rotation, const char * type = "rotation", const char * unit = "deg");
TGeoCompositeShape* CreateFakeCtub(TGeoCtub * geoShape);
Bool_t IsInList(NameList list, TString name2check);
TString GenName(TString oldname);
TString GenName(TString oldname, TString objPointer);
Bool_t CanProcess(TObject *pointer);
TString GetPattAxis(Int_t divAxis, const char * pattName, TString& unit);
Bool_t IsNullParam(Double_t parValue, TString parName, TString objName);
void UnsetTemporaryBits(TGeoManager * geoMng);
ClassDef(TGDMLWrite, 0)
};
#endif /* ROOT_TGDMLWRITE */