8 #include <TDirectory.h>
12 for (
int id = 0;
id < 9; ++id) {
21 for (
int id = 0;
id < 9; ++id) {
46 auto t = std::make_unique<TTree>(
"t",
"dummy MLP tree");
49 t->Branch(
"z1", &(ctx.
tmp[0]),
"z1/D");
50 t->Branch(
"z2", &(ctx.
tmp[1]),
"z2/D");
51 t->Branch(
"z3", &(ctx.
tmp[2]),
"z3/D");
52 t->Branch(
"z4", &(ctx.
tmp[3]),
"z4/D");
53 t->Branch(
"z5", &(ctx.
tmp[4]),
"z5/D");
54 t->Branch(
"z6", &(ctx.
tmp[5]),
"z6/D");
55 t->Branch(
"z7", &(ctx.
tmp[6]),
"z7/D");
56 t->Branch(
"z8", &(ctx.
tmp[7]),
"z8/D");
57 t->Branch(
"zf", &(ctx.
tmp[8]),
"zf/D");
67 auto resetGDirectory = [](TDirectory* oldDir) {gDirectory = oldDir;};
68 std::unique_ptr<TDirectory, decltype(resetGDirectory)> guard(gDirectory, resetGDirectory);
71 std::make_unique<TMultiLayerPerceptron>(
"@z1,@z2,@z3,@z4,@z5,@z6,@z7,@z8:10:5:zf", ctx.
tree.get());
73 ctx.
mlp->LoadWeights(path.c_str());
78 std::string p =
"RecoLocalCalo/EcalDeadChannelRecoveryAlgos/data/NNWeights/";
93 std::string p =
"RecoLocalCalo/EcalDeadChannelRecoveryAlgos/data/NNWeights/";
106 template <
typename T>
112 double NewEnergy = 0.0;
114 double NewEnergy_RelMC = 0.0;
115 double NewEnergy_RelDC = 0.0;
117 double MNxN_RelMC[9] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } ;
118 double MNxN_RelDC[9] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } ;
122 double sum8_RelMC = makeNxNMatrice_RelMC(
id, hit_collection, MNxN_RelMC,AcceptFlag);
123 double sum8_RelDC = makeNxNMatrice_RelDC(
id, hit_collection, MNxN_RelDC,AcceptFlag);
127 if (sum8_RelDC > Sum8Cut && sum8_RelMC > Sum8Cut) {
128 NewEnergy_RelMC = estimateEnergy(MNxN_RelMC);
129 NewEnergy_RelDC = estimateEnergy(MNxN_RelDC);
134 double SumMNxN_RelMC = MNxN_RelMC[LU] + MNxN_RelMC[UU] + MNxN_RelMC[RU] +
135 MNxN_RelMC[LL] + MNxN_RelMC[CC] + MNxN_RelMC[RR] +
136 MNxN_RelMC[LD] + MNxN_RelMC[DD] + MNxN_RelMC[RD] ;
138 double frMNxN_RelMC[9];
for (
int i=0;
i<9;
i++) { frMNxN_RelMC[
i] = MNxN_RelMC[
i] / SumMNxN_RelMC ; }
140 double prMNxN_RelMC = P::Diagonal( frMNxN_RelMC[LU] ) * P::UpDown( frMNxN_RelMC[UU] ) * P::Diagonal( frMNxN_RelMC[RU] ) *
141 P::ReftRight( frMNxN_RelMC[LL] ) * P::Central( frMNxN_RelMC[CC] ) * P::ReftRight( frMNxN_RelMC[RR] ) *
142 P::Diagonal( frMNxN_RelMC[LD] ) * P::UpDown( frMNxN_RelMC[DD] ) * P::Diagonal( frMNxN_RelMC[RD] ) ;
144 double SumMNxN_RelDC = MNxN_RelDC[LU] + MNxN_RelDC[UU] + MNxN_RelDC[RU] +
145 MNxN_RelDC[LL] + MNxN_RelDC[CC] + MNxN_RelDC[RR] +
146 MNxN_RelDC[LD] + MNxN_RelDC[DD] + MNxN_RelDC[RD] ;
148 double frMNxN_RelDC[9];
for (
int i=0;
i<9;
i++) { frMNxN_RelDC[
i] = MNxN_RelDC[
i] / SumMNxN_RelDC ; }
150 double prMNxN_RelDC = P::Diagonal( frMNxN_RelDC[LU] ) * P::UpDown( frMNxN_RelDC[UU] ) * P::Diagonal( frMNxN_RelDC[RU] ) *
151 P::ReftRight( frMNxN_RelDC[LL] ) * P::Central( frMNxN_RelDC[CC] ) * P::ReftRight( frMNxN_RelDC[RR] ) *
152 P::Diagonal( frMNxN_RelDC[LD] ) * P::UpDown( frMNxN_RelDC[DD] ) * P::Diagonal( frMNxN_RelDC[RD] ) ;
154 if ( prMNxN_RelDC > prMNxN_RelMC ) { NewEnergy = NewEnergy_RelDC ; sum8 = sum8_RelDC ; }
155 if ( prMNxN_RelDC <= prMNxN_RelMC ) { NewEnergy = NewEnergy_RelMC ; sum8 = sum8_RelMC ; }
160 if ( NewEnergy == -1000000.0 ||
161 NewEnergy == -1000001.0 ||
162 NewEnergy == -2000000.0 ||
163 NewEnergy == -3000000.0 ||
164 NewEnergy == -3000001.0 ) { *AcceptFlag=
false ; NewEnergy = 0.0 ; }
171 if ( NewEnergy > 10.0 * sum8 ) { *AcceptFlag=
false ; NewEnergy = 0.0 ; }
176 template <
typename T>
179 int missing_index = 0;
181 for (
int i = 0;
i < 9;
i++) {
183 missing[missing_index++] =
i;
188 if (M3x3Input[i] < 0.0) {
return -2000000.0; }
194 if (missing_index == 0) {
return -1000000.0; }
195 if (missing_index > 1) {
return -1000001.0; }
196 if (missing_index == 1) { idxDC = missing[0]; }
199 int input_order[9] = { CC, RR, LL, UU, DD, RU, RD, LU, LD };
203 for (
int id : input_order) {
207 input[input_index++] = TMath::Log(M3x3Input[
id]);
211 M3x3Input[idxDC] = TMath::Exp(ctx_[idxDC].mlp->Evaluate(0, input));
212 return M3x3Input[idxDC];
215 template <
typename DetIdT>
222 std::vector<DetId> NxNaroundDC = topology_->getWindow(itID, 5, 5);
225 double EnergyMax = 0.0;
229 std::vector<DetId>::const_iterator theCells;
231 for (theCells = NxNaroundDC.begin(); theCells != NxNaroundDC.end(); ++theCells) {
232 DetIdT cell = DetIdT(*theCells);
237 if ( goS_it != hit_collection.
end() && goS_it->energy() >= EnergyMax ) {
238 EnergyMax = goS_it->energy();
245 if ( CellMax.null() ) { *AcceptFlag=
false ;
return 0.0 ; }
251 bool dcIn3x3 =
false ;
253 std::vector<DetId> NxNaroundMaxCont = topology_->getWindow(CellMax,3,3);
254 std::vector<DetId>::const_iterator testCell;
255 for (testCell = NxNaroundMaxCont.begin(); testCell != NxNaroundMaxCont.end(); ++testCell) {
256 if ( itID == DetIdT(*testCell) ) { dcIn3x3 =
true ; }
260 if (!dcIn3x3) { *AcceptFlag=
false ;
return 0.0 ; }
263 return makeNxNMatrice_RelDC(CellMax, hit_collection, MNxN_RelMC, AcceptFlag);
270 if (
id.ieta() == 85 ||
id.ieta() == -85 ) { *AcceptFlag=
false ;
return 0.0 ; }
273 int ietaZ =
id.ieta() ;
274 int ietaP = ( ietaZ == -1 ) ? 1 : ietaZ + 1 ;
275 int ietaN = ( ietaZ == 1 ) ? -1 : ietaZ - 1 ;
277 int iphiZ =
id.iphi() ;
278 int iphiP = ( iphiZ == 360 ) ? 1 : iphiZ + 1 ;
279 int iphiN = ( iphiZ == 1 ) ? 360 : iphiZ - 1 ;
281 for (
int i=0;
i<9;
i++) { MNxN[
i] = 0.0 ; }
287 std::vector<DetId>::const_iterator itCells;
288 for (itCells = window.begin(); itCells != window.end(); ++itCells) {
294 if (goS_it != hit_collection.
end()) {
295 double energy = goS_it->energy();
298 else if ( cell.
ieta() == ietaP && cell.
iphi() == iphiZ ) { MNxN[
RR] =
energy; }
299 else if ( cell.
ieta() == ietaP && cell.
iphi() == iphiN ) { MNxN[
RD] =
energy; }
301 else if ( cell.
ieta() == ietaZ && cell.
iphi() == iphiP ) { MNxN[
UU] =
energy; }
302 else if ( cell.
ieta() == ietaZ && cell.
iphi() == iphiZ ) { MNxN[
CC] =
energy; }
303 else if ( cell.
ieta() == ietaZ && cell.
iphi() == iphiN ) { MNxN[
DD] =
energy; }
305 else if ( cell.
ieta() == ietaN && cell.
iphi() == iphiP ) { MNxN[
LU] =
energy; }
306 else if ( cell.
ieta() == ietaN && cell.
iphi() == iphiZ ) { MNxN[
LL] =
energy; }
307 else if ( cell.
ieta() == ietaN && cell.
iphi() == iphiN ) { MNxN[
LD] =
energy; }
309 else { *AcceptFlag=
false ;
return 0.0 ;}
315 double ESUMis = 0.0 ;
316 for (
int i=0;
i<9;
i++) { ESUMis = ESUMis + MNxN[
i] ; }
331 int ixZ = itID.
ix() ;
335 int iyZ = itID.
iy() ;
339 for (
int i=0;
i<9;
i++) { MNxN[
i] = 0.0 ; }
346 std::vector<DetId>::const_iterator itCells;
348 for (itCells = NxNaroundRefXtal.begin(); itCells != NxNaroundRefXtal.end(); ++itCells) {
354 if ( goS_it != hit_collection.
end() ) {
355 double energy = goS_it->energy();
357 if ( cell.
ix() == ixP && cell.
iy() == iyP ) { MNxN[
RU] =
energy; }
358 else if ( cell.
ix() == ixP && cell.
iy() == iyZ ) { MNxN[
RR] =
energy; }
359 else if ( cell.
ix() == ixP && cell.
iy() == iyN ) { MNxN[
RD] =
energy; }
361 else if ( cell.
ix() == ixZ && cell.
iy() == iyP ) { MNxN[
UU] =
energy; }
362 else if ( cell.
ix() == ixZ && cell.
iy() == iyZ ) { MNxN[
CC] =
energy; }
363 else if ( cell.
ix() == ixZ && cell.
iy() == iyN ) { MNxN[
DD] =
energy; }
365 else if ( cell.
ix() == ixN && cell.
iy() == iyP ) { MNxN[
LU] =
energy; }
366 else if ( cell.
ix() == ixN && cell.
iy() == iyZ ) { MNxN[
LL] =
energy; }
367 else if ( cell.
ix() == ixN && cell.
iy() == iyN ) { MNxN[
LD] =
energy; }
369 else { *AcceptFlag=
false ;
return 0.0 ;}
375 double ESUMis = 0.0 ;
376 for (
int i=0;
i<9;
i++) { ESUMis = ESUMis + MNxN[
i] ; }
EcalDeadChannelRecoveryNN()
std::unique_ptr< TTree > tree
std::vector< EcalRecHit >::const_iterator const_iterator
double makeNxNMatrice_RelMC(DetIdT itID, const EcalRecHitCollection &hit_collection, double *MNxN_RelMC, bool *AccFlag)
double makeNxNMatrice_RelDC(DetIdT itID, const EcalRecHitCollection &hit_collection, double *MNxN_RelDC, bool *AccFlag)
static std::string const input
int iphi() const
get the crystal iphi
const CaloSubdetectorTopology * topology_
~EcalDeadChannelRecoveryNN()
static bool isNextToRingBoundary(EEDetId id)
double recover(const DetIdT id, const EcalRecHitCollection &hit_collection, double Sum8Cut, bool *AcceptFlag)
int ieta() const
get the crystal ieta
MultiLayerPerceptronContext ctx_[9]
const_iterator end() const
void setCaloTopology(const CaloTopology *topo)
double estimateEnergy(double *M3x3Input, double epsilon=0.0000001)
std::unique_ptr< TMultiLayerPerceptron > mlp
virtual std::vector< DetId > getWindow(const DetId &id, const int &northSouthSize, const int &eastWestSize) const
bool null() const
is this a null id ?
const CaloSubdetectorTopology * getSubdetectorTopology(const DetId &id) const
access the subdetector Topology for the given subdetector directly
iterator find(key_type k)
void load_file(MultiLayerPerceptronContext &ctx, std::string fn)
volatile std::atomic< bool > shutdown_flag false
std::string fullPath() const