13#include "TGeoMatrix.h"
16#include <TPolyMarker3D.h>
19#include <TGeoPhysicalNode.h>
32const double Param::fgkK2x = TMath::PiOver2() * (1 - 0.5 * fgkSqrtK3x);
33const double Param::fgkK1x = 0.25 * fgkK2x * fgkSqrtK3x / TMath::ATan(fgkSqrtK3x);
37const double Param::fgkK2y = TMath::PiOver2() * (1 - 0.5 * fgkSqrtK3y);
38const double Param::fgkK1y = 0.25 * fgkK2y * fgkSqrtK3y / TMath::ATan(fgkSqrtK3y);
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 const double fgkSqrtK3y
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 const double fgkK4x
static double hinRad(float y)
static Param * instanceNoGeo()
static float fgkMinPcY[6]
static const double fgkK1y
static const double fgkK4y
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
static const double fgkK2x
static const double fgkK2y
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 const double fgkSqrtK3x
static const double fgkK1x
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