32 #include "GaudiKernel/ISvcLocator.h"
33 #include "GaudiKernel/StatusCode.h"
43 ISvcLocator* pSvcLocator)
45 m_outputFile(nullptr),
46 m_clusterCollName(
"CaloTopoClusters"),
47 m_NormalizationType(
"Lin"),
48 m_NormalizationTypeNumber(0),
49 m_ClassificationType(
"None"),
50 m_ClassificationTypeNumber(0)
53 std::vector<Gaudi::Histo1DDef> dims(6);
54 dims[0] = Gaudi::Histo1DDef(
"side",-1.5,1.5,1);
55 dims[1] = Gaudi::Histo1DDef(
"|eta|",0.,5.,25);
56 dims[2] = Gaudi::Histo1DDef(
"phi",-
M_PI,
M_PI,1);
57 dims[3] = Gaudi::Histo1DDef(
"log10(E_clus (MeV))",log10(200),log10(1e6),14);
58 dims[4] = Gaudi::Histo1DDef(
"log10(<rho_cell (MeV/mm^3)>)-log10(E_clus (MeV))",-9.0,-4.0,20);
59 dims[5] = Gaudi::Histo1DDef(
"log10(lambda_clus (mm))",0.0,4.0,20);
97 ATH_MSG_INFO(
"Using weighting proportional to E_calib" );
101 ATH_MSG_INFO(
"Using weighting proportional to log(E_calib)" );
105 ATH_MSG_INFO(
"Using weighting proportional to 1/N_Clus_E_calib>0" );
118 ATH_MSG_INFO(
"Expecting ParticleID simulation as input -- use EM type clusters only" );
122 ATH_MSG_INFO(
"Expecting ParticleID simulation as input -- use HAD type clusters only" );
138 for(
unsigned int idim=0;idim<
m_dimensions.size();idim++) {
155 else if (
m_dimensions[idim].
title() ==
"log10(<rho_cell (MeV/mm^3)>)-log10(E_clus (MeV))" )
160 if ( ilogE < 0 || ilogrho < 0 || iloglambda < 0 ) {
161 ATH_MSG_FATAL(
" Mandatory dimension log10E, log10rho or log10lambda missing ..." );
162 return StatusCode::FAILURE;
168 m_hclus.resize(nside*neta*nphi*nlogE,
nullptr);
169 for (
int jside=0;jside<nside;jside++) {
170 for (
int jeta=0;jeta<neta;jeta++) {
171 for (
int jphi=0;jphi<nphi;jphi++) {
172 for(
int jlogE=0;jlogE<nlogE;jlogE++) {
173 TString
hname(
"hclus");
210 int iH = jlogE*nphi*neta*nside+jphi*neta*nside+jeta*nside+jside;
219 m_hclus[iH]->SetXTitle(
"log10(<#rho_{cell}> (MeV/mm^{3})) - log10(E_{clus} (MeV))");
220 m_hclus[iH]->SetYTitle(
"log10(#lambda_{clus} (mm))");
221 m_hclus[iH]->SetZTitle(
"Number of Clusters");
229 return StatusCode::SUCCESS;
243 return StatusCode::SUCCESS;
253 double eCalibTot(0.);
254 double nClusECalibGt0 = 0.0;
259 ATH_MSG_ERROR(
"Failed to retrieve cluster moment ENG_CALIB_TOT" );
260 return StatusCode::FAILURE;
265 ATH_MSG_ERROR(
"Failed to retrieve cluster moment ENG_CALIB_FRAC_EM" );
266 return StatusCode::FAILURE;
279 if ( eCalibTot > 0 ) {
280 const double inv_eCalibTot = 1. / eCalibTot;
281 const double inv_nClusECalibGt0 = 1. / nClusECalibGt0;
283 double eng = pClus->e();
288 ATH_MSG_ERROR(
"Failed to retrieve cluster moment ENG_CALIB_FRAC_EM" );
289 return StatusCode::FAILURE;
297 double eta = fabs(pClus->eta());
311 iside = (
int)(nside*(((pClus->eta()<0?-1.0:1.0) - hd.lowEdge())
312 /(hd.highEdge()-hd.lowEdge())));
313 if ( iside < 0 || iside > nside-1 ) {
315 iside <<
" not in [0," << nside-1 <<
"]" );
323 ieta = (
int)(neta*((
eta - hd.lowEdge())
324 /(hd.highEdge()-hd.lowEdge())));
325 if ( ieta < 0 || ieta > neta-1 ) {
327 ieta <<
" not in [0," << neta-1 <<
"]" );
334 iphi = (
int)(nphi*((pClus->phi() - hd.lowEdge())
335 /(hd.highEdge()-hd.lowEdge())));
336 if ( iphi < 0 || iphi > nphi-1 ) {
338 iphi <<
" not in [0," << nphi-1 <<
"]" );
345 ilogE = (
int)(nlogE*((log10(eng) - hd.lowEdge())
346 /(hd.highEdge()-hd.lowEdge())));
347 if ( ilogE >= 0 && ilogE < nlogE ) {
348 double dens=0,lamb=0,ecal=0;
350 ATH_MSG_ERROR(
"Failed to retrieve cluster moment ENG_CALIB_TOT" );
351 return StatusCode::FAILURE;
354 ATH_MSG_ERROR(
"Failed to retrieve cluster moment FIRST_ENG_DENS" );
355 return StatusCode::FAILURE;
358 ATH_MSG_ERROR(
"Failed to retrieve cluster moment CENTER_LAMBDA" );
359 return StatusCode::FAILURE;
365 int iH = ilogE*nphi*neta*nside+iphi*neta*nside+ieta*nside+iside;
369 norm = ecal*inv_eCalibTot;
373 norm = log10(ecal*inv_eCalibTot)+2.0;
376 norm = inv_nClusECalibGt0;
382 m_hclus[iH]->Fill(log10(dens)-log10(eng),log10(lamb),
norm);
391 return StatusCode::SUCCESS;
395 for (
unsigned int i=0;
i<dims.size();
i++) {
402 for (std::pair<const std::string, Gaudi::Histo1DDef>&
p :
m_dimensionsmap) {
405 <<
p.second.title() <<
", [" <<
p.second.lowEdge()
406 <<
", " <<
p.second.highEdge()
407 <<
", " <<
p.second.bins()