CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_2_SLHC2/src/SimDataFormats/SLHC/interface/L1TkCluster.h

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 #ifndef STACKED_TRACKER_L1TK_CLUSTER_FORMAT_H
00014 #define STACKED_TRACKER_L1TK_CLUSTER_FORMAT_H
00015 
00016 #include "DataFormats/DetId/interface/DetId.h"
00017 #include "DataFormats/Common/interface/Ref.h"
00018 #include "DataFormats/Common/interface/Ptr.h"
00019 #include "DataFormats/Common/interface/DetSet.h"
00020 #include "DataFormats/Common/interface/DetSetVector.h"
00021 #include "DataFormats/SiPixelDigi/interface/PixelDigi.h"
00022 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00023 #include "DataFormats/GeometryCommonDetAlgo/interface/MeasurementPoint.h"
00024 
00025 #include "SimDataFormats/TrackerDigiSimLink/interface/PixelDigiSimLink.h"
00026 #include "SimDataFormats/Track/interface/SimTrack.h"
00027 #include "SimDataFormats/Track/interface/SimTrackContainer.h"
00028 #include "SimDataFormats/TrackingHit/interface/PSimHitContainer.h"
00029 
00030 
00037   template< typename T >
00038   class L1TkCluster
00039   {
00040     public:
00042       L1TkCluster();
00043       L1TkCluster( std::vector< T > aHits, DetId aDetId, unsigned int aStackMember );
00044 
00046       ~L1TkCluster();
00047 
00050 
00052       std::vector< T > getHits() const;
00053       void             setHits( std::vector< T > aHits );
00054 
00056       DetId        getDetId() const;
00057       void         setDetId( DetId aDetId );
00058       unsigned int getStackMember() const;
00059       void         setStackMember( unsigned int aStackMember );
00060 
00062       std::vector< edm::Ptr< SimTrack > > getSimTrackPtrs() const;
00063       void                                addSimTrack( const edm::Ptr< SimTrack > &trk) { theSimTracks.push_back(trk);}
00064       bool                                isGenuine() const;
00065       bool                                isCombinatoric() const;
00066       bool                                isUnknown() const;
00067       int                                 findType() const;
00068       unsigned int                        findSimTrackId() const;
00069 
00071       unsigned int findWidth() const;
00072 
00074       MeasurementPoint findHitLocalCoordinates( unsigned int hitIdx ) const;
00075 
00077       MeasurementPoint findAverageLocalCoordinates() const;
00078 
00080       std::string print( unsigned int i=0 ) const;
00081 
00082     private:
00084       std::vector< T >                    theHits;
00085       DetId                               theDetId;
00086       unsigned int                        theStackMember;
00087       std::vector< edm::Ptr< SimTrack > > theSimTracks;
00088 
00089   }; 
00090 
00097 
00098 
00099   template< typename T >
00100   L1TkCluster< T >::L1TkCluster()
00101   {
00103     theHits.clear();
00104     theDetId = 0;
00105     theStackMember = 0;
00106     theSimTracks.clear();
00107   }
00108 
00110   template< typename T >
00111   L1TkCluster< T >::L1TkCluster( std::vector< T > aHits, DetId aDetId, unsigned int aStackMember )
00112   {
00114     theHits.clear();
00115     for ( unsigned int j = 0; j < aHits.size(); j++ )
00116       theHits.push_back( aHits.at(j) );
00117     theDetId = aDetId;
00118     theStackMember = aStackMember;
00119     theSimTracks.clear();
00120   }
00121 
00123   template< typename T >
00124   L1TkCluster< T >::~L1TkCluster(){}
00125 
00127   template< typename T >
00128   std::vector< T > L1TkCluster< T >::getHits() const { return theHits; }
00129 
00130   template< typename T >
00131   void L1TkCluster< T >::setHits( std::vector< T > aHits )
00132   {
00133     for ( unsigned int j=0; j<aHits.size(); j++ )
00134       theHits.push_back( aHits.at(j) );
00135   }
00136 
00138   template< typename T >
00139   DetId L1TkCluster< T >::getDetId() const { return theDetId; }
00140 
00141   template< typename T >
00142   void L1TkCluster< T >::setDetId( DetId aDetId ) { theDetId = aDetId; }
00143 
00144   template< typename T >
00145   unsigned int L1TkCluster< T >::getStackMember() const { return theStackMember; }
00146 
00147   template< typename T >
00148   void L1TkCluster< T >::setStackMember( unsigned int aStackMember ) { theStackMember = aStackMember; }
00149 
00151   template< typename T >
00152   std::vector< edm::Ptr< SimTrack > > L1TkCluster< T >::getSimTrackPtrs() const { return theSimTracks; }
00153 
00154   template< typename T >
00155   bool L1TkCluster< T >::isGenuine() const
00156   {
00160     int prevTrack = -99999; // SimTrackId storage
00161     if ( theSimTracks.size() == 0 ) return false;
00162     for ( unsigned int k = 0; k < theSimTracks.size(); k++ )
00163     {
00164       edm::Ptr< SimTrack > curSimTrackPtr = theSimTracks.at(k);
00165       if ( curSimTrackPtr.isNull() )
00167         return false;
00168       else
00169       {
00170         if ( theSimTracks.size() > 1 )
00171         {
00172           if ( prevTrack < 0 )
00173             prevTrack = curSimTrackPtr->trackId();
00174 
00175           if ( prevTrack != (int)curSimTrackPtr->trackId() )
00177             return false;
00178  
00179           prevTrack = curSimTrackPtr->trackId();
00180         }
00181       }
00182     }
00184     return true;
00185   }
00186 
00187   template< typename T >
00188   bool L1TkCluster< T >::isCombinatoric() const
00189   {
00194     int prevTrack = -99999; // SimTrackId storage
00195     unsigned int numberNulls = 0; // Number of non-found SimTracks
00196     unsigned int numberGoods = 0; // Number of found SimTracks
00197     for ( unsigned int k = 0; k < theSimTracks.size(); k++ )
00198     {
00199       edm::Ptr< SimTrack > curSimTrackPtr = theSimTracks.at(k);
00200       if ( curSimTrackPtr.isNull() )
00201         numberNulls++;
00202       else
00203         numberGoods++;
00204 
00205       if ( numberNulls > 0 && numberGoods > 0 )
00207         return true;
00208 
00209       if ( curSimTrackPtr.isNull() == false )
00210       {
00211         if ( theSimTracks.size() > 1 )
00212         {
00213           if ( prevTrack < 0 )
00214             prevTrack = curSimTrackPtr->trackId();
00215 
00216           if ( prevTrack != (int)curSimTrackPtr->trackId() )
00218             return true;
00219 
00220           prevTrack = curSimTrackPtr->trackId();
00221         }
00222       }
00223     }
00224 
00225     if ( numberNulls > 0 && numberGoods == 0 )
00227       return false;
00228 
00230     return false;
00231   }
00232 
00233   template< typename T >
00234   bool L1TkCluster< T >::isUnknown() const
00235   {
00237     for ( unsigned int k = 0; k < theSimTracks.size(); k++ )
00238     {
00239       edm::Ptr< SimTrack > curSimTrackPtr = theSimTracks.at(k);
00240       if ( curSimTrackPtr.isNull() == false )
00242         return false;
00243     }
00245     return true;
00246   }
00247 
00248   template< typename T >
00249   int L1TkCluster< T >::findType() const
00250   {
00251     if ( this->isGenuine() && theSimTracks.size()>0 )
00252       return theSimTracks.at(0)->type();
00253     return 999999999;
00254   }
00255 
00256   template< typename T >
00257   unsigned int L1TkCluster< T >::findSimTrackId() const
00258   {
00259     if ( this->isGenuine() && theSimTracks.size()>0 )
00260       return theSimTracks.at(0)->trackId();
00261     return 0;
00262   }
00263 
00266   template<>
00267   unsigned int L1TkCluster< edm::Ref<edm::PSimHitContainer> >::findWidth() const;
00268 
00271   template< typename T >
00272   unsigned int L1TkCluster< T >::findWidth() const
00273   {
00274     int rowMin = 99999999;
00275     int rowMax = 0;
00278     for ( unsigned int i=0; i<theHits.size(); i++ )
00279     {
00280       if ( theHits.at(i)->row() < rowMin )
00281         rowMin = theHits.at(i)->row();
00282       if ( theHits.at(i)->row() > rowMax )
00283         rowMax = theHits.at(i)->row();
00284     }
00285     return abs( rowMax - rowMin + 1 ); 
00286   }
00287 
00290   template<>
00291   MeasurementPoint L1TkCluster< edm::Ref< edm::PSimHitContainer > >::findHitLocalCoordinates( unsigned int hitIdx ) const;
00292 
00295   template< typename T >
00296   MeasurementPoint L1TkCluster< T >::findHitLocalCoordinates( unsigned int hitIdx ) const
00297   {
00300     MeasurementPoint mp( theHits.at(hitIdx)->row(), theHits.at(hitIdx)->column() );
00301     return mp;
00302   }
00303 
00304 
00307   template<>
00308   MeasurementPoint L1TkCluster< edm::Ref< edm::PSimHitContainer > >::findAverageLocalCoordinates() const;
00309 
00312   template< typename T >
00313   MeasurementPoint L1TkCluster< T >::findAverageLocalCoordinates() const
00314   {
00315     double averageCol = 0.0;
00316     double averageRow = 0.0;
00317 
00319     if ( theHits.size() != 0 )
00320     {
00321       typename std::vector< T >::const_iterator hitIter;
00322       for ( hitIter = theHits.begin();
00323             hitIter != theHits.end();
00324             hitIter++ )
00325       {
00326         averageCol += (*hitIter)->column();
00327         averageRow += (*hitIter)->row();
00328       }
00329       averageCol /= theHits.size();
00330       averageRow /= theHits.size();
00331     }
00332     return MeasurementPoint( averageRow, averageCol );
00333   }
00334 
00335 
00337   template< typename T >
00338   std::string L1TkCluster< T >::print( unsigned int i ) const
00339   {
00340     std::string padding("");
00341     for ( unsigned int j=0; j!=i; ++j )
00342       padding+="\t";
00343     std::stringstream output;
00344     output<<padding<<"L1TkCluster:\n";
00345     padding+='\t';
00346     output << padding << "DetId: " << theDetId.rawId() << '\n';
00347     output << padding << "member: " << theStackMember << ", cluster size: " << theHits.size() << '\n';
00348     return output.str();
00349   }
00350 
00351   template< typename T >
00352   std::ostream& operator << (std::ostream& os, const L1TkCluster< T >& aL1TkCluster) { return ( os<<aL1TkCluster.print() ); }
00353 
00354 
00355 
00356 #endif
00357