43 : theIds(cfg.getParameter<
std::vector<
int> >(
"pdgIds")),
44 theCharges(cfg.getParameter<
std::vector<
int> >(
"charges")),
46 theMinP2(cfg.getParameter<double>(
"minP")*cfg.getParameter<double>(
"minP")),
47 theMinPt2(cfg.getParameter<double>(
"minPt")*cfg.getParameter<double>(
"minPt")),
48 theDoMonitor(cfg.getUntrackedParameter<
bool>(
"doMonitor"))
56 <<
"'pdgIds' and 'charges' need same length.";
63 throw cms::Exception(
"BadConfig") <<
"CosmicGenFilterHelix: maxZ (" << maxZ
64 <<
") smaller than minZ (" << minZ <<
").";
94 for (HepMC::GenEvent::particle_const_iterator iPart = mCEvt->particles_begin(),
95 endPart = mCEvt->particles_end(); iPart != endPart; ++iPart) {
97 if ((*iPart)->status() != 1)
continue;
101 const HepMC::ThreeVector hepVertex((*iPart)->production_vertex()->point3d());
102 const GlobalPoint vert(hepVertex.x()/10., hepVertex.y()/10., hepVertex.z()/10.);
103 const HepMC::FourVector hepMomentum((*iPart)->momentum());
104 const GlobalVector mom(hepMomentum.x(), hepMomentum.y(), hepMomentum.z());
123 typedef std::pair<TrajectoryStateOnSurface, double> TsosPath;
129 if (!aTsosPath.first.isValid()) {
131 }
else if (aTsosPath.first.globalPosition().z() <
theTargetPlaneMin->position().z()) {
136 if (!aTsosPath.first.isValid()
140 }
else if (aTsosPath.first.globalPosition().z() >
theTargetPlaneMax->position().z()) {
143 if (!aTsosPath.first.isValid()
150 const GlobalVector momEnd(aTsosPath.first.globalMomentum());
154 const GlobalPoint vertEnd(aTsosPath.first.globalPosition());
183 hists.Add(fd.make<TH1F>(
"momentumP",
"|p(#mu^{+})| (start);|p| [GeV]",100, 0., 1000.));
184 hists.Add(fd.make<TH1F>(
"momentumM",
"|p(#mu^{-})| (start);|p| [GeV]",100, 0., 1000.));
185 hists.Add(fd.make<TH1F>(
"momentum2",
"|p(#mu)| (start);|p| [GeV]",100, 0., 25.));
186 const int kNumBins = 50;
187 double pBinsLog[kNumBins+1] = {0.};
189 hists.Add(fd.make<TH1F>(
"momentumLog",
"|p(#mu)| (start);|p| [GeV]", kNumBins, pBinsLog));
190 hists.Add(fd.make<TH1F>(
"phi",
"start p_{#phi(#mu)};#phi", 100, -
TMath::Pi(),
TMath::Pi()));
191 hists.Add(fd.make<TH1F>(
"cosPhi",
"cos(p_{#phi(#mu)}) (start);cos(#phi)", 100, -1., 1.));
192 hists.Add(fd.make<TH1F>(
"phiXz",
"start p_{#phi_{xz}(#mu)};#phi_{xz}",
194 hists.Add(fd.make<TH1F>(
"theta",
"#theta(#mu) (start);#theta", 100, 0.,
TMath::Pi()));
195 hists.Add(fd.make<TH1F>(
"thetaY",
"#theta_{y}(#mu) (start);#theta_{y}", 100,0.,
TMath::Pi()/2.));
197 hists.Add(fd.make<TH2F>(
"momVsPhi",
"|p(#mu)| vs #phi (start);#phi;|p| [GeV]",
199 hists.Add(fd.make<TH2F>(
"momVsTheta",
"|p(#mu)| vs #theta (start);#theta;|p| [GeV]",
201 hists.Add(fd.make<TH2F>(
"momVsThetaY",
"|p(#mu)| vs #theta_{y} (start);#theta_{y};|p| [GeV]",
202 50, 0.,
TMath::Pi()/2., 50, 1.5, 1000.));
203 hists.Add(fd.make<TH2F>(
"momVsZ",
"|p(#mu)| vs z (start);z [cm];|p| [GeV]",
204 50, -1600., 1600., 50, 1.5, 1000.));
205 hists.Add(fd.make<TH2F>(
"thetaVsZ",
"#theta vs z (start);z [cm];#theta",
206 50, -1600., 1600., 50, 0.,
TMath::Pi()));
207 hists.Add(fd.make<TH2F>(
"thetaYvsZ",
"#theta_{y} vs z (start);z [cm];#theta",
208 50, -1600., 1600., 50, 0., TMath::PiOver2()));
209 hists.Add(fd.make<TH2F>(
"yVsThetaY",
"#theta_{y}(#mu) vs y (start);#theta_{y};y [cm]",
210 50, 0.,
TMath::Pi()/2., 50, -1000., 1000.));
211 hists.Add(fd.make<TH2F>(
"yVsThetaYnoR",
"#theta_{y}(#mu) vs y (start, barrel);#theta_{y};y [cm]",
212 50, 0.,
TMath::Pi()/2., 50, -1000., 1000.));
214 hists.Add(fd.make<TH1F>(
"radius",
"start radius;r [cm]", 100, 0., 1000.));
215 hists.Add(fd.make<TH1F>(
"z",
"start z;z [cm]", 100, -1600., 1600.));
216 hists.Add(fd.make<TH2F>(
"xyPlane",
"start xy;x [cm];y [cm]", 50, -1000., 1000.,
218 hists.Add(fd.make<TH2F>(
"rzPlane",
219 "start rz (y < 0 #Rightarrow r_{#pm} = -r);z [cm];r_{#pm} [cm]",
220 50, -1600., 1600., 50, -1000., 1000.));
229 const int kNumBins = 50;
230 double pBinsLog[kNumBins+1] = {0.};
234 hists.Add(fd.make<TH1F>(
"pathEnd",
"path until cylinder;s [cm]", 100, 0., 2000.));
235 hists.Add(fd.make<TH1F>(
"momEnd",
"|p_{end}|;p [GeV]", 100, 0., 1000.));
236 hists.Add(fd.make<TH1F>(
"momEndLog",
"|p_{end}|;p [GeV]", kNumBins, pBinsLog));
237 hists.Add(fd.make<TH1F>(
"ptEnd",
"p_{t} (end);p_{t} [GeV]", 100, 0., 750.));
238 hists.Add(fd.make<TH1F>(
"ptEndLog",
"p_{t} (end);p_{t} [GeV]", kNumBins, pBinsLog));
239 hists.Add(fd.make<TH1F>(
"phiXzEnd",
"#phi_{xz} (end);#phi_{xz}", 100,-
TMath::Pi(),
TMath::Pi()));
240 hists.Add(fd.make<TH1F>(
"thetaYEnd",
"#theta_{y} (end);#theta_{y}", 100, 0.,
TMath::Pi()));
242 hists.Add(fd.make<TH1F>(
"momStartEnd",
"|p_{start}|-|p_{end}|;#Deltap [GeV]",100,0.,15.));
243 hists.Add(fd.make<TH1F>(
"momStartEndRel",
"(p_{start}-p_{end})/p_{start};#Deltap_{rel}",
245 hists.Add(fd.make<TH1F>(
"phiXzStartEnd",
"#phi_{xz,start}-#phi_{xz,end};#Delta#phi_{xz}",
247 hists.Add(fd.make<TH1F>(
"thetaYStartEnd",
"#theta_{y,start}-#theta_{y,end};#Delta#theta_{y}",
250 hists.Add(fd.make<TH2F>(
"phiXzStartVsEnd",
251 "#phi_{xz} start vs end;#phi_{xz}^{end};#phi_{xz}^{start}",
253 hists.Add(fd.make<TH2F>(
"thetaYStartVsEnd",
254 "#theta_{y} start vs end;#theta_{y}^{end};#theta_{y}^{start}",
257 hists.Add(fd.make<TH2F>(
"momStartEndRelVsZ",
258 "(p_{start}-p_{end})/p_{start} vs z_{start};z [cm];#Deltap_{rel}",
259 50, -1600., 1600., 50,.0,.8));
260 hists.Add(fd.make<TH2F>(
"phiXzStartEndVsZ",
261 "#phi_{xz,start}-#phi_{xz,end} vs z_{start};z [cm];#Delta#phi_{xz}",
262 50, -1600., 1600., 50,-1., 1.));
263 hists.Add(fd.make<TH2F>(
"thetaYStartEndVsZ",
264 "#theta_{y,start}-#theta_{y,end} vs z_{start};z [cm];#Delta#theta_{y}",
265 50, -1600., 1600., 50,-.5,.5));
266 hists.Add(fd.make<TH2F>(
"momStartEndRelVsP",
267 "(p_{start}-p_{end})/p_{start} vs p_{start};p [GeV];#Deltap_{rel}",
268 kNumBins, pBinsLog, 50, .0, .8));
269 hists.Add(fd.make<TH2F>(
"phiXzStartEndVsP",
270 "#phi_{xz,start}-#phi_{xz,end} vs |p|_{start};p [GeV];#Delta#phi_{xz}",
271 kNumBins, pBinsLog, 100,-1.5, 1.5));
272 hists.Add(fd.make<TH2F>(
"thetaYStartEndVsP",
273 "#theta_{y,start}-#theta_{y,end} vs |p|_{start};p [GeV];#Delta#theta_{y}",
274 kNumBins, pBinsLog, 100,-1.,1.));
277 hists.Add(fd.make<TH1F>(
"radiusEnd",
"end radius;r [cm]", 100, 0., maxR));
282 hists.Add(fd.make<TH1F>(
"zEnd",
"end z;z [cm]", 100, minZ, maxZ));
283 hists.Add(fd.make<TH1F>(
"zDiff",
"z_{start}-z_{end};#Deltaz [cm]", 100, -1000., 1000.));
284 hists.Add(fd.make<TH2F>(
"xyPlaneEnd",
"end xy;x [cm];y [cm]", 100, -maxR, maxR, 100,-maxR,maxR));
286 hists.Add(fd.make<TH2F>(
"rzPlaneEnd",
"end rz (y<0 #Rightarrow r_{#pm}=-r);z [cm];r_{#pm} [cm]",
287 50, minZ, maxZ, 50, -maxR, maxR));
288 hists.Add(fd.make<TH2F>(
"thetaVsZend",
"#theta vs z (end);z [cm];#theta",
295 const char *border =
"////////////////////////////////////////////////////////";
296 const char *
line =
"\n// ";
297 edm::LogInfo(
"Filter") <<
"@SUB=CosmicGenFilterHelix::endJob" 301 <<
"reached target cylinder," 302 << line <<
"defined by r < " 306 << line <<
"Minimal required (transverse) momentum was " 314 std::vector<int>::const_iterator iC =
theCharges.begin();
342 if (!dynamic_cast<const SteppingHelixPropagator*>(prop)) {
343 edm::LogWarning(
"BadConfig") <<
"@SUB=CosmicGenFilterHelix::getPropagator" 344 <<
"Not a SteppingHelixPropagator!";
354 const double scalarMom = mom.
mag();
355 const double phi = mom.
phi();
356 const double phiXz = TMath::ATan2(mom.
z(), mom.
x());
358 const double thetaY = TMath::ATan2(TMath::Sqrt(mom.
x()*mom.
x()+mom.
z()*mom.
z()), -mom.
y());
360 const double z = vert.
z();
361 const double r = vert.
perp();
363 const static int iMomP = hists.IndexOf(hists.FindObject(
"momentumP"));
364 const static int iMomM = hists.IndexOf(hists.FindObject(
"momentumM"));
365 if (charge > 0)
static_cast<TH1*
>(hists[iMomP])->
Fill(scalarMom);
366 else static_cast<TH1*
>(hists[iMomM])->
Fill(scalarMom);
367 const static int iMom2 = hists.IndexOf(hists.FindObject(
"momentum2"));
368 static_cast<TH1*
>(hists[iMom2])->
Fill(scalarMom);
369 const static int iMomLog = hists.IndexOf(hists.FindObject(
"momentumLog"));
370 static_cast<TH1*
>(hists[iMomLog])->
Fill(scalarMom);
371 const static int iPhi = hists.IndexOf(hists.FindObject(
"phi"));
372 static_cast<TH1*
>(hists[iPhi])->
Fill(phi);
373 const static int iCosPhi = hists.IndexOf(hists.FindObject(
"cosPhi"));
374 static_cast<TH1*
>(hists[iCosPhi])->
Fill(TMath::Cos(phi));
375 const static int iPhiXz = hists.IndexOf(hists.FindObject(
"phiXz"));
376 static_cast<TH1*
>(hists[iPhiXz])->
Fill(phiXz);
377 const static int iTheta = hists.IndexOf(hists.FindObject(
"theta"));
378 static_cast<TH1*
>(hists[iTheta])->
Fill(theta);
379 const static int iThetaY = hists.IndexOf(hists.FindObject(
"thetaY"));
380 static_cast<TH1*
>(hists[iThetaY])->
Fill(thetaY);
382 const static int iMomVsTheta = hists.IndexOf(hists.FindObject(
"momVsTheta"));
383 static_cast<TH2*
>(hists[iMomVsTheta])->
Fill(theta, scalarMom);
384 const static int iMomVsThetaY = hists.IndexOf(hists.FindObject(
"momVsThetaY"));
385 static_cast<TH2*
>(hists[iMomVsThetaY])->
Fill(thetaY, scalarMom);
386 const static int iMomVsPhi = hists.IndexOf(hists.FindObject(
"momVsPhi"));
387 static_cast<TH2*
>(hists[iMomVsPhi])->
Fill(phi, scalarMom);
388 const static int iMomVsZ = hists.IndexOf(hists.FindObject(
"momVsZ"));
389 static_cast<TH2*
>(hists[iMomVsZ])->
Fill(z, scalarMom);
390 const static int iThetaVsZ = hists.IndexOf(hists.FindObject(
"thetaVsZ"));
391 static_cast<TH2*
>(hists[iThetaVsZ])->
Fill(z, theta);
392 const static int iThetaYvsZ = hists.IndexOf(hists.FindObject(
"thetaYvsZ"));
393 static_cast<TH2*
>(hists[iThetaYvsZ])->
Fill(z, thetaY);
394 const static int iYvsThetaY = hists.IndexOf(hists.FindObject(
"yVsThetaY"));
395 static_cast<TH2*
>(hists[iYvsThetaY])->
Fill(thetaY, vert.
y());
396 const static int iYvsThetaYnoR = hists.IndexOf(hists.FindObject(
"yVsThetaYnoR"));
397 if (z > -1400. && z < 1400.) {
398 static_cast<TH2*
>(hists[iYvsThetaYnoR])->
Fill(thetaY, vert.
y());
401 const static int iRadius = hists.IndexOf(hists.FindObject(
"radius"));
402 static_cast<TH1*
>(hists[iRadius])->
Fill(r);
403 const static int iZ = hists.IndexOf(hists.FindObject(
"z"));
404 static_cast<TH1*
>(hists[iZ])->
Fill(z);
405 const static int iXy = hists.IndexOf(hists.FindObject(
"xyPlane"));
406 static_cast<TH1*
>(hists[iXy])->
Fill(vert.
x(), vert.
y());
407 const static int iRz = hists.IndexOf(hists.FindObject(
"rzPlane"));
408 static_cast<TH1*
>(hists[iRz])->
Fill(z, (vert.
y() > 0 ? r : -
r));
416 const double scalarMomStart = mom.
mag();
417 const double phiXzStart = TMath::ATan2(mom.
z(), mom.
x());
418 const double thetaYStart = TMath::ATan2(TMath::Sqrt(mom.
x()*mom.
x()+mom.
z()*mom.
z()), -mom.
y());
419 const double scalarMomEnd = endMom.
mag();
420 const double ptEnd = endMom.
perp();
421 const double phiXzEnd = TMath::ATan2(endMom.
z(), endMom.
x());
422 const double thetaYEnd = TMath::ATan2(TMath::Sqrt(endMom.
x()*endMom.
x()+endMom.
z()*endMom.
z()),
424 const double thetaEnd = endMom.
theta();
426 const double diffMomRel = (scalarMomStart-scalarMomEnd)/scalarMomStart;
428 const double zEnd = endVert.
z();
429 const double rEnd = endVert.
perp();
430 const double diffZ = zEnd - vert.
z();
432 const static int iPathEnd = hists.IndexOf(hists.FindObject(
"pathEnd"));
433 static_cast<TH1*
>(hists[iPathEnd])->
Fill(path);
434 const static int iMomEnd = hists.IndexOf(hists.FindObject(
"momEnd"));
435 static_cast<TH1*
>(hists[iMomEnd])->
Fill(scalarMomEnd);
436 const static int iMomEndLog = hists.IndexOf(hists.FindObject(
"momEndLog"));
437 static_cast<TH1*
>(hists[iMomEndLog])->
Fill(scalarMomEnd);
438 const static int iPtEnd = hists.IndexOf(hists.FindObject(
"ptEnd"));
439 static_cast<TH1*
>(hists[iPtEnd])->
Fill(ptEnd);
440 const static int iPtEndLog = hists.IndexOf(hists.FindObject(
"ptEndLog"));
441 static_cast<TH1*
>(hists[iPtEndLog])->
Fill(ptEnd);
442 const static int iPhiXzEnd = hists.IndexOf(hists.FindObject(
"phiXzEnd"));
443 static_cast<TH1*
>(hists[iPhiXzEnd])->
Fill(phiXzEnd);
444 const static int iThetaYEnd = hists.IndexOf(hists.FindObject(
"thetaYEnd"));
445 static_cast<TH1*
>(hists[iThetaYEnd])->
Fill(thetaYEnd);
447 const static int iMomStartEnd = hists.IndexOf(hists.FindObject(
"momStartEnd"));
448 static_cast<TH1*
>(hists[iMomStartEnd])->
Fill(scalarMomStart-scalarMomEnd);
449 const static int iMomStartEndRel = hists.IndexOf(hists.FindObject(
"momStartEndRel"));
450 static_cast<TH1*
>(hists[iMomStartEndRel])->
Fill(diffMomRel);
451 const static int iPhiStartEnd = hists.IndexOf(hists.FindObject(
"phiXzStartEnd"));
452 static_cast<TH1*
>(hists[iPhiStartEnd])->
Fill(phiXzStart-phiXzEnd);
453 const static int iThetaStartEnd = hists.IndexOf(hists.FindObject(
"thetaYStartEnd"));
454 static_cast<TH1*
>(hists[iThetaStartEnd])->
Fill(thetaYStart-thetaYEnd);
456 const static int iPhiStartVsEnd = hists.IndexOf(hists.FindObject(
"phiXzStartVsEnd"));
457 static_cast<TH2*
>(hists[iPhiStartVsEnd])->
Fill(phiXzEnd, phiXzStart);
458 const static int iThetaStartVsEnd = hists.IndexOf(hists.FindObject(
"thetaYStartVsEnd"));
459 static_cast<TH2*
>(hists[iThetaStartVsEnd])->
Fill(thetaYEnd, thetaYStart);
461 const static int iMomStartEndRelVsZ = hists.IndexOf(hists.FindObject(
"momStartEndRelVsZ"));
462 static_cast<TH2*
>(hists[iMomStartEndRelVsZ])->
Fill(vert.
z(), diffMomRel);
463 const static int iPhiStartEndVsZ = hists.IndexOf(hists.FindObject(
"phiXzStartEndVsZ"));
464 static_cast<TH2*
>(hists[iPhiStartEndVsZ])->
Fill(vert.
z(), phiXzStart-phiXzEnd);
465 const static int iThetaStartEndVsZ = hists.IndexOf(hists.FindObject(
"thetaYStartEndVsZ"));
466 static_cast<TH2*
>(hists[iThetaStartEndVsZ])->
Fill(vert.
z(), thetaYStart-thetaYEnd);
467 const static int iMomStartEndRelVsP = hists.IndexOf(hists.FindObject(
"momStartEndRelVsP"));
468 static_cast<TH2*
>(hists[iMomStartEndRelVsP])->
Fill(scalarMomStart, diffMomRel);
469 const static int iPhiStartEndVsP = hists.IndexOf(hists.FindObject(
"phiXzStartEndVsP"));
470 static_cast<TH2*
>(hists[iPhiStartEndVsP])->
Fill(scalarMomStart, phiXzStart-phiXzEnd);
471 const static int iThetaStartEndVsP = hists.IndexOf(hists.FindObject(
"thetaYStartEndVsP"));
472 static_cast<TH2*
>(hists[iThetaStartEndVsP])->
Fill(scalarMomStart, thetaYStart-thetaYEnd);
474 const static int iRadiusEnd = hists.IndexOf(hists.FindObject(
"radiusEnd"));
475 static_cast<TH1*
>(hists[iRadiusEnd])->
Fill(rEnd);
476 const static int iZend = hists.IndexOf(hists.FindObject(
"zEnd"));
477 static_cast<TH1*
>(hists[iZend])->
Fill(zEnd);
478 const static int iZdiff = hists.IndexOf(hists.FindObject(
"zDiff"));
479 static_cast<TH1*
>(hists[iZdiff])->
Fill(diffZ);
480 const static int iXyPlaneEnd = hists.IndexOf(hists.FindObject(
"xyPlaneEnd"));
481 static_cast<TH1*
>(hists[iXyPlaneEnd])->
Fill(endVert.
x(), endVert.
y());
482 const static int iRzPlaneEnd = hists.IndexOf(hists.FindObject(
"rzPlaneEnd"));
483 static_cast<TH1*
>(hists[iRzPlaneEnd])->
Fill(zEnd, (endVert.
y() > 0 ? rEnd : -rEnd));
484 const static int iThetaVsZend = hists.IndexOf(hists.FindObject(
"thetaVsZend"));
485 static_cast<TH2*
>(hists[iThetaVsZend])->
Fill(zEnd, thetaEnd);
497 if (nBins < 1 || first <= 0. || last <= 0.)
return false;
501 const double firstLog = TMath::Log10(bins[0]);
502 const double lastLog = TMath::Log10(bins[nBins]);
503 for (
int i = 1;
i < nBins; ++
i) {
504 bins[
i] = TMath::Power(10., firstLog +
i*(lastLog-firstLog)/(nBins));
ESHandle< MagneticField > fieldHandle
Cylinder::ConstCylinderPointer theTargetCylinder
minimal transverse^2 momentum after propagation to cylinder
static const std::string kSharedResource
T getParameter(std::string const &) const
unsigned int theNumPass
for final statistics: all seen events
~CosmicGenFilterHelix() override
Plane::ConstPlanePointer theTargetPlaneMax
plane closing cylinder at 'negative' side
const double theMinPt2
minimal momentum^2 after propagation to cylinder
bool getByToken(EDGetToken token, Handle< PROD > &result) const
const std::vector< int > theIds
const Propagator * getPropagator(const edm::EventSetup &setup) const
Geom::Phi< T > phi() const
TObjArray theHistsAfter
hists of properties from generator
Geom::Theta< T > theta() const
void createHistsStart(const char *dirName, TObjArray &hists)
for final statistics: events with track reaching target
def setup(process, global_tag, zero_tesla=False)
const MagneticField * getMagneticField(const edm::EventSetup &setup) const
provide magnetic field from Event Setup
bool propagateToCutCylinder(const GlobalPoint &vertStart, const GlobalVector &momStart, int charge, const MagneticField *field, const Propagator *propagator)
actually propagate to the defined cylinder
edm::EDGetTokenT< edm::HepMCProduct > theSrcToken
void monitorEnd(const GlobalPoint &endVert, const GlobalVector &endMom, const GlobalPoint &vert, const GlobalVector &mom, double path, TObjArray &hists)
Geom::Theta< T > theta() const
CosmicGenFilterHelix(const edm::ParameterSet &config)
static CylinderPointer build(const PositionType &pos, const RotationType &rot, Scalar radius, Bounds *bounds=0)
void Fill(HcalDetId &id, double val, std::vector< TH2F > &depth)
static PlanePointer build(Args &&...args)
virtual std::pair< TrajectoryStateOnSurface, double > propagateWithPath(const FreeTrajectoryState &, const Surface &) const final
const std::vector< int > theCharges
requested Ids
bool equidistLogBins(double *bins, int nBins, double first, double last) const
TFileDirectory mkdir(const std::string &dir, const std::string &descr="")
create a new subdirectory
const HepMC::GenEvent * GetEvent() const
void createHistsEnd(const char *dirName, TObjArray &hists)
TObjArray theHistsBefore
whether or not to fill monitor hists (needs TFileService)
bool charge(int id, int &charge) const
true if ID selected, return by value its charge
void monitorStart(const GlobalPoint &vert, const GlobalVector &mom, int charge, TObjArray &hists)
const std::string thePropagatorName
charges, parallel to theIds
bool filter(edm::Event &event, const edm::EventSetup &eventSetup) override
T const * product() const
Plane::ConstPlanePointer theTargetPlaneMin
target cylinder, around z-axis
unsigned int theNumTotal
plane closing cylinder at 'positive' side