SOLARIS_Analysis/working/script_multi.C
2023-09-26 15:45:46 -04:00

169 lines
5.3 KiB
C

#include "../armory/SolReader.h"
#include "TH1.h"
#include "TMath.h"
#include "TH2.h"
#include "TStyle.h"
#include "TCanvas.h"
#include "TGraph.h"
void script_multi(std::string run = "033"){
SolReader* reader0 = new SolReader("../data_raw/*_" + run + "_00_21245_000.sol");
//SolReader* reader1 = new SolReader("/home/ryan/analysis/data_raw/test_" + run + "_01_21233_000.sol");
Hit * evt0 = reader0->hit;
//Event * evt1 = reader1->evt;
printf("----------file size: %u Byte\n", reader0->GetFileSize());
//printf("----------file size: %u Byte\n", reader1->GetFileSize());
reader0->ScanNumBlock();
//reader1->ScanNumBlock();
unsigned long startTime, endTime;
if( reader0->GetTotalNumBlock() == 0 ) return;
reader0->ReadBlock(0);
startTime = evt0->timestamp;
reader0->ReadBlock(reader0->GetTotalNumBlock() - 1);
endTime = evt0->timestamp;
double duration = double(endTime - startTime)*8./1e9;
printf("============== %lu ns = %.4f sec.\n", (endTime - startTime)*8, duration);
reader0->RewindFile();
// if( reader1->GetTotalNumBlock() == 0 ) return;
// reader1->ReadBlock(0);
// startTime = evt1->timestamp;
// reader1->ReadBlock(reader1->GetTotalNumBlock() - 1);
// endTime = evt1->timestamp;
// duration = double(endTime - startTime)*8./1e9;
// printf("============== %lu ns = %.4f sec.\n", (endTime - startTime)*8, duration);
// reader1->RewindFile();
//int minBlock = std::min(reader0->GetTotalNumBlock(), reader1->GetTotalNumBlock());
int minBlock = reader0->GetTotalNumBlock();
TH1F * hID = new TH1F("hID", "hID", 64, 0, 64);
TH1F * hTdiff = new TH1F("hTdiff", "tdiff", 300, -100, 200);
TH2F * hTdiff2 = new TH2F("hTdiff2", "tdiff vs evt", 400, 0, minBlock, 100, 0, 100);
TH1F * hRate0 = new TH1F("hRate0", "Rate", 20, 0, 20);
TH1F * hRate1 = new TH1F("hRate1", "Rate", 20, 0, 20); hRate1->SetLineColor(2);
TH1F * hE0 = new TH1F("hE0", "Energy", 400, 0, 30000);
TH1F * hE1 = new TH1F("hE1", "Energy", 400, 0, 30000); hE1->SetLineColor(2);
TH1F *hMulti = new TH1F("hMulti", "Multiplicy", 10, 0, 10);
std::vector<std::pair<int, uint64_t>> ts ;
for( int i = 0; i < minBlock; i++){
reader0->ReadNextBlock();
//reader1->ReadNextBlock();
if( i < 10 ){
printf("#################################################\n");
evt0->PrintAll();
}
ts.push_back(std::pair(evt0->channel,evt0->timestamp));
// printf("---------------------------------------------\n");
// evt1->PrintAll();
//if( evt0->channel == 30 ) evt0->PrintAll();
hID->Fill(evt0->channel);
if( evt0->channel == 0 ) {
hRate0->Fill( evt0->timestamp * 8 / 1e9);
hE0->Fill(evt0->energy);
}
if( evt0->channel == 30 ) {
hRate1->Fill( evt0->timestamp * 8 / 1e9);
hE1->Fill(evt0->energy);
}
//if( i < 10 ) printf("t0 : %10lu, t1 : %10lu, %10lu \n", evt0->timestamp, evt1->timestamp,
// evt0->timestamp > evt1->timestamp ? evt0->timestamp - evt1->timestamp : evt1->timestamp - evt0->timestamp);
//
//hTdiff->Fill(evt0->timestamp > evt1->timestamp ? evt0->timestamp - evt1->timestamp : evt1->timestamp - evt0->timestamp);
//hTdiff2->Fill(i, evt0->timestamp > evt1->timestamp ? evt0->timestamp - evt1->timestamp : evt1->timestamp - evt0->timestamp);
//if( i > 10 ) break;
}
delete reader0;
//delete reader1;
//build event
int coinWin = 200;
std::vector<std::vector<std::pair<int, uint64_t>>> events;
std::vector<int> multi;
events.push_back({ts[0]});
multi.push_back(1);
// Iterate through the vector starting from the second pair
for (size_t i = 1; i < ts.size(); ++i) {
uint64_t currentTimestamp = ts[i].second;
uint64_t previousTimestamp = ts[i - 1].second;
// Check if the timestamp difference is within coinWin
if (currentTimestamp - previousTimestamp <= coinWin) {
events.back().push_back(ts[i]); // Add to the current event
multi.back() += 1;
} else {
// Create a new event
events.push_back({ts[i]});
multi.push_back(1);
}
}
// Print the events
double maxTD = -999, minTD = 999;
for (size_t i = 0; i < events.size(); ++i) {
hMulti->Fill(multi[i]);
if( multi[i] > 1 ) {
printf("Event %zu, Multi : %d\n", i, multi[i]);
double haha[2];
for (size_t j = 0; j < events[i].size(); ++j) {
printf("Channel: %2d, Timestamp: %lu\n", events[i][j].first, events[i][j].second);
if( events[i][j].first == 0 ) haha[0] = static_cast<double> ( events[i][j].second );
if( events[i][j].first == 30 ) haha[1] = static_cast<double> ( events[i][j].second );
}
double TD = haha[1]-haha[0];
if(TD > maxTD && TD < 105) maxTD = TD;
if( TD < minTD && TD > -105) minTD = TD;
hTdiff->Fill( TD );
printf("-------------------\n");
}
}
printf(" max TD : %f \n", maxTD);
printf(" min TD : %f \n", minTD);
printf(" spn TD : %f \n", maxTD - minTD);
TCanvas * canvas = new TCanvas("canvas", "canvas", 1200, 800);
gStyle->SetOptStat("neiou");
canvas->Divide(3,2);
canvas->cd(1);hID->Draw();
canvas->cd(2);hE0->Draw(); hE1->Draw("same");
canvas->cd(3);hRate0->Draw(); hRate1->Draw("same");
canvas->cd(4);hTdiff->Draw();
canvas->cd(5); hMulti->Draw();
canvas->cd(5)->SetLogy(true);
canvas->cd(6); hE1->Draw();
//canvas->cd(2);hTdiff2->Draw();
}