Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <cmath>
00016
00017
00018 #include "CondFormats/L1TObjects/interface/L1CaloGeometry.h"
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 L1CaloGeometry::L1CaloGeometry()
00057 : m_version( kOrig ),
00058 m_numberGctEmJetPhiBins( 0 ),
00059 m_numberGctEtSumPhiBins( 0 ),
00060 m_numberGctHtSumPhiBins( 0 ),
00061 m_numberGctCentralEtaBinsPerHalf( 0 ),
00062 m_numberGctForwardEtaBinsPerHalf( 0 ),
00063 m_etaSignBitOffset( 0 ),
00064 m_gctEtaBinBoundaries(),
00065 m_etaBinsPerHalf( 0 ),
00066 m_gctEmJetPhiBinWidth( 0. ),
00067 m_gctEtSumPhiBinWidth( 0. ),
00068 m_gctHtSumPhiBinWidth( 0. ),
00069 m_gctEmJetPhiOffset( 0. ),
00070 m_gctEtSumPhiOffset( 0. ),
00071 m_gctHtSumPhiOffset( 0. )
00072 {
00073 }
00074
00075 L1CaloGeometry::L1CaloGeometry( unsigned int numberGctEmJetPhiBins,
00076 double gctEmJetPhiBinOffset,
00077 unsigned int numberGctEtSumPhiBins,
00078 double gctEtSumPhiBinOffset,
00079 unsigned int numberGctHtSumPhiBins,
00080 double gctHtSumPhiBinOffset,
00081 unsigned int numberGctCentralEtaBinsPerHalf,
00082 unsigned int numberGctForwardEtaBinsPerHalf,
00083 unsigned int etaSignBitOffset,
00084 const std::vector<double>& gctEtaBinBoundaries)
00085 : m_version( kAddedMHTPhi ),
00086 m_numberGctEmJetPhiBins( numberGctEmJetPhiBins ),
00087 m_numberGctEtSumPhiBins( numberGctEtSumPhiBins ),
00088 m_numberGctHtSumPhiBins( numberGctHtSumPhiBins ),
00089 m_numberGctCentralEtaBinsPerHalf( numberGctCentralEtaBinsPerHalf ),
00090 m_numberGctForwardEtaBinsPerHalf( numberGctForwardEtaBinsPerHalf ),
00091 m_etaSignBitOffset( etaSignBitOffset ),
00092 m_gctEtaBinBoundaries( gctEtaBinBoundaries )
00093 {
00094 m_etaBinsPerHalf =
00095 m_numberGctCentralEtaBinsPerHalf + m_numberGctForwardEtaBinsPerHalf ;
00096
00097 m_gctEmJetPhiBinWidth = 2. * M_PI / m_numberGctEmJetPhiBins ;
00098 m_gctEtSumPhiBinWidth = 2. * M_PI / m_numberGctEtSumPhiBins ;
00099 m_gctHtSumPhiBinWidth = 2. * M_PI / m_numberGctHtSumPhiBins ;
00100
00101 m_gctEmJetPhiOffset = gctEmJetPhiBinOffset * m_gctEmJetPhiBinWidth ;
00102 m_gctEtSumPhiOffset = gctEtSumPhiBinOffset * m_gctEtSumPhiBinWidth ;
00103 m_gctHtSumPhiOffset = gctHtSumPhiBinOffset * m_gctHtSumPhiBinWidth ;
00104 }
00105
00106
00107
00108
00109
00110
00111 L1CaloGeometry::~L1CaloGeometry()
00112 {
00113 }
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 double
00136 L1CaloGeometry::globalEtaBinCenter( unsigned int globalEtaIndex ) const
00137 {
00138 int etaIndex ;
00139 double etaSign = 1. ;
00140 if( globalEtaIndex < m_etaBinsPerHalf )
00141 {
00142 etaIndex = m_etaBinsPerHalf - globalEtaIndex - 1 ;
00143 etaSign = -1. ;
00144 }
00145 else
00146 {
00147 etaIndex = globalEtaIndex - m_etaBinsPerHalf ;
00148 }
00149
00150 return 0.5 * etaSign *
00151 ( m_gctEtaBinBoundaries[ etaIndex ] +
00152 m_gctEtaBinBoundaries[ etaIndex + 1 ] ) ;
00153 }
00154
00155 double
00156 L1CaloGeometry::globalEtaBinLowEdge( unsigned int globalEtaIndex ) const
00157 {
00158 int etaIndex ;
00159 double etaSign = 1. ;
00160 if( globalEtaIndex < m_etaBinsPerHalf )
00161 {
00162 etaIndex = m_etaBinsPerHalf - globalEtaIndex - 1 ;
00163 etaSign = -1. ;
00164 }
00165 else
00166 {
00167 etaIndex = globalEtaIndex - m_etaBinsPerHalf ;
00168 }
00169
00170 return ( etaSign > 0. ?
00171 m_gctEtaBinBoundaries[ etaIndex ] :
00172 -m_gctEtaBinBoundaries[ etaIndex + 1 ] ) ;
00173 }
00174
00175 double
00176 L1CaloGeometry::globalEtaBinHighEdge( unsigned int globalEtaIndex ) const
00177 {
00178 int etaIndex ;
00179 double etaSign = 1. ;
00180 if( globalEtaIndex < m_etaBinsPerHalf )
00181 {
00182 etaIndex = m_etaBinsPerHalf - globalEtaIndex - 1 ;
00183 etaSign = -1. ;
00184 }
00185 else
00186 {
00187 etaIndex = globalEtaIndex - m_etaBinsPerHalf ;
00188 }
00189
00190 return ( etaSign > 0. ?
00191 m_gctEtaBinBoundaries[ etaIndex + 1 ] :
00192 -m_gctEtaBinBoundaries[ etaIndex ] ) ;
00193 }
00194
00195 double
00196 L1CaloGeometry::etaBinCenter( unsigned int etaIndex,
00197 bool central ) const
00198 {
00199
00200
00201 double etaSign = 1. ;
00202
00203
00204 if( etaIndex >= m_etaSignBitOffset )
00205 {
00206 etaSign = -1. ;
00207 etaIndex -= m_etaSignBitOffset ;
00208 }
00209
00210
00211 if( !central )
00212 {
00213 etaIndex += m_numberGctCentralEtaBinsPerHalf ;
00214 }
00215
00216 return 0.5 * etaSign *
00217 ( m_gctEtaBinBoundaries[ etaIndex ] +
00218 m_gctEtaBinBoundaries[ etaIndex + 1 ] ) ;
00219 }
00220
00221 double
00222 L1CaloGeometry::etaBinLowEdge( unsigned int etaIndex,
00223 bool central ) const
00224 {
00225
00226
00227 double etaSign = 1. ;
00228
00229
00230 if( etaIndex >= m_etaSignBitOffset )
00231 {
00232 etaSign = -1. ;
00233 etaIndex -= m_etaSignBitOffset ;
00234 }
00235
00236
00237 if( !central )
00238 {
00239 etaIndex += m_numberGctCentralEtaBinsPerHalf ;
00240 }
00241
00242 return ( etaSign > 0. ?
00243 m_gctEtaBinBoundaries[ etaIndex ] :
00244 -m_gctEtaBinBoundaries[ etaIndex + 1 ] ) ;
00245 }
00246
00247 double
00248 L1CaloGeometry::etaBinHighEdge( unsigned int etaIndex,
00249 bool central ) const
00250 {
00251
00252
00253 double etaSign = 1. ;
00254
00255
00256 if( etaIndex >= m_etaSignBitOffset )
00257 {
00258 etaSign = -1. ;
00259 etaIndex -= m_etaSignBitOffset ;
00260 }
00261
00262
00263 if( !central )
00264 {
00265 etaIndex += m_numberGctCentralEtaBinsPerHalf ;
00266 }
00267
00268 return ( etaSign > 0. ?
00269 m_gctEtaBinBoundaries[ etaIndex + 1 ] :
00270 -m_gctEtaBinBoundaries[ etaIndex ] ) ;
00271 }
00272
00273 double
00274 L1CaloGeometry::emJetPhiBinCenter( unsigned int phiIndex ) const
00275 {
00276 return ( ( double ) phiIndex + 0.5 ) * m_gctEmJetPhiBinWidth +
00277 m_gctEmJetPhiOffset ;
00278 }
00279
00280 double
00281 L1CaloGeometry::emJetPhiBinLowEdge( unsigned int phiIndex ) const
00282 {
00283 return ( ( double ) phiIndex ) * m_gctEmJetPhiBinWidth +
00284 m_gctEmJetPhiOffset ;
00285 }
00286
00287 double
00288 L1CaloGeometry::emJetPhiBinHighEdge( unsigned int phiIndex ) const
00289 {
00290 return ( ( double ) phiIndex + 1. ) * m_gctEmJetPhiBinWidth +
00291 m_gctEmJetPhiOffset ;
00292 }
00293
00294 double
00295 L1CaloGeometry::etSumPhiBinCenter( unsigned int phiIndex ) const
00296 {
00297 return ( ( double ) phiIndex + 0.5 ) * m_gctEtSumPhiBinWidth +
00298 m_gctEtSumPhiOffset ;
00299 }
00300
00301 double
00302 L1CaloGeometry::etSumPhiBinLowEdge( unsigned int phiIndex ) const
00303 {
00304 return ( ( double ) phiIndex ) * m_gctEtSumPhiBinWidth +
00305 m_gctEtSumPhiOffset ;
00306 }
00307
00308 double
00309 L1CaloGeometry::etSumPhiBinHighEdge( unsigned int phiIndex ) const
00310 {
00311 return ( ( double ) phiIndex + 1. ) * m_gctEtSumPhiBinWidth +
00312 m_gctEtSumPhiOffset ;
00313 }
00314
00315 double
00316 L1CaloGeometry::htSumPhiBinCenter( unsigned int phiIndex ) const
00317 {
00318 if( m_version == kOrig )
00319 {
00320 return ( ( double ) phiIndex + 0.5 ) * m_gctEtSumPhiBinWidth * 4. +
00321 m_gctEtSumPhiOffset ;
00322 }
00323 else
00324 {
00325 return ( ( double ) phiIndex + 0.5 ) * m_gctHtSumPhiBinWidth +
00326 m_gctHtSumPhiOffset ;
00327 }
00328 }
00329
00330 double
00331 L1CaloGeometry::htSumPhiBinLowEdge( unsigned int phiIndex ) const
00332 {
00333 if( m_version == kOrig )
00334 {
00335 return ( ( double ) phiIndex ) * m_gctEtSumPhiBinWidth * 4. +
00336 m_gctEtSumPhiOffset ;
00337 }
00338 else
00339 {
00340 return ( ( double ) phiIndex ) * m_gctHtSumPhiBinWidth +
00341 m_gctHtSumPhiOffset ;
00342 }
00343 }
00344
00345 double
00346 L1CaloGeometry::htSumPhiBinHighEdge( unsigned int phiIndex ) const
00347 {
00348 if( m_version == kOrig )
00349 {
00350 return ( ( double ) phiIndex + 1. ) * m_gctEtSumPhiBinWidth * 4. +
00351 m_gctEtSumPhiOffset ;
00352 }
00353 else
00354 {
00355 return ( ( double ) phiIndex + 1. ) * m_gctHtSumPhiBinWidth +
00356 m_gctHtSumPhiOffset ;
00357 }
00358 }
00359
00360 unsigned int
00361 L1CaloGeometry::etaIndex( const double& etaValue ) const
00362 {
00363 unsigned int etaIndex = 0 ;
00364
00365 for( unsigned int i = 0 ; i < m_numberGctCentralEtaBinsPerHalf ; ++i )
00366 {
00367 if( fabs( etaValue ) >= m_gctEtaBinBoundaries[ i ] )
00368 {
00369 etaIndex = i ;
00370 }
00371 }
00372
00373 for( unsigned int i = 0 ; i < m_numberGctForwardEtaBinsPerHalf ; ++i )
00374 {
00375 if( fabs( etaValue ) >=
00376 m_gctEtaBinBoundaries[ i + m_numberGctCentralEtaBinsPerHalf ] )
00377 {
00378 etaIndex = i ;
00379 }
00380 }
00381
00382 if( etaValue < 0. )
00383 {
00384 etaIndex += m_etaSignBitOffset ;
00385 }
00386
00387 return etaIndex ;
00388 }
00389
00390 unsigned int
00391 L1CaloGeometry::globalEtaIndex( const double& etaValue ) const
00392 {
00393 unsigned int etaIndex = 0 ;
00394
00395 if( etaValue < 0. )
00396 {
00397 for( unsigned int i = m_etaBinsPerHalf ; i > 0 ; --i )
00398 {
00399 if( fabs( etaValue ) < m_gctEtaBinBoundaries[ i ] )
00400 {
00401 etaIndex = m_etaBinsPerHalf - i ;
00402 }
00403 }
00404 }
00405 else
00406 {
00407 for( unsigned int i = 0 ; i < m_etaBinsPerHalf ; ++i )
00408 {
00409 if( etaValue >= m_gctEtaBinBoundaries[ i ] )
00410 {
00411 etaIndex = i + m_etaBinsPerHalf ;
00412 }
00413 }
00414 }
00415
00416 return etaIndex ;
00417 }
00418
00419 unsigned int
00420 L1CaloGeometry::emJetPhiIndex( const double& phiValue ) const
00421 {
00422 double phiAdjusted = phiValue - m_gctEmJetPhiOffset ;
00423
00424
00425 if( phiAdjusted < 0. )
00426 {
00427 do
00428 {
00429 phiAdjusted += 2. * M_PI ;
00430 }
00431 while( phiAdjusted < 0. ) ;
00432 }
00433 else if( phiAdjusted > 2. * M_PI )
00434 {
00435 do
00436 {
00437 phiAdjusted -= 2. * M_PI ;
00438 }
00439 while( phiAdjusted > 2. * M_PI ) ;
00440 }
00441
00442 return ( ( int ) ( phiAdjusted / m_gctEmJetPhiBinWidth ) ) ;
00443 }
00444
00445 unsigned int
00446 L1CaloGeometry::etSumPhiIndex( const double& phiValue ) const
00447 {
00448 double phiAdjusted = phiValue - m_gctEtSumPhiOffset ;
00449
00450
00451 if( phiAdjusted < 0. )
00452 {
00453 do
00454 {
00455 phiAdjusted += 2. * M_PI ;
00456 }
00457 while( phiAdjusted < 0. ) ;
00458 }
00459 else if( phiAdjusted > 2. * M_PI )
00460 {
00461 do
00462 {
00463 phiAdjusted -= 2. * M_PI ;
00464 }
00465 while( phiAdjusted > 2. * M_PI ) ;
00466 }
00467
00468 return ( ( int ) ( phiAdjusted / m_gctEtSumPhiBinWidth ) ) ;
00469 }
00470
00471 unsigned int
00472 L1CaloGeometry::htSumPhiIndex( const double& phiValue ) const
00473 {
00474 double phiAdjusted = phiValue - m_gctEtSumPhiOffset ;
00475
00476
00477 if( phiAdjusted < 0. )
00478 {
00479 do
00480 {
00481 phiAdjusted += 2. * M_PI ;
00482 }
00483 while( phiAdjusted < 0. ) ;
00484 }
00485 else if( phiAdjusted > 2. * M_PI )
00486 {
00487 do
00488 {
00489 phiAdjusted -= 2. * M_PI ;
00490 }
00491 while( phiAdjusted > 2. * M_PI ) ;
00492 }
00493
00494 if( m_version == kOrig )
00495 {
00496 return ( ( int ) ( phiAdjusted / ( m_gctEtSumPhiBinWidth * 4. ) ) ) ;
00497 }
00498 else
00499 {
00500 return ( ( int ) ( phiAdjusted / m_gctHtSumPhiBinWidth ) ) ;
00501 }
00502 }
00503
00504 unsigned int
00505 L1CaloGeometry::numberGctHtSumPhiBins() const
00506 {
00507 if( m_version == kOrig )
00508 {
00509 return m_numberGctEtSumPhiBins / 4 ;
00510 }
00511 else
00512 {
00513 return m_numberGctHtSumPhiBins ;
00514 }
00515 }
00516
00517 std::ostream& operator << ( std::ostream& os, const L1CaloGeometry& obj )
00518 {
00519 os << "L1CaloGeometry:" << std::endl ;
00520
00521 os << "Central/tau eta bins: low / center / high" << std::endl ;
00522 for( unsigned int i = 0 ; i < obj.numberGctCentralEtaBinsPerHalf() ; ++i )
00523 {
00524 os << " bin " << i << ": "
00525 << obj.etaBinLowEdge( i ) << " / "
00526 << obj.etaBinCenter( i ) << " / "
00527 << obj.etaBinHighEdge( i )
00528 << std::endl ;
00529 }
00530
00531 os << "Forward eta bins: low / center / high" << std::endl ;
00532 for( unsigned int i = 0 ; i < obj.numberGctForwardEtaBinsPerHalf() ; ++i )
00533 {
00534 os << " bin " << i << ": "
00535 << obj.etaBinLowEdge( i, false ) << " / "
00536 << obj.etaBinCenter( i, false ) << " / "
00537 << obj.etaBinHighEdge( i, false )
00538 << std::endl ;
00539 }
00540
00541 os << "Global eta bins: low / center / high" << std::endl ;
00542 for( unsigned int i = 0 ; i < obj.numberGctCentralEtaBinsPerHalf() +
00543 obj.numberGctForwardEtaBinsPerHalf() ; ++i )
00544 {
00545 os << " bin " << i << ": "
00546 << obj.globalEtaBinLowEdge( i ) << " / "
00547 << obj.globalEtaBinCenter( i ) << " / "
00548 << obj.globalEtaBinHighEdge( i )
00549 << std::endl ;
00550 }
00551
00552 os << "EM/jet phi bins: low / center / high" << std::endl ;
00553 for( unsigned int i = 0 ; i < obj.numberGctEmJetPhiBins() ; ++i )
00554 {
00555 os << " bin " << i << ": "
00556 << obj.emJetPhiBinLowEdge( i ) << " / "
00557 << obj.emJetPhiBinCenter( i ) << " / "
00558 << obj.emJetPhiBinHighEdge( i )
00559 << std::endl ;
00560 }
00561
00562 os << "Et sum phi bins: low / center / high" << std::endl ;
00563 for( unsigned int i = 0 ; i < obj.numberGctEtSumPhiBins() ; ++i )
00564 {
00565 os << " bin " << i << ": "
00566 << obj.etSumPhiBinLowEdge( i ) << " / "
00567 << obj.etSumPhiBinCenter( i ) << " / "
00568 << obj.etSumPhiBinHighEdge( i )
00569 << std::endl ;
00570 }
00571
00572 os << "Ht sum phi bins: low / center / high" << std::endl ;
00573 for( unsigned int i = 0 ; i < obj.numberGctHtSumPhiBins() ; ++i )
00574 {
00575 os << " bin " << i << ": "
00576 << obj.htSumPhiBinLowEdge( i ) << " / "
00577 << obj.htSumPhiBinCenter( i ) << " / "
00578 << obj.htSumPhiBinHighEdge( i )
00579 << std::endl ;
00580 }
00581
00582 return os ;
00583 }
00584
00585
00586
00587