#include <Riostream.h>
#include <TMath.h>
#include "AliITSetfSDD.h"
using std::endl;
using std::cout;
ClassImp(AliITSetfSDD)
const Int_t AliITSetfSDD::AliITSetfSDDparam::fgkMaxNofPoles = 5;
const Int_t AliITSetfSDD::AliITSetfSDDparam::fgkMaxNofSamples = 1024;
AliITSetfSDD::AliITSetfSDD():
fTimeDelay(0),
fSamplingTime(0),
fT0(0),
fDf(0.),
fA0(0.) ,
fZeroM(0),
fZeroR(0),
fZeroI(0),
fPoleM(0),
fPoleR(0),
fPoleI(0),
fTfR(0),
fTfI(0),
fWR(0),
fWI(0){
}
AliITSetfSDD::AliITSetfSDD(Double_t timestep, Int_t amplif):
fTimeDelay(0),
fSamplingTime(0),
fT0(0),
fDf(0.),
fA0(0.) ,
fZeroM(0),
fZeroR(0),
fZeroI(0),
fPoleM(0),
fPoleR(0),
fPoleI(0),
fTfR(0),
fTfI(0),
fWR(0),
fWI(0)
{
fTimeDelay = 53.5;
if(amplif == 2) fTimeDelay = 35.5;
fSamplingTime = timestep;
Double_t xGiga=1.0E+9;
fT0 = 0.;
fDf = xGiga/(AliITSetfSDDparam::NumberOfSamples()*fSamplingTime);
Int_t i,j;
fZeroM = new Double_t[AliITSetfSDDparam::NumberOfPoles()];
fZeroR = new Double_t [AliITSetfSDDparam::NumberOfPoles()];
fZeroI = new Double_t [AliITSetfSDDparam::NumberOfPoles()];
fPoleM = new Double_t [AliITSetfSDDparam::NumberOfPoles()];
fPoleR = new Double_t [AliITSetfSDDparam::NumberOfPoles()];
fPoleI = new Double_t [AliITSetfSDDparam::NumberOfPoles()];
fTfR = new Double_t [AliITSetfSDDparam::NumberOfSamples()];
fTfI = new Double_t [AliITSetfSDDparam::NumberOfSamples()];
fWR = new Double_t [AliITSetfSDDparam::NumberOfSamples()];
fWI = new Double_t [AliITSetfSDDparam::NumberOfSamples()];
for(i=0; i<AliITSetfSDDparam::NumberOfPoles(); i++) {
fZeroM[i] = 0.;
fZeroR[i] = 0.;
fZeroI[i] = 0.;
fPoleM[i] = 0.;
fPoleR[i] = 0.;
fPoleI[i] = 0.;
}
fA0 = 5.53269815e+11;
fPoleM[0] = 3.;
fPoleR[0] = -8280000.;
fPoleI[0] = 0.;
if(amplif == 2) {
fA0 = 24000.;
fPoleM[0] = 1.;
fPoleR[0] = -3000000.;
fPoleI[0] = 4000000.;
fPoleM[1] = 1.;
fPoleR[1] = fPoleR[0];
fPoleI[1] = -fPoleI[0];
}
if( amplif == 3 ) {
fA0 = 16500.;
fPoleM[0] = 1.;
fPoleR[0] = -4140000.;
fPoleI[0] = 0.;
fPoleM[1] = 1.;
fPoleR[1] = fPoleR[0];
fPoleI[1] = -fPoleI[0];
}
Double_t pigr = acos(-1.);
for(i=0; i<=AliITSetfSDDparam::NumberOfSamples()/2; i++) {
Double_t frequency = fDf*i;
Double_t vVM = fA0;
Double_t vVA = 0.;
for(Int_t k=0; k<AliITSetfSDDparam::NumberOfPoles(); k++) {
if(fZeroM[k]) {
Double_t vVZR = -fZeroR[k];
Double_t vVZI = frequency - fZeroI[k];
Double_t vVZM = TMath::Sqrt(vVZR*vVZR+vVZI*vVZI);
Double_t vVZA = TMath::ATan2(vVZI,vVZR);
for(j=1; j<= (Int_t) fZeroM[k]; j++) {
vVM *= vVZM;
vVA += vVZA;
if(vVA >= pigr) vVA -= (2.*pigr);
if(vVA <= -pigr) vVA += (2.*pigr);
}
}
if(fPoleM[k]) {
Double_t vVPR = -fPoleR[k];
Double_t vVPI = frequency - fPoleI[k];
Double_t vVPM = TMath::Sqrt(vVPR*vVPR+vVPI*vVPI);
Double_t vVPA = TMath::ATan2(vVPI,vVPR);
for(j=1; j<= (Int_t) fPoleM[k]; j++) {
vVM /= vVPM;
vVA -= vVPA;
if(vVA >= pigr) vVA -= (2.*pigr);
if(vVA <= -pigr) vVA += (2.*pigr);
}
}
Double_t vVR = vVM*cos(vVA);
Double_t vVI = vVM*sin(vVA);
fTfR[i] = vVR*xGiga;
fTfI[i] = vVI*xGiga;
if(i) {
fTfR[AliITSetfSDDparam::NumberOfSamples()-i] = fTfR[i];
fTfI[AliITSetfSDDparam::NumberOfSamples()-i] = -fTfI[i];
}
}
}
for(i=0; i<=AliITSetfSDDparam::NumberOfSamples()/2; i++) {
fWR[i] = cos(-2.*pigr*i/AliITSetfSDDparam::NumberOfSamples());
fWI[i] = sin(-2.*pigr*i/AliITSetfSDDparam::NumberOfSamples());
if(i) {
fWR[AliITSetfSDDparam::NumberOfSamples()-i] = fWR[i];
fWI[AliITSetfSDDparam::NumberOfSamples()-i] = -fWI[i];
}
}
}
AliITSetfSDD::~AliITSetfSDD(){
if(fZeroM) delete []fZeroM;
if(fZeroR) delete []fZeroR;
if(fZeroI) delete []fZeroI;
if(fPoleM) delete []fPoleM;
if(fPoleR) delete []fPoleR;
if(fPoleI) delete []fPoleI;
if(fTfR) delete []fTfR;
if(fTfI) delete []fTfI;
if(fWR) delete []fWR;
if(fWI) delete []fWI;
}
void AliITSetfSDD::PrintElectronics() const {
cout << "Time Delay " << fTimeDelay << endl;
cout << "Sampling Time " << fSamplingTime << endl;
cout << "Number of Time Samples " << AliITSetfSDDparam::NumberOfSamples() << endl;
cout << "fT0 " << fT0 << endl;
cout << "fDf " << fDf << endl;
cout << "fA0 " << fA0 << endl;
cout << "Zero's and Pole's" << endl;
cout << "fZeroM " << endl;
Int_t i;
for(i=0; i<AliITSetfSDDparam::NumberOfPoles(); i++) cout << fZeroM[i] << endl;
cout << "fZero_R " << endl;
for(i=0; i<AliITSetfSDDparam::NumberOfPoles(); i++) cout << fZeroR[i] << endl;
cout << "fZeroI " << endl;
for(i=0; i<AliITSetfSDDparam::NumberOfPoles(); i++) cout << fZeroI[i] << endl;
cout << "fPoleM " << endl;
for(i=0; i<AliITSetfSDDparam::NumberOfPoles(); i++) cout << fPoleM[i] << endl;
cout << "fPoleR " << endl;
for(i=0; i<AliITSetfSDDparam::NumberOfPoles(); i++) cout << fPoleR[i] << endl;
cout << "fPoleI " << endl;
for(i=0; i<AliITSetfSDDparam::NumberOfPoles(); i++) cout << fPoleI[i] << endl;
cout << "Transfer function" << endl;
cout << "Real Part" << endl;
for(i=0; i<AliITSetfSDDparam::NumberOfSamples(); i++) cout << fTfR[i] << endl;
cout << "Imaginary Part " << endl;
for(i=0; i<AliITSetfSDDparam::NumberOfSamples(); i++) cout << fTfI[i] << endl;
cout << "Fourier Weights" << endl;
cout << "Real Part" << endl;
for(i=0; i<AliITSetfSDDparam::NumberOfSamples(); i++) cout << fWR[i] << endl;
cout << "Imaginary Part " << endl;
for(i=0; i<AliITSetfSDDparam::NumberOfSamples(); i++) cout << fWI[i] << endl;
}