ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CCaloOrganization.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file CCaloOrganization.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
27 // File: CCaloOrganization.cc
28 // Description: Packing, unpacking and other related utilities for
29 // calorimetric numbering schema
31 #include "CCaloOrganization.hh"
32 
33 //#define debug
34 
36  G4int phi) const {
37  //So this is the actual encoding of the index:
38  //top 4 bits encode Detector type
39  //
40  // Should work for all calorimeter with no depth information
41 
42  unsigned int idx=(det&15)<<28; //bits 28-31 (21-23 are free for now)
43  idx+=(((z+1)/2)&1)<<20; //bits 20
44  idx+=(eta&1023)<<10; //bits 10-19
45  idx+=(phi&1023); //bits 0-9
46 #ifdef debug
47  G4cout << " ECAL packing " << det << " " << z << " " << eta << " " << phi
48  << " into " << idx << G4endl;
49 #endif
50  return idx;
51 }
52 
54  G4int phi) const {
55  //So this is the actual encoding of the index:
56  //top 4 bits encode Detector type
57  //next 4 bits encode depth information
58  // Should work for all calorimeter with no depth information
59 
60  unsigned int idx=(det&15)<<28; //bits 28-31 (21-23 are free for now)
61  idx+=(depth&15)<<24; //bits 24-27
62  idx+=(z&1)<<20; //bits 20
63  idx+=(eta&1023)<<10; //bits 10-19
64  idx+=(phi&1023); //bits 0-9
65 #ifdef debug
66  G4cout << " HCAL packing " << det << " " << depth << " " << z << " " << eta
67  << " " << phi << " into " << idx << G4endl;
68 #endif
69  return idx;
70 }
71 
72 
73 void CCaloOrganization::unpackindex(const unsigned int& idx, G4int& det, G4int& z,
74  G4int& eta, G4int& phi) const {
75  det = (idx>>28)&15;
76  z = (idx>>20)&1;
77  z = 2*z-1;
78  eta = (idx>>10)&1023;
79  phi = (idx&1023);
80 }
81 
82 
83 void CCaloOrganization::unpackindex(const unsigned int& idx, G4int& det,
84  G4int& depth, G4int& z, G4int& eta,
85  G4int& phi) const {
86  det = (idx>>28)&15;
87  depth=(idx>>24)&15;
88  z = (idx>>20)&1;
89  eta = (idx>>10)&1023;
90  phi = (idx&1023);
91 }
92 
93 
94 G4int CCaloOrganization::getUnitWithMaxEnergy(std::map<G4int,G4float,std::less<G4int> >& themap){
95 
96  //look for max
97  G4int UnitWithMaxEnergy = 0;
98  G4float maxEnergy = 0.;
99 
100  for(std::map<G4int,G4float,std::less<G4int> >::iterator iter = themap.begin();
101  iter != themap.end(); iter++){
102 
103  if( maxEnergy < (*iter).second) {
104  maxEnergy = (*iter).second;
105  UnitWithMaxEnergy = (*iter).first;
106  }
107  }
108 #ifdef debug
109  G4cout << " *** max energy of " << maxEnergy << " MeV was found in Unit id "
110  << UnitWithMaxEnergy;
111  G4int det,z,eta,phi;
112  unpackindex(UnitWithMaxEnergy, det, z, eta, phi);
113  G4cout << " corresponding to z= " << z << " eta= " << eta << " phi = " << phi
114  << G4endl;
115 #endif
116  return UnitWithMaxEnergy;
117 
118 }
119 
120 
122  G4int crystalWithMaxEnergy,
123  std::map<G4int,G4float,std::less<G4int> >& themap){
124 
125  G4int det,z,eta,phi;
126  this->unpackindex(crystalWithMaxEnergy, det, z, eta, phi);
127  G4int ncristals=0;
128 
129  G4int goBackInEta = nCellInEta/2;
130  G4int goBackInPhi = nCellInPhi/2;
131  G4int startEta = eta-goBackInEta;
132  G4int startPhi = phi-goBackInPhi;
133 
134  G4float totalEnergy = 0.;
135 
136  for(G4int ieta=startEta; ieta<startEta+nCellInEta; ieta++){
137  for(G4int iphi=startPhi; iphi<startPhi+nCellInPhi; iphi++){
138 
139  G4int index = this->packindex(det,z,ieta,iphi);
140  totalEnergy += themap[index];
141  ncristals+=1;
142 #ifdef debug
143  G4cout << "ieta - iphi - E = " << ieta << " " << iphi << " "
144  << themap[index] << G4endl;
145 #endif
146  }
147  }
148 
149 #ifdef debug
150  G4cout << "Energy in " << nCellInEta << " cells in eta times "
151  << nCellInPhi << " cells in phi matrix = " << totalEnergy
152  << " for " << ncristals << " crystals" << G4endl;
153 #endif
154  return totalEnergy;
155 
156 }