8#include <geometry/Materials.h> 
    9#include <framework/gearbox/GearDir.h> 
   10#include <framework/logging/Logger.h> 
   11#include <boost/format.hpp> 
   12#include <boost/lexical_cast.hpp> 
   13#include <boost/algorithm/string.hpp> 
   14#include <beast/csi/geometry/CsiGeometryPar.h> 
   44    B2INFO(
"m_B4CsiGeometryParDB deleted ");
 
   64  GearDir content = 
GearDir(
"/Detector/DetectorComponent[@name=\"CSI\"]/Content/");
 
   65  string gearPath = 
"Enclosures/Enclosure";
 
   66  int nEnc = content.getNumberNodes(gearPath);
 
   70  for (
int iEnc = 1; iEnc <= nEnc; iEnc++) {
 
   77    string enclosurePath = (boost::format(
"/%1%[%2%]") % gearPath % iEnc).str();
 
   80    GearDir enclosureContent(content);
 
   81    enclosureContent.
append(enclosurePath);
 
   84    double PosZ  = enclosureContent.
getLength(
"PosZ") * CLHEP::cm;
 
   85    double PosR  = enclosureContent.
getLength(
"PosR") * CLHEP::cm;
 
   86    double PosT  = enclosureContent.
getAngle(
"PosT") ;
 
   89    double Phi1  = enclosureContent.
getAngle(
"AngPhi1") ;
 
   90    double Theta = enclosureContent.
getAngle(
"AngTheta") ;
 
   91    double Phi2  = enclosureContent.
getAngle(
"AngPhi2") ;
 
   94    Transform3D m1 = RotateZ3D(Phi1);
 
   95    Transform3D m2 = RotateY3D(Theta);
 
   96    Transform3D m3 = RotateZ3D(Phi2);
 
   97    Transform3D position = Translate3D(PosR * cos(PosT), PosR * sin(PosT), PosZ);
 
  100    Transform3D Tr    = position * m3 * m2 * m1;
 
  103    for (
int iSlot = 1; iSlot <= nSlots; iSlot++) {
 
  107      string slotPath = (boost::format(
"/Enclosures/Slot[%1%]") % iSlot).str();
 
  110      slotContent.
append(slotPath);
 
  112      double SlotX = slotContent.
getLength(
"PosX") * CLHEP::cm;
 
  113      double SlotY = slotContent.
getLength(
"PosY") * CLHEP::cm;
 
  114      double SlotZ = slotContent.
getLength(
"PosZ") * CLHEP::cm;
 
  115      Transform3D Pos = Translate3D(SlotX, SlotY, SlotZ);
 
  117      Transform3D CrystalPos = Tr * Pos;
 
  118      RotationMatrix CrystalRot = CrystalPos.getRotation();
 
  120      m_Position.push_back(ROOT::Math::XYZVector(CrystalPos.getTranslation()) * 1.0 / CLHEP::cm);
 
  121      m_Orientation.push_back(ROOT::Math::XYZVector(CrystalRot.colZ()));
 
  123      m_thetaID.push_back(CrystalPos.getTranslation().z() > 0 ? 0 : 1);
 
  138  vector< string > partName;
 
  139  split(partName, VolumeName, is_any_of(
"_"));
 
  143  for (std::vector<string>::iterator it = partName.begin() ; it != partName.end(); ++it) {
 
  144    if (equals(*it, 
"Enclosure")) iEnclosure = boost::lexical_cast<int>(*(it + 1)) - 1;
 
  145    else if (equals(*it, 
"Crystal")) iCrystal = boost::lexical_cast<int>(*(it + 1)) - 1;
 
  148  cellID = 3 * iEnclosure + iCrystal;
 
  150  if (cellID < 0) B2WARNING(
"CsiGeometryPar: volume " << VolumeName << 
" is not a crystal");
 
  161  GearDir content = 
GearDir(
"/Detector/DetectorComponent[@name=\"CSI\"]/Content/");
 
  163  GearDir enclosureContent(content);
 
  164  string gearPath = 
"Enclosures/Enclosure";
 
  165  string enclosurePath = (format(
"/%1%[%2%]") % gearPath % iEnclosure).str();
 
  166  enclosureContent.
append(enclosurePath);
 
  168  string slotName = (format(
"CrystalInSlot[%1%]") % iSlot).str();
 
  169  int iCry = enclosureContent.
getInt(slotName);
 
  172  GearDir crystalContent(content);
 
  173  crystalContent.
append((format(
"/EndCapCrystals/EndCapCrystal[%1%]/") % (iCry)).str());
 
  174  string strMatCrystal = crystalContent.
getString(
"Material", 
"Air");
 
  184  G4MaterialPropertiesTable* properties = mat->GetMaterialPropertiesTable();
 
  185  G4MaterialPropertyVector* 
property = properties->GetProperty(propertyname);
 
  187  return property->Value(0);
 
  192  B2DEBUG(debuglevel, 
"Cell ID : " << cid);
 
  194  B2DEBUG(debuglevel, 
"   Position  x : " << 
GetPosition(cid).x());
 
  195  B2DEBUG(debuglevel, 
"   Position  y : " << 
GetPosition(cid).y());
 
  196  B2DEBUG(debuglevel, 
"   Position  z : " << 
GetPosition(cid).z());
 
  198  B2DEBUG(debuglevel, 
"   Orientation  x : " << 
GetOrientation(cid).x());
 
  199  B2DEBUG(debuglevel, 
"   Orientation  y : " << 
GetOrientation(cid).y());
 
  200  B2DEBUG(debuglevel, 
"   Orientation  z : " << 
GetOrientation(cid).z());
 
  202  B2DEBUG(debuglevel, 
"   Material : " << 
GetMaterial(cid)->GetName());
 
  204  B2DEBUG(debuglevel, 
"   Slow time constatnt : " << 
GetMaterialProperty(cid, 
"SLOWTIMECONSTANT"));
 
  205  B2DEBUG(debuglevel, 
"   Fast time constatnt : " << 
GetMaterialProperty(cid, 
"FASTTIMECONSTANT"));
 
  213  for (uint i = 0; i < 
m_thetaID.size(); i++)
 
  214    Print(i, debuglevel);
 
GearDir is the basic class used for accessing the parameter store.
void append(const std::string &path)
Append something to the current path, modifying the GearDir in place.
virtual int getNumberNodes(const std::string &path="") const override
Return the number of nodes a given path will expand to.
virtual std::string getString(const std::string &path="") const noexcept(false) override
Get the parameter path as a string.
The Class for CSI Geometry Parameters.
void PrintAll(int debuglevel=80)
Print all crystals information.
std::vector< ROOT::Math::XYZVector > m_Position
Position of the nominal centre of the crystal.
int GetEnclosureID(int cid)
Get Enclosure ID from cell ID.
ROOT::Math::XYZVector GetOrientation(int cid)
Get the orientation of the crystal.
std::vector< ROOT::Math::XYZVector > m_Orientation
Orientation of the crystal.
CsiGeometryPar()
Constructor.
std::vector< int > m_thetaID
The Theta ID information.
void Print(const int cid, int debuglevel=80)
Print crystal information.
int m_cellID
The Cell ID information.
ROOT::Math::XYZVector GetPosition(int cid)
Get the position of the crystal.
std::vector< int > m_phiID
The Phi ID information.
void read()
Gets geometry parameters from gearbox.
virtual ~CsiGeometryPar()
Destructor.
std::vector< int > m_BoxID
The index of the enclosure.
G4Material * GetMaterial(int cid)
Get pointer to the Geant4 Material.
static CsiGeometryPar * Instance()
Static method to get a reference to the CsiGeometryPar instance.
int CsiVolNameToCellID(const G4String VolumeName)
Get Cell Id.
std::vector< int > m_SlotID
The slot index of the crystal in the enclosure.
int GetSlotID(int cid)
Get Slot ID in the Enclosure from cell ID.
static CsiGeometryPar * m_B4CsiGeometryParDB
Pointer that saves the instance of this class.
double GetMaterialProperty(int cid, const char *propertyname)
Get material property.
double getAngle(const std::string &path="") const noexcept(false)
Get the parameter path as a double converted to the standard angle unit.
double getLength(const std::string &path="") const noexcept(false)
Get the parameter path as a double converted to the standard length unit.
int getInt(const std::string &path="") const noexcept(false)
Get the parameter path as a int.
static G4Material * get(const std::string &name)
Find given material.
Abstract base class for different kinds of events.