144{
146
147
150
151 IdContext module_context =
m_tile_id->module_context();
152 IdContext cell_context =
m_tile_id->cell_context();
153
156
157 int n_regions = 0;
158 int n_modules = 0;
159 int n_cells = 0;
160
161
163
165
167 Identifier reg_id =
descr->identify();
168
171
172 double zshift =
descr->zshift();
173 bool doZshift = (zshift != 0.0);
174
175 int etasign =
descr->sign_eta();
176 if (side != etasign) {
177 ATH_MSG_ERROR(
"side and eta sign in TileDetDescriptor[" << n_regions
178 << "] do not match" );
179 }
180 ++n_regions;
181
183 << ", " << zshift << ", " << doZshift
184 << ", " << etasign << ", " << n_regions );
185
186 int nsamp =
descr->n_samp();
187
188 int nphi =
descr->n_phi();
189 double dphi =
descr->dphi();
190 double phi_min =
descr->phi_min();
191 double phi_max =
descr->phi_max();
192
193
194 CaloDetDescriptor* caloDescr;
195
196 int calo_sample0;
198 calo_sample0 = (
int)CaloCell_ID::TileBar0;
199 else if (
m_tile_id->is_tile_extbarrel(reg_id))
200 calo_sample0 = (
int)CaloCell_ID::TileExt0;
201 else if (
m_tile_id->is_tile_gap(reg_id))
202 calo_sample0 = (
int)CaloCell_ID::TileGap1 - 1;
203 else
204 calo_sample0 = CaloCell_ID::Unknown;
205 std::vector<double> depth_in(1);
206 std::vector<double> depth_out(1);
207
210
211 int neta =
descr->n_eta(isamp);
212
213 if (neta>0) {
214 int neta =
descr->n_eta(isamp);
215 double deta =
descr->deta(isamp);
216 double emin =
descr->eta_min(isamp);
217 double emax =
descr->eta_max(isamp);
218 double rmin =
descr->rcenter(isamp)-
descr->dr(isamp)/2;
219 double rmax =
descr->rcenter(isamp)+
descr->dr(isamp)/2;
222 depth_in[0] = rmin;
223 depth_out[0] = rmax;
224
225 if ((zmax+zmin)/2. < 0) {
229 }
230
232
233 caloDescr =
new CaloDetDescriptor(reg_id,
static_cast<const AtlasDetectorID *
>(
m_tile_id),
m_cell_id,sample,isamp);
234
235
244
245
251 }
252 }
253
254
255 if (gap) {
256 double emin = 1.e+10;
257 double emax =-1.e+10;
258 double rmin = 1.e+10;
259 double rmax =-1.e+10;
260 double zmin = 1.e+10;
261 double zmax =-1.e+10;
262
264
265 int neta =
descr->n_eta(isamp);
266
267 if (neta>0) {
268 emin = std::min(emin,(
double)
descr->eta_min(isamp));
269 emax = std::max(emax,(
double)
descr->eta_max(isamp));
270 rmin = std::min(rmin,(
double)(
descr->rcenter(isamp)-
descr->dr(isamp)/2));
271 rmax = std::max(rmax,(
double)(
descr->rcenter(isamp)+
descr->dr(isamp)/2));
272 zmin = std::min(zmin,(
double)(
descr->zcenter(isamp)-
descr->dz(isamp)/2));
273 zmax = std::max(zmax,(
double)(
descr->zcenter(isamp)+
descr->dz(isamp)/2));
274 }
275 }
276
277 if ((zmax+zmin)/2. < 0) {
281 }
282
283 double deta = 0.1;
284 int neta = (emax>1.65) ? 7 : 6;
288
290
291
300
301
307 }
308
309
310 double emin = 99999.0;
311 double emax =-99999.0;
312 double rmin = 99999.0;
313 double rmax =-99999.0;
314 std::vector<double> delr;
315
316 for (int isamp=0; isamp<nsamp; ++isamp) {
317 delr.push_back(
descr->dr(isamp));
318 emin = std::min(emin,(
double)
descr->eta_min(isamp));
319 emax = std::max(emax,(
double)
descr->eta_max(isamp));
320 rmin = std::min(rmin,(
double)(
descr->rcenter(isamp)-
descr->dr(isamp)/2));
321 rmax = std::max(rmax,(
double)(
descr->rcenter(isamp)+
descr->dr(isamp)/2));
322 }
323 if (emin < 0.0 ) emin = 0.0;
324 if (etasign < 0) {
325 double etmp = emax;
326 emax = -emin;
327 emin = -etmp;
328 }
329
330
331 double phi =
descr->phi_min() + dphi/2.;
332
333 for (int iphi=0; iphi<nphi; ++iphi) {
334
336
337
338 int volumeIndex = 0;
339
340
341 CaloDetDescriptor* modDescr;
342
343 try {
345 IdentifierHash idhash;
346 m_tile_id->get_hash(
id,idhash,&module_context);
347 modDescr =
new CaloDetDescriptor(
id,
static_cast<const AtlasDetectorID *
>(
m_tile_id),
m_cell_id);
348
349
358
359
360
364 ++n_modules;
365 } catch ( const TileID_Exception& ) {
368 << side << ","
369 << module << ")" );
370 continue;
371 }
372
373 for (int isamp=0; isamp<nsamp; ++isamp) {
374
375 int neta =
descr->n_eta(isamp);
376
377 if (neta>0) {
378
380 double rcenter =
descr->rcenter(isamp);
382
383 double deta =
descr->deta(isamp);
384 double eta =
descr->eta_min(isamp) + deta/2.;
385
386 for (int ieta=0; ieta<neta; ++ieta) {
387
389
390 try {
391 Identifier
id =
m_tile_id->cell_id(
section,side,module,tower,sample,checks);
392 IdentifierHash idhash;
393 m_tile_id->get_hash(
id,idhash,&cell_context);
394
395 TileDetectorElement* elt = new TileDetectorElement(
397
399
400
402
403 if (doZshift) {
404
407
408 if (0 == iphi) {
410 <<side<<
"/"<<
section<<
"/"<<module<<
"/"<<tower<<
"/"<<sample
411 << " rcen = "<<rcenter
412 << " dr = "<<dr
414 << " eta1 = " << eta1
415 << " eta2 = " << eta2
416 << " eta' = " << (eta1+eta2)/2.
417 << " deta = " << (eta2-eta1)
418 << " iphi = " << iphi
419 << " dphi = " << dphi );
420 }
421
423
424
425
426
430
431 } else {
432
433 if (0 == iphi) {
435 <<side<<
"/"<<
section<<
"/"<<module<<
"/"<<tower<<
"/"<<sample
436 << " rcen = "<<rcenter
437 << " dr = "<<dr
439 << " deta = " << deta
440 << " iphi = " << iphi
441 << " dphi = " << dphi );
442 }
443
445
449 }
450
451
453 ++volumeIndex;
460
461
462 if (cell_dim) {
463
464 double oldz = elt->
z();
465 double olddz = elt->
dz();
467 double z1=0,z2=0;
468 if (side < 0) {
470 for ( ;
ic>=0; --
ic) {
472 if (0 == iphi)
474 if (fabs(z2-cell_dim->
getZMax(ic))>0.1)
break;
475 }
476 } else {
478 for ( ;
ic>=0; --
ic) {
480 if (0 == iphi)
482 if (fabs(z2-cell_dim->
getZMin(ic))>0.1)
break;
483 }
484 }
485
486 if (ic<0) {
487 ATH_MSG_WARNING(
"TileDetDescrManager -- ic < 0! Expect crashes or misbehavior! ==> This should be checked, because 'ic' should be related to the numbers of rows!! Note: 'ic' gets < 0 when z2-cell_dim is too small and does not make the above loop break; that can be caused, for example, if 'barrelPeriodThickness' and 'extendedPeriodThickness' are not set (or set to the default 0. value) and, as a result, ZMax is not properly set." );
488 }
489
490 double z = (z1+z2)/2.;
491
492
493
494
495
496
497 if (std::abs(
z) < 1e-8 * Gaudi::Units::mm) {
498 if (0 == iphi)
501 }
502
503 double dz = 0.5 * fabs(cell_dim->
getZMax(0)
507
509 if (
msgLvl (MSG::VERBOSE) && 0 == iphi) {
515 <<
"new z/dz: " <<
z <<
" " << dz <<
" ( B: " << z1 <<
" " << dz1 <<
" C: " << z2 <<
" " << dz2 <<
" ) "
516 <<
z/oldz*100-100 <<
" % diff "
517 <<"do not change z/dz for BC cells in barrel" );
518 }
520
523 if (0 == iphi) {
525 <<
"new z/dz: " << elt->
z() <<
" " << elt->
dz() <<
" "
526 << elt->
z()/oldz*100-100 <<
" % diff "
527 <<"use z/dz from descriptor for E cells" );
528 }
529
530 } else {
531
534 if (0 == iphi) {
536 <<
"new z/dz: " << elt->
z() <<
" " << elt->
dz() <<
" "
537 << elt->
z()/(oldz+1.e-10)*100-100 <<
" % diff" );
538 }
539 }
540
541
542 double oldr = elt->
r();
543 double olddr = elt->
dr();
546
547
548 elt->
set_r((r1+r2)/2.);
550 if (0 == iphi) {
552 <<
"new r/dr: " << elt->
r() <<
" " << elt->
dr() <<
" "
553 << elt->
r()/(oldr+1.e-10)*100-100 <<
" % diff" );
554 }
555
556 double oldv=elt->
volume();
559
560
561
562 int ModuleNcp = module + 1;
563
564 if ( (
section ==
TileID::EXTBAR ) && (
TileID::SAMP_A == sample ) && ((ModuleNcp>=35 && ModuleNcp<=37) || (ModuleNcp>=60 && ModuleNcp<=62)) && ( (tower == 11) || (tower == 12) || (tower == 15) ) )
565 {
566 double oldv=elt->
volume();
567
568 if (
msgLvl (MSG::VERBOSE)) {
570 <<"old volume: " << oldv << std::endl
571 << " iphi = " << iphi
572 <<
" phi = " << (module + 0.5)*dphi <<
" phi2 = "<<elt->
phi()
573 << std::endl
574 << " Mod# = " << ModuleNcp <<" module = "<<module<<" tower = "<<tower
575 << std::endl
576 <<"sample = "<<sample
580 <<" ---------------------" );
582 }
583
584 double Radius2HL =
tan (
M_PI / 64. );
585
587 double epThickness = 0.0;
588 double epVolume = 0.0;
589 if ( tower == 15 ) epThickness =
m_dbManager->TILBdzend2() * Gaudi::Units::cm;
590
591 double volumeInRow[5];
592 for (int iRow = 0; iRow < 5; iRow++) volumeInRow[iRow] = 0.;
593
594
595 for (
unsigned int iRow = 0; iRow < cell_dim->
getNRows(); iRow++)
596 {
598 double oldrv = rowVolume;
599
600 ATH_MSG_VERBOSE(
" *** rowVolume = "<<rowVolume<<
" volumeInRow = "<< volumeInRow[iRow] );
601
603 double radMax = cell_dim->
getRMax(iRow), radMin = cell_dim->
getRMin(iRow);
605
606 ATH_MSG_VERBOSE(
"deltaz = "<<deltaZ<<
" rmax = "<<radMax<<
" rmin = "<<radMin<<
" rowVolume = "<<rowVolume<<
" oldrv = "<<oldrv<<
" irow = "<<iRow<<
" tower = "<<tower );
607
608 if ( 15 == tower )
609 {
611 {
612 epVolume = ( rowVolume/
deltaZ ) * epThickness;
613 rowVolume -= epVolume;
615
616 ATH_MSG_VERBOSE(
" \t\t epV = "<<epVolume<<
" epT = "<<epThickness <<
" diff = "<<(volumeInRow[iRow] - oldrv)/oldrv*100. );
617 }
618
619 volumeInRow[iRow] += (rowVolume * (32./48) );
621 rowVolume *= 16./48.;
622 ATH_MSG_VERBOSE(
" *** 15 rowVolume = "<<rowVolume<<
" volumeInRow = "<< volumeInRow[iRow] <<
" diff = "<<(volumeInRow[iRow] - oldrv)/oldrv*100. );
623 }
624 else if ( 12 == tower )
625 {
626 volumeInRow[iRow] += (rowVolume * (2./25) );
628 rowVolume *= 23./25.;
629 ATH_MSG_VERBOSE(
" *** 12 rowVolume = "<<rowVolume<<
" volumeInRow = "<< volumeInRow[iRow] <<
" % = "<<(volumeInRow[iRow] - oldrv)/oldrv*100. );
630 }
631
632 ATH_MSG_VERBOSE(
"deltaz = "<<deltaZ<<
" rmax = "<<radMax<<
" rmin = "<<radMin<<
" changed dz ?"<<(volumeInRow[iRow] - oldrv)/oldrv*100. );
633
634 if ( (ModuleNcp == 61) || (ModuleNcp == 36) )
635 {
636 if ( iRow == 0 )
637 rowVolume = 0.;
638 else if ( iRow == 1 )
639 {
640 if (15 != tower)
641 {
642 rowVolume = 2.*radMax + radMin;
643 rowVolume *= 0.5*(radMax - radMin);
644 rowVolume *= Radius2HL *
deltaZ;
645 }
646 else
647 {
648 rowVolume += epVolume;
649 }
650 }
651 else if (15 == tower) rowVolume += epVolume;
652
653 volumeInRow[iRow] += rowVolume;
654
655 ATH_MSG_VERBOSE(
" *** rowVolume = "<<rowVolume<<
" volumeInRow = "<< volumeInRow[iRow] <<
" % = "<<(volumeInRow[iRow] - oldrv)/oldrv*100. );
656 }
657
658 if ( (ModuleNcp == 62) || (ModuleNcp == 35) )
659 {
660 if ( iRow == 0 )
661 {
662 if (15 == tower)
663 {
664 rowVolume = radMax + radMin;
665 rowVolume *= (radMax - radMin);
666 rowVolume -= 0.5*radMin*(27*Gaudi::Units::mm);
667 rowVolume *= Radius2HL * (
deltaZ + epThickness );
668 }
669 else
670 {
671 rowVolume = radMax - radMin - 35*Gaudi::Units::mm;
672 rowVolume *= (radMax + radMin);
673 rowVolume *= Radius2HL *
deltaZ;
674 }
675 }
676 else if (15 == tower) rowVolume += epVolume;
677
678 volumeInRow[iRow] += rowVolume;
679 ATH_MSG_VERBOSE(
" *** rowVolume = "<<rowVolume<<
" volumeInRow = "<< volumeInRow[iRow] <<
" % = "<<(volumeInRow[iRow] - oldrv)/oldrv*100. );
680 }
681
682 if ( (ModuleNcp == 60) || (ModuleNcp == 37) )
683 {
684 double deltax = 38.7*std::cos(25.3125*Gaudi::Units::deg);
685 double pstan = std::tan(25.3125*Gaudi::Units::deg);
686 double inv_pstan = 1. / pstan;
687 if ( ( 15 == tower ) )
688 {
689 if ( iRow < 2 )
690 rowVolume = 0;
691 else
692 rowVolume += epVolume;
693 }
694 else if ( iRow == 0 )
695 {
696 rowVolume = (radMax + radMin) * Radius2HL ;
697
698 rowVolume += 2.*deltax + (radMax - radMin)* pstan ;
699
700
701
702 rowVolume *= 0.5 * (radMax - radMin) * deltaZ;
703
704
705 }
706 else if ( iRow == 1 )
707 {
708 double radMin0 = cell_dim->
getRMin(0);
709 rowVolume = (radMax + radMin) * Radius2HL;
710 rowVolume += 2.*deltax + (radMax + radMin - 2.*radMin0 )* pstan ;
711 rowVolume *= 0.5 * (radMax - radMin) ;
712 rowVolume -= 0.5 * std::pow( deltax + (radMax - radMin0) * pstan - radMax * Radius2HL, 2) * inv_pstan;
714 }
715
716 volumeInRow[iRow] += rowVolume;
717 ATH_MSG_VERBOSE(
" *** rowVolume = "<<rowVolume<<
" volumeInRow = "<< volumeInRow[iRow] <<
" % = "<<(volumeInRow[iRow] - oldrv)/oldrv*100. );
718 }
719
720 ATH_MSG_VERBOSE(
" *** rowVolume = "<<rowVolume<<
" volumeInRow = "<< volumeInRow[iRow] <<
" % = "<<(volumeInRow[iRow] - oldrv)/oldrv*100. );
721 }
722
723
724 double totalVolume = 0;
725 for (
unsigned int iRow = 0; iRow < cell_dim->
getNRows(); iRow++) totalVolume += volumeInRow[iRow];
727
729 << elt->
volume() <<
" cell_dim xCheck ( "
731 << elt->
volume()/oldv*100-100 <<
" % diff" );
732
733
735 }
736
737
738
740 {
741 if (side == -1)
m_dbManager->SetCurrentEnvByType(4);
742 if (side == 1)
m_dbManager->SetCurrentEnvByType(5);
743
748
749 double standardD4dz = elt->
dz();
750 double specialD4dz =
m_dbManager->TILBdzmodul()*Gaudi::Units::cm;
752
753
754
756 elt->
set_z(elt->
z()+0.5*(standardD4dz-specialD4dz));
757 else
758 elt->
set_z(elt->
z()-0.5*(standardD4dz-specialD4dz));
760 elt->
set_volume(newv * specialD4dz/(standardD4dz));
761
762 if (Id4 > 3) {
763 ATH_MSG_VERBOSE(
"spD4 old z/dz: " << oldz <<
" " << standardD4dz << std::endl
764 <<
"spD4 new z/dz: " << elt->
z() <<
" " << elt->
dz() <<
" "
765 << elt->
z()/(oldz+1.e-10)*100-100 <<
" % diff" );
766
768 <<
"spD4 new volume: " << elt->
volume() <<
" "
769 << elt->
volume()/oldv*100-100 <<
" % diff"
770 << " iphi = " << iphi
771 <<
" dphi = " << dphi <<
" phi = " << (module + 0.5)*dphi -
M_PI <<
" phi2 = "<<elt->
phi() );
772 }
773 }
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
819 {
820
821 if (side == -1)
m_dbManager->SetCurrentEnvByType(4);
822 if (side == 1)
m_dbManager->SetCurrentEnvByType(5);
827
828 if ( Id4 == 8 )
829 {
831 double standardD5dz = elt->
dz();
832 double specialD4dz =
m_dbManager->TILBdzmodul()*Gaudi::Units::cm;
833 double specialD4Rin =
m_dbManager->TILBrmin()*Gaudi::Units::cm;
835 specialD4Rin -=
m_dbManager->TILBdrfront()*Gaudi::Units::cm;
836 } else {
837 specialD4dz -=
m_dbManager->TILBdzend1()*Gaudi::Units::cm;
838 }
839 double newS = (
pow((elt->
r() + elt->
dr()/2.),2) - specialD4Rin*specialD4Rin)/(2.*elt->
r()*elt->
dr());
841
842
843
844
845
846
847
848
849 ATH_MSG_VERBOSE(
"D5 old z/dz: " << oldz <<
" " << standardD5dz <<
" spD4 dz: " << specialD4dz );
852 <<
"D5+D4 new volume: " << elt->
volume() <<
" "
853 << elt->
volume()/oldv*100-100 <<
" % diff"
854 << " iphi = " << iphi
855 <<
" dphi = " << dphi <<
" Id4 = "<< Id4 <<
" modType = "<<
m_dbManager->GetModType()
856 <<
" phi = " << (module + 0.5)*dphi -
M_PI<<
" phi2 = "<<elt->
phi() );
858 << " sample = " << sample
860 << " tower = " << tower );
861 }
862 }
863
864 if (0 == iphi) {
866 <<
"new volume: " << elt->
volume() <<
" "
867 << elt->
volume()/oldv*100-100 <<
" % diff"
868 << " iphi = " << iphi
869 << " dphi = " << dphi );
870 }
871 }
872
874 ++n_cells;
875 } catch ( const TileID_Exception& ) {
877 <<
section <<
"," << side <<
"," << module <<
","
878 << tower << "," << sample << ")" );
879 }
881 }
882 }
883 }
885 }
886 }
887
889 << n_modules << " half-modules were created for "
890 << n_regions << " Tile Regions" );
891}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_MSG_WARNING(x)
constexpr int pow(int base, int exp) noexcept
bool msgLvl(const MSG::Level lvl) const
Test the output level.
CaloSampling::CaloSample CaloSample
void set_volume(double volume)
set cell volume
float phi() const
cell phi
float volume() const
cell volume
void set_depth_out(std::vector< double > &calo_depth)
set vector of out depths
void setCaloRMin(double r_min)
Set R Min.
void set_eta_phi_granularity(int neta, double deta, int nphi, double dphi)
Set Phi granularity.
void setCaloZMax(double z_max)
Set Z Max.
void set_n_calo_depth(int n_calo_depth)
set number of calo depths
void setCaloZMin(double z_min)
Set Z Min.
void setCaloPhiMin(double phi_min)
Set Phi Min.
void setCaloPhiMax(double phi_max)
Set Phi Max.
void setCaloRMax(double r_max)
Set R Max.
void set_depth_in(std::vector< double > &calo_depth)
set vector of in depths
void setCaloEtaMin(double eta_min)
Set Eta Min.
void setCaloEtaMax(double eta_max)
Set Eta Max.
double getZMax(unsigned int index) const
unsigned int getNRows() const
double getRMax(unsigned int index) const
double getZMin(unsigned int index) const
double computeRowVolume(int iRow)
double getRMin(unsigned int index) const
void add_calodescr(CaloDetDescriptor *descriptor)
double shiftEta(double eta, double Rcen, double zshift)
tile_descr_const_iterator tile_descriptors_begin() const
tile_descr_const_iterator tile_descriptors_end() const
void add_module(IdentifierHash idhash, CaloDetDescriptor *module)
void add_cell(CaloDetDescrElement *cell)
static const double vBarrelCells[23]
static const double vItcGapCells[6]
static const double vExtendedCells[12]
TileCellDim * get_cell_dim(const Identifier &cell_id) const
void set_r(double r)
set r
void set_cylindric(double eta, double phi, double r)
set cylindric coordinates
void set_dz(double dz)
set cartezian size dz
void set_z(double z)
set z
void set_dr(double dr)
set cylindric size dr
void set_dphi(double dphi)
set cylindric size dphi
void set_cylindric_raw(double eta_raw, double phi_raw, double r_raw)
set raw cylindric coordinates
void set_deta(double deta)
set cylindric size deta
gap(flags, cells_name, *args, **kw)
setEt setPhi setE277 setWeta2 eta1