Beispiel #1
0
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;
    }
}
Beispiel #2
0
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;
}
Beispiel #3
0
Datei: merge.C Projekt: XuQiao/HI
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();
}