55 _DBG_<<
"Cannot get DApplication from JEventLoop! (are you using a JApplication based program?)"<<endl;
56 return RESOURCE_UNAVAILABLE;
62 vector<const DTrackFitter *> locTrackFitters;
63 eventLoop->Get(locTrackFitters);
64 if(locTrackFitters.size()<1){
65 _DBG_<<
"Unable to get a DTrackFitter object! NO Charged track fitting will be done!"<<endl;
66 return RESOURCE_UNAVAILABLE;
72 _DBG_<<
"Unable to get a DTrackFitter object! NO Charged track fitting will be done!"<<endl;
73 return RESOURCE_UNAVAILABLE;
77 double rho_Z_over_A_LnI, radlen;
90 unsigned int loc_i, loc_j;
91 DVector3 locLabHitPosition, locLabHitPosition_Truth, locGeneratedVertex;
93 vector<const DMCThrown*> locDMCThrownVector;
95 loop->Get(locDMCThrownVector);
99 vector<const DBCALShower*> locBCALShowerVector;
101 float locDeltaR, locDeltaZ, locDeltaPhi, locDeltaE, locDeltaT;
102 float locTrueR, locTrueZ, locTruePhi, locTrueE, locTrueT;
103 float locTrueTheta, locPathLength, locPathLengthCorrection, locSurfaceR, locVelocity;
104 float locActualPathLength, locActualTheta, locActualPathLengthCorrection;
107 loop->Get(locBCALShowerVector,
"KLOE");
115 if(locBCALShowerVector.size() > 1)
118 for(loc_i = 0; loc_i < locBCALShowerVector.size(); loc_i++){
119 locBCALShower = locBCALShowerVector[loc_i];
120 locLabHitPosition.SetXYZ(locBCALShower->
x, locBCALShower->
y, locBCALShower->
z);
125 for(loc_j = 0; loc_j < locDMCThrownVector.size(); loc_j++){
126 locDMCThrown = locDMCThrownVector[loc_j];
129 locTrueE = locDMCThrown->
energy();
130 locGeneratedVertex = locDMCThrown->
position();
135 locTrueTheta = locDMCThrown->
momentum().Theta();
136 locPathLength = locSurfaceR/
sin(locTrueTheta) + locPathLengthCorrection;
137 locTrueZ = locGeneratedVertex.Z() + locPathLength*cos(locTrueTheta);
139 locPathLength = locSurfaceR/
sin(locTrueTheta) + locPathLengthCorrection;
140 locTrueZ = locGeneratedVertex.Z() + locPathLength*cos(locTrueTheta);
142 locTrueR = locPathLength*
sin(locTrueTheta);
143 locVelocity = 29.9792458;
144 locTrueT = 0.0 + locPathLength/locVelocity;
145 locTruePhi = locDMCThrown->
momentum().Phi();
151 locActualPathVector = locLabHitPosition - locGeneratedVertex;
152 locActualPathLength = locActualPathVector.Mag();
153 locActualTheta = locActualPathVector.Theta();
154 locActualPathLengthCorrection = locActualPathLength - locSurfaceR/
sin(locTrueTheta);
157 locDeltaR = locLabHitPosition.Perp() - locTrueR;
158 locDeltaPhi = locLabHitPosition.Phi() - locTruePhi;
159 locDeltaZ = locLabHitPosition.Z() - locTrueZ;
160 locDeltaE = locBCALShower->
E - locTrueE;
161 locDeltaT = locBCALShower->
t - locTrueT;
164 japp->RootWriteLock();
194 vector<const DFCALShower*> locFCALShowerVector;
196 float locDeltaX, locDeltaY, locDeltaZ, locDeltaE, locDeltaT;
197 float locTrueX, locTrueY, locTrueZ, locTrueE, locTrueT;
198 float locPathLength, locPathLengthCorrection, locTrueTheta, locTruePhi, locVelocity;
199 float locActualPathLength, locActualTheta, locActualPathLengthCorrection;
200 DVector3 locActualPathVector, locShowerHitPositionUncertainty;
202 loop->Get(locFCALShowerVector);
203 float locSurfaceZ = 625.0;
206 if(locFCALShowerVector.size() > 1)
209 for(loc_i = 0; loc_i < locFCALShowerVector.size(); loc_i++){
210 locFCALShower = locFCALShowerVector[loc_i];
214 for(loc_j = 0; loc_j < locDMCThrownVector.size(); loc_j++){
215 locDMCThrown = locDMCThrownVector[loc_j];
218 locTrueE = locDMCThrown->
energy();
219 locTrueTheta = locDMCThrown->
momentum().Theta();
220 locGeneratedVertex = locDMCThrown->
position();
221 locVelocity = 29.9792458;
222 locTruePhi = locDMCThrown->
momentum().Phi();
225 locPathLength = (locSurfaceZ - locGeneratedVertex.Z())/cos(locTrueTheta) + locPathLengthCorrection;
226 locTrueX = locGeneratedVertex.X() + locPathLength*
sin(locTrueTheta)*cos(locTruePhi);
227 locTrueY = locGeneratedVertex.Y() + locPathLength*
sin(locTrueTheta)*
sin(locTruePhi);
228 locTrueZ = locGeneratedVertex.Z() + locPathLength*cos(locTrueTheta);
229 locTrueT = 0.0 + locPathLength/locVelocity;
234 locActualPathVector = locLabHitPosition - locGeneratedVertex;
235 locActualPathLength = locActualPathVector.Mag();
236 locActualTheta = locActualPathVector.Theta();
237 locActualPathLengthCorrection = locActualPathLength - (locSurfaceZ - locGeneratedVertex.Z())/cos(locTrueTheta);
240 locDeltaX = locLabHitPosition.X() - locTrueX;
241 locDeltaY = locLabHitPosition.Y() - locTrueY;
242 locDeltaZ = locLabHitPosition.Z() - locTrueZ;
243 locDeltaE = locFCALShower->
getEnergy() - locTrueE;
244 locDeltaT = locFCALShower->
getTime() - locTrueT;
247 japp->RootWriteLock();
279 vector<const DTOFPoint*> locTOFPointVector;
280 vector<const DTOFTruth*> locTOFTruthVector;
281 vector<const DTOFHit*> locTOFHitVector;
286 float locDeltaX, locDeltaY, locDeltaZ, locDeltadE, locDeltaT;
287 float locTheta, locPhi, locVelocity, locDeltaPathLength, locBeta;
288 float locTrueX, locTrueY, locTrueZ, locTrueT, locTruedE, locTrueBetaGamma;
291 bool locVerticalPlaneFlag, locHorizontalPlaneFlag;
293 loop->Get(locTOFPointVector);
294 loop->Get(locTOFTruthVector);
296 if((locTOFTruthVector.size() == 1) && (locTOFPointVector.size() == 1)){
297 locTOFTruth = locTOFTruthVector[0];
298 locLabHitPosition_Truth.SetXYZ(locTOFTruth->
x, locTOFTruth->
y, locTOFTruth->
z);
300 locTOFPoint = locTOFPointVector[0];
301 locLabHitPosition = locTOFPoint->
pos;
302 locDeltaZ = locLabHitPosition.Z() - locTOFTruth->
z;
303 locTrueMomentum.SetXYZ(locTOFTruth->
px, locTOFTruth->
py, locTOFTruth->
pz);
304 locBeta = locTrueMomentum.Mag()/locTOFTruth->
E;
305 locTrueBetaGamma = locBeta/
sqrt(1.0 - locBeta*locBeta);
306 locDeltaPathLength = locDeltaZ/cos(locTheta);
307 locTheta = locTrueMomentum.Theta();
308 locPhi = locTrueMomentum.Phi();
310 locTrueX = locTOFTruth->
x + locDeltaPathLength*
sin(locTheta)*cos(locPhi);
311 locTrueY = locTOFTruth->
y + locDeltaPathLength*
sin(locTheta)*
sin(locPhi);
312 locTrueZ = locLabHitPosition.Z();
313 locVelocity = 29.9792458*locTrueMomentum.Mag()/locTOFTruth->
E;
314 locTrueT = locTOFTruth->
t + locDeltaPathLength/locVelocity;
315 locParticleType = locTOFTruth->
ptype;
318 locDeltaX = locLabHitPosition.X() - locTrueX;
319 locDeltaY = locLabHitPosition.Y() - locTrueY;
320 locDeltaZ = locLabHitPosition.Z() - locTrueZ;
325 locDeltadE = locTOFPoint->
dE - locTruedE;
326 locDeltaT = locTOFPoint->
t - locTrueT;
329 locTOFPoint->GetT(locTOFHitVector);
330 locVerticalPlaneFlag =
false;
331 locHorizontalPlaneFlag =
false;
332 for(loc_i = 0; loc_i < locTOFHitVector.size(); loc_i++){
333 locTOFHit = locTOFHitVector[loc_i];
334 if(!((locTOFHit->meantime >= 0.0) || (locTOFHit->meantime <= 0.0)))
336 if(locTOFHit->orientation)
337 locHorizontalPlaneFlag =
true;
338 else{locVerticalPlaneFlag =
true;}
342 japp->RootWriteLock();
387 locLabVertex.SetXYZ(locBCALR*cos(locBCALPhi), locBCALR*
sin(locBCALPhi), locBCALZ);
392 locBCALR = locLabVertex.Perp();
393 locBCALPhi = locLabVertex.Phi();
394 locBCALZ = locLabVertex.Z();
398 float locPaddleThickness = 2.54;
399 double locPathLength = locPaddleThickness/cos(locMomentum.Theta());
401 double locdE, locdEdx;
409 double betagamma=p/mass;
410 double beta2=1./(1.+1./betagamma/betagamma);
411 if (beta2<1
e-6) beta2=1
e-6;
420 double locX0 = 0.1464;
421 double locX1 = 2.4855;
422 double locC = -3.1997;
423 double locA = 0.16101;
424 double locM = 3.2393;
425 double locX = log10(betagamma);
429 else if(locX < locX1)
430 locDelta = 4.6052*locX + locC + locA*pow(locX1 - locX, locM);
432 locDelta = 4.6052*locX + locC;
440 dE = locdETerm*(log(locdETerm) - log((1.-beta2)/2./Me/beta2) - 2.*
dLnI - beta2 + 0.200 - locDelta);
452 if(locEnergy >= 1.0){
453 TF1 locFunction(
"df_BCAL_DepthCorrection",
"[0] + [1]*x + [2]*exp([3]*x)", 0.0, 9.0);
454 locFunction.SetParameters(9.95659, 0.142382, -2.9869, -0.56881);
455 return locFunction.Eval(locEnergy);
457 TF1 locFunction(
"df_BCAL_DepthCorrection_LowE",
"[0] + [1]*x + [2]*x*x", 0.0, 1.0);
458 locFunction.SetParameters(4.89141, 5.98362, -2.56308);
459 return locFunction.Eval(locEnergy);
464 TF1 locFunction(
"df_BCAL_DepthCorrection_LowZ",
"[0] + [1]*x + [2]*x*x", 0.0, 1.0);
465 locFunction.SetParameters(-31.4058, 2.40814, -0.0453179);
466 return locFunction.Eval(locZ);
467 }
else if(locZ > 389.0){
468 TF1 locFunction(
"df_BCAL_DepthCorrection_HighZ",
"[0] + [1]*x + [2]*x*x", 0.0, 1.0);
469 locFunction.SetParameters(-1994.66, 10.2362, -0.0131332);
470 return locFunction.Eval(locZ);
476 if(locEnergy >= 1.0){
477 TF1 locFunction(
"df_FCAL_DepthCorrection_HighE",
"[0] + [1]*x + [2]*exp([3]*x)", 1.0, 9.0);
478 locFunction.SetParameters(17.1957, 0.383558, -6.9412, -0.598059);
479 return locFunction.Eval(locEnergy);
481 TF1 locFunction(
"df_FCAL_DepthCorrection_LowE",
"[0] + [1]*x + [2]*x*x", 0.0, 1.0);
482 locFunction.SetParameters(6.83752, 12.0934, -5.24968);
483 return locFunction.Eval(locEnergy);
void Convert_Coordinates_LabToBCAL(const DVector3 &locLabVertex, float &locBCALR, float &locBCALPhi, float &locBCALZ)
const DRootGeom * dRootGeom
struct VolMat FindMat(double *x)
float dShowerUncertaintyY
The DTrackFitter class is a base class for different charged track fitting algorithms. It does not actually fit the track itself, but provides the interface and some common support features most algorthims will need to implement.
double energy(void) const
float dShowerUncertaintyY
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
const DVector3 & position(void) const
jerror_t brun(JEventLoop *eventLoop, int32_t runnumber)
Called everytime a new run number is detected.
TTree * dPluginTree_TOFMCComparison
void Convert_Coordinates_BCALToLab(float locBCALR, float locBCALPhi, float locBCALZ, DVector3 &locLabVertex)
TTree * dPluginTree_BCALMCComparison
float dShowerUncertaintyT
jerror_t evnt(JEventLoop *eventLoop, uint64_t eventnumber)
Called every event.
float dShowerUncertaintyX
DRootGeom * GetRootGeom(unsigned int run_number)
void Calc_MostProbableTOFdEdx(double p, double mass, double dx, double &dE, double &dEdx)
float Calc_BCALPathLengthCorrectionZPostE(float locZ)
jerror_t fini(void)
Called after last event of last event source has been processed.
float dShowerUncertaintyT
TOFMCComparison * dTOFMCComparison
float dShowerUncertaintyZ
bool dHorizontalPlaneFlag
double Calc_MostProbableTOFdE(const DVector3 &locMomentum, double mass)
jerror_t init(void)
Called once at program start.
static double ParticleMass(Particle_t p)
DTrackFitter * dTrackFitter
float dShowerUncertaintyZ
const DVector3 & momentum(void) const
FCALMCComparison * dFCALMCComparison
TTree * dPluginTree_FCALMCComparison
float Calc_BCALPathLengthCorrection(float locEnergy)
float dPathLengthCorrection
float dShowerUncertaintyE
DVector3 getPositionError() const
File: DTOFHit.h Created: Tue Jan 18 16:15:26 EST 2011 Creator: B. Zihlmann Purpose: Container class t...
float dShowerUncertaintyX
int type
GEANT particle ID.
DVector3 getPosition() const
BCALMCComparison * dBCALMCComparison
float dShowerUncertaintyE
float Calc_FCALPathLengthCorrection(float locEnergy)
float dPathLengthCorrection