11 m_MmIdHelper(nullptr) {}
20 << std::setfill(
' ') << std::setiosflags(std::ios::right) );
26 if(
m_doNtuple and Gaudi::Concurrency::ConcurrencyFlags::numConcurrentEvents() > 1) {
27 ATH_MSG_ERROR(
"DoNtuple is not possible in multi-threaded mode");
28 return StatusCode::FAILURE;
37 return StatusCode::SUCCESS;
42 std::lock_guard guard{m_mutex};
43 if (m_isInitialized) {
47 m_par_large = std::make_shared<MMT_Parameters>(
"xxuvuvxx",
'L', detManager);
48 m_par_small = std::make_shared<MMT_Parameters>(
"xxuvuvxx",
'S', detManager);
54 m_trigger_diamond_ntrig = std::make_shared<MuonVal::VectorBranch<unsigned int> >(
tree,
"MM_diamond_ntrig");
55 m_trigger_diamond_bc = std::make_shared<MuonVal::VectorBranch<int> >(
tree,
"MM_diamond_bc");
56 m_trigger_diamond_sector = std::make_shared<MuonVal::VectorBranch<char> >(
tree,
"MM_diamond_sector");
57 m_trigger_diamond_stationPhi = std::make_shared<MuonVal::VectorBranch<int> >(
tree,
"MM_diamond_stationPhi");
58 m_trigger_diamond_totalCount = std::make_shared<MuonVal::VectorBranch<unsigned int> >(
tree,
"MM_diamond_totalCount");
59 m_trigger_diamond_realCount = std::make_shared<MuonVal::VectorBranch<unsigned int> >(
tree,
"MM_diamond_realCount");
60 m_trigger_diamond_iX = std::make_shared<MuonVal::VectorBranch<int> >(
tree,
"MM_diamond_iX");
61 m_trigger_diamond_iU = std::make_shared<MuonVal::VectorBranch<int> >(
tree,
"MM_diamond_iU");
62 m_trigger_diamond_iV = std::make_shared<MuonVal::VectorBranch<int> >(
tree,
"MM_diamond_iV");
63 m_trigger_diamond_XbkgCount = std::make_shared<MuonVal::VectorBranch<unsigned int> >(
tree,
"MM_diamond_XbkgCount");
64 m_trigger_diamond_UVbkgCount = std::make_shared<MuonVal::VectorBranch<unsigned int> >(
tree,
"MM_diamond_UVbkgCount");
65 m_trigger_diamond_XmuonCount = std::make_shared<MuonVal::VectorBranch<unsigned int> >(
tree,
"MM_diamond_XmuonCount");
66 m_trigger_diamond_UVmuonCount = std::make_shared<MuonVal::VectorBranch<unsigned int> >(
tree,
"MM_diamond_UVmuonCount");
67 m_trigger_diamond_age = std::make_shared<MuonVal::VectorBranch<int> >(
tree,
"MM_diamond_age");
68 m_trigger_diamond_mx = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_diamond_mx");
69 m_trigger_diamond_my = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_diamond_my");
70 m_trigger_diamond_Uavg = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_diamond_Uavg");
71 m_trigger_diamond_Vavg = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_diamond_Vavg");
72 m_trigger_diamond_mxl = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_diamond_mxl");
73 m_trigger_diamond_theta = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_diamond_theta");
74 m_trigger_diamond_eta = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_diamond_eta");
75 m_trigger_diamond_dtheta = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_diamond_dtheta");
76 m_trigger_diamond_phi = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_diamond_phi");
77 m_trigger_diamond_phiShf = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_diamond_phiShf");
78 m_trigger_diamond_TP_phi_id = std::make_shared<MuonVal::VectorBranch<uint8_t> >(
tree,
"MM_diamond_TP_phi_id");
79 m_trigger_diamond_TP_R_id = std::make_shared<MuonVal::VectorBranch<uint8_t> >(
tree,
"MM_diamond_TP_R_id");
80 m_trigger_diamond_TP_dTheta_id = std::make_shared<MuonVal::VectorBranch<uint8_t> >(
tree,
"MM_diamond_TP_dTheta_id");
81 m_trigger_RZslopes = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_RZslopes");
82 m_trigger_trueEtaRange = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_trueEtaRange");
83 m_trigger_truePtRange = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_truePtRange");
84 m_trigger_VMM = std::make_shared<MuonVal::VectorBranch<int> >(
tree,
"MM_VMM");
85 m_trigger_plane = std::make_shared<MuonVal::VectorBranch<int> >(
tree,
"MM_plane");
86 m_trigger_station = std::make_shared<MuonVal::VectorBranch<int> >(
tree,
"MM_station");
87 m_trigger_strip = std::make_shared<MuonVal::VectorBranch<int> >(
tree,
"MM_strip");
88 m_trigger_slope = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_slope");
89 m_trigger_trueThe = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_trueThe");
90 m_trigger_truePhi = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_truePhi");
91 m_trigger_trueDth = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_trueDth");
92 m_trigger_trueEtaEnt = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_trueEtaEnt");
93 m_trigger_trueTheEnt = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_trueTheEnt");
94 m_trigger_truePhiEnt = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_truePhiEnt");
95 m_trigger_trueEtaPos = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_trueEtaPos");
96 m_trigger_trueThePos = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_trueThePos");
97 m_trigger_truePhiPos = std::make_shared<MuonVal::VectorBranch<double> >(
tree,
"MM_truePhiPos");
99 tree.addBranch(m_trigger_diamond_ntrig);
100 tree.addBranch(m_trigger_diamond_bc);
101 tree.addBranch(m_trigger_diamond_sector);
102 tree.addBranch(m_trigger_diamond_stationPhi);
103 tree.addBranch(m_trigger_diamond_totalCount);
104 tree.addBranch(m_trigger_diamond_realCount);
105 tree.addBranch(m_trigger_diamond_iX);
106 tree.addBranch(m_trigger_diamond_iU);
107 tree.addBranch(m_trigger_diamond_iV);
108 tree.addBranch(m_trigger_diamond_XbkgCount);
109 tree.addBranch(m_trigger_diamond_UVbkgCount);
110 tree.addBranch(m_trigger_diamond_XmuonCount);
111 tree.addBranch(m_trigger_diamond_UVmuonCount);
112 tree.addBranch(m_trigger_diamond_age);
113 tree.addBranch(m_trigger_diamond_mx);
114 tree.addBranch(m_trigger_diamond_my);
115 tree.addBranch(m_trigger_diamond_Uavg);
116 tree.addBranch(m_trigger_diamond_Vavg);
117 tree.addBranch(m_trigger_diamond_mxl);
118 tree.addBranch(m_trigger_diamond_theta);
119 tree.addBranch(m_trigger_diamond_eta);
120 tree.addBranch(m_trigger_diamond_dtheta);
121 tree.addBranch(m_trigger_diamond_phi);
122 tree.addBranch(m_trigger_diamond_phiShf);
123 tree.addBranch(m_trigger_diamond_TP_phi_id);
124 tree.addBranch(m_trigger_diamond_TP_R_id);
125 tree.addBranch(m_trigger_diamond_TP_dTheta_id);
126 tree.addBranch(m_trigger_RZslopes);
127 tree.addBranch(m_trigger_trueEtaRange);
128 tree.addBranch(m_trigger_truePtRange);
129 tree.addBranch(m_trigger_VMM);
130 tree.addBranch(m_trigger_plane);
131 tree.addBranch(m_trigger_station);
132 tree.addBranch(m_trigger_strip);
133 tree.addBranch(m_trigger_slope);
134 tree.addBranch(m_trigger_trueThe);
135 tree.addBranch(m_trigger_truePhi);
136 tree.addBranch(m_trigger_trueDth);
137 tree.addBranch(m_trigger_trueEtaEnt);
138 tree.addBranch(m_trigger_trueTheEnt);
139 tree.addBranch(m_trigger_truePhiEnt);
140 tree.addBranch(m_trigger_trueEtaPos);
141 tree.addBranch(m_trigger_trueThePos);
142 tree.addBranch(m_trigger_truePhiPos);
143 return StatusCode::SUCCESS;
148 uint64_t event = ctx.eventID().event_number();
149 ATH_MSG_DEBUG(
"********************************************************* EVENT NUMBER = " <<
event);
160 std::map<std::string, std::shared_ptr<MMT_Parameters> >
pars;
161 pars[
"MML"] = m_par_large;
162 pars[
"MMS"] = m_par_small;
165 std::map<std::pair<uint64_t, unsigned int>,std::vector<digitWrapper> >
entries;
166 std::map<std::pair<uint64_t, unsigned int>,std::vector<hitData_entry> > Hits_Data_Set_Time;
167 std::map<std::pair<uint64_t, unsigned int>,
evInf_entry> Event_Info;
173 if( !readMcEventCollection.
isValid() ){
175 return StatusCode::FAILURE;
177 if(
m_doTruth) ptrMcEventCollection = readMcEventCollection.
cptr();
179 if( !readMuonEntryLayer.
isValid() ){
181 return StatusCode::FAILURE;
187 if( !readMmDigitContainer.
isValid() ){
189 return StatusCode::FAILURE;
192 ATH_CHECK(
load.getMMDigitsInfo(ctx, ptrMcEventCollection, ptrMuonEntryLayer, readMmDigitContainer.
cptr(),
entries, Hits_Data_Set_Time, Event_Info) );
196 Hits_Data_Set_Time.clear();
198 return StatusCode::SUCCESS;
201 std::unique_ptr<MMT_Diamond> diamond = std::make_unique<MMT_Diamond>(detManager);
215 for (
const auto &
it : Event_Info) {
216 double trueta = -999., truphi = -999., trutheta = -999., trupt = -999.,
dt = -999., tpos = -999., ppos = -999.,
epos = -999., tent = -999., pent = -999., eent = -999.;
217 trutheta =
it.second.theta_ip;
218 truphi =
it.second.phi_ip;
219 trueta =
it.second.eta_ip;
220 trupt =
it.second.pt;
221 tpos =
it.second.theta_pos;
222 ppos =
it.second.phi_pos;
224 tent =
it.second.theta_ent;
225 pent =
it.second.phi_ent;
226 eent =
it.second.eta_ent;
227 dt =
it.second.dtheta;
229 m_trigger_trueEtaRange->push_back(trueta);
230 m_trigger_truePtRange->push_back(trupt);
231 m_trigger_trueThe->push_back(trutheta);
232 m_trigger_truePhi->push_back(truphi);
233 m_trigger_trueDth->push_back(
dt);
234 m_trigger_trueEtaPos->push_back(
epos);
235 m_trigger_trueThePos->push_back(tpos);
236 m_trigger_truePhiPos->push_back(ppos);
237 m_trigger_trueEtaEnt->push_back(eent);
238 m_trigger_trueTheEnt->push_back(tent);
239 m_trigger_truePhiEnt->push_back(pent);
245 std::pair<int, unsigned int> pair_event (
event,
i);
248 std::string station =
"-";
249 auto event_it =
entries.find(pair_event);
250 station = event_it->second[0].stName;
253 int stationPhi = -999;
259 auto reco_it = Hits_Data_Set_Time.find(pair_event);
260 if (reco_it != Hits_Data_Set_Time.end()) {
269 for(
const auto &hit : reco_it->second) {
270 m_trigger_VMM->push_back(hit.VMM_chip);
271 m_trigger_plane->push_back(hit.plane);
272 m_trigger_station->push_back(hit.station_eta);
273 m_trigger_strip->push_back(hit.strip);
276 for (
const auto &
s : slopes) m_trigger_RZslopes->push_back(
s);
291 m_trigger_diamond_bc->push_back(slope.BC);
292 m_trigger_diamond_totalCount->push_back(slope.totalCount);
293 m_trigger_diamond_realCount->push_back(slope.realCount);
294 m_trigger_diamond_XbkgCount->push_back(slope.xbkg);
295 m_trigger_diamond_UVbkgCount->push_back(slope.uvbkg);
296 m_trigger_diamond_XmuonCount->push_back(slope.xmuon);
297 m_trigger_diamond_UVmuonCount->push_back(slope.uvmuon);
298 m_trigger_diamond_iX->push_back(slope.iRoad);
299 m_trigger_diamond_iU->push_back(slope.iRoadu);
300 m_trigger_diamond_iV->push_back(slope.iRoadv);
301 m_trigger_diamond_age->push_back(slope.age);
302 m_trigger_diamond_mx->push_back(slope.mx);
303 m_trigger_diamond_my->push_back(slope.my);
304 m_trigger_diamond_Uavg->push_back(slope.uavg);
305 m_trigger_diamond_Vavg->push_back(slope.vavg);
306 m_trigger_diamond_mxl->push_back(slope.mxl);
307 m_trigger_diamond_theta->push_back(slope.theta);
308 m_trigger_diamond_eta->push_back(slope.eta);
309 m_trigger_diamond_dtheta->push_back(slope.dtheta);
310 m_trigger_diamond_phi->push_back(slope.phi);
311 m_trigger_diamond_phiShf->push_back(slope.phiShf);
316 std::vector<int> slopeBC;
318 std::sort(slopeBC.begin(), slopeBC.end());
319 slopeBC.erase( std::unique(slopeBC.begin(), slopeBC.end()), slopeBC.end() );
320 for (
const auto &bc : slopeBC) {
324 if (bc == slope.BC) {
341 if (
m_doNtuple) m_trigger_diamond_TP_phi_id->push_back(phi_id);
344 double extrapolatedR = 7824.46*std::abs(
std::tan(slope.theta));
351 if (extrapolatedR < (
m_rMin+j*Rsteps)) {
358 if (
m_doNtuple) m_trigger_diamond_TP_R_id->push_back(R_id);
374 if (
m_doNtuple) m_trigger_diamond_TP_dTheta_id->push_back(dTheta_id);
377 trigRawDataSegment->
setLowRes(slope.lowRes);
379 trigRawData->
push_back(trigRawDataSegment);
384 ATH_MSG_DEBUG(
"Filled MM RDO container now having size: " << rdo->
size() <<
". Clearing event information!");
388 ATH_MSG_DEBUG(
"Available hits are " << reco_it->second.size() <<
", less than X+UV threshold, skipping" );
397 Hits_Data_Set_Time.clear();
401 return StatusCode::SUCCESS;