/[PAMELA software]/PamelaDigitizer/DigitizeAC.cxx
ViewVC logotype

Contents of /PamelaDigitizer/DigitizeAC.cxx

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (show annotations) (download)
Wed Oct 15 14:03:15 2008 UTC (16 years, 1 month ago) by pamelats
Branch: MAIN
CVS Tags: v3r04, v3r05, v3r03
Changes since 1.2: +53 -101 lines
Cambiamenti principali: TOF, AC; cambiamenti di struttura (tutti *h esterni si trovano in Digitizer.h)

1 #include "Digitizer.h"
2
3 void Digitizer::DigitizeAC() {
4 // created: J. Conrad, KTH
5 // modified: S. Orsi, INFN Roma2
6 // fDataAC[0-63]: main AC board
7 // fDataAC[64-127]: extra AC board (identical to main board, for now)
8 // We activate all branches. Once the digitization algorithm is determined
9 // only the branches that involve needed information will be activated
10
11 // Threshold: thr=0.8 MeV.
12 Float_t thr = 8e-4;
13 Int_t nReg=6,i;
14 fDataAC[0] = 0xACAC;
15 fDataAC[64]= 0xACAC;
16 fDataAC[1] = 0xAC11;
17 fDataAC[65] = 0xAC22;
18
19 // the third word is a status word (dummy: "no errors are present in the AC boards")
20 fDataAC[2] = 0xFFFF; //FFEF?
21 fDataAC[66] = 0xFFFF;
22 // FPGA Registers (dummy)
23 for (i=0; i<=nReg; i++){
24 fDataAC[i+4] = 0xFFFF;
25 fDataAC[i+68] = 0xFFFF;
26 }
27 // the last word is a CRC
28 // Dummy for the time being, but it might need to be calculated in the end
29 fDataAC[63] = 0xABCD;
30 fDataAC[127] = 0xABCD;
31
32 // shift registers (moved to the end of the routine)
33
34 Int_t evntLSB=(UShort_t)Ievnt;
35 Int_t evntMSB=Ievnt >> 16;
36
37 // singles counters are dummy
38 for(i=0; i<=15; i++){ //SO Oct '07:
39 fDataAC[i+26] = evntLSB;
40 fDataAC[i+90] = evntLSB;
41 }
42 for(i=0; i<=7; i++){
43 fDataAC[i+42] = evntLSB;
44 fDataAC[i+106] = evntLSB;
45 }
46 // increments for every trigger might be needed at some point.
47 // dummy for now
48 fDataAC[50] = 0x0000;
49 fDataAC[114] = 0x0000;
50
51 // dummy FPGA clock (increment by 1 at each event)
52 if(Ievnt<=0xFFFF){
53 fDataAC[51] = 0x0000;
54 fDataAC[52] = Ievnt;
55 fDataAC[115] = 0x0000;
56 fDataAC[116] = Ievnt;
57 }
58 else{
59 fDataAC[51] = evntMSB;
60 fDataAC[52] = evntLSB;
61 fDataAC[115] = fDataAC[51];
62 fDataAC[116] = fDataAC[52];
63 }
64 // dummy temperatures
65 fDataAC[53] = 0x0000;
66 fDataAC[54] = 0x0000;
67 fDataAC[117] = 0x0000;
68 fDataAC[118] = 0x0000;
69 // dummy DAC thresholds
70 for(i=0; i<=7; i++){
71 fDataAC[i+55] = 0x1A13;
72 fDataAC[i+119] = 0x1A13;
73 }
74 // In this simpliefied approach we will assume that once a particle releases > 0.5 mip in one of the 12 AC detectors it will fire. We will furthermore assume that both cards read out identical data.
75
76 // If you develop your digitization algorithm, you should start by identifying the information present in level2 (post-darth-vader) data.
77
78 Float_t SumEcat[4],SumEcas[4],SumEcard[4];
79 for(i=0;i<4;i++){
80 SumEcat[i]=0.;
81 SumEcas[i]=0.;
82 SumEcard[i]=0.;
83 }
84 // energy dependence on position (see file AcFitOutputDistancePmt.C by S.Orsi)
85 // based on J.Lundquist's calculations (PhD thesis, page 94)
86 // function: [0]+[1]*atan([2]/(x+1)), where the 3 parameters are:
87 // 8.25470e-01 +- 1.79489e-02
88 // 6.41609e-01 +- 2.65846e-02
89 // 9.81177e+00 +- 1.21284e+00
90 // hp: 1 minimum ionising particle at 35cm from the PMT releases 1mip
91
92 // PMT positions: x,y,z: (average position of the 2 PMTs)
93 Float_t posCasPmt[4][3]={{28.308, -17.168, 63.644}, // 1 - CAS CPU: x,y,z
94 {18.893, 24.913, 63.644}, // 2 - CAS DCDC
95 {-24.307, 17.162, 63.644}, // 3 - CAS VME
96 {-17.765, -28.300, 63.644}}; // 4 - CAS IPM
97 Float_t dAC=0.; // distance from PMT
98
99 if(Nthcat>*ncat){
100 cout<<"*** ERROR AC! Nthcat= "<<Nthcat<<" out of range! "<<endl;
101 for(i=0;i<4;i++)SumEcat[i]=2*thr;
102 }
103 else{
104 for(i=0;i<Nthcat;i++){
105 if(Icat[i]>0 && Icat[i]<5)SumEcat[Icat[i]-1]+=Erelcat[i];
106 }
107 }
108 if(Nthcas>*ncas){
109 cout<<"*** ERROR AC! Nthcas= "<<Nthcas<<" out of range!"<<endl;
110 for(i=0;i<4;i++)SumEcas[i]=2*thr;
111 }
112 else{
113 for (i=0;i<Nthcas;i++){
114 if(Icas[i]>0 && Icas[i]<5){
115 dAC=sqrt(pow((Xincas[i]+Xoutcas[i])/2 - posCasPmt[Icas[i]-1][0],2) + pow((Yincas[i]+Youtcas[i])/2 - posCasPmt[Icas[i]-1][1],2) + pow((Zincas[i]+Zoutcas[i])/2 - posCasPmt[Icas[i]-1][2],2));
116 SumEcas[Icas[i]-1] += Erelcas[i]*attenAC->Eval(dAC);
117 }
118 }
119 }
120 if(Nthcard>*ncar){
121 cout<<"*** ERROR AC! Nthcard= "<<Nthcard<<" out of range!"<<endl;
122 for(i=0;i<4;i++)SumEcard[i]=2*thr;
123 }
124 else{
125 for(Int_t k= 0;k<Nthcard;k++){
126 if(Icard[i]>0 && Icard[i]<5)SumEcard[Icard[k]-1] += Erelcard[k];
127 }
128 }
129
130 // channel mapping Hit Map
131 // 1 CARD4 0 LSB
132 // 2 CAT2 0
133 // 3 CAS1 0
134 // 4 NC 0
135 // 5 CARD2 0
136 // 6 CAT4 1
137 // 7 CAS4 0
138 // 8 NC 0
139 // 9 CARD3 0
140 // 10 CAT3 0
141 // 11 CAS3 0
142 // 12 NC 0
143 // 13 CARD1 0
144 // 14 CAT1 0
145 // 15 CAS2 0
146 // 16 NC 0 MSB
147
148 // In the first version only the hit-map is filled, not the SR.
149
150 fDataAC[3] = 0x0000;
151
152 if (SumEcas[0] > thr) fDataAC[3] = 0x0004;
153 if (SumEcas[1] > thr) fDataAC[3] += 0x4000;
154 if (SumEcas[2] > thr) fDataAC[3] += 0x0400;
155 if (SumEcas[3] > thr) fDataAC[3] += 0x0040;
156
157 if (SumEcat[0] > thr) fDataAC[3] += 0x2000;
158 if (SumEcat[1] > thr) fDataAC[3] += 0x0002;
159 if (SumEcat[2] > thr) fDataAC[3] += 0x0200;
160 if (SumEcat[3] > thr) fDataAC[3] += 0x0020;
161
162 if (SumEcard[0] > thr) fDataAC[3] += 0x1000;
163 if (SumEcard[1] > thr) fDataAC[3] += 0x0010;
164 if (SumEcard[2] > thr) fDataAC[3] += 0x0100;
165 if (SumEcard[3] > thr) fDataAC[3] += 0x0001;
166
167 fDataAC[67] = fDataAC[3];
168
169 // shift registers
170 // the central bin is equal to the hitmap, all other bins in the shift register are 0
171 for (UInt_t i=0; i<=15; i++){
172 fDataAC[i+11] = 0x0000;
173 fDataAC[i+75] = 0x0000;
174 }
175 fDataAC[18] = fDataAC[3];
176 fDataAC[82] = fDataAC[3];
177
178 // for (Int_t i=0; i<fACbuffer; i++){
179 // printf("%0x ",fDataAC[i]);
180 // if ((i+1)%8 ==0) cout << endl;
181 // }
182 };

  ViewVC Help
Powered by ViewVC 1.1.23