Main Page | Namespace List | Class Hierarchy | Compound List | File List | Compound Members | File Members | Related Pages

VtxValsTool.cxx

Go to the documentation of this file.
00001 
00009 // Include files
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         //Vertexing Items
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     //float VTX_ErrAsym;
00079     //float VTX_CovDet;
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 // Static factory for instantiation of algtool objects
00133 static ToolFactory<VtxValsTool> s_factory;
00134 const IToolFactory& VtxValsToolFactory = s_factory;
00135 
00136 // Standard Constructor
00137 VtxValsTool::VtxValsTool(const std::string& type, 
00138                                                  const std::string& name, 
00139                                                  const IInterface* parent)
00140                                                  : ValBase( type, name, parent )
00141 {    
00142         // Declare additional interface
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         // get the services    
00245 
00246         if( serviceLocator() ) {        
00247         } else {
00248                 return StatusCode::FAILURE;
00249         }
00250 
00251         // load up the map
00252 
00253         // Pair reconstruction
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     /* in case we want this later
00268     <tr><td> VtxErrAsym  
00269     <td>F<td>   Tkr1SXY/(Tkr1SXX + Tkr1SYY)  
00270     <tr><td> VtxCovDet  
00271     <td>F<td>   Determinant of the error matrix, 
00272              but normalized to remove the dependence on cos(theta)
00273     */
00274     //addItem("VtxErrAsym",    &VTX_ErrAsym);
00275     //addItem("VtxCovDet",     &VTX_CovDet);
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         // Recover Track associated info. 
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         // Get the first Vertex - First track of first vertex = Best Track
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     //VTX_ErrAsym     = fabs(VTX_Sxy/(VTX_Sxx + VTX_Syy));
00378     //VTX_CovDet      = sqrt(std::max(0.0f,VTX_Sxx*VTX_Syy-VTX_Sxy*VTX_Sxy))*VTX_zdir*VTX_zdir;
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         // Get the first track location and direction
00389         Point  x1 = track_1->front()->getPoint(Event::TkrTrackHit::SMOOTHED);
00390         Vector t1 = track_1->front()->getDirection(Event::TkrTrackHit::SMOOTHED);
00391 
00392         // Check if there is a second track in the event.  This track may not be 
00393         // associated with the first track to form the first vertex.
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                 // Set a rogue value here in case this is a single 
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         // Get the first track location and direction
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                     // Set a rogue value here in case this is a single 
00468                     if(VTX2_xdir == t1.x() && VTX2_ydir == t1.y()) VTX2_Angle = -.1f;
00469        }
00470                 }}
00471 
00472         //Neutral Vertex section
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 }

Generated on Mon Dec 1 20:09:05 2008 by doxygen 1.3.3