Changeset bb0b12c in sasview


Ignore:
Timestamp:
Jan 25, 2010 2:58:07 PM (14 years ago)
Author:
Jae Cho <jhjcho@…>
Branches:
master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
2f569b3
Parents:
1702180
Message:

Working on 2d circular and sector average for improvement on pix size effect

File:
1 edited

Legend:

Unmodified
Added
Removed
  • DataLoader/manipulations.py

    r8ba103f rbb0b12c  
    104104        y  = numpy.zeros(nbins) 
    105105        err_y = numpy.zeros(nbins) 
     106        x_counts = numpy.zeros(nbins) 
    106107        y_counts = numpy.zeros(nbins) 
    107108                                                 
     
    160161                        continue 
    161162             
    162                 x[i_q]          = q_value 
     163                x[i_q]          += q_value 
    163164                y[i_q]         += frac * data2D.data[j][i] 
    164165                if data2D.err_data == None or data2D.err_data[j][i]==0.0: 
     
    166167                else: 
    167168                    err_y[i_q] += frac * frac * data2D.err_data[j][i] * data2D.err_data[j][i] 
     169                x_counts[i_q] += 1 
    168170                y_counts[i_q]  += frac 
    169171                 
    170172        # Average the sums 
    171173        for i in range(nbins): 
    172             if y_counts[i]>0: 
     174            if x_counts[i]>0 and y_counts[i]>0: 
    173175                err_y[i] = math.sqrt(err_y[i])/y_counts[i] 
     176                x[i]     = x[i]/x_counts[i] 
    174177                y[i]     = y[i]/y_counts[i] 
    175178         
     
    356359        as a function of Q 
    357360    """ 
    358     def __init__(self, r_min=0.0, r_max=0.0, bin_width=0.001): 
     361    def __init__(self, r_min=0.0, r_max=0.0, bin_width=0.0005): 
    359362        # Minimum radius included in the average [A-1] 
    360363        self.r_min = r_min 
     
    378381        det_dist    = data2D.detector[0].distance 
    379382        wavelength  = data2D.source.wavelength 
    380         center_x    = data2D.detector[0].beam_center.x/pixel_width_x+0.5 
    381         center_y    = data2D.detector[0].beam_center.y/pixel_width_y+0.5 
     383        center_x    = data2D.detector[0].beam_center.x/pixel_width_x 
     384        center_y    = data2D.detector[0].beam_center.y/pixel_width_y 
    382385         
    383386        # Find out the maximum Q range 
     
    393396         
    394397        qmax = get_q(dx_max, dy_max, det_dist, wavelength) 
    395          
     398 
    396399        # Build array of Q intervals 
    397400        nbins = int(math.ceil((qmax-self.r_min)/self.bin_width)) 
     
    399402         
    400403        x  = numpy.zeros(nbins) 
     404        x_counts  = numpy.zeros(nbins) 
    401405        y  = numpy.zeros(nbins) 
    402406        err_y = numpy.zeros(nbins) 
    403407        y_counts = numpy.zeros(nbins) 
    404          
     408 
    405409        for i in range(numpy.size(data2D.data,1)): 
    406             dx = pixel_width_x*(i+0.5 - center_x) 
     410             
    407411             
    408412            # Min and max x-value for the pixel 
     
    411415             
    412416            for j in range(numpy.size(data2D.data,0)): 
    413                 dy = pixel_width_y*(j+0.5 - center_y) 
    414              
    415                 q_value = get_q(dx, dy, det_dist, wavelength) 
     417                 
    416418             
    417419                # Min and max y-value for the pixel 
     
    426428                q_11 = get_q(maxx, maxy, det_dist, wavelength) 
    427429                 
    428                 # Look for intercept between each side of the pixel 
    429                 # and the constant-q ring for qmax 
    430                 frac_max = get_pixel_fraction(self.r_max, q_00, q_01, q_10, q_11) 
    431                  
    432                 # Look for intercept between each side of the pixel 
    433                 # and the constant-q ring for qmin 
    434                 frac_min = get_pixel_fraction(self.r_min, q_00, q_01, q_10, q_11) 
    435                  
    436                 # We are interested in the region between qmin and qmax 
    437                 # therefore the fraction of the surface of the pixel 
    438                 # that we will use to calculate the number of counts to  
    439                 # include is given by: 
    440                 frac = frac_max - frac_min 
    441  
    442                 i_q = int(math.ceil((q_value-self.r_min)/self.bin_width)) - 1 
    443                 if q_value > qmax or q_value < self.r_min: 
    444                     continue 
    445                      
    446                 x[i_q]          = q_value 
    447                 y[i_q]         += frac * data2D.data[j][i] 
    448                 if data2D.err_data == None or data2D.err_data[j][i]==0.0: 
    449                     err_y[i_q] += frac * frac * math.fabs(data2D.data[j][i]) 
    450                 else: 
    451                     err_y[i_q] += frac * frac * data2D.err_data[j][i] * data2D.err_data[j][i] 
    452                 y_counts[i_q]  += frac 
    453                  
     430                #number of sub-bin: default = 1 (ie., 1 bin: no sub-bin) 
     431                nsubbins = 2 
     432 
     433                #if is_intercept(self.r_max, q_00, q_01, q_10, q_11) \ 
     434                #    or is_intercept(self.r_min, q_00, q_01, q_10, q_11): 
     435                #    # Number of sub-bins near the boundary of ROI in x-direction 
     436                #    nsubbins = 3 
     437                 
     438                #Sub divide one pixel into nine sub-pixels only for the pixels where the qmax or qmin line crosses over. 
     439                for x_subbins in range(nsubbins): 
     440                    for y_subbins in range(nsubbins): 
     441                         
     442                        dx = pixel_width_x*(i+(x_subbins)/nsubbins - center_x) 
     443                        dy = pixel_width_y*(j+(y_subbins)/nsubbins - center_y) 
     444                         
     445                        q_value = get_q(dx, dy, det_dist, wavelength) 
     446                        # Min and max x-value for the subpixel 
     447                        minx = pixel_width_x*(i+(-0.5+x_subbins)/nsubbins - center_x) 
     448                        maxx = pixel_width_x*(i+(0.5 +x_subbins)/nsubbins - center_x) 
     449                        # Min and max y-value for the subpixel 
     450                        miny = pixel_width_y*(j+(-0.5+y_subbins)/nsubbins - center_y) 
     451                        maxy = pixel_width_y*(j+(0.5 +y_subbins)/nsubbins - center_y) 
     452                        # Look for intercept between each side of the pixel 
     453                        # and the constant-q ring for qmax 
     454                        # Calculate the q-value for each corner of sub pixel 
     455                        # q_[x min or max][y min or max] 
     456                        q_00 = get_q(minx, miny, det_dist, wavelength) 
     457                        q_01 = get_q(minx, maxy, det_dist, wavelength) 
     458                        q_10 = get_q(maxx, miny, det_dist, wavelength) 
     459                        q_11 = get_q(maxx, maxy, det_dist, wavelength) 
     460                        frac_max = get_pixel_fraction(self.r_max, q_00, q_01, q_10, q_11)/(nsubbins*nsubbins) 
     461                 
     462                        # Look for intercept between each side of the pixel 
     463                        # and the constant-q ring for qmin 
     464                        frac_min = get_pixel_fraction(self.r_min, q_00, q_01, q_10, q_11)/(nsubbins*nsubbins) 
     465                 
     466                        # We are interested in the region between qmin and qmax 
     467                        # therefore the fraction of the surface of the pixel 
     468                        # that we will use to calculate the number of counts to  
     469                        # include is given by: 
     470                        frac = (frac_max - frac_min) #??? Todo: What if frac_max - fracmin <0? 
     471                         
     472                        
     473                        i_q = int(math.floor((q_value-self.r_min)/self.bin_width)) #- 1     
     474                        if q_value > qmax or q_value < self.r_min: 
     475                            continue 
     476                        #print q_value   
     477                                                 
     478                        x[i_q]         += q_value 
     479                        x_counts[i_q]  += 1 
     480         
     481                        y[i_q]         += frac * data2D.data[j][i] 
     482         
     483                        if data2D.err_data == None or data2D.err_data[j][i]==0.0: 
     484                            err_y[i_q] += frac * frac * math.fabs(data2D.data[j][i]) 
     485                        else: 
     486                            err_y[i_q] += frac * frac * data2D.err_data[j][i] * data2D.err_data[j][i] 
     487                        y_counts[i_q]  += frac 
     488                                                      
    454489        # Average the sums 
    455490        nzero = 0 
     491         
    456492        for i in range(nbins): 
    457             if y_counts[i]>0: 
     493            #print x_counts[i],x[i],y[i] 
     494            if y_counts[i]>0 and x_counts[i]>0: 
    458495                err_y[i] = math.sqrt(err_y[i])/y_counts[i] 
    459496                y[i]     = y[i]/y_counts[i] 
     497                x[i] = (qmax-self.r_min)/nbins*(1.0*i + 0.5)+ self.r_min#x[i]/x_counts[i] 
     498 
    460499            else: 
    461500                nzero += 1 
     
    466505        j=0 
    467506        for i in range(nbins): 
    468             if err_y[i] != 0 : 
    469                 tx[j]  = x[i] 
    470                 ty[j]  = y[i] 
    471                 terr_y[j] = err_y[i] 
    472                 j+=1 
    473                  
     507            if err_y[i] != 0 and y_counts[i]>0 and x_counts[i]>0: 
     508                #Make sure wintin range 
     509                if x[i] <= self.r_max and x[i] >= self.r_min: 
     510                    tx[j]  = x[i] 
     511                    ty[j]  = y[i] 
     512                    terr_y[j] = err_y[i] 
     513                    j+=1        
    474514        return Data1D(x=tx, y=ty, dy=terr_y) 
    475515     
     
    597637                    |              | 
    598638        y=0         +--------------+ 
    599                 q_00                q_01 
     639                q_00                q_10 
    600640         
    601641                    x=0            x=1 
     
    651691    elif (q_00+q_01+q_10+q_11)/4.0 < qmax: 
    652692        frac_max = 1.0 
    653     
     693 
    654694    return frac_max 
    655695              
     
    683723            return (q-q_1)/(q_0 - q_1) 
    684724    return None 
    685      
    686 #This class can be removed. 
    687 class _Sectorold: 
     725      
     726class _Sector: 
    688727    """ 
    689728        Defines a sector region on a 2D data set. 
    690729        The sector is defined by r_min, r_max, phi_min, phi_max, 
    691         and the position of the center of the ring.          
     730        and the position of the center of the ring  
     731        where phi_min and phi_max are defined by the right and left lines wrt central line 
     732        and phi_max could be less than phi_min.  
     733        
    692734        Phi is defined between 0 and 2pi 
    693735    """ 
     
    726768        y_counts = numpy.zeros(self.nbins) 
    727769        x        = numpy.zeros(self.nbins) 
     770        x_counts = numpy.zeros(self.nbins) 
    728771        y_err    = numpy.zeros(self.nbins) 
    729772         
    730         for i in range(numpy.size(data,1)): 
    731             dx = pixel_width_x*(i+0.5 - center_x) 
    732              
    733             # Min and max x-value for the pixel 
    734             minx = pixel_width_x*(i - center_x) 
    735             maxx = pixel_width_x*(i+1.0 - center_x) 
    736              
    737             for j in range(numpy.size(data,0)): 
    738                 dy = pixel_width_y*(j+0.5 - center_y) 
    739              
    740                 q_value = get_q(dx, dy, det_dist, wavelength) 
    741  
    742                 # Min and max y-value for the pixel 
    743                 miny = pixel_width_y*(j - center_y) 
    744                 maxy = pixel_width_y*(j+1.0 - center_y) 
    745                  
    746                 # Calculate the q-value for each corner 
    747                 # q_[x min or max][y min or max] 
    748                 q_00 = get_q(minx, miny, det_dist, wavelength) 
    749                 q_01 = get_q(minx, maxy, det_dist, wavelength) 
    750                 q_10 = get_q(maxx, miny, det_dist, wavelength) 
    751                 q_11 = get_q(maxx, maxy, det_dist, wavelength) 
    752                  
    753                 # Look for intercept between each side of the pixel 
    754                 # and the constant-q ring for qmax 
    755                 frac_max = get_pixel_fraction(qmax, q_00, q_01, q_10, q_11) 
    756                  
    757                 # Look for intercept between each side of the pixel 
    758                 # and the constant-q ring for qmin 
    759                 frac_min = get_pixel_fraction(qmin, q_00, q_01, q_10, q_11) 
    760                  
    761                 # We are interested in the region between qmin and qmax 
    762                 # therefore the fraction of the surface of the pixel 
    763                 # that we will use to calculate the number of counts to  
    764                 # include is given by: 
    765                  
    766                 frac = frac_max - frac_min 
    767  
    768                 # Compute phi and check whether it's within the limits 
    769                 phi_value=math.atan2(dy,dx)+math.pi 
    770  #               if phi_value<self.phi_min or phi_value>self.phi_max:                 
    771                 if phi_value<self.phi_min or phi_value>self.phi_max: 
    772                     continue 
    773                                                      
    774                 # Check which type of averaging we need 
    775                 if run.lower()=='phi':  
    776                     i_bin = int(math.ceil(self.nbins*(phi_value-self.phi_min)/(self.phi_max-self.phi_min))) - 1 
    777                 else: 
    778                     # If we don't need this pixel, skip the rest of the work 
    779                     #TODO: an improvement here would be to compute the average 
    780                     # Q for the pixel from the part that is covered by 
    781                     # the ring defined by q_min/q_max rather than the complete 
    782                     # pixel  
    783                     if q_value<self.r_min or q_value>self.r_max: 
    784                         continue 
    785                     i_bin = int(math.ceil(self.nbins*(q_value-self.r_min)/(self.r_max-self.r_min))) - 1 
    786              
    787                 try: 
    788                     y[i_bin] += frac * data[j][i] 
    789                 except: 
    790                     import sys 
    791                     print sys.exc_value 
    792                     print i_bin, frac 
    793                  
    794                 if data2D.err_data == None or data2D.err_data[j][i]==0.0: 
    795                     y_err[i_bin] += frac * frac * math.fabs(data2D.data[j][i]) 
    796                 else: 
    797                     y_err[i_bin] += frac * frac * data2D.err_data[j][i] * data2D.err_data[j][i] 
    798                 y_counts[i_bin] += frac 
    799          
    800         for i in range(self.nbins): 
    801             y[i] = y[i] / y_counts[i] 
    802             y_err[i] = math.sqrt(y_err[i]) / y_counts[i] 
    803             # Check which type of averaging we need 
    804             if run.lower()=='phi': 
    805                 x[i] = (self.phi_max-self.phi_min)/self.nbins*(1.0*i + 0.5)+self.phi_min 
    806             else: 
    807                 x[i] = (self.r_max-self.r_min)/self.nbins*(1.0*i + 0.5)+self.r_min 
    808              
    809         return Data1D(x=x, y=y, dy=y_err) 
    810          
    811 class _Sector: 
    812     """ 
    813         Defines a sector region on a 2D data set. 
    814         The sector is defined by r_min, r_max, phi_min, phi_max, 
    815         and the position of the center of the ring  
    816         where phi_min and phi_max are defined by the right and left lines wrt central line 
    817         and phi_max could be less than phi_min.  
    818         
    819         Phi is defined between 0 and 2pi 
    820     """ 
    821     def __init__(self, r_min, r_max, phi_min, phi_max,nbins=20): 
    822         self.r_min = r_min 
    823         self.r_max = r_max 
    824         self.phi_min = phi_min 
    825         self.phi_max = phi_max 
    826         self.nbins = nbins 
    827          
    828     def _agv(self, data2D, run='phi'): 
    829         """ 
    830             Perform sector averaging. 
    831              
    832             @param data2D: Data2D object 
    833             @param run:  define the varying parameter ('phi' or 'q') 
    834             @return: Data1D object 
    835         """ 
    836         if data2D.__class__.__name__ not in ["Data2D", "plottable_2D"]: 
    837             raise RuntimeError, "Ring averaging only take plottable_2D objects" 
    838                     
    839         data = data2D.data       
    840         qmax = self.r_max 
    841         qmin = self.r_min 
    842          
    843         if len(data2D.detector) != 1: 
    844             raise RuntimeError, "Ring averaging: invalid number of detectors: %g" % len(data2D.detector) 
    845         pixel_width_x = data2D.detector[0].pixel_size.x 
    846         pixel_width_y = data2D.detector[0].pixel_size.y 
    847         det_dist      = data2D.detector[0].distance 
    848         wavelength    = data2D.source.wavelength 
    849         center_x      = data2D.detector[0].beam_center.x/pixel_width_x 
    850         center_y      = data2D.detector[0].beam_center.y/pixel_width_y 
    851          
    852         y        = numpy.zeros(self.nbins) 
    853         y_counts = numpy.zeros(self.nbins) 
    854         x        = numpy.zeros(self.nbins) 
    855         y_err    = numpy.zeros(self.nbins) 
     773         
     774        center_x=center_x 
     775        center_y=center_y     
    856776         
    857777        # This If finds qmax within ROI defined by sector lines 
     
    859779        temp0=1000000 
    860780        temp1=0 
    861         for i in range(numpy.size(data,1)):   
    862             dx = pixel_width_x*(i+0.5 - center_x)                   
     781        for i in range(numpy.size(data,1)):                  
    863782            for j in range(numpy.size(data,0)): 
    864                      
    865                 dy = pixel_width_y*(j+0.5 - center_y) 
    866                 q_value = get_q(dx, dy, det_dist, wavelength) 
    867                 # Compute phi and check whether it's within the limits 
    868                 phi_value=math.atan2(dy,dx)+math.pi 
    869                 if self.phi_max>2*math.pi: 
    870                     self.phi_max=self.phi_max-2*math.pi 
    871                 if self.phi_min<0: 
    872                     self.phi_max=self.phi_max+2*math.pi 
    873                  
    874                 #In case of two ROI (symmetric major and minor wings)(for 'q2') 
    875                 if run.lower()=='q2': 
    876                     if ((self.phi_max>=0 and self.phi_max<math.pi)and (self.phi_min>=0 and self.phi_min<math.pi)): 
    877                         temp_max=self.phi_max+math.pi 
    878                         temp_min=self.phi_min+math.pi 
    879                     else: 
    880                         temp_max=self.phi_max 
    881                         temp_min=self.phi_min 
    882                         
    883                     if ((temp_max>=math.pi and temp_max<2*math.pi)and (temp_min>=math.pi and temp_min<2*math.pi)): 
    884                         if (phi_value<temp_min  or phi_value>temp_max): 
    885                              if (phi_value<temp_min-math.pi  or phi_value>temp_max-math.pi): 
    886                                  continue 
    887                     if (self.phi_max<self.phi_min): 
    888                         tmp_max=self.phi_max+math.pi 
    889                         tmp_min=self.phi_min-math.pi 
    890                     else: 
    891                         tmp_max=self.phi_max 
    892                         tmp_min=self.phi_min 
    893                     if (tmp_min<math.pi and tmp_max>math.pi): 
    894                         if((phi_value>tmp_max and phi_value<tmp_min+math.pi)or (phi_value>tmp_max-math.pi and phi_value<tmp_min)): 
    895                             continue 
    896                 #In case of one ROI (major only)(i.e.,for 'q')and do nothing for 'phi'. 
    897                 elif run.lower()=='q':  
    898                     if (self.phi_max>=self.phi_min): 
    899                         if (phi_value<self.phi_min  or phi_value>self.phi_max): 
    900                             continue 
    901                     else: 
    902                         if (phi_value<self.phi_min and phi_value>self.phi_max): 
    903                             continue    
    904                 if q_value<qmin or q_value>qmax: 
    905                         continue                     
    906                          
    907                 if run.lower()=='phi': 
    908                     if temp1<phi_value: 
    909                         temp1=phi_value 
    910                     if temp0>phi_value: 
    911                         temp0=phi_value    
    912                                                                                           
    913                 elif temp<q_value: 
    914                     temp=q_value 
     783                #number of sub-bin: default = 2 (ie., 1 bin: no sub-bin) 
     784                nsubbins = 2 
     785 
     786                #Sub divide one pixel into nine sub-pixels only for the pixels where the qmax or qmin line crosses over. 
     787                for x_subbins in range(nsubbins): 
     788                    for y_subbins in range(nsubbins): 
     789                         
     790                        dx = pixel_width_x*(i+(x_subbins)/nsubbins - center_x) 
     791                        dy = pixel_width_y*(j+(y_subbins)/nsubbins - center_y) 
     792                         
     793                        q_value = get_q(dx, dy, det_dist, wavelength) 
     794 
     795                        # Compute phi and check whether it's within the limits 
     796                        phi_value=math.atan2(dy,dx)+math.pi 
     797                        if self.phi_max>2*math.pi: 
     798                            self.phi_max=self.phi_max-2*math.pi 
     799                        if self.phi_min<0: 
     800                            self.phi_max=self.phi_max+2*math.pi 
     801                         
     802                        #In case of two ROI (symmetric major and minor wings)(for 'q2') 
     803                        if run.lower()=='q2': 
     804                            if ((self.phi_max>=0 and self.phi_max<math.pi)and (self.phi_min>=0 and self.phi_min<math.pi)): 
     805                                temp_max=self.phi_max+math.pi 
     806                                temp_min=self.phi_min+math.pi 
     807                            else: 
     808                                temp_max=self.phi_max 
     809                                temp_min=self.phi_min 
     810                                
     811                            if ((temp_max>=math.pi and temp_max<2*math.pi)and (temp_min>=math.pi and temp_min<2*math.pi)): 
     812                                if (phi_value<temp_min  or phi_value>temp_max): 
     813                                     if (phi_value<temp_min-math.pi  or phi_value>temp_max-math.pi): 
     814                                         continue 
     815                            if (self.phi_max<self.phi_min): 
     816                                tmp_max=self.phi_max+math.pi 
     817                                tmp_min=self.phi_min-math.pi 
     818                            else: 
     819                                tmp_max=self.phi_max 
     820                                tmp_min=self.phi_min 
     821                            if (tmp_min<math.pi and tmp_max>math.pi): 
     822                                if((phi_value>tmp_max and phi_value<tmp_min+math.pi)or (phi_value>tmp_max-math.pi and phi_value<tmp_min)): 
     823                                    continue 
     824                        #In case of one ROI (major only)(i.e.,for 'q')and do nothing for 'phi'. 
     825                        elif run.lower()=='q':  
     826                            if (self.phi_max>=self.phi_min): 
     827                                if (phi_value<self.phi_min  or phi_value>self.phi_max): 
     828                                    continue 
     829                            else: 
     830                                if (phi_value<self.phi_min and phi_value>self.phi_max): 
     831                                    continue    
     832                        if q_value<qmin or q_value>qmax: 
     833                                continue                     
     834                                 
     835                        if run.lower()=='phi': 
     836                            if temp1<phi_value: 
     837                                temp1=phi_value 
     838                            if temp0>phi_value: 
     839                                temp0=phi_value    
     840                                                                                                  
     841                        elif temp<q_value: 
     842                            temp=q_value 
    915843                     
    916844        if run.lower()=='phi': 
     
    921849        #Beam center is already corrected, but the calculation below assumed it was not. 
    922850        # Thus Beam center shifted back to uncorrected value. ToDo: cleanup the mess. 
    923         center_x=center_x+0.5  
    924         center_y=center_y+0.5          
    925         for i in range(numpy.size(data,1)): 
    926             dx = pixel_width_x*(i+0.5 - center_x) 
    927              
    928             # Min and max x-value for the pixel 
    929             minx = pixel_width_x*(i - center_x) 
    930             maxx = pixel_width_x*(i+1.0 - center_x) 
    931              
     851        #center_x=center_x+0.5  
     852        #center_y=center_y+0.5          
     853        for i in range(numpy.size(data,1)):           
    932854            for j in range(numpy.size(data,0)): 
    933                 dy = pixel_width_y*(j+0.5 - center_y) 
    934              
    935                 q_value = get_q(dx, dy, det_dist, wavelength) 
    936  
    937                 # Min and max y-value for the pixel 
    938                 miny = pixel_width_y*(j - center_y) 
    939                 maxy = pixel_width_y*(j+1.0 - center_y) 
    940                  
    941                 # Calculate the q-value for each corner 
    942                 # q_[x min or max][y min or max] 
    943                 q_00 = get_q(minx, miny, det_dist, wavelength) 
    944                 q_01 = get_q(minx, maxy, det_dist, wavelength) 
    945                 q_10 = get_q(maxx, miny, det_dist, wavelength) 
    946                 q_11 = get_q(maxx, maxy, det_dist, wavelength) 
    947                  
    948                 # Compute phi and check whether it's within the limits 
    949                 phi_value=math.atan2(dy,dx)+math.pi 
    950                 if self.phi_max>2*math.pi: 
    951                     self.phi_max=self.phi_max-2*math.pi 
    952                 if self.phi_min<0: 
    953                     self.phi_max=self.phi_max+2*math.pi 
    954                      
    955                 # Look for intercept between each side of the pixel 
    956                 # and the constant-q ring for qmax 
    957                 frac_max = get_pixel_fraction(qmax, q_00, q_01, q_10, q_11) 
    958                  
    959                 # Look for intercept between each side of the pixel 
    960                 # and the constant-q ring for qmin 
    961                 frac_min = get_pixel_fraction(qmin, q_00, q_01, q_10, q_11) 
    962                  
    963                 # We are interested in the region between qmin and qmax 
    964                 # therefore the fraction of the surface of the pixel 
    965                 # that we will use to calculate the number of counts to  
    966                 # include is given by: 
    967                  
    968                 frac = frac_max - frac_min 
    969  
    970                 #In case of two ROI (symmetric major and minor regions)(for 'q2') 
    971                 if run.lower()=='q2': 
    972                     if ((self.phi_max>=0 and self.phi_max<math.pi)and (self.phi_min>=0 and self.phi_min<math.pi)): 
    973                         temp_max=self.phi_max+math.pi 
    974                         temp_min=self.phi_min+math.pi 
    975                     else: 
    976                         temp_max=self.phi_max 
    977                         temp_min=self.phi_min 
    978                         
    979                     if ((temp_max>=math.pi and temp_max<2*math.pi)and (temp_min>=math.pi and temp_min<2*math.pi)): 
    980                         if (phi_value<temp_min  or phi_value>temp_max): 
    981                             if (phi_value<temp_min-math.pi  or phi_value>temp_max-math.pi): 
    982                                 continue 
    983                     if (self.phi_max<self.phi_min): 
    984                         tmp_max=self.phi_max+math.pi 
    985                         tmp_min=self.phi_min-math.pi 
    986                     else: 
    987                         tmp_max=self.phi_max 
    988                         tmp_min=self.phi_min 
    989                     if (tmp_min<math.pi and tmp_max>math.pi): 
    990                         if((phi_value>tmp_max and phi_value<tmp_min+math.pi)or (phi_value>tmp_max-math.pi and phi_value<tmp_min)): 
     855                #number of sub-bin: default = 1 (ie., 1 bin: no sub-bin) 
     856                nsubbins = 2 
     857 
     858                #if is_intercept(self.r_max, q_00, q_01, q_10, q_11) \ 
     859                #    or is_intercept(self.r_min, q_00, q_01, q_10, q_11): 
     860                #    # Number of sub-bins near the boundary of ROI in x-direction 
     861                #    nsubbins = 3 
     862                 
     863                #Sub divide one pixel into nine sub-pixels only for the pixels where the qmax or qmin line crosses over. 
     864                for x_subbins in range(nsubbins): 
     865                    for y_subbins in range(nsubbins): 
     866                         
     867                        dx = pixel_width_x*(i+(x_subbins)/nsubbins - center_x) 
     868                        dy = pixel_width_y*(j+(y_subbins)/nsubbins - center_y) 
     869                         
     870                        q_value = get_q(dx, dy, det_dist, wavelength) 
     871                        # Min and max x-value for the subpixel 
     872                        minx = pixel_width_x*(i+(-0.5+x_subbins)/nsubbins - center_x) 
     873                        maxx = pixel_width_x*(i+(0.5 +x_subbins)/nsubbins - center_x) 
     874                        # Min and max y-value for the subpixel 
     875                        miny = pixel_width_y*(j+(-0.5+y_subbins)/nsubbins - center_y) 
     876                        maxy = pixel_width_y*(j+(0.5 +y_subbins)/nsubbins - center_y) 
     877             
     878                 
     879                        # Calculate the q-value for each corner 
     880                        # q_[x min or max][y min or max] 
     881                        q_00 = get_q(minx, miny, det_dist, wavelength) 
     882                        q_01 = get_q(minx, maxy, det_dist, wavelength) 
     883                        q_10 = get_q(maxx, miny, det_dist, wavelength) 
     884                        q_11 = get_q(maxx, maxy, det_dist, wavelength) 
     885                         
     886                        # Compute phi and check whether it's within the limits 
     887                        phi_value=math.atan2(dy,dx)+math.pi 
     888                        if self.phi_max>2*math.pi: 
     889                            self.phi_max=self.phi_max-2*math.pi 
     890                        if self.phi_min<0: 
     891                            self.phi_max=self.phi_max+2*math.pi 
     892                             
     893                        # Look for intercept between each side of the pixel 
     894                        # and the constant-q ring for qmax 
     895                        frac_max = get_pixel_fraction(qmax, q_00, q_01, q_10, q_11) 
     896                         
     897                        # Look for intercept between each side of the pixel 
     898                        # and the constant-q ring for qmin 
     899                        frac_min = get_pixel_fraction(qmin, q_00, q_01, q_10, q_11) 
     900                         
     901                        # We are interested in the region between qmin and qmax 
     902                        # therefore the fraction of the surface of the pixel 
     903                        # that we will use to calculate the number of counts to  
     904                        # include is given by: 
     905                         
     906                        frac = frac_max - frac_min 
     907         
     908                        #In case of two ROI (symmetric major and minor regions)(for 'q2') 
     909                        if run.lower()=='q2': 
     910                            if ((self.phi_max>=0 and self.phi_max<math.pi)and (self.phi_min>=0 and self.phi_min<math.pi)): 
     911                                temp_max=self.phi_max+math.pi 
     912                                temp_min=self.phi_min+math.pi 
     913                            else: 
     914                                temp_max=self.phi_max 
     915                                temp_min=self.phi_min 
     916                                
     917                            if ((temp_max>=math.pi and temp_max<2*math.pi)and (temp_min>=math.pi and temp_min<2*math.pi)): 
     918                                if (phi_value<temp_min  or phi_value>temp_max): 
     919                                    if (phi_value<temp_min-math.pi  or phi_value>temp_max-math.pi): 
     920                                        continue 
     921                            if (self.phi_max<self.phi_min): 
     922                                tmp_max=self.phi_max+math.pi 
     923                                tmp_min=self.phi_min-math.pi 
     924                            else: 
     925                                tmp_max=self.phi_max 
     926                                tmp_min=self.phi_min 
     927                            if (tmp_min<math.pi and tmp_max>math.pi): 
     928                                if((phi_value>tmp_max and phi_value<tmp_min+math.pi)or (phi_value>tmp_max-math.pi and phi_value<tmp_min)): 
     929                                    continue 
     930                        #In case of one ROI (major only)(i.e.,for 'q' and 'phi') 
     931                        else:  
     932                            if (self.phi_max>=self.phi_min): 
     933                                if (phi_value<self.phi_min  or phi_value>self.phi_max): 
     934                                    continue 
     935                                                               
     936                                # Check which type of averaging we need 
     937                                if run.lower()=='phi':  
     938                                    i_bin = int(math.floor(self.nbins*(phi_value-self.phi_min)/(self.phi_max-self.phi_min)))  
     939                                else: 
     940                                    # If we don't need this pixel, skip the rest of the work 
     941                                    #TODO: an improvement here would be to compute the average 
     942                                    # Q for the pixel from the part that is covered by 
     943                                    # the ring defined by q_min/q_max rather than the complete 
     944                                    # pixel  
     945                                    i_bin = int(math.floor(self.nbins*(q_value-qmin)/(qmax-qmin))) 
     946                                     
     947                            else: 
     948                                if (phi_value<self.phi_min and phi_value>self.phi_max): 
     949                                    continue 
     950                        #print "qmax=",qmax,qmin        
     951         
     952                        if q_value<qmin or q_value>qmax: 
    991953                            continue 
    992                 #In case of one ROI (major only)(i.e.,for 'q' and 'phi') 
    993                 else:  
    994                     if (self.phi_max>=self.phi_min): 
    995                         if (phi_value<self.phi_min  or phi_value>self.phi_max): 
    996                             continue 
    997                              
    998                     else: 
    999                         if (phi_value<self.phi_min and phi_value>self.phi_max): 
    1000                             continue 
    1001                 #print "qmax=",qmax,qmin        
    1002  
    1003                 if q_value<qmin or q_value>qmax: 
    1004                     continue 
    1005                                                      
    1006                 # Check which type of averaging we need 
    1007                 if run.lower()=='phi':  
    1008                     i_bin = int(math.ceil(self.nbins*(phi_value-self.phi_min)/(self.phi_max-self.phi_min))) - 1 
    1009                 else: 
    1010                     # If we don't need this pixel, skip the rest of the work 
    1011                     #TODO: an improvement here would be to compute the average 
    1012                     # Q for the pixel from the part that is covered by 
    1013                     # the ring defined by q_min/q_max rather than the complete 
    1014                     # pixel  
    1015                     i_bin = int(math.ceil(self.nbins*(q_value-qmin)/(qmax-qmin))) - 1 
    1016                             
    1017                 try: 
    1018                     y[i_bin] += frac * data[j][i] 
    1019                 except: 
    1020                     import sys 
    1021                     print sys.exc_value 
    1022                     print i_bin, frac 
    1023                  
    1024                 if data2D.err_data == None or data2D.err_data[j][i]==0.0: 
    1025                     y_err[i_bin] += frac * frac * math.fabs(data2D.data[j][i]) 
    1026                 else: 
    1027                     y_err[i_bin] += frac * frac * data2D.err_data[j][i] * data2D.err_data[j][i] 
    1028                 y_counts[i_bin] += frac 
    1029          
     954                                                             
     955                        # Check which type of averaging we need 
     956                        if run.lower()=='phi':  
     957                            i_bin = int(math.ceil(self.nbins*(phi_value-self.phi_min)/(self.phi_max-self.phi_min))) - 1 
     958                        else: 
     959                            # If we don't need this pixel, skip the rest of the work 
     960                            #TODO: an improvement here would be to compute the average 
     961                            # Q for the pixel from the part that is covered by 
     962                            # the ring defined by q_min/q_max rather than the complete 
     963                            # pixel  
     964                            i_bin = int(math.ceil(self.nbins*(q_value-qmin)/(qmax-qmin))) - 1 
     965                                    
     966                        try: 
     967                            y[i_bin] += frac * data[j][i] 
     968                        except: 
     969                            import sys 
     970                            print sys.exc_value 
     971                            print i_bin, frac 
     972                         
     973                        if data2D.err_data == None or data2D.err_data[j][i]==0.0: 
     974                            y_err[i_bin] += frac * frac * math.fabs(data2D.data[j][i]) 
     975                        else: 
     976                            y_err[i_bin] += frac * frac * data2D.err_data[j][i] * data2D.err_data[j][i] 
     977                        y_counts[i_bin] += frac 
     978         
     979 
    1030980        for i in range(self.nbins): 
    1031981            y[i] = y[i] / y_counts[i] 
     
    10581008        """ 
    10591009        return self._agv(data2D, 'phi') 
    1060  
    1061 class SectorQold(_Sector): 
    1062     """ 
    1063         Sector average as a function of Q. 
    1064         I(Q) is return and the data is averaged over phi. 
    1065          
    1066         A sector is defined by r_min, r_max, phi_min, phi_max. 
    1067         The number of bin in Q also has to be defined. 
    1068     """ 
    1069     def __call__(self, data2D): 
    1070         """ 
    1071             Perform sector average and return I(Q). 
    1072              
    1073             @param data2D: Data2D object 
    1074             @return: Data1D object 
    1075         """ 
    1076         return self._agv(data2D, 'q') 
    10771010     
    10781011class SectorQ(_Sector): 
Note: See TracChangeset for help on using the changeset viewer.