13#include "TGeoMatrix.h"
16#include <TPolyMarker3D.h>
19#include <TGeoPhysicalNode.h>
29const double Param::fgkD = 0.222500;
31const double Param::fgkSqrtK3x = TMath::Sqrt(0.66);
32const double Param::fgkK2x = TMath::PiOver2() * (1 - 0.5 * fgkSqrtK3x);
33const double Param::fgkK1x = 0.25 * fgkK2x * fgkSqrtK3x / TMath::ATan(fgkSqrtK3x);
34const double Param::fgkK4x = fgkK1x / (fgkK2x * fgkSqrtK3x);
36const double Param::fgkSqrtK3y = TMath::Sqrt(0.87);
37const double Param::fgkK2y = TMath::PiOver2() * (1 - 0.5 * fgkSqrtK3y);
38const double Param::fgkK1y = 0.25 * fgkK2y * fgkSqrtK3y / TMath::ATan(fgkSqrtK3y);
39const double Param::fgkK4y = fgkK1y / (fgkK2y * fgkSqrtK3y);
42float Param::fgkMinPcX[] = {0., 0., 0., 0., 0., 0.};
43float Param::fgkMaxPcX[] = {0., 0., 0., 0., 0., 0.};
44float Param::fgkMinPcY[] = {0., 0., 0., 0., 0., 0.};
45float Param::fgkMaxPcY[] = {0., 0., 0., 0., 0., 0.};
47bool Param::fgMapPad[160][144][7];
49float Param::fgCellX = 0.;
50float Param::fgCellY = 0.;
51float Param::fgHalfCellX = 0.;
52float Param::fgHalfCellY = 0.;
54float Param::fgPcX = 0;
55float Param::fgPcY = 0;
57float Param::fgAllX = 0;
58float Param::fgAllY = 0;
60bool Param::fgInstanceType = kTRUE;
62Param* Param::fgInstance =
nullptr;
64Int_t Param::fgNSigmas = 4;
65Int_t Param::fgThreshold = 4;
68Param::Param(
bool noGeo) : mX(0), mY(0), mRefIdx(1.28947), mPhotEMean(6.675), mTemp(25)
103 if (noGeo == kFALSE && !gGeoManager) {
104 TGeoManager::Import(
"geometry.root");
106 Printf(
"!!!!!!No geometry loaded!!!!!!!");
115 if (!noGeo == kTRUE) {
116 TGeoVolume* pCellVol = gGeoManager->GetVolume(
"Hcel");
118 TGeoBBox* bcell = (TGeoBBox*)pCellVol->GetShape();
153 for (Int_t padx = 0; padx < 160; padx++) {
154 for (Int_t pady = 0; pady < 144; pady++) {
161 if (gGeoManager && gGeoManager->IsClosed()) {
162 TGeoPNEntry* pne = gGeoManager->GetAlignableEntry(Form(
"/HMPID/Chamber%i",
i));
165 mM[
i] =
new TGeoHMatrix;
168 TGeoPhysicalNode* pnode = pne->GetPhysicalNode();
170 mM[
i] =
new TGeoHMatrix(*(pnode->GetMatrix()));
172 mM[
i] =
new TGeoHMatrix;
177 mM[
i] =
new TGeoHMatrix;
188 for (Int_t
i = 0;
i < 7;
i++) {
198 const double kAngHor = 19.5;
199 const double kAngVer = 20;
200 const double kAngCom = 30;
201 const double kTrans[3] = {490, 0, 0};
202 pMatrix->RotateY(90);
203 pMatrix->SetTranslation(kTrans);
206 pMatrix->RotateY(kAngHor);
207 pMatrix->RotateZ(-kAngVer);
210 pMatrix->RotateZ(-kAngVer);
213 pMatrix->RotateY(kAngHor);
218 pMatrix->RotateY(-kAngHor);
221 pMatrix->RotateZ(kAngVer);
224 pMatrix->RotateY(-kAngHor);
225 pMatrix->RotateZ(kAngVer);
228 pMatrix->RotateZ(kAngCom);
283double Param::sigma2(
double trkTheta,
double trkPhi,
double ckovTh,
double ckovPh)
293 TVector3
v(-999, -999, -999);
294 double trkBeta = 1. / (TMath::Cos(ckovTh) *
getRefIdx());
303 v.SetX(
sigLoc(trkTheta, trkPhi, ckovTh, ckovPh, trkBeta));
304 v.SetY(
sigGeom(trkTheta, trkPhi, ckovTh, ckovPh, trkBeta));
305 v.SetZ(
sigCrom(trkTheta, trkPhi, ckovTh, ckovPh, trkBeta));
310double Param::sigLoc(
double trkTheta,
double trkPhi,
double thetaC,
double phiC,
double betaM)
320 double phiDelta = phiC - trkPhi;
322 double sint = TMath::Sin(trkTheta);
323 double cost = TMath::Cos(trkTheta);
324 double sinf = TMath::Sin(trkPhi);
325 double cosf = TMath::Cos(trkPhi);
326 double sinfd = TMath::Sin(phiDelta);
327 double cosfd = TMath::Cos(phiDelta);
328 double tantheta = TMath::Tan(thetaC);
330 double alpha = cost - tantheta * cosfd * sint;
335 double mu = sint * sinf + tantheta * (cost * cosfd * sinf + sinfd * cosf);
336 double e = sint * cosf + tantheta * (cost * cosfd * cosf - sinfd * sinf);
340 double dtdxc = kk * (k * (cosfd * cosf - cost * sinfd * sinf) - (
alpha * mu / (betaM * betaM)) * sint * sinfd);
342 double dtdyc = kk * (k * (cosfd * sinf + cost * sinfd * cosf) + (
alpha * e / (betaM * betaM)) * sint * sinfd);
344 double errX = 0.2, errY = 0.25;
345 return TMath::Sqrt(errX * errX * dtdxc * dtdxc + errY * errY * dtdyc * dtdyc);
348double Param::sigCrom(
double trkTheta,
double trkPhi,
double thetaC,
double phiC,
double betaM)
358 double phiDelta = phiC - trkPhi;
360 double sint = TMath::Sin(trkTheta);
361 double cost = TMath::Cos(trkTheta);
362 double cosfd = TMath::Cos(phiDelta);
363 double tantheta = TMath::Tan(thetaC);
365 double alpha = cost - tantheta * cosfd * sint;
366 double dtdn = cost *
getRefIdx() * betaM * betaM / (
alpha * tantheta);
369 double f = 0.0172 * (7.75 - 5.635) / TMath::Sqrt(24.);
374double Param::sigGeom(
double trkTheta,
double trkPhi,
double thetaC,
double phiC,
double betaM)
384 double phiDelta = phiC - trkPhi;
386 double sint = TMath::Sin(trkTheta);
387 double cost = TMath::Cos(trkTheta);
388 double sinf = TMath::Sin(trkPhi);
389 double cosfd = TMath::Cos(phiDelta);
390 double costheta = TMath::Cos(thetaC);
391 double tantheta = TMath::Tan(thetaC);
393 double alpha = cost - tantheta * cosfd * sint;
401 double lambda = (1. - sint * sinf) * (1. + sint * sinf);
403 double c1 = 1. / (1. + eTr * k / (
alpha *
alpha * costheta * costheta));
405 double c3 = (1. + eTr * k * betaM * betaM) / ((1 + eTr) *
alpha *
alpha);
406 double c4 = TMath::Sqrt(k) * tantheta * (1 - lambda) / (
gapThick() * betaM);
407 double dtdT =
c1 * (
c2 + c3 * c4);
408 double trErr =
radThick() / (TMath::Sqrt(12.) * cost);
419 corr = 0.115 * occupancy + 1.166;
422 corr = 0.115 * occupancy + 1.166;
425 corr = 0.115 * occupancy + 1.166;
428 corr = 0.065 * occupancy + 1.137;
431 corr = 0.048 * occupancy + 1.202;
466 for (Int_t iPc = 0; iPc < 6; iPc++) {
481 if (
fgMapPad[padx - 1][pady - 1][ch]) {
534 hvsec = (py + (pc / 2) * (
kMaxPy + 1)) / ((
kMaxPy + 1) / 2);
553 double gradT = (tHigh - tLow) /
sizePcY();
554 return gradT * yRad + tLow;
562 for (Int_t padx = 0; padx <
kMaxPcx + 1; padx++) {
563 for (Int_t pady = 0; pady <
kMaxPcy + 1; pady++) {
576 Int_t npadsect = (
kMaxPcy + 1) / 6;
577 Int_t padSectMin = npadsect * sect;
578 Int_t padSectMax = padSectMin + npadsect;
580 for (Int_t padx = 0; padx <
kMaxPcx + 1; padx++) {
581 for (Int_t pady = padSectMin; pady < padSectMax; pady++) {
593 Int_t deltaX = pc % 2;
594 Int_t deltaY = pc / 2;
595 Int_t padPcXMin = deltaX *
kPadPcX;
596 Int_t padPcXMax = padPcXMin +
kPadPcX;
597 Int_t padPcYMin = deltaY *
kPadPcY;
598 Int_t padPcYMax = padPcYMin +
kPadPcY;
600 for (Int_t padx = padPcXMin; padx < padPcXMax; padx++) {
601 for (Int_t pady = padPcYMin; pady < padPcYMax; pady++) {
613 Printf(
" --------- C H A M B E R %d ---------------", ch);
614 for (Int_t pady =
kMaxPcy; pady >= 0; pady--) {
615 for (Int_t padx = 0; padx <
kMaxPcx + 1; padx++) {
619 printf(
"%d",
fgMapPad[padx][pady][ch]);
621 printf(
" %d \n", pady + 1);
622 if (pady % 48 == 0) {
bool const GPUTPCGMMerger::trackCluster * c1
bool const GPUTPCGMMerger::trackCluster const clcomparestruct * c2
ClassImp(o2::hmpid::Param)
static bool isDeadPad(Int_t padx, Int_t pady, Int_t ch)
static void idealPosition(Int_t iCh, TGeoHMatrix *m)
static float fgkMinPcX[6]
static Int_t inHVSector(float y)
static bool isInDead(float x, float y)
void setSectStatus(Int_t ch, Int_t sect, bool status)
void setChStatus(Int_t ch, bool status=kTRUE)
static float fgkMaxPcX[6]
static double hinRad(float y)
static Param * instanceNoGeo()
static float fgkMinPcY[6]
void setPcStatus(Int_t ch, Int_t pc, bool status)
double sigCrom(double trkTheta, double trkPhi, double ckovTh, double ckovPh, double beta)
static double sigmaCorrFact(Int_t iPart, double occupancy)
static void lors2Pad(float x, float y, Int_t &pc, Int_t &px, Int_t &py)
void print(Option_t *opt="") const
double meanIdxRad() const
static bool fgInstanceType
void printChStatus(Int_t ch)
static float fgkMaxPcY[6]
double sigGeom(double trkTheta, double trkPhi, double ckovTh, double ckovPh, double beta)
static Param * instance()
static double findTemp(double tLow, double tUp, double y)
double sigLoc(double trkTheta, double trkPhi, double ckovTh, double ckovPh, double beta)
double sigma2(double trkTheta, double trkPhi, double ckovTh, double ckovPh)
static Param * fgInstance
static bool fgMapPad[160][144][7]
GLfloat GLfloat GLfloat alpha