00001 #include "collector.h"
00002
00003
00004 template<unsigned int Nin, class In, unsigned int Ncoll, class Coll, bool use_numof>
00005 bool RecoCollector<Nin,In,Ncoll,Coll,use_numof>::process(RecoData& rd, RecoController& controller) {
00006 Log<Reco> odinlog(c_label(),"process");
00007
00008 TinyVector<int,Ncoll> index;
00009 Coll::create_index(rd.coord(), index);
00010
00011 TinyVector<int,Ncoll> shape;
00012 Coll::create_shape(rd.coord(), shape);
00013
00014
00015 TinyVector<int,Ncoll+Nin> collshape;
00016 for(int i=0; i<int(Ncoll); i++) collshape(i)=shape(i);
00017 for(int i=0; i<int(Nin); i++) collshape(Ncoll+i)=rd.data(Rank<Nin>()).extent(i);
00018 ODINLOG(odinlog,normalDebug) << "index/shape/collshape=" << index << "/" << shape << "/" << collshape << STD_endl;
00019 if(!product(collshape)) {
00020 ODINLOG(odinlog,errorLog) << "Zero-size shape " << collshape << STD_endl;
00021 return false;
00022 }
00023
00024
00025 modify_coord(rd.coord());
00026
00027
00028 ComplexData<Ncoll+Nin> indata;
00029 rd.data(Rank<Nin>()).convert_to(indata);
00030
00031
00032 TinyVector<int,Ncoll+Nin> lowin=0;
00033 TinyVector<int,Ncoll+Nin> uppin=0;
00034
00035 TinyVector<int,Ncoll+Nin> lowdst=0;
00036 TinyVector<int,Ncoll+Nin> uppdst=0;
00037
00038 for(int i=0; i<int(Ncoll); i++) lowdst(i)=uppdst(i)=index(i);
00039 for(int i=0; i<int(Nin); i++) uppin(Ncoll+i)=uppdst(Ncoll+i)=rd.data(Rank<Nin>()).extent(i)-1;
00040 ODINLOG(odinlog,normalDebug) << "lowin/uppin=" << lowin << "/" << uppin << STD_endl;
00041 ODINLOG(odinlog,normalDebug) << "lowdst/uppdst=" << lowdst << "/" << uppdst << STD_endl;
00042
00043 RectDomain<Ncoll+Nin> indomain(lowin,uppin);
00044 RectDomain<Ncoll+Nin> dstdomain(lowdst,uppdst);
00045
00046
00047 mutex.lock();
00048 ComplexData<Ncoll+Nin>& dataref=datamap[rd.coord()];
00049 if(dataref.shape()!=collshape) {
00050 dataref.resize(collshape);
00051 dataref=STD_complex(0.0);
00052 }
00053 dataref(dstdomain)=dataref(dstdomain)+indata(indomain);
00054 mutex.unlock();
00055
00056 unsigned int numof_count=0;
00057 if(use_numof) numof_count=product(shape);
00058
00059 if( completed(rd.coord(),numof_count) ) {
00060 ODINLOG(odinlog,normalDebug) << " data " << collshape << " complete" << STD_endl;
00061
00062
00063 mutex.lock();
00064 typename DataMap::iterator it=datamap.find(rd.coord());
00065 rd.data(Rank<Nin>()).free();
00066 rd.data(Rank<Ncoll+Nin>()).reference(it->second);
00067 datamap.erase(it);
00068 mutex.unlock();
00069
00070 if(!execute_next_step(rd,controller)) return false;
00071 }
00072
00073 return true;
00074 }
00075
00076
00077
00078 template<unsigned int Nin, class In, unsigned int Ncoll, class Coll, bool use_numof>
00079 bool RecoCollector<Nin,In,Ncoll,Coll,use_numof>::query(RecoQueryContext& context) {
00080 Log<Reco> odinlog(c_label(),"query");
00081
00082 if(context.mode==RecoQueryContext::prep) {
00083 if(!use_numof) {
00084 RecoCoord outmask=context.coord;
00085 modify_coord(outmask);
00086 if(!calculate_count(context, context.coord, outmask)) return false;
00087 }
00088 }
00089
00090 return RecoStep::query(context);
00091 }