[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Esse capítulo descreve funções para criação e manipulação de n-uplas, conjunto de valores associados a eventos (46). As n-uplas são armazenadas em arquivos. Seus valores podem ser extraídos em qualquer combinação e colocados em um histograma usando um função de seleção.
Os valores a serem armazenados são mantidos em uma estrutura de dados definida pelo usuário, e uma n-upla é criada associando essa estrutura de dados a um arquivo. Os valores são então escritos no arquivo (normalmente dentro de um ciclo) usando as funções de n-uplas descritas abaixo.
A histograma pode ser criado a partir de dados contidos em uma n-upla fornecendo uma função de seleção e uma função de valor. A função de seleção especifica se um evento deve ser incluído no subconjunto a ser analizado ou não. A função de valor calcula a entrada a ser adicionada ao histograma para cada evento.
Todas as funções de n-upla são definidas no arquivo de cabeçalho ‘gsl_ntuple.h’
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
N-uplas são tratadas usando a estrutura gsl_ntuple
. Essa estrutura
contém informação sobre o arquivo onde os dados da n-upla estão armqzenados, um
apontador para a atual linha de dados da n-upla e o tamanho da estrutura de dados da n-upla, tamanho esse
que foi definido pelo usuário.
typedef struct { FILE * file; void * ntuple_data; size_t size; } gsl_ntuple;
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Essa função cria um novo arquivo de n-upla somente escrita filename para n-uplas de tamanho size e retorna um apontados para a recentemente criada estrutura de n-upla. Qualquer arquivo existente com o mesmo nome é armazenado com comprimento e sobrescrito. Um apontador para memória para a atual linha de n-upla ntuple_data deve ser fornecido—isso é usado para copiar n-uplas do e para o arquivo.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Essa função abre um arquivo de n-upla que já existe chamado filename para leitura e retorna um apontador para a correspondente estrutura de n-upla. As n-uplas no arquivo deve ter tamanho size. Um apontador para memória para a atual linha de n-upla ntuple_data deve ser fornecido—isso é usado para copiar n-uplas do e para o arquivo.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Essa função escreve a atual n-upla ntuple->ntuple_data de tamanho ntuple->size ao arquivo correspondente.
Essa função é um sinônimo para gsl_ntuple_write
.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
essa função lê a atual linha do arquivo de n-upla para ntuple e armazena dos valores em ntuple->data.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Essa função fecha o arquivo de n-upla ntuple e libera sua memória alocada associada.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Uma vez que uma n-upla tenha sido criada seu conteúdo pode ser colocado em um histograma de
várias formas usando a função gsl_ntuple_project
. Duas
funções definidas peo usuário devem ser fornecidos, uma função para selecionar eventos e
uma função para calcular valores escalares. A função de seleção e a
função de valor ambas aceitam a linha de n-upla como um primeiro argumento e outros
parâmetros como um segundo argumento.
A função de seleção determina quais linhas de n-uplas são selecionadas para serem colocadas no histograma. A função de seleção é definida pela seguinte estrutura,
typedef struct { int (* function) (void * ntuple_data, void * params); void * params; } gsl_ntuple_select_fn;
A componente de estrutura function deve retornar um valor diferente de zero para cada linha de n-upla que é para ser incluída no histograma.
A função de valor calcula valores escalares para aquelas linhas de n-upla selecionadas pela função de seleção,
typedef struct { double (* function) (void * ntuple_data, void * params); void * params; } gsl_ntuple_value_fn;
Nesse caso a componente de estrutura function deve retornar o valor a ser adicionado ao histograma para a linha de n-upla.
Essa função atualiza o histograma h a partir da n-upla ntuple usando as função value_func e select_func. Para cada linha de n-upla onde a função de seleção select_func for diferentes de zero o correspondente valor daquele linha é calculado usando a função value_func e adicionado ao histograma. aquelas linhas de n-upla onde select_func retorna zero são ignoradas. Novas entradas são adicionadas ao histograma, de forma que chamadas subsequêntes podem ser usadas para acumular dados adicionais no mesmo histograma.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
O seguinte programa exemplo demonstra o uso de n-uplas no gerenciamento de grandes conjuntos de dados. O primeiro programa cria um conjunto de 10,000 “eventos” simulados, cada um com três valores associados (x,y,z). Esses valores são gerados a partir de uma distribuição de Gauss com variância unitária, para propósito de demonstração, e escrito no arquivo de n-upla ‘test.dat’.
#include <gsl/gsl_ntuple.h> #include <gsl/gsl_rng.h> #include <gsl/gsl_randist.h> struct data { double x; double y; double z; }; int main (void) { const gsl_rng_type * T; gsl_rng * r; struct data ntuple_row; int i; gsl_ntuple *ntuple = gsl_ntuple_create ("test.dat", &ntuple_row, sizeof (ntuple_row)); gsl_rng_env_setup (); T = gsl_rng_default; r = gsl_rng_alloc (T); for (i = 0; i < 10000; i++) { ntuple_row.x = gsl_ran_ugaussian (r); ntuple_row.y = gsl_ran_ugaussian (r); ntuple_row.z = gsl_ran_ugaussian (r); gsl_ntuple_write (ntuple); } gsl_ntuple_close (ntuple); gsl_rng_free (r); return 0; }
O programa seguinte analisa os dados de n-upla no arquivo ‘test.dat’. O procedimento de análise é calcular a soma de quadrados de cada evento, E^2=x^2+y^2+z^2, e selecionar somente aqueles que excederem um limite inferior de 1.5. Os eventos selecionados são então colocados no histograma usando seus valores E^2.
#include <math.h> #include <gsl/gsl_ntuple.h> #include <gsl/gsl_histogram.h> struct data { double x; double y; double z; }; int sel_func (void *ntuple_data, void *params); double val_func (void *ntuple_data, void *params); int main (void) { struct data ntuple_row; gsl_ntuple *ntuple = gsl_ntuple_open ("test.dat", &ntuple_row, sizeof (ntuple_row)); double lower = 1.5; gsl_ntuple_select_fn S; gsl_ntuple_value_fn V; gsl_histogram *h = gsl_histogram_alloc (100); gsl_histogram_set_ranges_uniform(h, 0.0, 10.0); S.function = &sel_func; S.params = &lower; V.function = &val_func; V.params = 0; gsl_ntuple_project (h, ntuple, &V, &S); gsl_histogram_fprintf (stdout, h, "%f", "%f"); gsl_histogram_free (h); gsl_ntuple_close (ntuple); return 0; } int sel_func (void *ntuple_data, void *params) { struct data * data = (struct data *) ntuple_data; double x, y, z, E2, scale; scale = *(double *) params; x = data->x; y = data->y; z = data->z; E2 = x * x + y * y + z * z; return E2 > scale; } double val_func (void *ntuple_data, void *params) { struct data * data = (struct data *) ntuple_data; double x, y, z; x = data->x; y = data->y; z = data->z; return x * x + y * y + z * z; }
O seguinte gráfico mostra a distribuição dos eventos selecionados. Note o corte no início do gráfico.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Informação adicional sobre o uso de n-uplas pode ser encontrada na documentação para o pacote CERN PAW e para o pacote CERN HBOOK (disponível online).
[ << ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Esse documento foi gerado em 23 de Julho de 2013 usando texi2html 5.0.