void HashGrid_init (HashGrid *hg, uint32_t grid_dim, double bin_size_meters, coord_t *coords, uint32_t n_items) { // Initialize all struct members. hg->grid_dim = grid_dim; hg->coords = coords; hg->bin_size_meters = bin_size_meters; coord_from_meters (&(hg->bin_size), bin_size_meters, bin_size_meters); hg->n_items = n_items; hg->counts = malloc(sizeof(uint32_t) * grid_dim * grid_dim); hg->bins = malloc(sizeof(uint32_t *) * grid_dim * grid_dim); hg->items = malloc(sizeof(uint32_t) * n_items); // Initalize all dynamically allocated arrays. uint32_t (*counts)[grid_dim] = hg->counts; uint32_t *(*bins)[grid_dim] = hg->bins; for (uint32_t y = 0; y < grid_dim; ++y) { for (uint32_t x = 0; x < grid_dim; ++x) { counts[y][x] = 0; bins [y][x] = NULL; } } // Count the number of items that will fall into each bin. for (uint32_t c = 0; c < n_items; ++c) { T printf("binning coordinate x=%d y=%d \n", (coords + c)->x, (coords + c)->y); counts[ybin(hg, coords + c)][xbin(hg, coords + c)] += 1; } // Set bin pointers to alias subregions of the items array (which will be filled later). uint32_t *bin = hg->items; for (uint32_t y = 0; y < grid_dim; ++y) { for (uint32_t x = 0; x < grid_dim; ++x) { bins[y][x] = bin; bin += counts[y][x]; // Reset bin item count for reuse when filling up bins. counts[y][x] = 0; } } // Add the item indexes to the bins, which are pointers to regions within the items array. for (uint32_t c = 0; c < n_items; ++c) { coord_t *coord = coords + c; uint32_t x = xbin (hg, coord); uint32_t y = ybin (hg, coord); uint32_t i = counts[y][x]; bins[y][x][i] = c; counts[y][x] += 1; } }
void HashGrid_query (HashGrid *hg, HashGridResult *result, coord_t coord, double radius_meters) { result->coord = coord; result->radius_meters = radius_meters; coord_t radius; coord_from_meters (&radius, radius_meters, radius_meters); result->hg = hg; result->min.x = (coord.x - radius.x); // misbehaves at 0? need wrap macro? result->min.y = (coord.y - radius.y); result->max.x = (coord.x + radius.x); // coord_subtract / coord_add result->max.y = (coord.y + radius.y); result->xmin = xbin (hg, &(result->min)); result->ymin = ybin (hg, &(result->min)); result->xmax = xbin (hg, &(result->max)); result->ymax = ybin (hg, &(result->max)); result->x = result->xmin; result->y = result->ymin; result->i = 0; // should start at -1, which will increment to 0? result->has_next = true; }
void merge(){ TFile *f=TFile::Open(outG,"Update"); TString dirname; TVectorD Ncoll,B,Npart; TVectorD Ncollerr1,Berr1,Nparterr1; TVectorD Ncollerr2,Berr2,Nparterr2; TVectorD Ncollerr,Berr,Nparterr; TVectorD *NcollAver[nGlau+2], *NpartAver[nGlau+2], *BAver[nGlau+2]; ofstream output("sys.txt"); output<<setprecision(2)<<fixed; Ncoll.ResizeTo(nGlau+2);Npart.ResizeTo(nGlau+2);B.ResizeTo(nGlau+2); Ncollerr1.ResizeTo(N-1);Nparterr1.ResizeTo(N-1);Berr1.ResizeTo(N-1); Ncollerr2.ResizeTo(N-1);Nparterr2.ResizeTo(N-1);Berr2.ResizeTo(N-1); Ncollerr.ResizeTo(N-1);Nparterr.ResizeTo(N-1);Berr.ResizeTo(N-1); if(method==0){ output<<"kpoint_simu\t"<<"kpoint_data\t"<<"centbin\t"<<"<Ncoll>"<<"\t"<<"<Ncoll> err1"<<"\t"<<"<Ncoll> err2"<<"\t"<<"<Ncoll> err"<<"\t"<<endl; } else{ output<<"kpoint\t"<<"centbin_data\t"<<"centbin_simu\t"<<"<Ncoll>"<<"\t"<<"<Ncoll> err1"<<"\t"<<"<Ncoll> err2"<<"\t"<<"<Ncoll> err"<<"\t"<<endl; } //<<"<Npart>"<<"\t"<<"<Npart> err"<<"\t\t"<<"<B>"<<"\t"<<"<B> err"<<endl; TString name; TVectorD* kpoint; TVectorD* kpoint_; TVectorD* centbin; TVectorD* centbin_; for(int sth=0;sth<1;sth++){ Ncollerr1.Zero();Nparterr1.Zero();Berr1.Zero(); Ncollerr2.Zero();Nparterr2.Zero();Berr2.Zero(); Ncollerr.Zero();Nparterr.Zero();Berr.Zero(); if(sth==0){dirname = "std";} else if(sth==1){dirname ="Gri055";} else {dirname ="Gri101";} output<<dirname<<endl; centbin = (TVectorD*)f->Get(Form("%s/G0/centbin",dirname.Data())); kpoint = (TVectorD*)f->Get(Form("%s/G0/kpoint",dirname.Data())); if(method==0) kpoint_ = (TVectorD*)f->Get(Form("%s/G0/kpoint_",dirname.Data())); else centbin_ = (TVectorD*)f->Get(Form("%s/G0/centbin_",dirname.Data())); for(int i=0;i<N-1;i++){ for(int iGlau=0;iGlau<nGlau+2; iGlau++){ if(iGlau==0) name = "G0"; else if(iGlau<nGlau && iGlau>0) name = Form("Glau_%d",iGlau); else name = Form("bin_%d",iGlau-nGlau+1); NcollAver[iGlau] = (TVectorD*)f->Get(Form("%s/%s/NcollAver",dirname.Data(),name.Data())); NpartAver[iGlau] = (TVectorD*)f->Get(Form("%s/%s/NpartAver",dirname.Data(),name.Data())); BAver[iGlau] = (TVectorD*)f->Get(Form("%s/%s/BAver",dirname.Data(),name.Data())); Ncoll[iGlau]=(*NcollAver[iGlau])[i]/(*NcollAver[0])[i]; Npart[iGlau]=(*NpartAver[iGlau])[i]/(*NpartAver[0])[i]; B[iGlau]=(*BAver[iGlau])[i]/(*BAver[0])[i]; } for(int iGlau=0;iGlau<nGlau+2; iGlau++){ if(iGlau%2==1){ double Ncoll_err_add=(TMath::Abs(Ncoll[iGlau]-1)>TMath::Abs(Ncoll[iGlau+1]-1))?Ncoll[iGlau]-1:Ncoll[iGlau+1]-1; double Npart_err_add=(TMath::Abs(Npart[iGlau]-1)>TMath::Abs(Npart[iGlau+1]-1))?Npart[iGlau]-1:Npart[iGlau+1]-1; double B_err_add=(TMath::Abs(B[iGlau]-1)>TMath::Abs(B[iGlau+1]-1))?B[iGlau]-1:B[iGlau+1]-1; if(iGlau<nGlau){ Ncollerr1[i]+=TMath::Power(Ncoll_err_add,2); Nparterr1[i]+=TMath::Power(Npart_err_add,2); Berr1[i]+=TMath::Power(B_err_add,2); } else{ Ncollerr2[i]+=TMath::Power(Ncoll_err_add,2); Nparterr2[i]+=TMath::Power(Npart_err_add,2); Berr2[i]+=TMath::Power(B_err_add,2); } Ncollerr[i]+=TMath::Power(Ncoll_err_add,2); Nparterr[i]+=TMath::Power(Npart_err_add,2); Berr[i]+=TMath::Power(B_err_add,2); } } Ncollerr1[i]=TMath::Sqrt(Ncollerr1[i])*100;//(*NcollAver[0])[i]; Ncollerr2[i]=TMath::Sqrt(Ncollerr2[i])*100;//(*NcollAver[0])[i]; Nparterr1[i]=TMath::Sqrt(Nparterr1[i])*100;//(*NpartAver[0])[i]; Nparterr2[i]=TMath::Sqrt(Nparterr2[i])*100;//(*NpartAver[0])[i]; Berr1[i]=TMath::Sqrt(Berr1[i])*100;//(*BAver[0])[i]; Berr2[i]=TMath::Sqrt(Berr2[i])*100;//(*BAver[0])[i]; if(method==0) output<<(*kpoint)[i]<<" to "<<(*kpoint)[i+1]<<"\t"<<(*kpoint_)[i]<<" to "<<(*kpoint_)[i+1]<<"\t"<<(*centbin)[i]*100<<"% to "<<(*centbin)[i+1]*100<<"%:"<<"\t"<<(*NcollAver[0])[i]<<"\t"<<Ncollerr1[i]<<"%\t"<<Ncollerr2[i]<<"%\t"<<TMath::Sqrt(Ncollerr[i])*100<<"%"<<endl; else output<<(*kpoint)[i]<<" to "<<(*kpoint)[i+1]<<"\t"<<(*centbin_)[i]*100<<"% to "<<(*centbin_)[i+1]*100<<"%\t"<<(*centbin)[i]*100<<"% to "<<(*centbin)[i+1]*100<<"%:"<<"\t"<<(*NcollAver[0])[i]<<"\t"<<Ncollerr1[i]<<"%\t"<<Ncollerr2[i]<<"%\t"<<TMath::Sqrt(Ncollerr[i])*100<<"%"<<endl; //output<<(*kpoint)[i]<<" to "<<(*kpoint)[i+1]<<"\t"<<(*centbin)[i]*100<<"% to "<<(*centbin)[i+1]*100<<"%:"<<"\t"<<(*NcollAver[0])[i]<<"\t"<<Ncollerr1[i]<<"\t"<<Ncollerr2[i]<<"\t"<<Ncollerr[i]<<endl; //<<(*NpartAver[0])[i]<<"\t"<<Nparterr[i]<<"\t\t"<<(*BAver[0])[i]<<"\t"<<Berr[i]<<endl; output<<endl; } if(method==0) output<<"kpoint_simu\t"<<"kpoint_data\t"<<"centbin\t"<<"<Npart>"<<"\t"<<"<Npart> err1"<<"\t"<<"<Npart> err2"<<"\t"<<"<Npart> err"<<"\t"<<endl; else output<<"kpoint\t"<<"centbin_data\t"<<"centbin_simu\t"<<"<Ncoll>"<<"\t"<<"<Ncoll> err1"<<"\t"<<"<Ncoll> err2"<<"\t"<<"<Ncoll> err"<<"\t"<<endl; for(int i=0;i<N-1;i++){ if(method==0) output<<(*kpoint)[i]<<" to "<<(*kpoint)[i+1]<<"\t"<<(*kpoint_)[i]<<" to "<<(*kpoint_)[i+1]<<"\t"<<(*centbin)[i]*100<<"% to "<<(*centbin)[i+1]*100<<"%:"<<"\t"<<(*NpartAver[0])[i]<<"\t"<<Nparterr1[i]<<"%\t"<<Nparterr2[i]<<"%\t"<<TMath::Sqrt(Nparterr[i])*100<<"%"<<endl; else output<<(*kpoint)[i]<<" to "<<(*kpoint)[i+1]<<"\t"<<(*centbin_)[i]*100<<"% to "<<(*centbin_)[i+1]*100<<"%\t"<<(*centbin)[i]*100<<"% to "<<(*centbin)[i+1]*100<<"%:"<<"\t"<<(*NpartAver[0])[i]<<"\t"<<Nparterr1[i]<<"%\t"<<Nparterr2[i]<<"%\t"<<TMath::Sqrt(Ncollerr[i])*100<<"%"<<endl; output<<endl; } for(int i=0;i<N-1;i++){ Ncollerr[i]=TMath::Sqrt(Ncollerr[i])*(*NcollAver[0])[i]; Nparterr[i]=TMath::Sqrt(Nparterr[i])*(*NpartAver[0])[i]; Berr[i]=TMath::Sqrt(Berr[i])*(*BAver[0])[i]; } f->cd(dirname); Ncollerr.Write("Ncollerr",TObject::kOverwrite); Nparterr.Write("Nparterr",TObject::kOverwrite); Berr.Write("Berr",TObject::kOverwrite); std::vector<double> xbin(N-1); for(int i=0;i<N-1;i++) //xbin[i]=(centbin[N-i]+centbin[N-i-1])*100/2; xbin[i]=0.5+i; double *axbin = &xbin[0]; TGraphErrors *gr; double* aNcollAver = NcollAver[0]->GetMatrixArray(); double* aNcollerr = Ncollerr.GetMatrixArray(); double* aNpartAver = NpartAver[0]->GetMatrixArray(); double* aNparterr = Nparterr.GetMatrixArray(); double* aBAver = BAver[0]->GetMatrixArray(); double* aBerr = Berr.GetMatrixArray(); TString op; for(int option=0; option<3; option++){ if(option==0){ gr = new TGraphErrors(N-1,axbin,aNcollAver,0,aNcollerr); op="Ncoll_graph";} else if(option==1){ gr = new TGraphErrors(N-1,axbin,aNpartAver,0,aNparterr); op="Npart_graph";} else {gr = new TGraphErrors(N-1,axbin,aBAver,0,aBerr); op="B_graph";} gr->Write(op,TObject::kOverwrite); } } f->Close(); }