#include <RecoLocalCalo/EcalDeadChannelRecoveryAlgos/src/EcalDeadChannelRecoveryAlgos.cc>
Public Member Functions | |
EcalRecHit | Correct (const EBDetId Id, const EcalRecHitCollection *hit_collection, std::string algo_, double Sum8Cut) |
EcalRecHit | correct (const EBDetId Id, const EcalRecHitCollection *hit_collection, std::string algo_, double Sum8Cut) |
EcalDeadChannelRecoveryAlgos () | |
EcalDeadChannelRecoveryAlgos (const CaloTopology *theCaloTopology) | |
~EcalDeadChannelRecoveryAlgos () | |
Private Member Functions | |
double | MakeNxNMatrice (EBDetId itID, const EcalRecHitCollection *hit_collection, int *IndDeadChannel, double *MNxN) |
Private Attributes | |
const CaloTopology * | calotopo |
Description: <one line="" class="" summary>="">
Implementation: <Notes on="" implementation>="">
Definition at line 35 of file EcalDeadChannelRecoveryAlgos.h.
EcalDeadChannelRecoveryAlgos::EcalDeadChannelRecoveryAlgos | ( | const CaloTopology * | theCaloTopology | ) |
Definition at line 51 of file EcalDeadChannelRecoveryAlgos.cc.
{ //now do what ever initialization is needed calotopo = theCaloTopology; }
EcalDeadChannelRecoveryAlgos::EcalDeadChannelRecoveryAlgos | ( | ) |
EcalDeadChannelRecoveryAlgos::~EcalDeadChannelRecoveryAlgos | ( | ) |
Definition at line 59 of file EcalDeadChannelRecoveryAlgos.cc.
{ // do anything here that needs to be done at desctruction time // (e.g. close files, deallocate resources etc.) }
EcalRecHit EcalDeadChannelRecoveryAlgos::Correct | ( | const EBDetId | Id, |
const EcalRecHitCollection * | hit_collection, | ||
std::string | algo_, | ||
double | Sum8Cut | ||
) |
Definition at line 109 of file EcalDeadChannelRecoveryAlgos.cc.
{ return correct(Id, hit_collection, algo_, Sum8Cut); }
EcalRecHit EcalDeadChannelRecoveryAlgos::correct | ( | const EBDetId | Id, |
const EcalRecHitCollection * | hit_collection, | ||
std::string | algo_, | ||
double | Sum8Cut | ||
) |
Definition at line 73 of file EcalDeadChannelRecoveryAlgos.cc.
References CorrectDeadChannelsClassic(), CorrectDeadChannelsNN(), and EBDetId::ieta().
{ double NewEnergy=0.0; double MNxN[121]; int IndDeadChannel[1]={-1}; double sum8 = MakeNxNMatrice(Id,hit_collection,IndDeadChannel,MNxN); if(algo_=="Spline"){ if(sum8>Sum8Cut){ if(IndDeadChannel[0]>0)NewEnergy = CorrectDeadChannelsClassic(MNxN,Id.ieta()); } }else if(algo_=="NeuralNetworks"){ if(sum8>Sum8Cut){ if(IndDeadChannel[0]>0)NewEnergy = CorrectDeadChannelsNN(MNxN); } } // protect against non physical high values // < sum(energy in neighbours) > = 0.8 * xtal with maximum energy // => can choose 5 as highest possible energy to be assigned to // the dead channel uint32_t flag = 0; if ( NewEnergy > 5. * sum8 ) { NewEnergy = 0; //flag = EcalRecHit::kDead; } EcalRecHit NewHit(Id,NewEnergy,0, flag); return NewHit; }
double EcalDeadChannelRecoveryAlgos::MakeNxNMatrice | ( | EBDetId | itID, |
const EcalRecHitCollection * | hit_collection, | ||
int * | IndDeadChannel, | ||
double * | MNxN | ||
) | [private] |
Definition at line 121 of file EcalDeadChannelRecoveryAlgos.cc.
References abs, DetId::Ecal, EcalBarrel, edm::SortedCollection< T, SORT >::end(), edm::SortedCollection< T, SORT >::find(), CaloSubdetectorTopology::getWindow(), i, EBDetId::ieta(), createXMLFile::iphi, EBDetId::iphi(), DetId::null(), and findQualityFiles::size.
{ // std::cout<<" In MakeNxNMatrice "<<std::endl; //Build NxN around a given cristal for(int i=0; i<121;i++)MNxN[i]=0.0; // std::cout<<"===================================================================="<<std::endl; // std::cout<<" Dead Cell CENTRAL eta = "<< itID.ieta()<<" , phi = "<< itID.iphi()<<std::endl; const CaloSubdetectorTopology* topology=calotopo->getSubdetectorTopology(DetId::Ecal,EcalBarrel); int size =5; std::vector<DetId> NxNaroundDC = topology->getWindow(itID,size,size); // std::cout<<"===================================================================="<<std::endl; // std::cout<<"NxNaroundDC size is = "<<NxNaroundDC.size()<<std::endl; std::vector<DetId>::const_iterator theCells; EBDetId EBCellMax = itID; double EnergyMax = 0.0; for(theCells=NxNaroundDC.begin();theCells<NxNaroundDC.end();theCells++){ EBDetId EBCell = EBDetId(*theCells); // We Will look for the cristal with maximum energy if(!EBCell.null()){ EcalRecHitCollection::const_iterator goS_it = hit_collection->find(EBCell); if( goS_it != hit_collection->end() && goS_it->energy()>=EnergyMax){EnergyMax=goS_it->energy(); EBCellMax = EBCell;} }else{ continue; } } if(EBCellMax.null()){/*cout<<" Error No maximum found around dead channel, no corrections applied"<<std::endl;*/return 0;} // std::cout << " Max Cont Crystal eta phi E = " << EBCellMax.ieta() <<" "<< EBCellMax.iphi() <<" "<< EnergyMax<<std::endl; //NxNaroundMaxCont with N==11 // 000 is now the maximum containement one: //Any modification of the following parameters will require changes in the Correction algos // The window is large enought to avoid modification of the number. int FixedSize =11; std::vector<DetId> NxNaroundMaxCont = topology->getWindow(EBCellMax,FixedSize,FixedSize); double ESUMis=0.0; int theIndex=0; std::vector<DetId>::const_iterator itCells; for(itCells=NxNaroundMaxCont.begin();itCells<NxNaroundMaxCont.end();itCells++){ EBDetId EBitCell = EBDetId(*itCells); int CReta = EBitCell.ieta(); int CRphi = EBitCell.iphi(); double Energy = 0.0; if(!EBitCell.null()){ EcalRecHitCollection::const_iterator goS_it = hit_collection->find(EBitCell); if( goS_it != hit_collection->end() ) Energy=goS_it->energy(); } // std::cout<<"Around DC we have eta,phi,E "<<CReta<<" "<<CRphi<<" "<<Energy<<std::endl; //============ int ietaCorr = 0; if((CReta * EBCellMax.ieta()) < 0 && EBCellMax.ieta()>0 )ietaCorr= -1; if((CReta * EBCellMax.ieta()) < 0 && EBCellMax.ieta()<0 )ietaCorr= 1; if((CReta * EBCellMax.ieta()) > 0 )ietaCorr= 0; int ieta = -( (CReta -ietaCorr) - EBCellMax.ieta() ) + int((FixedSize - 1)/2); int iphiCorr = 0; if((CRphi - EBCellMax.iphi())> 50)iphiCorr= 360; if((CRphi - EBCellMax.iphi())<-50)iphiCorr=-360; int iphi = CRphi - EBCellMax.iphi() - iphiCorr + int((FixedSize - 1)/2); int MIndex = ieta+iphi*FixedSize; if(abs(CReta)<=85) MNxN[MIndex]=Energy; if(EBitCell == itID)IndDeadChannel[0]= MIndex; //============ //We add up the energy in 5x5 around the MaxCont to decide if we will correct for DCs // if(theIndex>=36 && theIndex<=40)ESUMis += Energy; //SB: Modify to sum8 only if(theIndex>=48 && theIndex<=50)ESUMis += Energy; if(theIndex>=59 && theIndex<=61)ESUMis += Energy; if(theIndex>=70 && theIndex<=72)ESUMis += Energy; // if(theIndex>=80 && theIndex<=84)ESUMis += Energy; theIndex++; } // std::cout<<"Around MaxCont Collected Energy in 5x5 is = "<< ESUMis <<std::endl; //So now, we have a vector which is ordered around the Maximum containement and which contains a dead channel as: //Filling of the vector : NxNaroundDC with N==11 Typo are possible... // 000 is Maximum containement which is in +/- 5 from DC // // 120 119 118 117 116 115 114 113 112 111 110 // 109 108 107 106 105 104 103 102 101 100 099 // 098 097 096 095 094 093 092 091 090 089 088 // 087 086 085 084 083 082 081 080 079 078 077 // 076 075 074 073 072 071 070 069 068 067 066 // 065 064 063 062 061 060 059 058 057 056 055 // 054 053 052 051 050 049 048 047 046 045 044 // 043 042 041 040 039 038 037 036 035 034 033 // 032 031 030 029 028 027 026 025 024 023 022 // 021 020 019 018 017 016 015 014 013 012 011 // 010 009 008 007 006 005 004 003 002 001 000 //================ return ESUMis; }
const CaloTopology* EcalDeadChannelRecoveryAlgos::calotopo [private] |
Definition at line 47 of file EcalDeadChannelRecoveryAlgos.h.