source: trunk/examples/advanced/composite_calorimeter/src/CCaloOrganization.cc@ 1218

Last change on this file since 1218 was 807, checked in by garnier, 17 years ago

update

File size: 5.4 KB
Line 
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//
26///////////////////////////////////////////////////////////////////////////////
27// File: CCaloOrganization.cc
28// Description: Packing, unpacking and other related utilities for
29// calorimetric numbering schema
30///////////////////////////////////////////////////////////////////////////////
31#include "CCaloOrganization.hh"
32
33//#define debug
34
35unsigned 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
53unsigned 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
73void 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
83void 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
94int 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
121float 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}
Note: See TracBrowser for help on using the repository browser.