00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "StHitFilterMaker.h"
00028 #include "StMessMgr.h"
00029
00030
00031 #include "StEventTypes.h"
00032 #include <algorithm>
00033 #ifndef ST_NO_NAMESPACES
00034 using std::binary_search;
00035 using std::unique;
00036 using std::sort;
00037
00038 #endif
00039
00040
00041 ClassImp(StHitFilterMaker)
00042
00043
00045 StHitFilterMaker::StHitFilterMaker(const char *name, Double_t ptl, Double_t pth, Double_t eta, Double_t zvert):StMaker(name),mPtLowerCut(ptl),mPtUpperCut(pth),mAbsEtaCut(eta), mAbsZVertCut(zvert){
00046
00047 }
00048
00050 StHitFilterMaker::~StHitFilterMaker(){
00051
00052 }
00053
00055 Int_t StHitFilterMaker::Init(){
00056
00057
00058 gMessMgr->Info() << "StHitFilterMaker::Init(): keeping tracks between " <<
00059 mPtLowerCut << " and " << mPtUpperCut << "GeV/c (negative = no cut)" << endm;
00060 gMessMgr->Info() << "StHitFilterMaker::Init(): keeping tracks with |eta| < " <<
00061 mAbsEtaCut << endm;
00062 gMessMgr->Info() << "StHitFilterMaker::Init(): keeping tracks with |ZVert| < " <<
00063 mAbsZVertCut << endm;
00064 return StMaker::Init();
00065 }
00066
00067
00068
00074 Int_t StHitFilterMaker::Make(){
00075
00076
00077 StEvent* event;
00078 event = (StEvent *) GetInputDS("StEvent");
00079
00080
00081 if (!event) {
00082 gMessMgr->Info() <<"StHitFilterMaker::Make(): not a valid StEvent: " << endm;
00083
00084
00085 return kStOK;
00086 }
00087
00088 vector<StTrackNode*> keptTrackNodes;
00089 if( accept(event)){
00090 StSPtrVecTrackNode& nodes = event->trackNodes();
00091 for (StSPtrVecTrackNodeIterator nodeIter = nodes.begin();
00092 nodeIter != nodes.end(); ++nodeIter) {
00093 bool isAcceptedTrack = false;
00094
00095 for (UInt_t ientry=0;
00096 ientry < (*nodeIter)->entries(); ++ientry) {
00097 StTrack *track = (*nodeIter)->track(ientry);
00098
00099
00100
00101 if (!(track->topologyMap().hasHitInDetector(kTpcId))) {
00102 continue;
00103 }
00104
00105 if (accept(track)) {
00106 isAcceptedTrack = true;
00107 break;
00108 }
00109 }
00110 if (isAcceptedTrack) {
00111 keptTrackNodes.push_back(*nodeIter);
00112 }
00113 }
00114
00115 sort(keptTrackNodes.begin(),keptTrackNodes.end());
00116 vector<StTrackNode*>::iterator uniquePos =
00117 unique(keptTrackNodes.begin(),keptTrackNodes.end());
00118 keptTrackNodes.erase(uniquePos,keptTrackNodes.end());
00119 }
00120
00121 gMessMgr->Info() << "StHitFilterMaker::Make(): keeping TPC hits on " <<
00122 keptTrackNodes.size() << "track nodes " << endm;
00123 if (! TESTBIT(m_Mode, kTpcId))
00124 this->removeTpcHitsNotOnTracks(event,keptTrackNodes);
00125 if (! TESTBIT(m_Mode, kSvtId)) {
00126 this->removeSvtHitsNotOnTracks(event,keptTrackNodes);
00127 this->removeBadSvtHits(event);
00128 }
00129 return kStOK;
00130 }
00131
00132 bool StHitFilterMaker::accept(StEvent *event) {
00133
00134 if( !(event->primaryVertex())) return false;
00135 if( fabs(event->primaryVertex()->position().z()) > mAbsZVertCut) return false;
00136 return true;
00137 }
00138
00139 bool StHitFilterMaker::accept(StTrack *track) {
00140 if (track->flag() <= 0) return false;
00141 StSPtrVecTrackPidTraits &traits = track->pidTraits();
00142 unsigned int size = traits.size();
00143 if (size) {
00144 for (unsigned int i = 0; i < size; i++) {
00145 if (! traits[i]) continue;
00146 if ( traits[i]->IsZombie()) continue;
00147 StTofPidTraits* p = dynamic_cast<StTofPidTraits*>(traits[i]);
00148 if (p) {return true;}
00149 }
00150 }
00151 if (track->geometry()) {
00152 if (mPtLowerCut > 0 && track->geometry()->momentum().perp() < mPtLowerCut )
00153 return false;
00154 if (mPtUpperCut > 0 && track->geometry()->momentum().perp() > mPtUpperCut )
00155 return false;
00156 if (mAbsEtaCut > 0 && fabs(track->geometry()->momentum().pseudoRapidity()) > mAbsEtaCut)
00157 return false;
00158
00159 }
00160
00161 return true;
00162 }
00163
00164 bool StHitFilterMaker::accept(StHit *hit) {
00165 if( hit->flag() > 3) return false;
00166 return true;
00167 }
00168
00169
00175 bool StHitFilterMaker::removeTpcHitsNotOnTracks(StEvent *event,
00176 vector<StTrackNode*>& keptTrackNodes)
00177 {
00178 Int_t removedHits = 0;
00179
00180 if (event && event->tpcHitCollection()) {
00181
00182 StTpcHitCollection *theHits = event->tpcHitCollection();
00183 for (unsigned int n=0; n<theHits->numberOfSectors(); n++) {
00184 for (unsigned int m=0; m<theHits->sector(n)->numberOfPadrows(); m++) {
00185
00186 for (unsigned int h=0; h<theHits->sector(n)->padrow(m)->hits().size(); h++) {
00187
00188 if (theHits->sector(n)->padrow(m)->hits()[h]->trackReferenceCount() == 0) {
00189 if (! (theHits->sector(n)->padrow(m)->hits()[h]->isZombie())) {
00190 theHits->sector(n)->padrow(m)->hits()[h]->makeZombie();
00191 ++removedHits;
00192 }
00193 }
00194 }
00195 }
00196 }
00197 gMessMgr->Info() << "StHitFilterMaker::removeTpcHitsNotOnTracks. Removed " <<
00198 removedHits << " TPC hits not on any tracks" << endm;
00199 removedHits = 0;
00200
00201
00202 StSPtrVecTrackNode& nodes = event->trackNodes();
00203 for (unsigned int i = 0; i < nodes.size(); i++) {
00204 StTrackNode* node = nodes[i];
00205 if (!binary_search(keptTrackNodes.begin(),
00206 keptTrackNodes.end(),
00207 node))
00208 {
00209
00210 for (unsigned int j = 0; j < node->entries(); j++) {
00211 StTrack* track = node->track(j);
00212
00213 if (!(track->topologyMap().hasHitInDetector(kTpcId))) {
00214 continue;
00215 }
00216
00217 StTrackDetectorInfo* info = track->detectorInfo();
00218 if (info) {
00219 StPtrVecHit& hitList = info->hits();
00220 for (unsigned int k = 0; k < hitList.size(); k++)
00221 if (hitList[k]->detector() == kTpcId &&
00222 !(hitList[k]->isZombie()) ) {
00223 hitList[k]->makeZombie();
00224 ++removedHits;
00225 }
00226
00227 }
00228 }
00229 }
00230 }
00231 gMessMgr->Info() << "StHitFilterMaker::removeTpcHitsNotOnTracks. Removed " <<
00232 removedHits << " TPC hits not on passed tracks" << endm;
00233
00234 return true;
00235 }
00236 else
00237 return false;
00238 }
00239
00244 bool StHitFilterMaker::removeSvtHitsNotOnTracks(StEvent *event,
00245 vector<StTrackNode*>& keptTrackNodes)
00246 {
00247 Int_t removedHits = 0;
00248
00249 if (event && event->svtHitCollection()) {
00250
00251 StSvtHitCollection *theHits = event->svtHitCollection();
00252 for (unsigned int l=0; l<theHits->numberOfBarrels(); l++) {
00253 for (unsigned int m=0; m<theHits->barrel(l)->numberOfLadders(); m++) {
00254 for (unsigned int n=0; n<theHits->barrel(l)->ladder(m)->numberOfWafers(); n++) {
00255 for (unsigned int h=0; h<theHits->barrel(l)->ladder(m)->wafer(n)->hits().size(); h++) {
00256
00257 if (theHits->barrel(l)->ladder(m)->wafer(n)->hits()[h]->trackReferenceCount() == 0) {
00258 if (! (theHits->barrel(l)->ladder(m)->wafer(n)->hits()[h]->isZombie())) {
00259 theHits->barrel(l)->ladder(m)->wafer(n)->hits()[h]->makeZombie();
00260 ++removedHits;
00261 }
00262 }
00263 }
00264 }
00265 }
00266 }
00267
00268 gMessMgr->Info() << "StHitFilterMaker::removedSvtHitsNotOnTracks. Removed " <<
00269 removedHits << " SVT hits not on any tracks" << endm;
00270 removedHits = 0;
00271
00272
00273 StSPtrVecTrackNode& nodes = event->trackNodes();
00274 for (unsigned int i = 0; i < nodes.size(); i++) {
00275 StTrackNode* node = nodes[i];
00276 if (!binary_search(keptTrackNodes.begin(),
00277 keptTrackNodes.end(),
00278 node))
00279 {
00280
00281 for (unsigned int j = 0; j < node->entries(); j++) {
00282 StTrack* track = node->track(j);
00283
00284 if (!(track->topologyMap().hasHitInDetector(kSvtId))) {
00285 continue;
00286 }
00287
00288 StTrackDetectorInfo* info = track->detectorInfo();
00289 if (info) {
00290 StPtrVecHit& hitList = info->hits();
00291 for (unsigned int k = 0; k < hitList.size(); k++)
00292 if (hitList[k]->detector() == kSvtId &&
00293 !(hitList[k]->isZombie()) ) {
00294 hitList[k]->makeZombie();
00295 ++removedHits;
00296 }
00297
00298 }
00299 }
00300 }
00301 }
00302 gMessMgr->Info() << "StHitFilterMaker::removeSvtHitsNotOnTracks. Removed " <<
00303 removedHits << " SVT hits not on passed tracks" << endm;
00304
00305 return true;
00306 }
00307 else
00308 return false;
00309 }
00310
00311
00317 bool StHitFilterMaker::removeBadSvtHits(StEvent *event)
00318 {
00319 Int_t removedHits = 0;
00320
00321 if (event && event->svtHitCollection()) {
00322
00323 StSvtHitCollection *theHits = event->svtHitCollection();
00324 for (unsigned int l=0; l<theHits->numberOfBarrels(); l++) {
00325 for (unsigned int m=0; m<theHits->barrel(l)->numberOfLadders(); m++) {
00326 for (unsigned int n=0; n<theHits->barrel(l)->ladder(m)->numberOfWafers(); n++) {
00327 for (unsigned int h=0; h<theHits->barrel(l)->ladder(m)->wafer(n)->hits().size(); h++) {
00328 if (! (accept(theHits->barrel(l)->ladder(m)->wafer(n)->hits()[h])) ||
00329 !accept(event)) {
00330 if (! (theHits->barrel(l)->ladder(m)->wafer(n)->hits()[h]->isZombie())) {
00331 theHits->barrel(l)->ladder(m)->wafer(n)->hits()[h]->makeZombie();
00332 ++removedHits;
00333 }
00334 }
00335 }
00336 }
00337 }
00338 }
00339
00340 gMessMgr->Info() << "StHitFilterMaker::removeBadSvtHits. Removed " <<
00341 removedHits << " bad SVT hits" << endm;
00342 return true;
00343 }
00344 else
00345 return false;
00346 }
00347
00348
00349
00350