Skip to content

Commit

Permalink
Merge pull request #783 from JeffersonLab/AddFmwpcMatches
Browse files Browse the repository at this point in the history
Add fmwpc matches
  • Loading branch information
aaust authored Feb 19, 2024
2 parents 7e2a5e1 + acc669c commit 88381ec
Show file tree
Hide file tree
Showing 15 changed files with 348 additions and 89 deletions.
120 changes: 66 additions & 54 deletions src/libraries/FMWPC/DCPPEpEm_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -123,13 +123,13 @@ jerror_t DCPPEpEm_factory::evnt(JEventLoop *loop, uint64_t eventnumber)
unsigned int ip=(q1>q2)?0:1;
unsigned int in=(q1>q2)?1:0;

hyp=tracks[ip]->Get_Hypothesis(PiPlus);
if (hyp==NULL) return RESOURCE_UNAVAILABLE;
const DTrackTimeBased *piplus=hyp->Get_TrackTimeBased();
const DChargedTrackHypothesis *PiPhyp=tracks[ip]->Get_Hypothesis(PiPlus);
if (PiPhyp==NULL) return RESOURCE_UNAVAILABLE;
const DTrackTimeBased *piplus=PiPhyp->Get_TrackTimeBased();

hyp=tracks[in]->Get_Hypothesis(PiMinus);
if (hyp==NULL) return RESOURCE_UNAVAILABLE;
const DTrackTimeBased *piminus=hyp->Get_TrackTimeBased();
const DChargedTrackHypothesis *PiMhyp=tracks[in]->Get_Hypothesis(PiMinus);
if (PiMhyp==NULL) return RESOURCE_UNAVAILABLE;
const DTrackTimeBased *piminus=PiMhyp->Get_TrackTimeBased();

hyp=tracks[ip]->Get_Hypothesis(KPlus);
if (hyp==NULL) return RESOURCE_UNAVAILABLE;
Expand Down Expand Up @@ -285,7 +285,7 @@ jerror_t DCPPEpEm_factory::evnt(JEventLoop *loop, uint64_t eventnumber)
// n.b. if we need to use a mutex then we should pass a local
// array for "input" and the lock the mutex just for the copy
// to the tflite tensor.
if( PiMuFillFeatures(loop, piplus, piminus, pimu_input) ){
if( PiMuFillFeatures(loop, tracks.size(), PiPhyp, PiMhyp, pimu_input) ){

// Run inference
if( pimu_interpreter->Invoke() == kTfLiteOk){
Expand Down Expand Up @@ -418,26 +418,9 @@ bool DCPPEpEm_factory::VetoNeutrals(double t0_rf,const DVector3 &vect,
// Return true if values are valid, false otherwise.
// e.g. return false if there is not at least 1 pi+
// and 1 pi- candidate.
bool DCPPEpEm_factory::PiMuFillFeatures(jana::JEventLoop *loop, const DTrackTimeBased *piplus, const DTrackTimeBased *piminus, float *features){

vector<const DFMWPCMatchedTrack*> matchedtracks;
loop->Get( matchedtracks );

// Find the DFMWPCMatchedTrack objects corresponding to
// the piplus, piminus tracks used in for the kinematic fit
// (i.e. the ones passed into this method as arguments)
const DFMWPCMatchedTrack *piplus_mt = nullptr;
const DFMWPCMatchedTrack *piminus_mt = nullptr;
for( auto mt : matchedtracks ){
const DTrackTimeBased *trk;
mt->GetSingleT(trk);
if( trk == piplus ) piplus_mt = mt;
if( trk == piminus ) piminus_mt = mt;
}

// Must have a DFMWPCMatchedTrack for both a pi+ and pi-
if( (piplus_mt==nullptr) || (piminus_mt==nullptr) ) return false;

bool DCPPEpEm_factory::PiMuFillFeatures(jana::JEventLoop *loop, unsigned int nChargedTracks,const DChargedTrackHypothesis *PiPhyp, const DChargedTrackHypothesis *PiMhyp, float *features){
memset(features,0,47*sizeof(float));

// Features list is the following:
// 0 nChargedTracks
// 1 nFCALShowers
Expand Down Expand Up @@ -487,53 +470,82 @@ bool DCPPEpEm_factory::PiMuFillFeatures(jana::JEventLoop *loop, const DTrackTime
// 45 FMWPC_dist_closest_wire6_9
// 46 FMWPC_Nhits_cluster6_9

vector<const DChargedTrack*> chargedtracks;
vector<const DFCALShower* > fcalshowers;
vector<const DFCALHit* > fcalhits;
vector<const DFMWPCHit* > fmwpchits;
loop->Get( chargedtracks );
vector<const DEventHitStatistics*>stats;
loop->Get( stats );
loop->Get( fcalshowers );
loop->Get( fcalhits );
loop->Get( fmwpchits );

features[ 0] = chargedtracks.size();
features[ 0] = nChargedTracks;
features[ 1] = fcalshowers.size();
features[ 2] = fcalhits.size();
features[ 2] = (stats.size()>0) ? stats[0]->fcal_blocks : fcalhits.size();
features[ 3] = fmwpchits.size();
features[ 4] = matchedtracks.size();
features[ 5] = piplus_mt->FCAL_E_center;
features[ 6] = piplus_mt->FCAL_E_3x3;
features[ 7] = piplus_mt->FCAL_E_5x5;
for(int ilayer=0; ilayer<6; ilayer++){
features[ 8+3*ilayer] = piplus_mt->FMWPC_closest_wire[ilayer];
features[ 9+3*ilayer] = piplus_mt->FMWPC_dist_closest_wire[ilayer];
features[10+3*ilayer] = piplus_mt->FMWPC_Nhits_cluster[ilayer];
}
features[26] = piminus_mt->FCAL_E_center;
features[27] = piminus_mt->FCAL_E_3x3;
features[28] = piminus_mt->FCAL_E_5x5;
for(int ilayer=0; ilayer<6; ilayer++){
features[29+3*ilayer] = piminus_mt->FMWPC_closest_wire[ilayer];
features[30+3*ilayer] = piminus_mt->FMWPC_dist_closest_wire[ilayer];
features[31+3*ilayer] = piminus_mt->FMWPC_Nhits_cluster[ilayer];
features[ 4] = 4; // lepton and pion tracks found

// Match to FCAL for pi+ hypothesis
shared_ptr<const DFCALShowerMatchParams>fcalparms=PiPhyp->Get_FCALShowerMatchParams();
if (fcalparms!=nullptr){
features[ 5] = fcalparms->dEcenter;
features[ 6] = fcalparms->dE3x3;
features[ 7] = fcalparms->dE5x5;
}

// Match to FMWPCs for pi+ hypothesis
shared_ptr<const DFMWPCMatchParams>fmwpcparms=PiPhyp->Get_FMWPCMatchParams();
// Before training the model, Nikhil's code replaced feature values
// where the distance to the closest wire was >30 with values used
// to indicate no wire hit.
for(int ilayer=0; ilayer<6; ilayer++){
if( piminus_mt->FMWPC_dist_closest_wire[ilayer] >30.0 ){
features[29+3*ilayer] = -1000.0;
features[30+3*ilayer] = 1000000;
features[31+3*ilayer] = 0;
for (int ilayer=0; ilayer<6; ilayer++){
features[ 8+3*ilayer] = -1000.0;
features[ 9+3*ilayer] = 1000000;
features[10+3*ilayer] = 0;
}
if (fmwpcparms!=nullptr){
for (unsigned int i=0;i<fmwpcparms->dLayers.size();i++){
if (fmwpcparms->dDists[i]<30){
int ilayer=fmwpcparms->dLayers[i]-1;
features[ 8+3*ilayer] = fmwpcparms->dClosestWires[i];
features[ 9+3*ilayer] = fmwpcparms->dDists[i];
features[10+3*ilayer] = fmwpcparms->dNhits[i];
}
}
}

// Match to FCAL for pi- hypothesis
fcalparms=PiMhyp->Get_FCALShowerMatchParams();
if (fcalparms!=nullptr){
features[26] = fcalparms->dEcenter;
features[27] = fcalparms->dE3x3;
features[28] = fcalparms->dE5x5;
}
// Match to FMWPCs for pi- hypothesis
fmwpcparms=PiMhyp->Get_FMWPCMatchParams();
// Before training the model, Nikhil's code replaced feature values
// where the distance to the closest wire was >30 with values used
// to indicate no wire hit.
for (int ilayer=0; ilayer<6; ilayer++){
features[29+3*ilayer] = -1000.0;
features[30+3*ilayer] = 1000000;
features[31+3*ilayer] = 0;
}
if (fmwpcparms!=nullptr){
for (unsigned int i=0;i<fmwpcparms->dLayers.size();i++){
if (fmwpcparms->dDists[i]<30){
int ilayer=fmwpcparms->dLayers[i]-1;
features[29+3*ilayer] = fmwpcparms->dClosestWires[i];
features[30+3*ilayer] = fmwpcparms->dDists[i];
features[31+3*ilayer] = fmwpcparms->dNhits[i];
}
}
}

// These are values Nikhil sent that were used for normalizing the
// features before training the model.
static const float feature_min[] = {2.0,0.0,2.0,0.0,2.0,0.0,0.0,0.0,-1000.0,0.0,0.0,-1000.0,0.0,0.0,-1000.0,0.0,0.0,-1000.0,0.0,0.0,-1000.0,0.0,0.0,-1000.0,0.0,0.0,0.0,0.0,0.0,-1000.0,0.0,0.0,-1000.0,0.0,0.0,-1000.0,0.0,0.0,-1000.0,0.0,0.0,-1000.0,0.0,0.0,-1000.0,0.0,0.0,0.0};
static const float feature_max[] = {6.0,10.0,20.0,94.0,8.0,3.924656391143799,5.177245497703552,5.349521217867732,144.0,1000000.0,39.0,144.0,1000000.0,17.0,144.0,1000000.0,12.0,144.0,1000000.0,11.0,144.0,1000000.0,8.0,144.0,1000000.0,7.0,4.154212951660156,5.578885164111853,5.9553504548966885,144.0,1000000.0,39.0,144.0,1000000.0,32.0,144.0,1000000.0,14.0,144.0,1000000.0,35.0,144.0,1000000.0,7.0,144.0,1000000.0,11.0,1.0};
for(int i=0; i<48; i++){
for(int i=0; i<47; i++){
features[i] = (features[i] - feature_min[i])/(feature_max[i]-feature_min[i]);
}

Expand Down
3 changes: 2 additions & 1 deletion src/libraries/FMWPC/DCPPEpEm_factory.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <ANALYSIS/DKinFitUtils_GlueX.h>
#include <FMWPC/DFMWPCMatchedTrack.h>
#include <FMWPC/DFMWPCHit.h>
#include <HDDM/DEventHitStatistics.h>


class ReadMLPMinus;
Expand Down Expand Up @@ -56,7 +57,7 @@ void DoKinematicFit(const DBeamPhoton *beamphoton,
bool VetoNeutrals(double t0_rf,const DVector3 &vect,
vector<const DNeutralParticle*>&neutrals) const;

bool PiMuFillFeatures(jana::JEventLoop *loop, const DTrackTimeBased *piplus, const DTrackTimeBased *piminus, float *features);
bool PiMuFillFeatures(jana::JEventLoop *loop, unsigned int nChargedTracks,const DChargedTrackHypothesis *piplus, const DChargedTrackHypothesis *piminus, float *features);

double SPLIT_CUT,FCAL_THRESHOLD,BCAL_THRESHOLD,GAMMA_DT_CUT;
string PIMU_MODEL_FILE;
Expand Down
5 changes: 4 additions & 1 deletion src/libraries/FMWPC/DFMWPCCluster.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,21 @@ class DFMWPCCluster:public jana::JObject{

vector<const DFMWPCHit*> members; ///< DFMWPCHits that make up this cluster
int layer; ///< #1-6 FMWPC layer
int orientation; ///< Vertical/Horizontal
float xoffset,yoffset; ///< x and y offsets of wires
float q; ///< total charge in the cluster
float u; ///< center of gravity of cluster in wire coordinates
int first_wire; ///< first wire in cluster 1-144
int last_wire; ///< last wire in cluster 1-144
int Nhits; ///< Number of wire hits in cluster
DVector3 pos; ///< position (x,y,z) in global coodinates
DVector3 pos; ///< position (x,y,z) in global coordinates
float t; // time in ns

// This method is used primarily for pretty printing
// the second argument to AddString is printf style format
void toStrings(vector<pair<string,string> > &items)const{
AddString(items, "layer", "%d", layer);
AddString(items, "orientation", "%d", orientation);
AddString(items, "q", "%10.2f", q);
AddString(items, "u", "%3.4f", u);
AddString(items, "first_wire", "%3d", first_wire);
Expand Down
3 changes: 3 additions & 0 deletions src/libraries/FMWPC/DFMWPCCluster_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,9 @@ void DFMWPCCluster_factory::pique(vector<const DFMWPCHit*>& H)
// global coordinate system
// set to -777 for not measured coordinate
auto orientation = fmwpc_wire_orientation[newCluster->layer-1];
newCluster->orientation=orientation;
newCluster->xoffset=xvec[newCluster->layer-1];
newCluster->yoffset=yvec[newCluster->layer-1];
double x = (orientation==DGeometry::kFMWPC_WIRE_ORIENTATION_VERTICAL ) ? xvec[newCluster->layer-1]+(newCluster->u-72.5)*FMWPC_WIRE_SPACING : -777 ;
double y = (orientation==DGeometry::kFMWPC_WIRE_ORIENTATION_HORIZONTAL) ? yvec[newCluster->layer-1]+(newCluster->u-72.5)*FMWPC_WIRE_SPACING : -777 ;
double z = zvec[newCluster->layer-1];
Expand Down
32 changes: 30 additions & 2 deletions src/libraries/HDDM/DEventSourceREST.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1703,7 +1703,16 @@ jerror_t DEventSourceREST::Extract_DDetectorMatches(JEventLoop* locEventLoop, hd
locShowerMatchParams->dFlightTimeVariance = fcalIter->getTflightvar();
locShowerMatchParams->dPathLength = fcalIter->getPathlength();
locShowerMatchParams->dDOCAToShower = fcalIter->getDoca();

locShowerMatchParams->dEcenter=0.;
locShowerMatchParams->dE3x3=0.;
locShowerMatchParams->dE5x5=0.;
const hddm_r::FcalEnergyParamsList &fcalEnergyList = fcalIter->getFcalEnergyParamses();
hddm_r::FcalEnergyParamsList::iterator fcalEnergyIter = fcalEnergyList.begin();
for(; fcalEnergyIter != fcalEnergyList.end(); ++fcalEnergyIter){
locShowerMatchParams->dEcenter=fcalEnergyIter->getEcenter();
locShowerMatchParams->dE3x3=fcalEnergyIter->getE3x3();
locShowerMatchParams->dE5x5=fcalEnergyIter->getE5x5();
}
locDetectorMatches->Add_Match(locTrackTimeBasedVector[locTrackIndex], locFCALShowers[locShowerIndex], std::const_pointer_cast<const DFCALShowerMatchParams>(locShowerMatchParams));
}

Expand Down Expand Up @@ -1798,7 +1807,26 @@ jerror_t DEventSourceREST::Extract_DDetectorMatches(JEventLoop* locEventLoop, hd
}
}
}


// Extract track matching data for FMPWCs
const hddm_r::FmwpcMatchParamsList &fmwpcList = iter->getFmwpcMatchParamses();
hddm_r::FmwpcMatchParamsList::iterator fmwpcIter = fmwpcList.begin();
for(; fmwpcIter != fmwpcList.end(); ++fmwpcIter)
{
size_t locTrackIndex = fmwpcIter->getTrack();
const hddm_r::FmwpcDataList &fmwpcDataList = fmwpcIter->getFmwpcDatas();
hddm_r::FmwpcDataList::iterator fmwpcDataIter = fmwpcDataList.begin();

auto locFMWPCMatchParams = std::make_shared<DFMWPCMatchParams>();
for(; fmwpcDataIter != fmwpcDataList.end(); ++fmwpcDataIter){
locFMWPCMatchParams->dLayers.push_back(fmwpcDataIter->getLayer());
locFMWPCMatchParams->dNhits.push_back(fmwpcDataIter->getNhits());
locFMWPCMatchParams->dDists.push_back(fmwpcDataIter->getDist());
locFMWPCMatchParams->dClosestWires.push_back(fmwpcDataIter->getClosestwire());
}
locDetectorMatches->Add_Match(locTrackTimeBasedVector[locTrackIndex], std::const_pointer_cast<const DFMWPCMatchParams>(locFMWPCMatchParams));
}

// Extract track matching data for CTOF
const hddm_r::CtofMatchParamsList &ctofList = iter->getCtofMatchParamses();
hddm_r::CtofMatchParamsList::iterator ctofIter = ctofList.begin();
Expand Down
76 changes: 56 additions & 20 deletions src/libraries/HDDM/DEventWriterREST.cc
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ DEventWriterREST::DEventWriterREST(JEventLoop* locEventLoop, string locOutputFil
REST_WRITE_CCAL_SHOWERS = true;
gPARMS->SetDefaultParameter("REST:WRITE_CCAL_SHOWERS", REST_WRITE_CCAL_SHOWERS);

ADD_FCAL_DATA_FOR_CPP=false;
gPARMS->SetDefaultParameter("PID:ADD_FCAL_DATA_FOR_CPP",ADD_FCAL_DATA_FOR_CPP);


CCDB_CONTEXT_STRING = "";
// if we can get the calibration context from the DANA interface, then save this as well
DApplication *dapp = dynamic_cast<DApplication*>(locEventLoop->GetJApplication());
Expand Down Expand Up @@ -627,27 +631,19 @@ bool DEventWriterREST::Write_RESTEvent(JEventLoop* locEventLoop, string locOutpu
fcalList().setPathlength(locFCALShowerMatchParamsVector[loc_k]->dPathLength);
fcalList().setTflight(locFCALShowerMatchParamsVector[loc_k]->dFlightTime);
fcalList().setTflightvar(locFCALShowerMatchParamsVector[loc_k]->dFlightTimeVariance);
}

vector<shared_ptr<const DCTOFHitMatchParams>> locCTOFHitMatchParamsVector;
locDetectorMatches[loc_i]->Get_CTOFMatchParams(tracks[loc_j], locCTOFHitMatchParamsVector);
for(size_t loc_k = 0; loc_k < locCTOFHitMatchParamsVector.size(); ++loc_k)
{
hddm_r::CtofMatchParamsList ctofList = matches().addCtofMatchParamses(1);
ctofList().setTrack(loc_j);

size_t locCTOFindex = 0;
for(; locCTOFindex < ctofpoints.size(); ++locCTOFindex)
{
if(ctofpoints[locCTOFindex] == locCTOFHitMatchParamsVector[loc_k]->dCTOFPoint)
break;
// Additional energy information
if (ADD_FCAL_DATA_FOR_CPP){
// Sanity check for this additional info
double myE5x5=locFCALShowerMatchParamsVector[loc_k]->dE5x5;
double myE3x3=locFCALShowerMatchParamsVector[loc_k]->dE3x3;
double myEcenter=locFCALShowerMatchParamsVector[loc_k]->dEcenter;
if (myEcenter>0. || myE3x3>0. || myE5x5>0.){
hddm_r::FcalEnergyParamsList fcalEnergyParamsList = fcalList().addFcalEnergyParamses(1);
fcalEnergyParamsList().setEcenter(myEcenter);
fcalEnergyParamsList().setE3x3(myE3x3);
fcalEnergyParamsList().setE5x5(myE5x5);
}
}
ctofList().setHit(locCTOFindex);
ctofList().setDEdx(locCTOFHitMatchParamsVector[loc_k]->dEdx);
ctofList().setTflight(locCTOFHitMatchParamsVector[loc_k]->dFlightTime);

ctofList().setDeltax(locCTOFHitMatchParamsVector[loc_k]->dDeltaXToHit);
ctofList().setDeltay(locCTOFHitMatchParamsVector[loc_k]->dDeltaYToHit);
}

vector<shared_ptr<const DFCALSingleHitMatchParams>> locFCALSingleHitMatchParamsVector;
Expand Down Expand Up @@ -795,6 +791,46 @@ bool DEventWriterREST::Write_RESTEvent(JEventLoop* locEventLoop, string locOutpu
correlationList().setSystem(SYS_START);
correlationList().setCorrelation(locFlightTimePCorrelation);
}

//--------- The following are for CPP -------------//
vector<shared_ptr<const DFMWPCMatchParams>> locFMWPCMatchParamsVector;
locDetectorMatches[loc_i]->Get_FMWPCMatchParams(tracks[loc_j], locFMWPCMatchParamsVector);
for(size_t loc_k = 0; loc_k < locFMWPCMatchParamsVector.size(); ++loc_k){
hddm_r::FmwpcMatchParamsList fmwpcList = matches().addFmwpcMatchParamses(1);
fmwpcList().setTrack(loc_j);
vector<int>locLayers=locFMWPCMatchParamsVector[loc_k]->dLayers;
vector<int>locNhits=locFMWPCMatchParamsVector[loc_k]->dNhits;
vector<int>locDists=locFMWPCMatchParamsVector[loc_k]->dDists;
vector<int>locClosestWires=locFMWPCMatchParamsVector[loc_k]->dClosestWires;
for (size_t loc_m=0;loc_m<locLayers.size();loc_m++){
hddm_r::FmwpcDataList fmwpcDataList = fmwpcList().addFmwpcDatas(1);
fmwpcDataList().setLayer(locLayers[loc_m]);
fmwpcDataList().setNhits(locNhits[loc_m]);
fmwpcDataList().setDist(locDists[loc_m]);
fmwpcDataList().setClosestwire(locClosestWires[loc_m]);
}
}

vector<shared_ptr<const DCTOFHitMatchParams>> locCTOFHitMatchParamsVector;
locDetectorMatches[loc_i]->Get_CTOFMatchParams(tracks[loc_j], locCTOFHitMatchParamsVector);
for(size_t loc_k = 0; loc_k < locCTOFHitMatchParamsVector.size(); ++loc_k)
{
hddm_r::CtofMatchParamsList ctofList = matches().addCtofMatchParamses(1);
ctofList().setTrack(loc_j);

size_t locCTOFindex = 0;
for(; locCTOFindex < ctofpoints.size(); ++locCTOFindex)
{
if(ctofpoints[locCTOFindex] == locCTOFHitMatchParamsVector[loc_k]->dCTOFPoint)
break;
}
ctofList().setHit(locCTOFindex);
ctofList().setDEdx(locCTOFHitMatchParamsVector[loc_k]->dEdx);
ctofList().setTflight(locCTOFHitMatchParamsVector[loc_k]->dFlightTime);

ctofList().setDeltax(locCTOFHitMatchParamsVector[loc_k]->dDeltaXToHit);
ctofList().setDeltay(locCTOFHitMatchParamsVector[loc_k]->dDeltaYToHit);
}
}

for(size_t loc_j = 0; loc_j < bcalshowers.size(); ++loc_j)
Expand Down
1 change: 1 addition & 0 deletions src/libraries/HDDM/DEventWriterREST.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ class DEventWriterREST : public JObject
bool REST_WRITE_FMWPC_HITS;
bool REST_WRITE_CCAL_SHOWERS;
bool REST_WRITE_TRACK_EXIT_PARAMS;
bool ADD_FCAL_DATA_FOR_CPP;

// metadata to save in the REST file
// these should be consistent during program execution
Expand Down
11 changes: 10 additions & 1 deletion src/libraries/HDDM/rest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,10 @@
<fcalMatchParams maxOccurs="unbounded" minOccurs="0"
track="int" shower="int"
dx="float" doca="float" pathlength="float" tflight="float" tflightvar="float"
tunit="ns" lunit="cm"/>
tunit="ns" lunit="cm">
<fcalEnergyParams maxOccurs="1" minOccurs="0"
Ecenter="float" E3x3="float" E5x5="float"/>
</fcalMatchParams>
<fcalSingleHitMatchParams maxOccurs="unbounded" minOccurs="0"
track="int" ehit="float" thit="float"
dx="float" doca="float" pathlength="float" tflight="float" tflightvar="float"
Expand All @@ -142,6 +145,12 @@
track="int" hit="int" dEdx="float"
deltax="float" deltay="float" tflight="float"
tunit="ns" lunit="cm" dEdx_unit="GeV/cm"/>
<fmwpcMatchParams maxOccurs="unbounded" minOccurs="0"
track="int">
<fmwpcData maxOccurs="6" minOccurs="0"
layer="int" nhits="int"
dist="int" closestwire="int" />
</fmwpcMatchParams>
<tofMatchParams maxOccurs="unbounded" minOccurs="0"
track="int" hit="int"
dEdx="float" thit="float" thitvar="float" ehit="float"
Expand Down
Loading

0 comments on commit 88381ec

Please sign in to comment.