1 #ifndef RECOTOOL_CFALGOWIREOVERLAP_CXX 2 #define RECOTOOL_CFALGOWIREOVERLAP_CXX 43 if ( clusters.size() == 1 )
46 if (
_verbose) { std::cout <<
"Number of clusters taken into account: " << clusters.size() << std::endl; }
52 std::vector<std::vector<util::PxHit> >
Hits(3, std::vector<util::PxHit>());
54 for (
size_t c=0; c < clusters.size(); c++)
55 Hits.at( clusters.at(c)->Plane() ) = clusters.at(c)->GetHitVector();
62 std::vector<int> StartWires;
63 std::vector<int> EndWires;
65 for (
int pl=0; pl < 3; pl++){
66 StartWires.push_back(9999);
67 EndWires.push_back(0);
70 for (
size_t h=0; h < Hits.size(); h++){
71 for (
auto&
hit: Hits.at(h) ){
72 if ( Hits.at(h).size() == 0 ){
73 std::cout <<
"Need to insert fake hit ranges...";
76 if (
int(
hit.w /
_w2cm) < StartWires.at(h) ) { StartWires.at(h) = int(
hit.w /
_w2cm); }
77 if (
int(
hit.w /
_w2cm) > EndWires.at(h) ) { EndWires.at(h) = int(
hit.w /
_w2cm); }
87 for (
size_t h=0; h < Hits.size(); h++){
88 if ( StartWires.at(h) == 9999 ) { StartWires.at(h) = 1; }
89 if ( EndWires.at(h) == 0 ) { EndWires.at(h) = geo->
Nwires(h)-1; }
110 Double_t xyzStart0WireStart[3] = {0., 0., 0.};
111 Double_t xyzStart0WireEnd[3] = {0., 0., 0.};
112 Double_t xyzEnd0WireStart[3] = {0., 0., 0.};
113 Double_t xyzEnd0WireEnd[3] = {0., 0., 0.};
114 Double_t xyzStart1WireStart[3] = {0., 0., 0.};
115 Double_t xyzStart1WireEnd[3] = {0., 0., 0.};
116 Double_t xyzEnd1WireStart[3] = {0., 0., 0.};
117 Double_t xyzEnd1WireEnd[3] = {0., 0., 0.};
118 Double_t xyzStart2WireStart[3] = {0., 0., 0.};
119 Double_t xyzStart2WireEnd[3] = {0., 0., 0.};
120 Double_t xyzEnd2WireStart[3] = {0., 0., 0.};
121 Double_t xyzEnd2WireEnd[3] = {0., 0., 0.};
124 std::cout <<
"Wire Ranges:" << std::endl;
125 std::cout <<
"U-Plane: [ " << StartWires.at(0) <<
", " << EndWires.at(0) <<
"]" << std::endl;
126 std::cout <<
"V-Plane: [ " << StartWires.at(1) <<
", " << EndWires.at(1) <<
"]" << std::endl;
127 std::cout <<
"Y-Plane: [ " << StartWires.at(2) <<
", " << EndWires.at(2) <<
"]" << std::endl;
128 std::cout << std::endl;
138 geo->
WireEndPoints(0, 0, 0, StartWires.at(0), xyzStart0WireStart, xyzStart0WireEnd);
139 geo->
WireEndPoints(0, 0, 0, EndWires.at(0), xyzEnd0WireStart, xyzEnd0WireEnd);
140 geo->
WireEndPoints(0, 0, 1, StartWires.at(1), xyzStart1WireStart, xyzStart1WireEnd);
141 geo->
WireEndPoints(0, 0, 1, EndWires.at(1), xyzEnd1WireStart, xyzEnd1WireEnd);
142 geo->
WireEndPoints(0, 0, 2, StartWires.at(2), xyzStart2WireStart, xyzStart2WireEnd);
143 geo->
WireEndPoints(0, 0, 2, EndWires.at(2), xyzEnd2WireStart, xyzEnd2WireEnd);
147 double zMin = xyzStart2WireStart[2];
149 double zMax = xyzEnd2WireStart[2];
157 double slopeU = tan(30*3.14/180.);
158 double slopeV = tan(-30*3.14/180.);
161 double bUup = xyzStart0WireStart[1] - xyzStart0WireStart[2] * slopeU;
162 double bUdn = xyzEnd0WireStart[1] - xyzEnd0WireStart[2] * slopeU;
163 double bVdn = xyzStart1WireStart[1] - xyzStart1WireStart[2] * slopeV;
164 double bVup = xyzEnd1WireStart[1] - xyzEnd1WireStart[2] * slopeV;
166 if ( bUup < bUdn ) { std::cout <<
"Uup and Udn are mixed up!" << std::endl; }
167 if ( bVdn > bVup ) { std::cout <<
"Vup and Vdn are mixed up!" << std::endl; }
174 double VdnZmin = slopeV * zMin + bVdn;
175 double VdnZmax = slopeV * zMax + bVdn;
176 double VupZmin = slopeV * zMin + bVup;
177 double VupZmax = slopeV * zMax + bVup;
178 double UdnZmin = slopeU * zMin + bUdn;
179 double UdnZmax = slopeU * zMax + bUdn;
180 double UupZmin = slopeU * zMin + bUup;
181 double UupZmax = slopeU * zMax + bUup;
184 std::cout <<
"Y-Plane and U-Plane points [Z,Y]:" << std::endl;
185 std::cout <<
"\t\t[ " << zMin <<
", " << UdnZmin <<
"]" << std::endl;
186 std::cout <<
"\t\t[ " << zMin <<
", " << UupZmin <<
"]" << std::endl;
187 std::cout <<
"\t\t[ " << zMax <<
", " << UupZmax <<
"]" << std::endl;
188 std::cout <<
"\t\t[ " << zMax <<
", " << UdnZmax <<
"]" << std::endl;
189 std::cout <<
"Y-Plane and V-Plane points [Z,Y]:" << std::endl;
190 std::cout <<
"\t\t[ " << zMin <<
", " << VdnZmin <<
"]" << std::endl;
191 std::cout <<
"\t\t[ " << zMin <<
", " << VupZmin <<
"]" << std::endl;
192 std::cout <<
"\t\t[ " << zMax <<
", " << VupZmax <<
"]" << std::endl;
193 std::cout <<
"\t\t[ " << zMax <<
", " << VdnZmax <<
"]" << std::endl;
204 std::vector< std::pair<float,float> > WireIntersection;
208 zInt = (bUup-bVup)/(slopeV-slopeU);
209 if ( (zInt > zMin) and (zInt < zMax) )
210 WireIntersection.push_back( std::make_pair( zInt, slopeV*zInt+bVup ) );
212 if ( (VupZmax < UupZmax) and (VupZmax > UdnZmax) )
213 WireIntersection.push_back( std::make_pair( zMax, VupZmax ) );
215 if ( (VupZmin < UupZmin) and ( VupZmin > UdnZmin) )
216 WireIntersection.push_back( std::make_pair( zMin, VupZmin ) );
218 zInt = (bUdn-bVup)/(slopeV-slopeU);
219 if ( (zInt > zMin) and (zInt < zMax) )
220 WireIntersection.push_back( std::make_pair( zInt, slopeV*zInt+bVup ) );
224 zInt = (bUup-bVdn)/(slopeV-slopeU);
225 if ( (zInt > zMin) and (zInt < zMax) )
226 WireIntersection.push_back( std::make_pair( zInt, slopeV*zInt+bVdn ) );
228 if ( (VdnZmax < UupZmax) and (VdnZmax > UdnZmax) )
229 WireIntersection.push_back( std::make_pair( zMax, VdnZmax ) );
231 if ( (VdnZmin < UupZmin) and ( VdnZmin > UdnZmin) )
232 WireIntersection.push_back( std::make_pair( zMin, VdnZmin ) );
234 zInt = (bUdn-bVdn)/(slopeV-slopeU);
235 if ( (zInt > zMin) and (zInt < zMax) )
236 WireIntersection.push_back( std::make_pair( zInt, slopeV*zInt+bVdn ) );
240 if ( (UupZmax < VupZmax) and ( UupZmax > VdnZmax) )
241 WireIntersection.push_back( std::make_pair( zMax, UupZmax ) );
243 if ( (UdnZmax < VupZmax) and ( UdnZmax > VdnZmax) )
244 WireIntersection.push_back( std::make_pair( zMax, UdnZmax ) );
248 if ( (UupZmin < VupZmin) and ( UupZmin > VdnZmin) )
249 WireIntersection.push_back( std::make_pair( zMin, UupZmin ) );
251 if ( (UdnZmin < VupZmin) and ( UdnZmin > VdnZmin) )
252 WireIntersection.push_back( std::make_pair( zMin, UdnZmin ) );
255 if ( WireIntersection.size() == 0 ){
256 if (
_verbose) { std::cout <<
"No intersection..." << std::endl << std::endl; }
265 double PolyArea = -1;
270 std::vector< std::pair<float,float> > TPCCorners;
271 TPCCorners.push_back( std::make_pair(0., -geo->
DetHalfHeight()) );
274 TPCCorners.push_back( std::make_pair(0., geo->
DetHalfHeight()) );
278 std::cout <<
"Wire Overlap contained in TPC" << std::endl;
279 std::cout <<
"Intersection Polygon Coordinates [Z,Y]: " << std::endl;
280 for (
unsigned int s=0;
s < WirePolygon.
Size();
s++)
281 std::cout <<
"\t\t[ " << WirePolygon.
Point(
s).first <<
", " << WirePolygon.
Point(
s).second <<
"]" << std::endl;
282 std::cout << std::endl;
284 PolyArea = WirePolygon.
Area();
288 std::cout <<
"Wire overlap not fully contained in TPC" << std::endl;
289 std::cout <<
"Intersection Polygon Coordinates [Z,Y]: " << std::endl;
290 for (
unsigned int s=0;
s < WirePolygon.
Size();
s++)
291 std::cout <<
"\t\t[ " << WirePolygon.
Point(
s).first <<
", " << WirePolygon.
Point(
s).second <<
"]" << std::endl;
292 std::cout << std::endl;
295 Polygon2D IntersectionPolygon(TPCPolygon, WirePolygon);
296 PolyArea = IntersectionPolygon.
Area();
300 if (
_verbose) { std::cout <<
"Intersection area: " << PolyArea << std::endl << std::endl; }
bool Contained(const Polygon2D &poly2) const
Class def header for a class CFAlgoWireOverlap.
Double_t TimeToCm() const
const std::pair< float, float > & Point(unsigned int p) const
Double_t WireToCm() const
unsigned int Size() const
Create Intersection Polygon.
unsigned int Nwires(unsigned int p, unsigned int tpc=0, unsigned int cstat=0) const
Returns the total number of wires in the specified plane.
geo::Length_t DetHalfHeight(geo::TPCID const &tpcid) const
Returns the half height of the active volume of the specified TPC.
geo::Length_t DetLength(geo::TPCID const &tpcid) const
Returns the length of the active volume of the specified TPC.
Detector simulation of raw signals on wires.
art::PtrVector< recob::Hit > Hits
void WireEndPoints(geo::WireID const &wireid, double *xyzStart, double *xyzEnd) const
Fills two arrays with the coordinates of the wire end points.
Namespace collecting geometry-related classes utilities.
void UntanglePolygon()
check if poly2 is inside poly1