From bde8074e9f89722933b275d0874cb3750524d6b6 Mon Sep 17 00:00:00 2001 From: Raffaella De Vita Date: Tue, 13 Feb 2024 15:57:14 -0500 Subject: [PATCH 01/13] reorganized target material and volumes information, preparing for multiple target types: tungsten shield moved from SVT geometry package to CVT geometry class, defined more generic methods to handle target materials and surfaces in CVT geometry class, updatesto Measurements class --- .../detector/geant4/v2/SVT/SVTConstants.java | 12 +-- .../main/java/org/jlab/rec/cvt/Constants.java | 24 ++--- .../main/java/org/jlab/rec/cvt/Geometry.java | 99 +++++++++++++++++-- .../rec/cvt/measurement/Measurements.java | 39 +++----- .../org/jlab/rec/cvt/services/CVTEngine.java | 2 +- .../org/jlab/rec/cvt/svt/SVTGeometry.java | 19 ---- 6 files changed, 114 insertions(+), 81 deletions(-) diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/SVT/SVTConstants.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/SVT/SVTConstants.java index f5b4596576..c048c033de 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/SVT/SVTConstants.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/SVT/SVTConstants.java @@ -108,17 +108,7 @@ public class SVTConstants { public static double SECTORLEN; public static final double SIDETOL = 1.0; // extra width used in defining the module corners public static final double LENGTHTOL = 10.0; // extra length for track intersection - - // tungsten shield - public static double TSHIELDRMIN = 51; - public static double TSHIELDRMAX = 51.051; - public static double TSHIELDLENGTH = 360; - public static double TSHIELDZPOS = -50; - public static double TSHIELDRADLEN = 6.76/19.3 *10; // X0(g/cm2) / density(g/cm3) * 10; - public static double TSHIELDZOVERA = 0.40252; - public static double TSHIELDRHO = 19.3E-3; // g/mm3 - public static double TSHIELDI = 727; // eV - + // faraday cup cage public static double[] FARADAYCAGERMIN = new double[4]; public static double[] FARADAYCAGERMAX = new double[4]; diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java index fa10fe19f4..47348368a8 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java @@ -63,7 +63,7 @@ public static Constants getInstance() { public boolean useOnlyBMTC50PercTruthHits = false; public boolean useOnlyBMTZ50PercTruthHits = false; public boolean preElossCorrection = true; - private Material targetMaterial = LH2; + private String targetType = "LH2"; public Libr KFMatrixLibrary; private int svtmaxclussize = 30; private int bmtcmaxclussize =30; @@ -100,14 +100,7 @@ public static Constants getInstance() { public static final double COSMICSMINRESIDUALZ = 12; // in mm public static final int SEEDFITITERATIONS = 5; - - private static final Material LH2 = new Material("LH2", 8.85, 0.0708E-3, 0.99212, 8904.0, 21.8, Units.MM); - private static final Material LD2 = new Material("LD2", 8.85, 0.1638E-3, 0.49650, 7691.0, 21.8, Units.MM); - public static final Material TARGETKAPTON = new Material("Kapton", 50E-3, 1.42E-3, 0.501, 285.7, 79.6, Units.MM); - public static final Material TARGETRHOACELL = new Material("Rhoacell", 10.4, 0.1E-3, 0.5392, 1000, 93.0, Units.MM); - public static final Material SCINTILLATOR = new Material("Scintillator", 1, 1.03E-3, 0.54141, 439.0, 64.7, Units.MM); - public static final Material VACUUM = new Material("Vacuum", 1, 0, 1, Double.POSITIVE_INFINITY, 100, Units.MM); - + public static boolean KFFILTERON = true; public static boolean INITFROMMC = false; public static int KFITERATIONS = 5; @@ -133,16 +126,15 @@ public boolean kfBeamSpotConstraint() { } public void setTargetMaterial(String material) { - if(material.equalsIgnoreCase("LH2")) - targetMaterial = LH2; - else if(material.equalsIgnoreCase("LD2") ) - targetMaterial = LD2; + if(!material.equalsIgnoreCase("LH2") && + !material.equalsIgnoreCase("LD2") ) + System.out.println("Unknown target material " + material + ", keeping current setting " + targetType); else - System.out.println("Unknown target material " + material + ", keeping current setting " + targetMaterial.getName()); + targetType = material; } - public Material getTargetMaterial() { - return targetMaterial; + public String getTargetType() { + return targetType; } public int getRmReg() { diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java index 679f580178..f07648428c 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java @@ -4,7 +4,10 @@ import java.util.Arrays; import java.util.List; import javax.swing.JFrame; +import org.jlab.clas.tracking.kalmanfilter.Material; import org.jlab.clas.tracking.kalmanfilter.Surface; +import org.jlab.clas.tracking.kalmanfilter.Units; +import org.jlab.clas.tracking.objects.Strip; import org.jlab.detector.base.DetectorType; import org.jlab.detector.base.GeometryFactory; import org.jlab.detector.calib.utils.ConstantsManager; @@ -14,8 +17,10 @@ import org.jlab.geom.base.ConstantProvider; import org.jlab.geom.base.Detector; import org.jlab.geom.prim.Arc3D; +import org.jlab.geom.prim.Cylindrical3D; import org.jlab.geom.prim.Line3D; import org.jlab.geom.prim.Point3D; +import org.jlab.geom.prim.Vector3D; import org.jlab.groot.base.GStyle; import org.jlab.groot.data.GraphErrors; import org.jlab.groot.graphics.EmbeddedCanvasTabbed; @@ -39,11 +44,35 @@ public class Geometry { private BMTGeometry bmtGeometry = null; private CTOFGeant4Factory ctofGeometry = null; private Detector cndGeometry = null; - private List cvtSurfaces = null; private List outerSurfaces = null; + + // tungsten shield + public static double TSHIELDRMIN = 51; + public static double TSHIELDRMAX = 51.051; + public static double TSHIELDLENGTH = 360; + public static double TSHIELDZPOS = -50; + public static double TSHIELDRADLEN = 6.76/19.3 *10; // X0(g/cm2) / density(g/cm3) * 10; + public static double TSHIELDZOVERA = 0.40252; + public static double TSHIELDRHO = 19.3E-3; // g/mm3 + public static double TSHIELDI = 727; // eV + private double zTarget = 0; private double zLength = 0; - + + private List targetMaterials = null; + private Surface scatteringChamberSurface = null; + private Surface targetShieldSurface = null; + + // cryogenic target + private static final Material CRYOLH2 = new Material("LH2", 8.85, 0.0708E-3, 0.99212, 8904.0, 21.8, Units.MM); + private static final Material CRYOLD2 = new Material("LD2", 8.85, 0.1638E-3, 0.49650, 7691.0, 21.8, Units.MM); + private static final Material CRYOTARGETKAPTON = new Material("Kapton", 50E-3, 1.42E-3, 0.501, 285.7, 79.6, Units.MM); + private static final Material CRYOTARGETRHOACELL = new Material("Rhoacell", 10.4, 0.1E-3, 0.5392, 1000, 93.0, Units.MM); + + // other materials + public static final Material SCINTILLATOR = new Material("Scintillator", 1, 1.03E-3, 0.54141, 439.0, 64.7, Units.MM); + public static final Material VACUUM = new Material("Vacuum", 1, 0, 1, Double.POSITIVE_INFINITY, 100, Units.MM); + private static boolean LOADED; // private constructor for a singleton @@ -78,7 +107,8 @@ private synchronized void load(String variation, int run, IndexedTable svtLorent ConstantProvider providerTG = GeometryFactory.getConstants(DetectorType.TARGET, run, variation); this.zTarget = providerTG.getDouble("/geometry/target/position",0)*10; this.zLength = providerTG.getDouble("/geometry/target/length",0)*10; - + this.initTarget(); + ConstantProvider providerCTOF = GeometryFactory.getConstants(DetectorType.CTOF, run, variation); ctofGeometry = new CTOFGeant4Factory(providerCTOF); cndGeometry = GeometryFactory.getDetector(DetectorType.CND, run, variation); @@ -89,10 +119,6 @@ private synchronized void load(String variation, int run, IndexedTable svtLorent svtGeometry = new SVTGeometry(svtFac, svtLorentz); bmtGeometry = new BMTGeometry(bmtVoltage); - cvtSurfaces = new ArrayList<>(); - cvtSurfaces.addAll(svtGeometry.getSurfaces()); - cvtSurfaces.addAll(bmtGeometry.getSurfaces()); - outerSurfaces = Measurements.getOuters(); } @@ -104,6 +130,59 @@ public double getZlength() { return zLength; } + public void initTarget() { + if("LH2".equals(Constants.getInstance().getTargetType()) || + "LD2".equals(Constants.getInstance().getTargetType())) + this.loadCryoTarget(); + else + this.loadCryoTarget(); + } + + public void loadCryoTarget() { + targetMaterials = new ArrayList<>(); + if("LH2".equals(Constants.getInstance().getTargetType())) + targetMaterials.add(CRYOLH2); + else if("LD2".equals(Constants.getInstance().getTargetType())) + targetMaterials.add(CRYOLD2); + targetMaterials.add(CRYOTARGETKAPTON); + + Point3D chamberCenter = new Point3D(0, 0, this.getZoffset()-100); + Point3D chamberOrigin = new Point3D(39.5, 0, this.getZoffset()-100); + Vector3D chamberAxis = new Vector3D(0,0,1); + Arc3D chamberBase = new Arc3D(chamberOrigin, chamberCenter, chamberAxis, 2*Math.PI); + Cylindrical3D chamber = new Cylindrical3D(chamberBase, 200); + scatteringChamberSurface = new Surface(chamber, new Strip(0, 0, 0), Constants.DEFAULTSWIMACC); + scatteringChamberSurface.addMaterial(CRYOTARGETRHOACELL); + scatteringChamberSurface.passive=true; + + Point3D center = new Point3D(0, 0, Geometry.getInstance().getZoffset()+TSHIELDZPOS-TSHIELDLENGTH/2); + Point3D origin = new Point3D(TSHIELDRMAX, 0, Geometry.getInstance().getZoffset()+TSHIELDZPOS-TSHIELDLENGTH/2); + Vector3D axis = new Vector3D(0,0,1); + Arc3D base = new Arc3D(origin, center, axis, 2*Math.PI); + Cylindrical3D shieldCylinder = new Cylindrical3D(base, TSHIELDLENGTH); + targetShieldSurface = new Surface(shieldCylinder, new Strip(0, 0, 0), Constants.DEFAULTSWIMACC); + targetShieldSurface.addMaterial("TungstenShield", + TSHIELDRMAX-TSHIELDRMIN, + TSHIELDRHO, + TSHIELDZOVERA, + TSHIELDRADLEN, + TSHIELDI, + Units.MM); + targetShieldSurface.passive=true; + } + + public List getTargetMaterials() { + return targetMaterials; + } + + public Surface getScatteringChamber() { + return scatteringChamberSurface; + } + + public Surface getTargetShield() { + return targetShieldSurface; + } + public SVTGeometry getSVT() { return svtGeometry; } @@ -121,9 +200,9 @@ public Detector getCND() { return cndGeometry; } - public List getCVTSurfaces() { - return cvtSurfaces; - } +// public List getCVTSurfaces() { +// return cvtSurfaces; +// } public List geOuterSurfaces() { return outerSurfaces; diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java index 18699cc3a6..a4fa66ccc4 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java @@ -2,9 +2,12 @@ import java.util.ArrayList; import java.util.List; +import org.jlab.clas.tracking.kalmanfilter.Material; import org.jlab.clas.tracking.kalmanfilter.Surface; +import org.jlab.clas.tracking.kalmanfilter.Units; import org.jlab.clas.tracking.objects.Strip; import org.jlab.detector.base.DetectorType; +import org.jlab.detector.geant4.v2.SVT.SVTConstants; import org.jlab.geom.prim.Arc3D; import org.jlab.geom.prim.Cylindrical3D; import org.jlab.geom.prim.Line3D; @@ -49,8 +52,8 @@ public Measurements(boolean cosmic) { private void initTargetSurfaces(double xbeam, double ybeam, boolean beamSpot) { cvtSurfaces = new Surface[NSURFACES+2]; this.add(MLayer.TARGET.getIndex(), this.getTarget(xbeam, ybeam, beamSpot)); - this.add(MLayer.SCHAMBER.getIndex(), this.getScatteringChamber()); - this.add(MLayer.SHIELD.getIndex(), Geometry.getInstance().getSVT().getShieldSurface()); + this.add(MLayer.SCHAMBER.getIndex(), Geometry.getInstance().getScatteringChamber()); + this.add(MLayer.SHIELD.getIndex(), Geometry.getInstance().getTargetShield()); this.add(MLayer.INNERSVTCAGE.getIndex(), Geometry.getInstance().getSVT().getFaradayCageSurfaces(0)); this.add(MLayer.OUTERSVTCAGE.getIndex(), Geometry.getInstance().getSVT().getFaradayCageSurfaces(1)); this.add(MLayer.BMTINNERTUBE.getIndex(), Geometry.getInstance().getBMT().getInnerTube()); @@ -60,14 +63,14 @@ private void initTargetSurfaces(double xbeam, double ybeam, boolean beamSpot) { private void initCosmicSurfaces() { cvtSurfaces = new Surface[NSURFACES*2+3]; this.add(MLayer.COSMICPLANE.getIndex(1), this.getCosmicPlane()); - this.add(MLayer.SCHAMBER.getIndex(1), this.getScatteringChamber()); - this.add(MLayer.SHIELD.getIndex(1), Geometry.getInstance().getSVT().getShieldSurface()); + this.add(MLayer.SCHAMBER.getIndex(1), Geometry.getInstance().getScatteringChamber()); + this.add(MLayer.SHIELD.getIndex(1), Geometry.getInstance().getTargetShield()); this.add(MLayer.INNERSVTCAGE.getIndex(1), Geometry.getInstance().getSVT().getFaradayCageSurfaces(0)); this.add(MLayer.OUTERSVTCAGE.getIndex(1), Geometry.getInstance().getSVT().getFaradayCageSurfaces(1)); this.add(MLayer.BMTINNERTUBE.getIndex(1), Geometry.getInstance().getBMT().getInnerTube()); this.add(MLayer.BMTOUTERTUBE.getIndex(1), Geometry.getInstance().getBMT().getOuterTube()); - this.add(MLayer.SCHAMBER.getIndex(-1), this.getScatteringChamber()); - this.add(MLayer.SHIELD.getIndex(-1), Geometry.getInstance().getSVT().getShieldSurface(), -1); + this.add(MLayer.SCHAMBER.getIndex(-1), Geometry.getInstance().getScatteringChamber()); + this.add(MLayer.SHIELD.getIndex(-1), Geometry.getInstance().getTargetShield(), -1); this.add(MLayer.INNERSVTCAGE.getIndex(-1), Geometry.getInstance().getSVT().getFaradayCageSurfaces(0), -1); this.add(MLayer.OUTERSVTCAGE.getIndex(-1), Geometry.getInstance().getSVT().getFaradayCageSurfaces(1), -1); this.add(MLayer.BMTINNERTUBE.getIndex(-1), Geometry.getInstance().getBMT().getInnerTube()); @@ -99,27 +102,15 @@ private Surface getTarget(double xbeam, double ybeam, boolean beamSpot) { Point3D p = new Point3D(xbeam, ybeam, 0); Line3D l = new Line3D(p, u); Surface target = new Surface(l.origin(), l.end(), Constants.getInstance().DEFAULTSWIMACC); - target.addMaterial(Constants.getInstance().getTargetMaterial()); - target.addMaterial(Constants.TARGETKAPTON); + for(Material m : Geometry.getInstance().getTargetMaterials()) + target.addMaterial(m); target.setError(Constants.getInstance().getBeamRadius()); if(beamSpot) target.passive = false; else target.passive = true; return target; - } - - private Surface getScatteringChamber() { - Point3D center = new Point3D(0, 0, Geometry.getInstance().getZoffset()-100); - Point3D origin = new Point3D(39.5, 0, Geometry.getInstance().getZoffset()-100); - Vector3D axis = new Vector3D(0,0,1); - Arc3D base = new Arc3D(origin, center, axis, 2*Math.PI); - Cylindrical3D chamber = new Cylindrical3D(base, 200); - Surface scatteringChamber = new Surface(chamber, new Strip(0, 0, 0), Constants.DEFAULTSWIMACC); - scatteringChamber.addMaterial(Constants.TARGETRHOACELL); - scatteringChamber.passive=true; - return scatteringChamber; - } + } private static Surface getCTOF() { @@ -134,7 +125,7 @@ private static Surface getCTOF() { Cylindrical3D barrel = new Cylindrical3D(base, (lineZ.end().z -lineZ.origin().z)*10); Surface ctof = new Surface(barrel, new Strip(0, 0, 0), Constants.DEFAULTSWIMACC); - ctof.addMaterial(Constants.SCINTILLATOR.clone(thickness*10)); + ctof.addMaterial(Geometry.SCINTILLATOR.clone(thickness*10)); ctof.setIndex(DetectorType.CTOF.getDetectorId()); ctof.setLayer(1); ctof.setSector(1); @@ -160,7 +151,7 @@ private static List getCND() { Cylindrical3D barrel = new Cylindrical3D(base, length*10); Surface cnd = new Surface(barrel, new Strip(0, 0, 0), Constants.DEFAULTSWIMACC); - cnd.addMaterial(Constants.SCINTILLATOR.clone(thickness*10)); + cnd.addMaterial(Geometry.SCINTILLATOR.clone(thickness*10)); cnd.setIndex(DetectorType.CND.getDetectorId()); cnd.setLayer(ilayer+1); cnd.setSector(1); @@ -184,7 +175,7 @@ private Surface getCosmicPlane() { Vector3D dir = new Vector3D(0,1,0); Plane3D plane = new Plane3D(point, dir); Surface cosmic = new Surface(plane, point,ep1, ep2,Constants.DEFAULTSWIMACC); - cosmic.addMaterial(Constants.VACUUM); + cosmic.addMaterial(Geometry.VACUUM); cosmic.setError(1); cosmic.hemisphere = 1; cosmic.passive = true; diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java index 3df5086310..2564d1fa0a 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java @@ -588,7 +588,7 @@ public void printConfiguration() { System.out.println("["+this.getName()+"] run with region "+this.getEngineConfigString("removeRegion")+" removed"); System.out.println("["+this.getName()+"] run with beamSpotConst set to "+Constants.getInstance().beamSpotConstraint+ " (0=no-constraint, 1=seed only, 2=seed and KF)"); System.out.println("["+this.getName()+"] run with beam spot size set to "+Constants.getInstance().getBeamRadius()); - System.out.println("["+this.getName()+"] Target material set to "+ Constants.getInstance().getTargetMaterial().getName()); + System.out.println("["+this.getName()+"] Target material set to "+ Constants.getInstance().getTargetType()); System.out.println("["+this.getName()+"] Pre-Eloss correction set to " + Constants.getInstance().preElossCorrection); System.out.println("["+this.getName()+"] run SVT-based seeding set to "+ Constants.getInstance().svtSeeding); System.out.println("["+this.getName()+"] run BMT timing cuts set to "+ Constants.getInstance().timeCuts); diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/svt/SVTGeometry.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/svt/SVTGeometry.java index 9730592bc3..81fbeae340 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/svt/SVTGeometry.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/svt/SVTGeometry.java @@ -223,7 +223,6 @@ public double getLocalAngle(int layer, int sector, Vector3D trackDir) { public List getSurfaces() { List surfaces = new ArrayList<>(); - surfaces.add(this.getShieldSurface()); surfaces.add(this.getFaradayCageSurfaces(0)); for(int i=1; i<=NLAYERS; i++) { surfaces.add(this.getSurface(i, 1, new Strip(0,0,0))); @@ -255,24 +254,6 @@ public Surface getSurface(int layer, int sector, Strip strip) { surface.passive=false; return surface; } - - public Surface getShieldSurface() { - Point3D center = new Point3D(0, 0, Geometry.getInstance().getZoffset()+SVTConstants.TSHIELDZPOS-SVTConstants.TSHIELDLENGTH/2); - Point3D origin = new Point3D(SVTConstants.TSHIELDRMAX, 0, Geometry.getInstance().getZoffset()+SVTConstants.TSHIELDZPOS-SVTConstants.TSHIELDLENGTH/2); - Vector3D axis = new Vector3D(0,0,1); - Arc3D base = new Arc3D(origin, center, axis, 2*Math.PI); - Cylindrical3D shieldCylinder = new Cylindrical3D(base, SVTConstants.TSHIELDLENGTH); - Surface shieldSurface = new Surface(shieldCylinder, new Strip(0, 0, 0), Constants.DEFAULTSWIMACC); - shieldSurface.addMaterial("TungstenShield", - SVTConstants.TSHIELDRMAX-SVTConstants.TSHIELDRMIN, - SVTConstants.TSHIELDRHO, - SVTConstants.TSHIELDZOVERA, - SVTConstants.TSHIELDRADLEN, - SVTConstants.TSHIELDI, - Units.MM); - shieldSurface.passive=true; - return shieldSurface; - } public Surface getFaradayCageSurfaces(int i) { Point3D center = new Point3D(0, 0, SVTConstants.FARADAYCAGEZPOS[i]-SVTConstants.FARADAYCAGELENGTH[i]/2); From c64d2fb01c89eb05a39dfad6dfcac219f0ee83d3 Mon Sep 17 00:00:00 2001 From: Raffaella De Vita Date: Tue, 13 Feb 2024 16:38:14 -0500 Subject: [PATCH 02/13] added polarized target material information --- .../cvt/src/main/java/org/jlab/rec/cvt/Geometry.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java index f07648428c..003492038e 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java @@ -69,6 +69,16 @@ public class Geometry { private static final Material CRYOTARGETKAPTON = new Material("Kapton", 50E-3, 1.42E-3, 0.501, 285.7, 79.6, Units.MM); private static final Material CRYOTARGETRHOACELL = new Material("Rhoacell", 10.4, 0.1E-3, 0.5392, 1000, 93.0, Units.MM); + // polarized target + + private static final Material POLTARNH3 = new Material("NH3", 7.5, 0.5782E-3, 0.55, 450.0, 65, Units.MM); + private static final Material POLTARND3 = new Material("ND3", 10.0, 0.6622E-3, 0.5, 450.0, 65, Units.MM); + private static final Material POLTARPCUP = new Material("PCTFE", 0.1, 2.135E-3, 0.5, 450.0, 65, Units.MM); + private static final Material POLTARLHE = new Material("LHE", 20.0, 0.147E-3, 0.5, 6400.0, 22, Units.MM); + private static final Material POLTARBATH = new Material("BATH", 0.76, 2.135E-3, 0.5, 450.0, 65, Units.MM); + private static final Material POLTARAL = new Material("Al", 1.63, 2.7E-3, 0.48181, 397.0, 166, Units.MM); + private static final Material POLTARCF = new Material("CarbonFiber", 1.0, 1.75E-3, 0.51342, 250.0, 78, Units.MM); + // other materials public static final Material SCINTILLATOR = new Material("Scintillator", 1, 1.03E-3, 0.54141, 439.0, 64.7, Units.MM); public static final Material VACUUM = new Material("Vacuum", 1, 0, 1, Double.POSITIVE_INFINITY, 100, Units.MM); From d82e17055a5beb4a032e2b497e6115b4b8f4cbf3 Mon Sep 17 00:00:00 2001 From: Raffaella De Vita Date: Tue, 13 Feb 2024 18:23:34 -0500 Subject: [PATCH 03/13] implemented polarized target surfaces --- .../main/java/org/jlab/rec/cvt/Constants.java | 4 +- .../main/java/org/jlab/rec/cvt/Geometry.java | 47 +++++++++++++++---- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java index 47348368a8..f633974264 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java @@ -127,7 +127,9 @@ public boolean kfBeamSpotConstraint() { public void setTargetMaterial(String material) { if(!material.equalsIgnoreCase("LH2") && - !material.equalsIgnoreCase("LD2") ) + !material.equalsIgnoreCase("LD2") && + !material.equalsIgnoreCase("NH3") && + !material.equalsIgnoreCase("ND3") ) System.out.println("Unknown target material " + material + ", keeping current setting " + targetType); else targetType = material; diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java index 003492038e..8a94c25855 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java @@ -73,7 +73,7 @@ public class Geometry { private static final Material POLTARNH3 = new Material("NH3", 7.5, 0.5782E-3, 0.55, 450.0, 65, Units.MM); private static final Material POLTARND3 = new Material("ND3", 10.0, 0.6622E-3, 0.5, 450.0, 65, Units.MM); - private static final Material POLTARPCUP = new Material("PCTFE", 0.1, 2.135E-3, 0.5, 450.0, 65, Units.MM); + private static final Material POLTARCUP = new Material("PCTFE", 0.1, 2.135E-3, 0.5, 450.0, 65, Units.MM); private static final Material POLTARLHE = new Material("LHE", 20.0, 0.147E-3, 0.5, 6400.0, 22, Units.MM); private static final Material POLTARBATH = new Material("BATH", 0.76, 2.135E-3, 0.5, 450.0, 65, Units.MM); private static final Material POLTARAL = new Material("Al", 1.63, 2.7E-3, 0.48181, 397.0, 166, Units.MM); @@ -140,15 +140,18 @@ public double getZlength() { return zLength; } - public void initTarget() { + private void initTarget() { if("LH2".equals(Constants.getInstance().getTargetType()) || "LD2".equals(Constants.getInstance().getTargetType())) this.loadCryoTarget(); + else if("NH3".equals(Constants.getInstance().getTargetType()) || + "ND3".equals(Constants.getInstance().getTargetType())) + this.loadPolTarget(); else this.loadCryoTarget(); } - public void loadCryoTarget() { + private void loadCryoTarget() { targetMaterials = new ArrayList<>(); if("LH2".equals(Constants.getInstance().getTargetType())) targetMaterials.add(CRYOLH2); @@ -165,11 +168,11 @@ else if("LD2".equals(Constants.getInstance().getTargetType())) scatteringChamberSurface.addMaterial(CRYOTARGETRHOACELL); scatteringChamberSurface.passive=true; - Point3D center = new Point3D(0, 0, Geometry.getInstance().getZoffset()+TSHIELDZPOS-TSHIELDLENGTH/2); - Point3D origin = new Point3D(TSHIELDRMAX, 0, Geometry.getInstance().getZoffset()+TSHIELDZPOS-TSHIELDLENGTH/2); - Vector3D axis = new Vector3D(0,0,1); - Arc3D base = new Arc3D(origin, center, axis, 2*Math.PI); - Cylindrical3D shieldCylinder = new Cylindrical3D(base, TSHIELDLENGTH); + Point3D shieldCenter = new Point3D(0, 0, Geometry.getInstance().getZoffset()+TSHIELDZPOS-TSHIELDLENGTH/2); + Point3D shieldOrigin = new Point3D(TSHIELDRMAX, 0, Geometry.getInstance().getZoffset()+TSHIELDZPOS-TSHIELDLENGTH/2); + Vector3D shieldAxis = new Vector3D(0,0,1); + Arc3D shieldBase = new Arc3D(shieldOrigin, shieldCenter, shieldAxis, 2*Math.PI); + Cylindrical3D shieldCylinder = new Cylindrical3D(shieldBase, TSHIELDLENGTH); targetShieldSurface = new Surface(shieldCylinder, new Strip(0, 0, 0), Constants.DEFAULTSWIMACC); targetShieldSurface.addMaterial("TungstenShield", TSHIELDRMAX-TSHIELDRMIN, @@ -181,6 +184,34 @@ else if("LD2".equals(Constants.getInstance().getTargetType())) targetShieldSurface.passive=true; } + private void loadPolTarget() { + targetMaterials = new ArrayList<>(); + if("NH3".equals(Constants.getInstance().getTargetType())) + targetMaterials.add(POLTARNH3); + else if("ND2".equals(Constants.getInstance().getTargetType())) + targetMaterials.add(POLTARND3); + + Point3D chamberCenter = new Point3D(0, 0, this.getZoffset()-100); + Point3D chamberOrigin = new Point3D(30, 0, this.getZoffset()-100); + Vector3D chamberAxis = new Vector3D(0,0,1); + Arc3D chamberBase = new Arc3D(chamberOrigin, chamberCenter, chamberAxis, 2*Math.PI); + Cylindrical3D chamber = new Cylindrical3D(chamberBase, 200); + scatteringChamberSurface = new Surface(chamber, new Strip(0, 0, 0), Constants.DEFAULTSWIMACC); + scatteringChamberSurface.addMaterial(POLTARCUP); + scatteringChamberSurface.addMaterial(POLTARLHE); + scatteringChamberSurface.addMaterial(POLTARBATH); + scatteringChamberSurface.passive=true; + + Point3D shieldCenter = new Point3D(0, 0, this.getZoffset()-100); + Point3D shieldOrigin = new Point3D(45, 0, this.getZoffset()-100); + Vector3D shieldAxis = new Vector3D(0,0,1); + Arc3D shieldBase = new Arc3D(shieldOrigin, shieldCenter, shieldAxis, 2*Math.PI); + Cylindrical3D shieldCylinder = new Cylindrical3D(shieldBase, 200); + targetShieldSurface = new Surface(shieldCylinder, new Strip(0, 0, 0), Constants.DEFAULTSWIMACC); + targetShieldSurface.addMaterial(POLTARAL); + targetShieldSurface.addMaterial(POLTARCF); + targetShieldSurface.passive=true; + } public List getTargetMaterials() { return targetMaterials; } From 5b30177e744bdd93f3eb544818b83697671020bd Mon Sep 17 00:00:00 2001 From: Raffaella De Vita Date: Wed, 14 Feb 2024 18:56:21 -0500 Subject: [PATCH 04/13] accounting for beam position within the target for eloss in CVT --- .../clas/tracking/kalmanfilter/Surface.java | 36 ++++++++++++++++--- .../main/java/org/jlab/rec/cvt/Geometry.java | 7 ++++ .../rec/cvt/measurement/Measurements.java | 14 +++++++- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Surface.java b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Surface.java index a874270822..318524d42b 100644 --- a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Surface.java +++ b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Surface.java @@ -7,6 +7,7 @@ import org.jlab.geom.prim.Point3D; import org.jlab.geom.prim.Arc3D; import org.jlab.geom.prim.Cylindrical3D; +import org.jlab.geom.prim.Line3D; import org.jlab.geom.prim.Transformation3D; import org.jlab.geom.prim.Vector3D; @@ -24,6 +25,7 @@ public class Surface implements Comparable { public Point3D finitePlaneCorner1; public Point3D finitePlaneCorner2; public Cylindrical3D cylinder; + public Cylindrical3D lineTube; private Transformation3D toGlobal = new Transformation3D(); private Transformation3D toLocal = new Transformation3D(); public Arc3D arc; @@ -111,11 +113,19 @@ public Surface(Point3D endPoint1, Point3D endPoint2, double accuracy) { swimAccuracy = accuracy; } + public Surface(Point3D endPoint1, Point3D endPoint2, Cylindrical3D tube, double accuracy) { + type = Type.LINE; + lineEndPoint1 = endPoint1; + lineEndPoint2 = endPoint2; + lineTube = tube; + swimAccuracy = accuracy; + } + @Override public String toString() { String s = "Surface: "; - s = s + String.format("Type=%s Index=%d Layer=%d Sector=%d Emisphere=%.1f X0=%.4f Z/A=%.4f Error=%.4f Passive=%b", - this.type.name(), this.getIndex(),this.getLayer(),this.getSector(),this.hemisphere,this.getToverX0(), + s = s + String.format("Type=%s Index=%d Layer=%d Sector=%d Emisphere=%.1f X0=%.4f thickness=%.4f Z/A=%.4f Error=%.4f Passive=%b", + this.type.name(), this.getIndex(),this.getLayer(),this.getSector(),this.hemisphere,this.getThickness(),this.getToverX0(), this.getZoverA(),this.getError(), this.passive); if(type==Type.PLANEWITHSTRIP) { s = s + "\n\t" + this.plane.toString(); @@ -127,6 +137,11 @@ else if(type==Type.CYLINDERWITHSTRIP) { s = s + "\n\t" + this.cylinder.toString(); s = s + "\n\t" + this.strip.toString(); } + else if(type==Type.CYLINDERWITHLINE) { + s = s + "\n\t" + this.cylinder.toString(); + s = s + "\n\t" + this.lineEndPoint1.toString(); + s = s + "\n\t" + this.lineEndPoint2.toString(); + } else if(type==Type.LINE) { s = s + "\n\t" + this.lineEndPoint1.toString(); s = s + "\n\t" + this.lineEndPoint2.toString(); @@ -237,9 +252,20 @@ else if(this.type==Type.CYLINDERWITHSTRIP) { return Math.abs(dir.mag()); } else if(this.type==Type.LINE) { - Vector3D axis = this.lineEndPoint1.vectorTo(this.lineEndPoint2).asUnit(); - dir.sub(dir.projection(axis)); - return Math.abs(dir.mag()); + Vector3D line = this.lineEndPoint1.vectorTo(this.lineEndPoint2).asUnit(); + if(this.lineTube!=null) { + Line3D track = new Line3D(this.lineEndPoint1.midpoint(this.lineEndPoint2), dir); + List intersections = new ArrayList<>(); + int ninters = this.lineTube.intersectionRay(track, intersections); + if(ninters>0) { + double trackLength = intersections.get(0).distance(track.origin()); + return this.getThickness()/trackLength; + } + } + else { + dir.sub(dir.projection(line)); + return Math.abs(dir.mag()); + } } return 0; } diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java index 8a94c25855..87735ede69 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java @@ -6,6 +6,7 @@ import javax.swing.JFrame; import org.jlab.clas.tracking.kalmanfilter.Material; import org.jlab.clas.tracking.kalmanfilter.Surface; +import org.jlab.clas.tracking.kalmanfilter.Type; import org.jlab.clas.tracking.kalmanfilter.Units; import org.jlab.clas.tracking.objects.Strip; import org.jlab.detector.base.DetectorType; @@ -60,6 +61,7 @@ public class Geometry { private double zLength = 0; private List targetMaterials = null; + private Point3D targetCenter = null; private Surface scatteringChamberSurface = null; private Surface targetShieldSurface = null; @@ -190,6 +192,7 @@ private void loadPolTarget() { targetMaterials.add(POLTARNH3); else if("ND2".equals(Constants.getInstance().getTargetType())) targetMaterials.add(POLTARND3); + targetCenter = new Point3D(0, 0, zTarget); Point3D chamberCenter = new Point3D(0, 0, this.getZoffset()-100); Point3D chamberOrigin = new Point3D(30, 0, this.getZoffset()-100); @@ -216,6 +219,10 @@ public List getTargetMaterials() { return targetMaterials; } + public Point3D getTargetCenter() { + return targetCenter; + } + public Surface getScatteringChamber() { return scatteringChamberSurface; } diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java index a4fa66ccc4..457ec60453 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java @@ -4,6 +4,7 @@ import java.util.List; import org.jlab.clas.tracking.kalmanfilter.Material; import org.jlab.clas.tracking.kalmanfilter.Surface; +import org.jlab.clas.tracking.kalmanfilter.Type; import org.jlab.clas.tracking.kalmanfilter.Units; import org.jlab.clas.tracking.objects.Strip; import org.jlab.detector.base.DetectorType; @@ -101,7 +102,18 @@ private Surface getTarget(double xbeam, double ybeam, boolean beamSpot) { Vector3D u = new Vector3D(0,0,1); Point3D p = new Point3D(xbeam, ybeam, 0); Line3D l = new Line3D(p, u); - Surface target = new Surface(l.origin(), l.end(), Constants.getInstance().DEFAULTSWIMACC); + Surface target = null; + if(Geometry.getInstance().getTargetCenter()!=null) { + Point3D center = new Point3D(Geometry.getInstance().getTargetCenter()); + center.setZ(-1000); + Point3D origin = new Point3D(Geometry.getInstance().getTargetMaterials().get(0).getThickness()+center.x(), center.y(), center.z()); + Arc3D base = new Arc3D(origin, center, u, 2*Math.PI); + Cylindrical3D cell = new Cylindrical3D(base, 2000); + target = new Surface(l.origin(), l.end(), cell, Constants.DEFAULTSWIMACC); + } + else { + target = new Surface(l.origin(), l.end(), Constants.DEFAULTSWIMACC); + } for(Material m : Geometry.getInstance().getTargetMaterials()) target.addMaterial(m); target.setError(Constants.getInstance().getBeamRadius()); From 1c6ab3e22a1f39716d0464bada2037003942e080 Mon Sep 17 00:00:00 2001 From: Raffaella De Vita Date: Thu, 15 Feb 2024 18:25:47 -0500 Subject: [PATCH 05/13] added capability of accounting for the finite length of the target in eloss --- .../org/jlab/geom/prim/Cylindrical3D.java | 41 +++++++++++++ .../clas/tracking/kalmanfilter/Surface.java | 21 ++++--- .../kalmanfilter/helical/StateVecs.java | 4 +- .../main/java/org/jlab/rec/cvt/Geometry.java | 59 ++++++++++--------- .../rec/cvt/measurement/Measurements.java | 16 ++--- .../java/org/jlab/rec/cvt/track/Cell.java | 2 +- .../java/org/jlab/rec/cvt/track/Seed.java | 4 +- .../java/org/jlab/rec/cvt/track/Track.java | 2 +- .../org/jlab/rec/cvt/track/TrackSeederRZ.java | 4 +- .../org/jlab/rec/cvt/trajectory/StateVec.java | 2 +- 10 files changed, 98 insertions(+), 57 deletions(-) diff --git a/common-tools/clas-geometry/src/main/java/org/jlab/geom/prim/Cylindrical3D.java b/common-tools/clas-geometry/src/main/java/org/jlab/geom/prim/Cylindrical3D.java index 9fef42d732..3675fd6d1a 100644 --- a/common-tools/clas-geometry/src/main/java/org/jlab/geom/prim/Cylindrical3D.java +++ b/common-tools/clas-geometry/src/main/java/org/jlab/geom/prim/Cylindrical3D.java @@ -403,6 +403,47 @@ public int intersectionSegment(Line3D line, List intersections) { return 0; // no intersections, disjoint } + /** + * Compute the intersections of a ray within the 3D volume + * @param line + * @param intersections + * @return ray path length within the volume + */ + public double intersectionLength(Line3D line, List intersections) { + if(this.baseArc.theta()<2*Math.PI) { + throw new UnsupportedOperationException("Not supported yet."); + } + else { + int count = this.intersectionRay(line, intersections); + // add intersections with bases + Plane3D base0 = new Plane3D(this.baseArc.center(), this.baseArc.normal()); + Plane3D base1 = new Plane3D(this.highArc().center(), this.baseArc.normal()); + + Point3D intersect0 = new Point3D(); + if(base0.intersectionRay(line, intersect0)>0 && + intersect0.distance(base0.point())0 && + intersect1.distance(base1.point())2) System.out.println("aaaaaaaaaaa"); + } + return 0; + } + /** * Returns true if the given point is on the surface of this cylindrical * segment. diff --git a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Surface.java b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Surface.java index 318524d42b..53e6b6a632 100644 --- a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Surface.java +++ b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Surface.java @@ -236,7 +236,7 @@ public double getZoverA() { return ZA/RhoX; } - public double getLocalDir(Vector3D dir) { + public double getLocalDir(Point3D pos, Vector3D dir) { if(this.type!=Type.PLANEWITHSTRIP && this.type!=Type.CYLINDERWITHSTRIP && this.type!=Type.LINE) @@ -254,13 +254,16 @@ else if(this.type==Type.CYLINDERWITHSTRIP) { else if(this.type==Type.LINE) { Vector3D line = this.lineEndPoint1.vectorTo(this.lineEndPoint2).asUnit(); if(this.lineTube!=null) { - Line3D track = new Line3D(this.lineEndPoint1.midpoint(this.lineEndPoint2), dir); + Line3D track = new Line3D(pos, dir); +// Line3D track = new Line3D(new Point3D(lineEndPoint1.x(), lineEndPoint1.y(),pos.z()), dir); List intersections = new ArrayList<>(); - int ninters = this.lineTube.intersectionRay(track, intersections); - if(ninters>0) { - double trackLength = intersections.get(0).distance(track.origin()); + double trackLength = this.lineTube.intersectionLength(track, intersections); + if(trackLength>0) { return this.getThickness()/trackLength; } + else { + return Double.MAX_VALUE; + } } else { dir.sub(dir.projection(line)); @@ -279,8 +282,8 @@ public double getEloss(double p, double mass) { return dE; } - public double getEloss(Vector3D mom, double mass, int dir) { - double cosDir = this.getLocalDir(mom.asUnit()); + public double getEloss(Point3D pos, Vector3D mom, double mass, int dir) { + double cosDir = this.getLocalDir(pos, mom.asUnit()); double scale = 0; if(cosDir!=0) { double dE = -dir*this.getEloss(mom.mag(), mass)/cosDir; @@ -291,8 +294,8 @@ public double getEloss(Vector3D mom, double mass, int dir) { return scale; } - public double getDx(Vector3D mom) { - double cosDir = this.getLocalDir(mom.asUnit()); + public double getDx(Point3D pos, Vector3D mom) { + double cosDir = this.getLocalDir(pos, mom.asUnit()); if(cosDir!=0) return this.getThickness()/cosDir; else diff --git a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/helical/StateVecs.java b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/helical/StateVecs.java index 3b11bc7b17..745aedc500 100644 --- a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/helical/StateVecs.java +++ b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/helical/StateVecs.java @@ -166,11 +166,11 @@ public void corrForEloss(int dir, StateVec vec, AMeasVecs mv) { if(this.straight || mass<0) return; Surface surf = mv.measurements.get(vec.k).surface; - double pScale = surf.getEloss(vec.getMomentum(), mass, dir); + double pScale = surf.getEloss(vec.getPosition(), vec.getMomentum(), mass, dir); if(pScale>0) { vec.kappa = vec.kappa/pScale; vec.energyLoss = surf.getEloss(vec.getMomentum().mag(), mass); - vec.dx = surf.getDx(vec.getMomentum()); + vec.dx = surf.getDx(vec.getPosition(), vec.getMomentum()); vec.updateFromHelix(); } else { diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java index 87735ede69..a4dcd693fa 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java @@ -47,6 +47,14 @@ public class Geometry { private Detector cndGeometry = null; private List outerSurfaces = null; + private double targetPosition = 0; + private double targetHalfLength = 0; + private double targetRadius = 0; + + private List targetMaterials = null; + private Surface scatteringChamberSurface = null; + private Surface targetShieldSurface = null; + // tungsten shield public static double TSHIELDRMIN = 51; public static double TSHIELDRMAX = 51.051; @@ -57,14 +65,6 @@ public class Geometry { public static double TSHIELDRHO = 19.3E-3; // g/mm3 public static double TSHIELDI = 727; // eV - private double zTarget = 0; - private double zLength = 0; - - private List targetMaterials = null; - private Point3D targetCenter = null; - private Surface scatteringChamberSurface = null; - private Surface targetShieldSurface = null; - // cryogenic target private static final Material CRYOLH2 = new Material("LH2", 8.85, 0.0708E-3, 0.99212, 8904.0, 21.8, Units.MM); private static final Material CRYOLD2 = new Material("LD2", 8.85, 0.1638E-3, 0.49650, 7691.0, 21.8, Units.MM); @@ -72,7 +72,8 @@ public class Geometry { private static final Material CRYOTARGETRHOACELL = new Material("Rhoacell", 10.4, 0.1E-3, 0.5392, 1000, 93.0, Units.MM); // polarized target - + private static double POLTARBATHRADIUS = 30; + private static double POLTARRADIUS = 45; private static final Material POLTARNH3 = new Material("NH3", 7.5, 0.5782E-3, 0.55, 450.0, 65, Units.MM); private static final Material POLTARND3 = new Material("ND3", 10.0, 0.6622E-3, 0.5, 450.0, 65, Units.MM); private static final Material POLTARCUP = new Material("PCTFE", 0.1, 2.135E-3, 0.5, 450.0, 65, Units.MM); @@ -117,8 +118,8 @@ private synchronized void load(String variation, int run, IndexedTable svtLorent // Load target ConstantProvider providerTG = GeometryFactory.getConstants(DetectorType.TARGET, run, variation); - this.zTarget = providerTG.getDouble("/geometry/target/position",0)*10; - this.zLength = providerTG.getDouble("/geometry/target/length",0)*10; + this.targetPosition = providerTG.getDouble("/geometry/target/position",0)*10; + this.targetHalfLength = providerTG.getDouble("/geometry/target/length",0)*10; this.initTarget(); ConstantProvider providerCTOF = GeometryFactory.getConstants(DetectorType.CTOF, run, variation); @@ -134,12 +135,16 @@ private synchronized void load(String variation, int run, IndexedTable svtLorent outerSurfaces = Measurements.getOuters(); } - public double getZoffset() { - return zTarget; + public double getTargetZOffset() { + return targetPosition; } - public double getZlength() { - return zLength; + public double getTargetHalfLength() { + return targetHalfLength; + } + + public double getTargetRadius() { + return targetRadius; } private void initTarget() { @@ -161,8 +166,8 @@ else if("LD2".equals(Constants.getInstance().getTargetType())) targetMaterials.add(CRYOLD2); targetMaterials.add(CRYOTARGETKAPTON); - Point3D chamberCenter = new Point3D(0, 0, this.getZoffset()-100); - Point3D chamberOrigin = new Point3D(39.5, 0, this.getZoffset()-100); + Point3D chamberCenter = new Point3D(0, 0, this.getTargetZOffset()-100); + Point3D chamberOrigin = new Point3D(39.5, 0, this.getTargetZOffset()-100); Vector3D chamberAxis = new Vector3D(0,0,1); Arc3D chamberBase = new Arc3D(chamberOrigin, chamberCenter, chamberAxis, 2*Math.PI); Cylindrical3D chamber = new Cylindrical3D(chamberBase, 200); @@ -170,8 +175,8 @@ else if("LD2".equals(Constants.getInstance().getTargetType())) scatteringChamberSurface.addMaterial(CRYOTARGETRHOACELL); scatteringChamberSurface.passive=true; - Point3D shieldCenter = new Point3D(0, 0, Geometry.getInstance().getZoffset()+TSHIELDZPOS-TSHIELDLENGTH/2); - Point3D shieldOrigin = new Point3D(TSHIELDRMAX, 0, Geometry.getInstance().getZoffset()+TSHIELDZPOS-TSHIELDLENGTH/2); + Point3D shieldCenter = new Point3D(0, 0, this.getTargetZOffset()+TSHIELDZPOS-TSHIELDLENGTH/2); + Point3D shieldOrigin = new Point3D(TSHIELDRMAX, 0, this.getTargetZOffset()+TSHIELDZPOS-TSHIELDLENGTH/2); Vector3D shieldAxis = new Vector3D(0,0,1); Arc3D shieldBase = new Arc3D(shieldOrigin, shieldCenter, shieldAxis, 2*Math.PI); Cylindrical3D shieldCylinder = new Cylindrical3D(shieldBase, TSHIELDLENGTH); @@ -190,12 +195,12 @@ private void loadPolTarget() { targetMaterials = new ArrayList<>(); if("NH3".equals(Constants.getInstance().getTargetType())) targetMaterials.add(POLTARNH3); - else if("ND2".equals(Constants.getInstance().getTargetType())) + else if("ND3".equals(Constants.getInstance().getTargetType())) targetMaterials.add(POLTARND3); - targetCenter = new Point3D(0, 0, zTarget); + targetRadius = targetMaterials.get(0).getThickness(); - Point3D chamberCenter = new Point3D(0, 0, this.getZoffset()-100); - Point3D chamberOrigin = new Point3D(30, 0, this.getZoffset()-100); + Point3D chamberCenter = new Point3D(0, 0, this.getTargetZOffset()-100); + Point3D chamberOrigin = new Point3D(POLTARBATHRADIUS, 0, this.getTargetZOffset()-100); Vector3D chamberAxis = new Vector3D(0,0,1); Arc3D chamberBase = new Arc3D(chamberOrigin, chamberCenter, chamberAxis, 2*Math.PI); Cylindrical3D chamber = new Cylindrical3D(chamberBase, 200); @@ -205,8 +210,8 @@ else if("ND2".equals(Constants.getInstance().getTargetType())) scatteringChamberSurface.addMaterial(POLTARBATH); scatteringChamberSurface.passive=true; - Point3D shieldCenter = new Point3D(0, 0, this.getZoffset()-100); - Point3D shieldOrigin = new Point3D(45, 0, this.getZoffset()-100); + Point3D shieldCenter = new Point3D(0, 0, this.getTargetZOffset()-100); + Point3D shieldOrigin = new Point3D(POLTARRADIUS, 0, this.getTargetZOffset()-100); Vector3D shieldAxis = new Vector3D(0,0,1); Arc3D shieldBase = new Arc3D(shieldOrigin, shieldCenter, shieldAxis, 2*Math.PI); Cylindrical3D shieldCylinder = new Cylindrical3D(shieldBase, 200); @@ -219,10 +224,6 @@ public List getTargetMaterials() { return targetMaterials; } - public Point3D getTargetCenter() { - return targetCenter; - } - public Surface getScatteringChamber() { return scatteringChamberSurface; } diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java index 457ec60453..e3a170289d 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java @@ -102,17 +102,13 @@ private Surface getTarget(double xbeam, double ybeam, boolean beamSpot) { Vector3D u = new Vector3D(0,0,1); Point3D p = new Point3D(xbeam, ybeam, 0); Line3D l = new Line3D(p, u); - Surface target = null; - if(Geometry.getInstance().getTargetCenter()!=null) { - Point3D center = new Point3D(Geometry.getInstance().getTargetCenter()); - center.setZ(-1000); - Point3D origin = new Point3D(Geometry.getInstance().getTargetMaterials().get(0).getThickness()+center.x(), center.y(), center.z()); + Surface target = new Surface(l.origin(), l.end(), Constants.DEFAULTSWIMACC); + if(Geometry.getInstance().getTargetRadius()>0) { + Point3D center = new Point3D(0, 0, Geometry.getInstance().getTargetZOffset()-Geometry.getInstance().getTargetHalfLength()); + Point3D origin = new Point3D(Geometry.getInstance().getTargetRadius()+center.x(), center.y(), center.z()); Arc3D base = new Arc3D(origin, center, u, 2*Math.PI); - Cylindrical3D cell = new Cylindrical3D(base, 2000); - target = new Surface(l.origin(), l.end(), cell, Constants.DEFAULTSWIMACC); - } - else { - target = new Surface(l.origin(), l.end(), Constants.DEFAULTSWIMACC); + Cylindrical3D cell = new Cylindrical3D(base, Geometry.getInstance().getTargetHalfLength()*2); + target.lineTube = cell; } for(Material m : Geometry.getInstance().getTargetMaterials()) target.addMaterial(m); diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/track/Cell.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/track/Cell.java index ab71163321..1d9701ae5e 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/track/Cell.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/track/Cell.java @@ -90,7 +90,7 @@ public Point2d getCrs2D(int i, String vw) { point.set(cross.getPoint().x(), cross.getPoint().y()); } if (vw.equalsIgnoreCase("ZR")) { - point.set(cross.getPoint().z() - Geometry.getInstance().getZoffset(), cross.getRadius()); + point.set(cross.getPoint().z() - Geometry.getInstance().getTargetZOffset(), cross.getRadius()); } return point; } diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/track/Seed.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/track/Seed.java index 1ef9492134..5b11f32d41 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/track/Seed.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/track/Seed.java @@ -437,7 +437,7 @@ public boolean isGood() { System.out.println("Pass SSA , c2 ok "+(this.getChi2() <= Constants.CHI2CUTSSA * (this.getNDF() + 5)) +" ndf ok "+ (this.getNDF() >= Constants.NDFCUT) +" r ok "+ (this.getHelix().radius() >= Constants.getInstance().getRCUT()) - +" dz ok "+ (Math.abs(Geometry.getInstance().getZoffset()-this.getHelix().getZ0()) <= Geometry.getInstance().getZlength()+Constants.getInstance().getZRANGE()) + +" dz ok "+ (Math.abs(Geometry.getInstance().getTargetZOffset()-this.getHelix().getZ0()) <= Geometry.getInstance().getTargetHalfLength()+Constants.getInstance().getZRANGE()) +" "); } boolean pass = true; @@ -449,7 +449,7 @@ public boolean isGood() { pass = false; if(this.getHelix().radius() < Constants.getInstance().getRCUT()) pass = false; - if(Math.abs(Geometry.getInstance().getZoffset()-this.getHelix().getZ0()) > Geometry.getInstance().getZlength()+Constants.getInstance().getZRANGE()+Constants.DZCUTBUFFEESSA) + if(Math.abs(Geometry.getInstance().getTargetZOffset()-this.getHelix().getZ0()) > Geometry.getInstance().getTargetHalfLength()+Constants.getInstance().getZRANGE()+Constants.DZCUTBUFFEESSA) pass = false; return pass; } diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/track/Track.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/track/Track.java index 0222806d4c..95a46667b4 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/track/Track.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/track/Track.java @@ -328,7 +328,7 @@ else if(this.getChi2() > Constants.CHI2CUT * (this.getNDF() + 5)) return false; if(this.getHelix().radius() < Constants.getInstance().getRCUT()) return false; - if(Math.abs(Geometry.getInstance().getZoffset()-this.getHelix().getZ0()) > Geometry.getInstance().getZlength()+Constants.getInstance().getZRANGE()) + if(Math.abs(Geometry.getInstance().getTargetZOffset()-this.getHelix().getZ0()) > Geometry.getInstance().getTargetHalfLength()+Constants.getInstance().getZRANGE()) return false; else return true; diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/track/TrackSeederRZ.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/track/TrackSeederRZ.java index 14ddf44ad8..8c1e3bec30 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/track/TrackSeederRZ.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/track/TrackSeederRZ.java @@ -182,8 +182,8 @@ private boolean interceptOK(Cross c1, Cross c2) { boolean value = false; double sl = (c1.getPoint().z() - c2.getPoint().z())/(c1.getPoint().toVector3D().rho() - c2.getPoint().toVector3D().rho()); double in = -sl*c1.getPoint().toVector3D().rho()+c1.getPoint().z(); - double targetCen = Geometry.getInstance().getZoffset(); - double targetLen = Geometry.getInstance().getZlength(); + double targetCen = Geometry.getInstance().getTargetZOffset(); + double targetLen = Geometry.getInstance().getTargetHalfLength(); if(Math.abs(targetCen-in) Date: Sun, 18 Feb 2024 19:28:16 -0500 Subject: [PATCH 06/13] updating polarized target material parameters based on values from C. Keith --- .../src/main/java/org/jlab/rec/cvt/Geometry.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java index a4dcd693fa..d9d3d7ac3d 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java @@ -74,13 +74,13 @@ public class Geometry { // polarized target private static double POLTARBATHRADIUS = 30; private static double POLTARRADIUS = 45; - private static final Material POLTARNH3 = new Material("NH3", 7.5, 0.5782E-3, 0.55, 450.0, 65, Units.MM); - private static final Material POLTARND3 = new Material("ND3", 10.0, 0.6622E-3, 0.5, 450.0, 65, Units.MM); - private static final Material POLTARCUP = new Material("PCTFE", 0.1, 2.135E-3, 0.5, 450.0, 65, Units.MM); - private static final Material POLTARLHE = new Material("LHE", 20.0, 0.147E-3, 0.5, 6400.0, 22, Units.MM); - private static final Material POLTARBATH = new Material("BATH", 0.76, 2.135E-3, 0.5, 450.0, 65, Units.MM); - private static final Material POLTARAL = new Material("Al", 1.63, 2.7E-3, 0.48181, 397.0, 166, Units.MM); - private static final Material POLTARCF = new Material("CarbonFiber", 1.0, 1.75E-3, 0.51342, 250.0, 78, Units.MM); + private static final Material POLTARNH3 = new Material("NH3", 7.5, 0.5782E-3, 0.55, 916.6, 47.9, Units.MM); + private static final Material POLTARND3 = new Material("ND3", 10.0, 0.6622E-3, 0.5, 893.7, 47.9, Units.MM); + private static final Material POLTARCUP = new Material("PCTFE", 0.1, 2.135E-3, 0.5, 134.2, 120.7, Units.MM); + private static final Material POLTARLHE = new Material("LHE", 20.0, 0.147E-3, 0.5, 6689.4, 41.8, Units.MM); + private static final Material POLTARBATH = new Material("BATH", 0.76, 2.135E-3, 0.5, 134.2, 120.7, Units.MM); + private static final Material POLTARAL = new Material("Al", 1.63, 2.7E-3, 0.48181, 88.9, 166, Units.MM); + private static final Material POLTARCF = new Material("CarbonFiber", 1.0, 1.75E-3, 0.51342, 246.9, 78, Units.MM); // other materials public static final Material SCINTILLATOR = new Material("Scintillator", 1, 1.03E-3, 0.54141, 439.0, 64.7, Units.MM); From 63b8773e2ae4c122c0858bad3cad19ff2fd0a3f3 Mon Sep 17 00:00:00 2001 From: Raffaella De Vita Date: Mon, 19 Feb 2024 18:46:42 -0500 Subject: [PATCH 07/13] reading new target material table --- .../jlab/detector/base/GeometryFactory.java | 1 + .../main/java/org/jlab/rec/cvt/Geometry.java | 26 ++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/base/GeometryFactory.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/base/GeometryFactory.java index 1eb6a044bf..04dd0cee12 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/base/GeometryFactory.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/base/GeometryFactory.java @@ -108,6 +108,7 @@ public static ConstantProvider getConstants(DetectorType type, int run, String v if(type==DetectorType.TARGET){ provider.loadTable("/geometry/target"); + provider.loadTable("/geometry/materials/target"); } if(type==DetectorType.FMT){ diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java index d9d3d7ac3d..a68de724e1 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java @@ -32,6 +32,7 @@ import org.jlab.rec.cvt.bmt.CCDBConstantsLoader; import org.jlab.rec.cvt.measurement.Measurements; import org.jlab.rec.cvt.svt.SVTGeometry; +import org.jlab.utils.groups.IndexedList; import org.jlab.utils.groups.IndexedTable; import org.jlab.utils.options.OptionParser; @@ -46,7 +47,8 @@ public class Geometry { private CTOFGeant4Factory ctofGeometry = null; private Detector cndGeometry = null; private List outerSurfaces = null; - + + private IndexedList targetMaterialsTable = new IndexedList<>(3); private double targetPosition = 0; private double targetHalfLength = 0; private double targetRadius = 0; @@ -120,7 +122,7 @@ private synchronized void load(String variation, int run, IndexedTable svtLorent ConstantProvider providerTG = GeometryFactory.getConstants(DetectorType.TARGET, run, variation); this.targetPosition = providerTG.getDouble("/geometry/target/position",0)*10; this.targetHalfLength = providerTG.getDouble("/geometry/target/length",0)*10; - this.initTarget(); + this.initTarget(providerTG); ConstantProvider providerCTOF = GeometryFactory.getConstants(DetectorType.CTOF, run, variation); ctofGeometry = new CTOFGeant4Factory(providerCTOF); @@ -147,7 +149,7 @@ public double getTargetRadius() { return targetRadius; } - private void initTarget() { + private void initTarget(ConstantProvider provider) { if("LH2".equals(Constants.getInstance().getTargetType()) || "LD2".equals(Constants.getInstance().getTargetType())) this.loadCryoTarget(); @@ -191,6 +193,24 @@ else if("LD2".equals(Constants.getInstance().getTargetType())) targetShieldSurface.passive=true; } + private void loadPolTarget(ConstantProvider provider) { + for(int i=0; i0 && layer<4) { + targetMaterialsTable.add(new Material("L"+layer+"C"+component, + provider.getDouble("/geometry/material/target/thickness", i), + provider.getDouble("/geometry/material/target/density", i), + provider.getDouble("/geometry/material/target/ZoverA", i), + provider.getDouble("/geometry/material/target/X0", i), + provider.getDouble("/geometry/material/target/i", i), + Units.CM), + sector, layer, component); + } + } + } + private void loadPolTarget() { targetMaterials = new ArrayList<>(); if("NH3".equals(Constants.getInstance().getTargetType())) From 7ea78185fc42bdf8c88a6c6fec1aa579df21dccc Mon Sep 17 00:00:00 2001 From: Raffaella De Vita Date: Wed, 21 Feb 2024 17:07:50 -0500 Subject: [PATCH 08/13] reading target parametrs for CVT eloss from CCDB - phase 1 --- .../clas/tracking/kalmanfilter/Material.java | 9 +- .../clas/tracking/kalmanfilter/Surface.java | 16 +- .../main/java/org/jlab/rec/cvt/Constants.java | 2 - .../main/java/org/jlab/rec/cvt/Geometry.java | 177 +++++++++++++++--- .../rec/cvt/measurement/Measurements.java | 3 - .../org/jlab/rec/cvt/services/CVTEngine.java | 2 +- .../rec/cvt/services/CVTSecondPassEngine.java | 3 +- .../rec/cvt/services/TracksFromTargetRec.java | 1 - 8 files changed, 173 insertions(+), 40 deletions(-) diff --git a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Material.java b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Material.java index d16f271e64..12b6a19d94 100644 --- a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Material.java +++ b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Material.java @@ -74,5 +74,12 @@ public double getEloss(double p, double mass) { return dE; } - + @Override + public String toString() { + String s = "Material: "; + s = s + String.format("Name=%s thickness=%.9f density=%.9f Z/A=%.6f x0=%9f IeV=%.9f", + this.getName(), this.getThickness(),this.getDensity(), + this.getZoverA(),this.getX0(), this.getIeV()); + return s; + } } diff --git a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Surface.java b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Surface.java index 53e6b6a632..7ee30e16dd 100644 --- a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Surface.java +++ b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Surface.java @@ -124,7 +124,7 @@ public Surface(Point3D endPoint1, Point3D endPoint2, Cylindrical3D tube, double @Override public String toString() { String s = "Surface: "; - s = s + String.format("Type=%s Index=%d Layer=%d Sector=%d Emisphere=%.1f X0=%.4f thickness=%.4f Z/A=%.4f Error=%.4f Passive=%b", + s = s + String.format("Type=%s Index=%d Layer=%d Sector=%d Emisphere=%.1f thickness=%.4f X0=%.4f Z/A=%.4f Error=%.4f Passive=%b", this.type.name(), this.getIndex(),this.getLayer(),this.getSector(),this.hemisphere,this.getThickness(),this.getToverX0(), this.getZoverA(),this.getError(), this.passive); if(type==Type.PLANEWITHSTRIP) { @@ -145,6 +145,7 @@ else if(type==Type.CYLINDERWITHLINE) { else if(type==Type.LINE) { s = s + "\n\t" + this.lineEndPoint1.toString(); s = s + "\n\t" + this.lineEndPoint2.toString(); + if(this.lineTube!=null) s = s + "\n\t" + this.lineTube.toString(); } return s; } @@ -210,6 +211,19 @@ public void addMaterial(String name, double thickness, double density, double Zo this.materials.add(new Material(name, thickness, density, ZoverA, X0, IeV, unit)); } + public double getRadius() { + if(this.cylinder!=null) + return this.cylinder.baseArc().radius(); + else if(this.lineTube!=null) + return this.lineTube.baseArc().radius(); + else + return 0; + } + + public double getLength() { + return this.cylinder.height(); + } + public double getThickness() { double t = 0; for(Material m : this.materials) { diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java index f633974264..c7ff05c0be 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java @@ -6,8 +6,6 @@ import java.util.logging.Logger; import org.jlab.clas.pdg.PhysicsConstants; import org.jlab.clas.swimtools.Swim; -import org.jlab.clas.tracking.kalmanfilter.Material; -import org.jlab.clas.tracking.kalmanfilter.Units; import org.jlab.clas.tracking.utilities.MatrixOps.Libr; import org.jlab.rec.cvt.svt.SVTParameters; diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java index a68de724e1..559374ef23 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java @@ -2,11 +2,15 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.swing.JFrame; import org.jlab.clas.tracking.kalmanfilter.Material; import org.jlab.clas.tracking.kalmanfilter.Surface; -import org.jlab.clas.tracking.kalmanfilter.Type; import org.jlab.clas.tracking.kalmanfilter.Units; import org.jlab.clas.tracking.objects.Strip; import org.jlab.detector.base.DetectorType; @@ -32,7 +36,6 @@ import org.jlab.rec.cvt.bmt.CCDBConstantsLoader; import org.jlab.rec.cvt.measurement.Measurements; import org.jlab.rec.cvt.svt.SVTGeometry; -import org.jlab.utils.groups.IndexedList; import org.jlab.utils.groups.IndexedTable; import org.jlab.utils.options.OptionParser; @@ -48,12 +51,13 @@ public class Geometry { private Detector cndGeometry = null; private List outerSurfaces = null; - private IndexedList targetMaterialsTable = new IndexedList<>(3); + private Map> targetSurfaces = new LinkedHashMap<>(); private double targetPosition = 0; private double targetHalfLength = 0; private double targetRadius = 0; private List targetMaterials = null; + private Surface targetCellSurface = null; private Surface scatteringChamberSurface = null; private Surface targetShieldSurface = null; @@ -90,6 +94,9 @@ public class Geometry { private static boolean LOADED; + private final static Logger LOGGER = Logger.getLogger(Geometry.class.getName()); + + // private constructor for a singleton private Geometry() { } @@ -115,7 +122,7 @@ public synchronized static void initialize(String variation, int run, IndexedTab LOADED = true; } } - + private synchronized void load(String variation, int run, IndexedTable svtLorentz, IndexedTable bmtVoltage) { // Load target @@ -137,25 +144,15 @@ private synchronized void load(String variation, int run, IndexedTable svtLorent outerSurfaces = Measurements.getOuters(); } - public double getTargetZOffset() { - return targetPosition; - } - - public double getTargetHalfLength() { - return targetHalfLength; - } - - public double getTargetRadius() { - return targetRadius; - } - private void initTarget(ConstantProvider provider) { if("LH2".equals(Constants.getInstance().getTargetType()) || "LD2".equals(Constants.getInstance().getTargetType())) this.loadCryoTarget(); else if("NH3".equals(Constants.getInstance().getTargetType()) || - "ND3".equals(Constants.getInstance().getTargetType())) + "ND3".equals(Constants.getInstance().getTargetType())) { this.loadPolTarget(); + this.loadPolTarget(provider); + } else this.loadCryoTarget(); } @@ -194,23 +191,132 @@ else if("LD2".equals(Constants.getInstance().getTargetType())) } private void loadPolTarget(ConstantProvider provider) { - for(int i=0; i0 && layer<4) { - targetMaterialsTable.add(new Material("L"+layer+"C"+component, - provider.getDouble("/geometry/material/target/thickness", i), - provider.getDouble("/geometry/material/target/density", i), - provider.getDouble("/geometry/material/target/ZoverA", i), - provider.getDouble("/geometry/material/target/X0", i), - provider.getDouble("/geometry/material/target/i", i), - Units.CM), - sector, layer, component); + if(!targetSurfaces.containsKey(layer)) + targetSurfaces.put(layer, new ArrayList<>()); + double thickness = provider.getDouble("/geometry/materials/target/thickness", i)*10; + double rmin = provider.getDouble("/geometry/materials/target/radius", i)*10; + double rmax = rmin+thickness; + double length = provider.getDouble("/geometry/materials/target/length", i)*10; + Point3D center = new Point3D(0, 0, this.getTargetZOffset()-length/2); + Vector3D axis = new Vector3D(0,0,1); + Surface surface = null; + if(layer==1 && component==1 && rmin==0) { // this is the target cell, assume the volume is a bulk cylinder + Point3D origin = new Point3D(rmax, 0, this.getTargetZOffset()-length/2); + Arc3D arc = new Arc3D(origin, center, axis, 2*Math.PI); + Cylindrical3D cylinder = new Cylindrical3D(arc, length); + surface = new Surface(center, cylinder.highArc().center(), Constants.DEFAULTSWIMACC); + surface.lineTube = cylinder; + } + else { // use min radius for other surfaces + Point3D origin = new Point3D(rmin, 0, this.getTargetZOffset()-length/2); + Arc3D arc = new Arc3D(origin, center, axis, 2*Math.PI); + Cylindrical3D cylinder = new Cylindrical3D(arc, length); + surface = new Surface(cylinder, new Strip(0, 0, 0), Constants.DEFAULTSWIMACC); + } + surface.addMaterial("L"+layer+"C"+component, + provider.getDouble("/geometry/materials/target/thickness", i)*10, + provider.getDouble("/geometry/materials/target/density", i)/1000, + provider.getDouble("/geometry/materials/target/ZoverA", i), + provider.getDouble("/geometry/materials/target/X0", i)*10, + provider.getDouble("/geometry/materials/target/I", i), + Units.MM); + surface.setIndex(component); + surface.passive=true; + System.out.println(layer + " " + surface); + targetSurfaces.get(layer).add(surface); + } + else if(layer!=0) { + LOGGER.log(Level.WARNING, "Invalid target layer = " + layer + ": will be ignored"); } } + // reorder surfaces + for(int layer : targetSurfaces.keySet()) { + List surfaces = targetSurfaces.get(layer); + Collections.sort(surfaces); + } + // check consistency + double r=0; + for(int il=0; il<3; il++) { + int layer = il+1; + if(!targetSurfaces.containsKey(layer)) { + LOGGER.log(Level.SEVERE, "Target layer " + layer + " is undefined"); + System.exit(1); + } + else if(layer==1 && targetSurfaces.get(layer).get(0).getIndex()!=1) { + LOGGER.log(Level.SEVERE, "Target cell is undefined"); + System.exit(1); + } + else if(layer==1 && targetSurfaces.get(layer).get(0).lineTube!=null && targetSurfaces.get(layer).get(0).getMaterials().size()>1) { + LOGGER.log(Level.SEVERE, "Handling of multiple materials with bulk target not implemented yet"); + System.exit(1); + } + else { + for(Surface s : targetSurfaces.get(layer)) { + if(s.getRadius()(); if("NH3".equals(Constants.getInstance().getTargetType())) @@ -240,6 +346,19 @@ else if("ND3".equals(Constants.getInstance().getTargetType())) targetShieldSurface.addMaterial(POLTARCF); targetShieldSurface.passive=true; } + + public double getTargetZOffset() { + return targetPosition; + } + + public double getTargetHalfLength() { + return targetHalfLength; + } + + public double getTargetRadius() { + return targetRadius; + } + public List getTargetMaterials() { return targetMaterials; } diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java index e3a170289d..583f11eb9d 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java @@ -4,11 +4,8 @@ import java.util.List; import org.jlab.clas.tracking.kalmanfilter.Material; import org.jlab.clas.tracking.kalmanfilter.Surface; -import org.jlab.clas.tracking.kalmanfilter.Type; -import org.jlab.clas.tracking.kalmanfilter.Units; import org.jlab.clas.tracking.objects.Strip; import org.jlab.detector.base.DetectorType; -import org.jlab.detector.geant4.v2.SVT.SVTConstants; import org.jlab.geom.prim.Arc3D; import org.jlab.geom.prim.Cylindrical3D; import org.jlab.geom.prim.Line3D; diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java index 2564d1fa0a..10ed958fec 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java @@ -290,7 +290,7 @@ public boolean processDataEvent(DataEvent event) { IndexedTable bmtStripThreshold = this.getConstantsManager().getConstants(run, "/calibration/mvt/bmt_strip_voltage_thresholds"); IndexedTable beamPos = this.getConstantsManager().getConstants(run, "/geometry/beam/position"); - Geometry.initialize(this.getConstantsManager().getVariation(), 11, svtLorentz, bmtVoltage); + Geometry.getInstance().initialize(this.getConstantsManager().getVariation(), run, svtLorentz, bmtVoltage); CVTReconstruction reco = new CVTReconstruction(swimmer); diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTSecondPassEngine.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTSecondPassEngine.java index 8f6ed67417..645974c313 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTSecondPassEngine.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTSecondPassEngine.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.List; import org.jlab.clas.swimtools.Swim; -import org.jlab.detector.base.DetectorType; import org.jlab.io.base.DataBank; import org.jlab.io.base.DataEvent; import org.jlab.rec.cvt.Constants; @@ -43,7 +42,7 @@ public boolean processDataEvent(DataEvent event) { IndexedTable bmtVoltage = this.getConstantsManager().getConstants(run, "/calibration/mvt/bmt_voltage"); IndexedTable beamPos = this.getConstantsManager().getConstants(run, "/geometry/beam/position"); - Geometry.initialize(this.getConstantsManager().getVariation(), 11, svtLorentz, bmtVoltage); + Geometry.getInstance().initialize(this.getConstantsManager().getVariation(), run, svtLorentz, bmtVoltage); if(Constants.getInstance().isCosmics) { return true; diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/TracksFromTargetRec.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/TracksFromTargetRec.java index fd662a541f..7e78c191fd 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/TracksFromTargetRec.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/TracksFromTargetRec.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.List; import java.util.Map; import org.jlab.clas.pdg.PDGDatabase; From 80f0ce6a41e5306c7ec09a7b0ca0cda3c479db28 Mon Sep 17 00:00:00 2001 From: Raffaella De Vita Date: Fri, 23 Feb 2024 16:46:40 -0500 Subject: [PATCH 09/13] complete implementation of CVT eloss based on new /geometry/materials/table, tested for RG-A and RG-C targets --- .../org/jlab/geom/prim/Cylindrical3D.java | 5 +- .../clas/tracking/kalmanfilter/Surface.java | 93 +++++---- .../kalmanfilter/helical/StateVecs.java | 4 +- .../main/java/org/jlab/rec/cvt/Constants.java | 2 +- .../main/java/org/jlab/rec/cvt/Geometry.java | 180 +++++++++--------- .../rec/cvt/measurement/Measurements.java | 10 +- .../org/jlab/rec/cvt/services/CVTEngine.java | 2 +- .../rec/cvt/services/TracksFromTargetRec.java | 1 + 8 files changed, 158 insertions(+), 139 deletions(-) diff --git a/common-tools/clas-geometry/src/main/java/org/jlab/geom/prim/Cylindrical3D.java b/common-tools/clas-geometry/src/main/java/org/jlab/geom/prim/Cylindrical3D.java index 3675fd6d1a..dcce40b8e0 100644 --- a/common-tools/clas-geometry/src/main/java/org/jlab/geom/prim/Cylindrical3D.java +++ b/common-tools/clas-geometry/src/main/java/org/jlab/geom/prim/Cylindrical3D.java @@ -439,10 +439,9 @@ public double intersectionLength(Line3D line, List intersections) { else if(count==1) { return line.origin().distance(intersections.get(0)); } - if(count>2) System.out.println("aaaaaaaaaaa"); - } - return 0; } + return 0; + } /** * Returns true if the given point is on the surface of this cylindrical diff --git a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Surface.java b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Surface.java index 7ee30e16dd..7b5577c81c 100644 --- a/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Surface.java +++ b/common-tools/clas-tracking/src/main/java/org/jlab/clas/tracking/kalmanfilter/Surface.java @@ -25,7 +25,7 @@ public class Surface implements Comparable { public Point3D finitePlaneCorner1; public Point3D finitePlaneCorner2; public Cylindrical3D cylinder; - public Cylindrical3D lineTube; + public Cylindrical3D lineVolume; private Transformation3D toGlobal = new Transformation3D(); private Transformation3D toLocal = new Transformation3D(); public Arc3D arc; @@ -113,11 +113,11 @@ public Surface(Point3D endPoint1, Point3D endPoint2, double accuracy) { swimAccuracy = accuracy; } - public Surface(Point3D endPoint1, Point3D endPoint2, Cylindrical3D tube, double accuracy) { + public Surface(Point3D endPoint1, Point3D endPoint2, Cylindrical3D volume, double accuracy) { type = Type.LINE; lineEndPoint1 = endPoint1; lineEndPoint2 = endPoint2; - lineTube = tube; + lineVolume = volume; swimAccuracy = accuracy; } @@ -145,7 +145,7 @@ else if(type==Type.CYLINDERWITHLINE) { else if(type==Type.LINE) { s = s + "\n\t" + this.lineEndPoint1.toString(); s = s + "\n\t" + this.lineEndPoint2.toString(); - if(this.lineTube!=null) s = s + "\n\t" + this.lineTube.toString(); + if(this.lineVolume!=null) s = s + "\n\t" + this.lineVolume.toString(); } return s; } @@ -214,8 +214,8 @@ public void addMaterial(String name, double thickness, double density, double Zo public double getRadius() { if(this.cylinder!=null) return this.cylinder.baseArc().radius(); - else if(this.lineTube!=null) - return this.lineTube.baseArc().radius(); + else if(this.lineVolume!=null) + return this.lineVolume.baseArc().radius(); else return 0; } @@ -250,70 +250,89 @@ public double getZoverA() { return ZA/RhoX; } - public double getLocalDir(Point3D pos, Vector3D dir) { + public double getTrackLength(Point3D pos, Vector3D dir) { + return this.getTrackLength(pos, dir, 0); + } + + public double getTrackLength(Point3D pos, Vector3D dir, int materialIndex) { if(this.type!=Type.PLANEWITHSTRIP && this.type!=Type.CYLINDERWITHSTRIP && this.type!=Type.LINE) - return 1; + return this.getMaterials().get(materialIndex).getThickness(); else { if(this.type==Type.PLANEWITHSTRIP) { Vector3D norm = this.plane.normal(); - return Math.abs(norm.dot(dir)); + return this.getMaterials().get(materialIndex).getThickness()/Math.abs(norm.dot(dir)); } else if(this.type==Type.CYLINDERWITHSTRIP) { Vector3D axis = this.cylinder.getAxis().direction().asUnit(); dir.sub(dir.projection(axis)); - return Math.abs(dir.mag()); + return this.getMaterials().get(materialIndex).getThickness()/Math.abs(dir.mag()); } else if(this.type==Type.LINE) { - Vector3D line = this.lineEndPoint1.vectorTo(this.lineEndPoint2).asUnit(); - if(this.lineTube!=null) { + if(this.lineVolume==null) { + Vector3D line = this.lineEndPoint1.vectorTo(this.lineEndPoint2).asUnit(); + dir.sub(dir.projection(line)); + return this.getMaterials().get(materialIndex).getThickness()/Math.abs(dir.mag()); + } + else { Line3D track = new Line3D(pos, dir); -// Line3D track = new Line3D(new Point3D(lineEndPoint1.x(), lineEndPoint1.y(),pos.z()), dir); List intersections = new ArrayList<>(); - double trackLength = this.lineTube.intersectionLength(track, intersections); - if(trackLength>0) { - return this.getThickness()/trackLength; + double trackLength = this.lineVolume.intersectionLength(track, intersections); + if(materialIndex==0) { + return trackLength; } else { - return Double.MAX_VALUE; + for(Point3D p : intersections) { + if(this.lineVolume.isOnSurface(p)){ + Vector3D axis = this.lineVolume.getAxis().direction().asUnit(); + dir.sub(dir.projection(axis)); + return this.getMaterials().get(materialIndex).getThickness()/Math.abs(dir.mag()); + } + } + return 0; } } - else { - dir.sub(dir.projection(line)); - return Math.abs(dir.mag()); - } } return 0; } } public double getEloss(double p, double mass) { - double dE=0; - for(Material m : this.materials) { + double dE = 0; + for(int im=0; immass) scale = Math.sqrt(Ecorr*Ecorr - mass*mass)/mom.mag(); - mom.scale(scale); - } + double dE = -dir*this.getEloss(pos, mom, mass); + double Ecorr = Math.sqrt(mom.mag2() + mass*mass) + dE; + if(Ecorr>mass) scale = Math.sqrt(Ecorr*Ecorr - mass*mass)/mom.mag(); + mom.scale(scale); return scale; } public double getDx(Point3D pos, Vector3D mom) { - double cosDir = this.getLocalDir(pos, mom.asUnit()); - if(cosDir!=0) - return this.getThickness()/cosDir; - else - return 0; + double dx = 0; + for(int im=0; im0) { vec.kappa = vec.kappa/pScale; - vec.energyLoss = surf.getEloss(vec.getMomentum().mag(), mass); + vec.energyLoss = surf.getEloss(vec.getPosition(), vec.getMomentum(), mass); vec.dx = surf.getDx(vec.getPosition(), vec.getMomentum()); vec.updateFromHelix(); } diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java index c7ff05c0be..374ff3dc71 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java @@ -61,7 +61,7 @@ public static Constants getInstance() { public boolean useOnlyBMTC50PercTruthHits = false; public boolean useOnlyBMTZ50PercTruthHits = false; public boolean preElossCorrection = true; - private String targetType = "LH2"; + private String targetType = ""; public Libr KFMatrixLibrary; private int svtmaxclussize = 30; private int bmtcmaxclussize =30; diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java index 559374ef23..a0a1eae3f6 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java @@ -77,16 +77,16 @@ public class Geometry { private static final Material CRYOTARGETKAPTON = new Material("Kapton", 50E-3, 1.42E-3, 0.501, 285.7, 79.6, Units.MM); private static final Material CRYOTARGETRHOACELL = new Material("Rhoacell", 10.4, 0.1E-3, 0.5392, 1000, 93.0, Units.MM); - // polarized target - private static double POLTARBATHRADIUS = 30; - private static double POLTARRADIUS = 45; - private static final Material POLTARNH3 = new Material("NH3", 7.5, 0.5782E-3, 0.55, 916.6, 47.9, Units.MM); - private static final Material POLTARND3 = new Material("ND3", 10.0, 0.6622E-3, 0.5, 893.7, 47.9, Units.MM); - private static final Material POLTARCUP = new Material("PCTFE", 0.1, 2.135E-3, 0.5, 134.2, 120.7, Units.MM); - private static final Material POLTARLHE = new Material("LHE", 20.0, 0.147E-3, 0.5, 6689.4, 41.8, Units.MM); - private static final Material POLTARBATH = new Material("BATH", 0.76, 2.135E-3, 0.5, 134.2, 120.7, Units.MM); - private static final Material POLTARAL = new Material("Al", 1.63, 2.7E-3, 0.48181, 88.9, 166, Units.MM); - private static final Material POLTARCF = new Material("CarbonFiber", 1.0, 1.75E-3, 0.51342, 246.9, 78, Units.MM); +// // polarized target +// private static double POLTARBATHRADIUS = 30; +// private static double POLTARRADIUS = 45; +// private static final Material POLTARNH3 = new Material("NH3", 7.5, 0.5782E-3, 0.55, 916.6, 47.9, Units.MM); +// private static final Material POLTARND3 = new Material("ND3", 10.0, 0.6622E-3, 0.5, 893.7, 47.9, Units.MM); +// private static final Material POLTARCUP = new Material("PCTFE", 0.1, 2.135E-3, 0.5, 134.2, 120.7, Units.MM); +// private static final Material POLTARLHE = new Material("LHE", 20.0, 0.147E-3, 0.5, 6689.4, 41.8, Units.MM); +// private static final Material POLTARBATH = new Material("BATH", 0.76, 2.135E-3, 0.5, 134.2, 120.7, Units.MM); +// private static final Material POLTARAL = new Material("Al", 1.63, 2.7E-3, 0.48181, 88.9, 166, Units.MM); +// private static final Material POLTARCF = new Material("CarbonFiber", 1.0, 1.75E-3, 0.51342, 246.9, 78, Units.MM); // other materials public static final Material SCINTILLATOR = new Material("Scintillator", 1, 1.03E-3, 0.54141, 439.0, 64.7, Units.MM); @@ -148,13 +148,9 @@ private void initTarget(ConstantProvider provider) { if("LH2".equals(Constants.getInstance().getTargetType()) || "LD2".equals(Constants.getInstance().getTargetType())) this.loadCryoTarget(); - else if("NH3".equals(Constants.getInstance().getTargetType()) || - "ND3".equals(Constants.getInstance().getTargetType())) { - this.loadPolTarget(); - this.loadPolTarget(provider); + else { + this.loadTarget(provider); } - else - this.loadCryoTarget(); } private void loadCryoTarget() { @@ -190,7 +186,17 @@ else if("LD2".equals(Constants.getInstance().getTargetType())) targetShieldSurface.passive=true; } - private void loadPolTarget(ConstantProvider provider) { + /** + * Creates target surfaces reading the /geometry/materials/target table from CCDB + * Here are the rules: + * - surfaces are identified by layer and should be defined for layer = 1, 2, and 3 + * - multiple sublayers, identified by component, can be added with different materials + * - layer=1 component=1 is the target material and should always be present + * - the target material is assumed to be a full cylinder while the other surfaces are "tubes" + * - for layer 1, the target material volume is created and any additional sublayer is assumed to be a equivalent to the target cell walls + * - for layer 2 and 3, when multiple sublayers are defined, the surface radius and length are set to the largest values among the sublayers + */ + private void loadTarget(ConstantProvider provider) { for(int i=0; i0 && layer<4) { if(!targetSurfaces.containsKey(layer)) targetSurfaces.put(layer, new ArrayList<>()); - double thickness = provider.getDouble("/geometry/materials/target/thickness", i)*10; - double rmin = provider.getDouble("/geometry/materials/target/radius", i)*10; - double rmax = rmin+thickness; + double rmin = provider.getDouble("/geometry/materials/target/rmin", i)*10; + double rmax = provider.getDouble("/geometry/materials/target/rmax", i)*10; double length = provider.getDouble("/geometry/materials/target/length", i)*10; Point3D center = new Point3D(0, 0, this.getTargetZOffset()-length/2); Vector3D axis = new Vector3D(0,0,1); @@ -210,7 +215,7 @@ private void loadPolTarget(ConstantProvider provider) { Arc3D arc = new Arc3D(origin, center, axis, 2*Math.PI); Cylindrical3D cylinder = new Cylindrical3D(arc, length); surface = new Surface(center, cylinder.highArc().center(), Constants.DEFAULTSWIMACC); - surface.lineTube = cylinder; + surface.lineVolume = cylinder; } else { // use min radius for other surfaces Point3D origin = new Point3D(rmin, 0, this.getTargetZOffset()-length/2); @@ -251,7 +256,7 @@ else if(layer==1 && targetSurfaces.get(layer).get(0).getIndex()!=1) { LOGGER.log(Level.SEVERE, "Target cell is undefined"); System.exit(1); } - else if(layer==1 && targetSurfaces.get(layer).get(0).lineTube!=null && targetSurfaces.get(layer).get(0).getMaterials().size()>1) { + else if(layer==1 && targetSurfaces.get(layer).get(0).lineVolume!=null && targetSurfaces.get(layer).get(0).getMaterials().size()>1) { LOGGER.log(Level.SEVERE, "Handling of multiple materials with bulk target not implemented yet"); System.exit(1); } @@ -267,85 +272,76 @@ else if(layer==1 && targetSurfaces.get(layer).get(0).lineTube!=null && targetSur } } } - targetCellSurface = this.getTargetCell(); - System.out.println(targetRadius); - targetRadius = this.getTargetCell().getRadius(); - System.out.println(targetRadius); - for(Material m : this.targetMaterials) - System.out.println(m); - targetMaterials=this.targetCellSurface.getMaterials(); - for(Material m : this.targetMaterials) { - System.out.println(m); - } + targetCellSurface = this.getTargetSurface(1); scatteringChamberSurface = this.getTargetSurface(2); targetShieldSurface = this.getTargetSurface(3); + targetRadius = this.targetCellSurface.getRadius(); + targetMaterials = this.getTargetCellSurface().getMaterials(); } - private Surface getTargetCell() { - if(!targetSurfaces.containsKey(1) || - targetSurfaces.get(1).isEmpty()) { - LOGGER.log(Level.SEVERE,"Target cell is undefined"); - } - Surface cell = targetSurfaces.get(1).get(0); - for(int i=1; i(); - if("NH3".equals(Constants.getInstance().getTargetType())) - targetMaterials.add(POLTARNH3); - else if("ND3".equals(Constants.getInstance().getTargetType())) - targetMaterials.add(POLTARND3); - targetRadius = targetMaterials.get(0).getThickness(); - - Point3D chamberCenter = new Point3D(0, 0, this.getTargetZOffset()-100); - Point3D chamberOrigin = new Point3D(POLTARBATHRADIUS, 0, this.getTargetZOffset()-100); - Vector3D chamberAxis = new Vector3D(0,0,1); - Arc3D chamberBase = new Arc3D(chamberOrigin, chamberCenter, chamberAxis, 2*Math.PI); - Cylindrical3D chamber = new Cylindrical3D(chamberBase, 200); - scatteringChamberSurface = new Surface(chamber, new Strip(0, 0, 0), Constants.DEFAULTSWIMACC); - scatteringChamberSurface.addMaterial(POLTARCUP); - scatteringChamberSurface.addMaterial(POLTARLHE); - scatteringChamberSurface.addMaterial(POLTARBATH); - scatteringChamberSurface.passive=true; - - Point3D shieldCenter = new Point3D(0, 0, this.getTargetZOffset()-100); - Point3D shieldOrigin = new Point3D(POLTARRADIUS, 0, this.getTargetZOffset()-100); - Vector3D shieldAxis = new Vector3D(0,0,1); - Arc3D shieldBase = new Arc3D(shieldOrigin, shieldCenter, shieldAxis, 2*Math.PI); - Cylindrical3D shieldCylinder = new Cylindrical3D(shieldBase, 200); - targetShieldSurface = new Surface(shieldCylinder, new Strip(0, 0, 0), Constants.DEFAULTSWIMACC); - targetShieldSurface.addMaterial(POLTARAL); - targetShieldSurface.addMaterial(POLTARCF); - targetShieldSurface.passive=true; - } +// private void loadPolTarget() { +// targetMaterials = new ArrayList<>(); +// if("NH3".equals(Constants.getInstance().getTargetType())) +// targetMaterials.add(POLTARNH3); +// else if("ND3".equals(Constants.getInstance().getTargetType())) +// targetMaterials.add(POLTARND3); +// targetRadius = targetMaterials.get(0).getThickness(); +// +// Point3D chamberCenter = new Point3D(0, 0, this.getTargetZOffset()-100); +// Point3D chamberOrigin = new Point3D(POLTARBATHRADIUS, 0, this.getTargetZOffset()-100); +// Vector3D chamberAxis = new Vector3D(0,0,1); +// Arc3D chamberBase = new Arc3D(chamberOrigin, chamberCenter, chamberAxis, 2*Math.PI); +// Cylindrical3D chamber = new Cylindrical3D(chamberBase, 200); +// scatteringChamberSurface = new Surface(chamber, new Strip(0, 0, 0), Constants.DEFAULTSWIMACC); +// scatteringChamberSurface.addMaterial(POLTARCUP); +// scatteringChamberSurface.addMaterial(POLTARLHE); +// scatteringChamberSurface.addMaterial(POLTARBATH); +// scatteringChamberSurface.passive=true; +// +// Point3D shieldCenter = new Point3D(0, 0, this.getTargetZOffset()-100); +// Point3D shieldOrigin = new Point3D(POLTARRADIUS, 0, this.getTargetZOffset()-100); +// Vector3D shieldAxis = new Vector3D(0,0,1); +// Arc3D shieldBase = new Arc3D(shieldOrigin, shieldCenter, shieldAxis, 2*Math.PI); +// Cylindrical3D shieldCylinder = new Cylindrical3D(shieldBase, 200); +// targetShieldSurface = new Surface(shieldCylinder, new Strip(0, 0, 0), Constants.DEFAULTSWIMACC); +// targetShieldSurface.addMaterial(POLTARAL); +// targetShieldSurface.addMaterial(POLTARCF); +// targetShieldSurface.passive=true; +// } public double getTargetZOffset() { return targetPosition; @@ -363,6 +359,10 @@ public List getTargetMaterials() { return targetMaterials; } + public Surface getTargetCellSurface() { + return this.targetCellSurface; + } + public Surface getScatteringChamber() { return scatteringChamberSurface; } diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java index 583f11eb9d..f70dfdede0 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java @@ -101,11 +101,11 @@ private Surface getTarget(double xbeam, double ybeam, boolean beamSpot) { Line3D l = new Line3D(p, u); Surface target = new Surface(l.origin(), l.end(), Constants.DEFAULTSWIMACC); if(Geometry.getInstance().getTargetRadius()>0) { - Point3D center = new Point3D(0, 0, Geometry.getInstance().getTargetZOffset()-Geometry.getInstance().getTargetHalfLength()); - Point3D origin = new Point3D(Geometry.getInstance().getTargetRadius()+center.x(), center.y(), center.z()); - Arc3D base = new Arc3D(origin, center, u, 2*Math.PI); - Cylindrical3D cell = new Cylindrical3D(base, Geometry.getInstance().getTargetHalfLength()*2); - target.lineTube = cell; +// Point3D center = new Point3D(0, 0, Geometry.getInstance().getTargetZOffset()-Geometry.getInstance().getTargetHalfLength()); +// Point3D origin = new Point3D(Geometry.getInstance().getTargetRadius()+center.x(), center.y(), center.z()); +// Arc3D base = new Arc3D(origin, center, u, 2*Math.PI); +// Cylindrical3D cell = new Cylindrical3D(base, Geometry.getInstance().getTargetHalfLength()*2); + target.lineVolume = Geometry.getInstance().getTargetCellSurface().lineVolume; } for(Material m : Geometry.getInstance().getTargetMaterials()) target.addMaterial(m); diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java index 10ed958fec..e278b0c9c7 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/CVTEngine.java @@ -67,7 +67,7 @@ public void setDocacutsum(double docacutsum) { private int removeRegion = 0; private int beamSpotConstraint = 2; private double beamSpotRadius = 0.3; - private String targetMaterial = "LH2"; + private String targetMaterial = ""; private boolean elossPrecorrection = true; private boolean svtSeeding = true; private boolean timeCuts = true; diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/TracksFromTargetRec.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/TracksFromTargetRec.java index 7e78c191fd..b7b1a35164 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/TracksFromTargetRec.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/TracksFromTargetRec.java @@ -201,6 +201,7 @@ public List getTracks(DataEvent event, boolean initFromMc, boolean kfFilt Point3D v = seed.getHelix().getVertex(); Vector3D p = seed.getHelix().getPXYZ(solenoidValue); if(Constants.getInstance().preElossCorrection && pid!=Constants.DEFAULTPID) { +// double pcorr = measure.getELoss(v, p, PDGDatabase.getParticleMass(pid)); double pcorr = measure.getELoss(p.mag(), PDGDatabase.getParticleMass(pid)); p.scale(pcorr/p.mag()); } From 22de997924092c18f71595911793a9483ce08973 Mon Sep 17 00:00:00 2001 From: Raffaella De Vita Date: Wed, 28 Feb 2024 19:51:08 -0500 Subject: [PATCH 10/13] removing printouts and commented code --- .../main/java/org/jlab/rec/cvt/Geometry.java | 35 ++----------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java index a0a1eae3f6..1e4c7ae1db 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java @@ -77,7 +77,7 @@ public class Geometry { private static final Material CRYOTARGETKAPTON = new Material("Kapton", 50E-3, 1.42E-3, 0.501, 285.7, 79.6, Units.MM); private static final Material CRYOTARGETRHOACELL = new Material("Rhoacell", 10.4, 0.1E-3, 0.5392, 1000, 93.0, Units.MM); -// // polarized target +// // polarized target NOW in CCDB // private static double POLTARBATHRADIUS = 30; // private static double POLTARRADIUS = 45; // private static final Material POLTARNH3 = new Material("NH3", 7.5, 0.5782E-3, 0.55, 916.6, 47.9, Units.MM); @@ -192,7 +192,7 @@ else if("LD2".equals(Constants.getInstance().getTargetType())) * - surfaces are identified by layer and should be defined for layer = 1, 2, and 3 * - multiple sublayers, identified by component, can be added with different materials * - layer=1 component=1 is the target material and should always be present - * - the target material is assumed to be a full cylinder while the other surfaces are "tubes" + * - the target material is assumed to be a full cylinder (rmin=0) while the other surfaces are "tubes" * - for layer 1, the target material volume is created and any additional sublayer is assumed to be a equivalent to the target cell walls * - for layer 2 and 3, when multiple sublayers are defined, the surface radius and length are set to the largest values among the sublayers */ @@ -232,7 +232,6 @@ private void loadTarget(ConstantProvider provider) { Units.MM); surface.setIndex(component); surface.passive=true; - System.out.println(layer + " " + surface); targetSurfaces.get(layer).add(surface); } else if(layer!=0) { @@ -312,36 +311,6 @@ private Surface getTargetSurface(int layer) { surface.passive=true; return surface; } - -// private void loadPolTarget() { -// targetMaterials = new ArrayList<>(); -// if("NH3".equals(Constants.getInstance().getTargetType())) -// targetMaterials.add(POLTARNH3); -// else if("ND3".equals(Constants.getInstance().getTargetType())) -// targetMaterials.add(POLTARND3); -// targetRadius = targetMaterials.get(0).getThickness(); -// -// Point3D chamberCenter = new Point3D(0, 0, this.getTargetZOffset()-100); -// Point3D chamberOrigin = new Point3D(POLTARBATHRADIUS, 0, this.getTargetZOffset()-100); -// Vector3D chamberAxis = new Vector3D(0,0,1); -// Arc3D chamberBase = new Arc3D(chamberOrigin, chamberCenter, chamberAxis, 2*Math.PI); -// Cylindrical3D chamber = new Cylindrical3D(chamberBase, 200); -// scatteringChamberSurface = new Surface(chamber, new Strip(0, 0, 0), Constants.DEFAULTSWIMACC); -// scatteringChamberSurface.addMaterial(POLTARCUP); -// scatteringChamberSurface.addMaterial(POLTARLHE); -// scatteringChamberSurface.addMaterial(POLTARBATH); -// scatteringChamberSurface.passive=true; -// -// Point3D shieldCenter = new Point3D(0, 0, this.getTargetZOffset()-100); -// Point3D shieldOrigin = new Point3D(POLTARRADIUS, 0, this.getTargetZOffset()-100); -// Vector3D shieldAxis = new Vector3D(0,0,1); -// Arc3D shieldBase = new Arc3D(shieldOrigin, shieldCenter, shieldAxis, 2*Math.PI); -// Cylindrical3D shieldCylinder = new Cylindrical3D(shieldBase, 200); -// targetShieldSurface = new Surface(shieldCylinder, new Strip(0, 0, 0), Constants.DEFAULTSWIMACC); -// targetShieldSurface.addMaterial(POLTARAL); -// targetShieldSurface.addMaterial(POLTARCF); -// targetShieldSurface.passive=true; -// } public double getTargetZOffset() { return targetPosition; From b618aaed6c74ceab58171e5d599ed25275a5a28e Mon Sep 17 00:00:00 2001 From: Raffaella De Vita Date: Wed, 28 Feb 2024 19:58:12 -0500 Subject: [PATCH 11/13] add more comments --- .../cvt/src/main/java/org/jlab/rec/cvt/Geometry.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java index 1e4c7ae1db..555eec510c 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Geometry.java @@ -127,8 +127,6 @@ private synchronized void load(String variation, int run, IndexedTable svtLorent // Load target ConstantProvider providerTG = GeometryFactory.getConstants(DetectorType.TARGET, run, variation); - this.targetPosition = providerTG.getDouble("/geometry/target/position",0)*10; - this.targetHalfLength = providerTG.getDouble("/geometry/target/length",0)*10; this.initTarget(providerTG); ConstantProvider providerCTOF = GeometryFactory.getConstants(DetectorType.CTOF, run, variation); @@ -145,6 +143,12 @@ private synchronized void load(String variation, int run, IndexedTable svtLorent } private void initTarget(ConstantProvider provider) { + // get target position and half-length from old table + // half-length used for track candidates vertex cut + this.targetPosition = provider.getDouble("/geometry/target/position",0)*10; + this.targetHalfLength = provider.getDouble("/geometry/target/length",0)*10; + // load target geometry and material, using CCDB table if targetMat yaml + // variable is not specified or differs from LH2/LD2 if("LH2".equals(Constants.getInstance().getTargetType()) || "LD2".equals(Constants.getInstance().getTargetType())) this.loadCryoTarget(); From aa5c9b965d94c35f9a93daad438155e57c48e737 Mon Sep 17 00:00:00 2001 From: Raffaella De Vita Date: Wed, 28 Feb 2024 20:03:15 -0500 Subject: [PATCH 12/13] removed unsupported targetMat yaml variable values --- .../cvt/src/main/java/org/jlab/rec/cvt/Constants.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java index 374ff3dc71..51303f0636 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/Constants.java @@ -125,9 +125,7 @@ public boolean kfBeamSpotConstraint() { public void setTargetMaterial(String material) { if(!material.equalsIgnoreCase("LH2") && - !material.equalsIgnoreCase("LD2") && - !material.equalsIgnoreCase("NH3") && - !material.equalsIgnoreCase("ND3") ) + !material.equalsIgnoreCase("LD2") ) System.out.println("Unknown target material " + material + ", keeping current setting " + targetType); else targetType = material; From ae7e35a459e06fb43b3b1f103ce1ea962a5d5c47 Mon Sep 17 00:00:00 2001 From: Raffaella De Vita Date: Wed, 28 Feb 2024 20:13:48 -0500 Subject: [PATCH 13/13] cleanups --- .../java/org/jlab/rec/cvt/measurement/Measurements.java | 6 +----- .../java/org/jlab/rec/cvt/services/TracksFromTargetRec.java | 1 - 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java index f70dfdede0..a7d5974d82 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/measurement/Measurements.java @@ -100,11 +100,7 @@ private Surface getTarget(double xbeam, double ybeam, boolean beamSpot) { Point3D p = new Point3D(xbeam, ybeam, 0); Line3D l = new Line3D(p, u); Surface target = new Surface(l.origin(), l.end(), Constants.DEFAULTSWIMACC); - if(Geometry.getInstance().getTargetRadius()>0) { -// Point3D center = new Point3D(0, 0, Geometry.getInstance().getTargetZOffset()-Geometry.getInstance().getTargetHalfLength()); -// Point3D origin = new Point3D(Geometry.getInstance().getTargetRadius()+center.x(), center.y(), center.z()); -// Arc3D base = new Arc3D(origin, center, u, 2*Math.PI); -// Cylindrical3D cell = new Cylindrical3D(base, Geometry.getInstance().getTargetHalfLength()*2); + if(Geometry.getInstance().getTargetCellSurface().lineVolume!=null) { target.lineVolume = Geometry.getInstance().getTargetCellSurface().lineVolume; } for(Material m : Geometry.getInstance().getTargetMaterials()) diff --git a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/TracksFromTargetRec.java b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/TracksFromTargetRec.java index b7b1a35164..7e78c191fd 100644 --- a/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/TracksFromTargetRec.java +++ b/reconstruction/cvt/src/main/java/org/jlab/rec/cvt/services/TracksFromTargetRec.java @@ -201,7 +201,6 @@ public List getTracks(DataEvent event, boolean initFromMc, boolean kfFilt Point3D v = seed.getHelix().getVertex(); Vector3D p = seed.getHelix().getPXYZ(solenoidValue); if(Constants.getInstance().preElossCorrection && pid!=Constants.DEFAULTPID) { -// double pcorr = measure.getELoss(v, p, PDGDatabase.getParticleMass(pid)); double pcorr = measure.getELoss(p.mag(), PDGDatabase.getParticleMass(pid)); p.scale(pcorr/p.mag()); }