CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_10_patch2/src/TrackingTools/RoadSearchHitAccess/src/DetHitAccess.cc

Go to the documentation of this file.
00001 #include "TrackingTools/RoadSearchHitAccess/interface/DetHitAccess.h"
00002 
00004 template<typename T>
00005 inline edmNew::DetSet<T> detSetOrEmpty(const edmNew::DetSetVector<T> &dsv, DetId detid) {
00006     typename edmNew::DetSetVector<T>::const_iterator iter = dsv.find(detid.rawId());
00007     if (iter == dsv.end()) {
00008         return typename edmNew::DetSet<T>(detid.rawId(), static_cast<const T *>(0), size_t(0) );
00009     } else {
00010         return *iter;
00011     }
00012 }
00013 
00014 
00015 DetHitAccess::DetHitAccess() {
00016   // default for access mode
00017   accessMode_ = standard;
00018 
00019   use_rphiRecHits_ = true;
00020   use_rphiRecHits_ = true;
00021 }
00022 
00023 DetHitAccess::~DetHitAccess(){
00024 }
00025 
00026 DetHitAccess::DetHitAccess(const SiStripRecHit2DCollection* rphiRecHits,
00027                            const SiStripRecHit2DCollection* stereoRecHits,
00028                            const SiStripMatchedRecHit2DCollection* matchedRecHits,
00029                            const SiPixelRecHitCollection* pixelRecHits) {
00030   
00031   // default for access mode
00032   accessMode_ = standard;
00033 
00034   use_rphiRecHits_   = true;
00035   use_stereoRecHits_ = true;
00036 
00037   // set collections
00038   setCollections(rphiRecHits,stereoRecHits,matchedRecHits,pixelRecHits);
00039   
00040 }
00041                 
00042 void DetHitAccess::setCollections(const SiStripRecHit2DCollection* rphiRecHits,
00043                                   const SiStripRecHit2DCollection* stereoRecHits,
00044                                   const SiStripMatchedRecHit2DCollection* matchedRecHits,
00045                                   const SiPixelRecHitCollection* pixelRecHits) {
00046   
00047   rphiHits_ = rphiRecHits;
00048   stereoHits_ = stereoRecHits;
00049   matchedHits_ = matchedRecHits;
00050   pixelHits_ = pixelRecHits;
00051 
00052 }
00053 
00054 
00055 std::vector<TrackingRecHit*> DetHitAccess::getHitVector(const DetId* detid) {
00056   //
00057   //DetId that is given to getHitVector is *always* rphi
00058   //
00059   
00060   std::vector<TrackingRecHit*> RecHitVec;
00061   
00062   if ( (unsigned int)detid->subdetId() == StripSubdetector::TIB  
00063        || (unsigned int)detid->subdetId() == StripSubdetector::TOB  
00064        || (unsigned int)detid->subdetId() == StripSubdetector::TID  
00065        || (unsigned int)detid->subdetId() == StripSubdetector::TEC )  { 
00066     
00067     StripSubdetector StripDetId(*detid);
00068 
00069 
00070     if (accessMode_ == rphi ) {
00071       //
00072       //return only r-phi RecHits; in case of double modules eliminate recurring r-phi RecHits
00073       //
00074       if( !StripDetId.glued() ) {
00075         if ( rphiHits_ != 0 ) {
00076           SiStripRecHit2DCollection::DetSet rphiDetHits = detSetOrEmpty(*rphiHits_, *detid);
00077           for ( SiStripRecHit2DCollection::DetSet::const_iterator rphiDetHit = rphiDetHits.begin();
00078                 rphiDetHit != rphiDetHits.end(); 
00079                 ++rphiDetHit ) {
00080             RecHitVec.push_back((TrackingRecHit*)(&(*rphiDetHit)));
00081           }
00082         } else {
00083           edm::LogWarning("RoadSearch") << "rphi RecHit collection not set properly";
00084         }
00085       } else {
00086         /* 
00087          * VI January 2012 not supported anymore (at least in this form)
00088          * and (by-the-way) is infinitely slow with such a double loop!!!!!
00089          *
00090         if ( matchedHits_ != 0 ) {
00091           DetId useDetId(StripDetId.glued());
00092           SiStripMatchedRecHit2DCollection::DetSet matchedDetHits = detSetOrEmpty(*matchedHits_, useDetId);
00093           for ( SiStripMatchedRecHit2DCollection::DetSet::const_iterator matchedDetHit = matchedDetHits.begin();
00094                 matchedDetHit != matchedDetHits.end(); ++matchedDetHit ) {
00095             bool add = true;
00096             TrackingRecHit *rphi = (TrackingRecHit*)matchedDetHit->monoHit();
00097             for ( std::vector<TrackingRecHit*>::iterator hit = RecHitVec.begin();
00098                   hit != RecHitVec.end();
00099                   ++hit ) {
00100               if ((*hit)->localPosition().x() == rphi->localPosition().x()) {
00101                 if ((*hit)->localPosition().y() == rphi->localPosition().y()) {
00102                   add = false;
00103                   break;
00104                 }
00105               }
00106             }
00107             if ( add ) {
00108               RecHitVec.push_back(rphi);
00109             }
00110           }
00111         } else {
00112           edm::LogWarning("RoadSearch") << "matched RecHit collection not set properly";
00113         }
00114         */
00115       }
00116     } else if (accessMode_ == rphi_stereo ) {
00117       //
00118       //return only r-phi and stereo RecHits
00119       //
00120       if( !StripDetId.glued() ) {
00121         if ( rphiHits_ != 0 ) {
00122           SiStripRecHit2DCollection::DetSet rphiDetHits = detSetOrEmpty(*rphiHits_, *detid);
00123           for ( SiStripRecHit2DCollection::DetSet::const_iterator rphiDetHit = rphiDetHits.begin();
00124                 rphiDetHit != rphiDetHits.end(); 
00125                 ++rphiDetHit ) {
00126             RecHitVec.push_back((TrackingRecHit*)(&(*rphiDetHit)));
00127           }
00128         } else {
00129           edm::LogWarning("RoadSearch") << "rphi RecHit collection not set properly";
00130         }
00131         
00132       } else {
00133         DetId rphiDetId(StripDetId.glued()+2);
00134         if ( rphiHits_ != 0 ) {
00135           SiStripRecHit2DCollection::DetSet rphiDetHits = detSetOrEmpty(*rphiHits_, rphiDetId);
00136           for ( SiStripRecHit2DCollection::DetSet::const_iterator rphiDetHit = rphiDetHits.begin();
00137                 rphiDetHit != rphiDetHits.end(); 
00138                 ++rphiDetHit ) {
00139             RecHitVec.push_back((TrackingRecHit*)(&(*rphiDetHit)));
00140           }
00141         } else {
00142           edm::LogWarning("RoadSearch") << "rphi RecHit collection not set properly";
00143         }
00144 
00145         DetId stereoDetId(StripDetId.glued()+1);
00146         if ( stereoHits_ != 0 ) {
00147           SiStripRecHit2DCollection::DetSet stereoDetHits = detSetOrEmpty(*stereoHits_, stereoDetId);
00148           for ( SiStripRecHit2DCollection::DetSet::const_iterator stereoDetHit = stereoDetHits.begin();
00149                 stereoDetHit != stereoDetHits.end(); 
00150                 ++stereoDetHit ) {
00151             RecHitVec.push_back((TrackingRecHit*)(&(*stereoDetHit)));
00152           }
00153         } else {
00154           edm::LogWarning("RoadSearch") << "stereo RecHit collection not set properly";
00155         }
00156       }
00157     } else if (accessMode_ == standard ) {
00158       //
00159       //single modules: return r-phi RecHits
00160       //double modules: return matched RecHits + r-phi RecHits that are not used by matched RecHits
00161       //
00162       if( !StripDetId.glued() ) {
00163         if ( rphiHits_ != 0 ) {
00164           SiStripRecHit2DCollection::DetSet rphiDetHits = detSetOrEmpty(*rphiHits_, *detid);
00165           for ( SiStripRecHit2DCollection::DetSet::const_iterator rphiDetHit = rphiDetHits.begin();
00166                 rphiDetHit != rphiDetHits.end(); 
00167                 ++rphiDetHit ) {
00168             RecHitVec.push_back((TrackingRecHit*)(&(*rphiDetHit)));
00169           }
00170         } else {
00171           edm::LogWarning("RoadSearch") << "rphi RecHit collection not set properly";
00172         }
00173       } else {
00174         if ( matchedHits_ != 0 ) {
00175           DetId useDetId(StripDetId.glued());
00176           SiStripMatchedRecHit2DCollection::DetSet matchedDetHits = detSetOrEmpty(*matchedHits_, useDetId);
00177           for ( SiStripMatchedRecHit2DCollection::DetSet::const_iterator matchedDetHit = matchedDetHits.begin();
00178                 matchedDetHit != matchedDetHits.end(); ++matchedDetHit ) {
00179             RecHitVec.push_back((TrackingRecHit*)(&(*matchedDetHit)));
00180           }
00181         } else {
00182           edm::LogWarning("RoadSearch") << "matched RecHit collection not set properly";
00183         }
00184         
00185         //check for additional r-phi RecHits (not used by matched RecHits)
00186         if(use_rphiRecHits_) {
00187           DetId rphiDetId(StripDetId.glued()+2);
00188           if ( rphiHits_ != 0 ) {
00189             SiStripRecHit2DCollection::DetSet rphiDetHits = detSetOrEmpty(*rphiHits_, rphiDetId);
00190             for ( SiStripRecHit2DCollection::DetSet::const_iterator rphiDetHit = rphiDetHits.begin();
00191                   rphiDetHit != rphiDetHits.end(); ++rphiDetHit ) {
00192               bool use_rphi=true;
00193               DetId useDetId(StripDetId.glued());
00194               SiStripMatchedRecHit2DCollection::DetSet matchedDetHits = detSetOrEmpty(*matchedHits_, useDetId);
00195               //SiStripMatchedRecHit2DCollection::DetSet matchedDetHits = detSetOrEmpty(*matchedHits_, *detid);
00196               for ( SiStripMatchedRecHit2DCollection::DetSet::const_iterator matchedDetHit = matchedDetHits.begin();
00197                     matchedDetHit != matchedDetHits.end(); ++matchedDetHit ) { 
00198                 if (rphiDetHit->sharesInput((TrackingRecHit*)(&(*matchedDetHit)), TrackingRecHit::some)) {
00199                   use_rphi=false;
00200                   break;
00201                 }
00202               }
00203               if(use_rphi) RecHitVec.push_back((TrackingRecHit*)(&(*rphiDetHit)));
00204             }
00205           } else {
00206             edm::LogWarning("RoadSearch") << "rphi RecHit collection not set properly";
00207           }
00208         }
00209           
00210         //check for additional stereo RecHits (not used by matched RecHits)
00211         if(use_stereoRecHits_) {
00212           DetId stereoDetId(StripDetId.glued()+1);
00213           if ( stereoHits_ != 0 ) {
00214             SiStripRecHit2DCollection::DetSet stereoDetHits = detSetOrEmpty(*stereoHits_, stereoDetId);
00215             for ( SiStripRecHit2DCollection::DetSet::const_iterator stereoDetHit = stereoDetHits.begin();
00216                   stereoDetHit != stereoDetHits.end(); ++stereoDetHit ) {
00217               bool use_stereo=true;
00218               DetId useDetId(StripDetId.glued());
00219               SiStripMatchedRecHit2DCollection::DetSet matchedDetHits = detSetOrEmpty(*matchedHits_, useDetId);
00220               //SiStripMatchedRecHit2DCollection::DetSet matchedDetHits = detSetOrEmpty(*matchedHits_, *detid);
00221               for ( SiStripMatchedRecHit2DCollection::DetSet::const_iterator matchedDetHit = matchedDetHits.begin();
00222                     matchedDetHit != matchedDetHits.end(); ++matchedDetHit ) { 
00223                 if (stereoDetHit->sharesInput((TrackingRecHit*)(&(*matchedDetHit)), TrackingRecHit::some)) {
00224                   use_stereo=false;
00225                   break;
00226                 }
00227               }
00228               if(use_stereo) RecHitVec.push_back((TrackingRecHit*)(&(*stereoDetHit)));
00229             }
00230           } else {
00231             edm::LogWarning("RoadSearch") << "stereo RecHit collection not set properly";
00232           }  
00233         }
00234       }
00235     }
00236     
00237   } else if (    (unsigned int)detid->subdetId() == PixelSubdetector::PixelBarrel 
00238                  || (unsigned int)detid->subdetId() == PixelSubdetector::PixelEndcap) {
00239     
00240     if ( pixelHits_ != 0 ) {
00241       SiPixelRecHitCollection::DetSet pixelDetHits = detSetOrEmpty(*pixelHits_, *detid);
00242       for ( SiPixelRecHitCollection::DetSet::const_iterator pixelDetHit = pixelDetHits.begin(); 
00243             pixelDetHit!= pixelDetHits.end(); ++pixelDetHit) {
00244         RecHitVec.push_back((TrackingRecHit*)(&(*pixelDetHit)));
00245       }
00246     } else {
00247       edm::LogWarning("RoadSearch") << "pixel RecHit collection not set properly";
00248     } 
00249   } else {
00250     
00251     edm::LogError("RoadSearch") << "NEITHER PIXEL NOR STRIP DETECTOR ID";
00252 
00253   }
00254   
00255   
00256   return RecHitVec;
00257 }
00258