diff --git a/examples/PARAM/hcana.param b/examples/PARAM/hcana.param index 646ac747fa0834ee7ced8d01863f7f86467ba47c..6d3295a3a54711f41f723fa9be39a9059221562d 100644 --- a/examples/PARAM/hcana.param +++ b/examples/PARAM/hcana.param @@ -19,3 +19,14 @@ hhodo_plane_names = "1x 1y 2x 2y" # The following were defined in REPLAY.PARAM h_recon_coeff_filename = 'PARAM/hms_recon_coeff.dat' ;hms optics matrix s_recon_coeff_filename = 'PARAM/sos_recon_coeff.dat' ;sos optics matrix + +# The following are set to zero to replicate historical ENGINE behavior +# For new analyses they should be set to 1. If not defined here, +# hcana will default 1, the new and correct behaviour. + +# If 1, Let a hit have different L/R assignment for different space points +# instead of L/R assignment from first sp it appears in. +hdc_fix_lr = 0 +# If 1, don't do the the propagation along the wire each time the hit +# appears in a space point. (Which means the correction accumulates) +hdc_fix_propcorr = 0 diff --git a/src/THcDC.cxx b/src/THcDC.cxx index 4dc3af6f6caa97b84a259c905a7e1771afb87f01..9c8a4455653b4b6afe3c899486c6d4b4f8cdcbf8 100644 --- a/src/THcDC.cxx +++ b/src/THcDC.cxx @@ -67,6 +67,11 @@ THcDC::THcDC( fPlaneTimeZero = NULL; fSigma = NULL; + // These should be set to zero (in a parameter file) in order to + // replicate historical ENGINE behavior + fFixLR = 1; + fFixPropagationCorrection = 1; + fDCTracks = new TClonesArray( "THcDCTrack", 20 ); } @@ -301,6 +306,8 @@ Int_t THcDC::ReadDatabase( const TDatime& date ) {"yt_track_criterion", &fYtTrCriterion, kDouble}, {"xpt_track_criterion", &fXptTrCriterion, kDouble}, {"ypt_track_criterion", &fYptTrCriterion, kDouble}, + {"dc_fix_lr", &fFixLR, kInt}, + {"dc_fix_propcorr", &fFixPropagationCorrection, kInt}, {0} }; gHcParms->LoadParmValues((DBRequest*)&list,prefix); @@ -565,7 +572,7 @@ void THcDC::LinkStubs() } } fNDCTracks=0; // Number of Focal Plane tracks found - fDCTracks->Clear(); + fDCTracks->Clear("C"); Double_t stubminx = 999999; Double_t stubminy = 999999; Double_t stubminxp = 999999; @@ -575,6 +582,7 @@ void THcDC::LinkStubs() if (fDebugDC) cout << "Joined space points = " << fNSp-1 << endl; if(!fSingleStub) { for(Int_t isp1=0;isp1<fNSp-1;isp1++) { // isp1 is index/id in total list of space points + THcSpacePoint* sp1 = fSp[isp1]; if (fDebugDC) cout << "Loop thru joined space points " << isp1+1<< endl; Int_t sptracks=0; // Now make sure this sp is not already used in a sp. @@ -584,7 +592,7 @@ void THcDC::LinkStubs() THcDCTrack *theDCTrack = static_cast<THcDCTrack*>( fDCTracks->At(itrack)); for(Int_t isp=0;isp<theDCTrack->GetNSpacePoints();isp++) { // isp is index into list of space points attached to theDCTrack - if(theDCTrack->GetSpacePointID(isp) == isp1) { + if(theDCTrack->GetSpacePoint(isp) == sp1) { tryflag=0; } } @@ -592,10 +600,11 @@ void THcDC::LinkStubs() if(tryflag) { // SP not already part of a track Int_t newtrack=1; for(Int_t isp2=isp1+1;isp2<fNSp;isp2++) { + THcSpacePoint* sp2=fSp[isp2]; if (fDebugDC) cout << "second Loop space points " << isp2<< endl; - if(fSp[isp1]->fNChamber!=fSp[isp2]->fNChamber) { - Double_t *spstub1=fSp[isp1]->GetStubP(); - Double_t *spstub2=fSp[isp2]->GetStubP(); + if(sp1->fNChamber!=sp2->fNChamber) { + Double_t *spstub1=sp1->GetStubP(); + Double_t *spstub2=sp2->GetStubP(); Double_t dposx = spstub1[0] - spstub2[0]; Double_t dposy = spstub1[1] - spstub2[1]; Double_t dposxp = spstub1[2] - spstub2[2]; @@ -626,8 +635,8 @@ void THcDC::LinkStubs() sptracks=0; // Number of tracks with this seed stub_tracks[sptracks++] = fNDCTracks; THcDCTrack *theDCTrack = new( (*fDCTracks)[fNDCTracks++]) THcDCTrack(fNPlanes); - theDCTrack->AddSpacePoint(isp1); - theDCTrack->AddSpacePoint(isp2); + theDCTrack->AddSpacePoint(sp1); + theDCTrack->AddSpacePoint(sp2); if (fDebugDC) cout << " # sp pts combined = " << theDCTrack->GetNSpacePoints() << endl; if (fDebugDC) cout << " combine sp = " << isp1 << " and " << isp2 << endl; // Now save the X, Y and XP for the two stubs @@ -656,11 +665,11 @@ void THcDC::LinkStubs() for(Int_t isp=0;isp<theDCTrack->GetNSpacePoints();isp++) { // isp is index of space points in theDCTrack if (fDebugDC) cout << "looping of previous track = " << isp+1 << endl; - if(fSp[isp2]->fNChamber == - fSp[theDCTrack->GetSpacePointID(isp)]->fNChamber) { + if(sp2->fNChamber == + theDCTrack->GetSpacePoint(isp)->fNChamber) { spoint=isp; } - if(isp2==theDCTrack->GetSpacePointID(isp)) { + if(sp2==theDCTrack->GetSpacePoint(isp)) { duppoint=1; } } // End loop over sp in tracks with isp1 @@ -668,7 +677,7 @@ void THcDC::LinkStubs() // add this space point to current track(2) if(!duppoint) { if(spoint<0) { - theDCTrack->AddSpacePoint(isp2); + theDCTrack->AddSpacePoint(sp2); } else { // If there is another point in the same chamber // in this track create a new track with all the @@ -680,9 +689,9 @@ void THcDC::LinkStubs() if (fDebugDC) cout << "loop over theDCtrack # of sp tps = " << theDCTrack->GetNSpacePoints() << endl; for(Int_t isp=0;isp<theDCTrack->GetNSpacePoints();isp++) { if(isp!=spoint) { - newDCTrack->AddSpacePoint(theDCTrack->GetSpacePointID(isp)); + newDCTrack->AddSpacePoint(theDCTrack->GetSpacePoint(isp)); } else { - newDCTrack->AddSpacePoint(isp2); + newDCTrack->AddSpacePoint(sp2); } // End check for dup on copy if (fDebugDC) cout << "newDCtrack # of sp tps = " << newDCTrack->GetNSpacePoints() << endl; } // End copy of track @@ -706,7 +715,7 @@ void THcDC::LinkStubs() if(fNDCTracks<MAXTRACKS) { // Need some constructed at thingy THcDCTrack *newDCTrack = new( (*fDCTracks)[fNDCTracks++]) THcDCTrack(fNPlanes); - newDCTrack->AddSpacePoint(isp); + newDCTrack->AddSpacePoint(fSp[isp]); } else { if (fDebugDC) cout << "EPIC FAIL 3: Too many tracks found in THcDC::LinkStubs" << endl; fNDCTracks=0; @@ -715,22 +724,6 @@ void THcDC::LinkStubs() } } } - // Add the list of hits on the track to the track. - // Looks like it adds all hits for all space points to every track - for(Int_t itrack=0;itrack<fNDCTracks;itrack++) { - THcDCTrack *theDCTrack = static_cast<THcDCTrack*>( fDCTracks->At(itrack)); - theDCTrack->ClearHits(); - if (fDebugDC) cout << " Looping thru track add hits track = " << itrack+1 << " with " << theDCTrack->GetNSpacePoints() << " space points "<< endl; - // Hit list in the track should have been cleared when created. - for(Int_t isp=0;isp<theDCTrack->GetNSpacePoints();isp++) { - Int_t spind=theDCTrack->GetSpacePointID(isp); - if (fDebugDC) cout << " add hits to " << itrack+1 << " sp pt = " << spind << " hits = " << fSp[spind]->GetNHits() <<endl; - for(Int_t ihit=0;ihit<fSp[spind]->GetNHits();ihit++) { - theDCTrack->AddHit(fSp[spind]->GetHit(ihit)); - } - } - } - /// /// if (fDebugDC) cout << " End Linkstubs Found " << fNDCTracks << " tracks"<<endl; } @@ -758,10 +751,35 @@ void THcDC::TrackFit() } Double_t dummychi2 = 1.0E4; + for(Int_t itrack=0;itrack<fNDCTracks;itrack++) { // Double_t chi2 = dummychi2; // Int_t htrack_fit_num = itrack; THcDCTrack *theDCTrack = static_cast<THcDCTrack*>( fDCTracks->At(itrack)); + + Double_t coords[theDCTrack->GetNHits()]; + Int_t planes[theDCTrack->GetNHits()]; + for(Int_t ihit=0;ihit < theDCTrack->GetNHits();ihit++) { + THcDCHit* hit=theDCTrack->GetHit(ihit); + planes[ihit]=hit->GetPlaneNum()-1; + if(fFixLR) { + if(fFixPropagationCorrection) { + coords[ihit] = hit->GetPos() + + theDCTrack->GetHitLR(ihit)*theDCTrack->GetHitDist(ihit); + } else { + coords[ihit] = hit->GetPos() + + theDCTrack->GetHitLR(ihit)*hit->GetDist(); + } + } else { + if(fFixPropagationCorrection) { + coords[ihit] = hit->GetPos() + + hit->GetLR()*theDCTrack->GetHitDist(ihit); + } else { + coords[ihit] = hit->GetCoord(); + } + } + } + cout << " Looping thru track = " << itrack+1 << " Hits = " << theDCTrack->GetNHits() << endl; theDCTrack->SetNFree(theDCTrack->GetNHits() - NUM_FPRAY); Double_t chi2 = dummychi2; @@ -771,11 +789,9 @@ void THcDC::TrackFit() for(Int_t irayp=0;irayp<NUM_FPRAY;irayp++) { TT[irayp] = 0.0; for(Int_t ihit=0;ihit < theDCTrack->GetNHits();ihit++) { - THcDCHit* hit=theDCTrack->GetHit(ihit); - Int_t plane=hit->GetPlaneNum()-1; - TT[irayp] += (hit->GetCoord()* - fPlaneCoeffs[plane][raycoeffmap[irayp]]) - /pow(fSigma[plane],2); + TT[irayp] += (coords[ihit]* + fPlaneCoeffs[planes[ihit]][raycoeffmap[irayp]]) + /pow(fSigma[planes[ihit]],2); } } for(Int_t irayp=0;irayp<NUM_FPRAY;irayp++) { @@ -785,11 +801,9 @@ void THcDC::TrackFit() AA[irayp][jrayp] = AA[jrayp][irayp]; } else { for(Int_t ihit=0;ihit < theDCTrack->GetNHits();ihit++) { - THcDCHit* hit=theDCTrack->GetHit(ihit); - Int_t plane=hit->GetPlaneNum()-1; - AA[irayp][jrayp] += fPlaneCoeffs[plane][raycoeffmap[irayp]]* - fPlaneCoeffs[plane][raycoeffmap[jrayp]]/ - pow(fSigma[plane],2); + AA[irayp][jrayp] += fPlaneCoeffs[planes[ihit]][raycoeffmap[irayp]]* + fPlaneCoeffs[planes[ihit]][raycoeffmap[jrayp]]/ + pow(fSigma[planes[ihit]],2); } } } @@ -818,18 +832,16 @@ void THcDC::TrackFit() // Compute Chi2 and residuals chi2 = 0.0; for(Int_t ihit=0;ihit < theDCTrack->GetNHits();ihit++) { - THcDCHit* hit=theDCTrack->GetHit(ihit); - Int_t plane=hit->GetPlaneNum()-1; - Double_t residual = hit->GetCoord() - theDCTrack->GetCoord(plane); - theDCTrack->SetResidual(plane, residual); - chi2 += pow(residual/fSigma[plane],2); + Double_t residual = coords[ihit] - theDCTrack->GetCoord(planes[ihit]); + theDCTrack->SetResidual(planes[ihit], residual); + chi2 += pow(residual/fSigma[planes[ihit]],2); } if (fDebugDC) { cout << "Hit HDC_WIRE_COORD Fit postiion Residual " << endl; for(Int_t ihit=0;ihit < theDCTrack->GetNHits();ihit++) { THcDCHit* hit=theDCTrack->GetHit(ihit); Int_t plane=hit->GetPlaneNum()-1; - cout << ihit+1 << " " << hit->GetCoord() << " " << theDCTrack->GetCoord(plane) << " " << theDCTrack->GetResidual(plane) << endl; + cout << ihit+1 << " " << coords[ihit] << " " << theDCTrack->GetCoord(plane) << " " << theDCTrack->GetResidual(plane) << endl; } } theDCTrack->SetVector(dray[0], dray[1], 0.0, dray[2], dray[3]); @@ -867,7 +879,24 @@ void THcDC::TrackFit() THcDCHit* hit=theDCTrack2->GetHit(ihit); Int_t plane=hit->GetPlaneNum()-1; Double_t pos = DpsiFun(ray1,plane); - theDCTrack1->SetDoubleResidual(plane,hit->GetCoord() - pos); + Double_t coord; + if(fFixLR) { + if(fFixPropagationCorrection) { + coord = hit->GetPos() + + theDCTrack2->GetHitLR(ihit)*theDCTrack2->GetHitDist(ihit); + } else { + coord = hit->GetPos() + + theDCTrack2->GetHitLR(ihit)*hit->GetDist(); + } + } else { + if(fFixPropagationCorrection) { + coord = hit->GetPos() + + hit->GetLR()*theDCTrack2->GetHitDist(ihit); + } else { + coord = hit->GetCoord(); + } + } + theDCTrack1->SetDoubleResidual(plane,coord - pos); // hdc_dbl_res(pln) = hdc_double_residual(1,pln) for hists } itrack=0; @@ -877,7 +906,24 @@ void THcDC::TrackFit() THcDCHit* hit=theDCTrack1->GetHit(ihit); Int_t plane=hit->GetPlaneNum()-1; Double_t pos = DpsiFun(ray1,plane); - theDCTrack2->SetDoubleResidual(plane,hit->GetCoord() - pos); + Double_t coord; + if(fFixLR) { + if(fFixPropagationCorrection) { + coord = hit->GetPos() + + theDCTrack1->GetHitLR(ihit)*theDCTrack1->GetHitDist(ihit); + } else { + coord = hit->GetPos() + + theDCTrack1->GetHitLR(ihit)*hit->GetDist(); + } + } else { + if(fFixPropagationCorrection) { + coord = hit->GetPos() + + hit->GetLR()*theDCTrack1->GetHitDist(ihit); + } else { + coord = hit->GetCoord(); + } + } + theDCTrack2->SetDoubleResidual(plane,coord - pos); // hdc_dbl_res(pln) = hdc_double_residual(1,pln) for hists } } diff --git a/src/THcDC.h b/src/THcDC.h index 6a46a9cf33128480760cca2c172fa2c8db1df32c..b7f40fd375ae8958ac623a2c3fa9ba8ba31488a6 100644 --- a/src/THcDC.h +++ b/src/THcDC.h @@ -61,6 +61,7 @@ public: Double_t GetPlaneTimeZero(Int_t plane) const { return fPlaneTimeZero[plane-1];} Double_t GetSigma(Int_t plane) const { return fSigma[plane-1];} + Int_t GetFixPropagationCorrectionFlag() const {return fFixPropagationCorrection;} Double_t GetNSperChan() const { return fNSperChan;} @@ -84,6 +85,12 @@ protected: Int_t fNPlanes; // Total number of DC planes char** fPlaneNames; Int_t fNChambers; + Int_t fFixLR; // If 1, allow a given hit to have different LR + // for different space points + Int_t fFixPropagationCorrection; // If 1, don't reapply (and accumulate) the + // propagation along the wire correction for + // each space point a hit occurs in. Keep a + // separate correction for each space point. // Per-event data Int_t fNhits; diff --git a/src/THcDCHit.h b/src/THcDCHit.h index e32cc6159bd9590170df39d4ebb15a175aebcec3..c0bbc7b325b5033d90f17ff6bf638c0b1a2a7375 100644 --- a/src/THcDCHit.h +++ b/src/THcDCHit.h @@ -48,7 +48,8 @@ public: void SetRawTime(Int_t time) { fRawTime = time; } void SetTime(Double_t time) { fTime = time; } void SetDist(Double_t dist) { fDist = dist; } - void SetLeftRight(Int_t lr) { fCoord = GetPos() + lr*fDist;} + void SetLeftRight(Int_t lr) { fCoord = GetPos() + lr*fDist; fLR=lr;} + Int_t GetLR() { return fLR; } void SetdDist(Double_t ddist) { fdDist = ddist; } void SetFitDist(Double_t dist) { ftrDist = dist; } Int_t GetPlaneNum() const { return fWirePlane->GetPlaneNum(); } @@ -64,6 +65,7 @@ protected: Double_t fTime; // Time corrected for time offset of wire (s) THcDriftChamberPlane* fWirePlane; //! Pointer to parent wire plane Double_t fDist; // (Perpendicular) Drift Distance + Int_t fLR; // +1/-1 which side of wire Double_t fCoord; // Actual coordinate of hit Double_t fdDist; // uncertainty in fDist (for chi2 calc) Double_t ftrDist; // (Perpendicular) distance from the track diff --git a/src/THcDCTrack.cxx b/src/THcDCTrack.cxx index 1423c49980cadea8db12fccbf51b877e91057498..92503b0d1e11b6f1589c03be176445d8faa8a62e 100644 --- a/src/THcDCTrack.cxx +++ b/src/THcDCTrack.cxx @@ -7,6 +7,7 @@ #include "THcDCHit.h" #include "THcDCTrack.h" +#include "THcSpacePoint.h" THcDCTrack::THcDCTrack(Int_t nplanes) : fnSP(0), fNHits(0) { fHits.clear(); @@ -15,17 +16,26 @@ THcDCTrack::THcDCTrack(Int_t nplanes) : fnSP(0), fNHits(0) fDoubleResiduals.resize(nplanes); } -void THcDCTrack::AddHit(THcDCHit * hit) +void THcDCTrack::AddHit(THcDCHit * hit, Double_t dist, Int_t lr) { // Add a hit to the track - fHits.push_back(hit); + Hit newhit; + newhit.dchit = hit; + newhit.distCorr = dist; + newhit.lr = lr; + fHits.push_back(newhit); fNHits++; } -void THcDCTrack::AddSpacePoint( Int_t spid ) +void THcDCTrack::AddSpacePoint( THcSpacePoint* sp ) { // Add to list of space points in this track // Need a check for maximum spacepoints of 10 - fspID[fnSP++] = spid; + fSp[fnSP++] = sp; + // Copy all the hits from the space point into the track + // Will need to also copy the corrected distance and lr information + for(Int_t ihit=0;ihit<sp->GetNHits();ihit++) { + AddHit(sp->GetHit(ihit),sp->GetHitDist(ihit),sp->GetHitLR(ihit)); + } } void THcDCTrack::Clear( const Option_t* ) diff --git a/src/THcDCTrack.h b/src/THcDCTrack.h index d13c774f5ec755e7d34bfb42f145893f4abad505..4c263a47451d62f53813586c023383c2b3c71ffe 100644 --- a/src/THcDCTrack.h +++ b/src/THcDCTrack.h @@ -22,14 +22,16 @@ public: THcDCTrack(Int_t nplanes); virtual ~THcDCTrack() {}; - virtual void AddHit(THcDCHit * hit); - virtual void AddSpacePoint(Int_t spid); + virtual void AddSpacePoint(THcSpacePoint* sp); //Get and Set Functions - Int_t* GetSpacePoints() {return fspID;} + // Int_t* GetSpacePoints() {return fspID;} Int_t GetNSpacePoints() const { return fnSP;} - Int_t GetSpacePointID(Int_t i) const {return fspID[i];} - THcDCHit* GetHit(Int_t i) const {return fHits[i];} + // Int_t GetSpacePointID(Int_t i) const {return fspID[i];} + THcSpacePoint* GetSpacePoint(Int_t i) const {return fSp[i];} + THcDCHit* GetHit(Int_t i) const {return fHits[i].dchit;} + Double_t GetHitDist(Int_t ihit) { return fHits[ihit].distCorr; }; + Int_t GetHitLR(Int_t ihit) { return fHits[ihit].lr; }; Int_t GetNHits() const {return fNHits;} Int_t GetNFree() const {return fNfree;} Double_t GetCoord(Int_t ip) const {return fCoords[ip];} @@ -58,10 +60,20 @@ public: Int_t fnSP; /* Number of space points in this track */ /* Should we have a list of pointers to space points instead of their indices? */ - Int_t fspID[10]; /* List of space points in this track */ + // Int_t fspID[10]; /* List of space points in this track */ + THcSpacePoint* fSp[10]; /* List of space points in this track */ + Int_t fNHits; Int_t fNfree; /* Number of degrees of freedom */ - std::vector<THcDCHit*> fHits; /* List of hits for this track */ + struct Hit { + // This is the same structure as in THcSpacePoint. Can we not + // duplicate this? + THcDCHit* dchit; + Double_t distCorr; + Int_t lr; + }; + std::vector<Hit> fHits; /* List of hits for this track */ + //std::vector<THcDCHit*> fHits; /* List of hits for this track */ std::vector<Double_t> fCoords; /* Coordinate on each plane */ std::vector<Double_t> fResiduals; /* Residual on each plane */ std::vector<Double_t> fDoubleResiduals; /* Residual on each plane for single stub mode */ @@ -69,6 +81,8 @@ public: Double_t fXp_fp, fYp_fp; Double_t fChi2_fp; + virtual void AddHit(THcDCHit * hit, Double_t dist, Int_t lr); + private: // Hide copy ctor and op= THcDCTrack( const THcDCTrack& ); diff --git a/src/THcDriftChamber.cxx b/src/THcDriftChamber.cxx index 33c1b657184733f523def66a4e1ca725b3e11a4d..deef48f4d707af3964d8768df45a20789e56ba71 100644 --- a/src/THcDriftChamber.cxx +++ b/src/THcDriftChamber.cxx @@ -146,6 +146,7 @@ Int_t THcDriftChamber::ReadDatabase( const TDatime& date ) fMinHits = fParent->GetMinHits(fChamberNum); fMaxHits = fParent->GetMaxHits(fChamberNum); fMinCombos = fParent->GetMinCombos(fChamberNum); + fFixPropagationCorrection = fParent->GetFixPropagationCorrectionFlag(); if (fDebugDriftCh) cout << "Chamber " << fChamberNum << " Min/Max: " << fMinHits << "/" << fMaxHits << endl; fSpacePointCriterion = fParent->GetSpacePointCriterion(fChamberNum); @@ -919,13 +920,29 @@ void THcDriftChamber::CorrectHitTimes() // Fortran ENGINE does not do this check, so hits can get "corrected" // multiple times if they belong to multiple space points. // To reproduce the precise ENGINE behavior, remove this if condition. - //if(! hit->GetCorrectedStatus()) { + if(fFixPropagationCorrection==0) { // ENGINE behavior hit->SetTime(hit->GetTime() - plane->GetCentralTime() + plane->GetDriftTimeSign()*time_corr); hit->ConvertTimeToDist(); - //if (fDebugDriftCh) cout << ihit+1 << " " << plane->GetPlaneNum() << " " << plane->GetChamberNum() << " " << hit->GetTime() << " " << hit->GetDist() << " " << plane->GetCentralTime() << " " << plane->GetDriftTimeSign() << " " << time_corr << endl; - hit->SetCorrectedStatus(1); - //} + // hit->SetCorrectedStatus(1); + } else { + // New behavior: Save corrected distance with the hit in the space point + // so that the same hit can have a different correction depending on + // which space point it is in. + // + // This is a hack now because the converttimetodist method is connected to the hit + // so I compute the corrected time and distance, and then restore the original + // time and distance. Can probably add a method to hit that does a conversion on a time + // but does not modify the hit data. + Double_t time=hit->GetTime(); + Double_t dist=hit->GetDist(); + hit->SetTime(time - plane->GetCentralTime() + + plane->GetDriftTimeSign()*time_corr); + hit->ConvertTimeToDist(); + sp->SetHitDist(ihit, hit->GetDist()); + hit->SetTime(time); // Restore time + hit->SetDist(dist); // Restore distance + } } } } @@ -1022,7 +1039,7 @@ void THcDriftChamber::LeftRight() } } if (nplaneshit >= fNPlanes-1) { - Double_t chi2 = FindStub(nhits, sp->GetHitVectorP(), + Double_t chi2 = FindStub(nhits, sp, plane_list, bitpat, plusminus, stub); //if(debugging) @@ -1059,7 +1076,7 @@ void THcDriftChamber::LeftRight() } } } else if (nplaneshit >= fNPlanes-2) { // Two planes missing - Double_t chi2 = FindStub(nhits, sp->GetHitVectorP(), + Double_t chi2 = FindStub(nhits, sp, plane_list, bitpat, plusminus, stub); //if(debugging) //if (fDebugDriftCh) cout << "pmloop=" << pmloop << " Chi2=" << chi2 << endl; @@ -1100,7 +1117,10 @@ void THcDriftChamber::LeftRight() // Calculate final coordinate based on plusminusbest // Update the hit positions in the space points for(Int_t ihit=0; ihit<nhits; ihit++) { + // Save left/right status with the hit and in the space point + // In THcDC will decide which to used based on fix_lr flag sp->GetHit(ihit)->SetLeftRight(plusminusbest[ihit]); + sp->SetHitLR(ihit, plusminusbest[ihit]); } // Stubs are calculated in rotated coordinate system @@ -1129,7 +1149,7 @@ void THcDriftChamber::LeftRight() } // if(fAA3Inv.find(bitpat) != fAAInv.end()) { // Valid hit combination //_____________________________________________________________________________ -Double_t THcDriftChamber::FindStub(Int_t nhits, const std::vector<THcDCHit*>* hits, +Double_t THcDriftChamber::FindStub(Int_t nhits, THcSpacePoint *sp, Int_t* plane_list, UInt_t bitpat, Int_t* plusminus, Double_t* stub) { @@ -1141,7 +1161,8 @@ Double_t THcDriftChamber::FindStub(Int_t nhits, const std::vector<THcDCHit*>* hi // This isn't right. dpos only goes up to 2. for(Int_t ihit=0;ihit<nhits; ihit++) { - dpos[ihit] = (*hits)[ihit]->GetPos() + plusminus[ihit]*(*hits)[ihit]->GetDist() + dpos[ihit] = sp->GetHit(ihit)->GetPos() + + plusminus[ihit]*sp->GetHit(ihit)->GetDist() - fPsi0[plane_list[ihit]]; for(Int_t index=0;index<3;index++) { TT[index]+= dpos[ihit]*fStubCoefs[plane_list[ihit]][index] diff --git a/src/THcDriftChamber.h b/src/THcDriftChamber.h index c6f57c24fb86e878edb8c24d11b21737833913ef..d71b94874578832b011541d731528b4e0ee615bb 100644 --- a/src/THcDriftChamber.h +++ b/src/THcDriftChamber.h @@ -22,6 +22,7 @@ //class THaScCalib; class TClonesArray; +class THcSpacePoint; class THcDriftChamber : public THaSubDetector { @@ -78,6 +79,7 @@ protected: Double_t fWireVelocity; Int_t fSmallAngleApprox; Double_t fStubMaxXPDiff; + Int_t fFixPropagationCorrection; Double_t fXCenter; Double_t fYCenter; @@ -108,7 +110,7 @@ protected: void ChooseSingleHit(void); void SelectSpacePoints(void); UInt_t Count1Bits(UInt_t x); - Double_t FindStub(Int_t nhits, const std::vector<THcDCHit*>* hits, + Double_t FindStub(Int_t nhits, THcSpacePoint *sp, Int_t* plane_list, UInt_t bitpat, Int_t* plusminus, Double_t* stub); diff --git a/src/THcSpacePoint.h b/src/THcSpacePoint.h index 4122cb7a62e71a30fdc301518d57b77cc99e4ffc..04307e11f64a7155eef06f6f2a64162d3072e0ab 100644 --- a/src/THcSpacePoint.h +++ b/src/THcSpacePoint.h @@ -20,24 +20,49 @@ public: } virtual ~THcSpacePoint() {} + struct Hit { + THcDCHit* dchit; + Double_t distCorr; // Drift distance corrected by propagation along wire + Int_t lr; // Left right flag (+/- 1) + // Should we copy into here the information from hit + // this is likely to be often used? + }; + void SetXY(Double_t x, Double_t y) {fX = x; fY = y;}; void Clear(Option_t* opt="") {fNHits=0; fNCombos=0; fHits.clear();}; void AddHit(THcDCHit* hit) { - fHits.push_back(hit); + Hit newhit; + newhit.dchit = hit; + newhit.distCorr = 0.0; + newhit.lr = 0; + fHits.push_back(newhit); fNHits++; } Int_t GetNHits() {return fNHits;}; void SetNHits(Int_t nhits) {fNHits = nhits;}; Double_t GetX() {return fX;}; Double_t GetY() {return fY;}; - THcDCHit* GetHit(Int_t ihit) {return fHits[ihit];}; - std::vector<THcDCHit*>* GetHitVectorP() {return &fHits;}; - void ReplaceHit(Int_t ihit, THcDCHit *hit) {fHits[ihit] = hit;}; + THcDCHit* GetHit(Int_t ihit) {return fHits[ihit].dchit;}; + // std::vector<THcDCHit*>* GetHitVectorP() {return &fHits;}; + //std::vector<Hit>* GetHitStuffVectorP() {return &fHits;}; + void ReplaceHit(Int_t ihit, THcDCHit *hit) { + fHits[ihit].dchit = hit; + fHits[ihit].distCorr = 0.0; + fHits[ihit].lr = 0; + }; + void SetHitDist(Int_t ihit, Double_t dist) { + fHits[ihit].distCorr = dist; + }; + void SetHitLR(Int_t ihit, Int_t lr) { + fHits[ihit].lr = lr; + }; void SetStub(Double_t stub[4]) { for(Int_t i=0;i<4;i++) { fStub[i] = stub[i]; } }; + Double_t GetHitDist(Int_t ihit) { return fHits[ihit].distCorr; }; + Int_t GetHitLR(Int_t ihit) { return fHits[ihit].lr; }; Double_t* GetStubP() { return fStub; }; void IncCombos() { fNCombos++; }; void SetCombos(Int_t ncombos) { fNCombos=ncombos; }; @@ -53,7 +78,9 @@ public: Double_t fY; Int_t fNHits; Int_t fNCombos; - std::vector<THcDCHit*> fHits; + // This adds more indirection to getting hit information. + std::vector<Hit> fHits; + //std::vector<THcDCHit*> fHits; Double_t fStub[4]; // Should we also have a pointer back to the chamber object