ATLAS Offline Software
LArRawChannelBuilderSCAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 #include "GaudiKernel/SystemOfUnits.h"
11 #include "AthAllocators/DataPool.h"
13 #include <cmath>
14 
15 
24 
25  ATH_CHECK(detStore()->retrieve(m_onlineId,"LArOnline_SuperCellID"));
27 
28  return StatusCode::SUCCESS;
29 }
30 
32  return StatusCode::SUCCESS;
33 }
34 
35 StatusCode LArRawChannelBuilderSCAlg::execute(const EventContext& ctx) const {
36 
37  //Get event inputs from read handles:
39 
40  //Write output via write handle
41  auto outputContainerCellPtr = std::make_unique<CaloCellContainer>(SG::VIEW_ELEMENTS);
42 
43  DataPool<CaloCell> dataPool(ctx);
44  unsigned int hash_max = m_onlineId->channelHashMax();
45  if (dataPool.allocated()==0){
46  dataPool.reserve (hash_max);
47  }
48  outputContainerCellPtr->reserve( hash_max );
49 
50 
51  //Get Conditions input
53  const ILArPedestal* peds=*pedHdl;
54 
56  const LArADC2MeV* adc2MeVs=*adc2mevHdl;
57 
59  const ILArOFC* ofcs=*ofcHdl;
60 
62  const ILArShape* shapes=*shapeHdl;
63 
65 
67  const CaloSuperCellDetDescrManager* caloMgr = *caloSuperCellMgrHandle;
68 
69  //Loop over digits:
70  for (const LArDigit* digit : *inputContainer) {
71 
72  const HWIdentifier id=digit->hardwareID();
73  if (!(*cabling)->isOnlineConnected(id)) continue;
74 
75  ATH_MSG_VERBOSE("Working on channel " << m_onlineId->channel_name(id));
76 
77  const std::vector<short>& samples=digit->samples();
78  const size_t nSamples=samples.size();
79  const int gain=digit->gain();
80  const float p=peds->pedestal(id,gain);
81 
82  //The following autos will resolve either into vectors or vector-proxies
83  const auto& ofca=ofcs->OFC_a(id,gain);
84  const auto& adc2mev=adc2MeVs->ADC2MEV(id,gain);
85 
86  //Sanity check on input conditions data:
88  ATH_MSG_ERROR("No valid pedestal for channel " << m_onlineId->channel_name(id) << " gain " << gain);
89  return StatusCode::FAILURE;
90  }
91 
92  if(ATH_UNLIKELY(adc2mev.size()<2)) {
93  ATH_MSG_ERROR("No valid ADC2MeV for channel " << m_onlineId->channel_name(id) << " gain " << gain);
94  return StatusCode::FAILURE;
95  }
96 
97  // Subtract pedestal
98  std::vector<float> samp_no_ped(nSamples,0.0);
99  for (size_t i=0;i<nSamples;++i) {
100  samp_no_ped[i]=samples[i]-p;
101  }
102 
103  //Apply OFCs to get amplitude
104  // Evaluate sums in double-precision to get consistent results
105  // across platforms.
106  double A=0;
107  bool passBCIDmax=false;
108  //const size_t len=std::min(ofca.size(),samples.size());
109  size_t nOFC=ofca.size();
110  if (ATH_UNLIKELY(nSamples<nOFC+2)) {
111  ATH_MSG_ERROR("Not enough ADC samples for channel " << m_onlineId->channel_name(id) << " gain " << gain
112  << ". Found " << nSamples << ", expect at least " << nOFC+2 <<".");
113  }
114  //Calculate Amplitude for BC
115  for (size_t i=0;i<nOFC;++i) {
116  A+=static_cast<double>(samp_no_ped[i+1])*ofca[i];
117  }
118  //Calcuclate Amplitude for preceeding BC
119  double Abefore=0.;
120  for (size_t i=0;i<nOFC;++i) {
121  Abefore+=static_cast<double>(samp_no_ped[i])*ofca[i];
122  }
123  //Calculate Amplitude for trailing BC
124  double Aafter=0.;
125  for (size_t i=0;i<nOFC;++i) {
126  Aafter+=static_cast<double>(samp_no_ped[i+2])*ofca[i];
127  }
128  //set passBCIDmax if Amplitude at assume BC is larger than for the BC before and after
129  if ( (A>Abefore) && (A>Aafter) ) passBCIDmax=true;
130 
131 
132  //Apply Ramp
133  const float E=adc2mev[0]+A*adc2mev[1];
134 
135  uint16_t iquaShort=0;
136  float tau=0;
137 
138  const float E1=m_absECutFortQ.value() ? std::fabs(E) : E;
139 
140  if (E1 > m_eCutFortQ) {
141  ATH_MSG_VERBOSE("Channel " << m_onlineId->channel_name(id) << " gain " << gain << " above threshold for tQ computation");
142 
143  //Get time by applying OFC-b coefficients:
144  const auto& ofcb=ofcs->OFC_b(id,gain);
145  double At=0;
146  for (size_t i=0;i<nOFC;++i) {
147  At+=static_cast<double>(samp_no_ped[i+1])*ofcb[i];
148  }
149  //Divide A*t/A to get time
150  tau=(std::fabs(A)>0.1) ? At/A : 0.0;
151  const auto& fullShape=shapes->Shape(id,gain);
152 
153  //Get Q-factor
154  size_t firstSample=m_firstSample;
155  // fixing HEC to move +1 in case of 4 samples and firstSample 0 (copied from old LArRawChannelBuilder)
156  if (fullShape.size()>nSamples && nSamples==4 && m_firstSample==0) {
157  if (m_onlineId->isHECchannel(id)) {
158  firstSample=1;
159  }
160  }
161 
162  if (ATH_UNLIKELY(fullShape.size()<nOFC+firstSample)) {
163  ATH_MSG_DEBUG("No valid shape for channel " << m_onlineId->channel_name(id)
164  << " gain " << gain);
165  ATH_MSG_DEBUG("Got size " << fullShape.size() << ", expected at least " << nSamples+firstSample);
166  //return StatusCode::FAILURE;
167  nOFC=fullShape.size()-firstSample;
168  }
169 
170  const float* shape=&*fullShape.begin()+firstSample;
171 
172  double q=0;
173  bool useShapeDer=m_useShapeDer;
174  if (useShapeDer) {
175  const auto& fullshapeDer=shapes->ShapeDer(id,gain);
176  if (ATH_UNLIKELY(fullshapeDer.size()<nOFC)) {
177  ATH_MSG_DEBUG("No valid shape derivative for channel " << m_onlineId->channel_name(id)
178  << " gain " << gain << ". Will not use shape derivative.");
179  useShapeDer=false;
180  }
181  if (useShapeDer) {
182  const float* shapeDer=&*fullshapeDer.begin()+firstSample;
183  for (size_t i=0;i<nOFC;++i) {
184  q += std::pow((A*(shape[i]-tau*shapeDer[i])-(samp_no_ped[i+1])),2);
185  }
186  }//end if useShapeDer
187  }
188  if (!useShapeDer){
189  //Q-factor w/o shape derivative
190  for (size_t i=0;i<nOFC;++i) {
191  q += std::pow((A*shape[i]-(samp_no_ped[i+1])),2);
192  }
193  }
194 
195  int iqua = static_cast<int>(q);
196  if (iqua > 0xFFFF) iqua=0xFFFF;
197  iquaShort = static_cast<uint16_t>(iqua & 0xFFFF);
198 
199  tau-=ofcs->timeOffset(id,gain);
200  }//end if above cut
201 
202  CaloCell* ss = dataPool.nextElementPtr();
203  Identifier offId = cabling->cnvToIdentifier(id);
204 
205  const CaloDetDescrElement* dde = caloMgr->get_element (offId);
206  ss->setCaloDDE(dde);
207  ss->setEnergy(E);
208  ss->setTime(tau);
209  ss->setGain((CaloGain::CaloGain)0);
210  float et = ss->et()*1e-3; // et in GeV
211  // for super-cells provenance and time are slightly different
212  uint16_t prov = LArProv::QTPRESENT;//0x2000;
213  if(et>10e3 && tau>-8 && tau<16) prov |= LArProv::SCTIMEPASS; //0x200;
214  else if(et<=10e3 && std::fabs(tau)<8) prov |= LArProv::SCTIMEPASS; //0x200;
215  if ( passBCIDmax ) prov |= LArProv::SCPASSBCIDMAX; //0x40;
216  ss->setProvenance(prov);
217 
218  ss->setQuality(iquaShort);
219  outputContainerCellPtr->push_back(ss);
220 
221  }//end loop over input digits
222 
223  SG::WriteHandle<CaloCellContainer>outputContainer(m_cellKey,ctx);
224  ATH_CHECK(outputContainer.record(std::move(outputContainerCellPtr) ) );
225 
226  return StatusCode::SUCCESS;
227 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
LArRawChannelBuilderSCAlg::initialize
StatusCode initialize() override
Definition: LArRawChannelBuilderSCAlg.cxx:16
ILArPedestal::pedestal
virtual float pedestal(const HWIdentifier &id, int gain) const =0
LArADC2MeV::ADC2MEV
const LArVectorProxy ADC2MEV(const HWIdentifier &id, int gain) const
Definition: LArADC2MeV.h:32
et
Extra patterns decribing particle interation process.
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
PowhegControl_ttHplus_NLO.ss
ss
Definition: PowhegControl_ttHplus_NLO.py:83
LArRawChannelBuilderSCAlg::m_pedestalKey
SG::ReadCondHandleKey< ILArPedestal > m_pedestalKey
Definition: LArRawChannelBuilderSCAlg.h:49
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
DataPool::reserve
void reserve(unsigned int size)
Set the desired capacity.
LArRawChannelBuilderSCAlg::m_firstSample
Gaudi::Property< int > m_firstSample
Definition: LArRawChannelBuilderSCAlg.h:64
LArProv::SCPASSBCIDMAX
@ SCPASSBCIDMAX
Definition: LArProvenance.h:24
SG::VIEW_ELEMENTS
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
Definition: OwnershipPolicy.h:18
LArRawChannelBuilderSCAlg::m_absECutFortQ
Gaudi::Property< bool > m_absECutFortQ
Definition: LArRawChannelBuilderSCAlg.h:60
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
ILArPedestal
Definition: ILArPedestal.h:12
LArRawChannelBuilderSCAlg::m_cablingKey
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
Definition: LArRawChannelBuilderSCAlg.h:55
CaloDetDescrElement
This class groups all DetDescr information related to a CaloCell. Provides a generic interface for al...
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:66
conifer::pow
constexpr int pow(int x)
Definition: conifer.h:20
CaloCondBlobAlgs_fillNoiseFromASCII.gain
gain
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:110
ILArOFC::OFC_b
virtual OFCRef_t OFC_b(const HWIdentifier &id, int gain, int tbin=0) const =0
CaloDetDescrManager_Base::get_element
const CaloDetDescrElement * get_element(const Identifier &cellId) const
get element by its identifier
Definition: CaloDetDescrManager.cxx:159
ReadCellNoiseFromCool.cabling
cabling
Definition: ReadCellNoiseFromCool.py:154
ILArShape::ShapeDer
virtual ShapeRef_t ShapeDer(const HWIdentifier &id, int gain, int tbin=0, int mode=0) const =0
ATH_UNLIKELY
#define ATH_UNLIKELY(x)
Definition: AthUnlikelyMacros.h:17
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
checkRpcDigits.digit
digit
Definition: checkRpcDigits.py:186
HWIdentifier
Definition: HWIdentifier.h:13
CaloDetDescrManager.h
Definition of CaloDetDescrManager.
DataPool::allocated
unsigned int allocated()
return size already allocated OK
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
CaloSuperCellDetDescrManager
Definition: CaloDetDescrManager.h:490
dqt_zlumi_alleff_HIST.A
A
Definition: dqt_zlumi_alleff_HIST.py:110
LArRawChannelBuilderSCAlg::m_digitKey
SG::ReadHandleKey< LArDigitContainer > m_digitKey
Definition: LArRawChannelBuilderSCAlg.h:42
ILArOFC::timeOffset
virtual float timeOffset(const HWIdentifier &CellID, int gain) const =0
LArOnline_SuperCellID::isHECchannel
bool isHECchannel(const HWIdentifier id) const override final
Definition: LArOnline_SuperCellID.cxx:363
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
CheckAppliedSFs.e3
e3
Definition: CheckAppliedSFs.py:264
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
LArDigit
Liquid Argon digit base class.
Definition: LArDigit.h:25
lumiFormat.i
int i
Definition: lumiFormat.py:92
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
01SubmitToGrid.samples
samples
Definition: 01SubmitToGrid.py:58
LArRawChannelBuilderSCAlg.h
LArProv::QTPRESENT
@ QTPRESENT
Definition: LArProvenance.h:33
LArRawChannelBuilderSCAlg::m_caloSuperCellMgrKey
SG::ReadCondHandleKey< CaloSuperCellDetDescrManager > m_caloSuperCellMgrKey
Definition: LArRawChannelBuilderSCAlg.h:71
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
LArProv::SCTIMEPASS
@ SCTIMEPASS
Definition: LArProvenance.h:29
LArRawChannelBuilderSCAlg::m_eCutFortQ
Gaudi::Property< float > m_eCutFortQ
Definition: LArRawChannelBuilderSCAlg.h:58
LArRawChannelBuilderSCAlg::m_onlineId
const LArOnline_SuperCellID * m_onlineId
Definition: LArRawChannelBuilderSCAlg.h:68
ILArPedestal::ERRORCODE
@ ERRORCODE
Definition: ILArPedestal.h:47
DataPool::nextElementPtr
pointer nextElementPtr()
obtain the next available element in pool by pointer pool is resized if its limit has been reached On...
LArRawChannelBuilderSCAlg::m_cellKey
SG::WriteHandleKey< CaloCellContainer > m_cellKey
Definition: LArRawChannelBuilderSCAlg.h:45
DataPool.h
ILArOFC
Definition: ILArOFC.h:14
LArRawChannelBuilderSCAlg::m_adc2MeVKey
SG::ReadCondHandleKey< LArADC2MeV > m_adc2MeVKey
Definition: LArRawChannelBuilderSCAlg.h:50
LArRawChannelBuilderSCAlg::m_useShapeDer
Gaudi::Property< bool > m_useShapeDer
Definition: LArRawChannelBuilderSCAlg.h:61
LArRawChannelBuilderSCAlg::execute
StatusCode execute(const EventContext &ctx) const override
Definition: LArRawChannelBuilderSCAlg.cxx:35
VP1PartSpect::E
@ E
Definition: VP1PartSpectFlags.h:21
LArOnlineID_Base::channelHashMax
size_type channelHashMax(void) const
Define channel hash tables max size.
Definition: LArOnlineID_Base.cxx:1901
LArRawChannelBuilderSCAlg::m_ofcKey
SG::ReadCondHandleKey< ILArOFC > m_ofcKey
Definition: LArRawChannelBuilderSCAlg.h:51
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
LArRawChannelBuilderSCAlg::m_shapeKey
SG::ReadCondHandleKey< ILArShape > m_shapeKey
Definition: LArRawChannelBuilderSCAlg.h:52
LArDigitContainer.h
CaloCellContainer.h
CaloGain::CaloGain
CaloGain
Definition: CaloGain.h:11
LArRawChannelBuilderSCAlg::finalize
StatusCode finalize() override
Definition: LArRawChannelBuilderSCAlg.cxx:31
LArADC2MeV
Definition: LArADC2MeV.h:21
SG::WriteHandle< CaloCellContainer >
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
LArProvenance.h
DataPool
a typed memory pool that saves time spent allocation small object. This is typically used by containe...
Definition: DataPool.h:47
ILArOFC::OFC_a
virtual OFCRef_t OFC_a(const HWIdentifier &id, int gain, int tbin=0) const =0
access to OFCs by online ID, gain, and tbin (!=0 for testbeam)
extractSporadic.q
list q
Definition: extractSporadic.py:98
LArOnline_SuperCellID.h
LArDigits2NtupleDumper.nSamples
nSamples
Definition: LArDigits2NtupleDumper.py:70
LArOnlineID_Base::channel_name
std::string channel_name(const HWIdentifier id) const
Return a string corresponding to a feedthrough name given an identifier.
Definition: LArOnlineID_Base.cxx:218
ILArShape
Definition: ILArShape.h:13
ILArShape::Shape
virtual ShapeRef_t Shape(const HWIdentifier &id, int gain, int tbin=0, int mode=0) const =0