Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ public class DetectorHeader {
private float livetime = -1;
private short eventCategory = 0;
private short eventCategoryFT = 0;
private float torus = 0.0f;
private float solenoid = 0.0f;

public DetectorHeader() {
}
Expand Down Expand Up @@ -113,4 +115,10 @@ public void setLiveTime(float livetime) {
public void setEventCategory(short evcat) {
this.eventCategory = evcat;
}

public void setTorus(float t) { torus = t; }
public void setSolenoid(float s) {solenoid = s; }
public float getTorus() { return torus; }
public float getSolenoid() { return solenoid; }

}
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import org.jlab.clas.tracking.kalmanfilter.zReference.StateVecs;
import org.jlab.clas.tracking.utilities.MatrixOps.Libr;
import org.jlab.clas.tracking.utilities.RungeKuttaDoca;
import org.jlab.detector.base.DetectorType;

public class DCTBEngine extends DCEngine {

Expand Down Expand Up @@ -200,6 +201,24 @@ public boolean processDataEvent(DataEvent event) {
if(TrackArray==null) {
return true; // HB tracks not saved correctly
}
if(Math.abs(Swimmer.getTorScale()) < 0.001 &&
event.hasBank(this.getBanks().getRecPartBank()) &&
event.hasBank(this.getBanks().getRecTrackBank())){
DataBank trackBank = event.getBank(this.getBanks().getRecTrackBank());
DataBank partBank = event.getBank(this.getBanks().getRecPartBank());
for (int i = 0; i < trackBank.rows(); i++) {
if (trackBank.getByte("detector", i) == DetectorType.DC.getDetectorId()) {
int pindex = trackBank.getShort("pindex", i);
if(partBank.getInt("pid", i) == 11) {
Track HBtrk = TrackArray[trackBank.getShort("index", i)];
HBtrk.set_pAtOrig(new Vector3D(partBank.getFloat("px", pindex),
partBank.getFloat("py", pindex),
partBank.getFloat("pz", pindex)));
HBtrk.set_P(HBtrk.get_pAtOrig().mag());
}
}
}
}
for(Segment seg : segments) {
if(seg.get(0).get_AssociatedHBTrackID()>0) {
TrackArray[seg.get(0).get_AssociatedHBTrackID()-1].get_ListOfHBSegments().add(seg);
Expand Down
22 changes: 22 additions & 0 deletions reconstruction/eb/src/main/java/org/jlab/rec/eb/EBUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,28 @@ public static boolean isSimpleElectron(DetectorParticle p,EBCCDBConstants ccdb)

return true;
}

/**
* Perform a basic true/false identification for electrons.
*/
public static boolean isZeroFieldElectron(DetectorParticle p,EBCCDBConstants ccdb) {

// require ECAL:
final int sector = p.getSector(DetectorType.ECAL);
if (sector<1) return false;

// requre HTCC photoelectrons:
final double nphe = p.getNphe(DetectorType.HTCC);
if (nphe < ccdb.getDouble(EBCCDBEnum.HTCC_NPHE_CUT)) return false;

// require PCAL minimum energy:
final double minPcalEnergy = ccdb.getSectorDouble(EBCCDBEnum.ELEC_PCAL_min_energy,sector);
final double pcalEnergy = p.getEnergy(DetectorType.ECAL,DetectorLayer.PCAL);
if (pcalEnergy < minPcalEnergy) return false;

// require PCAL+ECAL minimum energy 500 MeV:
return p.getEnergy(DetectorType.ECAL) > 0.5;
}

/**
* Calculate timing resolution from EventBuilder constants:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,17 @@ else if (p.hasHit(DetectorType.CND) || p.hasHit(DetectorType.CTOF) || p.hasHit(D
}
}

public void assignElectronMomenta(DetectorEvent de) {
final int np = de.getParticles().size();
for (int ii=0; ii<np; ii++) {
DetectorParticle p = de.getParticle(ii);
if (abs(p.getPid()) == 11) {
p.vector().setMag(p.getEnergy(DetectorType.ECAL) /
SamplingFractions.getMean(11,p,ccdb));
}
}
}

public void assignBetas(DetectorEvent event,final boolean useStartTimeFromFT){

final double startTime = useStartTimeFromFT ?
Expand Down Expand Up @@ -350,7 +361,7 @@ public void assignBetas(DetectorEvent event,final boolean useStartTimeFromFT){
}
public void assignPids(DetectorEvent event,final boolean useStartTimeFromFT) {

PIDHypothesis pidHyp = new PIDHypothesis();
PIDHypothesis pidHyp = new PIDHypothesis(event.getEventHeader().getTorus());
pidHyp.setEvent(event);
pidHyp.setUseStartTimeFromFT(useStartTimeFromFT);

Expand Down Expand Up @@ -382,12 +393,13 @@ else if (p.getCharge()<0) {

public class PIDHypothesis {

private float torus = 0;
private int theoryPID = -1;
private double PIDquality = 0.0;
private DetectorEvent event;
private boolean useStartTimeFromFT = false;

public PIDHypothesis() {}
public PIDHypothesis(float t) {torus=t;}

public void setEvent(DetectorEvent e) {event = e;}

Expand All @@ -405,7 +417,9 @@ public void PIDMatch(DetectorParticle p, int pid) {

final boolean pidFromTimingCheck = pid==pidFromTiming && p.getTheoryBeta(pid)>0;

final boolean isElectron = EBUtil.isSimpleElectron(p,ccdb);
final boolean isElectron = Math.abs(torus)>1e-8 ?
EBUtil.isSimpleElectron(p,ccdb) :
EBUtil.isZeroFieldElectron(p, ccdb);

final boolean htccSignalCheck = p.getNphe(DetectorType.HTCC)>ccdb.getDouble(EBCCDBEnum.HTCC_NPHE_CUT);
final boolean ltccSignalCheck = p.getNphe(DetectorType.LTCC)>ccdb.getDouble(EBCCDBEnum.LTCC_NPHE_CUT);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.jlab.service.eb;

import java.util.Collections;
import java.util.List;
import java.util.logging.Logger;

Expand Down Expand Up @@ -171,6 +170,10 @@ public boolean processDataEvent(DataEvent de,EBScalers ebs) {
EBAnalyzer analyzer = new EBAnalyzer(ccdb,rf);
analyzer.processEvent(eb.getEvent());

// Overwrite electron momentum for zero-field:
if (Math.abs(head.getTorus()) < 1e-8)
analyzer.assignElectronMomenta(eb.getEvent());

// Add Forward Tagger particles:
eb.processForwardTagger(de);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ public static DetectorHeader readHeader(DataEvent event, EBScalers ebs, EBCCDBCo
dHeader.setRun(bank.getInt("run", 0));
dHeader.setEvent(bank.getInt("event", 0));
dHeader.setTrigger(bank.getLong("trigger", 0));
dHeader.setTorus(bank.getFloat("torus", 0));
dHeader.setSolenoid(bank.getFloat("solenoid", 0));
}

// helicity:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -467,22 +467,27 @@ public void setCharge(int ch) {
this.charge = ch;
}

public int getSoftwareTriggerScore(DetectorParticle p,EBCCDBConstants ccdb) {
public int getSoftwareTriggerScore(DetectorParticle p,EBCCDBConstants ccdb,float torus) {

int score = 0;

final double npheCut = ccdb.getDouble(EBCCDBEnum.HTCC_NPHE_CUT);
if(p.getNphe(DetectorType.HTCC) > npheCut){
score += 10;
}

final int sector = p.getSector(DetectorType.ECAL);
if (sector > 0) {
final double nSigmaCut = ccdb.getSectorDouble(EBCCDBEnum.ELEC_SF_nsigma,sector);
final double sfNSigma = SamplingFractions.getNSigma(11,p,ccdb);
final double nsigma = SamplingFractions.getNSigma(11,p,ccdb);
final double minPcalEnergy = ccdb.getSectorDouble(EBCCDBEnum.ELEC_PCAL_min_energy,sector);
if(abs(sfNSigma) < nSigmaCut &&
p.getEnergy(DetectorType.ECAL,1) > minPcalEnergy) {
if (Math.abs(torus) <1e-8) {
if (p.getEnergy(DetectorType.ECAL,1) > minPcalEnergy &&
p.getEnergy(DetectorType.ECAL) > 0.5) {
score += 100;
}
}
else if (abs(nsigma) < nSigmaCut && p.getEnergy(DetectorType.ECAL,1) > minPcalEnergy) {
score += 100;
}
}
Expand All @@ -503,7 +508,7 @@ public boolean assignSoftwareTrigger(DetectorEvent event,EBCCDBConstants ccdb) {
int maxScore = 0;
for (int i=0; i<npart; i++) {
DetectorParticle p = event.getParticle(i);
final int score = getSoftwareTriggerScore(p,ccdb);
final int score = getSoftwareTriggerScore(p,ccdb,event.getEventHeader().getTorus());
if(score >= this.score_requirement) {
if (this.charge==p.getCharge()) {
p.setPid(this.id);
Expand Down
Loading