 |
ATLAS Offline Software
|
Go to the documentation of this file.
7 #include "GaudiKernel/ToolHandle.h"
50 m_groupingType(
"FeedThrough")
82 double default_Tdrift[4] = { 420 , 475 , 475 , 475 } ;
83 for (
unsigned i=0;
i<4;
i++)
m_Tdrift.push_back(default_Tdrift[
i]);
86 double default_Tdrift2[4] = { 1200. , 1200. , 1200. , 1200. } ;
87 for (
unsigned i=0;
i<4;
i++)
m_Tdrift2.push_back(default_Tdrift2[
i]);
90 double default_wTriangle2[4] = { 0.01 , 0.01 , 0.01 , 0.01 } ;
105 unsigned int default_TshiftLayer[4] = { 0 , 0 , 0 , 0 } ;
121 ATH_MSG_INFO(
"Using standard triangular ionization pulse" ) ;
123 ATH_MSG_INFO(
"Using refined ionization pulse (double triangle)" ) ;
151 return StatusCode::SUCCESS ;
158 explicit FileCloser (FILE* the_f):
f (the_f) {}
159 ~FileCloser() {
if (
f) fclose(
f); }
162 FileCloser (
const FileCloser&) =
delete;
163 FileCloser&
operator= (
const FileCloser&) =
delete;
182 ToolHandle<LArPhysWaveTool> larPhysWaveTool(
"LArPhysWaveTool");
184 if (
sc!=StatusCode::SUCCESS) {
190 ToolHandle<LArPhysWaveHECTool> larPhysWaveHECTool(
"LArPhysWaveHECTool");
192 sc=larPhysWaveHECTool.retrieve();
193 if (
sc!=StatusCode::SUCCESS) {
206 return StatusCode::FAILURE;
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" );
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" );
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);
384 if (
sc.isFailure()) {
388 if ( caliWaveContainer ==
nullptr ) {
393 ATH_MSG_INFO(
"Processing LArCaliWaveContainer from StoreGate, key = " <<
key );
397 ATH_MSG_INFO(
"Now processing gain = " <<
gain <<
" in LArCaliWaveContainer with key = " <<
key );
402 const_iterator itVec = caliWaveContainer->
begin(
gain);
403 const_iterator itVec_e = caliWaveContainer->
end(
gain);
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());
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) ;
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(),
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()) {
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)");
654 if (MphysMcali<=0.) {
657 ATH_MSG_VERBOSE(
"Channel 0x" << MSG::hex << chid << MSG::dec <<
" -> Mphys/Mcali = " << 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 " );
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;
741 <<
", gain = " <<
gain <<
". Will use jobO setting." ) ;
746 const std::string badChanStatus=packer.
stringStatus(bc);
749 <<
", gain = " <<
gain <<
" BC status=[" << badChanStatus <<
"]. Will use jobO setting." );
def retrieve(aClass, aKey=None)
const LArOnlineID_Base * m_onlineHelper
ConditionsMap::const_iterator ConstConditionsMapIterator
virtual const float & Tdiff(const HWIdentifier &id, int gain) const =0
int m_timeShiftGuardRegion
Gaudi::Property< std::vector< std::string > > m_problemsToMask
void setPdata(const HWIdentifier id, const T &payload, unsigned int gain=0)
put payload in persistent data
int region(const Identifier id) const
LAr field values (NOT_VALID == invalid request)
Scalar phi() const
phi method
size_t getSize() const
number of time samples
unsigned getStart(const LArWave &theWave) const
unsigned getFlag() const
flag: ...
Scalar eta() const
pseudorapidity method
virtual float TimeOffset(const HWIdentifier fId) const =0
const std::vector< double > & getWave() const
Wave parameters.
Conditions-Data class holding LAr Bad Channel or Bad Feb information.
bool m_useJOPhysCaliTdiff
Declaration of const iterator.
void setTdrift(double tdrift)
const double & getDt() const
delta time
LArWave translate(const LArWave &theWave, int nShift, double baseline=0.) const
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
StatusCode buildBitMask(const std::vector< std::string > &problemsToMask, MsgStream &msg)
int getDAC() const
DAC value.
LArPhysWavePredictor(const std::string &name, ISvcLocator *pSvcLocator)
std::string m_groupingType
AccessorTemplate & operator=(AccessorTemplate &&that)
#define ATH_MSG_VERBOSE(x)
const std::string & key() const
Return the StoreGate ID for the referenced object.
unsigned int getMax(const LArWave &theWave) const
return index of maximum sample
bool cellShouldBeMasked(const LArBadChannelCont *bcCont, const HWIdentifier &hardwareId) const
virtual const float & Tcal(const HWIdentifier &id, int gain) const =0
value_type get_compact() const
Get the compact id.
std::vector< double > m_wTriangle2
Liquid Argon Physics Wave Container.
Liquid Argon Cumulative Wave Container.
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
int getIsPulsedInt() const
isPulsed value
virtual const float & Fstep(const HWIdentifier &id, int gain) const =0
const CaloCell_Base_ID * m_caloCellId
unsigned int totalNumberOfConditions() const
Statistics: total number of conditions.
bool isFCALchannel(const HWIdentifier id) const
const double & getSample(const unsigned int i) const
Amplitude per time bin.
bool m_useJODetCellParams
void setTdiff(double tdiff)
ConstConditionsMapIterator end(unsigned int gain) const
end of all channels for this gain
Helper class for offline supercell identifiers.
void setFlag(unsigned flag)
a traits class that associates a CLID to a type T It also detects whether T inherits from Gaudi DataO...
virtual bool isHECchannel(const HWIdentifier id) const =0
virtual const float & Omega0(const HWIdentifier &id, int gain) const =0
int sampling(const Identifier id) const
LAr field values (NOT_VALID == invalid request)
::StatusCode StatusCode
StatusCode definition for legacy code.
SG::ReadCondHandleKey< LArBadChannelCont > m_BCKey
ConstReference get(const HWIdentifier id, unsigned int gain=0) const
get data with online identifier
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
void notFoundMsg(const HWIdentifier chid, const int gain, const char *value)
Default, invalid implementation of ClassID_traits.
Helper class for offline supercell identifiers.
int eta(const Identifier id) const
LAr field values (NOT_VALID == invalid request)
virtual const float & Tdrift(const HWIdentifier &id) const =0
std::string m_keyMphysMcali
Helper class for offline cell identifiers.
std::string m_keyIdealPhys
HWIdentifier feb_Id(int barrel_ec, int pos_neg, int feedthrough, int slot) const
Create feb_Id from fields.
LArBadChannelMask m_bcMask
Helper for the Liquid Argon Calorimeter cell identifiers.
StatusCode initialize(bool used=true)
int phi(const Identifier id) const
LAr field values (NOT_VALID == invalid request)
std::vector< double > m_Tdrift2
virtual const float & Taur(const HWIdentifier &id, int gain) const =0
std::string stringStatus(const LArBadChannel &bc) const
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
std::vector< double > m_Tdrift
std::vector< std::string > m_keyCali
virtual StatusCode initialize()
Initialization done after creation or read back - derived classes may augment the functionality.
#define ATH_MSG_WARNING(x)
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKeySC
ConstConditionsMapIterator begin(unsigned int gain) const
get iterator for all channels for a gain
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
bool m_useJOCaliPulseParams
void setFlag(const unsigned flag)
set flag
std::string channel_name(const HWIdentifier id) const
Return a string corresponding to a feedthrough name given an identifier.
Helper base class for offline cell identifiers.
Exception class for LAr Identifiers.
std::vector< unsigned int > m_TshiftLayer
const std::vector< double > & getErrors() const
error vector
const std::vector< int > & getTriggers() const
trigger vector