114 memset(eneA, 0,
sizeof(eneA));
115 memset(eneBC, 0,
sizeof(eneBC));
116 memset(eneD, 0,
sizeof(eneD));
123 std::vector<const CaloCell*> cellList;
130 cellContainer->beginConstCalo(tileCell_ID);
132 cellContainer->endConstCalo(tileCell_ID);
135 << cellContainer->nCellsCalo(tileCell_ID));
137 double phi[64] = { 0 };
139 for (; currentCell != lastCell; ++currentCell) {
141 double cellEta = (*currentCell)->eta();
142 if (cellEta > -1.5 && cellEta < 1.5) {
144 int cellSample =
m_tileID->sample((*currentCell)->ID());
145 switch (cellSample) {
147 iCell = (cellEta + 1.5) * 10;
148 cellModule =
m_tileID->module((*currentCell)->ID());
149 eneA[iCell][cellModule] = (*currentCell)->energy();
150 phi[cellModule] = (*currentCell)->phi();
153 iCell = (cellEta + 1.5) * 10;
154 cellModule =
m_tileID->module((*currentCell)->ID());
155 eneBC[iCell][cellModule] = (*currentCell)->energy();
156 phi[cellModule] = (*currentCell)->phi();
159 iCell = (cellEta + 1.3) * 5;
160 cellModule =
m_tileID->module((*currentCell)->ID());
161 eneD[iCell][cellModule] = (*currentCell)->energy();
162 phi[cellModule] = (*currentCell)->phi();
163 cellList.push_back(*currentCell);
166 iCell = (cellEta + 1.5) * 10;
167 if (iCell == 4 || iCell == 25) {
168 cellModule =
m_tileID->module((*currentCell)->ID());
169 eneA[iCell][cellModule] = (*currentCell)->energy();
170 phi[cellModule] = (*currentCell)->phi();
176 if (
msgLvl(MSG::VERBOSE)) {
177 msg(MSG::VERBOSE) <<
"scintillators sample, eta, phi, ene => "
178 <<
m_tileID->sample((*currentCell)->ID()) <<
","
180 << (*currentCell)->phi() <<
","
181 << (*currentCell)->energy() <<
endmsg;
183 msg(MSG::VERBOSE) <<
"sample, tower, eta => "
184 <<
m_tileID->sample((*currentCell)->ID()) <<
", "
185 <<
m_tileID->tower((*currentCell)->ID()) <<
", "
190 std::vector<double> muEtaD;
191 std::vector<float> muEneD;
192 std::vector<int> muModule;
193 std::vector<int> muCellD;
194 std::vector<int> muSplitted;
195 std::vector<int> muQualityD;
196 std::vector<int> muFound;
205 int nCandidates = 0, ntri = 0;
212 int lastMuModule = -3;
213 for (
int iModule = 0; iModule <
N_MODULES; ++iModule) {
215 for (
int iCellD = 0; iCellD <
N_CELLS_D; ++iCellD) {
216 float energy = eneD[iCellD][iModule];
221 int quality = (energy < hiThr) ? 0 : 1;
223 if (prevCell == lastMuCell && iModule == lastMuModule) {
224 int sumQuality = quality + muQualityD.back();
225 float sumEnergy = energy + eneD[prevCell][iModule];
226 double hiPrevThr =
m_hiThrD[prevCell];
227 double maxHiThr = (hiThr > hiPrevThr) ? hiThr : hiPrevThr;
228 if ((sumQuality == 0 && sumEnergy < maxHiThr) || sumQuality == 1) {
230 splitted = nCandidates - 1;
235 << (splitted + 1) <<
", " << splitted
236 <<
"): etaD1, etaD2, eta => "
238 <<
m_etaD[prevCell] <<
", "
240 <<
"; eneD1, eneD2, energy => "
241 << eneD[iCellD][iModule] <<
", "
242 << eneD[prevCell][iModule] <<
", "
246 muModule.push_back(iModule);
247 muCellD.push_back(iCellD);
248 muSplitted.push_back(splitted);
249 muFound.push_back(0);
250 muEneD.push_back(energy);
251 muQualityD.push_back(quality);
252 muEtaD.push_back(
eta);
255 lastMuModule = iModule;
257 <<
", tower index (iCellD)= " << iCellD
258 <<
", module index(iModuleD)= " << iModule
259 <<
", Energy(iCellD)(iModuleD) = " << eneD[iCellD][iModule]
260 <<
", threshold2(iCellD)= " <<
m_hiThrD[iCellD]);
269 if (
msgLvl(MSG::VERBOSE)) {
270 for (
int i = 0; i < nCandidates; ++i) {
271 msg(MSG::VERBOSE) <<
"Candidates list: number phi,ene, eta "
273 << muModule[i] <<
","
276 <<
"nSplitted,muSplitted(cand)" << nSplitted <<
", "
277 << muSplitted[i] <<
endmsg;
283 for (
int iMu = 0; iMu < nCandidates; ++iMu) {
284 int splitted = muSplitted[iMu];
285 if (splitted < 0 || muFound[splitted] == 0) {
291 int module = muModule[iMu];
293 "loop on mu candidates: iMu, module = " << iMu <<
", " << module);
294 int idxD = 6 * muCellD[iMu];
297 while (++idxD <= endIdxD && muFound[iMu] != 1) {
299 float energyBC = eneBC[cellBC][module];
301 <<
", module=" << module
302 <<
", eneBC =" << energyBC);
304 int qualityBC = (energyBC <
m_hiThrBC[cellBC]) ? 0 : 1;
305 int idxBC = 6 * cellBC;
308 while (++idxBC <= endIdxBC && muFound[iMu] != 1) {
310 float energyA = eneA[cellA][module];
312 <<
", module=" << module
313 <<
", eneA =" << energyA);
317 int qualityA = (energyA <
m_hiThrA[cellA]) ? 0 : 1;
321 int muQuality = muQualityD[iMu] + qualityBC + qualityA;
322 if (muQuality <= 1) {
324 double muEta = (muEtaD[iMu] +
m_etaBC[cellBC] +
m_etaA[cellA]) / 3;
325 double muPhi =
phi[module];
326 std::vector<float> muEnergy;
328 muEnergy.push_back(energyA);
329 muEnergy.push_back(energyBC);
330 muEnergy.push_back(muEneD[iMu]);
336 << muEnergy[0] <<
", "
337 << muEnergy[1] <<
", "
339 <<
" tag eta 1st, 2nd, 3rd,"
344 int nextModule = (
module != 63) ? (module + 1) : 0;
345 int prevModule = (
module != 0) ? (module - 1) : 63;
346 eneAround = eneA[cellA][nextModule] + eneA[cellA][prevModule]
347 + eneBC[cellBC][nextModule] + eneBC[cellBC][prevModule];
349 int nextCellA = cellA + 1;
350 int prevCellA = cellA - 1;
351 if (nextCellA < N_CELLS_A && prevCellA > 0) {
352 eneAround += eneA[nextCellA][module] + eneA[prevCellA][module]
353 + eneA[nextCellA][nextModule]
354 + eneA[nextCellA][prevModule]
355 + eneA[prevCellA][nextModule]
356 + eneA[prevCellA][prevModule];
360 int nextCellBC = cellBC + 1;
361 int prevCellBC = cellBC - 1;
362 if (nextCellBC < N_CELLS_BC && prevCellBC > 0) {
363 eneAround += eneBC[nextCellBC][module]
364 + eneBC[prevCellBC][module]
365 + eneBC[nextCellBC][nextModule]
366 + eneBC[nextCellBC][prevModule]
367 + eneBC[prevCellBC][nextModule]
368 + eneBC[prevCellBC][prevModule];
372 muEnergy.push_back(eneAround);
373 std::unique_ptr<TileMu> muon = std::make_unique<TileMu>((
float) muEta,
379 <<
" muon tag phi=" << muon->phi()
380 <<
" energydepVec[0]=" << muon->enedep()[0]
381 <<
" energydepVec[1]=" << muon->enedep()[1]
382 <<
" energydepVec[2]=" << muon->enedep()[2]
383 <<
" energydepVec[3]=" << muon->enedep()[3]
384 <<
" muon tag Q factor=" << muon->quality()
385 <<
" ene around= " << eneAround);
387 muContainer->push_back(muon.release());
405 if (
msgLvl(MSG::VERBOSE)) {
406 for (
const CaloCell* cell : cellList) {
407 msg(MSG::VERBOSE) <<
" tag Cell (sect,side,mod,tow,sam)=("
408 <<
m_tileID->section(cell->ID()) <<
" "
409 <<
m_tileID->side(cell->ID()) <<
" "
410 <<
m_tileID->module(cell->ID()) <<
" "
411 <<
m_tileID->tower(cell->ID()) <<
" "
413 <<
"),(eta,phi,energy)=("
414 << cell->eta() <<
","
415 << cell->phi() <<
","
416 << cell->energy() <<
")" <<
endmsg;
423 for (
const TileMu* mu : *muContainer) {
425 <<
" eta = " << mu->eta()
426 <<
" phi = " << mu->phi()
427 <<
" enedep[0] = " << (mu->enedep())[0]
428 <<
" enedep[1] = " << (mu->enedep())[1]
429 <<
" enedep[2] = " << (mu->enedep())[2]
430 <<
" enedep[3] = " << (mu->enedep())[3]
431 <<
" quality = " << mu->quality() <<
endmsg;
436 return StatusCode::SUCCESS;