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()){
00176
00177
00178
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()){
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 }