Geant4  10.01.p03
CCaloOrganization.cc
Go to the documentation of this file.
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 
35 unsigned int CCaloOrganization::packindex(int det, int z, int eta,
36  int 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 
53 unsigned int CCaloOrganization::packindex(int det, int depth, int z, int eta,
54  int 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, int& det, int& z,
74  int& eta, int& 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, int& det,
84  int& depth, int& z, int& eta,
85  int& 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 int CCaloOrganization::getUnitWithMaxEnergy(std::map<int,float,std::less<int> >& themap){
95 
96  //look for max
97  int UnitWithMaxEnergy = 0;
98  float maxEnergy = 0.;
99 
100  for(std::map<int,float,std::less<int> >::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  int 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 
121 float CCaloOrganization::energyInMatrix(int nCellInEta, int nCellInPhi,
122  int crystalWithMaxEnergy,
123  std::map<int,float,std::less<int> >& themap){
124 
125  int det,z,eta,phi;
126  this->unpackindex(crystalWithMaxEnergy, det, z, eta, phi);
127  int ncristals=0;
128 
129  int goBackInEta = nCellInEta/2;
130  int goBackInPhi = nCellInPhi/2;
131  int startEta = eta-goBackInEta;
132  int startPhi = phi-goBackInPhi;
133 
134  float totalEnergy = 0.;
135 
136  for(int ieta=startEta; ieta<startEta+nCellInEta; ieta++){
137  for(int iphi=startPhi; iphi<startPhi+nCellInPhi; iphi++){
138 
139  int 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 }
G4double z
Definition: TRTMaterials.hh:39
void unpackindex(const unsigned int &idx, int &det, int &z, int &eta, int &phi) const
float energyInMatrix(int nCellInEta, int nCellInPhi, int crystalWithMaxEnergy, std::map< int, float, std::less< int > > &themap)
unsigned int packindex(int det, int z, int eta, int phi) const
G4GLOB_DLL std::ostream G4cout
int getUnitWithMaxEnergy(std::map< int, float, std::less< int > > &themap)
#define G4endl
Definition: G4ios.hh:61