6 #include "CLHEP/Units/GlobalPhysicalConstants.h" 7 #include "CLHEP/Units/GlobalSystemOfUnits.h" 15 edm::LogInfo(
"HCalGeom") <<
"HcalDDDSimConstants::HcalDDDSimConstants (const HcalParameter* hp) constructor\n";
22 <<
" cells of type HCal (All)\n";
28 edm::LogInfo (
"HCalGeom") <<
"HcalDDDSimConstants::destructed!!!\n";
33 const int&
depth,
const int& etaR,
34 const int& iphi)
const {
43 double eta = 0, deta = 0,
phi = 0, dphi = 0, rz = 0, drz = 0;
44 bool ok =
false, flagrz =
true;
47 && etaR >=etaMn && etaR <= etaMx && depth > 0) ok =
true;
48 if (idet == static_cast<int>(
HcalEndcap) && depth>(
int)(
hpar->
zHE.size()))ok=
false;
50 else if (idet == static_cast<int>(
HcalOuter) && depth != 4) ok=
false;
53 eta =
getEta(idet, etaR, zside, depth);
60 }
else if (idet == static_cast<int>(
HcalEndcap)) {
68 phi =-fioff + (iphi - 0.5)*fibin;
72 if (ir > 0 && ir <
nR) {
78 edm::LogInfo(
"HCalGeom") <<
"HcalDDDSimConstants: wrong eta " << etaR
79 <<
" (" << ir <<
"/" <<
nR <<
") Detector " 83 }
else if (etaR <=
nEta) {
84 int laymin(depth), laymax(depth);
85 if (idet == static_cast<int>(
HcalOuter)) {
103 << depth <<
" or etaR " << etaR
104 <<
" for detector " << idet;
108 edm::LogWarning(
"HCalGeom") <<
"HcalDDDSimConstants: wrong depth " << depth
115 <<
"phi " << idet <<
"/" << zside <<
"/" 116 << depth <<
"/" << etaR <<
"/" << iphi
117 <<
" Cell Flag " << tmp.
ok <<
" " << tmp.
eta 118 <<
" " << tmp.
deta <<
" phi " << tmp.
phi <<
" " 119 << tmp.
dphi <<
" r(z) " << tmp.
rz <<
" " 127 const int& lay)
const {
135 unsigned int id = layerGroup.size();
136 for (
unsigned int i = 0;
i < layerGroup.size();
i++) {
137 if (layer == (
int)(layerGroup[
i].layer)) {
147 std::vector<std::pair<double,double> > gcons;
149 for (
unsigned int i=0;
i<
hpar->
rHB.size(); ++
i) {
153 for (
unsigned int i=0;
i<
hpar->
zHE.size(); ++
i) {
161 const int&
zside)
const {
173 std::vector<int> phis;
176 int zside = (phis[0] > 0) ? 1 : -1;
177 int iphi = (phis[0] > 0) ? phis[0] : -phis[0];
179 if (det == 1 && depthsp > depth) depth = depthsp;
180 if (det == 2 && depthsp < depth) depth = depthsp;
186 const int&
i)
const {
194 const bool& planOne)
const {
196 if (i == 0 && planOne) {
197 std::vector<int> phis;
200 int zside = (phis[0] > 0) ? 1 : -1;
201 int iphi = (phis[0] > 0) ? phis[0] : -phis[0];
203 if (depthsp > depth) depth = depthsp;
212 int hsubdet(0), ieta(0);
214 double heta = fabs(eta);
229 etaR = (eta >= 0. ? hR : -hR);
231 return std::pair<int,double>(hsubdet,etaR);
235 const double& hetaR) {
240 for (
int i =
nR-1;
i > 0;
i--)
241 if (hetaR < hpar->rTable[
i]) ieta =
hpar->
etaMin[2] +
nR - i - 1;
244 for (
int i = 0;
i <
nEta-1;
i++)
251 }
else if (det == static_cast<int>(
HcalEndcap)) {
260 int depth,
const int& lay) {
264 << det <<
":" << etaR <<
":" << phi <<
":" 265 << zside <<
":" << depth <<
":" << lay;
268 if ((det == static_cast<int>(
HcalEndcap)) && (etaR == 17) && (lay == 1))
271 }
else if (det == static_cast<int>(
HcalOuter)) {
275 depth =
layerGroup(det, etaR, phi, zside, lay-1);
276 if (etaR ==
hpar->
noff[0] && lay > 1) {
278 kphi = (kphi-1)%4 + 1;
279 if (kphi == 2 || kphi == 3)
280 depth =
layerGroup(det, etaR, phi, zside, lay-2);
282 }
else if (det == static_cast<int>(
HcalBarrel)) {
300 << etaR <<
":" <<
depth;
302 return std::pair<int,int>(etaR,
depth);
306 const double&
y,
const double&
z)
const {
309 double eta = fabs(etaR);
314 if (eta <= hpar->etaTable[10]) eta =
hpar->
etaTable[10]+0.001;
315 }
else if (zz >
hpar->
zHO[1]) {
316 if (eta <= hpar->etaTable[4]) eta =
hpar->
etaTable[4]+0.001;
319 eta = (z >= 0. ? eta : -
eta);
323 if (eta != etaR)
edm::LogInfo (
"HCalGeom") <<
"**** Check *****";
362 const int&
zside)
const {
371 const int&
depth)
const {
375 if (det == 1 || det == 2) {
391 const int&
depth)
const {
395 if (det == 1 || det ==2) {
396 layer =
depths[depth-1][eta-1];
412 const bool& partialDetOnly)
const {
415 if (partialDetOnly) {
419 }
else if (det == 1 || det == 2) {
428 }
else if (det == 3) {
430 }
else if (det == 4) {
440 const bool& partialDetOnly)
const {
443 if (partialDetOnly) {
447 }
else if (det == 3) {
449 }
else if (det == 4) {
456 unsigned int type = (det == 1) ? 0 : 1;
476 const int& ieta)
const {
478 double fioff(0), fibin(0);
493 return std::pair<double,double>(fioff,fibin);
496 std::vector<std::pair<int,double> >
499 std::vector<std::pair<int,double> > phis;
500 int ietaAbs = (ieta > 0) ? ieta : -ieta;
501 std::pair<double,double> ficons =
getPhiCons(subdet, ietaAbs);
502 int nphi =
int((CLHEP::twopi+0.1*ficons.second)/ficons.second);
504 for (
int ifi = 0; ifi < nphi; ++ifi) {
505 double phi =-ficons.first + (ifi+0.5)*ficons.second;
507 phis.emplace_back(std::pair<int,double>(iphi,phi));
510 edm::LogVerbatim(
"HcalGeom") <<
"getPhis: subdet|ieta|iphi " << subdet <<
"|" 511 << ieta <<
" with " << phis.size()
513 for (
unsigned int k=0;
k<phis.size(); ++
k)
515 <<
" phi " << phis[
k].second/CLHEP::deg;
524 edm::LogInfo (
"HCalGeom") <<
"HcalDDDSimConstants: " << cellTypes.size()
525 <<
" cells of type HCal Barrel\n";
526 for (
unsigned int i=0;
i<cellTypes.size();
i++)
527 edm::LogInfo (
"HCalGeom") <<
"Cell " <<
i <<
" " << cellTypes[
i] <<
"\n";
532 edm::LogInfo (
"HCalGeom") <<
"HcalDDDSimConstants: " << hoCells.size()
533 <<
" cells of type HCal Outer\n";
534 for (
unsigned int i=0;
i<hoCells.size();
i++)
535 edm::LogInfo (
"HCalGeom") <<
"Cell " <<
i <<
" " << hoCells[
i] <<
"\n";
537 cellTypes.insert(cellTypes.end(), hoCells.begin(), hoCells.end());
541 edm::LogInfo (
"HCalGeom") <<
"HcalDDDSimConstants: " << heCells.size()
542 <<
" cells of type HCal Endcap\n";
543 for (
unsigned int i=0;
i<heCells.size();
i++)
544 edm::LogInfo (
"HCalGeom") <<
"Cell " <<
i <<
" " << heCells[
i] <<
"\n";
546 cellTypes.insert(cellTypes.end(), heCells.begin(), heCells.end());
550 edm::LogInfo (
"HCalGeom") <<
"HcalDDDSimConstants: " << hfCells.size()
551 <<
" cells of type HCal Forward\n";
552 for (
unsigned int i=0;
i<hfCells.size();
i++)
553 edm::LogInfo (
"HCalGeom") <<
"Cell " <<
i <<
" " << hfCells[
i] <<
"\n";
555 cellTypes.insert(cellTypes.end(), hfCells.begin(), hfCells.end());
561 int ieta,
int depthl)
const {
563 std::vector<HcalCellType> cellTypes;
565 if (
dzVcal < 0)
return cellTypes;
568 int dmin, dmax, indx, nz;
578 dmin = 4; dmax = 4; indx = 0; nz =
nzHB;
584 if (depthl > 0) dmin = dmax = depthl;
585 int ietamin = (ieta>0) ? ieta :
hpar->
etaMin[indx];
586 int ietamax = (ieta>0) ? ieta :
hpar->
etaMax[indx];
587 int phi = (indx == 2) ? 3 : 1;
590 int subdet0 =
static_cast<int>(subdet);
598 for (
int eta=ietamin;
eta<=ietamax;
eta++) {
599 for (
int iz=0; iz<nz; ++iz) {
600 int zside = -2*iz + 1;
603 std::vector<std::pair<int,double> > phis =
getPhis(subdet0,
eta);
607 std::vector<int> phiMiss2;
614 for (
int miss=0; miss<
hpar->
noff[5+iz]; miss++) {
615 phiMiss2.emplace_back(
hpar->
noff[kk]);
629 temp2.
setPhi(phis,phiMiss2,fioff,dphi,unit);
630 cellTypes.emplace_back(temp2);
635 std::vector<int> phiMiss3;
636 for (
auto & phi : phis) {
639 if ((
eta*zside ==
l.ieta()) &&
640 (phi.first ==
l.iphi())) {
645 if (!ok) phiMiss3.emplace_back(phi.first);
650 temp3.
setPhi(phis,phiMiss2,fioff,dphi,unit);
651 cellTypes.emplace_back(temp3);
665 if ((eta ==
k.ieta()) && (iphi ==
k.iphi())) {
669 if (!ok) mxdepth = 2;
676 unsigned int num = 0;
678 for (
auto & cellType : cellTypes) {
679 num += (
unsigned int)(cellType.nPhiBins());
683 << cellTypes.size() <<
" " << num
684 <<
" for subdetector " << subdet;
692 if (units==2) iphi_skip = (phi-1)*2+1;
693 else if (units==4) iphi_skip = (phi-1)*4-1;
694 if (iphi_skip < 0) iphi_skip += 72;
700 std::vector<int> phis;
702 int kphi = (detsp > 0) ? phis[0] : 1;
703 int zside = (kphi > 0) ? 1 : -1;
704 int iphi = (kphi > 0) ? kphi : -kphi;
743 const double fiveDegInRad = 2*
M_PI/72;
744 int units =
int(dphi/fiveDegInRad+0.5);
745 if (units < 1) units = 1;
771 <<
" zVcal " <<
zVcal <<
" and dzVcal " 778 for (
int i=0;
i<nEta-1; ++
i) {
780 int laymax = (imx > 0) ?
layerGroup(
i, imx-1 ) : 0;
781 if (i < hpar->
etaMax[0]) {
782 int laymax0 = (imx > 16) ?
layerGroup(
i, 16) : laymax;
783 if (
i+1 ==
hpar->
etaMax[0] && laymax0 > 2) laymax0 = 2;
786 if (
i >=
hpar->
etaMin[1]-1 && i < hpar->etaMax[1]) {
791 for (
int i=0;
i<4; ++
i)
798 for (
int i=0;
i<maxdepth; ++
i) {
799 for (
int k=0;
k<nEta-1; ++
k) {
802 for (
int l=layermx-1;
l >= 0; --
l) {
812 <<
depths[
i].size() <<
" etas:";
813 for (
int k=0;
k<nEta-1; ++
k)
825 <<
nmodHE <<
" endcap half-sectors";
844 for (
int i=0;
i<4; ++
i)
846 for (
unsigned int i=0;
i<
hpar->
zHO.size(); ++
i)
851 int noffl(noffsize+5);
852 if ((
int)(
hpar->
noff.size()) > (noffsize+3)) {
857 if ((
int)(
hpar->
noff.size()) > (noffsize+4)) {
858 noffl += (2*
hpar->
noff[noffsize+4]);
869 << noffsize <<
":" << noffl <<
":" <<
isBH_;
872 <<
"; max depth for itea = 29 : (" 876 if ((
int)(
hpar->
noff.size()) > (noffsize+4)) {
879 for (
int k=0;
k<npair; ++
k) {
886 <<
" detector channels having 2 QIE cards:";
896 int noffk(noffsize+5);
897 if ((
int)(
hpar->
noff.size()) > (noffsize+5)) {
898 noffk += (2*
hpar->
noff[noffsize+4]);
899 if ((
int)(
hpar->
noff.size()) >= noffk+7) {
905 double wt = 0.1*(
hpar->
noff[noffk+6]);
906 if ((
int)(
hpar->
noff.size()) >= (noffk+7+nphi+3*ndeps)) {
907 if (dtype == 1 || dtype == 2) {
908 std::vector<int> ifi, iet, ily, idp;
909 for (
int i=0;
i<nphi; ++
i) ifi.emplace_back(
hpar->
noff[noffk+7+
i]);
910 for (
int i=0;
i<ndeps;++
i) {
911 iet.emplace_back(
hpar->
noff[noffk+7+nphi+3*
i]);
912 ily.emplace_back(
hpar->
noff[noffk+7+nphi+3*
i+1]);
913 idp.emplace_back(
hpar->
noff[noffk+7+nphi+3*
i+2]);
917 <<
"Detector " << dtype <<
" etaMax " 919 << nphi <<
" sectors";
920 for (
int i=0;
i<nphi; ++
i)
923 for (
int i=0;
i<ndeps;++
i)
925 << ily[
i] <<
" " << idp[
i];
927 << depthEta29[0] <<
":" << ndp16 <<
":" 928 << ndp29 <<
" L0 Wt " 933 int zside = (ifi[0]>0) ? 1 : -1;
934 int iphi = (ifi[0]>0) ? ifi[0] : -ifi[0];
938 int noffm = (noffk+7+nphi+3*ndeps);
939 if ((
int)(
hpar->
noff.size()) > noffm) {
941 if (ndnext > 4 && (
int)(
hpar->
noff.size()) >= noffm+ndnext) {
945 if (ndnext > 11 && (
int)(
hpar->
noff.size()) >= noffm+ndnext) {
955 <<
" and for HE: " <<
layFHE[0] <<
":" 959 <<
" and for HE: " <<
layBHE[0] <<
":" 973 edm::LogVerbatim(
"HcalGeom") <<
"Detector type and maximum depth for all RBX " 981 const int&
depth)
const {
986 if (ir > 0 && ir <
nR) {
988 if (depth%2 != 1) z +=
dlShort;
992 if (etaR > 0 && etaR <
nEta) {
995 }
else if (det == static_cast<int>(
HcalOuter)) {
998 }
else if (etaR ==
hpar->
noff[2]+1) {
1000 }
else if (etaR ==
hpar->
noff[3]) {
1002 }
else if (etaR ==
hpar->
noff[3]+1) {
1014 <<
" " << depth <<
" ==> " <<
tmp;
1025 if (ir > 0 && ir <
nR) {
1027 if (depth%2 != 1) z +=
dlShort;
1031 if (etaR > 0 && etaR <
nEta) {
1034 }
else if (det == static_cast<int>(
HcalOuter)) {
1037 }
else if (etaR ==
hpar->
noff[2]+1) {
1039 }
else if (etaR ==
hpar->
noff[3]) {
1041 }
else if (etaR ==
hpar->
noff[3]+1) {
1051 if (zside == 0) tmp = -
tmp;
1053 edm::LogVerbatim(
"HcalGeom") <<
"HcalDDDSimConstants::getEta " << etaR <<
" " 1054 << zside <<
" " << depth <<
" ==> " <<
tmp;
1062 if (z != 0) tmp = -
log(
tan(0.5*atan(r/z)));
1065 << z <<
" ==> " <<
tmp;
1071 const int&
depth)
const {
1092 const int&
depth)
const {
1114 edm::LogVerbatim(
"HcalGeom") <<
"HcalDDDSimConstants::printTileHB for eta " 1115 << eta <<
" and depth " <<
depth;
1118 double thetaL = 2.*atan(
exp(-etaL));
1120 double thetaH = 2.*atan(
exp(-etaH));
1123 edm::LogVerbatim(
"HcalGeom") <<
"\ntileHB:: eta|depth " << zside*eta <<
"|" 1124 << depth <<
" theta " << thetaH/CLHEP::deg
1125 <<
":" << thetaL/CLHEP::deg <<
" Layer " 1126 << layL <<
":" << layH-1;
1127 for (
int lay=layL; lay<layH; ++lay) {
1128 std::vector<double>
area(2,0);
1146 << std::setw(8) << area[0] <<
" " 1147 << std::setw(8) << area[1] <<
" Mean " 1157 double thetaL = 2.*atan(
exp(-etaL));
1159 double thetaH = 2.*atan(
exp(-etaH));
1164 if (phib > 6*CLHEP::deg) nphi = 1;
1165 edm::LogVerbatim(
"HcalGeom") <<
"\ntileHE:: Eta/depth " << zside*eta <<
"|" 1166 << depth <<
" theta " << thetaH/CLHEP::deg
1167 <<
":" << thetaL/CLHEP::deg <<
" Layer " 1168 << layL <<
":" << layH-1 <<
" phi " << nphi;
1169 for (
int lay=layL; lay<layH; ++lay) {
1170 std::vector<double>
area(4,0);
1177 if ((lay != 0 || eta == 18) &&
1186 double ar1=0, ar2=0;
1188 ar1 = 0.5*(rmax-rmin)*(dx1+dx2-4.*
hpar->
dx1HE[
k]);
1191 ar1 = 0.5*(rmax-rmin)*(dx1+dx2-2.*
hpar->
dx1HE[
k]);
1192 ar2 = 0.5*(rmax-rmin)*((rmax+rmin)*
tan(10.*CLHEP::deg)-4*
hpar->
dx1HE[
k])-ar1;
1201 if (area[0] > 0 && area[1] > 0) {
1203 if (eta == 18) lay0++;
1207 << std::setw(8) << area[0] <<
" " 1208 << std::setw(8) << area[1] <<
" Mean " 1213 << std::setw(8) << area[0] <<
" " 1214 << std::setw(8) << area[1] <<
":" 1215 << std::setw(8) << area[2] <<
" " 1216 << std::setw(8) << area[3] <<
" Mean " 1226 if (it.layer == (
unsigned int)(eta + 1)) {
1227 return it.layerGroup.size();
1229 if (it.layer > (
unsigned int)(eta + 1))
break;
1230 k = it.layerGroup.size();
1238 if (it.layer == (
unsigned int)(eta + 1)) {
1239 return it.layerGroup.at(i);
1241 if (it.layer > (
unsigned int)(eta + 1))
break;
1242 k = it.layerGroup.at(i);
1251 int depth0 =
findDepth(det,eta,phi,zside,lay);
1252 unsigned int depth = (depth0 > 0) ? (
unsigned int)(depth0) :
layerGroup(eta-1,lay);
std::vector< double > zHO
std::vector< double > etaTable
unsigned int layerGroupSize(int eta) const
int findDepth(const int &det, const int &eta, const int &phi, const int &zside, const int &lay) const
unsigned int layerGroup(int eta, int i) const
void initialize(const int subdet, const int ietaMax, const int dep16C, const int dep29C, const double wtl0C, std::vector< int > const &iphi, std::vector< int > const &ieta, std::vector< int > const &layer, std::vector< int > const &depth)
std::vector< int > maxDepth
std::vector< double > rHB
int getFrontLayer(const int &det, const int &eta) const
std::vector< double > rhoxHB
Sin< T >::type sin(const T &t)
static const int maxLayer_
std::vector< double > HBGains
int getLayerFront(const int &det, const int &eta, const int &phi, const int &zside, const int &depth) const
int getMinDepth(const int &det, const int &eta, const int &phi, const int &zside, const bool &partialOnly) const
bool isValid(const int det, const int phi, const int zside) const
Geom::Theta< T > theta() const
std::vector< int > HEShift
int phiNumber(const int &phi, const int &unit) const
void printTileHB(const int &eta, const int &phi, const int &zside, const int &depth) const
HcalDDDSimConstants(const HcalParameters *hp)
HcalCellType::HcalCell cell(const int &det, const int &zside, const int &depth, const int &etaR, const int &iphi) const
double getEtaHO(const double &etaR, const double &x, const double &y, const double &z) const
int getShift(const HcalSubdetector &subdet, const int &depth) const
int getLayerBack(const int subdet, const int ieta, const int iphi, const int zside, const int depth) const
std::vector< int > etaMax
std::vector< int > depths[nDepthMax]
int getLayerFront(const int subdet, const int ieta, const int iphi, const int zside, const int depth) const
std::vector< double > rhoxHE
std::pair< int, int > getDepths(const int eta) const
std::vector< std::pair< double, double > > getConstHBHE(const int &type) const
std::vector< double > zxHE
int validDet(std::vector< int > &phis) const
std::vector< double > zHE
std::vector< LayerItem > layerGroupEtaSim
std::vector< double > dyHE
int getMaxDepth(const int &type) const
void setPhi(const std::vector< std::pair< int, double >> &phis, const std::vector< int > &iphiMiss, double foff, double dphi, int unit)
int getDepthEta29(const int &phi, const int &zside, const int &i) const
int unitPhi(const int &det, const int &etaR) const
std::vector< double > dx1HE
std::vector< double > rHO
std::pair< int, int > depthMaxDf_
unsigned int findLayer(const int &layer, const std::vector< HcalParameters::LayerItem > &layerGroup) const
std::vector< double > dzHE
Cos< T >::type cos(const T &t)
Tan< T >::type tan(const T &t)
Abs< T >::type abs(const T &t)
std::vector< HcalCellType > HcalCellTypes() const
int getLayerMax(const int &eta, const int &depth) const
std::vector< HcalDetId > idHF2QIE
std::pair< int, int > getEtaDepth(const int &det, int etaR, const int &phi, const int &zside, int depth, const int &lay)
int getLastLayer(const int &det, const int &eta) const
std::vector< int > HFShift
int getMaxDepthLastHE(const int subdet, const int iphi, const int zside) const
int getDepth(const int subdet, const int ieta, const int iphi, const int zside, const int layer) const
unsigned int numberOfCells(const HcalSubdetector &) const
double getLayer0Wt(const int &det, const int &phi, const int &zside) const
int getDepthEta16M(const int &det) const
int getDepthEta29M(const int &i, const bool &planOne) const
std::vector< double > HEGains
double getLayer0Wt(const int subdet, const int iphi, const int zside) const
std::vector< double > dyHB
std::vector< double > phioff
int getDepth16(const int subdet, const int iphi, const int zside) const
std::pair< int, double > getDetEta(const double &eta, const int &depth)
std::vector< double > gparHF
std::pair< int, int > getModHalfHBHE(const int &type) const
int getLayerBack(const int &det, const int &eta, const int &phi, const int &zside, const int &depth) const
std::vector< double > Layer0Wt
std::vector< double > dxHB
double deltaEta(const int &det, const int &eta, const int &depth) const
std::vector< std::vector< double > > tmp
std::vector< double > rTable
std::vector< double > phitable
TString units(TString variable, Char_t axis)
std::vector< double > phibin
std::vector< double > drHB
std::vector< double > HFGains
int getEta(const int &det, const int &lay, const double &hetaR)
static unsigned int const shift
std::pair< int, int > depthMaxSp_
std::vector< int > HBShift
const HcalParameters * hpar
std::vector< int > maxDepth
int maxHFDepth(const int &ieta, const int &iphi) const
void printTileHE(const int &eta, const int &phi, const int &zside, const int &depth) const
std::pair< double, double > getPhiCons(const int &det, const int &ieta) const
static const int maxLayerHB_
double getGain(const HcalSubdetector &subdet, const int &depth) const
std::vector< std::pair< int, double > > getPhis(const int &subdet, const int &ieta) const
int getDepthMax(const int subdet, const int iphi, const int zside) const
std::vector< int > etaMin
int getDepthEta16(const int &det, const int &phi, const int &zside) const