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;
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;
00195 unsigned int numberNulls = 0;
00196 unsigned int numberGoods = 0;
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