ANASEN_analysis/anasen_analysis_vignesh/script.C
Sudarsan Balakrishnan b2242ccacd Improved SX3 calibrations, step-ladder correction to pcz.
A lot of the files are identical to old ones, but the main changes are:
1) EXFit2.C in sx3cal
	- Finds front/right gains for each strip using the known middle two pad edges, but gainmatches all backs
2) Define new 'fix' loci, arising from the step-ladder correction to A1C2 events. This is tested in scratch/sx3z_vs_pcz/testmodel.h, will be given a better name in the future.
3) Explore A1C2 and A1C3 loci in detail
4) environment variables to 'flip' and 'offset' wires during sort. All env vars are set in shell scripts that call them
5) environment variables that allow for timestamp bounds to be set and unset. Default limiting values are 0 and dbl_max so no harm done unless these specific env vars are set.
6) Some bookkeeping indicating 27Al instead of 26Al in all places.
2026-04-14 13:45:11 -04:00

293 lines
7.3 KiB
C

// #include "/home/splitpole/FSUDAQ_Qt6/Aux/fsuReader.h"
// #include "/home/splitpole/FSUDAQ_Qt6/Aux/fsutsReader.h"
#include <TGraph.h>
#include <TFile.h>
#include <TTree.h>
#include <TROOT.h>
#include <TString.h>
#include <TMath.h>
#include <TRandom.h>
#include "mapping.h"
#include "Armory/ClassAnasen.h"
class PulserChecker {
public:
PulserChecker(int sn) : SN(sn){
t0 = 0;
t1 = 0;
dt = 0;
tStart = -1;
has1stData = false;
n = 0;
mean = 0;
m2 = 0;
}
void addTime(unsigned long long time){
t0 = t1;
t1 = time;
if( has1stData ) {
dt = t1/1e6 - t0/1e6;
int mod = 1;
if( dt >= 2* mean && mean > 0 ){
mod = std::round(dt/mean);
}
if( mod > 1 ) return;
double new_dt = dt/mod;
n ++;
double delta = new_dt - mean;
mean += delta / n;
double delta2 = new_dt - mean;
m2 += delta * delta2;
//if( mod > 1 ) printf("%6d | %llu, %llu (dt %.6f, m : %d) | %.6f\n", SN, t1, t0, dt, mod, new_dt);
}else{
tStart = time;
has1stData = true;
}
// printf("%6d | %13llu, %13llu | %.6f | %13llu\n", SN, t1, t0, dt, tStart);
}
unsigned long long getTime0() const {return tStart;}
int getSN() const {return SN;}
double getDT() const {return has1stData ? dt : TMath::QuietNaN() ;}
double getMean() const {return mean;}
double getSTD() const { return n < 2 ? 0.0 :sqrt(m2 / (n - 1)); }
void Print() { printf("%6d (%2d) | %16llu| n : %6d, mean : %10.6f msec, sd : %10.6f msec\n",
SN, SN & 0x1F, tStart, n, getMean(), getSTD());}
private:
const int SN;
unsigned long long tStart, t0, t1;
double dt;
bool has1stData;
int n;
double mean;
double m2;
};
void script(TString fileName = "", int maxEvent = -1){
/*
//+++++++++++++++++++++++++++++++++++++++++++
FSUReader * reader = new FSUReader("pulsertest_013_15528_QDC_16_000.fsu", 100);
reader->ScanNumBlock(1, 1);
reader->PrintHit(10);
// for( int i = 0; i < 24 ; i++){
// printf("#################### agg : %d \n", i);
// reader->ReadNextBlock(false, 0, 1);
// reader->GetData()->PrintAllData();
// }
// TGraph * graph = new TGraph();
// int count = 0;
// unsigned long long tree0 = 0;
// unsigned long numHit = reader->GetHitCount();
// for( unsigned long i = 0; i < numHit; i++){
// //printf("-------------%6lu \n\033[A\r", i);
// unsigned long long t1 = reader->GetHit(i).timestamp;
// unsigned short ch = reader->GetHit(i).ch;
// unsigned short ee = reader->GetHit(i).energy;
// //printf("%6lu | %2u, %6u, %16llu\n", i, ch, ee, t1);
// count ++;
// graph->SetPoint(i, i, t1/1e9);
// }
// graph->Draw("APL");
// for( int i = 40; i < 60; i++){
// reader->GetHit(i).Print();
// }
*/
/*
//+++++++++++++++++++++++++++++++++++++++++++
TFile * file0 = new TFile("test_002_1000_noTrace.root");
TFile * f1 = new TFile("test_002_1000.root");
TTree * tree0 = (TTree*) file0->Get("tree");
TTree * t1 = (TTree*) f1->Get("tree");
unsigned int m0, m1;
unsigned short ch0[100], ch1[100];
unsigned long long ts0[100], ts1[100];
tree0->SetBranchAddress("multi", &m0);
tree0->SetBranchAddress("ch", ch0);
tree0->SetBranchAddress("e_t", ts0);
t1->SetBranchAddress("multi", &m1);
t1->SetBranchAddress("ch", ch1);
t1->SetBranchAddress("e_t", ts1);
unsigned long long nEntries0 = tree0->GetEntries();
unsigned long long nEntries1 = t1->GetEntries();
for( unsigned long long ev = 0; ev < nEntries0; ev++){
tree0->GetEntry(ev);
t1->GetEntry(ev);
if( ch0[0] != ch1[0] || ts0[0] != ts1[0] ) {
printf("======================= %llu \n", ev);
printf("ch : %u %u\n", ch0[0], ch1[0]);
printf("ts : %llu %llu\n", ts0[0], ts1[0]);
}
}
file0->Close();
f1->Close();
*/
/*
//+++++++++++++++++++++++++++++++++++++++++++
printf("######### file : %s \n", fileName.Data());
TFile * file0 = new TFile(fileName);
TTree * tree0 = (TTree*) file0->Get("tree");
const int MAX_MULTI = 1000;
unsigned long long evID = 0;
unsigned int multi = 0;
unsigned short sn[MAX_MULTI] = {0};
unsigned short ch[MAX_MULTI] = {0};
unsigned short e[MAX_MULTI] = {0};
// unsigned short e2[MAX_MULTI] = {0};
unsigned long long e_t[MAX_MULTI] = {0};
// unsigned short e_f[MAX_MULTI] = {0};
tree0->SetBranchAddress("evID", &evID);
tree0->SetBranchAddress("multi", &multi);
tree0->SetBranchAddress("sn", sn);
tree0->SetBranchAddress("ch", ch);
tree0->SetBranchAddress("e", e);
tree0->SetBranchAddress("e_t", e_t);
unsigned long long nEntries = tree0->GetEntries();
const std::map<int, int> board = {
{0, 17122},
{1, 17123},
{2, 22320},
{3, 22130},
{4, 22129},
{5, 15529},
{6, 15528},
{7, 379},
{8, 409},
{9, 405},
};
const int nBd = board.size();
PulserChecker * stat[9];
for( int i = 0; i < nBd; i++){ stat[i] = new PulserChecker(board.at(i)); }
printf("Number of Entries : %llu\n", nEntries);
unsigned long long evEnd = nEntries;
if( maxEvent >= 0 ) evEnd = maxEvent;
for( unsigned long long ev = 0; ev < evEnd; ev++){
tree0->GetEntry(ev);
// printf("sn : %5d | %14llu \n", sn[0], e_t[0]);
for( int i = 0; i< nBd; i++){
for( unsigned int j = 0; j < multi; j++){
if( sn[j] == stat[i]->getSN() ) {
stat[i]->addTime(e_t[j]);
printf(" sn : %5d | %16llu \n", sn[j], e_t[j]);
break;
}
}
}
if( ev > 1){
unsigned long long ts1 = e_t[0];
tree0->GetEntry(ev-1);
unsigned long long ts0 = e_t[0];
if( ts1 <= ts0 )printf("--------------- ev : %llu\n", ev);
}
}
file0->Close();
printf("=========================\n");
for( int i = 0; i< nBd; i++){ stat[i]->Print(); }
unsigned long long time0 = stat[0]->getTime0();
for( int i = 1; i< nBd; i++){
if( stat[i]->getTime0() < time0 ) time0 = stat[i]->getTime0();
}
printf("=========================\n");
printf(" S/N time Offset ns \n");
for( int i = 0; i< nBd; i++){
printf(" %5d | %16llu \n", stat[i]->getSN(), stat[i]->getTime0() - time0);
}
*/
//+++++++++++++++++++++++++++++++++++++++++++
// TCanvas * c1 = new TCanvas();
// ANASEN * kaka = new ANASEN();
// kaka->DrawAnasen();
TCanvas * c2 = new TCanvas("c2", "ANASEN Simulation", 800, 800);
c2->cd();
ANASEN * haha = new ANASEN();
haha->SetUncertainties(0, 0, 0, 0);
PW * pw = haha->GetPW();
SX3 * sx3 = haha->GetSX3();
// haha->DrawAnasen(0, 1, 0, 1, -1, false);
gRandom->SetSeed(0);
int xRan = gRandom->Integer(20) - 10;
int yRan = gRandom->Integer(20) - 10;
int zRan = gRandom->Integer(20) - 10;
int pRan = gRandom->Integer(60) -120; // phi deg
int tRan = 0 ;
do{
tRan = gRandom->Integer(100) + 40 ; // theta deg
}while( 75 < tRan && tRan < 105);
TVector3 pos (xRan, yRan, zRan);
TVector3 dir (1, 0, 0);
dir.SetPhi( pRan * TMath::DegToRad());
dir.SetTheta( tRan * TMath::DegToRad());
pos.Print();
dir.Print();
haha->DrawTrack(pos, dir, true);
pw->FindWireID(pos, dir, true);
sx3->FindSX3Pos(pos, dir, true);
// haha->CalTrack(sx3.hitPos, wireID.first, wireID.second, true);
//haha->DrawDeducedTrack(sx3.hitPos, wireID.first, wireID.second);
}