8 #include <TDirectory.h> 12 for (
int id = 0;
id < 9; ++
id) {
13 ctx_[
id].mlp =
nullptr;
21 for (
int id = 0;
id < 9; ++
id) {
46 auto t = std::make_unique<TTree>(
"t",
"dummy MLP tree");
47 t->SetDirectory(
nullptr);
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 } ;
127 if (sum8_RelDC > Sum8Cut && sum8_RelMC > Sum8Cut) {
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]; }
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>
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 ;
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 ; }
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();
297 if ( cell.
ieta() == ietaP && cell.
iphi() == iphiP ) { MNxN[
RU] = 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
constexpr bool null() const
is this a null id ?
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)
def window(xmin, xmax, ymin, ymax, x=0, y=0, width=100, height=100, xlogbase=None, ylogbase=None, minusInfinity=-1000, flipx=False, flipy=True)
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
const CaloSubdetectorTopology * getSubdetectorTopology(const DetId &id) const
access the subdetector Topology for the given subdetector directly
iterator find(key_type k)
std::string fullPath() const
void load_file(MultiLayerPerceptronContext &ctx, std::string fn)