CbmRoot
Loading...
Searching...
No Matches
alignment/CbmRichProjectionProducerAnalytical.cxx
Go to the documentation of this file.
1/* Copyright (C) 2016-2019 Justus-Liebig-Universitaet Giessen, Giessen
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Petr Stolpovsky, Semen Lebedev, Jordan Bendarouach [committer] */
4
13
14#include "CbmMCTrack.h"
15#include "CbmRichGeoManager.h"
17#include "CbmRichPoint.h"
18#include "FairGeoNode.h"
19#include "FairGeoTransform.h"
20#include "FairGeoVector.h"
21#include "FairRootManager.h"
22#include "FairRun.h"
23#include "FairRunAna.h"
24#include "FairRuntimeDb.h"
25#include "FairTrackParam.h"
26#include "TClonesArray.h"
27#include "TGeoManager.h"
28#include "TMatrixFSym.h"
29#include "TVector3.h"
30
31#include <Logger.h>
32
33#include <cmath>
34#include <iostream>
35
36using std::cout;
37using std::endl;
38
40
41
43{
44}
45
47{
48 FairRootManager* fManager = FairRootManager::Instance();
49 fManager->Write();
50}
51
52
54{
55 LOG(info) << "CbmRichProjectionProducerAnalytical::Init()";
56 FairRootManager* manager = FairRootManager::Instance();
57
58 fTrackParams = (TClonesArray*) manager->GetObject("RichTrackParamZ");
59 if (NULL == fTrackParams) {
60 Fatal("CbmRichProjectionProducerAnalytical::Init:", "No RichTrackParamZ array!");
61 }
62
65}
66
68{
69 fEventNum++;
70 cout << "CbmRichProjectionProducerAnalytical:: event " << fEventNum << endl;
71
73 Double_t mirrorX = gp->fMirrorX;
74 Double_t mirrorY = gp->fMirrorY;
75 Double_t mirrorZ = gp->fMirrorZ;
76 Double_t mirrorR = gp->fMirrorR;
77
78 richProj->Delete();
79 TMatrixFSym covMat(5);
80 for (Int_t i = 0; i < 5; i++) {
81 for (Int_t j = 0; j <= i; j++) {
82 covMat(i, j) = 0;
83 }
84 }
85 covMat(0, 0) = covMat(1, 1) = covMat(2, 2) = covMat(3, 3) = covMat(4, 4) = 1.e-4;
86
87 for (Int_t j = 0; j < fTrackParams->GetEntriesFast(); j++) {
88 FairTrackParam* point = (FairTrackParam*) fTrackParams->At(j);
89 new ((*richProj)[j]) FairTrackParam(0., 0., 0., 0., 0., 0., covMat);
90
91 // check if Array was filled
92 if (point->GetX() == 0 && point->GetY() == 0 && point->GetZ() == 0 && point->GetTx() == 0 && point->GetTy() == 0)
93 continue;
94 if (point->GetQp() == 0) continue;
95
96 Double_t rho1 = 0.;
97 TVector3 startP, momP, crossP, centerP;
98
99
100 Double_t p = 1. / TMath::Abs(point->GetQp());
101 Double_t pz;
102 if ((1 + point->GetTx() * point->GetTx() + point->GetTy() * point->GetTy()) > 0.)
103 pz = p / TMath::Sqrt(1 + point->GetTx() * point->GetTx() + point->GetTy() * point->GetTy());
104 else {
105 cout << " -E- RichProjectionProducer: strange value for calculating pz: "
106 << (1 + point->GetTx() * point->GetTx() + point->GetTy() * point->GetTy()) << endl;
107 pz = 0.;
108 continue;
109 }
110 Double_t px = pz * point->GetTx();
111 Double_t py = pz * point->GetTy();
112 momP.SetXYZ(px, py, pz);
113 point->Position(startP);
114 if ((mirrorY * startP.y()) < 0) mirrorY = -mirrorY; // check that mirror center and startP are in same hemisphere
115
116 // calculation of intersection of track with selected mirror
117 // corresponds to calculation of intersection between a straight line and a sphere:
118 // vector: r = startP - mirrorCenter
119 // RxP = r*momP
120 // normP2 = momP^2
121 // dist = r^2 - fR^2
122 // -> rho1 = (-RxP+sqrt(RxP^2-normP2*dist))/normP2 extrapolation factor for:
123 // intersection point crossP = startP + rho1 * momP
124 Double_t RxP =
125 (momP.x() * (startP.x() - mirrorX) + momP.y() * (startP.y() - mirrorY) + momP.z() * (startP.z() - mirrorZ));
126 Double_t normP2 = (momP.x() * momP.x() + momP.y() * momP.y() + momP.z() * momP.z());
127 Double_t dist = (startP.x() * startP.x() + mirrorX * mirrorX + startP.y() * startP.y() + mirrorY * mirrorY
128 + startP.z() * startP.z() + mirrorZ * mirrorZ - 2 * startP.x() * mirrorX - 2 * startP.y() * mirrorY
129 - 2 * startP.z() * mirrorZ - mirrorR * mirrorR);
130
131 if ((RxP * RxP - normP2 * dist) > 0.) {
132 if (normP2 != 0.) rho1 = (-RxP + TMath::Sqrt(RxP * RxP - normP2 * dist)) / normP2;
133 if (normP2 == 0) cout << " Error in track extrapolation: momentum = 0 " << endl;
134 }
135 else {
136 //cout << " -E- RichProjectionProducer: RxP*RxP-normP2*dist = " << RxP*RxP-normP2*dist << endl;
137 }
138
139 Double_t crossPx = startP.x() + rho1 * momP.x();
140 Double_t crossPy = startP.y() + rho1 * momP.y();
141 Double_t crossPz = startP.z() + rho1 * momP.z();
142 crossP.SetXYZ(crossPx, crossPy, crossPz);
143
144 // check if crosspoint with mirror and chosen mirrorcenter (y) are in same hemisphere
145 // if not recalculate crossing point
146 if ((mirrorY * crossP.y()) < 0) {
147 mirrorY = -mirrorY;
148 RxP = (momP.x() * (startP.x() - mirrorX) + momP.y() * (startP.y() - mirrorY) + momP.z() * (startP.z() - mirrorZ));
149 normP2 = (momP.x() * momP.x() + momP.y() * momP.y() + momP.z() * momP.z());
150 dist = (startP.x() * startP.x() + mirrorX * mirrorX + startP.y() * startP.y() + mirrorY * mirrorY
151 + startP.z() * startP.z() + mirrorZ * mirrorZ - 2 * startP.x() * mirrorX - 2 * startP.y() * mirrorY
152 - 2 * startP.z() * mirrorZ - mirrorR * mirrorR);
153
154 if ((RxP * RxP - normP2 * dist) > 0.) {
155 if (normP2 != 0.) rho1 = (-RxP + TMath::Sqrt(RxP * RxP - normP2 * dist)) / normP2;
156 if (normP2 == 0) cout << " Error in track extrapolation: momentum = 0 " << endl;
157 }
158 else {
159 //cout << " -E- RichProjectionProducer: RxP*RxP-normP2*dist = " << RxP*RxP-normP2*dist << endl;
160 }
161
162 crossPx = startP.x() + rho1 * momP.x();
163 crossPy = startP.y() + rho1 * momP.y();
164 crossPz = startP.z() + rho1 * momP.z();
165 crossP.SetXYZ(crossPx, crossPy, crossPz);
166 }
167
168 centerP.SetXYZ(mirrorX, mirrorY, mirrorZ); // mirror center
169
170 TVector3 crossPoint;
171 string volumeName = CbmRichNavigationUtil::FindIntersection(point, crossPoint, "mirror_tile_");
172 //cout << "CbmRichProjectionAnalytical: volume Name = " << volumeName << endl;
173
174 TVector3 newCenterP;
175 newCenterP = MirrorCenter(centerP, volumeName);
176
177 // calculate normal on crosspoint with mirror
178 TVector3 normP(crossP.x() - newCenterP.x(), crossP.y() - newCenterP.y(), crossP.z() - newCenterP.z());
179 // TVector3 normP(crossP.x()-centerP.x(),crossP.y()-centerP.y(),crossP.z()-centerP.z());
180 normP = normP.Unit();
181 // check that normal has same z-direction as momentum
182 if ((normP.z() * momP.z()) < 0.) normP = TVector3(-1. * normP.x(), -1. * normP.y(), -1. * normP.z());
183
184 // reflect track
185 Double_t np = normP.x() * momP.x() + normP.y() * momP.y() + normP.z() * momP.z();
186
187 TVector3 ref;
188 ref.SetXYZ(2 * np * normP.x() - momP.x(), 2 * np * normP.y() - momP.y(), 2 * np * normP.z() - momP.z());
189
190 if (ref.z() != 0.) {
191
192 TVector3 inPos(0., 0., 0.), outPos(0., 0., 0.);
193
195 GetPmtIntersectionPointCyl(&newCenterP, &crossP, &ref, &inPos);
196 // cout << "inPos new center P: " << inPos.X() << ", " << inPos.Y() << ", " << inPos.Z() << endl;
197 // GetPmtIntersectionPointCyl(&centerP, &crossP, &ref, &inPos);
198 // Transform intersection point in same way as MCPoints were transformed in HitProducer before stored as Hit
199 // For the cylindrical geometry we also pass the path to the strip block
201
202 //cout << "inPoint:" << inPos.X() << " " << inPos.Y() << " " << inPos.Z() << " outPoint:" << outPos.X() << " " << outPos.Y() << " " << outPos.Z() << endl;
203 }
205 GetPmtIntersectionPointTwoWings(&centerP, &crossP, &ref, &inPos);
206 // Transform intersection point in same way as MCPoints were transformed in HitProducer before stored as Hit
208 }
209 else {
210 Fatal("CbmRichProjectionProducerAnalytical ", "unknown geometry type");
211 }
212
213 Bool_t isInsidePmt = CbmRichGeoManager::GetInstance().IsPointInsidePmt(&outPos);
214
215 if (isInsidePmt) {
216 FairTrackParam richtrack(outPos.x(), outPos.y(), outPos.z(), 0., 0., 0., covMat);
217 *(FairTrackParam*) (richProj->At(j)) = richtrack;
218 }
219 } // if (refZ!=0.)
220 } // j
221}
222
223TVector3 CbmRichProjectionProducerAnalytical::MirrorCenter(const TVector3 centerP, const string volumeName)
224{
225 if (volumeName == "" || !(fMirrorCorrectionParameterFile->GetMirrorCorrectionParamBool())) {
226 //cout << "center P: " << centerP.x() << ", " << centerP.y() << ", " << centerP.z() << endl;
227 return (centerP);
228 }
229
230 TVector3 newCenterP;
231
232 string mirrorID = GetMirrorID(volumeName);
233
234 std::map<string, std::pair<Double_t, Double_t>> mirrorCorrectionParamMap;
236 for (std::map<string, std::pair<Double_t, Double_t>>::iterator it = mirrorCorrectionParamMap.begin();
237 it != mirrorCorrectionParamMap.end(); ++it) {
238 if (it->first == mirrorID) {
239 cout << "Map's first key: " << it->first << " and pair: " << it->second.first << ", " << it->second.second
240 << endl;
241 newCenterP.SetX(centerP.X() + it->second.first);
242 newCenterP.SetY(centerP.Y() + it->second.second);
243 newCenterP.SetZ(centerP.Z());
244 }
245 }
246 //cout << "center P: " << centerP.x() << ", " << centerP.y() << ", " << centerP.z() << endl;
247 //cout << "new center P: " << newCenterP.x() << ", " << newCenterP.y() << ", " << newCenterP.z() << endl;
248
249 return (newCenterP);
250}
251
252/*
253TVector3 CbmRichProjectionProducerAnalytical::MirrorCenter(
254 const TVector3 centerP,
255 const string volumeName)
256{
257 if ( volumeName == "" ) {
258 return(centerP);
259 }
260
261 TVector3 newCenterP;
262
263 string mirrorID = GetMirrorID(volumeName);
264
265 Int_t lineCounter=1, lineIndex=0;
266 //TString corrFileName = "/data/Sim_Outputs/Correction_test/new_code/corr_params/correction_param_array_Full_Correction.txt";
267 TString corrFileName = fPathToMirrorCorrectionParameterFile;
268 //TString corrFileName = fTxtFile + "correction_param_array_" + fStudyName + ".txt";
269 string fileLine = "", strMisX = "", strMisY = "";
270 Double_t misX=0., misY=0.;
271 ifstream corrFile;
272 corrFile.open(corrFileName);
273
274 if (corrFile.is_open())
275 {
276 while (!corrFile.eof())
277 {
278 getline(corrFile, fileLine);
279 lineIndex = fileLine.find(mirrorID, 0);
280 if (lineIndex != string::npos)
281 {
282 cout << mirrorID << " has been found in the file at line: " << lineCounter << " and position: " << lineIndex << "." << endl;
283 break;
284 }
285 lineCounter++;
286 }
287 corrFile >> misY;
288 //cout << "number at line: " << lineCounter+2 << " = " << misX << "." << endl;
289 corrFile >> misX;
290 //cout << "number at line: " << lineCounter+3 << " = " << misY << "." << endl;
291
292 corrFile.close();
293 }
294 else {
295 cout << "CbmRichProjectionProducerAnalytical:: unable to open file with correction parameters!" << endl;
296 cout << "Parameter file path located at: " << corrFileName << endl;
297 cout << "Using ideal tile center." << endl;
298 return(centerP);
299 }
300
301 cout << "Correction parameters = " << misX << ", " << misY << endl;
302 newCenterP.SetX(centerP.X() + misX);
303 newCenterP.SetY(centerP.Y() + misY);
304 newCenterP.SetZ(centerP.Z());
305
306 cout << "center P: " << centerP.x() << ", " << centerP.y() << ", " << centerP.z() << endl;
307 cout << "new center P: " << newCenterP.x() << ", " << newCenterP.y() << ", " << newCenterP.z() << endl;
308
309 return(newCenterP);
310}
311*/
312
314{
315 string str1 = "mirror_tile_", str2 = "";
316 std::size_t found = volumeName.find(str1);
317 if (found != std::string::npos) {
318 //cout << "first 'mirror_tile_type' found at: " << found << '\n';
319 Int_t end = str1.length() + 3;
320 str2 = volumeName.substr(found, end);
321 }
322 cout << "Mirror ID: " << str2 << endl;
323
324 return (str2);
325}
326
328 const TVector3* crossP, const TVector3* ref,
329 TVector3* outPoint)
330{
331 // crosspoint whith photodetector plane:
332 // calculate intersection between straight line and (tilted) plane:
333 // normal on plane tilted by theta around x-axis: (0,-sin(theta),cos(theta)) = n
334 // normal on plane tilted by phi around y-axis: (-sin(phi),0,cos(phi)) = n
335 // normal on plane tilted by theta around x-axis and phi around y-axis: (-sin(phi),-sin(theta)cos(phi),cos(theta)cos(phi)) = n
336 // point on plane is (fDetX,fDetY,fDetZ) = p as photodetector is tiled around its center
337 // equation of plane for r being point in plane: n(r-p) = 0
338 // calculate intersection point of reflected track with plane: r=intersection point
339 // intersection point = crossP + rho2 * refl_track
340 // take care for all 4 cases:
341 // -> first calculate for case x>0, then check
342
344
346 Fatal("CbmRichProjectionProducerAnalytical::GetPmtIntersectionPointTwoWings ",
347 "Wrong geometry, this method could be used only for "
348 "CbmRichGeometryTypeTwoWings");
349 }
350
351 Double_t pmtPhi = gp->fPmt.fPhi;
352 Double_t pmtTheta = gp->fPmt.fTheta;
353 Double_t pmtPlaneX = gp->fPmt.fPlaneX;
354 Double_t pmtPlaneY = gp->fPmt.fPlaneY;
355 Double_t pmtPlaneZ = gp->fPmt.fPlaneZ;
356 Double_t rho2 = 0.;
357
358 if (centerP->y() > 0) {
359 rho2 = (-TMath::Sin(pmtPhi) * (pmtPlaneX - crossP->x())
360 - TMath::Sin(pmtTheta) * TMath::Cos(pmtPhi) * (pmtPlaneY - crossP->y())
361 + TMath::Cos(pmtTheta) * TMath::Cos(pmtPhi) * (pmtPlaneZ - crossP->z()))
362 / (-TMath::Sin(pmtPhi) * ref->x() - TMath::Sin(pmtTheta) * TMath::Cos(pmtPhi) * ref->y()
363 + TMath::Cos(pmtTheta) * TMath::Cos(pmtPhi) * ref->z());
364 }
365 if (centerP->y() < 0) {
366 rho2 = (-TMath::Sin(pmtPhi) * (pmtPlaneX - crossP->x())
367 - TMath::Sin(-pmtTheta) * TMath::Cos(pmtPhi) * (-pmtPlaneY - crossP->y())
368 + TMath::Cos(-pmtTheta) * TMath::Cos(pmtPhi) * (pmtPlaneZ - crossP->z()))
369 / (-TMath::Sin(pmtPhi) * ref->x() - TMath::Sin(-pmtTheta) * TMath::Cos(pmtPhi) * ref->y()
370 + TMath::Cos(-pmtTheta) * TMath::Cos(pmtPhi) * ref->z());
371 }
372
373 //rho2 = -1*(crossP.z() - fDetZ)/refZ; // only for theta = 0, phi=0
374 Double_t xX = crossP->x() + ref->x() * rho2;
375 Double_t yY = crossP->y() + ref->y() * rho2;
376 Double_t zZ = crossP->z() + ref->z() * rho2;
377
378 if (xX < 0) {
379 if (centerP->y() > 0) {
380 rho2 = (-TMath::Sin(-pmtPhi) * (-pmtPlaneX - crossP->x())
381 - TMath::Sin(pmtTheta) * TMath::Cos(-pmtPhi) * (pmtPlaneY - crossP->y())
382 + TMath::Cos(pmtTheta) * TMath::Cos(-pmtPhi) * (pmtPlaneZ - crossP->z()))
383 / (-TMath::Sin(-pmtPhi) * ref->x() - TMath::Sin(pmtTheta) * TMath::Cos(-pmtPhi) * ref->y()
384 + TMath::Cos(pmtTheta) * TMath::Cos(-pmtPhi) * ref->z());
385 }
386 if (centerP->y() < 0) {
387 rho2 = (-TMath::Sin(-pmtPhi) * (-pmtPlaneX - crossP->x())
388 - TMath::Sin(-pmtTheta) * TMath::Cos(-pmtPhi) * (-pmtPlaneY - crossP->y())
389 + TMath::Cos(-pmtTheta) * TMath::Cos(-pmtPhi) * (pmtPlaneZ - crossP->z()))
390 / (-TMath::Sin(-pmtPhi) * ref->x() - TMath::Sin(-pmtTheta) * TMath::Cos(-pmtPhi) * ref->y()
391 + TMath::Cos(-pmtTheta) * TMath::Cos(-pmtPhi) * ref->z());
392 }
393
394 xX = crossP->x() + ref->x() * rho2;
395 yY = crossP->y() + ref->y() * rho2;
396 zZ = crossP->z() + ref->z() * rho2;
397 }
398
399 outPoint->SetXYZ(xX, yY, zZ);
400}
401
402
403void CbmRichProjectionProducerAnalytical::GetPmtIntersectionPointCyl(const TVector3* centerP, const TVector3* crossP,
404 const TVector3* ref, TVector3* outPoint)
405{
408 Fatal("CbmRichProjectionProducerAnalytical::GetPmtIntersectionPointCyl ",
409 "Wrong geometry, this method could be used only for "
410 "CbmRichGeometryTypeCylindrical");
411 }
412 Double_t xX;
413 Double_t yY;
414 Double_t zZ;
415 Double_t maxDist = 0.;
416
417 for (map<string, CbmRichRecGeoParPmt>::iterator it = gp->fPmtMap.begin(); it != gp->fPmtMap.end(); it++) {
418 Double_t pmtPlaneX = it->second.fPlaneX;
419 Double_t pmtPlaneY = it->second.fPlaneY;
420 Double_t pmtPlaneZ = it->second.fPlaneZ;
421 Double_t pmtPhi = it->second.fPhi;
422 Double_t pmtTheta = it->second.fTheta;
423
424 if (!(pmtPlaneX >= 0 && pmtPlaneY >= 0)) continue;
425
426 double rho2 = 0.;
427
428 if (centerP->y() > 0) {
429 rho2 = (-TMath::Sin(pmtPhi) * (pmtPlaneX - crossP->x())
430 - TMath::Sin(pmtTheta) * TMath::Cos(pmtPhi) * (pmtPlaneY - crossP->y())
431 + TMath::Cos(pmtTheta) * TMath::Cos(pmtPhi) * (pmtPlaneZ - crossP->z()))
432 / (-TMath::Sin(pmtPhi) * ref->x() - TMath::Sin(pmtTheta) * TMath::Cos(pmtPhi) * ref->y()
433 + TMath::Cos(pmtTheta) * TMath::Cos(pmtPhi) * ref->z());
434 }
435 if (centerP->y() < 0) {
436 rho2 = (-TMath::Sin(pmtPhi) * (pmtPlaneX - crossP->x())
437 - TMath::Sin(-pmtTheta) * TMath::Cos(pmtPhi) * (-pmtPlaneY - crossP->y())
438 + TMath::Cos(-pmtTheta) * TMath::Cos(pmtPhi) * (pmtPlaneZ - crossP->z()))
439 / (-TMath::Sin(pmtPhi) * ref->x() - TMath::Sin(-pmtTheta) * TMath::Cos(pmtPhi) * ref->y()
440 + TMath::Cos(-pmtTheta) * TMath::Cos(pmtPhi) * ref->z());
441 }
442
443 Double_t cxX = crossP->x() + ref->x() * rho2;
444 Double_t cyY = crossP->y() + ref->y() * rho2;
445 Double_t czZ = crossP->z() + ref->z() * rho2;
446
447 if (cxX < 0) {
448 if (centerP->y() > 0) {
449 rho2 = (-TMath::Sin(-pmtPhi) * (-pmtPlaneX - crossP->x())
450 - TMath::Sin(pmtTheta) * TMath::Cos(-pmtPhi) * (pmtPlaneY - crossP->y())
451 + TMath::Cos(pmtTheta) * TMath::Cos(-pmtPhi) * (pmtPlaneZ - crossP->z()))
452 / (-TMath::Sin(-pmtPhi) * ref->x() - TMath::Sin(pmtTheta) * TMath::Cos(-pmtPhi) * ref->y()
453 + TMath::Cos(pmtTheta) * TMath::Cos(-pmtPhi) * ref->z());
454 }
455 if (centerP->y() < 0) {
456 rho2 = (-TMath::Sin(-pmtPhi) * (-pmtPlaneX - crossP->x())
457 - TMath::Sin(-pmtTheta) * TMath::Cos(-pmtPhi) * (-pmtPlaneY - crossP->y())
458 + TMath::Cos(-pmtTheta) * TMath::Cos(-pmtPhi) * (pmtPlaneZ - crossP->z()))
459 / (-TMath::Sin(-pmtPhi) * ref->x() - TMath::Sin(-pmtTheta) * TMath::Cos(-pmtPhi) * ref->y()
460 + TMath::Cos(-pmtTheta) * TMath::Cos(-pmtPhi) * ref->z());
461 }
462
463 cxX = crossP->x() + ref->x() * rho2;
464 cyY = crossP->y() + ref->y() * rho2;
465 czZ = crossP->z() + ref->z() * rho2;
466 }
467
468 Double_t dP = TMath::Sqrt((crossP->x() - cxX) * (crossP->X() - cxX) + (crossP->y() - cyY) * (crossP->y() - cyY)
469 + (crossP->z() - czZ) * (crossP->Z() - czZ));
470
471 if (dP >= maxDist) {
472 maxDist = dP;
473 xX = cxX;
474 yY = cyY;
475 zZ = czZ;
476 }
477 }
478
479 outPoint->SetXYZ(xX, yY, zZ);
480}
@ CbmRichGeometryTypeTwoWings
@ CbmRichGeometryTypeCylindrical
TClonesArray * richProj
Project track by straight line from imaginary plane to the mirror and reflect it to the photodetector...
void RotatePoint(TVector3 *inPos, TVector3 *outPos, Bool_t noTilting=false)
CbmRichRecGeoPar * fGP
Bool_t IsPointInsidePmt(const TVector3 *rotatedPoint)
static CbmRichGeoManager & GetInstance()
class checks correction parameter file containing mirror misalignment information.
std::map< string, std::pair< Double_t, Double_t > > GetMirrorCorrectionParamMap()
void Init(const string &s)
Initialization in case one needs to initialize some TCloneArrays.
static string FindIntersection(const FairTrackParam *par, TVector3 &crossPoint, const string &volumeName)
void GetPmtIntersectionPointCyl(const TVector3 *centerP, const TVector3 *crossP, const TVector3 *ref, TVector3 *outPoint)
virtual void DoProjection(TClonesArray *richProj)
Execute task.
void GetPmtIntersectionPointTwoWings(const TVector3 *centerP, const TVector3 *crossP, const TVector3 *ref, TVector3 *outPoint)
TVector3 MirrorCenter(const TVector3 centerP, const string volumeName)
CbmRichMirrorMisalignmentCorrectionUtils * fMirrorCorrectionParameterFile
PMT parameters for the RICH geometry.
CbmRichRecGeoParPmt fPmt
CbmRichGeometryType fGeometryType
std::map< std::string, CbmRichRecGeoParPmt > fPmtMap