/[PAMELA software]/PamVMC/ac/src/PamVMCAcDig.cxx
ViewVC logotype

Contents of /PamVMC/ac/src/PamVMCAcDig.cxx

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (show annotations) (download)
Fri Jun 12 18:39:00 2009 UTC (15 years, 5 months ago) by pam-rm2
Branch: MAIN
CVS Tags: v1r0, HEAD
Changes since 1.1: +0 -0 lines
- Introduced user-defined names of output files and random seeds number.
Users can do it use options of PamVMCApplication constructor:
PamVMCApplication(const char* name,  const char *title, const char*
filename="pamtest", Int_t seed=0).
The Random object that I use is TRandom3 object which has astronomical
large period (in case of default initialization 0). All random generators
in the code use this object by calling of gRandom singleton which keeps
it.

- Corrected TOF digitization routine. No problems with TDC hits due to
hadronic interactions anymore.

- Some small changes was done to compile code under Root 5.23. +
geant4_vmc v. 2.6 without any warnings

- Some classes of PamG4RunConfiguartion was changed for geant4_vmc v.
2.6.Some obsolete classes was deleted as soon as developers implemented
regions.

- Navigation was changed from "geomRootToGeant4" to "geomRoot", because on
VMC web page written that as soon as Geant4 has no option ONLY/MANY
translation of overlapped geometry to Geant4 through VGM could be wrong.
I'd like to stay with Root navigation:
http://root.cern.ch/root/vmc/Geant4VMC.html. This should be default
option.

- New Tracker digitization routine written by Sergio was implemented

- PamVMC again became compatible with geant4_vmc v.2.5 and ROOT 5.20.
 The problem was that ROOT developers introduced in TVirtualMC class a new
method SetMagField and new base class:TVirtualMagField from which
user-defined classes shoukd be derived

1 #include "PamVMCAcDig.h"
2 #include <TF1.h>
3 #include <TMath.h>
4
5 using TMath::Power;
6 using TMath::Sqrt;
7
8 ClassImp(PamVMCAcDig)
9
10 void PamVMCAcDig::DigitizeAC(Int_t EventNo){
11
12 // cout<<"Digitizing AC... "<<endl;
13
14 fDEBUG = kTRUE;
15
16 for (Int_t k= 0;k<5;k++) fSumEcat[k]=fSumEcas[k]=fSumEcard[k]=0.;
17 //Zeroing arrays holds energy releases in AC
18
19 UShort_t DataAC[128];
20 for(Int_t i=0; i<128; i++) DataAC[i]=0;
21
22
23 // created: J. Conrad, KTH
24 // modified: S. Orsi, INFN Roma2
25 // DataAC[0-63]: main AC board
26 // DataAC[64-127]: extra AC board (identical to main board, for now)
27
28 DataAC[0] = 0xACAC;
29 DataAC[64]= 0xACAC;
30 DataAC[1] = 0xAC11;
31 DataAC[65] = 0xAC22;
32
33 // the third word is a status word
34 //(dummy: "no errors are present in the AC boards")
35 DataAC[2] = 0xFFFF; //FFEF?
36 DataAC[66] = 0xFFFF;
37
38 const UInt_t nReg = 6;
39
40 // FPGA Registers (dummy)
41 for (UInt_t i=0; i<=nReg; i++){
42 DataAC[i+4] = 0xFFFF;
43 DataAC[i+68] = 0xFFFF;
44 }
45
46 // the last word is a CRC
47 // Dummy for the time being, but it might need
48 // to be calculated in the end
49 DataAC[63] = 0xABCD;
50 DataAC[127] = 0xABCD;
51
52 // shift registers (moved to the end of the routine)
53
54 Int_t evntLSB=(UShort_t)EventNo;
55 Int_t evntMSB=EventNo >> 16;
56
57 // singles counters are dummy
58 for (UInt_t i=0; i<=15; i++){
59 DataAC[i+26] = evntLSB;
60 DataAC[i+90] = evntLSB;
61 };
62
63 for (UInt_t i=0; i<=7; i++){
64 DataAC[i+42] = evntLSB;
65 DataAC[i+106] = evntLSB;
66 };
67
68
69 // increments for every trigger might be needed at some point.
70 // dummy for now
71 DataAC[50] = 0x0000;
72 DataAC[114] = 0x0000;
73
74 // dummy FPGA clock (increment by 1 at each event)
75 if (EventNo<=0xFFFF) {
76 DataAC[51] = 0x0000;
77 DataAC[52] = EventNo;
78 DataAC[115] = 0x0000;
79 DataAC[116] = EventNo;
80 } else {
81 DataAC[51] = evntMSB;
82 DataAC[52] = evntLSB;
83 DataAC[115] = DataAC[51];
84 DataAC[116] = DataAC[52];
85 }
86
87 // dummy temperatures
88 DataAC[53] = 0x0000;
89 DataAC[54] = 0x0000;
90 DataAC[117] = 0x0000;
91 DataAC[118] = 0x0000;
92
93
94 // dummy DAC thresholds
95 for (UInt_t i=0; i<=7; i++){
96 DataAC[i+55] = 0x1A13;
97 DataAC[i+119] = 0x1A13;
98 }
99
100 FillErel();
101
102 // In this simpliefied approach we will assume that once
103 // a particle releases > 0.5 mip in one of the 12 AC detectors it
104 // will fire. We will furthermore assume that both cards read out
105 // identical data.
106
107 // If you develop your digitization algorithm, you should start by
108 // identifying the information present in level2 (post-darth-vader)
109 // data.
110
111 // channel mapping Hit Map
112 // 1 CARD4 0 LSB
113 // 2 CAT2 0
114 // 3 CAS1 0
115 // 4 NC 0
116 // 5 CARD2 0
117 // 6 CAT4 1
118 // 7 CAS4 0
119 // 8 NC 0
120 // 9 CARD3 0
121 // 10 CAT3 0
122 // 11 CAS3 0
123 // 12 NC 0
124 // 13 CARD1 0
125 // 14 CAT1 0
126 // 15 CAS2 0
127 // 16 NC 0 MSB
128
129 // In the first version only the hit-map is filled, not the SR.
130
131 // Threshold: 0.8 MeV.
132
133 const Float_t thr = 8e-4; //(GeV)
134
135 //Important Note: In simulation model we have
136 //CAT as solid plasic plate. So, I set values:
137
138 fSumEcat[1]=fSumEcat[2]=fSumEcat[3]=fSumEcat[0];
139
140 DataAC[3] = 0x0000;
141
142 if (fSumEcas[0] > thr) DataAC[3] = 0x0004;
143 if (fSumEcas[1] > thr) DataAC[3] += 0x4000;
144 if (fSumEcas[2] > thr) DataAC[3] += 0x0400;
145 if (fSumEcas[3] > thr) DataAC[3] += 0x0040;
146
147 if (fSumEcat[0] > thr) DataAC[3] += 0x2000; //We have solid CAT scintillator
148 if (fSumEcat[1] > thr) DataAC[3] += 0x0002; //See note above
149 if (fSumEcat[2] > thr) DataAC[3] += 0x0200; //
150 if (fSumEcat[3] > thr) DataAC[3] += 0x0020; //
151
152 if (fSumEcard[0] > thr) DataAC[3] += 0x1000; //C1D1(1)
153 if (fSumEcard[1] > thr) DataAC[3] += 0x0010; //C1D1(2)
154 if (fSumEcard[2] > thr) DataAC[3] += 0x0100; //C2D1(1)
155 if (fSumEcard[3] > thr) DataAC[3] += 0x0001; //C2D1(2)
156
157 DataAC[67] = DataAC[3];
158
159 // shift registers
160 // the central bin is equal to the hitmap, all
161 // other bins in the shift register are 0
162 for (UInt_t i=0; i<=15; i++){
163 DataAC[i+11] = 0x0000;
164 DataAC[i+75] = 0x0000;
165 }
166 DataAC[18] = DataAC[3];
167 DataAC[82] = DataAC[3];
168
169 //++++++ WRITE EVERYTHING TO DIGITIZER'S BUFFER +++//
170 fData.clear(); //clearing data buffer
171
172 for(Int_t i= 0; i<128; i++) fData.push_back(DataAC[i]);
173
174
175 if (fDEBUG){
176 cout<<"====== AC hit info ======"<<endl;
177 cout<<"CAT: Erel="<<fSumEcat[0]*1.e6<<" (keV)"<<endl
178 <<"CARD1: Erel="<<fSumEcard[0]*1.e6<<" (keV)"<<endl
179 <<"CARD2: Erel="<<fSumEcard[1]*1.e6<<" (keV)"<<endl
180 <<"CARD3: Erel="<<fSumEcard[2]*1.e6<<" (keV)"<<endl
181 <<"CARD4: Erel="<<fSumEcard[3]*1.e6<<" (keV)"<<endl
182 <<"CAS1: Erel="<<fSumEcas[0]*1.e6<<" (keV)"<<endl
183 <<"CAS2: Erel="<<fSumEcas[1]*1.e6<<" (keV)"<<endl
184 <<"CAS3: Erel="<<fSumEcas[2]*1.e6<<" (keV)"<<endl
185 <<"CAS4: Erel="<<fSumEcas[3]*1.e6<<" (keV)"<<endl;
186 cout<<"========================="<<endl;
187
188 }
189 }
190
191 void PamVMCAcDig::FillErel(){
192 /*
193 Detector KEY Number of paddles
194
195 CAT TOP1 1 (solid volume with id=1)
196 CAS SID1 4 (1-4)
197 CARD C1D1 & C2D1 2 & 2 (1-2)
198 */
199 TClonesArray* hc=0;
200 const char* keyac[4] = {"TOP1","SID1","C1D1","C2D1"};
201 for(Int_t i=0; i<4; i++){
202 hc = (TClonesArray*)fhitscolmap.GetValue(keyac[i]);
203 if(hc) AddErel(hc, i);
204 hc = 0;
205 }
206 }
207
208 void PamVMCAcDig::AddErel(TClonesArray* HitColl, Int_t detcode){
209
210
211 // energy dependence on position (see file AcFitOutputDistancePmt.C by S.Orsi)
212 // based on J.Lundquist's calculations (PhD thesis, page 94)
213 // function: [0]+[1]*atan([2]/(x+1)), where the 3 parameters are:
214 // 8.25470e-01 +- 1.79489e-02
215 // 6.41609e-01 +- 2.65846e-02
216 // 9.81177e+00 +- 1.21284e+00
217 // hp: 1 minimum ionising particle at 35cm from the PMT releases 1mip
218
219 // TF1 *attenAC = new TF1("fAttAC",".825+.64*atan(9.8/x)",0.,45.);
220
221 const Float_t posCasPmt[4][3]={{28.308, -17.168, 63.644},// 1 - CAS CPU: x,y,z
222 {18.893, 24.913, 63.644},// 2 - CAS DCDC
223 {-24.307, 17.162, 63.644},// 3 - CAS VME
224 {-17.765, -28.300, 63.644}};// 4 - CAS IPM
225
226 Float_t dx,dy,dz,dAC; // distance from PMT
227 Int_t hitsNo=HitColl->GetEntriesFast();
228 PamVMCDetectorHit * hit = 0;
229
230 if (hitsNo>50) cout<<"WARNING: PamVMCAcDig::AddErel... "
231 <<"Number of hits in AC is out of range!!!"<<endl;
232
233 switch(detcode){
234 case 0: //CAT
235 for(Int_t k=0; k<hitsNo; k++){
236 hit = (PamVMCDetectorHit*)HitColl->At(k);
237 fSumEcat[(hit->GetPOS())-1] += hit->GetEREL();
238 }
239 break;
240
241 case 1: //CAS
242 for(Int_t k=0; k<hitsNo; k++){
243 hit = (PamVMCDetectorHit*)HitColl->At(k);
244 dx = (hit->GetXIN()+hit->GetXOUT())/2.-posCasPmt[hit->GetPOS()-1][0];
245 dy = (hit->GetYIN()+hit->GetYOUT())/2.-posCasPmt[hit->GetPOS()-1][1];
246 dz = (hit->GetZIN()+hit->GetZOUT())/2.-posCasPmt[hit->GetPOS()-1][2];
247 dAC = Sqrt(dx*dx + dy*dy + dz*dz);
248 //fSumEcas[(hit->GetPOS())-1] += (hit->GetEREL())*attenAC->Eval(dAC);
249 if ((hit->GetPOS()==3)) fSumEcas[3] += (hit->GetEREL())*fattenAC->Eval(dAC);
250 if ((hit->GetPOS()==4)) fSumEcas[1] += (hit->GetEREL())*fattenAC->Eval(dAC);
251 if ((hit->GetPOS()==2)) fSumEcas[0] += (hit->GetEREL())*fattenAC->Eval(dAC);
252 if ((hit->GetPOS()==1)) fSumEcas[2] += (hit->GetEREL())*fattenAC->Eval(dAC);
253 }
254 break;
255
256 case 2: //C1D1
257 for(Int_t k=0; k<hitsNo; k++){
258 hit = (PamVMCDetectorHit*)HitColl->At(k);
259 if ((hit->GetPOS()==1)) fSumEcard[3] += hit->GetEREL();
260 if ((hit->GetPOS()==2)) fSumEcard[0] += hit->GetEREL();
261 //fSumEcard[(hit->GetPOS())-1] += hit->GetEREL();
262 }
263 break;
264 case 3: //C2D1
265 for(Int_t k=0; k<hitsNo; k++){
266 hit = (PamVMCDetectorHit*)HitColl->At(k);
267 if ((hit->GetPOS()==1)) fSumEcard[2] += hit->GetEREL();
268 if ((hit->GetPOS()==2)) fSumEcard[1] += hit->GetEREL();
269 //fSumEcard[(hit->GetPOS())+1] += hit->GetEREL();
270 }
271 break;
272
273 default:
274 break;
275 }
276
277
278
279
280 }

  ViewVC Help
Powered by ViewVC 1.1.23