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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (hide 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 nikolas 1.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