00001 #include "splitter.h"
00002 #include "data.h"
00003
00004
00005 template<unsigned int Nunmod, class Unmod, unsigned int Nsplit, class Split>
00006 bool RecoSplitter<Nunmod,Unmod,Nsplit,Split>::process(RecoData& rd, RecoController& controller) {
00007 Log<Reco> odinlog(c_label(),"process");
00008
00009
00010
00011 ComplexData<Nsplit+Nunmod>& indata=rd.data(Rank<Nsplit+Nunmod>());
00012
00013 TinyVector<int,Nsplit> splitshape;
00014 for(int i=0; i<int(Nsplit); i++) splitshape(i)=indata.extent(i);
00015
00016 TinyVector<int,Nunmod> outshape;
00017 for(int i=0; i<int(Nunmod); i++) outshape(i)=indata.extent(Nsplit+i);
00018
00019 ODINLOG(odinlog,normalDebug) << "indata.shape()/outshape/splitshape=" << indata.shape() << "/" << outshape << "/" << splitshape << STD_endl;
00020
00021
00022 TinyVector<int,Nsplit+Nunmod> outshape_padded=1;
00023 for(unsigned int i=0; i<Nunmod; i++) outshape_padded(Nsplit+i)=outshape(i);
00024
00025
00026
00027
00028 TinyVector<int,Nsplit+Nunmod> lowin=0;
00029 TinyVector<int,Nsplit+Nunmod> uppin=outshape_padded-1;
00030
00031 TinyVector<int,Nsplit+Nunmod> lowout=0;
00032 TinyVector<int,Nsplit+Nunmod> uppout=outshape_padded-1;
00033
00034
00035 RectDomain<Nsplit+Nunmod> outdomain(lowout,uppout);
00036
00037 ComplexData<Nsplit+Nunmod> outdata_padded(outshape_padded);
00038 ComplexData<Nunmod> outdata(outshape);
00039
00040
00041 for(int isplit=0; isplit<product(splitshape); isplit++) {
00042
00043
00044 TinyVector<int,Nsplit> splitindex=index2extent(splitshape, isplit);
00045
00046
00047 for(unsigned int i=0; i<Nsplit; i++) lowin(i)=uppin(i)=splitindex(i);
00048
00049
00050 RectDomain<Nsplit+Nunmod> indomain(lowin,uppin);
00051 outdata_padded(outdomain)=indata(indomain);
00052
00053 outdata_padded.convert_to(outdata);
00054
00055
00056 RecoData rdout;
00057 rdout.copy_meta(rd);
00058 Split::modify(RecoIndex::separate, rdout.coord());
00059 Split::set_index(splitindex, rdout.coord());
00060 rdout.data(Rank<Nunmod>()).reference(outdata);
00061 if(!execute_next_step(rdout,controller)) return false;
00062
00063 }
00064
00065 return true;
00066 }