132 {
133
134 constexpr std::array<int,19> calo_numbers{1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
135 constexpr std::array<int,12> fixed_r_numbers = {1,2,3,12,13,14,15,16,17,18,19,20};
136 constexpr std::array<double,12> fixed_r_vals = {1532.18, 1723.89, 1923.02, 2450.00, 2995.00, 3630.00, 3215.00,
137 3630.00, 2246.50, 2450.00, 2870.00, 3480.00
138 };
139 constexpr std::array<int, 7> fixed_z_numbers = {5,6,7,8,9,10,11};
140 constexpr std::array<double, 7> fixed_z_vals = {3790.03, 3983.68, 4195.84, 4461.25, 4869.50, 5424.50, 5905.00};
141 std::unordered_map<int, double> r_calo_dict;
142 std::unordered_map<int, double> z_calo_dict;
143 for(
size_t i=0;
i<fixed_r_vals.size();
i++) r_calo_dict[fixed_r_numbers[i]] = fixed_r_vals[i];
144 for(
size_t i=0;
i<fixed_z_numbers.size();
i++) z_calo_dict[fixed_z_numbers[i]] = fixed_z_vals[i];
145
146 std::vector<float> inputnn;
147 inputnn.assign(5430, 0.0);
148 std::vector<eflowRecCluster*> matchedClusters;
149 const std::vector<eflowTrackClusterLink*>&
links =
ptr->getClusterMatches();
150
153
154 const std::array<double, 2>
track{
ptr->getTrack()->eta(),
ptr->getTrack()->phi()};
155
156 for(auto *clink : links){
157 auto *
cell = clink->getCluster()->getCluster();
158 float clusterE =
cell->e()*1
e-3;
159 float clusterEta =
cell->eta();
160
161 if (clusterE < 0.0 || clusterE > 1e4f || std::abs(clusterEta) > 2.5) continue;
162
163 constexpr bool cutOnR = false;
164 if(cutOnR){
165 std::array<double, 2>
p{clink->getCluster()->getCluster()->eta(), clink->getCluster()->getCluster()->phi()};
166 double part1 =
p[0] -
track[0];
167 double part2 =
p[1] -
track[1];
168 while(part1 >
M_PI) part1 -= 2*
M_PI;
169 while(part1 < -
M_PI) part1 += 2*
M_PI;
170 while(part2 >
M_PI) part2 -= 2*
M_PI;
171 while(part2 < -
M_PI) part2 += 2*
M_PI;
172 double R = std::sqrt(part1 * part1 + part2*part2);
173 if(R >= 1.2) continue;
174 }
175
176 matchedClusters.push_back(clink->getCluster());
177 }
178
179 std::vector<std::array<double, 5>>
cells;
180
181 const eflowTrackCaloPoints& trackCaloPoints =
ptr->getTrackCaloPoints();
182 bool trk_bool_em[2] = {false,false};
185 double eta_ctr;
186 double phi_ctr;
187 for(
int i =0;
i<2;
i++) {
188 trk_bool_em[
i] = std::abs(trk_em_eta[i]) < 2.5 && std::abs(trk_em_phi[i]) <=
M_PI;
189 }
190 int nProj_em = (
int)trk_bool_em[0] + (
int)trk_bool_em[1];
191
192 if(nProj_em ==1) {
193 eta_ctr = trk_bool_em[0] ? trk_em_eta[0] : trk_em_eta[1];
194 phi_ctr = trk_bool_em[0] ? trk_em_phi[0] : trk_em_phi[1];
195 } else if(nProj_em==2) {
196 eta_ctr = (trk_em_eta[0] + trk_em_eta[1]) / 2.0;
197 phi_ctr = (trk_em_phi[0] + trk_em_phi[1]) / 2.0;
198 } else {
199 eta_ctr =
ptr->getTrack()->eta();
200 phi_ctr =
ptr->getTrack()->phi();
201 }
202
203
204
205 for(
auto *
cptr : matchedClusters){
206 auto *clustlink =
cptr->getCluster();
207
208 for(auto it_cell = clustlink->cell_begin(); it_cell != clustlink->cell_end(); it_cell++){
209 const CaloCell*
cell = (*it_cell);
210 float cellE =
cell->e()*(it_cell.weight())*1e-3f;
211 if(cellE < 0.005) continue;
212 const auto *theDDE=it_cell->caloDDE();
213 double cx=theDDE->x();
214 double cy=theDDE->y();
215
216 cells.emplace_back( std::array<double, 5> { cellE,
217 theDDE->eta() - eta_ctr,
218 theDDE->phi() - phi_ctr,
219 std::hypot(cx,cy),
220 0.0 } );
221 }
222 }
223
224
225 std::vector<bool> trk_bool(calo_numbers.size(), false);
226 std::vector<std::array<double,4>> trk_full(calo_numbers.size());
227 for(
size_t j=0;
j<phitotal.size();
j++) {
228 int cnum = calo_numbers[
j];
229 double eta = etatotal[
j];
230 double phi = phitotal[
j];
231 if(std::abs(
eta) < 2.5 && std::abs(
phi) <=
M_PI) {
233 trk_full[
j][0] =
eta;
234 trk_full[
j][1] =
phi;
235 trk_full[
j][3] = cnum;
236 double rPerp =-99999;
237 if(auto itr = r_calo_dict.find(cnum); itr != r_calo_dict.end()) rPerp = itr->second;
238 else if(auto itr = z_calo_dict.find(cnum); itr != z_calo_dict.end())
239 {
240 double z = itr->second;
242 double aeta = std::abs(
eta);
243 rPerp =
z*2.*std::exp(aeta)/(std::exp(2.0*aeta)-1.0);
244 }else rPerp =0.0;
245 } else {
246 throw std::runtime_error("Calo sample num not found in dicts..");
247 }
248 trk_full[
j][2] = rPerp;
249 } else {
250 trk_full[
j].fill(0.0);
251 }
252 }
253 double trackP = std::abs(1. /
ptr->getTrack()->qOverP()) * 1
e-3;
254 int trk_proj_num = std::accumulate(trk_bool.begin(), trk_bool.end(), 0);
255 if(trk_proj_num ==0) {
256 trk_proj_num =1;
257 std::array<double,5> trk_arr{};
258
259 trk_arr[0] = trackP;
260 trk_arr[1] =
ptr->getTrack()->eta() - eta_ctr;
261 trk_arr[2] =
ptr->getTrack()->phi() - phi_ctr;
262 trk_arr[3] = 1532.18;
263 trk_arr[4] = 1.;
264
265 cells.emplace_back(trk_arr);
266 } else {
267 for(
size_t i =0;
i<calo_numbers.size();
i++) {
268 if(!trk_bool[i]) continue;
269 std::array<double,5> trk_arr{};
270 trk_arr[0]= trackP/
double(trk_proj_num);
271 trk_arr[1]= trk_full[
i][0] - eta_ctr;
272 trk_arr[2]= trk_full[
i][1] - phi_ctr;
273 trk_arr[3]= trk_full[
i][2];
274 trk_arr[4]= 1.;
275
276 cells.emplace_back(trk_arr);
277 }
278 }
279
281 for(auto &in : cells){
282 std::copy(in.begin(), in.end(), inputnn.begin() + index);
284 if(index >= static_cast<int>(inputnn.size()-4)) {
286 break;
287 }
288 }
289
290
292
295 return predictedEnergy;
296
297}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
ElementConstPointer cptr() const
Return a pointer to the referenced element.
double getPhi(eflowCalo::LAYER layer) const
double getEta(eflowCalo::LAYER layer) const
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)