39 #include "TProfile2D.h"
46 ISvcLocator* pSvcLocator)
48 m_outputFile(nullptr),
49 m_clusterCollName(
"CaloTopoClusters"),
50 m_useInversionMethod(true),
51 m_NormalizationType(
"Lin"),
52 m_NormalizationTypeNumber(0),
53 m_ClassificationType(
"None"),
54 m_ClassificationTypeNumber(0)
57 std::vector<Gaudi::Histo1DDef> dims(7);
58 dims[1] = Gaudi::Histo1DDef(
"side",-1.5,1.5,1);
59 dims[2] = Gaudi::Histo1DDef(
"|eta|",0.,1.6,16);
60 dims[3] = Gaudi::Histo1DDef(
"phi",-
M_PI,
M_PI,1);
61 dims[4] = Gaudi::Histo1DDef(
"log10(E_clus (MeV))",log10(200),log10(1e6),14);
62 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-4.6,1.1,14);
63 dims[6] = Gaudi::Histo1DDef(
"weight",-2,3,1);
65 dims[0] = Gaudi::Histo1DDef(
"EMB1",0.5,1.5,1);
67 dims[0] = Gaudi::Histo1DDef(
"EMB2",1.5,2.5,1);
68 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-4.8,0.5,14);
70 dims[0] = Gaudi::Histo1DDef(
"EMB3",2.5,3.5,1);
71 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-4.9,0.6,14);
73 dims[0] = Gaudi::Histo1DDef(
"EME1",4.5,5.5,1);
74 dims[2] = Gaudi::Histo1DDef(
"|eta|",1.2,3.2,20);
75 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-4.5,1.7,14);
77 dims[0] = Gaudi::Histo1DDef(
"EME2",5.5,6.5,1);
78 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-4.8,1.2,14);
80 dims[0] = Gaudi::Histo1DDef(
"EME3",6.5,7.5,1);
81 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-4.5,1.0,14);
83 dims[0] = Gaudi::Histo1DDef(
"HEC0",7.5,8.5,1);
84 dims[2] = Gaudi::Histo1DDef(
"|eta|",1.4,3.4,20);
85 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-4.8,0.6,14);
87 dims[0] = Gaudi::Histo1DDef(
"HEC1",8.5,9.5,1);
88 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-4.9,-0.2,14);
90 dims[0] = Gaudi::Histo1DDef(
"HEC2",9.5,10.5,1);
91 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-4.8,-0.2,14);
93 dims[0] = Gaudi::Histo1DDef(
"HEC3",10.5,11.5,1);
94 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-4.7,-0.2,14);
96 dims[0] = Gaudi::Histo1DDef(
"TileBar0",11.5,12.5,1);
97 dims[2] = Gaudi::Histo1DDef(
"|eta|",0.,1.2,12);
98 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-6,-1,14);
100 dims[0] = Gaudi::Histo1DDef(
"TileBar1",12.5,13.5,1);
101 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-6.7,-1.2,14);
103 dims[0] = Gaudi::Histo1DDef(
"TileBar2",13.5,14.5,1);
104 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-7,-1.9,14);
106 dims[0] = Gaudi::Histo1DDef(
"TileGap1",14.5,15.5,1);
107 dims[2] = Gaudi::Histo1DDef(
"|eta|",0.8,1.8,10);
108 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-6,-1,14);
110 dims[0] = Gaudi::Histo1DDef(
"TileGap2",15.5,16.5,1);
111 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-6.5,-1.5,14);
113 dims[0] = Gaudi::Histo1DDef(
"TileExt0",17.5,18.5,1);
114 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-6.5,-1,14);
116 dims[0] = Gaudi::Histo1DDef(
"TileExt1",18.5,19.5,1);
117 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-6.6,-1.5,14);
119 dims[0] = Gaudi::Histo1DDef(
"TileExt2",19.5,20.5,1);
120 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-7.2,-2.4,14);
122 dims[0] = Gaudi::Histo1DDef(
"FCal1",20.5,21.5,1);
123 dims[2] = Gaudi::Histo1DDef(
"|eta|",2.8,5.0,22);
124 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-3.5,2,14);
126 dims[0] = Gaudi::Histo1DDef(
"FCal2",21.5,22.5,1);
127 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-3.5,1.5,14);
129 dims[0] = Gaudi::Histo1DDef(
"FCal3",22.5,23.5,1);
130 dims[5] = Gaudi::Histo1DDef(
"log10(rho_cell (MeV/mm^3))",-3.8,1,14);
173 ATH_MSG_INFO(
"Using weighting proportional to E_calib" );
177 ATH_MSG_INFO(
"Using weighting proportional to log(E_calib)" );
181 ATH_MSG_INFO(
"Using weighting proportional to 1/N_Clus_E_calib>0" );
194 ATH_MSG_INFO(
"Expecting ParticleID simulation as input -- use EM type clusters only" );
198 ATH_MSG_INFO(
"Expecting ParticleID simulation as input -- use HAD type clusters only" );
206 for(
unsigned int isamp=0;isamp<
m_dimensions.size();isamp++) {
217 <<
" is not a valid Calorimeter sampling name and will be ignored! "
218 <<
"Valid names are: ";
238 for(
unsigned int idim=1;idim<
m_dimensions[isamp].size();idim++) {
258 if ( ilogE < 0 || ilogrho < 0 || iweight < 0 ) {
259 ATH_MSG_FATAL(
" Mandatory dimension log10E, log10rho or weight missing ..." );
260 return StatusCode::FAILURE;
262 int nside = (iside>=0?
m_dimensions[isamp][iside].bins():1);
263 int neta = (ieta>=0?
m_dimensions[isamp][ieta].bins():1);
264 int nphi = (iphi>=0?
m_dimensions[isamp][iphi].bins():1);
265 m_weight[theSampling].resize(nside*neta*nphi,
nullptr);
266 for (
int jside=0;jside<nside;jside++) {
267 for (
int jeta=0;jeta<neta;jeta++) {
268 for (
int jphi=0;jphi<nphi;jphi++) {
271 wname +=
"inv_weight";
275 wname += theSampling;
279 wname += (iside>=0?
m_dimensions[isamp][iside].lowEdge():-1);
281 wname += (iside>=0?
m_dimensions[isamp][iside].highEdge():-1);
288 wname += (ieta>=0?
m_dimensions[isamp][ieta].lowEdge():-1);
290 wname += (ieta>=0?
m_dimensions[isamp][ieta].highEdge():-1);
297 wname += (iphi>=0?
m_dimensions[isamp][iphi].lowEdge():-1);
299 wname += (iphi>=0?
m_dimensions[isamp][iphi].highEdge():-1);
303 int iW = jphi*neta*nside+jeta*nside+jside;
305 new TProfile2D(wname,wname,
316 m_weight[theSampling][iW]->SetYTitle(
"log10(#rho_{cell}^{true} (MeV/mm^{3}))");
317 m_weight[theSampling][iW]->SetZTitle(
"E_{reco}/E_{tot}");
320 m_weight[theSampling][iW]->SetYTitle(
"log10(#rho_{cell} (MeV/mm^{3}))");
321 m_weight[theSampling][iW]->SetZTitle(
"E_{tot}/E_{reco}");
323 m_weight[theSampling][iW]->SetXTitle(
"log10(E_{clus} (MeV))");
333 return StatusCode::SUCCESS;
343 for(
unsigned int j=0;j<
m_weight[
i].size();j++) {
350 return StatusCode::SUCCESS;
357 const EventContext& ctx = getContext();
360 std::vector<const CaloCalibrationHitContainer *> v_cchc;
363 v_cchc.push_back(cchc.
cptr());
372 unsigned int maxHashSize(0);
375 maxHashSize = myHashMax-myHashMin;
376 cellVector[
ic].resize(maxHashSize,
nullptr);
383 double eCalibTot(0.);
385 unsigned int iClus = 0;
386 double nClusECalibGt0 = 0.0;
390 ATH_MSG_ERROR(
"Failed to retrieve cluster moment ENG_CALIB_TOT");
391 return StatusCode::FAILURE;
396 ATH_MSG_ERROR(
"Failed to retrieve cluster moment ENG_CALIB_FAC_EM");
397 return StatusCode::FAILURE;
410 for(; cellIter != cellIterEnd; cellIter++ ){
411 const CaloCell* pCell = (*cellIter);
417 myClus->
iClus = iClus;
419 myClus->
next =
nullptr;
421 ClusWeight * theList = cellVector[otherSubDet][(
unsigned int)myHashId];
423 while ( theList->
next )
424 theList = theList->
next;
425 theList->
next = myClus;
428 cellVector[otherSubDet][(
unsigned int)myHashId] = myClus;
441 ClusWeight * theList = cellVector[otherSubDet][(
unsigned int)myHashId];
443 theList->
eCalibTot += hit->energyTotal();
444 theList = theList->
next;
456 if ( eCalibTot > 0 ) {
457 const double inv_eCalibTot = 1. / eCalibTot;
458 const double inv_nClusECalibGt0 = 1. / nClusECalibGt0;
459 for (
unsigned int j=0;j<
cc->size();j++) {
461 double eng = pClus->
e();
464 ATH_MSG_ERROR(
"Failed to retrieve cluster moment ENG_CALIB_TOT");
465 return StatusCode::FAILURE;
467 if ( eng > 0 && eCalib > 0 ) {
471 ATH_MSG_ERROR(
"Failed to retrieve cluster moment ENG_CALIB_FAC_EM");
472 return StatusCode::FAILURE;
481 for(; cellIter != cellIterEnd; cellIter++ ){
482 const CaloCell* pCell = (*cellIter);
497 isideCell = (
int)(nside*(((pCell->
eta()<0?-1.0:1.0) - hd.lowEdge())
498 /(hd.highEdge()-hd.lowEdge())));
499 if ( isideCell < 0 || isideCell > nside-1 ) {
501 isideCell <<
" not in [0," << nside-1 <<
"] for "
502 <<
"Sampl=" << caloSample );
509 ietaCell = (
int)(neta*((fabs(pCell->
eta()) - hd.lowEdge())
510 /(hd.highEdge()-hd.lowEdge())));
511 if ( ietaCell < 0 || ietaCell > neta-1 ) {
513 ietaCell <<
" not in [0," << neta-1 <<
"] for "
514 <<
"Sampl=" << caloSample );
521 iphiCell = (
int)(nphi*((pCell->
phi() - hd.lowEdge())
522 /(hd.highEdge()-hd.lowEdge())));
523 if ( iphiCell < 0 || iphiCell > nphi-1 ) {
525 iphiCell <<
" not in [0," << nphi-1 <<
"] for "
526 <<
"Sampl=" << caloSample );
530 if ( isideCell >=0 && ietaCell >=0 && iphiCell >= 0 ) {
531 if ( myCDDE->
volume() > 0 ) {
535 unsigned int iW = iphiCell*neta*nside+ietaCell*nside+isideCell;
539 <<
"Sampl=" << caloSample
540 <<
", iphi=" << iphiCell
541 <<
", ieta=" << ietaCell
542 <<
", iside=" << isideCell );
545 ClusWeight * theList = cellVector[otherSubDet][(
unsigned int)myHashId];
546 while ( theList && theList->
iClus != j )
547 theList = theList->
next;
549 if (
m_weight[caloSample][iW] && theList && eCalibTot > 0) {
552 norm = eCalib * inv_eCalibTot;
557 norm = log10(eCalib * inv_eCalibTot)+2.0;
562 norm = inv_nClusECalibGt0;
570 m_weight[caloSample][iW]->Fill(log10(eng),
571 log10(pCell->
e()/myCDDE->
volume()),
576 m_weight[caloSample][iW]->Fill(log10(eng),
593 for (
unsigned int ii = 0;ii<cellVector[
ic].size();ii++ ) {
597 while ( theList->
next ) {
599 theList = theList->
next;
603 prev->
next =
nullptr;
605 cellVector[
ic][ii] =
nullptr;
606 theList = cellVector[
ic][ii];
612 return StatusCode::SUCCESS;
616 for (
unsigned int i=0;
i<dims.size();
i++) {
627 for (
const std::pair<const std::string, Gaudi::Histo1DDef>&
p :
m_dimensionsmap) {
628 std::string_view dimname = std::string_view(
p.first).substr(0,
p.first.find(
':'));
637 msg(MSG::ERROR) <<
"Calorimeter sampling " << dimname
638 <<
" is not a valid Calorimeter sampling name and will be ignored! "
639 <<
"Valid names are: ";
650 if ( theUsedSamplings[theSampling] == -1 ) {
652 theUsedSamplings[theSampling] = nsamp;
656 m_dimensions[theUsedSamplings[theSampling]].push_back(
p.second);
658 <<
p.second.title() <<
", [" <<
p.second.lowEdge()
659 <<
", " <<
p.second.highEdge()
660 <<
", " <<
p.second.bins()