XIAEventBuilder/armory/Analyzer_Utili.c

196 lines
6.3 KiB
C

void listDraws(void) {
printf("------------------- List of Plots -------------------\n");
printf(" newCanvas() - Create a new Canvas\n");
printf("-----------------------------------------------------\n");
printf(" eVID() - e vs ID\n");
printf(" drawE() - e for all %d detectors\n", NCRYSTAL);
//printf(" drawGG() - Gamma - Gamma Coincident for all %d detectors\n", NCRYSTAL);
printf("-----------------------------------------------------\n");
printf(" energyCalibration() - Calibrate energy \n");
printf("-----------------------------------------------------\n");
}
int nCanvas=0;
void newCanvas(int sizeX = 800, int sizeY = 600, int posX = 0, int posY = 0){
TString name; name.Form("cNewCanvas%d", nCanvas);
TCanvas * cNewCanvas = new TCanvas(name, name, posX, posY, sizeX, sizeY);
nCanvas++;
cNewCanvas->cd();
}
void eVID(bool cal = false, bool logz = false){
TCanvas * cRawID = (TCanvas *) gROOT->FindObjectAny("cRawID");
if( cRawID == NULL ) cRawID = new TCanvas("cRawID", "raw ID", 1000, 800);
if( cRawID->GetShowEventStatus() == 0 ) cRawID->ToggleEventStatus();
cRawID->cd(1)->SetGrid();
if( logz ) cRawID->cd(1)->SetLogz();
cal ? heCalVID->Draw("colz") : heVID->Draw("colz");
}
void drawE(int CloverID = -1, bool cali = false, bool isLogy = false, double xMin = 0, double xMax = 0){
int nCrystalPerClover = 4;
int nClover = NCRYSTAL / nCrystalPerClover;
if( CloverID >= nClover ) {
printf("Clover-ID > nClover = %d. \n", nClover);
return;
}
int size = 300;
TCanvas *cRawE = (TCanvas *) gROOT->FindObjectAny("cRawE");
if( cRawE == NULL ) cRawE = new TCanvas("cRawE", cali ? "Cal e" : "Raw e", size * nClover, size * nCrystalPerClover);
if( cRawE->GetShowEventStatus() == 0 ) cRawE->ToggleEventStatus();
cRawE->Clear();
if( CloverID >= 0 ) {
nClover = 1;
cRawE->Divide(nClover, 1);
}else{
cRawE->Divide(nClover, nCrystalPerClover, 0);
}
///find max y
double maxY = 0;
int nDet = nClover*nCrystalPerClover;
for( int i = (CloverID < 0 ? 0 : nCrystalPerClover*CloverID) ; i < (CloverID < 0 ? nDet : nCrystalPerClover*CloverID + nDet) ; i++){
int mBin = cali ? heCal[i]->GetMaximumBin() : he[i]->GetMaximumBin();
double max = cali ? heCal[i]->GetBinContent(mBin) : he[i]->GetBinContent(mBin);
if( max > maxY ) maxY = max;
}
maxY = maxY * 1.1;
///printf("max Y : %f \n", maxY);
for (Int_t i = 0; i < nClover; i++) {
int hID = nCrystalPerClover * CloverID + i ;
if( cali ) {
heCal[hID]->SetMaximum(maxY);
heCal[hID]->Draw("same");
}else{
he[hID]->SetMaximum(maxY);
he[hID]->Draw("same");
}
///for( Int_t j = 0; j < nCrystalPerClover; j++){
/// int canvasID = CloverID < 0 ? nClover*j+ i + 1 : j + 1;
/// cRawE->cd(canvasID);
/// cRawE->cd(canvasID)->SetGrid();
/// cRawE->cd(canvasID)->SetTickx(2);
/// cRawE->cd(canvasID)->SetTicky(2);
/// cRawE->cd(canvasID)->SetBottomMargin(0.06);
/// if ( i == nClover -1 ) cRawE->cd(canvasID)->SetRightMargin(0.002);
/// if( isLogy ) cRawE->cd(canvasID)->SetLogy();
/// int hID = CloverID < 0 ? nCrystalPerClover*i+ j : nCrystalPerClover * CloverID + j ;
/// if( cali ) {
/// if ( xMin != 0 || xMax != 0 ) heCal[hID]->GetXaxis()->SetRangeUser(xMin, xMax);
/// heCal[hID]->SetMaximum(maxY);
/// heCal[hID]->Draw("");
/// }else{
/// if ( xMin != 0 || xMax != 0 ) he[hID]->GetXaxis()->SetRangeUser(xMin, xMax);
/// he[hID]->SetMaximum(maxY);
/// he[hID]->Draw("");
/// }
///}
}
cRawE->SetCrosshair(1);
}
/**
void drawGG(){
int nCrystal = 4;
int numCol = NCRYSTAL / nCrystal;
int size = 300;
TCanvas *cGG = (TCanvas *) gROOT->FindObjectAny("cGG");
if( cGG == NULL ) cGG = new TCanvas("cGG", "Gamma - Gamma Coin.", size * NCRYSTAL, size * NCRYSTAL);
cGG->Clear();cGG->Divide(NCRYSTAL, NCRYSTAL);
for( int i = 0; i < NCRYSTAL; i ++){
for( int j = i+1; j < NCRYSTAL; j ++){
cGG->cd( NCRYSTAL * i + j +1 );
hgg[i][j]->Draw("colz");
}
}
}
*/
void energyCalibration(int detID = -1, int BG = 10, double threshold = 0.1, double sigmaMax = 5, int peakDensity = 10){
TCanvas *cCal = (TCanvas *) gROOT->FindObjectAny("cCal");
if( cCal == NULL ) cCal = new TCanvas("cCal", "Energy Calibration", 1000, 0, 1000, 600);
cCal->Clear();
cCal->Divide(2,1);
cCal->SetGrid();
vector<double> refEnergy = {121.738,
244.699,
344.281,
411.115,
443.965,
778.903,
867.390,
964.055,
1085.842,
///1089.700,
1112.087,
1408.022};
double a0[NCRYSTAL];
double a1[NCRYSTAL];
for( int i = 0 ; i < NCRYSTAL; i++){
if( detID >= 0 && i != detID ) continue;
cCal->cd(1);
he[i]->Draw();
vector<double> peaks = fitAuto(he[i], BG, threshold, sigmaMax, peakDensity);
vector<vector<double>> output = FindMatchingPair(peaks, refEnergy);
vector<double> haha1 = output[0];
vector<double> haha2 = output[1];
TGraph * graph = new TGraph(haha1.size(), &haha1[0], &haha2[0] );
cCal->cd(2);
graph->Draw("A*");
TF1 * fit = new TF1("fit", "pol1" );
graph->Fit("fit", "");
a0[i] = fit->GetParameter(0);
a1[i] = fit->GetParameter(1);
if( detID < 0 ) {
printf("%2d | a0: %14.10f, a1: %14.10f\n", i, a0[i], a1[i]);
}else{
printf("%2d | a0, a1 = %14.10f\t%14.10f\n", i, a0[i], a1[i]);
}
}
if( detID < 0 ){
FILE * paraOut;
TString filename;
filename.Form("correction_e_auto.dat");
paraOut = fopen (filename.Data(), "w+");
printf("=========== save e-correction parameters to %s \n", filename.Data());
for( int i = 0; i < NCRYSTAL; i++){
fprintf(paraOut, "%14.10f\t%14.10f\n", a0[i], a1[i]);
}
fflush(paraOut);
fclose(paraOut);
}
}