a9bca0fe19b89a7aa37555065aacba854ff51269
[u/mrichter/AliRoot.git] / ITS / AliITSetfSDD.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15  
16 /*
17 $Log$
18 Revision 1.6.6.1  2002/06/10 17:51:15  hristov
19 Merged with v3-08-02
20
21 Revision 1.7  2002/04/24 22:02:31  nilsen
22 New SDigits and Digits routines, and related changes,  (including new
23 noise values).
24
25 */
26 #include <iostream.h>
27 #include <TMath.h>
28 #include <TString.h>
29 #include "AliITSetfSDD.h"
30
31 ////////////////////////////////////////////////////////////////////////
32 // Version: 0
33 // Written by Piergiorgio Cerello
34 // November 23 1999
35 //
36 //_____________________________________________________________________________
37
38
39 ClassImp(AliITSetfSDD)
40
41 Int_t ppower(Int_t b, Int_t e) {
42   Int_t power = 1;
43   for(Int_t i=0; i<e; i++) power *= b;
44   return power;
45 }
46
47 AliITSetfSDD::AliITSetfSDD(Double_t timestep, Int_t amplif)
48 {
49   // sampling time in ns
50
51   fTimeDelay = 53.5;
52   if(amplif == 2) fTimeDelay = 35.5;
53   fSamplingTime = timestep;
54
55   fT0 = 0.;
56   fDf = ppower(10,9)/(kMaxNofSamples*fSamplingTime);
57
58   Int_t i,j;
59   for(i=0; i<kMaxNofPoles; i++) {
60     fZeroM[i] = 0.;
61     fZeroR[i] = 0.;
62     fZeroI[i] = 0.;
63     fPoleM[i] = 0.;
64     fPoleR[i] = 0.;
65     fPoleI[i] = 0.;
66   }
67   // Alice
68
69   // PASCAL amplif
70   fA0 = 5.53269815e+11; 
71   fPoleM[0] = 3.;
72   fPoleR[0] = -8280000.; 
73   fPoleI[0] = 0.; 
74
75   if(amplif == 2) { // OLA amplif.
76     fA0 = 24000.;
77     fPoleM[0] = 1.;
78     fPoleR[0] = -3000000.;
79     fPoleI[0] = 4000000.;
80     fPoleM[1] = 1.;
81     fPoleR[1] = fPoleR[0];
82     fPoleI[1] = -fPoleI[0]; 
83   }
84
85   if( amplif == 3 ) { // old PASCAL
86     fA0 = 16500.; // AL: 16500.;  // TB: 24000.; // 26000.; // 24000.; // 18000.; 
87     fPoleM[0] = 1.;
88     fPoleR[0] = -4140000.; // AL: -4140000.; // TB: -3000000.; // -3750000.; // -3500000; // -3000000.; 
89     fPoleI[0] = 0.; // AL: 0.; // TB: 4000000.; // 3750000.; // 3500000.; // 3000000.; 
90     fPoleM[1] = 1.;
91     fPoleR[1] = fPoleR[0];
92     fPoleI[1] = -fPoleI[0]; 
93   }
94
95   //cout << "fA0: " << fA0 << endl;
96   //cout << "fTimeDelay: " << fTimeDelay << endl;
97   
98   // Compute Transfer Function
99
100   Double_t PI = acos(-1.);
101   for(i=0; i<=kMaxNofSamples/2; i++) {
102     Double_t frequency = fDf*i;
103     Double_t VM = fA0;
104     Double_t VA = 0.;
105     for(Int_t k=0; k<kMaxNofPoles; k++) {
106       if(fZeroM[k]) {
107         Double_t VZR = -fZeroR[k];
108         Double_t VZI = frequency - fZeroI[k];
109         Double_t VZM = TMath::Sqrt(VZR*VZR+VZI*VZI);
110         Double_t VZA = TMath::ATan2(VZI,VZR);
111         //      cout << "VZM: " << VZM << ", VZA: " << VZA << endl;
112         //      cout << "VZR: " << VZR << ", VZI: " << VZI << endl;
113         for(j=1; j<= (Int_t) fZeroM[k]; j++) {
114           VM *= VZM;
115           VA += VZA;
116           if(VA >= PI) VA -= (2.*PI);
117           if(VA <= -PI) VA += (2.*PI);
118           //cout << "VM: " << VM << ", VA: " << VA << endl;
119         }
120       }
121
122       if(fPoleM[k]) {
123         Double_t VPR = -fPoleR[k];
124         Double_t VPI = frequency - fPoleI[k];
125         Double_t VPM = TMath::Sqrt(VPR*VPR+VPI*VPI);
126         Double_t VPA = TMath::ATan2(VPI,VPR);
127         //cout << "VPM: " << VPM << ", VPA: " << VPA << endl;
128         //cout << "VPR: " << VPR << ", VPI: " << VPI << endl;
129         for(j=1; j<= (Int_t) fPoleM[k]; j++) {
130           VM /= VPM;
131           VA -= VPA;
132           if(VA >= PI) VA -= (2.*PI);
133           if(VA <= -PI) VA += (2.*PI);
134           //cout << "VM: " << VM << ", VA: " << VA << endl;
135         }
136       }
137       Double_t VR = VM*cos(VA);
138       Double_t VI = VM*sin(VA);
139       //cout << "VM: " << VM << ", VA: " << VA << endl;
140       //cout << "VR: " << VR << ", VI: " << VI << endl;
141       fTfR[i] = VR*ppower(10,9);
142       fTfI[i] = VI*ppower(10,9);
143       //cout << "fTfR[" << i << "] = " << fTfR[i] << endl;
144       //cout << "fTfI[" << i << "] = " << fTfI[i] << endl;
145       if(i) {
146         fTfR[kMaxNofSamples-i] = fTfR[i];
147         fTfI[kMaxNofSamples-i] = -fTfI[i];
148       }
149     }
150   }
151   
152   // Compute Fourier Weights
153
154   for(i=0; i<=kMaxNofSamples/2; i++) {
155     fWR[i] = cos(-2.*PI*i/kMaxNofSamples);
156     fWI[i] = sin(-2.*PI*i/kMaxNofSamples);
157     if(i) {
158       fWR[kMaxNofSamples-i] = fWR[i];
159       fWI[kMaxNofSamples-i] = -fWI[i];
160     }
161   }
162
163 }
164
165 void AliITSetfSDD::PrintElectronics()
166 {
167   cout << "Time Delay " << fTimeDelay << endl;
168   cout << "Sampling Time " << fSamplingTime << endl;
169   cout << "Number of Time Samples " << kMaxNofSamples << endl;
170   cout << "fT0 " << fT0 << endl;
171   cout << "fDf " << fDf << endl;
172   cout << "fA0 " << fA0 << endl;
173
174   cout << "Zero's and Pole's" << endl;
175   cout << "fZeroM " << endl;
176   Int_t i;
177   for(i=0; i<kMaxNofPoles; i++) cout << fZeroM[i] << endl;
178   cout << "fZero_R " << endl;
179   for(i=0; i<kMaxNofPoles; i++) cout << fZeroR[i] << endl;
180   cout << "fZeroI " << endl;
181   for(i=0; i<kMaxNofPoles; i++) cout << fZeroI[i] << endl;
182   cout << "fPoleM " << endl;
183   for(i=0; i<kMaxNofPoles; i++) cout << fPoleM[i] << endl;
184   cout << "fPoleR " << endl;
185   for(i=0; i<kMaxNofPoles; i++) cout << fPoleR[i] << endl;
186   cout << "fPoleI " << endl;
187   for(i=0; i<kMaxNofPoles; i++) cout << fPoleI[i] << endl;
188
189   cout << "Transfer function" << endl;
190   cout << "Real Part" << endl;
191   for(i=0; i<kMaxNofSamples; i++) cout << fTfR[i] << endl;
192   cout << "Imaginary Part " << endl;
193   for(i=0; i<kMaxNofSamples; i++) cout << fTfI[i] << endl;
194
195   cout << "Fourier Weights" << endl;
196   cout << "Real Part" << endl;
197   for(i=0; i<kMaxNofSamples; i++) cout << fWR[i] << endl;
198   cout << "Imaginary Part " << endl;
199   for(i=0; i<kMaxNofSamples; i++) cout << fWI[i] << endl;
200 }
201
202
203
204
205
206
207
208