18 std::map<std::pair<uint64_t,unsigned int>,std::vector<digitWrapper> >&
entries,
19 std::map<std::pair<uint64_t,unsigned int>,std::vector<hitData_entry> >& Hits_Data_Set_Time,
20 std::map<std::pair<uint64_t,unsigned int>,
evInf_entry>& Event_Info)
const {
22 std::vector<ROOT::Math::PtEtaPhiEVector> truthParticles, truthParticles_ent, truthParticles_pos;
24 std::vector<ROOT::Math::XYZVector>
vertex;
25 float phiEntry_tmp = 0;
26 float phiPosition_tmp = 0;
27 float etaEntry_tmp = 0;
28 float etaPosition_tmp = 0;
30 ROOT::Math::XYZVector vertex_tmp(0.,0.,0.);
32 ROOT::Math::PtEtaPhiEVector thePart, theInfo;
33 auto MuEntry_Particle_n = (trackRecordCollection!=
nullptr)?trackRecordCollection->
size():0;
35 if( truthContainer !=
nullptr ){
36 for(
const auto it : *truthContainer) {
37 const HepMC::GenEvent *subEvent =
it;
38 for(
const auto&
particle : *subEvent){
42 if(trackRecordCollection!=
nullptr){
43 for(
const auto & mit : *trackRecordCollection ) {
44 const CLHEP::Hep3Vector mumomentum = mit.GetMomentum();
45 const CLHEP::Hep3Vector muposition = mit.GetPosition();
48 phiEntry_tmp = mumomentum.getPhi();
49 etaEntry_tmp = mumomentum.getEta();
50 phiPosition_tmp = muposition.getPhi();
51 etaPosition_tmp = muposition.getEta();
56 vertex_tmp = subEvent->vertices().front()->position();
59 for(
const auto vit : subEvent->vertex_range())
63 const HepMC::GenVertex *vertex1 = vit;
64 const HepMC::FourVector& position = vertex1->position();
65 vertex_tmp.SetXYZ(position.x(),position.y(),position.z());
73 for(
unsigned int ipart=0; ipart < truthParticles.size(); ipart++){
74 if( std::abs(thePart.Pt()-truthParticles[ipart].Pt()) < 0.001 ||
75 std::abs(thePart.Eta()-truthParticles[ipart].Eta()) < 0.001 ||
77 std::abs(thePart.E()-truthParticles[ipart].E()) < 0.001 ) addIt =
false;
80 truthParticles.push_back(thePart);
82 vertex.push_back(vertex_tmp);
83 pdg.push_back(pdg_tmp);
84 truthParticles_ent.push_back(ROOT::Math::PtEtaPhiEVector(
momentum.perp(),etaEntry_tmp ,phiEntry_tmp ,
momentum.e()));
85 truthParticles_pos.push_back(ROOT::Math::PtEtaPhiEVector(
momentum.perp(),etaPosition_tmp,phiPosition_tmp,
momentum.e()));
93 uint64_t event = ctx.eventID().event_number();
94 int TruthParticle_n = j;
95 unsigned int digit_particles = 0;
96 for(
auto digitCollectionIter : *nsw_MmDigitContainer) {
100 std::vector<digitWrapper> entries_tmp;
102 for (
const auto item:*digitCollection) {
118 std::vector<float>
time{
digit->stripResponseTime()};
119 std::vector<float>
charge{
digit->stripResponseCharge()};
120 std::vector<int> stripPosition{
channel};
121 std::vector<int> MMFE_VMM{
channel};
125 std::vector<double> localPosX;
126 std::vector<double> localPosY;
127 std::vector<double> globalPosX;
128 std::vector<double> globalPosY;
129 std::vector<double> globalPosZ;
132 for (
const auto &
i: stripPosition) {
137 localPosX.push_back (0.);
138 localPosY.push_back (0.);
139 globalPosX.push_back(0.);
140 globalPosY.push_back(0.);
141 globalPosZ.push_back(0.);
146 ATH_MSG_WARNING(
"MicroMegas digitization: failed to create a valid ID for (chip response) strip n. " << cr_strip
147 <<
"; associated positions will be set to 0.0.");
152 ATH_MSG_WARNING(
"MicroMegas digitization: failed to associate a valid local position for (chip response) strip n. " << cr_strip
153 <<
"; associated positions will be set to 0.0.");
155 localPosX[nstrip-1] = cr_strip_pos.x();
156 localPosY[nstrip-1] = cr_strip_pos.y();
162 globalPosX[nstrip-1] = cr_strip_gpos[0];
163 globalPosY[nstrip-1] = cr_strip_gpos[1];
164 globalPosZ[nstrip-1] = cr_strip_gpos[2];
167 if(globalPosY.empty())
continue;
169 if (!
time.empty()) entries_tmp.push_back(
171 ROOT::Math::XYZVector(-999, -999, -999),
172 ROOT::Math::XYZVector(localPosX[0], localPosY[0], -999),
173 ROOT::Math::XYZVector(globalPosX[0], globalPosY[0], globalPosZ[0] )
177 if (!entries_tmp.empty()) {
178 std::vector<std::string> stNames;
179 for(
const auto &dW : entries_tmp) stNames.push_back(dW.stName);
180 if(std::all_of(stNames.begin(), stNames.end(), [&] (
const std::string &
name) { return name == stNames[0]; })) {
181 entries[std::make_pair(
event,digit_particles)]=entries_tmp;
184 ATH_MSG_WARNING(
"Digits belonging to different stations, skipping items");
190 for(
unsigned int i=0;
i<truthParticles.size();
i++) {
192 truthParticles[
i].
E(), truthParticles[
i].
Pt(),
193 truthParticles[
i].
Eta(), truthParticles_pos[
i].
Eta(), truthParticles_ent[
i].
Eta(),
194 truthParticles[
i].
Phi(), truthParticles_pos[
i].
Phi(), truthParticles_ent[
i].
Phi(),
195 truthParticles[
i].Theta(), truthParticles_pos[
i].Theta(), truthParticles_ent[
i].Theta(), truthParticles_ent[
i].Theta()-truthParticles_pos[
i].Theta(),
196 TruthParticle_n,MuEntry_Particle_n,
vertex[
i]);
197 Event_Info[std::make_pair(
event,
i)] = particle_info;
207 double tru_phi = -999, tru_theta = -999;
208 std::pair<int, unsigned int> pair (
event,ient);
209 auto tru_it = Event_Info.find(pair);
210 if (tru_it != Event_Info.end()) {
211 tru_phi = tru_it->second.phi_pos;
212 tru_theta = tru_it->second.theta_pos;
215 std::string station =
it->second[0].stName;
216 std::vector<hitData_entry> hit_info;
217 hit_info.reserve(
it->second.size());
220 for (
const auto &dW :
it->second) {
224 int thisTime = dW.digit->stripResponseTime();
227 double thisLocalPosX = dW.strip_lpos.X();
229 int thisMMFE_VMM = thisVMM;
232 int thisPlane = (thisMultiplet-1)*4+thisGasGap-1;
233 int BC_id = std::ceil( thisTime / 25. );
234 ROOT::Math::XYZVector mazin_check(
259 hit_info.push_back(hit_entry);
263 Hits_Data_Set_Time[std::make_pair(
event,ient)] = hit_info;
266 return StatusCode::SUCCESS;