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

Annotation of /PamelaDigitizer/DigitizeAC.cxx

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations) (download)
Wed May 21 09:50:38 2008 UTC (16 years, 6 months ago) by pamelats
Branch: MAIN
CVS Tags: v3r00, v3r01
*** empty log message ***

1 pamelats 1.1 #include <sstream>
2     #include <fstream>
3     #include <stdlib.h>
4     #include <stdio.h>
5     #include <string.h>
6     #include <ctype.h>
7     #include <time.h>
8     #include "Riostream.h"
9     #include "TFile.h"
10     #include "TDirectory.h"
11     #include "TTree.h"
12     #include "TLeafI.h"
13     #include "TH1.h"
14     #include "TH2.h"
15     #include "TF1.h"
16     #include "TMath.h"
17     #include "TRandom.h"
18     #include "TSQLServer.h"
19     #include "TSystem.h"
20     #include "CalibTrk1Event.h"
21     #include "CalibTrk2Event.h"
22     //
23     #include "Digitizer.h"
24     #include "CRC.h"
25     //
26     #include <PamelaRun.h>
27     #include <physics/calorimeter/CalorimeterEvent.h>
28     #include <CalibCalPedEvent.h>
29     #include "GLTables.h"
30    
31    
32     void Digitizer::DigitizeAC() {
33     // created: J. Conrad, KTH
34     // modified: S. Orsi, INFN Roma2
35     // fDataAC[0-63]: main AC board
36     // fDataAC[64-127]: extra AC board (identical to main board, for now)
37    
38     // We activate all branches. Once the digitization algorithm is determined
39     // only the branches that involve needed information will be activated
40    
41     // fhBookTree->SetBranchStatus("Ievnt",&Ievnt);//modified by E.Vannuccini 03/08
42     // fhBookTree->SetBranchStatus("Nthcat",1);
43     // fhBookTree->SetBranchStatus("Iparcat",1);
44     // fhBookTree->SetBranchStatus("Icat",1);
45     // fhBookTree->SetBranchStatus("Xincat",1);
46     // fhBookTree->SetBranchStatus("Yincat",1);
47     // fhBookTree->SetBranchStatus("Zincat",1);
48     // fhBookTree->SetBranchStatus("Xoutcat",1);
49     // fhBookTree->SetBranchStatus("Youtcat",1);
50     // fhBookTree->SetBranchStatus("Zoutcat",1);
51     // fhBookTree->SetBranchStatus("Erelcat",1);
52     // fhBookTree->SetBranchStatus("Timecat",1);
53     // fhBookTree->SetBranchStatus("Pathcat",1);
54     // fhBookTree->SetBranchStatus("P0cat",1);
55     // fhBookTree->SetBranchStatus("Nthcas",1);
56     // fhBookTree->SetBranchStatus("Iparcas",1);
57     // fhBookTree->SetBranchStatus("Icas",1);
58     // fhBookTree->SetBranchStatus("Xincas",1);
59     // fhBookTree->SetBranchStatus("Yincas",1);
60     // fhBookTree->SetBranchStatus("Zincas",1);
61     // fhBookTree->SetBranchStatus("Xoutcas",1);
62     // fhBookTree->SetBranchStatus("Youtcas",1);
63     // fhBookTree->SetBranchStatus("Zoutcas",1);
64     // fhBookTree->SetBranchStatus("Erelcas",1);
65     // fhBookTree->SetBranchStatus("Timecas",1);
66     // fhBookTree->SetBranchStatus("Pathcas",1);
67     // fhBookTree->SetBranchStatus("P0cas",1);
68     // fhBookTree->SetBranchStatus("Nthcard",1);
69     // fhBookTree->SetBranchStatus("Iparcard",1);
70     // fhBookTree->SetBranchStatus("Icard",1);
71     // fhBookTree->SetBranchStatus("Xincard",1);
72     // fhBookTree->SetBranchStatus("Yincard",1);
73     // fhBookTree->SetBranchStatus("Zincard",1);
74     // fhBookTree->SetBranchStatus("Xoutcard",1);
75     // fhBookTree->SetBranchStatus("Youtcard",1);
76     // fhBookTree->SetBranchStatus("Zoutcard",1);
77     // fhBookTree->SetBranchStatus("Erelcard",1);
78     // fhBookTree->SetBranchStatus("Timecard",1);
79     // fhBookTree->SetBranchStatus("Pathcard",1);
80     // fhBookTree->SetBranchStatus("P0card",1);
81    
82     fDataAC[0] = 0xACAC;
83     fDataAC[64]= 0xACAC;
84     fDataAC[1] = 0xAC11;
85     fDataAC[65] = 0xAC22;
86    
87     // the third word is a status word (dummy: "no errors are present in the AC boards")
88     fDataAC[2] = 0xFFFF; //FFEF?
89     fDataAC[66] = 0xFFFF;
90    
91     const UInt_t nReg = 6;
92    
93     // FPGA Registers (dummy)
94     for (UInt_t i=0; i<=nReg; i++){
95     fDataAC[i+4] = 0xFFFF;
96     fDataAC[i+68] = 0xFFFF;
97     }
98    
99     // the last word is a CRC
100     // Dummy for the time being, but it might need to be calculated in the end
101     fDataAC[63] = 0xABCD;
102     fDataAC[127] = 0xABCD;
103    
104     // shift registers (moved to the end of the routine)
105    
106     //Int_t evntLSB=Ievnt%65536;
107     //Int_t evntMSB=(Int_t)(Ievnt/65536);
108     Int_t evntLSB=(UShort_t)Ievnt;
109     Int_t evntMSB=Ievnt >> 16;
110    
111     // singles counters are dummy
112     for (UInt_t i=0; i<=15; i++){ //SO Oct '07: // for (UInt_t i=0; i<=16; i++){
113     // fDataAC[i+26] = 0x0000;
114     // fDataAC[i+90] = 0x0000;
115     fDataAC[i+26] = evntLSB;
116     fDataAC[i+90] = evntLSB;
117     };
118    
119     // coincidences are dummy (increment by 1 at each event)
120     // for (UInt_t i=0; i<=7; i++){
121     // fDataAC[i+42] = 0x0000;
122     // fDataAC[i+106] = 0x0000;
123     // }
124     for (UInt_t i=0; i<=7; i++){
125     fDataAC[i+42] = evntLSB;
126     fDataAC[i+106] = evntLSB;
127     };
128    
129     // increments for every trigger might be needed at some point.
130     // dummy for now
131     fDataAC[50] = 0x0000;
132     fDataAC[114] = 0x0000;
133    
134     // dummy FPGA clock (increment by 1 at each event)
135     /*
136     fDataAC[51] = 0x006C;
137     fDataAC[52] = 0x6C6C;
138     fDataAC[115] = 0x006C;
139     fDataAC[116] = 0x6C6C;
140     */
141     if (Ievnt<=0xFFFF) {
142     fDataAC[51] = 0x0000;
143     fDataAC[52] = Ievnt;
144     fDataAC[115] = 0x0000;
145     fDataAC[116] = Ievnt;
146     } else {
147     fDataAC[51] = evntMSB;
148     fDataAC[52] = evntLSB;
149     fDataAC[115] = fDataAC[51];
150     fDataAC[116] = fDataAC[52];
151     }
152    
153     // dummy temperatures
154     fDataAC[53] = 0x0000;
155     fDataAC[54] = 0x0000;
156     fDataAC[117] = 0x0000;
157     fDataAC[118] = 0x0000;
158    
159    
160     // dummy DAC thresholds
161     for (UInt_t i=0; i<=7; i++){
162     fDataAC[i+55] = 0x1A13;
163     fDataAC[i+119] = 0x1A13;
164     }
165    
166     // In this simpliefied approach we will assume that once
167     // a particle releases > 0.5 mip in one of the 12 AC detectors it
168     // will fire. We will furthermore assume that both cards read out
169     // identical data.
170    
171     // If you develop your digitization algorithm, you should start by
172     // identifying the information present in level2 (post-darth-vader)
173     // data.
174    
175     Float_t SumEcat[5];
176     Float_t SumEcas[5];
177     Float_t SumEcard[5];
178     for (Int_t k= 0;k<5;k++){
179     SumEcat[k]=0.;
180     SumEcas[k]=0.;
181     SumEcard[k]=0.;
182     };
183    
184     if (Nthcat>50 || Nthcas>50 || Nthcard>50)
185     printf("*** ERROR AC! NthAC out of range!\n\n");
186    
187     // energy dependence on position (see file AcFitOutputDistancePmt.C by S.Orsi)
188     // based on J.Lundquist's calculations (PhD thesis, page 94)
189     // function: [0]+[1]*atan([2]/(x+1)), where the 3 parameters are:
190     // 8.25470e-01 +- 1.79489e-02
191     // 6.41609e-01 +- 2.65846e-02
192     // 9.81177e+00 +- 1.21284e+00
193     // hp: 1 minimum ionising particle at 35cm from the PMT releases 1mip
194    
195     TF1 *attenAC = new TF1("fAttAC",".825+.64*atan(9.8/x)",0.,45.);
196    
197     // PMT positions: x,y,z: (average position of the 2 PMTs)
198     Float_t posCasPmt[4][3]={{28.308, -17.168, 63.644}, // 1 - CAS CPU: x,y,z
199     {18.893, 24.913, 63.644}, // 2 - CAS DCDC
200     {-24.307, 17.162, 63.644}, // 3 - CAS VME
201     {-17.765, -28.300, 63.644}}; // 4 - CAS IPM
202    
203     Float_t dAC=0.; // distance from PMT
204    
205     // look in CAT
206     // for (UInt_t k= 0;k<50;k++){
207     for (Int_t k= 0;k<Nthcat;k++){
208     if (Erelcat[k] > 0)
209     SumEcat[Icat[k]] += Erelcat[k];
210     };
211    
212     // look in CAS
213     for (Int_t k= 0;k<Nthcas;k++){
214     if (Erelcas[k] >0) {
215     dAC=sqrt(pow((Xincas[k]+Xoutcas[k])/2 - posCasPmt[Icas[k]-1][0],2) + pow((Yincas[k]+Youtcas[k])/2 - posCasPmt[Icas[k]-1][1],2) + pow((Zincas[k]+Zoutcas[k])/2 - posCasPmt[Icas[k]-1][2],2));
216     SumEcas[Icas[k]] += Erelcas[k]*attenAC->Eval(dAC);
217     }
218     };
219    
220     // look in CARD
221     for (Int_t k= 0;k<Nthcard;k++){
222     if (Erelcard[k] >0)
223     SumEcard[Icard[k]] += Erelcard[k];
224     };
225    
226     // channel mapping Hit Map
227     // 1 CARD4 0 LSB
228     // 2 CAT2 0
229     // 3 CAS1 0
230     // 4 NC 0
231     // 5 CARD2 0
232     // 6 CAT4 1
233     // 7 CAS4 0
234     // 8 NC 0
235     // 9 CARD3 0
236     // 10 CAT3 0
237     // 11 CAS3 0
238     // 12 NC 0
239     // 13 CARD1 0
240     // 14 CAT1 0
241     // 15 CAS2 0
242     // 16 NC 0 MSB
243    
244     // In the first version only the hit-map is filled, not the SR.
245    
246     // Threshold: 0.8 MeV.
247    
248     Float_t thr = 8e-4;
249    
250     fDataAC[3] = 0x0000;
251    
252     if (SumEcas[0] > thr) fDataAC[3] = 0x0004;
253     if (SumEcas[1] > thr) fDataAC[3] += 0x4000;
254     if (SumEcas[2] > thr) fDataAC[3] += 0x0400;
255     if (SumEcas[3] > thr) fDataAC[3] += 0x0040;
256    
257     if (SumEcat[0] > thr) fDataAC[3] += 0x2000;
258     if (SumEcat[1] > thr) fDataAC[3] += 0x0002;
259     if (SumEcat[2] > thr) fDataAC[3] += 0x0200;
260     if (SumEcat[3] > thr) fDataAC[3] += 0x0020;
261    
262     if (SumEcard[0] > thr) fDataAC[3] += 0x1000;
263     if (SumEcard[1] > thr) fDataAC[3] += 0x0010;
264     if (SumEcard[2] > thr) fDataAC[3] += 0x0100;
265     if (SumEcard[3] > thr) fDataAC[3] += 0x0001;
266    
267     fDataAC[67] = fDataAC[3];
268    
269     // shift registers
270     // the central bin is equal to the hitmap, all other bins in the shift register are 0
271     for (UInt_t i=0; i<=15; i++){
272     fDataAC[i+11] = 0x0000;
273     fDataAC[i+75] = 0x0000;
274     }
275     fDataAC[18] = fDataAC[3];
276     fDataAC[82] = fDataAC[3];
277    
278     // for (Int_t i=0; i<fACbuffer; i++){
279     // printf("%0x ",fDataAC[i]);
280     // if ((i+1)%8 ==0) cout << endl;
281     // }
282     };

  ViewVC Help
Powered by ViewVC 1.1.23