17 #include <JANA/JApplication.h>
18 #include <JANA/JEventLoop.h>
25 #include <PID/DParticle.h>
54 target.origin.SetXYZ(0.0, 0.0, 65.0);
55 target.sdir.SetXYZ(1.0, 0.0, 0.0);
56 target.tdir.SetXYZ(0.0, 1.0, 0.0);
57 target.udir.SetXYZ(0.0, 0.0, 1.0);
60 pthread_mutex_init(&mutex, NULL);
84 TDirectory *
dir = (TDirectory*)gROOT->FindObject(
"TRACKING");
85 if(!dir)dir =
new TDirectoryFile(
"TRACKING",
"TRACKING");
88 cdchits =
new TTree(
"cdchit",
"CDC hits");
89 cdchits->Branch(
"cdchit",
"dchit",&cdchit_ptr);
91 fdchits =
new TTree(
"fdchit",
"FDC hits");
92 fdchits->Branch(
"fdchit",
"dchit",&fdchit_ptr);
94 ttrack =
new TTree(
"track",
"Track");
95 ttrack->Branch(
"track",
"trackpar",&trk_ptr);
109 _DBG_<<
"Cannot get DApplication from JEventLoop! (are you using a JApplication based program perhaps?)"<<endl;
110 return RESOURCE_UNAVAILABLE;
136 sprintf(str,
"%3.4f%%", 100.0*(
double)NLRbad/(
double)(NLRbad+NLRgood));
138 cout<<endl<<setprecision(4);
139 cout<<
" NLRgood: "<<NLRgood<<endl;
140 cout<<
" NLRbad: "<<NLRbad<<endl;
141 cout<<
" NLRfit==0: "<<NLRfit_unknown<<endl;
142 cout<<
"Percentage bad: "<<str<<endl;
143 cout<<
" Nevents: "<<
Nevents<<endl;
154 vector<const DTrackCandidate*> candidates;
155 vector<const DMCThrown*> mcthrowns;
156 vector<const DMCTrackHit*> mctrackhits;
158 loop->Get(candidates);
159 loop->Get(mcthrowns);
160 loop->Get(mctrackhits);
165 if(mcthrowns.size() !=1 || candidates.size()<1 ){
167 _DBG_<<
" mcthrowns.size()="<<mcthrowns.size()<<
" candidates.size()="<<candidates.size()<<endl;
169 if(Nwarnings==10)
_DBG_<<
"Last warning!!"<<endl;
180 for(
unsigned int i=0; i<candidates.size(); i++){
181 TVector3 mom(candidates[i]->momentum().
X(), candidates[i]->momentum().Y(), candidates[i]->momentum().Z());
183 if(mom.Mag()<1.0E-9)
continue;
187 double cos_phi = mom.Dot(mc_mom)/mom.Mag()/mc_mom.Mag();
188 if(cos_phi>1.)cos_phi=1.0;
189 if(cos_phi<-1.)cos_phi=-1.0;
191 double delta_pt = (mom.Pt()-mc_mom.Pt())/mc_mom.Pt();
192 double delta_theta = (mom.Theta() - mc_mom.Theta())*1000.0;
193 double delta_phi = acos(cos_phi)*1000.0;
194 double chisq = pow(delta_pt/0.04, 2.0) + pow(delta_theta/20.0, 2.0) + pow(delta_phi/20.0, 2.0);
198 recon = candidates[i];
203 vector<const DCDCTrackHit *> cdctrackhits;
204 vector<const DFDCPseudo *> fdcpseudohits;
205 recon->Get(cdctrackhits);
206 recon->Get(fdcpseudohits);
213 if(!rt)
return NOERROR;
216 japp->RootWriteLock();
219 int NLRcorrect_this_track = 0;
220 int NLRincorrect_this_track = 0;
221 for(
unsigned int i=0; i<cdctrackhits.size(); i++){
229 hit_info.
FindLR(mctrackhits);
230 cdchit.eventnumber = eventnumber;
232 cdchit.layer = cdctrackhit->
wire->
ring;
233 cdchit.t = cdctrackhit->
tdrift;
234 cdchit.tof = hit_info.
tof;
235 cdchit.doca = hit_info.
doca;
236 cdchit.resi = hit_info.
dist - hit_info.
doca;
238 cdchit.u_pseudo = 0.0;
239 cdchit.u_lorentz = 0.0;
241 cdchit.trk_chisq = recon->
chisq;
242 cdchit.trk_Ndof = recon->
Ndof;
244 cdchit.LRfit = hit_info.
LRfit;
245 cdchit.pos_doca = hit_info.
pos_doca;
246 cdchit.pos_wire = hit_info.
pos_wire;
251 if(cdchit.LRis_correct){
252 NLRcorrect_this_track++;
255 NLRincorrect_this_track++;
266 for(
unsigned int i=0; i<fdcpseudohits.size(); i++){
267 const DFDCPseudo *fdcpseudohit = fdcpseudohits[i];
279 hit_info.
FindLR(mctrackhits, lorentz_def);
281 fdchit.eventnumber = eventnumber;
282 fdchit.wire = fdcpseudohit->
wire->
wire;
283 fdchit.layer = fdcpseudohit->
wire->
layer;
284 fdchit.t = fdcpseudohit->
time;
285 fdchit.tof = hit_info.
tof;
286 fdchit.doca = hit_info.
doca;
287 fdchit.resi = hit_info.
dist - hit_info.
doca;
288 fdchit.u = hit_info.
u;
289 fdchit.u_pseudo = fdcpseudohit->
s;
291 fdchit.resic = hit_info.
u - (fdcpseudohit->
s + hit_info.
u_lorentz) ;
292 fdchit.trk_chisq = recon->
chisq;
293 fdchit.trk_Ndof = recon->
Ndof;
295 fdchit.LRfit = hit_info.
LRfit;
296 fdchit.pos_doca = hit_info.
pos_doca;
297 fdchit.pos_wire = hit_info.
pos_wire;
302 if(fdchit.LRis_correct){
303 NLRcorrect_this_track++;
306 NLRincorrect_this_track++;
316 double doca_tgt = rt->
DistToRT(&target);
318 TVector3 tgt_doca(tmp.X(), tmp.Y(), tmp.Z());
321 trk.eventnumber = eventnumber;
324 trk.z_thrown = thrown->
position().Z();
325 trk.z_fit = tgt_doca.Z();
326 trk.z_can = candidate->
position().Z();
327 trk.r_fit = doca_tgt;
328 trk.NLRcorrect = NLRcorrect_this_track;
329 trk.NLRincorrect = NLRincorrect_this_track;
359 TVector3 udir(wire->udir.X(), wire->udir.Y(), wire->udir.Z());
360 TVector3 origin(wire->origin.X(), wire->origin.Y(), wire->origin.Z());
363 doca = rt->DistToRT(wire, &s);
365 rt->GetLastDOCAPoint(tmp1, tmp2);
366 TVector3 pos_doca(tmp1.X(), tmp1.Y(), tmp1.Z());
367 TVector3 mom_doca(tmp2.X(), tmp2.Y(), tmp2.Z());
369 TVector3 shift = udir.Cross(mom_doca);
370 u = rt->GetLastDistAlongWire();
371 pos_wire = origin +
u*udir;
374 double mass = 0.13957;
375 double beta = 1.0/
sqrt(1.0 + pow(mass/mom_doca.Mag(), 2.0))*2.998E10;
377 dist = (tdrift - tof)*55E-4;
381 TVector3 shift = udir.Cross(mom_doca);
383 double LRsign = shift.Dot(pos_doca-pos_wire)<0.0 ? +1.0:-1.0;
384 double alpha = mom_doca.Angle(TVector3(0,0,1));
395 LRis_correct =
false;
397 TVector3 pos_truth(mctrackhit->
r*cos(mctrackhit->
phi), mctrackhit->
r*
sin(mctrackhit->
phi), mctrackhit->
z);
398 TVector3 pos_diff_truth = pos_truth-pos_wire;
399 TVector3 pos_diff_traj = pos_doca-pos_wire;
401 LRfit = shift.Dot(pos_diff_traj)<0.0 ? -1:1;
402 LRis_correct = pos_diff_truth.Dot(pos_diff_traj)>0.0;
jerror_t init(void)
Invoked via DEventProcessor virtual method.
void FindLR(vector< const DMCTrackHit * > &mctrackhits, const DLorentzDeflections *lorentz_def=NULL)
jerror_t erun(void)
Invoked via DEventProcessor virtual method.
DEventProcessor_candidate_tree()
sprintf(text,"Post KinFit Cut")
DMagneticFieldMap * GetBfield(unsigned int run_number=1)
DVector3 GetLastDOCAPoint(void) const
const DVector3 & position(void) const
void Swim(const DVector3 &pos, const DVector3 &mom, double q=-1000.0, const TMatrixFSym *cov=NULL, double smax=2000.0, const DCoordinateSystem *wire=NULL)
const DFDCWire * wire
DFDCWire for this wire.
DLorentzDeflections * GetLorentzDeflections(unsigned int run_number=1)
class DFDCPseudo: definition for a reconstructed point in the FDC
jerror_t fini(void)
Invoked via DEventProcessor virtual method.
static const DMCTrackHit * GetMCTrackHit(const DCoordinateSystem *wire, double rdrift, vector< const DMCTrackHit * > &mctrackhits, int trackno_filter=-1)
jerror_t brun(JEventLoop *loop, int32_t runnumber)
double DistToRT(double x, double y, double z) const
float z
coordinates of hit in cm and rad
double s
< wire position computed from cathode data, assuming the avalanche occurs at the wire ...
double charge(void) const
<A href="index.html#legend"> <IMG src="CORE.png" width="100"> </A>
double time
time corresponding to this pseudopoint.
jerror_t evnt(JEventLoop *loop, uint64_t eventnumber)
Invoked via DEventProcessor virtual method.
double GetLorentzCorrection(double x, double y, double z, double alpha, double dx) const
float chisq
Chi-squared for the track (not chisq/dof!)
const DVector3 & momentum(void) const
int Ndof
Number of degrees of freedom in the fit.
~DEventProcessor_candidate_tree()
DReferenceTrajectory * rt
const DCoordinateSystem * wire