IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 18, 2009, 10:48:22 AM (17 years ago)
Author:
Paul Price
Message:

Reworking so that vectors can be used as well as an array of sources.

Location:
trunk/psModules/src/objects
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/objects/pmSourceGroups.c

    r26172 r26182  
    5656
    5757
    58 pmSourceGroups *pmSourceGroupsAlloc(const pmReadout *readout, const psArray *sources, int nThreads)
     58pmSourceGroups *pmSourceGroupsAlloc(const pmReadout *readout, int nThreads)
    5959{
    6060    pmSourceGroups *groups = psAlloc(sizeof(pmSourceGroups)); // Groups, to return
     
    8888    groups->groups = psArrayAlloc(4);
    8989
    90     long numSources = sources->n;       // Number of input sources
     90    return groups;
     91}
     92
     93
     94
     95pmSourceGroups *pmSourceGroupsFromSources(const pmReadout *readout, const psArray *sources, int nThreads)
     96{
     97    PM_ASSERT_READOUT_NON_NULL(readout, NULL);
     98    PM_ASSERT_READOUT_IMAGE(readout, NULL);
     99    PS_ASSERT_ARRAY_NON_NULL(sources, NULL);
     100    PS_ASSERT_INT_NONNEGATIVE(nThreads, NULL);
     101
     102    pmSourceGroups *groups = pmSourceGroupsAlloc(readout, nThreads);
     103
     104    int numSources = sources->n;        // Number of sources
     105    psVector *x = psVectorAlloc(numSources, PS_TYPE_F32), *y = psVectorAlloc(numSources, PS_TYPE_F32);
     106    for (int i = 0; i < numSources; i++) {
     107        pmSource *source = sources->data[i]; // Source of interest
     108        x->data.F32[i] = source->peak->xf;
     109        y->data.F32[i] = source->peak->yf;
     110    }
     111
     112    if (!pmSourceGroupsPopulate(groups, x, y)) {
     113        psError(PS_ERR_UNKNOWN, false, "Unable to populate source groups");
     114        psFree(x);
     115        psFree(y);
     116        psFree(groups);
     117        return NULL;
     118    }
     119
     120    psFree(x);
     121    psFree(y);
     122    return groups;
     123}
     124
     125pmSourceGroups *pmSourceGroupsFromVectors(const pmReadout *readout, const psVector *x,
     126                                          const psVector *y, int nThreads)
     127{
     128    PM_ASSERT_READOUT_NON_NULL(readout, NULL);
     129    PM_ASSERT_READOUT_IMAGE(readout, NULL);
     130    PS_ASSERT_VECTOR_NON_NULL(x, NULL);
     131    PS_ASSERT_VECTOR_NON_NULL(y, NULL);
     132    PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, NULL);
     133    PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, NULL);
     134    PS_ASSERT_VECTORS_SIZE_EQUAL(x, y, NULL);
     135    PS_ASSERT_INT_NONNEGATIVE(nThreads, NULL);
     136
     137    pmSourceGroups *groups = pmSourceGroupsAlloc(readout, nThreads);
     138    if (!pmSourceGroupsPopulate(groups, x, y)) {
     139        psError(PS_ERR_UNKNOWN, false, "Unable to populate source groups");
     140        psFree(groups);
     141        return NULL;
     142    }
     143
     144    return groups;
     145}
     146
     147
     148bool pmSourceGroupsPopulate(pmSourceGroups *groups, const psVector *x, const psVector *y)
     149{
     150    PS_ASSERT_PTR_NON_NULL(groups, false);
     151    PS_ASSERT_VECTOR_NON_NULL(x, NULL);
     152    PS_ASSERT_VECTOR_NON_NULL(y, NULL);
     153    PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, NULL);
     154    PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, NULL);
     155    PS_ASSERT_VECTORS_SIZE_EQUAL(x, y, NULL);
    91156
    92157    // Populate the groups
     158    int numSources = x->n;                // Number of sources
     159    long total = groups->Cx * groups->Cy; // Total size
    93160    for (int i = 0; i < groups->groups->n; i++) {
    94         psArray *cells = psArrayAlloc(Cx * Cy); // Cells within a group
     161        psArray *cells = psArrayAlloc(total); // Cells within a group
    95162        groups->groups->data[i] = cells;
    96163        for (int j = 0; j < cells->n; j++) {
    97             cells->data[j] = psArrayAllocEmpty(numSources / (Cx * Cy));
     164            cells->data[j] = psVectorAllocEmpty(numSources / total, PS_TYPE_S32);
    98165        }
    99166    }
     
    101168    // Populate the cells
    102169    for (int i = 0; i < numSources; i++) {
    103         pmSource *source = sources->data[i]; // Source of interest
    104170        int group = 0, cell = 0;        // Group and cell index for source
    105         pmSourceGroupsCoordToCell(&group, &cell, source->peak->xf, source->peak->yf, groups);
     171        pmSourceGroupsCoordToCell(&group, &cell, x->data.F32[i], y->data.F32[i], groups);
    106172
    107173        psArray *cells = groups->groups->data[group]; // Cells for group
    108         psArray *cellSources = cells->data[cell];     // Array of sources for cell within group
    109         psArrayAdd(cellSources, cellSources->nalloc, source);
     174        psVector *cellSources = cells->data[cell];    // Indices of sources for cell within group
     175        psVectorAppend(cellSources, i);
    110176    }
    111177
  • trunk/psModules/src/objects/pmSourceGroups.h

    r26162 r26182  
    1616} pmSourceGroups;
    1717
    18 /// Allocator
    19 ///
    20 /// Allocates the source groups
     18/// Allocate the source groups
    2119pmSourceGroups *pmSourceGroupsAlloc(
    2220    const pmReadout *readout,           // Readout on which the sources are defined
    23     const psArray *sources,             // Sources of interest
    2421    int nThreads                        // Number of threads
    2522    );
     
    3431    );
    3532
     33/// Populate the source groups
     34bool pmSourceGroupsPopulate(
     35    pmSourceGroups *groups,              // Source groups to populate
     36    const psVector *x, const psVector *y // Coordinates of sources
     37    );
    3638
    3739
     40/// Generate source groups from an array of sources
     41pmSourceGroups *pmSourceGroupsFromSources(
     42    const pmReadout *readout,           // Readout on which the sources are defined
     43    const psArray *sources,             // Array of sources
     44    int nThreads                        // Number of threads
     45    );
     46
     47/// Generate source groups from vectors with source positions
     48pmSourceGroups *pmSourceGroupsFromVectors(
     49    const pmReadout *readout,             // Readout on which the sources are defined
     50    const psVector *x, const psVector *y, // Coordinates of sources
     51    int nThreads                          // Number of threads
     52    );
    3853
    3954#endif
Note: See TracChangeset for help on using the changeset viewer.