• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

/Users/jmonk/Physics/ForIA/src/AnalysisTools/TrackSelection.cxx

Go to the documentation of this file.
00001 #include "ForIA/AnalysisTools/TrackSelection.hh"
00002 #include "ForIA/Units.hh"
00003 #include "ForIA/SettingsException.hh"
00004 
00005 #include <cmath>
00006 #include <stdexcept>
00007 
00008 namespace ForIA {
00009 
00010   TrackSelection::TrackSelection(): FourVectorSelection(), m_origin(Track::PRIMARY_VERTEX),
00011   m_haveSetD0(false), m_haveSetZ0SinTheta(false), m_haveSetPT(false),
00012   m_haveSetEta(false), m_haveSetBLayer(false), m_haveSetNPix(false), 
00013   m_haveSetNSCT(false), m_haveSetPixSCT(false), m_haveSetNSCTByPT(false), 
00014   m_haveSetMinFitProbability(false), m_haveSetChi2(false),
00015   m_haveSetTrackAuthors(false),
00016   m_haveSetVertexType(false){
00017     
00018   }
00020   const TrackVector &TrackSelection::tracks()const{
00021     if(m_freshEvent) fillVectors();
00022     return m_passedTracks;
00023   }
00024   
00026   const TrackVector &TrackSelection::rejectedTracks()const{
00027     if(m_freshEvent) fillVectors();
00028     return m_rejectedTracks;
00029   }
00030   
00032   void TrackSelection::setSelection(DefinedSelection selection){
00033     if(!m_canSetCuts) throw SettingsException("TrackSelection::setSelection");
00034     
00035     m_haveSetD0 = false;
00036     m_haveSetZ0SinTheta = false;
00037     m_haveSetPT = false;
00038     m_haveSetEta = false;
00039     m_haveSetBLayer = false;
00040     m_haveSetNPix = false;
00041     m_haveSetNSCT = false;
00042     m_haveSetPixSCT = false;
00043     m_haveSetNSCTByPT = false;
00044     m_haveSetMinFitProbability = false;
00045     m_haveSetChi2 = false;
00046     m_haveSetTrackAuthors = false;
00047     m_haveSetVertexType = false;
00048     
00049     switch (selection) {
00050         
00051       case HIGHMULT_LOOSE:
00052         
00053         setPixSCTHits(1);
00054         setPTMin(400. * MeV);
00055         addTrackAuthor(Track::INSIDE_OUT);
00056         addTrackAuthor(Track::LOW_PT);
00057         
00058         break;
00059         
00060       case HIGHMULT_ASSOC:
00061         
00062         setSelection(HIGHMULT_TIGHT);
00063         setOrigin(Track::TRACK_VERTEX);
00064         setD0(1.5 * mm);
00065         setZ0SinTheta(1.5 * mm);
00066         
00067         break;
00068       case HIGHMULT_TIGHT:
00069         
00070         setNBLayerHits(1);
00071         setNPixHits(1);
00072         setNSCTHits(100. * MeV, 2);
00073         setNSCTHits(200. * MeV, 4);
00074         setNSCTHits(300. * MeV, 6);
00075         setPTMin(400. * MeV);
00076         setMinFitProbability(10. * GeV, 0.01);
00077         addTrackAuthor(Track::INSIDE_OUT);
00078         addTrackAuthor(Track::LOW_PT);
00079         
00080         break;
00081       case MINBIAS_2:
00082         
00083         setSelection(MINBIAS_2_BS);
00084         setOrigin(Track::PRIMARY_VERTEX);
00085         setD0(1.5 * mm);
00086         setZ0SinTheta(1.5 * mm);
00087 
00088         break;
00089         
00090       case MINBIAS_2_BS:
00091         
00092         setPTMin(100. * MeV);
00093         setEtaMax(2.5);
00094         setNBLayerHits(1);
00095         setNPixHits(1);
00096         setNSCTHits(100. * MeV, 2);
00097         setNSCTHits(200. * MeV, 4);
00098         setNSCTHits(300. * MeV, 6);
00099         setOrigin(Track::BEAM_SPOT);
00100         setD0(1.8 * mm);
00101         setMinFitProbability(10. * GeV, 0.01);
00102         addTrackAuthor(Track::INSIDE_OUT);
00103         addTrackAuthor(Track::LOW_PT);
00104         break;
00105         
00106       case UE:
00107         setSelection(MINBIAS_2);
00108         setPTMin(500. * MeV);
00109         break;
00110     }
00111     
00112     return;
00113   }
00114   
00116   void TrackSelection::setInput(const TrackVector &tracks){
00117   
00118     m_canSetCuts = false;
00119     m_freshEvent = true;
00120     m_event=0;
00121     m_inputTracks = tracks;
00122     return;
00123   }
00124   
00126   void TrackSelection::fillVectors() const{
00127        
00128     m_freshEvent = false;
00129     
00130     m_passedTracks.clear();
00131     m_passedFourVectors.clear();
00132     m_rejectedTracks.clear();
00133     m_rejectedFourVectors.clear();
00134     
00135     const TrackVector &input = (m_event == 0)? m_inputTracks: m_event->tracks();
00136         
00137     for(TrackVector::const_iterator track = input.begin();
00138         track != input.end(); ++track){
00139       
00140       bool passedCuts = true;
00141       
00142       if(m_haveSetD0) passedCuts = (fabs((*track)->d0(m_origin)) < m_d0)? true: false;
00143       if(m_haveSetZ0SinTheta && passedCuts) passedCuts = (fabs((*track)->z0(m_origin)*sin((*track)->theta(m_origin))) < m_z0SinTheta);
00144       if(m_haveSetPT         && passedCuts) passedCuts = ((*track)->PT() > m_ptMin);
00145       if(m_haveSetEta        && passedCuts) passedCuts = (fabs((*track)->eta()) < m_etaMax);
00146       if(m_haveSetBLayer     && passedCuts) passedCuts = ((*track)->expectBLayer())? ((*track)->nBLayer() >= m_nBLayer): true;
00147       
00148       if(m_haveSetNPix       && passedCuts) passedCuts = ((*track)->nPix() >= m_minPix);
00149       if(m_haveSetNSCT       && passedCuts) passedCuts = ((*track)->nSCT() >= m_minSCT);
00150       if(m_haveSetPixSCT     && passedCuts) passedCuts = ((*track)->nPix() + (*track)->nSCT() >= m_minPixSCT);
00151       
00152       if(m_haveSetChi2       && passedCuts) passedCuts = ((*track)->chi2_DOF() <= m_maxChi2PerDOF);
00153 
00154       
00155       if(m_haveSetVertexType && passedCuts){
00156         passedCuts = false;
00157         const VertexVector &vertices = (*track)->associatedVertices();
00158         for(VertexVector::const_iterator vtx = vertices.begin();
00159             vtx != vertices.end() && !passedCuts; ++vtx){
00160           passedCuts = ((*vtx)->type()==m_vertexType);
00161         }
00162       }
00163       
00164       
00165       if(m_haveSetTrackAuthors && passedCuts){
00166         passedCuts = false;
00167         for(TrackAuthorSet::const_iterator author = m_authors.begin();
00168             author != m_authors.end() && !passedCuts; ++author){
00169           if((*track)->author()  == *author) passedCuts = true;
00170         }
00171       }
00172       
00173       if(m_haveSetNSCTByPT   && passedCuts){
00174         map<double, int>::const_iterator pt = m_minSCTByPT.upper_bound((*track)->PT());
00175         if(pt == m_minSCTByPT.begin()){//the pT of this track is below the lowest pT threshold set.
00176                                        //In all likelihood this is below the track pT cut, but the implication is
00177                                        //that there is no SCT cut on tracks below that threshold, therefore we pass if
00178                                        //we ever get here, which we probably won't!
00179           passedCuts = true;
00180         }else{
00181           --pt;
00182           passedCuts = ((*track)->nSCT() >= pt->second);
00183         }
00184       }
00185       
00186       if(m_haveSetMinFitProbability && passedCuts){
00187         map<double, double>::const_iterator pt = m_minFitProbability.upper_bound((*track)->PT());
00188         if(pt == m_minFitProbability.begin()){ //same as for pT dependent nSCT hits - no cut below threshold
00189           passedCuts = true;
00190         }else{
00191           --pt;
00192           passedCuts = ((*track)->fitProbability()> pt->second);
00193         }        
00194       }
00195       
00196       if(passedCuts){
00197         m_passedTracks.push_back(*track);
00198         m_passedFourVectors.push_back(*track);
00199       }else{
00200         m_rejectedTracks.push_back(*track);
00201         m_rejectedFourVectors.push_back(*track);
00202       }
00203     }
00204 
00205     return;
00206   }
00207   
00209   void TrackSelection::setOrigin(Track::Origin origin){
00210     if(!m_canSetCuts) throw SettingsException("TrackSelection::setOrigin");
00211     m_origin = origin;
00212     return;
00213   }
00214   
00216   void TrackSelection::setD0(double d0){
00217     if(!m_canSetCuts) throw SettingsException("TrackSelection::setD0");
00218     m_haveSetD0 = true;
00219     m_d0 = d0;
00220     return;
00221   }
00222   
00224   void TrackSelection::setZ0SinTheta(double z0SinTheta){
00225     if(!m_canSetCuts) throw SettingsException("TrackSelection::setZ0SinTheta");
00226     m_haveSetZ0SinTheta = true;
00227     m_z0SinTheta = z0SinTheta;
00228     return;
00229   }
00230   
00232   void TrackSelection::setPTMin(double pt){
00233     if(!m_canSetCuts) throw SettingsException("TrackSelection::setPTMin");
00234     m_haveSetPT = true;
00235     m_ptMin = pt;
00236     return;
00237   }
00238   
00240   void TrackSelection::setEtaMax(double eta){
00241     if(!m_canSetCuts) throw SettingsException("TrackSelection::setEtaMax");
00242     m_haveSetEta = true;
00243     m_etaMax = eta;
00244     return;
00245   }
00246   
00248   void TrackSelection::setNBLayerHits(int nBLayer){
00249     if(!m_canSetCuts) throw SettingsException("TrackSelection::setNBLayerHits");
00250     m_nBLayer = nBLayer;
00251     m_haveSetBLayer = true;
00252     return;
00253   }
00254   
00256   void TrackSelection::setNPixHits(int nPix){
00257     if(!m_canSetCuts) throw SettingsException("TrackSelection::setNPixHits");
00258     m_haveSetNPix = true;
00259     m_minPix = nPix;
00260     return;
00261   }
00262   
00264   void TrackSelection::setNSCTHits(int nSCT){
00265     if(!m_canSetCuts) throw SettingsException("TrackSelection::setNSCTHits");
00266     
00267     if(m_haveSetNSCTByPT) throw SettingsException
00268       ("TrackSelection::setNSCTHits",
00269        "Tried to set a global cut on # SCT hits when there is already a pT dependent cut on #SCT");
00270     
00271     m_haveSetNSCT = true;
00272     m_minSCT = nSCT;
00273     return;
00274   }
00275   
00277   void TrackSelection::setPixSCTHits(int nHits){
00278     if(!m_canSetCuts) throw SettingsException("TrackSelection::setPixSCTHits");
00279     
00280     m_haveSetPixSCT = true;
00281     m_minPixSCT = nHits;
00282     return;
00283   }
00284   
00286   void TrackSelection::setNSCTHits(double ptThresh, int nSCT){
00287     if(!m_canSetCuts) throw SettingsException("TrackSelection::setNSCTHits");
00288     
00289     if(m_haveSetNSCT) throw SettingsException
00290       ("TrackSelection::setNSCTHits",
00291        "Tried to set a pT dependent # SCT hits cut when there is already a global cut on #SCT");
00292     
00293     m_minSCTByPT[ptThresh] = nSCT;
00294     
00295     m_haveSetNSCTByPT = true;
00296     return;
00297   }
00298   
00300   void TrackSelection::setMinFitProbability(double ptThresh, double minProbability){
00301     if(!m_canSetCuts) throw SettingsException("TrackSelection::setMinFitProbability");
00302     m_minFitProbability[ptThresh] = minProbability;
00303     m_haveSetMinFitProbability = true;
00304     m_haveSetChi2 = false;
00305     return;
00306   }
00307   
00308   void TrackSelection::setChi2PerDOF(double chi2){
00309     if(!m_canSetCuts) throw SettingsException("TrackSelection::setChi2PerDOF");
00310     m_maxChi2PerDOF = chi2;
00311     m_haveSetChi2 = true;
00312     m_haveSetMinFitProbability = false;
00313     return;
00314   }
00315   
00317   void TrackSelection::addTrackAuthor(Track::TrackAuthor author){
00318     if(!m_canSetCuts) throw SettingsException("TrackSelection::addTrackAuthor");
00319     m_authors.insert(author);
00320     m_haveSetTrackAuthors = true;
00321     return;
00322   }
00324 
00325   void TrackSelection::clearAllTrackAuthors(){
00326     if(!m_canSetCuts) throw SettingsException("TrackSelection::clearAllTrackAuthors");
00327     m_authors.clear();
00328     m_haveSetTrackAuthors = false;
00329     return;
00330   }
00331   
00333   void TrackSelection::setVertexType(Vertex::VertexType vType){
00334     if(!m_canSetCuts) throw SettingsException("TrackSelection::setVertexType");
00335     m_vertexType = vType;
00336     m_haveSetVertexType = true;
00337     return;
00338   }
00339   
00340 }

Generated on Mon Jul 30 2012 16:56:35 for ForIA by  doxygen 1.7.2