21 base_class(
type, name, parent) {}
35 return StatusCode::SUCCESS;
40 return StatusCode::FAILURE;
54 if (!update.isValid()) {
56 return StatusCode::FAILURE;
58 ATH_CHECK(outputHandle.
record(std::make_unique<Muon::CscStripPrepDataContainer>(update.ptr())));
61 return StatusCode::SUCCESS;
65 unsigned int sizeVectorRequested = givenIdhs.size();
66 ATH_MSG_DEBUG(
"decode for " << sizeVectorRequested <<
" offline collections called");
80 if (!update.isValid()) {
82 return StatusCode::FAILURE;
84 ATH_CHECK(outputHandle.
record(std::make_unique<Muon::CscStripPrepDataContainer>(update.ptr())));
96 if (!rdoContainerHandle.isValid()) {
98 return StatusCode::SUCCESS;
105 if (sizeVectorRequested) {
107 for (
unsigned int i = 0; i < sizeVectorRequested; ++i) {
108 if (
decodeImpl(outputCollection, rdoContainer, givenIdhs[i]).isFailure()) {
109 ATH_MSG_ERROR(
"Unable to decode CSC RDO " << i <<
"th into CSC PrepRawData");
110 return StatusCode::FAILURE;
115 if (
decodeImpl(outputCollection, rdoContainer).isFailure()) {
117 return StatusCode::FAILURE;
121 return StatusCode::SUCCESS;
133 ATH_MSG_DEBUG(
"Stored empty container; Decoding CSC RDO into CSC PrepRawData is switched off");
134 return StatusCode::SUCCESS;
138 if (!outputCollection || outputCollection->empty()) {
140 return StatusCode::SUCCESS;
147 uint16_t idColl = 0xffff;
148 m_cabling->hash2CollectionId(givenHashId, idColl);
150 if (
nullptr == rawCollection) {
151 ATH_MSG_DEBUG(
"Specific CSC RDO collection retrieving failed for collection hash = " << idColl);
152 return StatusCode::SUCCESS;
157 if (rawCollection->
empty())
return StatusCode::SUCCESS;
162 unsigned int samplingTime = rawCollection->
rate();
163 unsigned int numSamples = rawCollection->
numSamples();
165 std::vector<float> charges;
167 std::vector<uint16_t> samples;
170 if (
int(samplingTime) !=
int(
m_cscCalibTool->getSamplingTime())) {
171 ATH_MSG_WARNING(
" CSC sampling time from Collection is NOT consistant to calibTool parameter!!!!!!! ");
184 if (
m_idHelperSvc->cscIdHelper().get_hash(stationId, cscHashId, &cscContext)) {
186 <<
"context begin_index = " << cscContext.
begin_index() <<
" context end_index = " << cscContext.
end_index()
187 <<
" the identifier is " << stationId);
189 ATH_MSG_DEBUG(
"Create CSC PRD Collection with hash " << cscHashId <<
" (givenHashId is " << givenHashId <<
")");
190 std::unique_ptr<CscStripPrepDataCollection> collection =
nullptr;
193 if (
lock.alreadyPresent()) {
194 ATH_MSG_DEBUG(
"CSC PRD collection already exist with collection hash = " << cscHashId <<
" collection filling is skipped!");
195 return StatusCode::SUCCESS;
197 ATH_MSG_DEBUG(
"CSC PRD collection does not exist - creating a new one with hash = " << cscHashId);
198 collection = std::make_unique<CscStripPrepDataCollection>(cscHashId);
199 collection->setIdentifier(stationId);
202 for (; itD != itD_e; ++itD) {
205 uint16_t totalSamples = (
data->samples()).size();
206 uint32_t hashOffset =
data->hashId();
209 <<
" Width = " <<
width <<
" Samples = " << totalSamples <<
" stationId : " << stationId
210 <<
" hashOffset : " << hashOffset);
212 for (
unsigned int j = 0; j <
width; ++j) {
220 <<
" Skipping channel ");
222 }
else if (!descriptor->
containsId(channelId)) {
225 <<
"> inconsistent with the geometry of detector element <"
230 float timeOfFirstSample = 0.0;
231 bool extractSamples =
data->samples(j, numSamples, samples);
232 if (!extractSamples) {
233 ATH_MSG_WARNING(
"Unable to extract samples for strip " << j <<
" Online Cluster width = " <<
width
234 <<
" for number of Samples = " << numSamples <<
" continuing ...");
239 if (
m_idHelperSvc->cscIdHelper().get_channel_hash(channelId, stripHash)) {
243 bool adctocharge =
m_cscCalibTool->adcToCharge(samples, stripHash, charges);
246 <<
"CSC PrepData not build ... skipping ");
249 if (samples.size() >= 4)
251 <<
" " << samples[2] <<
" " << samples[3] <<
" Charges: "
252 <<
" " << charges[0] <<
" " << charges[1] <<
" " << charges[2] <<
" " << charges[3]);
254 int measuresPhi =
m_idHelperSvc->cscIdHelper().measuresPhi(channelId);
258 int chamberLayer =
m_idHelperSvc->cscIdHelper().chamberLayer(channelId);
260 double errPos = stripWidth / sqrt(12.0);
263 covariance.setIdentity();
264 covariance *= errPos * errPos;
269 charges, timeOfFirstSample, samplingTime);
272 newPrepData->
setHashAndIndex(collection->identifyHash(), collection->size());
273 collection->push_back(newPrepData);
277 StatusCode status_lock =
lock.addOrDelete(std::move(collection));
278 if (status_lock.isFailure()) {
279 ATH_MSG_ERROR(
"Could not insert CscStripPrepdataCollection into CscStripPrepdataContainer...");
280 return StatusCode::FAILURE;
282 return StatusCode::SUCCESS;
297 <<
"Decoding CSC RDO into CSC PrepRawData is switched off");
298 return StatusCode::SUCCESS;
302 collection_iterator rdoColl = rdoContainer->
begin();
303 collection_iterator lastRdoColl = rdoContainer->
end();
304 std::vector<float> charges;
306 std::vector<uint16_t> samples;
310 for (; rdoColl != lastRdoColl; ++rdoColl) {
311 if (!(*rdoColl)->empty()) {
312 ATH_MSG_DEBUG(
" Number of RawData in this rdo " << (*rdoColl)->size());
315 unsigned int samplingTime = cscCollection->
rate();
316 unsigned int numSamples = cscCollection->
numSamples();
319 if (
int(samplingTime) !=
int(
m_cscCalibTool->getSamplingTime())) {
320 ATH_MSG_WARNING(
" CSC sampling time from Collection is NOT consistant to calibTool parameter!!!!!!! ");
329 ATH_MSG_DEBUG(
"CSC RDO ID " << (*rdoColl)->identify() <<
" with hashID " << (*rdoColl)->identifyHash());
332 if (
m_idHelperSvc->cscIdHelper().get_hash(stationId, cscHashId, &cscContext)) {
334 <<
"context begin_index = " << cscContext.
begin_index()
335 <<
" context end_index = " << cscContext.
end_index() <<
" the identifier is "<<stationId);
338 ATH_MSG_DEBUG(
"Create CSC PRD Collection with hash " << cscHashId);
339 std::unique_ptr<CscStripPrepDataCollection> collection =
nullptr;
341 if (
lock.alreadyPresent()) {
342 ATH_MSG_DEBUG(
"CSC PRD collection already exist with collection hash = " << cscHashId <<
" collection filling is skipped!");
345 ATH_MSG_DEBUG(
"CSC PRD collection does not exist - creating a new one with hash = " << cscHashId);
346 collection = std::make_unique<CscStripPrepDataCollection>(cscHashId);
347 collection->setIdentifier(stationId);
351 for (; itD != itD_e; ++itD) {
354 uint16_t totalSamples = (
data->samples()).size();
355 uint32_t hashOffset =
data->hashId();
357 ATH_MSG_DEBUG(
"DecodeAll*Size of online cluster in this RawData: "
358 <<
" Width = " <<
width <<
" Samples = " << totalSamples <<
" stationId : " << stationId
359 <<
" hashOffset : " << hashOffset);
361 for (
unsigned int j = 0; j <
width; ++j) {
363 ATH_MSG_DEBUG(
"DecodeAll**LOOP over width " << j <<
" " << channelId);
369 <<
" Skipping channel ");
371 }
else if (!descriptor->
containsId(channelId)) {
374 <<
"> inconsistent with the geometry of detector element <"
379 float timeOfFirstSample = 0.0;
380 bool extractSamples =
data->samples(j, numSamples, samples);
381 if (!extractSamples) {
382 ATH_MSG_WARNING(
"Unable to extract samples for strip " << j <<
" Online Cluster width = " <<
width
383 <<
" for number of Samples = " << numSamples
384 <<
" continuing ...");
389 if (
m_idHelperSvc->cscIdHelper().get_channel_hash(channelId, stripHash)) {
394 m_idHelperSvc->cscIdHelper().get_id(stripHash, channelIdFromHash, &cscContext);
396 bool adctocharge =
m_cscCalibTool->adcToCharge(samples, stripHash, charges);
399 <<
"CSC PrepData not build ... skipping ");
402 if (samples.size() >= 4)
404 <<
m_idHelperSvc->cscIdHelper().show_to_string(channelId) <<
" " << (
int)stripHash <<
" "
405 <<
m_idHelperSvc->cscIdHelper().show_to_string(channelIdFromHash) <<
" " << samples[0] <<
" "
406 << samples[1] <<
" " << samples[2] <<
" " << samples[3] <<
" Charges: "
407 <<
" " << charges[0] <<
" " << charges[1] <<
" " << charges[2] <<
" " << charges[3]);
408 if (
m_idHelperSvc->cscIdHelper().get_hash(stationId, cscHashId, &cscContext)) {
410 <<
"context begin_index = " << cscContext.
begin_index()
411 <<
" context end_index = " << cscContext.
end_index() <<
" the identifier is "<< stationId);
415 bool IsThisStripDecoded = 0;
419 if (did == channelId) {
420 IsThisStripDecoded = 1;
424 if (IsThisStripDecoded)
continue;
426 int measuresPhi =
m_idHelperSvc->cscIdHelper().measuresPhi(channelId);
430 int chamberLayer =
m_idHelperSvc->cscIdHelper().chamberLayer(channelId);
432 double errPos = stripWidth / sqrt(12.0);
435 covariance.setIdentity();
436 covariance *= errPos * errPos;
441 descriptor, charges, timeOfFirstSample, samplingTime);
444 newPrepData->
setHashAndIndex(collection->identifyHash(), collection->size());
445 collection->push_back(newPrepData);
449 StatusCode status_lock =
lock.addOrDelete(std::move(collection));
450 if (status_lock.isFailure()) {
451 ATH_MSG_ERROR(
"Could not insert CscStripPrepdataCollection into CscStripPrepdataContainer...");
452 return StatusCode::FAILURE;
456 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define AmgSymMatrix(dim)
char data[hepevt_bytes_allocation_ATLAS]
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
Collection of CSC Raw Hits, arranged according to CSC Detector Elements Author: Ketevi A.
bool samplingPhase() const
IdentifierHash identifyHash() const
Returns the OFFLINE identifier hash for this collection.
uint16_t identify() const
access methods
uint16_t numSamples() const
uint8_t rate() const
the rate could be 25 or 50 ns
This container provides access to collections of CSC RDOs and a mechanism for recording them.
Class to hold the electronic output for a single CSC readout channel: n sampling ADC data + the addre...
DataModel_detail::const_iterator< DataVector > const_iterator
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
bool empty() const noexcept
Returns true if the collection is empty.
This class saves the "context" of an expanded identifier (ExpandedIdentifier) for compact or hash ver...
size_type begin_index() const
size_type end_index() const
const_iterator end() const
return const_iterator for end of container
virtual const T * indexFindPtr(IdentifierHash hashId) const override final
return pointer on the found entry or null if out of range using hashed index - fast version,...
size_t size() const
Duplicate of fullSize for backwards compatability.
const_iterator begin() const
return const_iterator for first entry
This is a "hash" representation of an Identifier.
double cathodeReadoutPitch(int chLayer, int measuresPhi) const
double xCoordinateInTrackingFrame(const Identifier &id) const
virtual bool containsId(const Identifier &id) const override
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
const CscReadoutElement * getCscReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
Identifier identify() const override final
Returns the ATLAS Identifier of the MuonReadOutElement.
Class representing the raw data of one CSC strip (for clusters look at Muon::CscPrepData).
void set_samplingPhase()
set the sampling phase
const_pointer_type cptr()
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.
Identifier identify() const
return the identifier
void setHashAndIndex(unsigned short collHash, unsigned short objIndex)
TEMP for testing: might make some classes friends later ...
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 2, 1 > Vector2D
Ensure that the Athena extensions are properly loaded.
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
MuonPrepDataContainerT< CscStripPrepData > CscStripPrepDataContainer
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Ensure that the ATLAS eigen extensions are properly loaded.