182 ToolHandle<LArPhysWaveTool> larPhysWaveTool(
"LArPhysWaveTool");
183 StatusCode
sc=larPhysWaveTool.retrieve();
184 if (
sc!=StatusCode::SUCCESS) {
190 ToolHandle<LArPhysWaveHECTool> larPhysWaveHECTool(
"LArPhysWaveHECTool");
192 sc=larPhysWaveHECTool.retrieve();
193 if (
sc!=StatusCode::SUCCESS) {
203 cabling = {*cablingHdl};
206 return StatusCode::FAILURE;
210 cabling = {*cablingHdl};
213 return StatusCode::FAILURE;
224 sc =
detStore()->retrieve(larCaliPulseParams);
225 if (
sc == StatusCode::FAILURE ) {
229 ATH_MSG_INFO(
"LArCaliPulseParams successfully retrieved" ) ;
236 if (
sc == StatusCode::FAILURE ) {
240 ATH_MSG_INFO(
"LArDetCellParams successfully retrieved" );
249 if (
sc == StatusCode::FAILURE ) {
253 ATH_MSG_INFO(
"LArTdriftComplete successfully retrieved" );
259 if (
sc == StatusCode::FAILURE ) {
263 ATH_MSG_INFO(
"LArPhysCaliTdiff successfully retrieved" );
270 ATH_MSG_INFO(
"Will use helper class for start time." );
281 ATH_MSG_INFO(
"Manually shifting pulses by *layer-dependent* time indexes." );
285 ATH_MSG_INFO(
"Manually shifting pulses by *FEB* time indexes." );
288 larFebTshift =
nullptr;
296 if (
sc.isFailure() || !fcalPhysWaves) {
300 ATH_MSG_INFO(
"LArPhysWave fro FCAL successfully retrieved" );
307 std::unique_ptr<LArPhysWaveContainer> larPhysWaveContainer = std::make_unique<LArPhysWaveContainer>();
310 if (
sc.isFailure()) {
311 ATH_MSG_ERROR(
"Failed to set groupingType for LArPhysWaveContainer object" );
315 sc=larPhysWaveContainer->initialize();
316 if (
sc.isFailure()) {
317 ATH_MSG_ERROR(
"Failed initialize LArPhysWaveContainer object" );
322 std::unique_ptr<LArMphysOverMcalComplete> MphysOverMcalComplete = std::make_unique<LArMphysOverMcalComplete>();
324 if (
sc.isFailure()) {
325 ATH_MSG_ERROR(
"Failed to set groupingType for LArMphysOverMcalComplete object" );
329 sc=MphysOverMcalComplete->initialize();
330 if (
sc.isFailure()) {
331 ATH_MSG_ERROR(
"Failed initialize LArMphysOverMcalComplete object" );
337 f = fopen(
"MphysOverMcali.dat",
"w");
339 ATH_MSG_ERROR(
"Cannot open file `MphysOverMcali.dat' for write");
340 return StatusCode::FAILURE;
342 fprintf(f,
"# Region Layer Eta Phi Gain MphysMcali\n");
344 FileCloser fcloser (f);
346 std::vector<int> nTotal;
347 std::vector<int> noTcali;
348 std::vector<int> noFstep;
349 std::vector<int> noOmega0;
350 std::vector<int> noTaur;
351 std::vector<int> noTdrift;
352 std::vector<int> noTdiff;
355 for (
unsigned i=0; i<maxgain; ++i ) {
357 noTcali.push_back(0);
358 noFstep.push_back(0);
359 noOmega0.push_back(0);
361 noTdrift.push_back(0);
362 noTdiff.push_back(0);
379 for (
const std::string& key :
m_keyCali) {
383 sc =
detStore()->retrieve(caliWaveContainer,key);
384 if (
sc.isFailure()) {
388 if ( caliWaveContainer ==
nullptr ) {
389 ATH_MSG_INFO(
"LArCaliWaveContainer (key = " << key <<
") is empty" );
393 ATH_MSG_INFO(
"Processing LArCaliWaveContainer from StoreGate, key = " << key );
397 ATH_MSG_INFO(
"Now processing gain = " << gain <<
" in LArCaliWaveContainer with key = " << key );
404 for (; itVec != itVec_e; ++itVec) {
409 << std::hex << itVec.channelId().get_identifier32().get_compact() << std::dec);
415 id = cabling->cnvToIdentifier(chid);
417 ATH_MSG_ERROR(
"LArCabling exception caught for channel 0x" << MSG::hex << chid << MSG::dec
418 <<
". Skipping channel." ) ;
425 if ( nchannel < 100 || ( nchannel < 1000 && nchannel%100==0 ) || nchannel%1000==0 )
426 ATH_MSG_INFO(
"Processing calibration waveform number " << nchannel );
431 fcalw = fcalPhysWaves->
get(chid,0);
435 std::vector<double> amp;
437 const std::vector<double>& fvec = fcalw.
getWave();
438 std::copy(fvec.begin(), fvec.end(), amp.begin());
440 larPhysWaveContainer->setPdata(chid,ptmp, gain);
442 larPhysWaveContainer->setPdata(chid,fcalw, gain);
454 ATH_MSG_VERBOSE(
"Predicting physics waveform for channel 0x" << MSG::hex << chid << MSG::dec
455 <<
" (gain = " << gain <<
" - DAC = " << larCaliWave.getDAC() <<
")");
461 if ( !cabling->isOnlineConnected(chid) ) {
462 ATH_MSG_VERBOSE(
"Unconnected channel 0x" << MSG::hex << chid << MSG::dec
463 <<
". Skipping channel.");
477 Tcali = larCaliPulseParams->
Tcal(chid,gain) ;
484 Fstep = larCaliPulseParams->
Fstep(chid,gain) ;
497 Omega0 = larDetCellParams->
Omega0(chid,gain) ;
503 Taur = larDetCellParams->
Taur(chid,gain) ;
516 Tdrift = larTdrift->
Tdrift(chid) ;
521 if ( layer>=0 && layer<4 )
528 if ( layer>=0 && layer<4 )
538 Tdiff = (int)larPhysCaliTdiff->
Tdiff(chid,gain) ;
548 Tdiff = larWaveHelper.
getStart(theLArCaliWave) ;
565 float Tshaper = 15. ;
566 float Amplitude = 1. ;
567 LArWFParams wfParams(Tcali,Fstep,Tdrift,Omega0,Taur,Tshaper,Amplitude);
571 ATH_MSG_VERBOSE(
"wfParams: " << Tcali <<
" " <<Fstep<<
" " <<Tdrift<<
" "<<Omega0<<
" "<<Taur<<
" "<<Tdiff<<
" "<<layer<<
" "<<region );
576 double peak = theLArCaliWave.
getSample(larWaveHelper.
getMax(theLArCaliWave));
577 ATH_MSG_VERBOSE(
"Channel 0x" << MSG::hex << chid << MSG::dec <<
" -> Applying normalisation (CaliWave peak = " << peak <<
")");
581 theLArCaliWave =
LArCaliWave( (theLArCaliWave*(1./peak)).getWave(),
584 theLArCaliWave.
getDt(),
598 if(larIdealPhysWaveContainer &&
m_onlineHelper->isHECchannel(chid)) {
599 const LArPhysWave& laridealPhysWave = larIdealPhysWaveContainer ->
get(chid,gain);
604 sc = larPhysWaveHECTool->makeLArPhysWaveHEC(wfParams,theLArCaliWave,larPhysWave,laridealPhysWave,MphysMcali,chid,gain,
LArWaveFlag);
610 sc = larPhysWaveTool->makeLArPhysWave(wfParams,theLArCaliWave,region,layer,larPhysWave,MphysMcali);
612 if (
sc.isFailure()) {
620 if ( region==0 && layer>=0 && layer<4 &&
m_wTriangle2[layer]>0 ) {
625 sc = larPhysWaveTool->makeLArPhysWave(wfParams2,theLArCaliWave,region,layer,larPhysWave2,MphysMcali2);
626 if (
sc.isFailure()) {
627 ATH_MSG_FATAL(
"Cannot predict LArPhysWave for channel 0x" << MSG::hex << chid << MSG::dec <<
"with double triangle." );
636 ATH_MSG_WARNING(
"Double triangle implemented only for EMB, skip channel!" ) ;
642 ATH_MSG_DEBUG(
"Time shift for channel " << (itVec.channelId()).get_compact() <<
" is "
643 << Tdiff <<
" samples (" << Tdiff*larPhysWave.
getDt() <<
" ns)");
650 larPhysWaveContainer->setPdata(chid,larPhysWave,gain);
654 if (MphysMcali<=0.) {
657 ATH_MSG_VERBOSE(
"Channel 0x" << MSG::hex << chid << MSG::dec <<
" -> Mphys/Mcali = " << MphysMcali);
658 MphysOverMcalComplete->set(chid,gain,MphysMcali);
663 fprintf( f ,
"%2d %2d %3d %3d %2u %8.3f \n", region, layer,
eta,
phi, gain, MphysMcali ) ;
676 ATH_MSG_INFO(
" Summary : Number of cells with a PhysWave values computed : " << NPhysWave );
677 ATH_MSG_INFO(
" Summary : Number of cells with a MphysOverMcal values computed : " << NMPMC );
678 ATH_MSG_INFO(
" Summary : Number of Barrel PS cells side A or C (connected+unconnected): 3904+ 192 " );
679 ATH_MSG_INFO(
" Summary : Number of Barrel cells side A or C (connected+unconnected): 50944+2304 " );
680 ATH_MSG_INFO(
" Summary : Number of EMEC cells side A or C (connected+unconnected): 31872+3456 " );
681 ATH_MSG_INFO(
" Summary : Number of HEC cells side A or C (connected+unconnected): 2816+ 256 " );
682 ATH_MSG_INFO(
" Summary : Number of FCAL cells side A or C (connected+unconnected): 1762+ 30 " );
684 ATH_MSG_DEBUG(
"LArPhysWaveContainer->totalNumberOfConditions() = " << larPhysWaveContainer->totalNumberOfConditions());
685 ATH_MSG_DEBUG(
"LArMphysOverMcalComplete->totalNumberOfConditions() = " << MphysOverMcalComplete->totalNumberOfConditions());
693 ATH_MSG_INFO(
"\t" << noTcali[theGain] <<
" / " << nTotal[theGain] <<
" channel(s) missing Tcali" );
694 ATH_MSG_INFO(
"\t" << noFstep[theGain] <<
" / " << nTotal[theGain] <<
" channel(s) missing Fstep" );
697 ATH_MSG_INFO(
"\t" << noOmega0[theGain] <<
" / " << nTotal[theGain] <<
" channel(s) missing Omega0" );
698 ATH_MSG_INFO(
"\t" << noTaur[theGain] <<
" / " << nTotal[theGain] <<
" channel(s) missing Taur" );
701 ATH_MSG_INFO(
"\t" << noTdrift[theGain] <<
" / " << nTotal[theGain] <<
" channel(s) missing Tdrift" );
703 ATH_MSG_INFO(
"\t" << noTdiff[theGain] <<
" / " << nTotal[theGain] <<
" channel(s) missing Tdiff" );
709 if (
sc.isFailure()) {
711 return StatusCode::FAILURE;
716 if (
sc.isFailure()) {
718 return StatusCode::FAILURE;
722 ATH_MSG_DEBUG(
"Trying to symlink ILArMphysOverMcal with LArMphysOverMcalComplete...");
724 if (
sc.isFailure()) {
725 ATH_MSG_FATAL(
"Could not symlink ILArMphysOverMcal with LArMphysOverMcalComplete." );
726 return StatusCode::FAILURE;
728 ATH_MSG_INFO(
"ILArMphysOverMcal symlink with LArMphysOverMcalComplete successfully" ) ;
732 return StatusCode::SUCCESS;