// first try #include #include #include #include "dataLoader.h" #include "Hough5DNode.h" #include #include //#include // struct Node { // float center[5]; // float proj0[2]; // float proj1[2]; // float proj2[2]; // float proj3[2]; // float proj4[2]; // int level; // int sideLength; // int vote; // }; typedef unsigned int uint; //__constant__ float* clusterPos_d; //TODO: make clusterPos (paramPos, outp of riemannTransform) CONSTANT/ TEXTURE __device__ __constant__ float globalMins_d[5]; __device__ __constant__ float globalMaxs_d[5]; __global__ void riemannTransform(float* clPos, float* paramPos, int nClusters, float SCALING) { //can we make something SHARED here? int tID = blockIdx.x * blockDim.x + threadIdx.x; if(tID 0); } } //has to be tested if this is good or bad for performance if(signs1 == 0 || signs1 == 4) continue; //test for interesection in (phi, theta, c) ------------ float phi1 = proj0[n*2]*(_maxs[0] - _mins[0]) + 90; float phi2 = proj0[n*2+1]*(_maxs[0] - _mins[0]) + 90; float phiCoords[2] = {phi1, phi2}; float theta1 = (proj1[n*2] + 0.5)* (_maxs[1] - _mins[1]) +_mins[1]; float theta2 = (proj1[n*2+1] + 0.5)* (_maxs[1] - _mins[1]) +_mins[1]; float thetaCoords[2] = {theta1, theta2}; float c1 = proj2[n*2] * (_maxs[2] - _mins[2]); float c2 = proj2[n*2+1] * (_maxs[2] - _mins[2]) ; int sign=0; for(int p=0; p<2; p++) for(int t=0; t<2; t++) { float n1 = __sinf(thetaCoords[t]*PI_180)*__cosf(phiCoords[p]*PI_180); float n2 = __sinf(thetaCoords[t]*PI_180)*__sinf(phiCoords[p]*PI_180); float n3 = __cosf(thetaCoords[t]*PI_180); float c = x_R*n1 + y_R*n2 + z_R*n3; sign+=(int)(c1-c > 0); sign+=(int)(c2-c > 0); } test[tID] = sign; if(sign == 32 || sign==0) continue; atomicAdd(&(votes[n]),(uint)1); } } } // MAIN -------------------------------------------------------------------- int main(int argc, char** argv) { extern char *optarg; int c; int TREE_DEPTH = 6; //number of space divisions int THRESHOLD = 40; while ((c = getopt(argc, argv, "t:d:")) != -1) switch (c) { case 't': THRESHOLD = atoi(optarg); break; case 'd': TREE_DEPTH = atoi(optarg); break; } //READ data and CREATE histograms and data containers ----------------- bool CUT_CHAMBER=true; //only collect hits with x>0; uint EVENT=6; TString dir = "../../DATA/"; TString project = "Test10"; project=dir+project; TString reco_filename = project+".reco.root"; dataLoader loader(reco_filename); loader.setEvent(EVENT); int nCL = loader.nClusters(); //set global parameters ---------------------------------- float RIEMANNSCALING = 40; float m_Max = 1.; float m_Min = -1.; float t_Max = 5.; float t_Min = -5.; float phi_Min = 0; float phi_Max = 180; float theta_Min = 65; float theta_Max = 95; float c_Min = -0.1; float c_Max = 0.1; std::cout<<"Setting parameter arrays . . ."<>>(clusterPos_d, clusterData_d, nClusters, RIEMANNSCALING); std::cout<<"Finished executing kernel" <setParamSpace(mins, maxs); std::vector parent_list; std::vector solution_list; //evil shit --- init everything in array form uint* votes, *votes_d; float* proj0, *proj0_d; float* proj1, *proj1_d; float* proj2, *proj2_d; float* proj3, *proj3_d; float* proj4, *proj4_d; votes = (uint*) malloc(MAXSIZE*1*sizeof(uint)); votes[0] = 0; //setting to zero proj0 = (float*) malloc(MAXSIZE*2*sizeof(float)); proj1 = (float*) malloc(MAXSIZE*2*sizeof(float)); proj2 = (float*) malloc(MAXSIZE*2*sizeof(float)); proj3 = (float*) malloc(MAXSIZE*2*sizeof(float)); proj4 = (float*) malloc(MAXSIZE*2*sizeof(float)); float* test, *test_d; int nNodes = 1; //number of active nodes cudaMalloc((void**) &votes_d, MAXSIZE*sizeof(uint)); cudaMalloc((void**) &proj0_d, MAXSIZE*2*sizeof(float)); cudaMalloc((void**) &proj1_d, MAXSIZE*2*sizeof(float)); cudaMalloc((void**) &proj2_d, MAXSIZE*2*sizeof(float)); cudaMalloc((void**) &proj3_d, MAXSIZE*2*sizeof(float)); cudaMalloc((void**) &proj4_d, MAXSIZE*2*sizeof(float)); cudaMalloc((void**) &test_d, nClusters*sizeof(float)); test = (float*) malloc(nClusters*sizeof(float)); for(int i=0; igetProjection0(); proj1 = root->getProjection1(); proj2 = root->getProjection2(); proj3 = root->getProjection3(); proj4 = root->getProjection4(); cudaMemcpy(votes_d, votes, nNodes*sizeof(uint), cudaMemcpyHostToDevice); cudaMemcpy(proj0_d, proj0, nNodes*2*sizeof(float), cudaMemcpyHostToDevice); cudaMemcpy(proj1_d, proj1, nNodes*2*sizeof(float), cudaMemcpyHostToDevice); cudaMemcpy(proj2_d, proj2, nNodes*2*sizeof(float), cudaMemcpyHostToDevice); cudaMemcpy(proj3_d, proj3, nNodes*2*sizeof(float), cudaMemcpyHostToDevice); cudaMemcpy(proj4_d, proj4, nNodes*2*sizeof(float), cudaMemcpyHostToDevice); //KERNEL CALL std::cout<<"Starting kernel testIntersect . . ."<>> (1, 0, nClusters, clusterData_d, proj0_d, proj1_d, proj2_d, proj3_d, proj4_d, votes_d, test_d); std::cout<<"Finished executing kernel" <= THRESHOLD) parent_list.push_back(root); else return 0; std::cout<<"\nMade it through rootnode, starting FHT 32-tree search . . .\n" < _newParents; //Hough5DNode* blub = new Hough5DNode(NULL,0,100); //blub->print(); //delete blub; //std::cout<<"BLUB DELETED"<print(); float* sons = the_node->getSonArray(); for(int s=0; s<32; ++s) { _newParents.push_back(new Hough5DNode(sons+5*s,L,nClusters)); Hough5DNode* the_son=_newParents.back(); float* p0 = the_son->getProjection0(); float* p1 = the_son->getProjection1(); float* p2 = the_son->getProjection2(); float* p3 = the_son->getProjection3(); float* p4 = the_son->getProjection4(); proj0[p*32*2+2*s] = p0[0]; proj0[p*32*2+2*s+1] = p0[1]; proj1[p*32*2+2*s] = p1[0]; proj1[p*32*2+2*s+1] = p1[1]; proj2[p*32*2+2*s] = p2[0]; proj2[p*32*2+2*s+1] = p2[1]; proj3[p*32*2+2*s] = p3[0]; proj3[p*32*2+2*s+1] = p3[1]; proj4[p*32*2+2*s] = p4[0]; proj4[p*32*2+2*s+1] = p4[1]; } delete the_node; } std::cout<<"finished loop over parents"<>> (nNodes*32, L, nClusters, clusterData_d, proj0_d, proj1_d, proj2_d, proj3_d, proj4_d, votes_d, test_d); std::cout<<"Finished executing kernel" <