00001
00009
00010
00011
00012 #include "ValBase.h"
00013
00014 #include "GaudiKernel/MsgStream.h"
00015 #include "GaudiKernel/IDataProviderSvc.h"
00016 #include "GaudiKernel/SmartDataPtr.h"
00017 #include "GaudiKernel/AlgTool.h"
00018 #include "GaudiKernel/ToolFactory.h"
00019 #include "GaudiKernel/IToolSvc.h"
00020
00021 #include "Event/TopLevel/EventModel.h"
00022 #include "Event/TopLevel/Event.h"
00023
00024 #include "GlastSvc/GlastDetSvc/IGlastDetSvc.h"
00025
00026 #include "Event/Recon/TkrRecon/TkrTrack.h"
00027 #include "Event/Recon/TkrRecon/TkrVertex.h"
00028
00029 #include "Doca.h"
00030
00031 namespace {
00032 double erf(double x) {
00033 double t = 1./(1.+.47047*x);
00034 double results = 1. -(.34802 - (.09587 -.74785*t)*t)*t*exp(-x*x);
00035 return results;
00036 }
00037 double thrshold(double x) {
00038 if(x < 0) return (.5*(1. + erf(-x)));
00039 else return (.5*(1. - erf( x)));
00040 }
00041
00042 }
00043
00050 class VtxValsTool : public ValBase
00051 {
00052 public:
00053
00054 VtxValsTool( const std::string& type,
00055 const std::string& name,
00056 const IInterface* parent);
00057
00058 virtual ~VtxValsTool() { }
00059
00060 StatusCode initialize();
00061
00062 StatusCode calculate();
00063
00064 private:
00065
00066
00067 int VTX_numVertices;
00068 float VTX_xdir;
00069 float VTX_ydir;
00070 float VTX_zdir;
00071 float VTX_Phi;
00072 float VTX_Theta;
00073 float VTX_Sxx;
00074 float VTX_Sxy;
00075 float VTX_Syy;
00076 float VTX_ThetaErr;
00077 float VTX_PhiErr;
00078
00079
00080 float VTX_x0;
00081 float VTX_y0;
00082 float VTX_z0;
00083 float VTX_Angle;
00084 float VTX_DOCA;
00085 float VTX_Head_Sep;
00086
00087 float VTX_S1;
00088 float VTX_S2;
00089
00090 float VTX_Quality;
00091 float VTX_Chisq;
00092 float VTX_AddedRL;
00093 float VTX_Status;
00094
00095 float VTX2_transDoca;
00096 float VTX2_longDoca;
00097
00098 float VTX2_xdir;
00099 float VTX2_ydir;
00100 float VTX2_zdir;
00101 float VTX2_Phi;
00102 float VTX2_Theta;
00103 float VTX2_x0;
00104 float VTX2_y0;
00105 float VTX2_z0;
00106 float VTX2_Angle;
00107 float VTX2_DOCA;
00108 float VTX2_Head_Sep;
00109 float VTX2_Status;
00110
00111 float VTXN_xdir;
00112 float VTXN_ydir;
00113 float VTXN_zdir;
00114
00115 float VTXN_Sxx;
00116 float VTXN_Sxy;
00117 float VTXN_Syy;
00118 float VTXN_ChgWt;
00119 float VTXN_NeutWt;
00120
00121 float VTXN1_xdir;
00122 float VTXN1_ydir;
00123 float VTXN1_zdir;
00124
00125 float VTXN1_Sxx;
00126 float VTXN1_Sxy;
00127 float VTXN1_Syy;
00128 float VTXN1_ChgWt;
00129 float VTXN1_NeutWt;
00130 };
00131
00132
00133 static ToolFactory<VtxValsTool> s_factory;
00134 const IToolFactory& VtxValsToolFactory = s_factory;
00135
00136
00137 VtxValsTool::VtxValsTool(const std::string& type,
00138 const std::string& name,
00139 const IInterface* parent)
00140 : ValBase( type, name, parent )
00141 {
00142
00143 declareInterface<IValsTool>(this);
00144 }
00145
00236 StatusCode VtxValsTool::initialize()
00237 {
00238 StatusCode sc = StatusCode::SUCCESS;
00239
00240 MsgStream log(msgSvc(), name());
00241
00242 if( ValBase::initialize().isFailure()) return StatusCode::FAILURE;
00243
00244
00245
00246 if( serviceLocator() ) {
00247 } else {
00248 return StatusCode::FAILURE;
00249 }
00250
00251
00252
00253
00254 addItem("VtxNumVertices", &VTX_numVertices);
00255 addItem("VtxXDir", &VTX_xdir);
00256 addItem("VtxYDir", &VTX_ydir);
00257 addItem("VtxZDir", &VTX_zdir);
00258 addItem("VtxPhi", &VTX_Phi);
00259 addItem("VtxTheta", &VTX_Theta);
00260
00261 addItem("VtxThetaErr", &VTX_ThetaErr);
00262 addItem("VtxPhiErr", &VTX_PhiErr);
00263 addItem("VtxSXX", &VTX_Sxx);
00264 addItem("VtxSXY", &VTX_Sxy);
00265 addItem("VtxSYY", &VTX_Syy);
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278 addItem("VtxX0", &VTX_x0);
00279 addItem("VtxY0", &VTX_y0);
00280 addItem("VtxZ0", &VTX_z0);
00281
00282 addItem("VtxAngle", &VTX_Angle);
00283 addItem("VtxDOCA", &VTX_DOCA);
00284 addItem("VtxHeadSep", &VTX_Head_Sep);
00285 addItem("VtxStatus", &VTX_Status);
00286 addItem("VtxQuality", &VTX_Quality);
00287 addItem("VtxChisq", &VTX_Chisq);
00288
00289 addItem("VtxS1", &VTX_S1);
00290 addItem("VtxS2", &VTX_S2);
00291 addItem("VtxAddedRL", &VTX_AddedRL);
00292
00293 addItem("Vtx2TransDoca", &VTX2_transDoca);
00294 addItem("Vtx2LongDoca", &VTX2_longDoca);
00295
00296 addItem("Vtx2XDir", &VTX2_xdir);
00297 addItem("Vtx2YDir", &VTX2_ydir);
00298 addItem("Vtx2ZDir", &VTX2_zdir);
00299 addItem("Vtx2X0", &VTX2_x0);
00300 addItem("Vtx2Y0", &VTX2_y0);
00301 addItem("Vtx2Z0", &VTX2_z0);
00302
00303 addItem("Vtx2Angle", &VTX2_Angle);
00304 addItem("Vtx2DOCA", &VTX2_DOCA);
00305 addItem("Vtx2HeadSep", &VTX2_Head_Sep);
00306 addItem("Vtx2Status", &VTX2_Status);
00307
00308 addItem("VtxNeutXDir" , &VTXN_xdir);
00309 addItem("VtxNeutYDir" , &VTXN_ydir);
00310 addItem("VtxNeutZDir" , &VTXN_zdir);
00311 addItem("VtxNeutSXX", &VTXN_Sxx);
00312 addItem("VtxNeutSXY", &VTXN_Sxy);
00313 addItem("VtxNeutSYY", &VTXN_Syy);
00314 addItem("VtxNeutChgWt", &VTXN_ChgWt);
00315 addItem("VtxNeutNeutWt", &VTXN_NeutWt);
00316
00317 addItem("VtxNeut1XDir" , &VTXN1_xdir);
00318 addItem("VtxNeut1YDir" , &VTXN1_ydir);
00319 addItem("VtxNeut1ZDir" , &VTXN1_zdir);
00320 addItem("VtxNeut1SXX", &VTXN1_Sxx);
00321 addItem("VtxNeut1SXY", &VTXN1_Sxy);
00322 addItem("VtxNeut1SYY", &VTXN1_Syy);
00323 addItem("VtxNeut1ChgWt", &VTXN1_ChgWt);
00324 addItem("VtxNeut1NeutWt", &VTXN1_NeutWt);
00325
00326 zeroVals();
00327
00328 return sc;
00329 }
00330
00331
00332 StatusCode VtxValsTool::calculate()
00333 {
00334 StatusCode sc = StatusCode::SUCCESS;
00335
00336
00337 SmartDataPtr<Event::TkrTrackCol>
00338 pTracks(m_pEventSvc,EventModel::TkrRecon::TkrTrackCol);
00339 SmartDataPtr<Event::TkrVertexCol>
00340 pVerts(m_pEventSvc,EventModel::TkrRecon::TkrVertexCol);
00341
00342 if(!pVerts) return sc;
00343
00344 VTX_numVertices = (int) pVerts->size();
00345
00346
00347 Event::TkrVertexConPtr pVtxr = pVerts->begin();
00348 if(pVtxr == pVerts->end()) return sc;
00349
00350 Event::TkrVertex* gamma = *pVtxr++;
00351 SmartRefVector<Event::TkrTrack>::const_iterator pTrack1 = gamma->getTrackIterBegin();
00352 const Event::TkrTrack* track_1 = *pTrack1;
00353
00354 int nParticles = gamma->getNumTracks();
00355
00356 Point x0 = gamma->getPosition();
00357 Vector t0 = gamma->getDirection();
00358
00359 VTX_xdir = t0.x();
00360 VTX_ydir = t0.y();
00361 VTX_zdir = t0.z();
00362
00363 VTX_Phi = (-t0).phi();
00364 if (VTX_Phi<0.0f) VTX_Phi += static_cast<float>(2*M_PI);
00365 VTX_Theta = (-t0).theta();
00366
00367 const Event::TkrTrackParams& VTX_Cov = gamma->getVertexParams();
00368 VTX_Sxx = VTX_Cov.getxSlpxSlp();
00369 VTX_Sxy = VTX_Cov.getxSlpySlp();
00370 VTX_Syy = VTX_Cov.getySlpySlp();
00371 double sinPhi = sin(VTX_Phi);
00372 double cosPhi = cos(VTX_Phi);
00373 VTX_ThetaErr = t0.z()*t0.z()*sqrt(std::max(0.0, cosPhi*cosPhi*VTX_Sxx +
00374 2.*sinPhi*cosPhi*VTX_Sxy + sinPhi*sinPhi*VTX_Syy));
00375 VTX_PhiErr = (-t0.z())*sqrt(std::max(0.0, sinPhi*sinPhi*VTX_Sxx -
00376 2.*sinPhi*cosPhi*VTX_Sxy + cosPhi*cosPhi*VTX_Syy));
00377
00378
00379
00380
00381
00382 VTX_x0 = x0.x();
00383 VTX_y0 = x0.y();
00384 VTX_z0 = x0.z();
00385
00386 VTX_Status = gamma->getStatusBits();
00387
00388
00389 Point x1 = track_1->front()->getPoint(Event::TkrTrackHit::SMOOTHED);
00390 Vector t1 = track_1->front()->getDirection(Event::TkrTrackHit::SMOOTHED);
00391
00392
00393
00394
00395 double cost1t2, t1t2;
00396 Point x2H;
00397
00398 if(nParticles > 1) {
00399 pTrack1++;
00400 const Event::TkrTrack* track_2 = *pTrack1;
00401
00402 Point x2 = track_2->front()->getPoint(Event::TkrTrackHit::SMOOTHED);
00403 Vector t2 = track_2->front()->getDirection(Event::TkrTrackHit::SMOOTHED);
00404
00405 x2H = x2 + ((x1.z()-x2.z())/t2.z()) * t2;
00406
00407 VTX_Head_Sep = (x1-x2H).magnitude();
00408
00409 double cost1t2 = t1*t2;
00410 double t1t2 = acos(cost1t2);
00411 VTX_Angle = t1t2;
00412 VTX_DOCA = gamma->getDOCA();
00413 VTX_S1 = gamma->getTkr1ArcLen();
00414 VTX_S2 = gamma->getTkr2ArcLen();
00415
00416
00417 if(VTX_xdir == t1.x() && VTX_ydir == t1.y()) VTX_Angle = -.1f;
00418
00419 VTX_Quality = gamma->getQuality();
00420 VTX_Chisq = gamma->getChiSquare();
00421 VTX_AddedRL = gamma->getAddedRadLen();
00422 }
00423
00424 if(pVerts->size()>1) {
00425 Event::TkrVertex* vtx2 = *pVtxr++;
00426
00427 if(!(vtx2->getStatusBits()& Event::TkrVertex::NEUTRALVTX)) {
00428
00429 Point x2 = vtx2->getPosition();
00430 Vector t2 = vtx2->getDirection();
00431 VTX2_Status = vtx2->getStatusBits();
00432
00433 VTX2_xdir = t2.x();
00434 VTX2_ydir = t2.y();
00435 VTX2_zdir = t2.z();
00436
00437 VTX2_x0 = x2.x();
00438 VTX2_y0 = x2.y();
00439 VTX2_z0 = x2.z();
00440
00441 Doca vtx0(x0, t0);
00442 VTX2_transDoca = vtx0.docaOfPoint(x2);
00443 VTX2_longDoca = vtx0.arcLenRay1();
00444
00445 pTrack1 = vtx2->getTrackIterBegin();
00446 nParticles = vtx2->getNumTracks();
00447 const Event::TkrTrack* track_1a = *pTrack1;
00448
00449 Point x1 = track_1a->front()->getPoint(Event::TkrTrackHit::SMOOTHED);
00450 Vector t1 = track_1a->front()->getDirection(Event::TkrTrackHit::SMOOTHED);
00451 if(nParticles > 1) {
00452 pTrack1++;
00453 const Event::TkrTrack* track_2a = *pTrack1;
00454
00455 x2 = track_2a->front()->getPoint(Event::TkrTrackHit::SMOOTHED);
00456 t2 = track_2a->front()->getDirection(Event::TkrTrackHit::SMOOTHED);
00457
00458 x2H = x2 + ((x1.z()-x2.z())/t2.z()) * t2;
00459
00460 VTX2_Head_Sep = (x1-x2H).magnitude();
00461
00462 cost1t2 = t1*t2;
00463 t1t2 = acos(cost1t2);
00464 VTX2_Angle = t1t2;
00465 VTX2_DOCA = vtx2->getDOCA();
00466
00467
00468 if(VTX2_xdir == t1.x() && VTX2_ydir == t1.y()) VTX2_Angle = -.1f;
00469 }
00470 }}
00471
00472
00473 Event::TkrVertexConPtr pVtxN = pVerts->begin();
00474 Event::TkrVertex* vtxN;
00475 bool VTX_Set = false;
00476 for(; pVtxN != pVerts->end(); pVtxN++)
00477 {
00478 vtxN = *pVtxN;
00479 const Event::TkrTrackParams& VTXN_Cov = vtxN->getVertexParams();
00480 if(vtxN->getStatusBits()& Event::TkrVertex::NEUTRALVTX) {
00481 Vector tN = vtxN->getDirection();
00482 float chrg_wt = vtxN->getTkr1ArcLen();
00483 float neut_wt = vtxN->getTkr2ArcLen();
00484
00485 if(vtxN->getStatusBits()& Event::TkrVertex::ONETKRVTX){
00486 if(!VTX_Set) {
00487 VTXN_xdir = tN.x();
00488 VTXN_ydir = tN.y();
00489 VTXN_zdir = tN.z();
00490 VTXN_Sxx = VTXN_Cov.getxSlpxSlp();
00491 VTXN_Sxy = VTXN_Cov.getxSlpySlp();
00492 VTXN_Syy = VTXN_Cov.getySlpySlp();
00493 VTXN_ChgWt = chrg_wt;
00494 VTXN_NeutWt = neut_wt;
00495 VTX_Set = true;
00496 }
00497 VTXN1_xdir = tN.x();
00498 VTXN1_ydir = tN.y();
00499 VTXN1_zdir = tN.z();
00500 VTXN1_Sxx = VTXN_Cov.getxSlpxSlp();
00501 VTXN1_Sxy = VTXN_Cov.getxSlpySlp();
00502 VTXN1_Syy = VTXN_Cov.getySlpySlp();
00503 VTXN1_ChgWt = chrg_wt;
00504 VTXN1_NeutWt = neut_wt;
00505 } else {
00506 VTXN_xdir = tN.x();
00507 VTXN_ydir = tN.y();
00508 VTXN_zdir = tN.z();
00509 VTXN_Sxx = VTXN_Cov.getxSlpxSlp();
00510 VTXN_Sxy = VTXN_Cov.getxSlpySlp();
00511 VTXN_Syy = VTXN_Cov.getySlpySlp();
00512 VTXN_ChgWt = chrg_wt;
00513 VTXN_NeutWt = neut_wt;
00514 VTX_Set = true;
00515 } } }
00516
00517 return sc;
00518 }