89 TVirtualFFT *TVirtualFFT::fgFFT = 0;
90 TString TVirtualFFT::fgDefault =
"";
92 ClassImp(TVirtualFFT);
97 TVirtualFFT::~TVirtualFFT()
132 TVirtualFFT* TVirtualFFT::FFT(Int_t ndim, Int_t *n, Option_t *option)
135 Int_t inputtype=0, currenttype=0;
136 TString opt = option;
141 if (opt.Contains(
"ES")) flag =
"ES";
142 if (opt.Contains(
"M")) flag =
"M";
143 if (opt.Contains(
"P")) flag =
"P";
144 if (opt.Contains(
"EX")) flag =
"EX";
148 if (!opt.Contains(
"K")) {
151 if (fgFFT->GetNdim()!=ndim)
154 Int_t *ncurrent = fgFFT->GetN();
155 for (Int_t i=0; i<ndim; i++){
156 if (n[i]!=ncurrent[i])
160 Option_t *t = fgFFT->GetType();
161 if (!opt.Contains(t)) {
162 if (opt.Contains(
"HC") || opt.Contains(
"DHT"))
164 if (strcmp(t,
"R2HC")==0 || strcmp(t,
"HC2R")==0 || strcmp(t,
"DHT")==0)
167 if (!(inputtype==1 && currenttype==1))
178 if (opt.Contains(
"C2CB") || opt.Contains(
"C2R"))
180 if (opt.Contains(
"C2CF") || opt.Contains(
"R2C"))
183 TVirtualFFT *fft = 0;
184 if (opt.Contains(
"K") || !fgFFT) {
186 R__LOCKGUARD(gROOTMutex);
190 if (fgDefault.Length()==0) fgDefault=
"fftw";
191 if (strcmp(fgDefault.Data(),
"fftw")==0) {
192 if (opt.Contains(
"C2C")) pluginname =
"fftwc2c";
193 if (opt.Contains(
"C2R")) pluginname =
"fftwc2r";
194 if (opt.Contains(
"R2C")) pluginname =
"fftwr2c";
195 if (opt.Contains(
"HC") || opt.Contains(
"DHT")) pluginname =
"fftwr2r";
196 if ((h=gROOT->GetPluginManager()->FindHandler(
"TVirtualFFT", pluginname))) {
197 if (h->LoadPlugin()==-1) {
198 ::Error(
"TVirtualFFT::FFT",
"handler not found");
201 fft = (TVirtualFFT*)h->ExecPlugin(3, ndim, n, kFALSE);
203 ::Error(
"TVirtualFFT::FFT",
"plugin failed to create TVirtualFFT object");
206 Int_t *kind =
new Int_t[1];
207 if (pluginname==
"fftwr2r") {
208 if (opt.Contains(
"R2HC")) kind[0] = 10;
209 if (opt.Contains(
"HC2R")) kind[0] = 11;
210 if (opt.Contains(
"DHT")) kind[0] = 12;
212 fft->Init(flag, sign, kind);
213 if (!opt.Contains(
"K")) {
220 ::Error(
"TVirtualFFT::FFT",
"plugin not found");
226 R__LOCKGUARD(gROOTMutex);
230 if (fgFFT->GetSign()!=sign || !opt.Contains(fgFFT->GetTransformFlag()) || !opt.Contains(fgFFT->GetType())) {
231 Int_t *kind =
new Int_t[1];
233 if (opt.Contains(
"R2HC")) kind[0] = 10;
234 if (opt.Contains(
"HC2R")) kind[0] = 11;
235 if (opt.Contains(
"DHT")) kind[0] = 12;
237 fgFFT->Init(flag, sign, kind);
280 TVirtualFFT* TVirtualFFT::SineCosine(Int_t ndim, Int_t *n, Int_t *r2rkind, Option_t *option)
282 TString opt = option;
286 if (opt.Contains(
"ES")) flag =
"ES";
287 if (opt.Contains(
"M")) flag =
"M";
288 if (opt.Contains(
"P")) flag =
"P";
289 if (opt.Contains(
"EX")) flag =
"EX";
291 if (!opt.Contains(
"K")) {
294 if (fgFFT->GetNdim()!=ndim || strcmp(fgFFT->GetType(),
"R2R")!=0)
297 Int_t *ncurrent = fgFFT->GetN();
298 for (Int_t i=0; i<ndim; i++) {
299 if (n[i] != ncurrent[i])
310 TVirtualFFT *fft = 0;
312 R__LOCKGUARD(gROOTMutex);
314 if (!fgFFT || opt.Contains(
"K")) {
317 if (fgDefault.Length()==0) fgDefault=
"fftw";
318 if (strcmp(fgDefault.Data(),
"fftw")==0) {
319 pluginname =
"fftwr2r";
320 if ((h=gROOT->GetPluginManager()->FindHandler(
"TVirtualFFT", pluginname))) {
321 if (h->LoadPlugin()==-1){
322 ::Error(
"TVirtualFFT::SineCosine",
"handler not found");
325 fft = (TVirtualFFT*)h->ExecPlugin(3, ndim, n, kFALSE);
327 ::Error(
"TVirtualFFT::SineCosine",
"plugin failed to create TVirtualFFT object");
330 fft->Init(flag, 0, r2rkind);
331 if (!opt.Contains(
"K"))
335 ::Error(
"TVirtualFFT::SineCosine",
"handler not found");
342 fgFFT->Init(flag,0, r2rkind);
349 TVirtualFFT* TVirtualFFT::GetCurrentTransform()
354 ::Warning(
"TVirtualFFT::GetCurrentTransform",
"fgFFT is not defined yet");
362 void TVirtualFFT::SetTransform(TVirtualFFT* fft)
370 const char *TVirtualFFT::GetDefaultFFT()
372 return fgDefault.Data();
378 void TVirtualFFT::SetDefaultFFT(
const char *name)
380 if (fgDefault == name)
return;