13 const IInterface*
p ): base_class(
t,
n,
p),
14 m_accelSvc(
"TrigInDetAccelerationSvc",this->
name()) {
16 declareInterface< ITrigInDetAccelerationTool >(
this );
22 return StatusCode::SUCCESS;
27 typedef struct SpIndexPair {
32 bool operator()(
const std::pair<int, const TrigSiSpacePointBase*>& p1,
const std::pair<int, const TrigSiSpacePointBase*>& p2) {
33 return p1.second->z() < p2.second->z();
39 bool operator()(
const std::pair<int, const TrigSiSpacePointBase*>& p1,
const std::pair<int, const TrigSiSpacePointBase*>& p2) {
40 return p1.second->r() < p2.second->r();
49 const std::vector<short>& pixelLayers =
m_accelSvc->getLayerInformation(1);
50 const std::vector<short>& layerTypes =
m_accelSvc->getLayerInformation(0);
56 const size_t bufferOffset = 256;
57 size_t totalSize = bufferOffset+dataTypeSize;
63 memset(pJ,0,dataTypeSize);
88 bool isRoiFullscan = ((roi->
etaPlus() >= 4) && (roi->
etaMinus() <= -4));
89 if(!(isRoiFullscan || roi->
composite() )){
103 unsigned int nSP = vsp.size();
104 if(nSP >= TrigAccel::ITk::MAX_NUMBER_SPACEPOINTS) {
105 nSP = TrigAccel::ITk::MAX_NUMBER_SPACEPOINTS-1;
106 ATH_MSG_WARNING(
"MAX_NUMBER_SPACEPOINTS exceeded, exported data truncated ...");
112 int nLayers =
static_cast<int>(layerTypes.size());
115 std::vector<std::vector<std::pair<int, const TrigSiSpacePointBase*> > > phiLArray;
116 phiLArray.resize(nLayers*nSlices);
118 for(
unsigned int i=0;
i<nSP;
i++) {
123 short layerId = pixelLayers[hashId];
125 int phiIdx = (sp.
phi()+
M_PI)/phiSliceWidth;
129 else if (phiIdx < 0) {
134 std::vector<std::pair<int, const TrigSiSpacePointBase*> >&
v = phiLArray[layerId + phiIdx*nLayers];
135 v.push_back(std::pair<int, const TrigSiSpacePointBase*>(
i,&sp));
140 for(std::vector<short>::const_iterator
it = layerTypes.begin();
it!=layerTypes.end();++
it, layerIdx++) {
141 short barrel_ec = (*it);
143 std::vector<std::pair<int, const TrigSiSpacePointBase*> >&
v = phiLArray[layerIdx +
slice*nLayers];
144 if(barrel_ec==0) std::sort(
v.begin(),
v.end(), SP_INDEX_PAIR::compareZ());
145 else std::sort(
v.begin(),
v.end(), SP_INDEX_PAIR::compareR());
157 int layerStart = spIdx;
159 std::vector<std::pair<int, const TrigSiSpacePointBase*> >&
v = phiLArray[
layer +
slice*nLayers];
160 for(std::vector<std::pair<int, const TrigSiSpacePointBase*> >::
iterator it =
v.begin();
it!=
v.end();++
it) {
165 if (!
isBarrel && clusterWidth > 0.2)
continue;
167 sps.
m_index[spIdx] = (*it).first;
169 sps.
m_x[spIdx] = sp->
x();
170 sps.
m_y[spIdx] = sp->
y();
171 sps.
m_z[spIdx] = sp->
z();
172 sps.
m_r[spIdx] = sp->
r();
179 int layerEnd = spIdx;
198 for(
int k=0;
k<nTriplets;
k++) {
205 output.emplace_back(SPi, SPm, SPo, pOutput->
m_Q[
k]);
213 else return 0.02*0.02;
218 else return 0.01*0.01;