#include "TROOT.h"
#include "TVirtualFFT.h"
#include "TPluginManager.h"
#include "TEnv.h"
#include "Api.h"
TVirtualFFT *TVirtualFFT::fgFFT = 0;
TString TVirtualFFT::fgDefault = "";
ClassImp(TVirtualFFT)
TVirtualFFT::~TVirtualFFT()
{
if (this==fgFFT)
fgFFT = 0;
}
TVirtualFFT* TVirtualFFT::FFT(Int_t ndim, Int_t *n, Option_t *option)
{
Int_t inputtype=0, currenttype=0;
TString opt = option;
opt.ToUpper();
Option_t *flag;
if (opt.Contains("ES")) flag = "ES";
if (opt.Contains("M")) flag = "M";
if (opt.Contains("P")) flag = "P";
if (opt.Contains("EX")) flag = "EX";
else flag = "ES";
Int_t ndiff = 0;
if (!opt.Contains("K")) {
if (fgFFT){
if (fgFFT->GetNdim()!=ndim)
ndiff++;
else {
Int_t *ncurrent = fgFFT->GetN();
for (Int_t i=0; i<ndim; i++){
if (n[i]!=ncurrent[i])
ndiff++;
}
}
Option_t *t = fgFFT->GetType();
if (!opt.Contains(t)) {
if (opt.Contains("HC") || opt.Contains("DHT"))
inputtype = 1;
if (strcmp(t,"R2HC")==0 || strcmp(t,"HC2R")==0 || strcmp(t,"DHT")==0)
currenttype=1;
if (!(inputtype==1 && currenttype==1))
ndiff++;
}
if (ndiff>0){
delete fgFFT;
fgFFT = 0;
}
}
}
Int_t sign = 0;
if (opt.Contains("C2CB") || opt.Contains("C2R"))
sign = 1;
if (opt.Contains("C2CF") || opt.Contains("R2C"))
sign = -1;
TVirtualFFT *fft = 0;
if (opt.Contains("K") || !fgFFT) {
TPluginHandler *h;
TString pluginname;
if (fgDefault.Length()==0) fgDefault="fftw";
if (strcmp(fgDefault.Data(),"fftw")==0) {
if (opt.Contains("C2C")) pluginname = "fftwc2c";
if (opt.Contains("C2R")) pluginname = "fftwc2r";
if (opt.Contains("R2C")) pluginname = "fftwr2c";
if (opt.Contains("HC") || opt.Contains("DHT")) pluginname = "fftwr2r";
if ((h=gROOT->GetPluginManager()->FindHandler("TVirtualFFT", pluginname))) {
if (h->LoadPlugin()==-1) {
printf("handler not found\n");
return 0;
}
fft = (TVirtualFFT*)h->ExecPlugin(3, ndim, n, kFALSE);
Int_t *kind = new Int_t[1];
if (pluginname=="fftwr2r") {
if (opt.Contains("R2HC")) kind[0] = 10;
if (opt.Contains("HC2R")) kind[0] = 11;
if (opt.Contains("DHT")) kind[0] = 12;
}
fft->Init(flag, sign, kind);
if (!opt.Contains("K")) {
fgFFT = fft;
}
delete [] kind;
return fft;
}
else {
printf("plugin not found\n");
return 0;
}
}
} else {
if (fgFFT->GetSign()!=sign || !opt.Contains(fgFFT->GetTransformFlag()) || !opt.Contains(fgFFT->GetType())) {
Int_t *kind = new Int_t[1];
if (inputtype==1) {
if (opt.Contains("R2HC")) kind[0] = 10;
if (opt.Contains("HC2R")) kind[0] = 11;
if (opt.Contains("DHT")) kind[0] = 12;
}
fgFFT->Init(flag, sign, kind);
delete [] kind;
}
}
return fgFFT;
}
TVirtualFFT* TVirtualFFT::SineCosine(Int_t ndim, Int_t *n, Int_t *r2rkind, Option_t *option)
{
TString opt = option;
Option_t *flag;
if (opt.Contains("ES")) flag = "ES";
if (opt.Contains("M")) flag = "M";
if (opt.Contains("P")) flag = "P";
if (opt.Contains("EX")) flag = "EX";
else flag = "ES";
if (!opt.Contains("K")) {
if (fgFFT){
Int_t ndiff = 0;
if (fgFFT->GetNdim()!=ndim || strcmp(fgFFT->GetType(),"R2R")!=0)
ndiff++;
else {
Int_t *ncurrent = fgFFT->GetN();
for (Int_t i=0; i<ndim; i++) {
if (n[i] != ncurrent[i])
ndiff++;
}
}
if (ndiff>0) {
delete fgFFT;
fgFFT = 0;
}
}
}
TVirtualFFT *fft = 0;
if (!fgFFT || opt.Contains("K")) {
TPluginHandler *h;
TString pluginname;
if (fgDefault.Length()==0) fgDefault="fftw";
if (strcmp(fgDefault.Data(),"fftw")==0) {
pluginname = "fftwr2r";
if ((h=gROOT->GetPluginManager()->FindHandler("TVirtualFFT", pluginname))) {
if (h->LoadPlugin()==-1){
printf("handler not found\n");
return 0;
}
fft = (TVirtualFFT*)h->ExecPlugin(3, ndim, n, kFALSE);
fft->Init(flag, 0, r2rkind);
if (!opt.Contains("K"))
fgFFT = fft;
return fft;
} else {
printf("handler not found\n");
return 0;
}
}
}
fgFFT->Init(flag,0, r2rkind);
return fgFFT;
}
TVirtualFFT* TVirtualFFT::GetCurrentTransform()
{
if (fgFFT)
return fgFFT;
else{
printf("fgFFT is not defined yet\n");
return 0;
}
}
void TVirtualFFT::SetTransform(TVirtualFFT* fft)
{
fgFFT = fft;
}
const char *TVirtualFFT::GetDefaultFFT()
{
return fgDefault.Data();
}
void TVirtualFFT::SetDefaultFFT(const char *name)
{
if (fgDefault == name) return;
delete fgFFT;
fgFFT = 0;
fgDefault = name;
}
ROOT page - Class index - Class Hierarchy - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.