PandaRoot
PndLmdGeometryHelper.h
Go to the documentation of this file.
1 // @author S. Pflueger
2 // @author R. Klasen, roklasen@uni-mainz.de or r.klasen@gsi.de or r.klasen@ep1.rub.de
3 
4 #ifndef LMD_LMDMC_PNDLMDGEOMETRYHELPER_H_
5 #define LMD_LMDMC_PNDLMDGEOMETRYHELPER_H_
6 
7 #include <exception>
8 #include <iostream>
9 #include <map>
10 #include <mutex>
11 #include <string>
12 #include <vector>
13 
14 #include <boost/property_tree/json_parser.hpp>
15 #include <boost/property_tree/ptree.hpp>
16 
17 #include <TGeoManager.h>
18 #include <TVector3.h>
19 
21  // we use small data types here as they can be packed into 8 bytes
22  unsigned char detector_half;
23  unsigned char plane;
24  unsigned char module;
25  unsigned char module_side;
26  unsigned char module_sensor_id;
27 
28  friend std::ostream &operator<<(std::ostream &stream, const PndLmdHitLocationInfo &hit_info)
29  {
30  stream << "detector half: " << (unsigned int)hit_info.detector_half << "\n";
31  stream << "detector plane: " << (unsigned int)hit_info.plane << "\n";
32  stream << "module on half plane: " << (unsigned int)hit_info.module << "\n";
33  stream << "side of module: " << (unsigned int)hit_info.module_side << "\n";
34  stream << "sensor id: " << (unsigned int)hit_info.module_sensor_id << "\n";
35 
36  return stream;
37  }
38 
40  {
41  return std::tie(detector_half, plane, module, module_side, module_sensor_id) < std::tie(o.detector_half, o.plane, o.module, o.module_side, o.module_sensor_id);
42  }
43 };
44 
46  std::string path1;
47  std::string path2;
48  std::string pathModule;
49  int moduleID;
50  int overlapID;
51  int sectorID;
52  int id1;
53  int id2;
54 
55  TGeoHMatrix mat1;
56  TGeoHMatrix mat2;
57 
58  // two dummy HitLocationInfo objects for the sensors
61 
62  friend std::ostream &operator<<(std::ostream &stream, const PndLmdOverlapInfo &overlap_info)
63  {
64  stream << "path 1: " << overlap_info.path1 << "\n";
65  stream << "path 2: " << overlap_info.path2 << "\n";
66  stream << "module path: " << overlap_info.pathModule << "\n";
67  stream << "id 1: " << overlap_info.id1 << "\n";
68  stream << "id 2: " << overlap_info.id2 << "\n";
69  stream << "overlapID: " << overlap_info.overlapID << "\n";
70  return stream;
71  }
72 };
73 
75  boost::property_tree::ptree geometry_properties;
76  std::vector<std::pair<std::string, bool>> navigation_paths;
77 
78  std::map<std::string, PndLmdHitLocationInfo> volume_path_to_hit_info_mapping;
79  std::map<int, PndLmdHitLocationInfo> sensor_id_to_hit_info_mapping;
80 
81  std::string lmd_root_path;
82 
83  TGeoManager *fGeoManager;
84 
85  std::mutex accessMutex;
86  std::vector<std::string> fAlignableVolumes;
87 
88  PndLmdGeometryHelper(const std::string &geo_params_config_file_url = "") : fGeoManager(gGeoManager)
89  {
90  std::string file_url(geo_params_config_file_url);
91  if (geo_params_config_file_url == "") {
92  file_url = std::getenv("VMCWORKDIR");
93  file_url += "/macro/detectors/lmd/lmd-geo-params.json"; // FIXME: Put to input/ or params/
94  }
95  // load parameters
96  try {
97  read_json(file_url, geometry_properties);
98  } catch (std::exception &e) {
99  std::cerr << "PndLmdGeometryHelper::PndLmdGeometryHelper(): ERROR! Parameter file not present!\n";
100  std::cerr << "Was looking for file: " << file_url << "\n";
101  exit(1);
102  }
103 
104  if (!fGeoManager) {
105  std::cerr << "ERROR! gGeoManager is unitialized! Please populate the gGeoManager or initialize a run!\n";
106  exit(2);
107  }
108 
109  auto pt_general = geometry_properties.get_child("general");
110  for (boost::property_tree::ptree::value_type &nav_path : pt_general.get_child("navigation_paths")) {
111  navigation_paths.push_back(std::make_pair(nav_path.second.get<std::string>("name"), nav_path.second.get<bool>("is_alignable")));
112  }
113 
114  TString actPath = fGeoManager->GetPath();
115  std::stringstream lmd_path;
116  fGeoManager->CdTop();
117  lmd_path << fGeoManager->GetPath() << "/" << navigation_paths[0].first << "_0";
118  lmd_root_path = lmd_path.str();
119  if (actPath != "" && actPath != " ")
120  fGeoManager->cd(actPath);
121  }
122 
123  const PndLmdHitLocationInfo &createMappingEntry(int sensor_id);
124  const PndLmdHitLocationInfo &createMappingEntry(const std::string &volume_path);
125 
126  PndLmdHitLocationInfo translateVolumePathToHitLocationInfo(const std::string &volume_path) const;
127 
128  public:
130  {
131  static PndLmdGeometryHelper instance;
132  return instance;
133  }
134 
135  virtual ~PndLmdGeometryHelper();
136 
137  PndLmdGeometryHelper(const PndLmdGeometryHelper &) = delete;
138  void operator=(const PndLmdGeometryHelper &) = delete;
139 
140  const PndLmdHitLocationInfo &getHitLocationInfo(const std::string &volume_path);
141  // this function with the global sensor id is much faster for lookups
142  // so use that if you need speed!
143 
144  const PndLmdHitLocationInfo &getHitLocationInfo(int sensor_id);
145 
146  std::vector<int> getAvailableOverlapIDs();
147  int getOverlapIdFromSensorIDs(int id1, int id2);
148  int getModuleIDFromSensorID(int sensorID);
149  int getSectorIDfromSensorID(int sensorID);
150  std::string getModulePathFromModuleID(int moduleID);
151 
152  TVector3 transformPndGlobalToLmdLocal(const TVector3 &vec);
153  TVector3 transformPndGlobalToSensor(const TVector3 &vec, int sensorId);
154 
155  bool isOverlappingArea(const int id1, const int id2);
156 
157  const std::string getPath(unsigned char...);
158 
159  const TGeoHMatrix getMatrixPndGlobalToSensor(const int sensorId);
160  const TGeoHMatrix getMatrixSensorToPndGlobal(const int sensorId);
161 
162  const TGeoHMatrix getMatrixPndGlobalToLmdLocal();
163  const TGeoHMatrix getMatrixLmdLocalToPndGlobal();
164 
165  std::vector<std::string> getAllAlignPaths(bool sensors = true, bool modules = false, bool planes = false, bool halfs = false, bool detector = false);
166 
167  // can be restriced by half, plane and module
168  std::vector<PndLmdOverlapInfo> getOverlapInfos(int iHalf = -1, int iPlane = -1, int iModule = -1);
169 
170  std::vector<std::string> getAllAlignableVolumePaths();
171 };
172 
173 #endif /* LMD_LMDMC_PNDLMDGEOMETRYHELPER_H_ */
friend std::ostream & operator<<(std::ostream &stream, const PndLmdOverlapInfo &overlap_info)
static PndLmdGeometryHelper & getInstance()
bool operator<(const PndLmdHitLocationInfo &o)
friend std::ostream & operator<<(std::ostream &stream, const PndLmdHitLocationInfo &hit_info)
PndLmdHitLocationInfo hit1
PndLmdHitLocationInfo hit2