How to create a new FIL with new parameters
The basic idea of creating a new FIL file with different parameters comes from the need of calibrating parameters or just filter events (to reduce file size). This is possible with ScanRoot. ScanRoot object in the memory has a method to add new parameters. If an output file is open these new parameters will be saved (you can choose if you save only new parameters or all of them.The procedure is the following:
- create a filter program. This filter program is just like the histogramming code you are used to write. But instead of creating histograms you analyze the event and decide if you want to keep it or not.
- Process your files. This can be done in the GUI with the following sequence:
- Load L2 file (your filter program)
- decide if you want to save only the new parameters or all of them
- decide about smearing the data
- Open a FIL file for input
- Open a new output
- Go
- Close output
- Close FIL
- and go back to step 4
.x exemploFilter.CBellow is the macro example:
void exemploFilter() { //carrega filtro de eventos loadL2("filter.cxx"); // liga smearing (se true). O smearing sorteia // um valor real dentro de um canal. Isso evita // problemas de binagem quando faz-se uma operacao // de mudanca de ganho, por exemplo // a funcao de smearing so esta disponivel a partir // da versao 4.00 do scanroot // se a sua versao for anterior, comente essa linha smearing(true); // decide se grava somente novos parametros (true) // ou se grava todos os parametros (false) saveOnlyNewPar(true); // seta o numero maximo de parametros (default = 128) setNPar(110); // abre o arquivo para leitura openInput("run10.fil"); // abre um arquivo para escrita openOutput("run10_novo.fil"); // processa os eventos go(); // fecha output closeOutput(); // fecha input closeInput(); // a partir deste ponto voce pode repetir o processo. Para // processar um novo fil mas com o mesmo filtro e mesmas // configuracoes basta os comandos (as linhas estao comentadas) // openInput("run11.fil"); // openOutput("run11_novo.fil"); // go(); // closeOutput(); // closeInput(); }The filtering code example is bellow. In this case, we create two new parameters (101 and 102) using the method addPar() that corresponds to the gain corrections we need to apply to parameters 1 and 2.
#include#include "ScanRoot.h" using namespace std; ScanRoot* meuScan = 0; float ganho1, ganho2; bool filtro(short npar, float *par) { // nao grava se o evento for vazio if(npar==0) return false; // um exemplo simples: Correcao de ganho de dois // parametros. // // note que nao podemos mudar o valor de um parametro // original. Somente podemos criar parametros novos. // os parametros novos terão id = 101 e 102 // // OBS: Substituindo parametros // ---------------------------- // no caso se eu quiser substituir o valor de um // parametro eu devo criar um parametro novo com // o mesmo id do velho. Neste caso, se voce // nao setar que quer gravar somente os parametros // novos resultara em dois parametros de mesmo // identificador no arquivo. No caso do scanroot, // quando for ler o arquivo, o ultimo na sequencia // de dados sera o lido no evento. Neste caso, o // parametro modificado. Nao sei as consequencias // caso va ler o arquivo no SCAN normal, neste caso if(par[1]>0) meuScan->addPar(101, ganho1*par[1]); if(par[2]>0) meuScan->addPar(102, ganho2*par[2]); // para gravar o evento, precisa retornar true; return true; } void configureL2(ScanRoot* scan) { // inicializando os ganhos ganho1 = 1.23; ganho2 = 0.93; // esta linha conecta a funcao de filtro do ScanRoot // na sua funcao pessoal, neste caso, com o nome filtro scan->l2trigger = &filtro; // inicializo o ponteiro meuScan para o scan na memoria, // assim eu posso utiliza-lo em outras funcoes do // meu programa meuScan = scan; return; } void initL2() { } void finishL2() { }