Go to the documentation of this file.00001 #include "ForIA/Cluster.hh"
00002 #include <gsl/gsl_cdf.h>
00003 #include <cmath>
00004
00005 namespace ForIA{
00006
00007 Cluster::Cluster(): IFourMomentum(),
00008 m_clusIsMC(false), m_useEMScale(true),
00009 m_gotpx(false), m_gotpy(false), m_gotpz(false),
00010 m_hasClusterMoments(false){
00011
00012 }
00014 double Cluster::E(Energy e) const{
00015 double defaultE = m_E_em + m_E_had;
00016 if(!m_useEMScale) defaultE = m_E_calib;
00017 switch(e){
00018 case CALIB:
00019 return m_E_calib;
00020 break;
00021 case EMSCALE:
00022 return m_E_em + m_E_had;
00023 break;
00024 case EM:
00025 return m_E_em;
00026 break;
00027 case HAD:
00028 return m_E_had;
00029 break;
00030 default:
00031 return defaultE;
00032 }
00033 return defaultE;
00034
00035 }
00037 bool Cluster::hasCaloLayerEnergies() const{
00038 return m_hasCaloLayerEnergies;
00039 }
00041 double Cluster::E(CaloLayer layer) const{
00042 switch(layer){
00043
00044 case EMB1:
00045 return m_E_EMB1;
00046 break;
00047 case EMB2:
00048 return m_E_EMB2;
00049 break;
00050 case EMB3:
00051 return m_E_EMB3;
00052 break;
00053 case EME1:
00054 return m_E_EME1;
00055 break;
00056 case EME2:
00057 return m_E_EME2;
00058 break;
00059 case EME3:
00060 return m_E_EME3;
00061 break;
00062 case HEC0:
00063 return m_E_HEC0;
00064 break;
00065 case HEC1:
00066 return m_E_HEC1;
00067 break;
00068 case HEC2:
00069 return m_E_HEC2;
00070 break;
00071 case HEC3:
00072 return m_E_HEC3;
00073 break;
00074 case FCAL0:
00075 return m_E_FCAL0;
00076 break;
00077 case FCAL1:
00078 return m_E_FCAL1;
00079 break;
00080 case FCAL2:
00081 return m_E_FCAL2;
00082 break;
00083 case PreSamplerB:
00084 return m_E_PreSamplerB;
00085 break;
00086 case PreSamplerE:
00087 return m_E_PreSamplerE;
00088 break;
00089 case TileBar0:
00090 return m_E_TileBar0;
00091 break;
00092 case TileBar1:
00093 return m_E_TileBar1;
00094 break;
00095 case TileBar2:
00096 return m_E_TileBar2;
00097 break;
00098 case TileExt0:
00099 return m_E_TileExt0;
00100 break;
00101 case TileExt1:
00102 return m_E_TileExt1;
00103 break;
00104 case TileExt2:
00105 return m_E_TileExt2;
00106 break;
00107 case TileGap1:
00108 return m_E_TileGap1;
00109 break;
00110 case TileGap2:
00111 return m_E_TileGap2;
00112 break;
00113 case TileGap3:
00114 return m_E_TileGap3;
00115 break;
00116
00117 default:
00118 return m_E_em + m_E_had;
00119 }
00120
00121 return m_E_em + m_E_had;
00122 }
00124 double Cluster::E() const{
00125 if (m_useEMScale) return m_E_em + m_E_had;
00126 return m_E_calib;
00128
00129 }
00131 double Cluster::ET() const{
00132 if (m_useEMScale) return ( m_E_em + m_E_had )*sin( 2.*atan(exp(-1.*m_eta)) );
00133 return m_ET;
00134 }
00136 double Cluster::PT() const{
00137 if (m_useEMScale) return ( m_E_em + m_E_had )*sin( 2.*atan(exp(-1.*m_eta)) );
00138 return m_ET;
00139
00140 }
00142 double Cluster::theta() const{
00143 double theta = 2*atan(exp(-1.0*m_eta));
00144 return theta;
00145 }
00147 double Cluster::phi() const{
00148 return m_phi;
00149 }
00151 double Cluster::px()const{
00152 if(m_gotpx) return m_px;
00153 m_px = PT() * sin(phi());
00154 m_gotpx = true;
00155 return m_px;
00156 }
00157
00159 double Cluster::py()const{
00160 if(m_gotpy) return m_py;
00161 m_py = PT() * cos(phi());
00162 m_gotpy = true;
00163 return m_py;
00164 }
00165
00167 double Cluster::pz()const{
00168 if(m_gotpz) return m_pz;
00169 double tanp = tan(theta());
00170 if(fabs(tanp) < 1.e-12){
00171 m_pz = sqrt(E()*E() - M()*M());
00172 }else{
00173 m_pz = PT() / tanp;
00174 }
00175
00176 m_gotpz = true;
00177 return m_pz;
00178 }
00179
00181 double Cluster::phi(CaloLayer layer) const{
00182 switch(layer){
00183 case EMB1:
00184 return m_phi_EMB1;
00185 break;
00186 case EMB2:
00187 return m_phi_EMB2;
00188 break;
00189 case EMB3:
00190 return m_phi_EMB3;
00191 break;
00192 case EME1:
00193 return m_phi_EME1;
00194 break;
00195 case EME2:
00196 return m_phi_EME2;
00197 break;
00198 case EME3:
00199 return m_phi_EME3;
00200 break;
00201 case HEC0:
00202 return m_phi_HEC0;
00203 break;
00204 case HEC1:
00205 return m_phi_HEC1;
00206 break;
00207 case HEC2:
00208 return m_phi_HEC2;
00209 break;
00210 case HEC3:
00211 return m_phi_HEC3;
00212 break;
00213 case FCAL0:
00214 return m_phi_FCAL0;
00215 break;
00216 case FCAL1:
00217 return m_phi_FCAL1;
00218 break;
00219 case FCAL2:
00220 return m_phi_FCAL2;
00221 break;
00222 case PreSamplerB:
00223 return m_phi_PreSamplerB;
00224 break;
00225 case PreSamplerE:
00226 return m_phi_PreSamplerE;
00227 break;
00228 case TileBar0:
00229 return m_phi_TileBar0;
00230 break;
00231 case TileBar1:
00232 return m_phi_TileBar1;
00233 break;
00234 case TileBar2:
00235 return m_phi_TileBar2;
00236 break;
00237 case TileExt0:
00238 return m_phi_TileExt0;
00239 break;
00240 case TileExt1:
00241 return m_phi_TileExt1;
00242 break;
00243 case TileExt2:
00244 return m_phi_TileExt2;
00245 break;
00246 case TileGap1:
00247 return m_phi_TileGap1;
00248 break;
00249 case TileGap2:
00250 return m_phi_TileGap2;
00251 break;
00252 case TileGap3:
00253 return m_phi_TileGap3;
00254 break;
00255 default:
00256 return m_phi;
00257 }
00258 return m_phi;
00259 }
00261 double Cluster::eta() const{
00262 return m_eta;
00263 }
00265 double Cluster::eta(CaloLayer layer) const{
00266 switch(layer){
00267 case EMB1:
00268 return m_eta_EMB1;
00269 break;
00270 case EMB2:
00271 return m_eta_EMB2;
00272 break;
00273 case EMB3:
00274 return m_eta_EMB3;
00275 break;
00276 case EME1:
00277 return m_eta_EME1;
00278 break;
00279 case EME2:
00280 return m_eta_EME2;
00281 break;
00282 case EME3:
00283 return m_eta_EME3;
00284 break;
00285 case HEC0:
00286 return m_eta_HEC0;
00287 break;
00288 case HEC1:
00289 return m_eta_HEC1;
00290 break;
00291 case HEC2:
00292 return m_eta_HEC2;
00293 case HEC3:
00294 return m_eta_HEC3;
00295 break;
00296 case FCAL0:
00297 return m_eta_FCAL0;
00298 break;
00299 case FCAL1:
00300 return m_eta_FCAL1;
00301 break;
00302 case FCAL2:
00303 return m_eta_FCAL2;
00304 break;
00305 case PreSamplerB:
00306 return m_eta_PreSamplerB;
00307 break;
00308 case PreSamplerE:
00309 return m_eta_PreSamplerE;
00310 break;
00311 case TileBar0:
00312 return m_eta_TileBar0;
00313 break;
00314 case TileBar1:
00315 return m_eta_TileBar1;
00316 break;
00317 case TileBar2:
00318 return m_eta_TileBar2;
00319 break;
00320 case TileExt0:
00321 return m_eta_TileExt0;
00322 break;
00323 case TileExt1:
00324 return m_eta_TileExt1;
00325 break;
00326 case TileExt2:
00327 return m_eta_TileExt2;
00328 break;
00329 case TileGap1:
00330 return m_eta_TileGap1;
00331 break;
00332 case TileGap2:
00333 return m_eta_TileGap2;
00334 break;
00335 case TileGap3:
00336 return m_eta_TileGap3;
00337 break;
00338 default:
00339 return m_eta;
00340 }
00341 return m_eta;
00342 }
00344 double Cluster::M() const{
00345 std::cout<<"Warning: Using massless clusters!"<<std::endl;
00346 return 0.0;
00347
00348 }
00350 bool Cluster::hasClusterMoments() const{
00351 return m_hasClusterMoments;
00352 }
00354 double Cluster::cellMaxFrac() const{
00355 return m_cellmaxfrac;
00356 }
00358 double Cluster::centerLambda() const{
00359 return m_centerlambda;
00360 }
00362 double Cluster::firstEdens() const{
00363 return m_firstEdens;
00364 }
00366 double Cluster::lateral() const{
00367 return m_lateral;
00368 }
00370 double Cluster::longitudinal() const{
00371 return m_longitudinal;
00372 }
00374 double Cluster::secondR() const{
00375 return m_secondR;
00376 }
00378 double Cluster::secondLambda() const{
00379 return m_secondlambda;
00380 }
00382 double Cluster::time() const{
00383 return m_time;
00384 }
00386 double Cluster::deltaPhi() const{
00387 return m_deltaPhi;
00388 }
00390 double Cluster::deltaTheta() const{
00391 return m_deltaTheta;
00392 }
00393
00394 void Cluster::scaleEnergy(double scaleFactor) const {
00395 m_E_calib *= scaleFactor;
00396 m_E_em *= scaleFactor;
00397 m_E_had *= scaleFactor;
00398 m_ET *= scaleFactor;
00399 m_PT *= scaleFactor;
00400 m_M *= scaleFactor;
00401
00402 m_gotpx = false;
00403 m_gotpy = false;
00404 m_gotpz = false;
00405 return;
00406 }
00407
00408
00409 void Cluster::setUseEMScale(bool useEmScale) const {
00410 m_useEMScale = useEmScale;
00411 return;
00412 }
00413
00415 std::ostream &operator << (std::ostream &out, const Cluster &clus){
00416 out<<"Cluster: { E_calib: "<<clus.m_E_calib;
00417 out<<" , E_EM: "<<clus.m_E_em;
00418 out<<" , E_HAD: "<<clus.m_E_had;
00419 out<<" , ET: "<<clus.m_ET;
00420 out<<" , eta: "<<clus.m_eta;
00421 out<<" , phi: "<<clus.m_phi;
00422 out<<" , M: "<<clus.m_M;
00423 out<<"}";
00424 return out;
00425 }
00426
00427
00428 }