#ifndef G4PhantomBuilder_h
#define G4PhantomBuilder_h 1

#include "G4BasePhantomBuilder.h"

#include "G4VPhysicalVolume.hh"
#include "globals.hh"

class G4BasePhantomBuilder;
class G4VPhysicalVolume;
class G4VBodyFactory;
class G4PhantomBuilder : public G4BasePhantomBuilder {
public:
    G4PhantomBuilder();
    ~G4PhantomBuilder();

    void BuildHead(const G4String&, G4bool, G4bool);
    void BuildTrunk(const G4String&, G4bool, G4bool);
    void BuildLeftLeg(const G4String&, G4bool, G4bool);
    void BuildRightLeg(const G4String&, G4bool, G4bool);

    void BuildUpperSpine(const G4String&, G4bool, G4bool);
    void BuildMiddleLowerSpine(const G4String&, G4bool, G4bool);
    void BuildLeftLegBone(const G4String&, G4bool, G4bool);
    void BuildRightLegBone(const G4String&, G4bool, G4bool);
    void BuildLeftArmBone(const G4String&, G4bool, G4bool);
    void BuildRightArmBone(const G4String&, G4bool, G4bool);
    void BuildSkull(const G4String&, G4bool, G4bool);
    void BuildRibCage(const G4String&, G4bool, G4bool);
    void BuildPelvis(const G4String&, G4bool, G4bool);
    void BuildLeftScapula(const G4String&, G4bool, G4bool);
    void BuildRightScapula(const G4String&, G4bool, G4bool);
    void BuildLeftAdrenal(const G4String&, G4bool, G4bool);
    void BuildRightAdrenal(const G4String&, G4bool, G4bool);
    void BuildLeftClavicle(const G4String&, G4bool, G4bool);
    void BuildRightClavicle(const G4String&, G4bool, G4bool);

    void BuildBrain(const G4String&, G4bool, G4bool);

    void BuildHeart(const G4String&, G4bool, G4bool);

    void BuildLeftLung(const G4String&, G4bool, G4bool);
    void BuildRightLung(const G4String&, G4bool, G4bool);

    void BuildStomach(const G4String&, G4bool, G4bool);
    void BuildSmallIntestine(const G4String&, G4bool, G4bool);
    void BuildUpperLargeIntestine(const G4String&, G4bool, G4bool);
    void BuildLowerLargeIntestine(const G4String&, G4bool, G4bool);

    void BuildLeftKidney(const G4String&, G4bool, G4bool);
    void BuildRightKidney(const G4String&, G4bool, G4bool);
    void BuildLiver(const G4String&, G4bool, G4bool);
    void BuildPancreas(const G4String&, G4bool, G4bool);
    void BuildSpleen(const G4String&, G4bool, G4bool);
    void BuildUrinaryBladder(const G4String&, G4bool, G4bool);

    void BuildThyroid(const G4String&, G4bool, G4bool);
    void BuildThymus(const G4String&, G4bool, G4bool);

    void SetModel(G4String);
    void SetMotherVolume(G4VPhysicalVolume*);

    G4VPhysicalVolume* GetPhantom();

protected:
    G4VBodyFactory* body;

    G4String model;

    G4VPhysicalVolume* motherVolume;
    G4VPhysicalVolume* headVolume;
    G4VPhysicalVolume* trunkVolume;
    G4VPhysicalVolume* leftLegVolume;
    G4VPhysicalVolume* rightLegVolume;
    G4VPhysicalVolume* maleGenitaliaVolume;
};
#endif
