17 #include "canvas/Persistency/Common/FindManyP.h" 37 #include "TMathBase.h" 50 std::vector<double>
const fCuts;
65 ,
fCuts{pset.get<std::vector<double>>(
"Cuts")}
66 ,
fDCenter{pset.get<
double>(
"DCenter")}
67 ,
fDelay{pset.get<
double>(
"Delay")}
69 ,
fMaxIon{pset.get<
double>(
"MaxIon")}
79 auto const clockData =
85 double drift = detProp.DriftVelocity(detProp.Efield(), detProp.Temperature()) *
90 int vPlane = geom->
Nplanes() - 1;
92 int uPlane = vPlane - 1;
100 clusters.
reserve(clustHandle->size());
101 for (
unsigned int i = 0; i < clustHandle->size(); ++i) {
104 double indIon(0), colIon(0);
105 std::map<int, int> indMap;
106 std::map<int, int> colMap;
107 std::vector<std::pair<int, int>> rLook;
109 std::vector<std::vector<double>> tGoing;
110 std::vector<std::vector<double>> matched;
111 std::vector<double> pointTemp(6);
112 std::pair<int, int> pairTemp;
116 std::vector<art::Ptr<recob::Hit>> hits = fmh.at(
cluster);
117 for (
unsigned int hit = 0;
hit < hits.size();
hit++) {
118 ionSum += hits[
hit]->PeakAmplitude();
125 mf::LogInfo(
"MuonFilter") <<
"Ionizations: " << indIon <<
" " << colIon;
130 lineVec.
reserve(lines->size());
131 for (
unsigned int i = 0; i < lines->size(); ++i) {
135 for (
size_t cl = 0;
cl < clusters.
size();
cl++) {
136 std::vector<art::Ptr<recob::Hit>> hits = fmh.at(
cl);
137 if (hits.size() > 0 && clusters[
cl]->View() == uView)
139 else if (hits.size() > 0 && clusters[
cl]->View() == vView)
140 collectionSegments.
push_back(clusters[cl]);
146 if (inductionSegments.
size() == 0 || collectionSegments.
size() == 0) {
147 mf::LogInfo(
"MuonFilter") <<
"At least one plane with no track";
151 for (
unsigned int i = 0; i < inductionSegments.
size(); i++) {
152 if (indMap[i])
continue;
153 for (
unsigned int j = 0; j < collectionSegments.
size(); j++) {
154 if (colMap[j])
continue;
159 std::vector<art::Ptr<recob::Hit>> indHits = fmhi.
at(i);
161 std::vector<art::Ptr<recob::Hit>> colHits = fmhc.at(j);
166 double trk2End = colSeg->
EndTick();
171 int const vPos2 = colSeg->
EndWire();
172 mf::LogInfo(
"MuonFilter") <<
"I J " << i <<
" " << j;
177 <<
"U's " << uPos1 <<
" " << uPos2 <<
"V's " << vPos1 <<
" " << vPos2 <<
" times " 178 << trk1End <<
" " << trk2End <<
" " << trk1Start <<
" " << trk2Start;
191 if ((TMath::Abs(trk1Start - trk2Start) >
fTolerance &&
192 TMath::Abs(trk1End - trk2End) >
fTolerance) &&
193 (TMath::Abs(trk1Start - trk2End) <
fTolerance &&
194 TMath::Abs(trk1End - trk2Start) <
fTolerance)) {
200 <<
"Times: " << trk1Start <<
" " << trk2Start <<
" " << trk1End <<
" " << trk2End;
205 if ((TMath::Abs(trk1Start - trk2Start) <
fTolerance &&
206 TMath::Abs(trk1End - trk2End) <
fTolerance) &&
207 (TMath::Abs(uPos1 - vPos1) <=
fDeltaWire + 2 &&
208 TMath::Abs(uPos2 - vPos2) <=
fDeltaWire + 2)) {
214 double y1, y2, z1, z2;
218 double const x1 = (trk1Start + trk2Start) / 2.0 * drift -
fDCenter;
219 double const x2 = (trk1End + trk2End) / 2.0 * drift -
fDCenter;
220 mf::LogInfo(
"MuonFilter") <<
"Match " << matchNum <<
" " << x1 <<
" " << y1 <<
" " << z1
221 <<
" " << x2 <<
" " << y2 <<
" " << z2;
222 bool x1edge, x2edge, y1edge, y2edge, z1edge, z2edge;
223 indMap[i] = matchNum;
224 colMap[j] = matchNum;
232 x1edge = (TMath::Abs(x1) -
fCuts[0] > 0);
233 x2edge = (TMath::Abs(x2) -
fCuts[0] > 0);
234 y1edge = (TMath::Abs(y1) -
fCuts[1] > 0);
235 y2edge = (TMath::Abs(y2) -
fCuts[1] > 0);
236 z1edge = (TMath::Abs(z1) -
fCuts[2] > 0);
237 z2edge = (TMath::Abs(z2) -
fCuts[2] > 0);
238 if ((x1edge || y1edge || z1edge) && (x2edge || y2edge || z2edge)) {
239 tGoing.push_back(pointTemp);
240 mf::LogInfo(
"MuonFilter") <<
"outside Removed induction ion: ";
242 for (
size_t h = 0;
h < indHits.size();
h++) {
243 mf::LogInfo(
"MuonFilter") << indHits[
h]->PeakAmplitude() <<
" ";
244 indIon -= indHits[
h]->PeakAmplitude();
246 mf::LogInfo(
"MuonFilter") <<
"Removed collection ion: ";
248 for (
size_t h = 0;
h < colHits.size();
h++) {
249 mf::LogInfo(
"MuonFilter") << colHits[
h]->PeakAmplitude() <<
" ";
250 colIon -= colHits[
h]->PeakAmplitude();
253 <<
"Ionization outside track I/C: " << indIon <<
" " << colIon;
255 else if ((x1edge || y1edge || z1edge) && !(x2edge || y2edge || z2edge) &&
257 tGoing.push_back(pointTemp);
258 mf::LogInfo(
"MuonFilter") <<
"stopping Removed induction ion: ";
259 for (
size_t h = 0;
h < indHits.size();
h++) {
260 mf::LogInfo(
"MuonFilter") << indHits[
h]->PeakAmplitude() <<
" ";
261 indIon -= indHits[
h]->PeakAmplitude();
263 mf::LogInfo(
"MuonFilter") <<
"Removed collection ion: ";
264 for (
size_t h = 0;
h < colHits.size();
h++) {
265 mf::LogInfo(
"MuonFilter") << colHits[
h]->PeakAmplitude() <<
" ";
266 colIon -= colHits[
h]->PeakAmplitude();
269 <<
"Ionization outside track I/C: " << indIon <<
" " << colIon;
272 pairTemp = std::make_pair(i, j);
273 mf::LogInfo(
"MuonFilter") <<
"rLook matchnum " << matchNum <<
" " << i <<
" " << j;
274 rLook.push_back(pairTemp);
275 matched.push_back(pointTemp);
284 for (
unsigned int i = 0; i < tGoing.size(); i++)
285 for (
unsigned int j = 0; j < matched.size(); j++) {
286 mf::LogInfo(
"MuonFilter") << tGoing.size() <<
" " << matched.size() <<
" " << i <<
" " << j;
288 if ((tGoing[i][2] <= matched[j][2]) && (tGoing[i][5] >= matched[j][5])) {
289 TVector3
a1(&tGoing[i][0]);
290 TVector3
a2(&tGoing[i][3]);
291 TVector3 b1(&matched[j][0]);
292 distance = TMath::Abs((((a1 - a2).Cross((a1 - a2).Cross(a1 - b1))).Unit()).Dot(a1 - b1));
296 <<
"Removing delta ion " << rLook.size() <<
" " << rLook[j].first <<
" " << matchNum;
297 std::vector<art::Ptr<recob::Hit>>
temp = fmhi.at(rLook[j].first);
298 for (
unsigned int h = 0;
h < temp.size();
h++)
299 indIon -= temp[
h]->PeakAmplitude();
300 temp = fmhc.at(rLook[j].
second);
301 for (
unsigned int h = 0;
h < temp.size();
h++)
302 colIon -= temp[
h]->PeakAmplitude();
void reserve(size_type n)
bool filter(art::Event &evt) override
void cluster(In first, In last, Out result, Pred *pred)
PlaneGeo const & Plane(unsigned int const p, unsigned int const tpc=0, unsigned int const cstat=0) const
Returns the specified wire.
AdcChannelData::View View
enum geo::_plane_proj View_t
Enumerate the possible plane projections.
MaybeLogger_< ELseverityLevel::ELsev_info, false > LogInfo
float StartWire() const
Returns the wire coordinate of the start of the cluster.
std::vector< double > const fCuts
float EndTick() const
Returns the tick coordinate of the end of the cluster.
geo::PlaneID Plane() const
Returns the plane ID this cluster lies on.
Cluster finding and building.
art framework interface to geometry description
int const fDeltaWire
allowed differences in wire number between 2 planes
View_t View() const
Which coordinate does this plane measure.
std::string const fLineModuleLabel
bool getByLabel(std::string const &label, std::string const &instance, Handle< PROD > &result) const
unsigned int Nplanes(unsigned int tpc=0, unsigned int cstat=0) const
Returns the total number of wire planes in the specified TPC.
#define DEFINE_ART_MODULE(klass)
MuonFilter(fhicl::ParameterSet const &)
void push_back(Ptr< U > const &p)
void swap(Handle< T > &a, Handle< T > &b)
std::string const fClusterModuleLabel
double distance(double x1, double y1, double z1, double x2, double y2, double z2)
reference at(size_type n)
bool IntersectionPoint(geo::WireID const &wid1, geo::WireID const &wid2, double &y, double &z) const
Returns the intersection point of two wires.
Detector simulation of raw signals on wires.
Declaration of signal hit object.
Encapsulate the construction of a single detector plane.
EDFilter(fhicl::ParameterSet const &pset)
second_as<> second
Type of time stored in seconds, in double precision.
double sampling_rate(DetectorClocksData const &data)
Returns the period of the TPC readout electronics clock.
float StartTick() const
Returns the tick coordinate of the start of the cluster.
float EndWire() const
Returns the wire coordinate of the end of the cluster.