CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Types | Public Member Functions | Static Public Member Functions | Private Types | Static Private Member Functions
sistrip::SpyDigiConverter Class Reference

Converts scope mode like digis into virgin raw like digis by: -extracting the frame payload, -reordering to physical order and -merging the DetSets indexed by FedKey to DetSets indexed by DetId. More...

#include <SiStripSpyDigiConverter.h>

Public Types

typedef edm::DetSetVector
< SiStripRawDigi
DSVRawDigis
 

Public Member Functions

 SpyDigiConverter ()
 
 ~SpyDigiConverter ()
 

Static Public Member Functions

static std::auto_ptr< DSVRawDigisextractPayloadDigis (const DSVRawDigis *inputScopeDigis, std::vector< uint32_t > *pAPVAddresses, const bool discardDigisWithAPVAddrErr, const sistrip::SpyUtilities::FrameQuality &aQuality, const uint16_t expectedPos)
 Extract frames from the scope digis. More...
 
static std::auto_ptr< DSVRawDigismergeModuleChannels (const DSVRawDigis *inputPhysicalOrderChannelDigis, const SiStripFedCabling &cabling)
 
static std::auto_ptr< DSVRawDigisreorderDigis (const DSVRawDigis *inputPayloadDigis)
 

Private Types

typedef DSVRawDigis::detset DetSetRawDigis
 

Static Private Member Functions

static void processFED (const uint16_t aPreviousFedId, const bool discardDigisWithAPVAddrErr, std::vector< uint32_t > *pAPVAddresses, std::vector< DetSetRawDigis > &outputData, std::vector< uint16_t > &aAddrVec, std::vector< uint16_t > &aHeaderBitVec, std::vector< DSVRawDigis::const_iterator > &aFedScopeDigis)
 

Detailed Description

Converts scope mode like digis into virgin raw like digis by: -extracting the frame payload, -reordering to physical order and -merging the DetSets indexed by FedKey to DetSets indexed by DetId.

Definition at line 25 of file SiStripSpyDigiConverter.h.

Member Typedef Documentation

Definition at line 53 of file SiStripSpyDigiConverter.h.

Definition at line 28 of file SiStripSpyDigiConverter.h.

Constructor & Destructor Documentation

sistrip::SpyDigiConverter::SpyDigiConverter ( )
inline

Definition at line 31 of file SiStripSpyDigiConverter.h.

31 {}
sistrip::SpyDigiConverter::~SpyDigiConverter ( )
inline

Definition at line 32 of file SiStripSpyDigiConverter.h.

32 {}

Member Function Documentation

std::auto_ptr< SpyDigiConverter::DSVRawDigis > sistrip::SpyDigiConverter::extractPayloadDigis ( const DSVRawDigis inputScopeDigis,
std::vector< uint32_t > *  pAPVAddresses,
const bool  discardDigisWithAPVAddrErr,
const sistrip::SpyUtilities::FrameQuality aQuality,
const uint16_t  expectedPos 
)
static

Extract frames from the scope digis.

If pAPVAddress is set, the map is filled with a map from FedKey to APVAddress. minAllowedRange is the min allowed range of digis when determine the threshold.

Definition at line 24 of file SiStripSpyDigiConverter.cc.

References sistrip::SpyUtilities::Frame::apvAddress, edm::DetSetVector< T >::begin(), edm::DetSetVector< T >::end(), sistrip::SpyUtilities::extractFrameInfo(), sistrip::FED_ID_MAX, sistrip::FEDCH_PER_FED, sistrip::SpyUtilities::Frame::firstHeaderBit, sistrip::SpyUtilities::isValid(), sistrip::SpyUtilities::print(), processFED(), edm::DetSetVector< T >::size(), and sistrip::SPY_SAMPLES_PER_CHANNEL.

Referenced by sistrip::SpyDigiConverterModule::produce().

29  {
30  // Data is already sorted so push back fast into vector to avoid sorts and create DSV later
31  std::vector<DetSetRawDigis> outputData;
32  outputData.reserve(inputScopeDigis->size());
33 
34  //APV address vector indexed by fedid, majority value written.
35  pAPVAddresses->resize(sistrip::FED_ID_MAX+1,0);
36  std::vector<uint16_t> lAddrVec;
37  lAddrVec.reserve(2*sistrip::FEDCH_PER_FED);
38  uint16_t lPreviousFedId = 0;
39  std::vector<uint16_t> lHeaderBitVec;
40  lHeaderBitVec.reserve(sistrip::FEDCH_PER_FED);
41 
42 
43  //local DSVRawDigis per FED
44  std::vector<DSVRawDigis::const_iterator> lFedScopeDigis;
45  lFedScopeDigis.reserve(sistrip::FEDCH_PER_FED);
46 
47  // Loop over channels in input collection
48  DSVRawDigis::const_iterator inputChannel = inputScopeDigis->begin();
49  const DSVRawDigis::const_iterator endChannels = inputScopeDigis->end();
50  bool hasBeenProcessed = false;
51 
52  for (; inputChannel != endChannels; ++inputChannel) {
53 
54  // Fill frame parameters. Second parameter is to print debug info (if logDebug enabled....)
56 
57  const uint32_t lFedIndex = inputChannel->detId();
58  const uint16_t fedId = static_cast<uint16_t>(lFedIndex/sistrip::FEDCH_PER_FED);
59  const uint16_t fedCh = static_cast<uint16_t>(lFedIndex%sistrip::FEDCH_PER_FED);
60 
61  if (lPreviousFedId == 0) {
62  lPreviousFedId = fedId;
63  }
64 
65  //print out warning only for non-empty frames....
66  if (!sistrip::SpyUtilities::isValid(lFrame,aQuality,expectedPos) && lFrame.firstHeaderBit < sistrip::SPY_SAMPLES_PER_CHANNEL) {
67  edm::LogWarning("SiStripSpyDigiConverter") << " FED ID: " << fedId << ", channel: " << fedCh << std::endl
69  std::string(" -- Invalid Frame ")
70  );
71 
72  continue;
73  }
74 
75  //fill local vectors per FED
76  if (fedId == lPreviousFedId) {
77  if (hasBeenProcessed) hasBeenProcessed = false;
78  }
79  if (fedId != lPreviousFedId) {
80  SpyDigiConverter::processFED(lPreviousFedId,
81  discardDigisWithAPVAddrErr,
82  pAPVAddresses,
83  outputData,
84  lAddrVec,
85  lHeaderBitVec,
86  lFedScopeDigis
87  );
88  lPreviousFedId = fedId;
89  hasBeenProcessed = true;
90  }
91  lFedScopeDigis.push_back(inputChannel);
92  lAddrVec.push_back(lFrame.apvAddress.first);
93  lAddrVec.push_back(lFrame.apvAddress.second);
94  lHeaderBitVec.push_back(lFrame.firstHeaderBit);
95 
96 
97  } // end of loop over channels.
98 
99  //process the last one if not already done.
100  if (!hasBeenProcessed) {
101  SpyDigiConverter::processFED(lPreviousFedId,
102  discardDigisWithAPVAddrErr,
103  pAPVAddresses,
104  outputData,
105  lAddrVec,
106  lHeaderBitVec,
107  lFedScopeDigis
108  );
109  }
110 
111  //return DSV of output
112  return std::auto_ptr<DSVRawDigis>( new DSVRawDigis(outputData, true) );
113 
114  } // end of SpyDigiConverter::extractPayloadDigis method
static const bool isValid(const Frame &aFrame, const FrameQuality &aQuality, const uint16_t aExpectedPos)
static const uint16_t SPY_SAMPLES_PER_CHANNEL
std::pair< uint8_t, uint8_t > apvAddress
static const Frame extractFrameInfo(const edm::DetSetVector< SiStripRawDigi >::detset &channelDigis, bool aPrintDebug=false)
static void processFED(const uint16_t aPreviousFedId, const bool discardDigisWithAPVAddrErr, std::vector< uint32_t > *pAPVAddresses, std::vector< DetSetRawDigis > &outputData, std::vector< uint16_t > &aAddrVec, std::vector< uint16_t > &aHeaderBitVec, std::vector< DSVRawDigis::const_iterator > &aFedScopeDigis)
edm::DetSetVector< SiStripRawDigi > DSVRawDigis
static const uint16_t FEDCH_PER_FED
static const uint16_t FED_ID_MAX
static std::string print(const Frame &aFrame, std::string aErr)
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:105
std::auto_ptr< SpyDigiConverter::DSVRawDigis > sistrip::SpyDigiConverter::mergeModuleChannels ( const DSVRawDigis inputPhysicalOrderChannelDigis,
const SiStripFedCabling cabling 
)
static

Definition at line 206 of file SiStripSpyDigiConverter.cc.

References sistrip::DetSetVectorFiller< T, dsvIsSparse >::addItem(), SiStripFedCabling::connections(), sistrip::DetSetVectorFiller< T, dsvIsSparse >::createDetSetVector(), edm::DetSetVector< T >::end(), sistrip::FED_ID_MAX, sistrip::FED_ID_MIN, sistrip::FEDCH_PER_FED, SiStripFedKey::fedIndex(), SiStripFedCabling::feds(), edm::DetSetVector< T >::find(), sistrip::invalid32_, sistrip::DetSetVectorFiller< T, dsvIsSparse >::newChannel(), and sistrip::STRIPS_PER_FEDCH.

Referenced by sistrip::SpyDigiConverterModule::produce().

208  {
209  // Create filler for detSetVector to create output (with maximum number of DetSets and digis)
210  uint16_t nFeds = static_cast<uint16_t>( FED_ID_MAX - FED_ID_MIN + 1);
211 
213  // Loop over FEDs in cabling
214  std::vector<uint16_t>::const_iterator iFed = cabling.feds().begin();
215  const std::vector<uint16_t>::const_iterator endFeds = cabling.feds().end();
216  for (; iFed != endFeds; ++iFed) {
217  // Loop over cabled channels
218  const std::vector<FedChannelConnection>& conns = cabling.connections(*iFed);
219  std::vector<FedChannelConnection>::const_iterator iConn = conns.begin();
220  const std::vector<FedChannelConnection>::const_iterator endConns = conns.end();
221  for (; iConn != endConns; ++iConn) {
222  // Skip channels not connected to a detector.
223  if (!iConn->isConnected()) continue;
224  if (iConn->detId() == sistrip::invalid32_) continue;
225 
226  // Find the data from the input collection
227  const uint32_t fedIndex = SiStripFedKey::fedIndex(iConn->fedId(),iConn->fedCh());
228  const DSVRawDigis::const_iterator iDetSet = inputPhysicalOrderChannelDigis->find(fedIndex);
229  if (iDetSet == inputPhysicalOrderChannelDigis->end()) {
230  // NOTE: It will display this warning if channel hasn't been unpacked...
231  // Will comment out for now.
232  //edm::LogWarning("SiStripSpyDigiConverter") << "No data found for FED ID: " << iConn->fedId() << " channel: " << iConn->fedCh();
233  continue;
234  }
235 
236  // Start a new channel indexed by the detId in the filler
237  dsvFiller.newChannel(iConn->detId(),iConn->apvPairNumber()*STRIPS_PER_FEDCH);
238 
239  // Add the data
240  DetSetRawDigis::const_iterator iDigi = iDetSet->begin();
241  const DetSetRawDigis::const_iterator endDetSetDigis = iDetSet->end();
242  for (; iDigi != endDetSetDigis; ++iDigi) {
243  dsvFiller.addItem(*iDigi);
244  } // end of loop over the digis.
245  } // end of loop over channels.
246  } // end of loop over FEDs
247 
248  return dsvFiller.createDetSetVector();
249  } // end of SpyDigiConverter::mergeModuleChannels method.
static const uint16_t FED_ID_MIN
const std::vector< uint16_t > & feds() const
static const uint32_t invalid32_
Definition: Constants.h:16
static uint32_t fedIndex(const uint16_t &fed_id, const uint16_t &fed_ch)
DetSetVectorFiller< SiStripRawDigi, false > RawDigiDetSetVectorFiller
static const uint16_t STRIPS_PER_FEDCH
static const uint16_t FEDCH_PER_FED
static const uint16_t FED_ID_MAX
collection_type::const_iterator const_iterator
Definition: DetSet.h:31
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:105
const std::vector< FedChannelConnection > & connections(uint16_t fed_id) const
void sistrip::SpyDigiConverter::processFED ( const uint16_t  aPreviousFedId,
const bool  discardDigisWithAPVAddrErr,
std::vector< uint32_t > *  pAPVAddresses,
std::vector< DetSetRawDigis > &  outputData,
std::vector< uint16_t > &  aAddrVec,
std::vector< uint16_t > &  aHeaderBitVec,
std::vector< DSVRawDigis::const_iterator > &  aFedScopeDigis 
)
staticprivate

Definition at line 117 of file SiStripSpyDigiConverter.cc.

References filterCSVwithJSON::copy, sistrip::FEDCH_PER_FED, sistrip::SpyUtilities::findMajorityValue(), and sistrip::STRIPS_PER_FEDCH.

Referenced by extractPayloadDigis().

125  {
126 
127  //extract majority address
128  uint32_t lMaj = sistrip::SpyUtilities::findMajorityValue(aAddrVec,aPreviousFedId).first;
129  if (pAPVAddresses) (*pAPVAddresses)[aPreviousFedId] = lMaj;
130 
131  //loop over iterators and fill payload
132  std::vector<DSVRawDigis::const_iterator>::iterator lIter;
133  unsigned int lCh = 0;
134  for (lIter = aFedScopeDigis.begin(); lIter != aFedScopeDigis.end(); ++lIter,++lCh) {
135 
136  //discard if APV address different from majority.
137  //Keep if only one of them is wrong: the other APV might be alright ??
138 
139  if ( discardDigisWithAPVAddrErr &&
140  aAddrVec[2*lCh] != lMaj &&
141  aAddrVec[2*lCh+1] != lMaj ) {
142  continue;
143  }
144 
145  DetSetRawDigis::const_iterator iDigi = (*lIter)->begin();
146  const DetSetRawDigis::const_iterator endOfChannel = (*lIter)->end();
147 
148  if (iDigi == endOfChannel) {
149  continue;
150  }
151 
152  //header starts in sample firstHeaderBit and is 18+6 samples long
153  const DetSetRawDigis::const_iterator payloadBegin = iDigi+aHeaderBitVec[lCh]+24;
154  const DetSetRawDigis::const_iterator payloadEnd = payloadBegin + STRIPS_PER_FEDCH;
155 
156 
157  // Copy data into output collection
158  // Create new detSet with same key (in this case it is the fedKey, not detId)
159  outputData.push_back( DetSetRawDigis((*lIter)->detId()) );
160  std::vector<SiStripRawDigi>& outputDetSetData = outputData.back().data;
161  outputDetSetData.resize(STRIPS_PER_FEDCH);
162  std::vector<SiStripRawDigi>::iterator outputBegin = outputDetSetData.begin();
163  std::copy(payloadBegin, payloadEnd, outputBegin);
164 
165  }
166 
167  aFedScopeDigis.clear();
168  aAddrVec.clear();
169  aHeaderBitVec.clear();
170 
171  aAddrVec.reserve(2*sistrip::FEDCH_PER_FED);
172  aHeaderBitVec.reserve(sistrip::FEDCH_PER_FED);
173  aFedScopeDigis.reserve(sistrip::FEDCH_PER_FED);
174 
175 
176  }
DSVRawDigis::detset DetSetRawDigis
static std::pair< uint16_t, uint32_t > findMajorityValue(std::vector< uint16_t > &values, const uint16_t aFedId=0)
static const uint16_t STRIPS_PER_FEDCH
static const uint16_t FEDCH_PER_FED
collection_type::const_iterator const_iterator
Definition: DetSet.h:31
std::auto_ptr< SpyDigiConverter::DSVRawDigis > sistrip::SpyDigiConverter::reorderDigis ( const DSVRawDigis inputPayloadDigis)
static

Definition at line 181 of file SiStripSpyDigiConverter.cc.

References edm::DetSetVector< T >::begin(), edm::DetSetVector< T >::end(), sistrip::FEDStripOrdering::physicalOrderForStripInChannel(), edm::DetSetVector< T >::size(), and sistrip::STRIPS_PER_FEDCH.

Referenced by sistrip::SpyDigiConverterModule::produce().

182  {
183  // Data is already sorted so push back fast into vector to avoid sorts and create DSV later
184  std::vector<DetSetRawDigis> outputData;
185  outputData.reserve(inputPayloadDigis->size());
186 
187  // Loop over channels in input collection
188  for (DSVRawDigis::const_iterator inputChannel = inputPayloadDigis->begin(); inputChannel != inputPayloadDigis->end(); ++inputChannel) {
189  const std::vector<SiStripRawDigi>& inputDetSetData = inputChannel->data;
190  // Create new detSet with same key (in this case it is the fedKey, not detId)
191  outputData.push_back( DetSetRawDigis(inputChannel->detId()) );
192  std::vector<SiStripRawDigi>& outputDetSetData = outputData.back().data;
193  outputDetSetData.resize(STRIPS_PER_FEDCH);
194  // Copy the data into the output vector reordering
195  for (uint16_t readoutOrderStripIndex = 0; readoutOrderStripIndex < inputDetSetData.size(); ++readoutOrderStripIndex) {
196  const uint16_t physicalOrderStripIndex = FEDStripOrdering::physicalOrderForStripInChannel(readoutOrderStripIndex);
197  outputDetSetData.at(physicalOrderStripIndex) = inputDetSetData.at(readoutOrderStripIndex);
198  }
199  }
200 
201  //return DSV of output
202  return std::auto_ptr<DSVRawDigis>( new DSVRawDigis(outputData,true) );
203  } // end of SpyDigiConverter::reorderDigis method.
static uint8_t physicalOrderForStripInChannel(const uint8_t readoutOrderStripIndexInChannel)
DSVRawDigis::detset DetSetRawDigis
static const uint16_t STRIPS_PER_FEDCH
edm::DetSetVector< SiStripRawDigi > DSVRawDigis
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:105