36 {
37
38
39 SG::ReadHandle<LArDigitContainer> inputContainer(
m_digitKey,ctx);
40
41
42 auto outputContainerCellPtr = std::make_unique<CaloCellContainer>(
SG::VIEW_ELEMENTS);
43
44 DataPool<CaloCell> dataPool(ctx);
45 unsigned int hash_max =
m_onlineId->channelHashMax();
46 if (dataPool.allocated()==0){
47 dataPool.reserve (hash_max);
48 }
49 outputContainerCellPtr->reserve( hash_max );
50
51
52
54 const ILArPedestal* peds=*pedHdl;
55
56 SG::ReadCondHandle<LArADC2MeV> adc2mevHdl(
m_adc2MeVKey,ctx);
57 const LArADC2MeV* adc2MeVs=*adc2mevHdl;
58
59 SG::ReadCondHandle<ILArOFC> ofcHdl(
m_ofcKey,ctx);
60 const ILArOFC* ofcs=*ofcHdl;
61
62 SG::ReadCondHandle<ILArShape> shapeHdl(
m_shapeKey,ctx);
63 const ILArShape* shapes=*shapeHdl;
64
66
68 const CaloSuperCellDetDescrManager* caloMgr = *caloSuperCellMgrHandle;
69
72 SG::ReadCondHandle<LArBadChannelCont> larBadChan{
m_bcContKey, ctx };
73 badchannel = *larBadChan;
74 }
75
76
77 for (const LArDigit* digit : *inputContainer) {
78
79 const HWIdentifier
id=
digit->hardwareID();
80 if (!(*cabling)->isOnlineConnected(id)) continue;
81
83
84 const std::vector<short>& samples=
digit->samples();
85 const size_t nSamples=samples.size();
88
89
90 const auto& ofca=ofcs->
OFC_a(
id,gain);
91 const auto& adc2mev=adc2MeVs->
ADC2MEV(
id,gain);
92
93
96 return StatusCode::FAILURE;
97 }
98
101 return StatusCode::FAILURE;
102 }
103
104
105 std::vector<float> samp_no_ped(nSamples,0.0);
107 samp_no_ped[
i]=samples[
i]-
p;
108 }
109
110
111
112
114 bool passBCIDmax=false;
115
116 size_t nOFC=ofca.size();
119 << ". Found " << nSamples << ", expect at least " << nOFC+2 <<".");
120 }
121
122 for (
size_t i=0;
i<nOFC;++
i) {
123 A+=
static_cast<double>(samp_no_ped[
i+1])*ofca[i];
124 }
125
126 double Abefore=0.;
127 for (
size_t i=0;
i<nOFC;++
i) {
128 Abefore+=
static_cast<double>(samp_no_ped[
i])*ofca[i];
129 }
130
131 double Aafter=0.;
132 for (
size_t i=0;
i<nOFC;++
i) {
133 Aafter+=
static_cast<double>(samp_no_ped[
i+2])*ofca[i];
134 }
135
136 if ( (A>Abefore) && (A>Aafter) ) passBCIDmax=true;
137
138
139
140 const float E=adc2mev[0]+
A*adc2mev[1];
141
143 float tau=0;
144
146
148 ATH_MSG_VERBOSE(
"Channel " <<
m_onlineId->channel_name(
id) <<
" gain " << gain <<
" above threshold for tQ computation");
149
150
151 const auto& ofcb=ofcs->
OFC_b(
id,gain);
152 double At=0;
153 for (
size_t i=0;
i<nOFC;++
i) {
154 At+=
static_cast<double>(samp_no_ped[
i+1])*ofcb[i];
155 }
156
157 tau=(std::fabs(A)>0.1) ? At/A : 0.0;
158 const auto& fullShape=shapes->
Shape(
id,gain);
159
160
162
163 if (fullShape.size()>nSamples && nSamples==4 &&
m_firstSample==0) {
165 firstSample=1;
166 }
167 }
168
171 << " gain " << gain);
172 ATH_MSG_DEBUG(
"Got size " << fullShape.size() <<
", expected at least " << nSamples+firstSample);
173
174 nOFC=fullShape.size()-firstSample;
175 }
176
177 const float* shape=&*fullShape.begin()+firstSample;
178
181 if (useShapeDer) {
182 const auto& fullshapeDer=shapes->
ShapeDer(
id,gain);
185 << " gain " << gain << ". Will not use shape derivative.");
186 useShapeDer=false;
187 }
188 if (useShapeDer) {
189 const float* shapeDer=&*fullshapeDer.begin()+firstSample;
190 for (
size_t i=0;
i<nOFC;++
i) {
191 q += std::pow((A*(shape[i]-tau*shapeDer[i])-(samp_no_ped[i+1])),2);
192 }
193 }
194 }
195 if (!useShapeDer){
196
197 for (
size_t i=0;
i<nOFC;++
i) {
198 q += std::pow((A*shape[i]-(samp_no_ped[i+1])),2);
199 }
200 }
201
202 int iqua =
static_cast<int>(
q);
203 if (iqua > 0xFFFF) iqua=0xFFFF;
204 iquaShort =
static_cast<uint16_t>(iqua & 0xFFFF);
205
207 }
208
209 CaloCell*
ss = dataPool.nextElementPtr();
210 Identifier offId =
cabling->cnvToIdentifier(
id);
211
212 const CaloDetDescrElement* dde = caloMgr->
get_element (offId);
217 float et =
ss->et()*1
e-3;
218
223
224 if(badchannel) {
225 LArBadChannel bc = badchannel->offlineStatus(offId);
227 prov |= 0x80;
228 }
229 }
230
231 ss->setProvenance(prov);
232
233 ss->setQuality(iquaShort);
234 outputContainerCellPtr->push_back(
ss);
235
236 }
237
238 SG::WriteHandle<CaloCellContainer>outputContainer(
m_cellKey,ctx);
239 ATH_CHECK(outputContainer.record(std::move(outputContainerCellPtr) ) );
240
241 return StatusCode::SUCCESS;
242}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
float et(const xAOD::jFexSRJetRoI *j)
LArBadXCont< LArBadChannel > LArBadChannelCont
const CaloDetDescrElement * get_element(const Identifier &cellId) const
get element by its identifier
virtual OFCRef_t OFC_b(const HWIdentifier &id, int gain, int tbin=0) const =0
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)
virtual float timeOffset(const HWIdentifier &CellID, int gain) const =0
virtual float pedestal(const HWIdentifier &id, int gain) const =0
virtual ShapeRef_t Shape(const HWIdentifier &id, int gain, int tbin=0, int mode=0) const =0
virtual ShapeRef_t ShapeDer(const HWIdentifier &id, int gain, int tbin=0, int mode=0) const =0
const LArVectorProxy ADC2MEV(const HWIdentifier &id, int gain) const
bool statusBad(PosType pb) const
Returns true if corresponding status bit its set.
bool good() const
Returns true if no problems at all (all bits at zero)
SG::ReadCondHandleKey< ILArPedestal > m_pedestalKey
SG::ReadCondHandleKey< ILArShape > m_shapeKey
Gaudi::Property< float > m_eCutFortQ
Gaudi::Property< int > m_firstSample
SG::ReadCondHandleKey< CaloSuperCellDetDescrManager > m_caloSuperCellMgrKey
Gaudi::Property< bool > m_absECutFortQ
const LArOnline_SuperCellID * m_onlineId
SG::WriteHandleKey< CaloCellContainer > m_cellKey
SG::ReadCondHandleKey< LArBadChannelCont > m_bcContKey
Bad Channel masking for Super-Cells.
SG::ReadHandleKey< LArDigitContainer > m_digitKey
SG::ReadCondHandleKey< LArADC2MeV > m_adc2MeVKey
SG::ReadCondHandleKey< ILArOFC > m_ofcKey
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
Gaudi::Property< bool > m_useShapeDer
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts