From 926b2406bfea7e65fc36e34ebeeca44b927c5e1a Mon Sep 17 00:00:00 2001 From: Silvia Niccolai Date: Mon, 3 Feb 2025 12:36:52 -0500 Subject: [PATCH 1/7] New recoil detector for RGH (2 sectors, 3 layers/sector of urwell, x/y readout). Created new directory common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/ with Geant4Factory and StripFactory. Also crated reconstruction/recoil (hits, clusters, crosses). Tested on gemc, everything seems reasonable. --- .../geant4/v2/RECOIL/RecoilConstants.java | 108 ++++ .../geant4/v2/RECOIL/RecoilGeant4Factory.java | 307 ++++++++++++ .../geant4/v2/RECOIL/RecoilStripFactory.java | 460 ++++++++++++++++++ reconstruction/recoil/pom.xml | 35 ++ .../jlab/service/recoil/recoilCluster.java | 212 ++++++++ .../jlab/service/recoil/recoilConstants.java | 29 ++ .../org/jlab/service/recoil/recoilCross.java | 123 +++++ .../org/jlab/service/recoil/recoilEngine.java | 244 ++++++++++ .../org/jlab/service/recoil/recoilStrip.java | 206 ++++++++ 9 files changed, 1724 insertions(+) create mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilConstants.java create mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilGeant4Factory.java create mode 100644 common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilStripFactory.java create mode 100644 reconstruction/recoil/pom.xml create mode 100644 reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilCluster.java create mode 100644 reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilConstants.java create mode 100644 reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilCross.java create mode 100644 reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilEngine.java create mode 100644 reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilStrip.java diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilConstants.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilConstants.java new file mode 100644 index 0000000000..0f0970e8cc --- /dev/null +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilConstants.java @@ -0,0 +1,108 @@ +package org.jlab.detector.geant4.v2.RECOIL; + + +import org.jlab.detector.calib.utils.DatabaseConstantProvider; +import org.jlab.geom.prim.Point3D; + + +public class RecoilConstants { + + private final static String CCDBPATH = "/geometry/recoil/"; + + public final static int NMAXREGIONS = 3; //max number of regions + public final static int NREGIONS = 3; //number of regions + public final static int NSECTORS = 2; //number of sectors + public final static int NLAYERS = 2; //number of layers + public final static int NCHAMBERS = 1; //number of chambers in a sector + + public final static double HORIZONTHAL_OPENING_ANGLE = 34.; + public final static double VERTICAL_OPENING_ANGLE = 50.; + public final static double RADIUS[] = {33.5,55.5,79.5}; + public final static double WIDTH[] = new double[NMAXREGIONS]; + public final static double HEIGHT[] = new double[NMAXREGIONS]; + + public final static double THTILT = 0; // theta tilt (deg) + /* public final static double XENLARGEMENT = 0.5; // cm + public final static double YENLARGEMENT = 1.; // cm + public final static double ZENLARGEMENT = 0.1; // cm + + // Sector geometrical parameters + public final static double THOPEN = 34.; // opening angle between endplate planes (deg) + public final static double THTILT = 0; // theta tilt (deg) + public final static double THMIN = 4.694; // polar angle to the base of first chamber (deg) + public final static double SECTORHEIGHT = 146.21; //height of each sector (cm) + public final static double DX0CHAMBER0 = 5.197; // halfbase of chamber 1 (cm)*/ + + // Chamber volumes and materials (units are cm) + public final static double[] CHAMBERVOLUMESTHICKNESS = {0.0025, 0.0005,0.3, // window + 0.0025, 0.0005,0.4, // cathode + 0.0005, 0.005, 0.0005, // uRWell + DlC + 0.0005, 0.005, 0.0005, // Capacitive sharing layer1 + 0.0005, 0.005, 0.0005, // Capacitive sharing layer2 + 0.005, 0.0005,0.005, 0.005, 0.0005,0.005, 0.005, // Readout + 0.0127, 0.3, 0.0125}; // support + public final static String[] CHAMBERVOLUMESNAME = {"window_kapton", "window_Al", "window_gas", + "cathode_kapton", "cathode_Al", "cathode_gas", + "muRwell_Cu", "muRwell_kapton", "muRwell_dlc", + "capa_sharing_layer1_glue","capa_sharing_layer1_Cr","capa_sharing_layer1_kapton", + "capa_sharing_layer2_glue","capa_sharing_layer2_Cr","capa_sharing_layer2_kapton", + "readout1_glue", "readout1_Cu", "readout1_kapton", "readout2_glue", "readout2_Cu", "readout2_kapton", "readout3_glue", + "support_skin1_g10", "support_honeycomb_nomex", "support_skin2_g10"}; + + // URWELL position in the CLAS12 frame + /* public final static double TGT2DC0 = 228.078; // cm + // public final static double URWELL2DC0 = 2; // cm + public final static double URWELL2DC0[] = new double[NMAXREGIONS]; + public final static double DIST2TGT[] = new double[NMAXREGIONS]; + public final static double W2TGT[] = new double[NMAXREGIONS];; + public final static double YMIN[] = new double[NMAXREGIONS]; + public final static double ZMIN[] = new double[NMAXREGIONS];*/ + + public final static double PITCH = 0.1 ; // cm + public final static double STEREOANGLE = 90; // deg + + /* + * @return String a path to a directory in CCDB of the format {@code "/geometry/detector/"} + */ + public static String getCcdbPath() + { + return CCDBPATH; + } + + /** + * Loads the the necessary tables for the URWELL geometry for a given DatabaseConstantProvider. + * + * @return DatabaseConstantProvider the same thing + */ + public static DatabaseConstantProvider connect( DatabaseConstantProvider cp ) + { + // cp.loadTable( CCDBPATH +"RWELL"); + + load(cp ); + return cp; + } + + /** + * Reads all the necessary constants from CCDB into static variables. + * Please use a DatabaseConstantProvider to access CCDB and load the following tables: + * @param cp a ConstantProvider that has loaded the necessary tables + */ + + public static synchronized void load( DatabaseConstantProvider cp ) + { + // read constants from svt table +// NREGIONS = cp.getInteger( CCDBPATH+"svt/nRegions", 0 ); + + for (int i=0; i (volume.getName().contains(volumeName))) + .findAny() + .orElse(null); + } + + /** + * Returns the sector volume for the given sector number + * + * @param sector (1-6) + * @return the sector volume + */ + public Geant4Basic getSectorVolume(int region, int sector) { + + int r = region; + int s = sector; + + String volName = "region_Recoil_" + r + "_s" + s; + return this.getAllVolumes().stream() + .filter(volume -> (volume.getName().contains(volName))) + .findAny() + .orElse(null); + } + + public static void main(String[] args) { + DatabaseConstantProvider cp = new DatabaseConstantProvider(11, "default"); + + RecoilConstants.connect(cp); + + RecoilGeant4Factory factory = new RecoilGeant4Factory(cp, 1); + + factory.getAllVolumes().forEach(volume -> { + System.out.println(volume.gemcString()); + }); + + } +} diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilStripFactory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilStripFactory.java new file mode 100644 index 0000000000..ad03144ec1 --- /dev/null +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilStripFactory.java @@ -0,0 +1,460 @@ +package org.jlab.detector.geant4.v2.RECOIL; + +import eu.mihosoft.vrl.v3d.Vector3d; +import java.util.List; +import org.jlab.detector.calib.utils.DatabaseConstantProvider; +import org.jlab.detector.hits.DetHit; +import org.jlab.detector.volume.Geant4Basic; +import org.jlab.geom.prim.Line3D; +import org.jlab.geom.prim.Plane3D; +import org.jlab.geom.prim.Point3D; +import org.jlab.geom.prim.Vector3D; +import org.jlab.geometry.prim.Line3d; +import org.jlab.geometry.prim.Straight; +import org.jlab.utils.groups.IndexedList; + +/** + * Creates and handles the URWELL detector strips as 3D lines + * + * @author bondi + */ +public final class RecoilStripFactory { + + private RecoilGeant4Factory factory; + private IndexedList globalStrips = new IndexedList(3); + private IndexedList localStrips = new IndexedList(3); + private IndexedList planeStrips = new IndexedList(3); + private int nRegions; + private int nSectors; + private int nChambers; + private int nLayers; + + public RecoilStripFactory() { + } + + /** + * Create the strip factory based on constants from CCDB. + * Currently constants are defined in the RecoilConstants class. + * They will be moved to CCDB when finalized). + * @param cp database provide + */ + public RecoilStripFactory(DatabaseConstantProvider cp) { + this.init(cp); + } + + /** + * Initialize the factory by the strip maps + * @param cp + */ + public void init(DatabaseConstantProvider cp) { + this.init(cp, 1); + } + + /** + * Create the strip factory based on constants from CCDB. + * Currently constants are defined in the URWellConstants class. + * They will be moved to CCDB when finalized). + * @param cp database provide + * @param regions + */ + public RecoilStripFactory(DatabaseConstantProvider cp, int regions) { + this.init(cp, regions); + } + + /** + * Initialize the factory by the strip maps + * @param cp + * @param regions + */ + public void init(DatabaseConstantProvider cp, int regions) { + factory = new RecoilGeant4Factory(cp, regions); + nRegions = Math.min(RecoilConstants.NMAXREGIONS, regions); + nSectors = RecoilConstants.NSECTORS; + nChambers = RecoilConstants.NCHAMBERS; + nLayers = RecoilConstants.NLAYERS; + this.fillStripLists(); + // this.fillPlaneLists(); + } + + /** + * Calculates the total number of strips in a sector + * + * @return the strip number + */ + public int getNStripSector() { + int nStrips = 0; + for (int i = 0; i < nChambers; i++) { + for (int j = 0; j < nRegions; j++) { + nStrips += getNStripChamber(i,j); + } + } + return nStrips; + } + + /** + * Calculates the number of strips in the given chamber + * + * @param ichamber (0, 1, 2) + * @return the strip number (1-N) + */ + public int getNStripChamber(int ichamber, int regions) { + + int iregion = regions; + int chamber = ichamber; + double[] dim = factory.getChamber_daughter_Dimensions(iregion,chamber); + + double yHalf = dim[1]; + double xHalf = dim[0]; + + // C-------------D // + // ------------- // + // ------------- // + // A-------------B // + /** + * * number of strip in AB** + */ + + int nAB = (int) (2 * xHalf / RecoilConstants.PITCH); + int nAC = (int) (2 * yHalf / RecoilConstants.PITCH); + + int nStrips = nAB + nAC; + + return nStrips; + } + + /** + * Provides the index of the chamber containing the strip with the given ID + * + * @param strip (1 to N) + * @return the chamber index (0, 1, 2) + */ + public int getChamberIndex(int strip) { + int nStripTotal = 0; + + for(int i=0; i strip ID chamber (from 1 to getNStripChamber) + int nStripTotal = 0; + if (chamberIndex > 0) { + for (int i = 0; i < chamberIndex; i++) { + for (int j = 0; j < nRegions; j++) { + nStripTotal += this.getNStripChamber(i,j); + } + } + } + + //Strip ID: from 1 to getNStripChamber + int cStrip = strip - nStripTotal; + + return cStrip; + } + + /** + * Builds the given strip line in the CLAS12 frame + * @param sector (1-6) + * @param layer (1-2) + * @param strip (1-N) + * @return the 3D strip line as a Line3d + */ + private Line3d createStrip(int sector, int region, int layer, int strip) { + + int chamberIndex = getChamberIndex(strip); + int cStrip = this.getLocalStripId(strip); + + // CHAMBER reference frame + // new numeration with stri ID_strip=0 crossing (0,0,0) of chamber + double[] dim = factory.getChamber_daughter_Dimensions(region-1,chamberIndex); + + double yHalf = dim[1]; + double xHalf = dim[0]; + + double DY = -xHalf; //v strip + + // Y coordinate of the intersection point between the x=0 and the strip line crossing for B + + if (layer % 2 != 0) { //u strip + DY = -yHalf; + } + // ID of the strip + int nS = (int) (DY / RecoilConstants.PITCH); + int nCStrip = nS + (cStrip - 1); + double c = nCStrip * RecoilConstants.PITCH; + + // Take 2 points in the strip straight line. They needs to define Line object + //u strips + double oX = -xHalf; + double oY = c; + double oZ = 0; + + double eX = xHalf; + double eY = c; + double eZ = 0; + + if (layer % 2 == 0) { //v strips + oX = c; + oY = -yHalf; + oZ = 0; + + eX = c; + eY = yHalf; + eZ = 0; + } + + Vector3d origin = new Vector3d(oX, oY, oZ); + Vector3d end = new Vector3d(eX, eY, eZ); + + // Get Chamber Volume + Geant4Basic chamberVolume = factory.getChamberVolume(sector, region, chamberIndex+1, layer); + + // 2 point defined before wrt the GLOBAL frame + Vector3d globalOrigin = chamberVolume.getGlobalTransform().transform(origin); + + Vector3d globalEnd = chamberVolume.getGlobalTransform().transform(end); + + Straight line = new Line3d(globalOrigin, globalEnd); + + // CHECK intersections between line and volume + chamberVolume.makeSensitive(); + List Hits = chamberVolume.getIntersections(line); + + if (Hits.size() >= 1) { + + Vector3d TestOrigin = Hits.get(0).origin(); + Vector3d TestEnd = Hits.get(0).end(); + + return new Line3d(Hits.get(0).origin(), Hits.get(0).end()); + + } else { + return null; + } + } + + /** + * Provides the given strip line in the Chamber local frame + * @param region (1-2) + * @param sector (1-6) + * @param layer (1-4) + * @param strip (1-N) + * @return the 3D strip line as a Line3d + */ + + private Line3d getChamberStrip(int region, int sector, int chamber, int layer, int strip) { + + Line3d globalStrip = createStrip(sector, region, layer, strip); + Geant4Basic chamberVolume = factory.getChamberVolume(sector, region, chamber, layer); + + Vector3d origin = chamberVolume.getGlobalTransform().invert().transform(globalStrip.origin()); + Vector3d end = chamberVolume.getGlobalTransform().invert().transform(globalStrip.end()); + + Line3d localStrip = new Line3d(origin, end); + + return localStrip; + } + /** + * Provides the given strip line in the sector local frame + * @param sector (1-6) + * @param layer (1-2) + * @param strip (1-N) + * @return the 3D strip line as a Line3d + */ + private Line3d getLocalStrip(int region, int sector, int layer, int strip) { + + + Line3d globalStrip = createStrip(sector, region, layer, strip); + Geant4Basic sVolume = factory.getSectorVolume(region, sector); + + Vector3d origin = sVolume.getGlobalTransform().invert().transform(globalStrip.origin()); + Vector3d end = sVolume.getGlobalTransform().invert().transform(globalStrip.end()); + + Line3d localStrip = new Line3d(origin, end); + + return localStrip; + } + + + private void fillStripLists() { + + for(int ir=0; ir-xHalf && c-yHalf && c-xHalf && c-yHalf && c + + 4.0.0 + + org.jlab.clas12.detector + clas12detector-recoil + 1.0-SNAPSHOT + jar + + + org.jlab.clas + clas12rec + ../../parent/pom.xml + 11.0.2-SNAPSHOT + + + + + + org.jlab.clas + clas-detector + 11.0.2-SNAPSHOT + + + + org.jlab.clas + clas-analysis + 11.0.2-SNAPSHOT + + + + + diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilCluster.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilCluster.java new file mode 100644 index 0000000000..c8cd396301 --- /dev/null +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilCluster.java @@ -0,0 +1,212 @@ +package org.jlab.service.recoil; + +import java.util.ArrayList; +import java.util.List; +import org.jlab.detector.base.DetectorDescriptor; +import org.jlab.detector.base.DetectorType; +import org.jlab.geom.prim.Line3D; +import org.jlab.geom.prim.Point3D; + +/** + * recoil in-layer cluster + * + * @author bondi, devita, niccolai + */ +public class recoilCluster extends ArrayList { + + + private DetectorDescriptor desc = new DetectorDescriptor(DetectorType.RECOIL); + private int id; + private Line3D clusterLine = new Line3D(); + public int indexMaxStrip = -1; + private byte clusterStatus = 1; + + public recoilCluster(recoilStrip strip){ + this.desc.setSectorLayerComponent(strip.getDescriptor().getSector(), + strip.getDescriptor().getLayer(), 0); + this.add(strip); + this.clusterLine.copy(strip.getLine()); + this.indexMaxStrip = 0; + } + + public int getId() { + return id; + } + + public DetectorDescriptor getDescriptor(){ + return this.desc; + } + + public int getSector() { + return this.desc.getSector(); + } + + public int getLayer() { + return this.desc.getLayer(); + } + + public int getChamber() { + return this.get(0).getChamber(); + } + + public Line3D getLine() {return this.clusterLine;} + + public double getEnergy(){ + double energy = 0.0; + for(recoilStrip strip : this){ + energy += strip.getEnergy(); + } + return energy; + } + + public double getTime(){ + double time = 0.0; + for(recoilStrip strip : this){ + time += strip.getTime()*strip.getEnergy(); + } + time /= this.getEnergy(); + return time; + } + + public double getSeedTime(){ + if(this.indexMaxStrip >= 0 && this.indexMaxStrip < this.size()){ + return this.get(indexMaxStrip).getTime(); + } + return 0.0; + } + + public recoilStrip getSeedStrip() { + return this.get(this.indexMaxStrip); + } + + public int getMaxStrip(){ + return this.get(this.indexMaxStrip).getDescriptor().getComponent(); + } + + public boolean addStrip(recoilStrip strip){ + for(recoilStrip s : this){ + if(s.isNeighbour(strip)){ + this.add(strip); + if(strip.getEnergy()>this.get(indexMaxStrip).getEnergy()){ + this.indexMaxStrip = this.size()-1; + this.clusterLine.copy(strip.getLine()); + } + return true; + } + } + return false; + } + + public int getADC(){ + int adc = 0; + for(recoilStrip s : this){ + adc+= s.getADC(); + } + return adc; + } + + public void setStatus(int val) {this.clusterStatus+=val;} + + public byte getStatus() {return clusterStatus;} + + public void setClusterId(int id){ + this.id = id; + for(recoilStrip strip : this){ + strip.setClusterId(id); + } + } + + public void redoClusterLine(){ + + Point3D pointOrigin = new Point3D(0.0,0.0,0.0); + Point3D pointEnd = new Point3D(0.0,0.0,0.0); + + double logSumm = 0.0; + double summE = 0.0; + + for(int i = 0; i < this.size(); i++){ + Line3D line = this.get(i).getLine(); + + double energy = this.get(i).getEnergy(); + double energymev = energy*1000.0; + double le = Math.log(energymev); + + pointOrigin.setX(pointOrigin.x()+line.origin().x()*le); + pointOrigin.setY(pointOrigin.y()+line.origin().y()*le); + pointOrigin.setZ(pointOrigin.z()+line.origin().z()*le); + + pointEnd.setX(pointEnd.x()+line.end().x()*le); + pointEnd.setY(pointEnd.y()+line.end().y()*le); + pointEnd.setZ(pointEnd.z()+line.end().z()*le); + + logSumm += le; + + summE += energy; + } + + this.clusterLine.set( + pointOrigin.x()/logSumm, + pointOrigin.y()/logSumm, + pointOrigin.z()/logSumm, + pointEnd.x()/logSumm, + pointEnd.y()/logSumm, + pointEnd.z()/logSumm + ); + } + + + public static List createClusters(List stripList){ + + List clusterList = new ArrayList<>(); + + if(!stripList.isEmpty()){ + for(int loop = 0; loop < stripList.size(); loop++){ //Loop over all strips + boolean stripAdded = false; + for(recoilCluster cluster : clusterList) { + if(cluster.addStrip(stripList.get(loop))){ //Add adjacent strip to newly seeded peak + stripAdded = true; + } + } + if(!stripAdded){ + recoilCluster newPeak = new recoilCluster(stripList.get(loop)); //Non-adjacent strip seeds new peak + clusterList.add(newPeak); + } + } + } + for(int loop = 0; loop < clusterList.size(); loop++){ + clusterList.get(loop).setClusterId(loop+1); + clusterList.get(loop).redoClusterLine(); + } + return clusterList; + } + + public static List getClusters(List clusters, int sector, int layer) { + List selectedClusters = new ArrayList<>(); + for(recoilCluster cluster : clusters) { + if(cluster.getSector()==sector && cluster.getLayer()==layer) + selectedClusters.add(cluster); + } + return selectedClusters; + } + + @Override + public String toString(){ + StringBuilder str = new StringBuilder(); + str.append(String.format("----> cluster ( %3d %3d ) ENERGY = %12.5f\n", + this.desc.getSector(),this.desc.getLayer(), this.getEnergy())); + str.append(this.clusterLine.toString()); + str.append("\n"); + for(recoilStrip strip : this){ + str.append("\t\t"); + str.append(strip.toString()); + str.append("\n"); + } + + return str.toString(); + } + + + + + +} diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilConstants.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilConstants.java new file mode 100644 index 0000000000..02c8f73d07 --- /dev/null +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilConstants.java @@ -0,0 +1,29 @@ +package org.jlab.service.recoil; + +/** + * + * @author bondi, devita,niccolai + */ +public class recoilConstants { + + + // geometry + public final static int NSECTOR = 2; + public final static int NLAYER = 6; + public final static int NREGION = 3; + public final static int NCHAMBER = 1; + public final static int[] NSTRIPS = { 351, 582, 834}; // number of strips for the three chambers + public final static int[] STRIPMIN = { 1, 352, 583}; // lower strip number + public final static int[] STRIPMAX = { 351, 582, 834}; // higher strip number + public final static double PITCH = 0.1; // mm + public final static double[] STEREO = { 0.0, 90.0 }; + + // strips + public final static double THRESHOLD = 0; + public final static double ADCTOENERGY = 25/1E4; // in eV, values from gemc ADC = (uRwellC.gain*1e6*tInfos.eTot/uRwellC.w_i); with gain = 10^4 and w_i = 25 eV + public final static double TDCTOTIME = 1; + + // cluster + public final static double COINCTIME = 100; + +} diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilCross.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilCross.java new file mode 100644 index 0000000000..30b4979967 --- /dev/null +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilCross.java @@ -0,0 +1,123 @@ +package org.jlab.service.recoil; + +import java.util.ArrayList; +import java.util.List; +import org.jlab.geom.prim.Plane3D; +import org.jlab.geom.prim.Point3D; +import org.jlab.geom.prim.Vector3D; + +/** + * recoil V-W clusters + * @author devita + */ +public class recoilCross { + + private int id; + + private int sector; + private int region; + private int chamber; + + private int cluster1; + private int cluster2; + + private Point3D cross; + private double energy; + private double time; + private int status; + + + + public recoilCross(recoilCluster c1, recoilCluster c2) { + + Vector3D dir = c1.getLine().direction().cross(c2.getLine().direction()); + Plane3D plane = new Plane3D(c1.getLine().origin(), c1.getLine().direction().cross(dir)); + Point3D point = new Point3D(); + int nint = plane.intersectionSegment(c2.getLine(), point); + if(nint==1) { + this.sector = c1.getSector(); + this.region = (c1.getLayer()-1)/(recoilConstants.NLAYER/recoilConstants.NREGION)+1; + this.cross = point; + this.energy = c1.getEnergy() + c2.getEnergy(); + this.time = (c1.getTime() + c2.getTime())/2; + this.cluster1 = c1.getId(); + this.cluster2 = c2.getId(); + } + } + + public void setId(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public int getSector() { + return this.sector; + } + + public int getRegion() { + return this.region; + } + + public int getChamber() { + return this.chamber; + } + + public int getCluster1() { + return cluster1; + } + + public int getCluster2() { + return cluster2; + } + + public Point3D point() { + return cross; + } + + public double getEnergy() { + return energy; + } + + public double getTime() { + return time; + } + + public int getStatus() { + return status; + } + + public static List createCrosses(List clusters) { + + List crosses = new ArrayList<>(); + + for(int is=0; is clustersV = recoilCluster.getClusters(clusters, is+1, (recoilConstants.NLAYER/recoilConstants.NREGION)*ir+1); + List clustersW = recoilCluster.getClusters(clusters, is+1, (recoilConstants.NLAYER/recoilConstants.NREGION)*ir+2); + + for(recoilCluster v : clustersV) { + for(recoilCluster w : clustersW) { + + if(v.getChamber()==w.getChamber()) { + recoilCross cross = new recoilCross(v, w); + if(cross.point()!=null) crosses.add(cross); + cross.setId(crosses.size()); + } + } + } + } + } + return crosses; + } + + @Override + public String toString(){ + StringBuilder str = new StringBuilder(); + str.append(String.format("----> cross ( %3d %3d )\n", this.getSector(),this)); + str.append(this.point().toString()); + return str.toString(); + } +} diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilEngine.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilEngine.java new file mode 100644 index 0000000000..2658238243 --- /dev/null +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilEngine.java @@ -0,0 +1,244 @@ +package org.jlab.service.recoil; + +import java.util.List; +import java.util.Optional; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.JFrame; +import org.jlab.clas.reco.ReconstructionEngine; +import org.jlab.detector.base.DetectorType; +import org.jlab.detector.calib.utils.DatabaseConstantProvider; +import org.jlab.detector.geant4.v2.RECOIL.RecoilStripFactory; +import org.jlab.geom.prim.Point3D; +import org.jlab.groot.data.H1F; +import org.jlab.groot.fitter.DataFitter; +import org.jlab.groot.graphics.EmbeddedCanvas; +import org.jlab.groot.group.DataGroup; +import org.jlab.groot.math.F1D; +import org.jlab.io.base.DataEvent; +import org.jlab.io.base.DataBank; +import org.jlab.io.hipo.HipoDataSource; + +/** + * + * recoil reconstruction engine + * + * @author bondi, devita, niccolai + */ +public class recoilEngine extends ReconstructionEngine { + + public static Logger LOGGER = Logger.getLogger(recoilEngine.class.getName()); + + public static RecoilStripFactory factory = new RecoilStripFactory(); + + public recoilEngine() { + super("RECOIL","niccolai","1.0"); + } + + @Override + public boolean init() { + + // init ConstantsManager to read constants from CCDB + String variationName = Optional.ofNullable(this.getEngineConfigString("variation")).orElse("default"); + DatabaseConstantProvider cp = new DatabaseConstantProvider(11, variationName); + factory.init(cp, recoilConstants.NREGION); + // register output banks for drop option + this.registerOutputBank("RECOIL::hits"); + this.registerOutputBank("RECOIL::clusters"); + this.registerOutputBank("RECOIL::crosses"); + + LOGGER.log(Level.INFO, "--> recoil is ready..."); + return true; + } + + + + + @Override + public boolean processDataEvent(DataEvent event) { + + List strips = recoilStrip.getStrips(event, factory, this.getConstantsManager()); + List clusters = recoilCluster.createClusters(strips); + List crosses = recoilCross.createCrosses(clusters); + + this.writeHipoBanks(event, strips, clusters, crosses); + + return true; + } + + + private void writeHipoBanks(DataEvent de, + List strips, + List clusters, + List crosses){ + + DataBank bankS = de.createBank("RECOIL::hits", strips.size()); + for(int h = 0; h < strips.size(); h++){ + bankS.setShort("id", h, (short) strips.get(h).getId()); + bankS.setByte("sector", h, (byte) strips.get(h).getDescriptor().getSector()); + bankS.setByte("layer", h, (byte) strips.get(h).getDescriptor().getLayer()); + bankS.setShort("strip", h, (short) strips.get(h).getDescriptor().getComponent()); + bankS.setFloat("energy", h, (float) strips.get(h).getEnergy()); + bankS.setFloat("time", h, (float) strips.get(h).getTime()); + bankS.setShort("status", h, (short) strips.get(h).getStatus()); + bankS.setShort("clusterId", h, (short) strips.get(h).getClusterId()); + } + + DataBank bankC = de.createBank("RECOIL::clusters", clusters.size()); + for(int c = 0; c < clusters.size(); c++){ + bankC.setShort("id", c, (short) clusters.get(c).getId()); + bankC.setByte("sector", c, (byte) clusters.get(c).get(0).getDescriptor().getSector()); + bankC.setByte("layer", c, (byte) clusters.get(c).get(0).getDescriptor().getLayer()); + bankC.setShort("strip", c, (short) clusters.get(c).getMaxStrip()); + bankC.setFloat("energy", c, (float) clusters.get(c).getEnergy()); + bankC.setFloat("time", c, (float) clusters.get(c).getTime()); + bankC.setFloat("xo", c, (float) clusters.get(c).getLine().origin().x()); + bankC.setFloat("yo", c, (float) clusters.get(c).getLine().origin().y()); + bankC.setFloat("zo", c, (float) clusters.get(c).getLine().origin().z()); + bankC.setFloat("xe", c, (float) clusters.get(c).getLine().end().x()); + bankC.setFloat("ye", c, (float) clusters.get(c).getLine().end().y()); + bankC.setFloat("ze", c, (float) clusters.get(c).getLine().end().z()); + bankC.setShort("size", c, (short) clusters.get(c).size()); + bankC.setShort("status", c, (short) clusters.get(c).getStatus()); + } + + DataBank bankX = de.createBank("RECOIL::crosses", crosses.size()); + for(int c = 0; c < crosses.size(); c++){ + bankX.setShort("id", c, (short) crosses.get(c).getId()); + bankX.setByte("sector", c, (byte) crosses.get(c).getSector()); + bankX.setByte("region", c, (byte) crosses.get(c).getRegion()); + bankX.setFloat("energy", c, (float) crosses.get(c).getEnergy()); + bankX.setFloat("time", c, (float) crosses.get(c).getTime()); + bankX.setFloat("x", c, (float) crosses.get(c).point().x()); + bankX.setFloat("y", c, (float) crosses.get(c).point().y()); + bankX.setFloat("z", c, (float) crosses.get(c).point().z()); + bankX.setShort("cluster1", c, (short) crosses.get(c).getCluster1()); + bankX.setShort("cluster2", c, (short) crosses.get(c).getCluster2()); + bankX.setShort("status", c, (short) crosses.get(c).getStatus()); + } + de.appendBanks(bankS,bankC,bankX); + } + + + public static void fitGauss(H1F histo) { + double mean = histo.getMean(); + double amp = histo.getBinContent(histo.getMaximumBin()); + double rms = histo.getRMS(); + double sigma = rms/2; + double min = mean - 3*rms; + double max = mean + 3*rms; + + F1D f1 = new F1D("f1res","[amp]*gaus(x,[mean],[sigma])", min, max); + f1.setLineColor(2); + f1.setLineWidth(2); + f1.setOptStat("1111"); + f1.setParameter(0, amp); + f1.setParameter(1, mean); + f1.setParameter(2, sigma); + + if(amp>5) { + f1.setParLimits(0, amp*0.2, amp*1.2); + f1.setParLimits(1, mean*0.5, mean*1.5); + f1.setParLimits(2, sigma*0.2, sigma*2); + DataFitter.fit(f1, histo, "Q"); + mean = f1.getParameter(1); + sigma = f1.getParameter(2); + f1.setParLimits(0, 0, 2*amp); + f1.setParLimits(1, mean-sigma, mean+sigma); + f1.setParLimits(2, 0, sigma*2); + f1.setRange(mean-2.0*sigma,mean+2.0*sigma); + DataFitter.fit(f1, histo, "Q"); + } + } + + public static void main (String arg[]) { + + recoilEngine engine = new recoilEngine(); + engine.init(); + + String input = "/Users/devita/urwell3d.hipo"; + + DataGroup dg = new DataGroup(3, 2); + String[] axes = {"x", "y"}; + for(int il=0; il this.desc.getSector()) return -1; + if(ob.getDescriptor().getLayer() < this.desc.getLayer()) return 1; + if(ob.getDescriptor().getLayer() > this.desc.getLayer()) return -1; + if(ob.getDescriptor().getComponent() < this.desc.getComponent()) return 1; + if(ob.getDescriptor().getComponent() == this.desc.getComponent()) return 0; + return -1; + } + + public static List getStrips(DataEvent event, RecoilStripFactory factory, ConstantsManager ccdb) { + + List strips = new ArrayList<>(); + + if(event.hasBank("RECOIL::adc")){ + RawDataBank bank = new RawDataBank("RECOIL::adc"); + bank.read(event); + //DataBank bank = event.getBank("RECOIL::adc"); + for(int i = 0; i < bank.rows(); i++){ + int sector = bank.getByte("sector", i); + int layer = bank.getByte("layer", i); + int comp = bank.getShort("component", i); + int adc = bank.getInt("ADC", i); + double time = bank.getFloat("time", i); + + recoilStrip strip = new recoilStrip(sector, layer, comp); + +// strip.setTriggerPhase(triggerPhase); + strip.setId(bank.trueIndex(i)+1); + strip.setADC(adc); + strip.setTDC((int) time); + strip.setEnergy(strip.ADC*recoilConstants.ADCTOENERGY); + strip.setTime(strip.TDC*recoilConstants.TDCTOTIME); + strip.setLine(factory.getStrip(sector, layer, comp)); + strip.setChamber(factory.getChamberIndex(comp)+1); + strip.setStatus(0); + + if(strip.getEnergy()>recoilConstants.THRESHOLD) strips.add(strip); + + } + } + return strips; + } + + @Override + public String toString(){ + StringBuilder str = new StringBuilder(); + str.append(String.format("----> strip (%3d %3d %3d) ADC/TDC %5d %5d ENERGY = %8.5f TIME = %8.5f ", + this.desc.getSector(),this.desc.getLayer(),this.desc.getComponent(), + this.ADC,this.TDC,this.getEnergy(),this.getTime())); + return str.toString(); + } +} From 0935b510f2928a2f1b06083a74404b28aac0e23c Mon Sep 17 00:00:00 2001 From: Silvia Niccolai Date: Thu, 20 Feb 2025 17:34:04 -0500 Subject: [PATCH 2/7] Fixed conflicts --- .../org/jlab/detector/base/DetectorType.java | 1 + .../{RECOIL => recoil}/RecoilConstants.java | 2 +- .../RecoilGeant4Factory.java | 2 +- .../RecoilStripFactory.java | 2 +- etc/bankdefs/hipo4/recoil.json | 59 +++++++++++++++++++ ...{recoilCluster.java => RecoilCluster.java} | 34 +++++------ ...oilConstants.java => RecoilConstants.java} | 2 +- .../{recoilCross.java => RecoilCross.java} | 24 ++++---- .../{recoilEngine.java => RecoilEngine.java} | 34 +++++------ .../{recoilStrip.java => RecoilStrip.java} | 28 ++++----- 10 files changed, 124 insertions(+), 64 deletions(-) rename common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/{RECOIL => recoil}/RecoilConstants.java (99%) rename common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/{RECOIL => recoil}/RecoilGeant4Factory.java (99%) rename common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/{RECOIL => recoil}/RecoilStripFactory.java (99%) create mode 100644 etc/bankdefs/hipo4/recoil.json rename reconstruction/recoil/src/main/java/org/jlab/service/recoil/{recoilCluster.java => RecoilCluster.java} (86%) rename reconstruction/recoil/src/main/java/org/jlab/service/recoil/{recoilConstants.java => RecoilConstants.java} (96%) rename reconstruction/recoil/src/main/java/org/jlab/service/recoil/{recoilCross.java => RecoilCross.java} (74%) rename reconstruction/recoil/src/main/java/org/jlab/service/recoil/{recoilEngine.java => RecoilEngine.java} (90%) rename reconstruction/recoil/src/main/java/org/jlab/service/recoil/{recoilStrip.java => RecoilStrip.java} (87%) diff --git a/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorType.java b/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorType.java index 8695d88845..a19b4d2933 100644 --- a/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorType.java +++ b/common-tools/clas-detector/src/main/java/org/jlab/detector/base/DetectorType.java @@ -31,6 +31,7 @@ public enum DetectorType { URWELL (23, "URWELL"), AHDC (24, "AHDC"), ATOF (25, "ATOF"), + RECOIL (26, "RECOIL"), TARGET (100, "TARGET"), MAGNETS (101, "MAGNETS"), ECIN (110, "ECIN"), diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilConstants.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilConstants.java similarity index 99% rename from common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilConstants.java rename to common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilConstants.java index 0f0970e8cc..805407434e 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilConstants.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilConstants.java @@ -1,4 +1,4 @@ -package org.jlab.detector.geant4.v2.RECOIL; +package org.jlab.detector.geant4.v2.recoil; import org.jlab.detector.calib.utils.DatabaseConstantProvider; diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilGeant4Factory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilGeant4Factory.java similarity index 99% rename from common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilGeant4Factory.java rename to common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilGeant4Factory.java index dfdf61e179..083b8f5f32 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilGeant4Factory.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilGeant4Factory.java @@ -1,4 +1,4 @@ -package org.jlab.detector.geant4.v2.RECOIL; +package org.jlab.detector.geant4.v2.recoil; import eu.mihosoft.vrl.v3d.Vector3d; import org.jlab.detector.geant4.v2.Geant4Factory; diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilStripFactory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilStripFactory.java similarity index 99% rename from common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilStripFactory.java rename to common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilStripFactory.java index ad03144ec1..49427b15a3 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/RECOIL/RecoilStripFactory.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilStripFactory.java @@ -1,4 +1,4 @@ -package org.jlab.detector.geant4.v2.RECOIL; +package org.jlab.detector.geant4.v2.recoil; import eu.mihosoft.vrl.v3d.Vector3d; import java.util.List; diff --git a/etc/bankdefs/hipo4/recoil.json b/etc/bankdefs/hipo4/recoil.json new file mode 100644 index 0000000000..e1cef4c370 --- /dev/null +++ b/etc/bankdefs/hipo4/recoil.json @@ -0,0 +1,59 @@ +[ + { + "name": "RECOIL::hits", + "group": 22600, + "item" : 21, + "info": "RECOIL hits", + "entries": [ + {"name":"id", "type":"S", "info":"id of the hit"}, + {"name":"sector", "type":"B", "info":"sector of RECOIL"}, + {"name":"layer", "type":"B", "info":"layer of RECOIL (1-3:PCAL, 4-6:ECIN, 7-9:ECOUT"}, + {"name":"strip", "type":"S", "info":"strip number"}, + {"name":"energy", "type":"F", "info":"energy of the hit (eV)"}, + {"name":"time", "type":"F", "info":"time of the hit (ns)"}, + {"name":"clusterId", "type":"S", "info":"id of the cluster the hit belongs to"}, + {"name":"status", "type":"S", "info":"status of the hit"} + ] + }, + { + "name": "RECOIL::clusters", + "group": 22600, + "item" : 22, + "info": "reconstructed clusters from RECOIL", + "entries": [ + {"name":"id", "type":"S", "info":"id of the cluster"}, + {"name":"sector", "type":"B", "info":"sector of RECOIL"}, + {"name":"layer", "type":"B", "info":"layer of RECOIL"}, + {"name":"strip", "type":"S", "info":"seed strip"}, + {"name":"energy", "type":"F", "info":"energy of the cluster (eV)"}, + {"name":"time", "type":"F", "info":"time of the cluster (ns)"}, + {"name":"xo", "type":"F", "info":"strip origin X coordinate (cm)"}, + {"name":"yo", "type":"F", "info":"strip origin Y coordinate (cm)"}, + {"name":"zo", "type":"F", "info":"strip origin Z coordinate (cm)"}, + {"name":"xe", "type":"F", "info":"strip end X coordinate (cm)"}, + {"name":"ye", "type":"F", "info":"strip end Y coordinate (cm)"}, + {"name":"ze", "type":"F", "info":"strip end Z coordinate (cm)"}, + {"name":"size", "type":"S", "info":"size of the cluster"}, + {"name":"status", "type":"S", "info":"status of the cluster"} + ] + }, + { + "name": "RECOIL::crosses", + "group": 22600, + "item" : 23, + "info": "reconstructed crosses from RECOIL", + "entries": [ + {"name":"id", "type":"S", "info":"id of the cross"}, + {"name":"sector", "type":"B", "info":"sector of RECOIL"}, + {"name":"region", "type":"B", "info":"region of RECOIL"}, + {"name":"energy", "type":"F", "info":"energy of the cross (eV)"}, + {"name":"time", "type":"F", "info":"time of the cross (ns)"}, + {"name":"x", "type":"F", "info":"x coordinate (cm)"}, + {"name":"y", "type":"F", "info":"y coordinate (cm)"}, + {"name":"z", "type":"F", "info":"z coordinate (cm)"}, + {"name":"cluster1", "type":"S", "info":"id of the cluster in the V layer"}, + {"name":"cluster2", "type":"S", "info":"id of the cluster in the W layer"}, + {"name":"status", "type":"S", "info":"status of the cluster"} + ] + } +] diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilCluster.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilCluster.java similarity index 86% rename from reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilCluster.java rename to reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilCluster.java index c8cd396301..66a6a5d914 100644 --- a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilCluster.java +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilCluster.java @@ -12,7 +12,7 @@ * * @author bondi, devita, niccolai */ -public class recoilCluster extends ArrayList { +public class RecoilCluster extends ArrayList { private DetectorDescriptor desc = new DetectorDescriptor(DetectorType.RECOIL); @@ -21,7 +21,7 @@ public class recoilCluster extends ArrayList { public int indexMaxStrip = -1; private byte clusterStatus = 1; - public recoilCluster(recoilStrip strip){ + public RecoilCluster(RecoilStrip strip){ this.desc.setSectorLayerComponent(strip.getDescriptor().getSector(), strip.getDescriptor().getLayer(), 0); this.add(strip); @@ -53,7 +53,7 @@ public int getChamber() { public double getEnergy(){ double energy = 0.0; - for(recoilStrip strip : this){ + for(RecoilStrip strip : this){ energy += strip.getEnergy(); } return energy; @@ -61,7 +61,7 @@ public double getEnergy(){ public double getTime(){ double time = 0.0; - for(recoilStrip strip : this){ + for(RecoilStrip strip : this){ time += strip.getTime()*strip.getEnergy(); } time /= this.getEnergy(); @@ -75,7 +75,7 @@ public double getSeedTime(){ return 0.0; } - public recoilStrip getSeedStrip() { + public RecoilStrip getSeedStrip() { return this.get(this.indexMaxStrip); } @@ -83,8 +83,8 @@ public int getMaxStrip(){ return this.get(this.indexMaxStrip).getDescriptor().getComponent(); } - public boolean addStrip(recoilStrip strip){ - for(recoilStrip s : this){ + public boolean addStrip(RecoilStrip strip){ + for(RecoilStrip s : this){ if(s.isNeighbour(strip)){ this.add(strip); if(strip.getEnergy()>this.get(indexMaxStrip).getEnergy()){ @@ -99,7 +99,7 @@ public boolean addStrip(recoilStrip strip){ public int getADC(){ int adc = 0; - for(recoilStrip s : this){ + for(RecoilStrip s : this){ adc+= s.getADC(); } return adc; @@ -111,7 +111,7 @@ public int getADC(){ public void setClusterId(int id){ this.id = id; - for(recoilStrip strip : this){ + for(RecoilStrip strip : this){ strip.setClusterId(id); } } @@ -155,20 +155,20 @@ public void redoClusterLine(){ } - public static List createClusters(List stripList){ + public static List createClusters(List stripList){ - List clusterList = new ArrayList<>(); + List clusterList = new ArrayList<>(); if(!stripList.isEmpty()){ for(int loop = 0; loop < stripList.size(); loop++){ //Loop over all strips boolean stripAdded = false; - for(recoilCluster cluster : clusterList) { + for(RecoilCluster cluster : clusterList) { if(cluster.addStrip(stripList.get(loop))){ //Add adjacent strip to newly seeded peak stripAdded = true; } } if(!stripAdded){ - recoilCluster newPeak = new recoilCluster(stripList.get(loop)); //Non-adjacent strip seeds new peak + RecoilCluster newPeak = new RecoilCluster(stripList.get(loop)); //Non-adjacent strip seeds new peak clusterList.add(newPeak); } } @@ -180,9 +180,9 @@ public static List createClusters(List stripList){ return clusterList; } - public static List getClusters(List clusters, int sector, int layer) { - List selectedClusters = new ArrayList<>(); - for(recoilCluster cluster : clusters) { + public static List getClusters(List clusters, int sector, int layer) { + List selectedClusters = new ArrayList<>(); + for(RecoilCluster cluster : clusters) { if(cluster.getSector()==sector && cluster.getLayer()==layer) selectedClusters.add(cluster); } @@ -196,7 +196,7 @@ public String toString(){ this.desc.getSector(),this.desc.getLayer(), this.getEnergy())); str.append(this.clusterLine.toString()); str.append("\n"); - for(recoilStrip strip : this){ + for(RecoilStrip strip : this){ str.append("\t\t"); str.append(strip.toString()); str.append("\n"); diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilConstants.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilConstants.java similarity index 96% rename from reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilConstants.java rename to reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilConstants.java index 02c8f73d07..eed0bb47e5 100644 --- a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilConstants.java +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilConstants.java @@ -4,7 +4,7 @@ * * @author bondi, devita,niccolai */ -public class recoilConstants { +public class RecoilConstants { // geometry diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilCross.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilCross.java similarity index 74% rename from reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilCross.java rename to reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilCross.java index 30b4979967..1fcbc2c7d5 100644 --- a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilCross.java +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilCross.java @@ -10,7 +10,7 @@ * recoil V-W clusters * @author devita */ -public class recoilCross { +public class RecoilCross { private int id; @@ -28,7 +28,7 @@ public class recoilCross { - public recoilCross(recoilCluster c1, recoilCluster c2) { + public RecoilCross(RecoilCluster c1, RecoilCluster c2) { Vector3D dir = c1.getLine().direction().cross(c2.getLine().direction()); Plane3D plane = new Plane3D(c1.getLine().origin(), c1.getLine().direction().cross(dir)); @@ -36,7 +36,7 @@ public recoilCross(recoilCluster c1, recoilCluster c2) { int nint = plane.intersectionSegment(c2.getLine(), point); if(nint==1) { this.sector = c1.getSector(); - this.region = (c1.getLayer()-1)/(recoilConstants.NLAYER/recoilConstants.NREGION)+1; + this.region = (c1.getLayer()-1)/(RecoilConstants.NLAYER/RecoilConstants.NREGION)+1; this.cross = point; this.energy = c1.getEnergy() + c2.getEnergy(); this.time = (c1.getTime() + c2.getTime())/2; @@ -89,20 +89,20 @@ public int getStatus() { return status; } - public static List createCrosses(List clusters) { + public static List createCrosses(List clusters) { - List crosses = new ArrayList<>(); + List crosses = new ArrayList<>(); - for(int is=0; is clustersV = recoilCluster.getClusters(clusters, is+1, (recoilConstants.NLAYER/recoilConstants.NREGION)*ir+1); - List clustersW = recoilCluster.getClusters(clusters, is+1, (recoilConstants.NLAYER/recoilConstants.NREGION)*ir+2); + for(int is=0; is clustersV = RecoilCluster.getClusters(clusters, is+1, (RecoilConstants.NLAYER/RecoilConstants.NREGION)*ir+1); + List clustersW = RecoilCluster.getClusters(clusters, is+1, (RecoilConstants.NLAYER/RecoilConstants.NREGION)*ir+2); - for(recoilCluster v : clustersV) { - for(recoilCluster w : clustersW) { + for(RecoilCluster v : clustersV) { + for(RecoilCluster w : clustersW) { if(v.getChamber()==w.getChamber()) { - recoilCross cross = new recoilCross(v, w); + RecoilCross cross = new RecoilCross(v, w); if(cross.point()!=null) crosses.add(cross); cross.setId(crosses.size()); } diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilEngine.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilEngine.java similarity index 90% rename from reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilEngine.java rename to reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilEngine.java index 2658238243..d1f8325f7a 100644 --- a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/recoilEngine.java +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilEngine.java @@ -8,7 +8,7 @@ import org.jlab.clas.reco.ReconstructionEngine; import org.jlab.detector.base.DetectorType; import org.jlab.detector.calib.utils.DatabaseConstantProvider; -import org.jlab.detector.geant4.v2.RECOIL.RecoilStripFactory; +import org.jlab.detector.geant4.v2.recoil.RecoilStripFactory; import org.jlab.geom.prim.Point3D; import org.jlab.groot.data.H1F; import org.jlab.groot.fitter.DataFitter; @@ -25,14 +25,14 @@ * * @author bondi, devita, niccolai */ -public class recoilEngine extends ReconstructionEngine { +public class RecoilEngine extends ReconstructionEngine { - public static Logger LOGGER = Logger.getLogger(recoilEngine.class.getName()); + public static Logger LOGGER = Logger.getLogger(RecoilEngine.class.getName()); public static RecoilStripFactory factory = new RecoilStripFactory(); - public recoilEngine() { - super("RECOIL","niccolai","1.0"); + public RecoilEngine() { + super("Recoil","niccolai","1.0"); } @Override @@ -41,7 +41,7 @@ public boolean init() { // init ConstantsManager to read constants from CCDB String variationName = Optional.ofNullable(this.getEngineConfigString("variation")).orElse("default"); DatabaseConstantProvider cp = new DatabaseConstantProvider(11, variationName); - factory.init(cp, recoilConstants.NREGION); + factory.init(cp, RecoilConstants.NREGION); // register output banks for drop option this.registerOutputBank("RECOIL::hits"); this.registerOutputBank("RECOIL::clusters"); @@ -57,9 +57,9 @@ public boolean init() { @Override public boolean processDataEvent(DataEvent event) { - List strips = recoilStrip.getStrips(event, factory, this.getConstantsManager()); - List clusters = recoilCluster.createClusters(strips); - List crosses = recoilCross.createCrosses(clusters); + List strips = RecoilStrip.getStrips(event, factory, this.getConstantsManager()); + List clusters = RecoilCluster.createClusters(strips); + List crosses = RecoilCross.createCrosses(clusters); this.writeHipoBanks(event, strips, clusters, crosses); @@ -68,9 +68,9 @@ public boolean processDataEvent(DataEvent event) { private void writeHipoBanks(DataEvent de, - List strips, - List clusters, - List crosses){ + List strips, + List clusters, + List crosses){ DataBank bankS = de.createBank("RECOIL::hits", strips.size()); for(int h = 0; h < strips.size(); h++){ @@ -153,14 +153,14 @@ public static void fitGauss(H1F histo) { public static void main (String arg[]) { - recoilEngine engine = new recoilEngine(); + RecoilEngine engine = new RecoilEngine(); engine.init(); String input = "/Users/devita/urwell3d.hipo"; DataGroup dg = new DataGroup(3, 2); String[] axes = {"x", "y"}; - for(int il=0; il this.desc.getSector()) return -1; if(ob.getDescriptor().getLayer() < this.desc.getLayer()) return 1; @@ -161,9 +161,9 @@ public int compareTo(Object o) { return -1; } - public static List getStrips(DataEvent event, RecoilStripFactory factory, ConstantsManager ccdb) { + public static List getStrips(DataEvent event, RecoilStripFactory factory, ConstantsManager ccdb) { - List strips = new ArrayList<>(); + List strips = new ArrayList<>(); if(event.hasBank("RECOIL::adc")){ RawDataBank bank = new RawDataBank("RECOIL::adc"); @@ -176,19 +176,19 @@ public static List getStrips(DataEvent event, RecoilStripFactory fa int adc = bank.getInt("ADC", i); double time = bank.getFloat("time", i); - recoilStrip strip = new recoilStrip(sector, layer, comp); + RecoilStrip strip = new RecoilStrip(sector, layer, comp); // strip.setTriggerPhase(triggerPhase); strip.setId(bank.trueIndex(i)+1); strip.setADC(adc); strip.setTDC((int) time); - strip.setEnergy(strip.ADC*recoilConstants.ADCTOENERGY); - strip.setTime(strip.TDC*recoilConstants.TDCTOTIME); + strip.setEnergy(strip.ADC*RecoilConstants.ADCTOENERGY); + strip.setTime(strip.TDC*RecoilConstants.TDCTOTIME); strip.setLine(factory.getStrip(sector, layer, comp)); strip.setChamber(factory.getChamberIndex(comp)+1); strip.setStatus(0); - if(strip.getEnergy()>recoilConstants.THRESHOLD) strips.add(strip); + if(strip.getEnergy()>RecoilConstants.THRESHOLD) strips.add(strip); } } From 1c1af4e2c0b80815d7eaa6b804df2a80fb6a911d Mon Sep 17 00:00:00 2001 From: Silvia Niccolai Date: Wed, 26 Feb 2025 08:47:59 -0500 Subject: [PATCH 3/7] corrected authors --- .../org/jlab/detector/geant4/v2/recoil/RecoilGeant4Factory.java | 2 +- .../org/jlab/detector/geant4/v2/recoil/RecoilStripFactory.java | 2 +- .../src/main/java/org/jlab/service/recoil/RecoilCross.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilGeant4Factory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilGeant4Factory.java index 083b8f5f32..f97035e1ae 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilGeant4Factory.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilGeant4Factory.java @@ -18,7 +18,7 @@ /** * Generate GEANT4 volume for the RECOIL detector * - * @author bondi + * @author bondi, niccolai */ public final class RecoilGeant4Factory extends Geant4Factory { diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilStripFactory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilStripFactory.java index 49427b15a3..9a4144f2a6 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilStripFactory.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilStripFactory.java @@ -16,7 +16,7 @@ /** * Creates and handles the URWELL detector strips as 3D lines * - * @author bondi + * @author bondi, niccolai */ public final class RecoilStripFactory { diff --git a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilCross.java b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilCross.java index 1fcbc2c7d5..a2a2ba85e5 100644 --- a/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilCross.java +++ b/reconstruction/recoil/src/main/java/org/jlab/service/recoil/RecoilCross.java @@ -8,7 +8,7 @@ /** * recoil V-W clusters - * @author devita + * @author devita, niccolai */ public class RecoilCross { From 6775f9c82b44f1dfdbd1e269d2057468d5031760 Mon Sep 17 00:00:00 2001 From: Silvia Niccolai Date: Fri, 28 Feb 2025 04:40:28 -0500 Subject: [PATCH 4/7] added RECOIL.xml in bankdefs --- etc/bankdefs/clas12/RECOIL.xml | 40 ++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 etc/bankdefs/clas12/RECOIL.xml diff --git a/etc/bankdefs/clas12/RECOIL.xml b/etc/bankdefs/clas12/RECOIL.xml new file mode 100644 index 0000000000..1932f3a046 --- /dev/null +++ b/etc/bankdefs/clas12/RECOIL.xml @@ -0,0 +1,40 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
+
From 48607563b29ab937106cd3ffd14e448821ba8e55 Mon Sep 17 00:00:00 2001 From: Silvia Niccolai Date: Fri, 28 Feb 2025 07:02:03 -0500 Subject: [PATCH 5/7] corrected RECOIL.xml --- etc/bankdefs/clas12/RECOIL.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/etc/bankdefs/clas12/RECOIL.xml b/etc/bankdefs/clas12/RECOIL.xml index 1932f3a046..e9cffad3b8 100644 --- a/etc/bankdefs/clas12/RECOIL.xml +++ b/etc/bankdefs/clas12/RECOIL.xml @@ -1,6 +1,6 @@ - -
+ +
@@ -28,7 +28,7 @@
-
+
From 3d08f3b763f9a6a072358fbbc8aa5b639b3003f1 Mon Sep 17 00:00:00 2001 From: Silvia Niccolai Date: Mon, 17 Mar 2025 10:59:00 -0400 Subject: [PATCH 6/7] Cleaned up codes and fixed shift of one strip appearing in reconstructed simulations, comparing reconstructed x,y,z to true positions --- .../geant4/v2/recoil/RecoilGeant4Factory.java | 29 ++---- .../geant4/v2/recoil/RecoilStripFactory.java | 91 ++----------------- etc/bankdefs/hipo4/data.json | 17 +++- 3 files changed, 30 insertions(+), 107 deletions(-) diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilGeant4Factory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilGeant4Factory.java index f97035e1ae..12b6e1837c 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilGeant4Factory.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilGeant4Factory.java @@ -78,17 +78,10 @@ public double[] getSectorDimensions(int iregion){ int i=iregion; double[] SectorDimensions = new double[5]; - - SectorDimensions[0] = RecoilConstants.WIDTH[i]/2+1.; - SectorDimensions[1] = RecoilConstants.HEIGHT[i]/2+1.; - SectorDimensions[2] = (this.getChamberThickness())/2.+1; - /* SectorDimensions[0] = (this.getChamberThickness())/2. + RecoilConstants.ZENLARGEMENT ; - SectorDimensions[1] = RecoilConstants.SECTORHEIGHT/2 + RecoilConstants.YENLARGEMENT ; - SectorDimensions[2] = RecoilConstants.DX0CHAMBER0 + RecoilConstants.XENLARGEMENT ; - SectorDimensions[3] = (SectorDimensions[1]*2)*Math.tan(Math.toRadians(RecoilConstants.THOPEN/2))+SectorDimensions[2]; - SectorDimensions[4] = Math.toRadians(RecoilConstants.THTILT); - */ + SectorDimensions[0] = RecoilConstants.WIDTH[i]/2; + SectorDimensions[1] = RecoilConstants.HEIGHT[i]/2; + SectorDimensions[2] = (this.getChamberThickness())/2.; return SectorDimensions; } @@ -132,14 +125,9 @@ public Geant4Basic createSector(int isector, int iregion, int Nchambers) { // baricenter coordinate in CLAS12 frame Vector3d vCenter = this.getCenterCoordinate(isector,iregion); - // Sector construction - /* Geant4Basic sectorVolume = new G4Trap("region_Recoil_" + (iregion + 1) + "_s" + (isector + 1), - regionDZ, -regionThilt, Math.toRadians(90.0), - regionDY, regionDX0, regionDX1, 0.0, - regionDY, regionDX0, regionDX1, 0.0);*/ Geant4Basic sectorVolume = new G4Box("region_recoil_" + (iregion + 1) + "_s" + (isector + 1),hlx,hly,hlz); - /* sectorVolume.rotate("yxz", 0.0, regionThilt, Math.toRadians(90.0 - isector * 60.0));*/ + sectorVolume.rotate("yxz",(-1+isector*2)*Math.toRadians(1.5*RecoilConstants.HORIZONTHAL_OPENING_ANGLE+270),0,0); sectorVolume.translate(vCenter.x, vCenter.y, vCenter.z); sectorVolume.setId(isector + 1, iregion +1, 0, 0); @@ -147,14 +135,9 @@ public Geant4Basic createSector(int isector, int iregion, int Nchambers) { // Chambers construction for (int ich = 0; ich < Nchambers; ich++) { - // double y_chamber = (2*ich+1)*(RecoilConstants.SECTORHEIGHT/RecoilConstants.NCHAMBERS/2+0.05); - - Geant4Basic chamberVolume = this.createChamber(isector, iregion, ich); - - chamberVolume.setName("rg" + (iregion + 1) + "_s" + (isector + 1) + "_c" + (ich +1)); - + Geant4Basic chamberVolume = this.createChamber(isector, iregion, ich); + chamberVolume.setName("rg" + (iregion + 1) + "_s" + (isector + 1) + "_c" + (ich +1)); chamberVolume.setMother(sectorVolume); - //chamberVolume.translate(0.0,y_chamber-RecoilConstants.SECTORHEIGHT/2,0. ); chamberVolume.setId(isector + 1, iregion + 1, ich +1, 0); } diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilStripFactory.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilStripFactory.java index 9a4144f2a6..979a7a3fe2 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilStripFactory.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilStripFactory.java @@ -6,7 +6,6 @@ import org.jlab.detector.hits.DetHit; import org.jlab.detector.volume.Geant4Basic; import org.jlab.geom.prim.Line3D; -import org.jlab.geom.prim.Plane3D; import org.jlab.geom.prim.Point3D; import org.jlab.geom.prim.Vector3D; import org.jlab.geometry.prim.Line3d; @@ -23,7 +22,6 @@ public final class RecoilStripFactory { private RecoilGeant4Factory factory; private IndexedList globalStrips = new IndexedList(3); private IndexedList localStrips = new IndexedList(3); - private IndexedList planeStrips = new IndexedList(3); private int nRegions; private int nSectors; private int nChambers; @@ -73,7 +71,6 @@ public void init(DatabaseConstantProvider cp, int regions) { nChambers = RecoilConstants.NCHAMBERS; nLayers = RecoilConstants.NLAYERS; this.fillStripLists(); - // this.fillPlaneLists(); } /** @@ -117,7 +114,7 @@ public int getNStripChamber(int ichamber, int regions) { int nAB = (int) (2 * xHalf / RecoilConstants.PITCH); int nAC = (int) (2 * yHalf / RecoilConstants.PITCH); - int nStrips = nAB + nAC; + int nStrips = nAB + nAC +1; return nStrips; } @@ -191,7 +188,8 @@ private Line3d createStrip(int sector, int region, int layer, int strip) { } // ID of the strip int nS = (int) (DY / RecoilConstants.PITCH); - int nCStrip = nS + (cStrip - 1); + // int nCStrip = nS + (cStrip - 1); + int nCStrip = nS + (cStrip); double c = nCStrip * RecoilConstants.PITCH; // Take 2 points in the strip straight line. They needs to define Line object @@ -308,9 +306,10 @@ private void fillStripLists() { DY = -yHalf; } int nS = (int) (DY / RecoilConstants.PITCH); - int nCStrip = nS + (cStrip - 1); + // int nCStrip = nS + (cStrip - 1); + int nCStrip = nS + (cStrip); double c = nCStrip * RecoilConstants.PITCH; - if (((layer) % 2 == 0 && c>-xHalf && c-yHalf && c=-xHalf && c<=xHalf)||((layer) % 2 != 0 && c>=-yHalf && c<=yHalf)) { Line3d line = this.createStrip(sector, region,layer, strip); @@ -344,50 +343,7 @@ public Line3D toLocal(int sector, Line3D global) { return local; } - private void fillPlaneLists() { - - for(int ir=0; ir-xHalf && c-yHalf && c Date: Thu, 20 Mar 2025 05:51:41 -0400 Subject: [PATCH 7/7] modified geometry to keep into account the constraints frm HTCC, fixed some bugs too --- .../geant4/v2/recoil/RecoilConstants.java | 34 +++---------------- .../geant4/v2/recoil/RecoilGeant4Factory.java | 17 +++------- .../geant4/v2/recoil/RecoilStripFactory.java | 4 +-- 3 files changed, 12 insertions(+), 43 deletions(-) diff --git a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilConstants.java b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilConstants.java index 805407434e..5755c4f7ab 100644 --- a/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilConstants.java +++ b/common-tools/clas-jcsg/src/main/java/org/jlab/detector/geant4/v2/recoil/RecoilConstants.java @@ -15,23 +15,14 @@ public class RecoilConstants { public final static int NLAYERS = 2; //number of layers public final static int NCHAMBERS = 1; //number of chambers in a sector - public final static double HORIZONTHAL_OPENING_ANGLE = 34.; + public final static double HORIZONTHAL_STARTING_ANGLE = 40.; + public final static double HORIZONTHAL_OPENING_ANGLE = 29.; public final static double VERTICAL_OPENING_ANGLE = 50.; - public final static double RADIUS[] = {33.5,55.5,79.5}; + public final static double RADIUS[] = {44,72,100}; public final static double WIDTH[] = new double[NMAXREGIONS]; public final static double HEIGHT[] = new double[NMAXREGIONS]; public final static double THTILT = 0; // theta tilt (deg) - /* public final static double XENLARGEMENT = 0.5; // cm - public final static double YENLARGEMENT = 1.; // cm - public final static double ZENLARGEMENT = 0.1; // cm - - // Sector geometrical parameters - public final static double THOPEN = 34.; // opening angle between endplate planes (deg) - public final static double THTILT = 0; // theta tilt (deg) - public final static double THMIN = 4.694; // polar angle to the base of first chamber (deg) - public final static double SECTORHEIGHT = 146.21; //height of each sector (cm) - public final static double DX0CHAMBER0 = 5.197; // halfbase of chamber 1 (cm)*/ // Chamber volumes and materials (units are cm) public final static double[] CHAMBERVOLUMESTHICKNESS = {0.0025, 0.0005,0.3, // window @@ -48,15 +39,6 @@ public class RecoilConstants { "capa_sharing_layer2_glue","capa_sharing_layer2_Cr","capa_sharing_layer2_kapton", "readout1_glue", "readout1_Cu", "readout1_kapton", "readout2_glue", "readout2_Cu", "readout2_kapton", "readout3_glue", "support_skin1_g10", "support_honeycomb_nomex", "support_skin2_g10"}; - - // URWELL position in the CLAS12 frame - /* public final static double TGT2DC0 = 228.078; // cm - // public final static double URWELL2DC0 = 2; // cm - public final static double URWELL2DC0[] = new double[NMAXREGIONS]; - public final static double DIST2TGT[] = new double[NMAXREGIONS]; - public final static double W2TGT[] = new double[NMAXREGIONS];; - public final static double YMIN[] = new double[NMAXREGIONS]; - public final static double ZMIN[] = new double[NMAXREGIONS];*/ public final static double PITCH = 0.1 ; // cm public final static double STEREOANGLE = 90; // deg @@ -95,14 +77,8 @@ public static synchronized void load( DatabaseConstantProvider cp ) for (int i=0; i