File indexing completed on 2024-04-06 12:30:25
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040 #include <string>
0041 #include <iostream>
0042 #include <unistd.h>
0043 #include <cmath>
0044 #include <sstream>
0045 #include <fstream>
0046 #include <map>
0047
0048
0049 #include "TROOT.h"
0050 #include "TFile.h"
0051 #include "TSystem.h"
0052 #include "TChain.h"
0053 #include "TBranch.h"
0054 #include "TH1.h"
0055 #include "TH2.h"
0056 #include "TF1.h"
0057 #include "TProfile.h"
0058 #include "TMinuit.h"
0059 #include "TString.h"
0060
0061 using namespace std;
0062
0063
0064 #include "fitMaximumPoint.cc"
0065 #include "myFunctions.cc"
0066
0067
0068 bool selections(int xnum, double eneCent, double qualX, double qualY, int table, int simul );
0069 bool atBorder(int xtalNum);
0070
0071
0072 int main ( int argc, char **argv)
0073 {
0074
0075
0076 char inputFileName[500], outputFileName[150];
0077 int beamEne, appendFlag, simul;
0078 if (argc==6) {
0079 strcpy(inputFileName,argv[1]);
0080 strcpy(outputFileName,argv[2]);
0081 beamEne = atoi(argv[3]);
0082 appendFlag = atoi(argv[4]);
0083 simul = atoi(argv[5]);
0084 }
0085 else {
0086 cout << " " << endl;
0087 cout << " Input: 1) input file name " << endl;
0088 cout << " 2) output file name " << endl;
0089 cout << " 3) beam energy" << endl;
0090 cout << " 4) appendflag" << endl;
0091 cout << " 5) simulation (1) or data (0) " << endl;
0092 cout << endl;
0093 return 1;
0094 }
0095
0096
0097 cout << endl << endl;
0098 cout << "transverse shape analysis - running on calibrated rechits!" << endl;
0099 cout << "beam energy = " << beamEne << endl;
0100 if (simul == 0){ cout << "run on testbeam data" << endl; }
0101 if (simul == 1){ cout << "run on simulated data" << endl; }
0102 cout << endl << endl;
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117 char outputDir[150];
0118 strcpy(outputDir,"./");
0119 char outputFileTxtRatio[150];
0120 strcpy(outputFileTxtRatio,outputDir);
0121 strcat(outputFileTxtRatio,outputFileName);
0122 strcat(outputFileTxtRatio,"_Ratios.txt");
0123 char outputFileTxtMatrix[150];
0124 strcpy(outputFileTxtMatrix,outputDir);
0125 strcat(outputFileTxtMatrix,outputFileName);
0126 strcat(outputFileTxtMatrix,"_Matrix.txt");
0127 char outputFileMcpTxt[150];
0128 strcpy(outputFileMcpTxt,outputDir);
0129 strcat(outputFileMcpTxt,outputFileName);
0130 strcat(outputFileMcpTxt,"_mcp.txt");
0131
0132
0133
0134
0135 char outfile[200];
0136 char name[200];
0137 char title[200], titleXax[200], titleXay[200];
0138 TFile *file;
0139
0140
0141 double infY = 0.;
0142 double supY = 200.;
0143 int nbinY = 100;
0144 if(beamEne == 20){
0145 infY = 0.; supY = 20.; nbinY = (int)((supY - infY)/0.20);
0146 cout << "ene = 20 --> histo range from " << infY << " to " << supY << " with " << nbinY << " bins" << endl;
0147 }
0148 if(beamEne == 30){
0149 infY = 10.; supY = 30.; nbinY = (int)((supY - infY)/0.20);
0150 cout << "ene = 30 --> histo range from " << infY << " to " << supY << " with " << nbinY << " bins" << endl;
0151 }
0152 if(beamEne == 40){
0153 infY = 10.; supY = 50.; nbinY = (int)((supY - infY)/0.20);
0154 cout << "ene = 40 --> histo range from " << infY << " to " << supY << " with " << nbinY << " bins" << endl;
0155 }
0156 if(beamEne == 50){
0157 infY = 10.; supY = 50.; nbinY = (int)((supY - infY)/0.20);
0158 cout << "ene = 50 --> histo range from " << infY << " to " << supY << " with " << nbinY << " bins" << endl;
0159 }
0160 if(beamEne == 80){
0161 infY = 20.; supY = 80.; nbinY = (int)((supY - infY)/0.20);
0162 cout << "ene = 80 --> histo range from " << infY << " to " << supY << " with " << nbinY << " bins" << endl;
0163 }
0164 if(beamEne == 100){
0165 infY = 20.; supY = 100.; nbinY = (int)((supY - infY)/0.20);
0166 cout << "ene = 100 --> histo range from " << infY << " to " << supY << " with " << nbinY << " bins" << endl;
0167 }
0168 if(beamEne == 120){
0169 infY = 30.; supY = 120.; nbinY = (int)((supY - infY)/0.20);
0170 cout << "ene = 120 --> histo range from " << infY << " to " << supY << " with " << nbinY << " bins" << endl;
0171 }
0172 if(beamEne == 150){
0173 infY = 40.; supY = 150.; nbinY = (int)((supY - infY)/0.20);
0174 cout << "ene = 150 --> histo range from " << infY << " to " << supY << " with " << nbinY << " bins" << endl;
0175 }
0176 if(beamEne == 500){
0177 infY = 200.; supY = 450.; nbinY = (int)((supY - infY)/0.20);
0178 cout << "ene = 150 --> histo range from " << infY << " to " << supY << " with " << nbinY << " bins" << endl;
0179 }
0180
0181
0182
0183
0184 std::vector<int> treeEntries;
0185 treeEntries.push_back(0);
0186
0187 TChain *T = new TChain("T1");
0188 char Buffer[500];
0189 char MyRootFile[2000];
0190 cout << "input: " << inputFileName << endl;
0191 ifstream *inputFile = new ifstream(inputFileName);
0192 while( !(inputFile->eof()) ){
0193 inputFile->getline(Buffer,500);
0194 if (!strstr(Buffer,"#") && !(strspn(Buffer," ") == strlen(Buffer))){
0195 sscanf(Buffer,"%s",MyRootFile);
0196 T->Add(MyRootFile);
0197 treeEntries.push_back( T->GetEntries() );
0198 cout << "chaining " << MyRootFile << endl;
0199 }}
0200 inputFile->close();
0201 delete inputFile;
0202
0203
0204 const static int numTrees = treeEntries.size();
0205 cout << endl;
0206 cout << "in total " << (numTrees-1) << " files have been chained" << endl;
0207 for (int ii=0; ii< (numTrees-1); ii++){cout << "file " << ii << ", from entry " << treeEntries[ii] << ", to entry " << treeEntries[ii+1] << endl; }
0208 cout << endl;
0209
0210
0211
0212
0213
0214 int run, event;
0215 int xtalSM;
0216 int xtalEta, xtalPhi;
0217 int tbMoving;
0218 int crystal[49];
0219 double amplit[49];
0220 double hodoX, hodoY;
0221 double hodoQualityX, hodoQualityY;
0222 double hodoSlopeX, hodoSlopeY;
0223
0224 T->SetMakeClass(1);
0225 T->SetBranchStatus("*",0);
0226 T->SetBranchStatus("run",1);
0227 T->SetBranchStatus("event",1);
0228 T->SetBranchStatus("xtalSM",1);
0229 T->SetBranchStatus("xtalEta",1);
0230 T->SetBranchStatus("xtalPhi",1);
0231 T->SetBranchStatus("amplit",1);
0232 T->SetBranchStatus("tbMoving",1);
0233 T->SetBranchStatus("hodoX",1);
0234 T->SetBranchStatus("hodoY",1);
0235 T->SetBranchStatus("hodoQualityX",1);
0236 T->SetBranchStatus("hodoQualityY",1);
0237 T->SetBranchStatus("hodoSlopeX",1);
0238 T->SetBranchStatus("hodoSlopeY",1);
0239 T->SetBranchStatus("crystal",1);
0240
0241 T->SetBranchAddress("run",&run);
0242 T->SetBranchAddress("event",&event);
0243 T->SetBranchAddress("xtalSM",&xtalSM);
0244 T->SetBranchAddress("xtalEta",&xtalEta);
0245 T->SetBranchAddress("xtalPhi",&xtalPhi);
0246 T->SetBranchAddress("amplit",amplit);
0247 T->SetBranchAddress("tbMoving",&tbMoving);
0248 T->SetBranchAddress("hodoX",&hodoX);
0249 T->SetBranchAddress("hodoY",&hodoY);
0250 T->SetBranchAddress("hodoQualityX",&hodoQualityX);
0251 T->SetBranchAddress("hodoQualityY",&hodoQualityY);
0252 T->SetBranchAddress("hodoSlopeX",&hodoSlopeX);
0253 T->SetBranchAddress("hodoSlopeY",&hodoSlopeY);
0254 T->SetBranchAddress("crystal",crystal);
0255
0256
0257 float nEnt=T->GetEntries();
0258 cout << "Total number of events in loop is " << nEnt << endl;
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271 int thisXinBeam = 0;
0272 int prevXinBeam = 0;
0273 std::vector<int> xInBeam, eInBeam;
0274 for (int entry0=0; entry0<nEnt; entry0++) {
0275
0276 T -> GetEntry(entry0);
0277
0278
0279 if (entry0 == 0){
0280 xInBeam.push_back(xtalSM);
0281 eInBeam.push_back(xtalEta);
0282 }
0283
0284
0285 prevXinBeam = thisXinBeam;
0286 if ( (entry0 == 0) || (prevXinBeam == 0) ){ prevXinBeam = xtalSM; }
0287 thisXinBeam = xtalSM;
0288 if ( thisXinBeam != prevXinBeam ){
0289 cout << "entry " << entry0 << ", event = " << event
0290 << ": crystal changed--> before " << prevXinBeam << ", now " << thisXinBeam << endl; }
0291
0292
0293 if ( thisXinBeam != prevXinBeam ){
0294 bool itisnew = true;
0295 for(std::vector<int>::const_iterator myXib = xInBeam.begin(); myXib != xInBeam.end(); ++myXib){
0296 if (thisXinBeam == *myXib){ itisnew = false; }
0297 }
0298 if ( itisnew){ xInBeam.push_back(thisXinBeam); eInBeam.push_back(xtalEta); }
0299 }
0300 }
0301
0302
0303 int xibC = 0;
0304 int eibC = 0;
0305 const static int numXinB = xInBeam.size();
0306 const static int numEinB = eInBeam.size();
0307 int myXinB[numXinB];
0308 int myEinB[numXinB];
0309 for(std::vector<int>::const_iterator myXib = xInBeam.begin(); myXib != xInBeam.end(); ++myXib){
0310 myXinB[xibC] = *myXib;
0311 xibC++;
0312 }
0313 for(std::vector<int>::const_iterator myEib = eInBeam.begin(); myEib != eInBeam.end(); ++myEib){
0314 myEinB[eibC] = *myEib;
0315 eibC++;
0316 }
0317
0318
0319
0320 cout << endl;
0321 cout << "in total: " << xInBeam.size() << " crystals" << endl;
0322 cout << "Xtals in beam:" << endl;
0323 for (int myXib=0; myXib<numXinB; myXib++){
0324 cout << "number " << myXib << ": xtal " << myXinB[myXib] << ", eta = " << myEinB[myXib] << endl; }
0325 cout << endl;
0326 cout << endl;
0327 cout << "NOW start the analysis" << endl;
0328 cout << endl;
0329 cout << endl;
0330
0331
0332
0333
0334 int totalInTheRun = 0;
0335 int wrongXtalInTheRun = 0;
0336 int wrongQuality[numXinB];
0337 int movingTable[numXinB];
0338 int highAmpl[numXinB];
0339 int negaAmpl[numXinB];
0340 int good0[numXinB];
0341 int good1[numXinB];
0342 int good2[numXinB];
0343 int good3[numXinB];
0344 int wrongMaxAmp[numXinB];
0345 for(int myXib=0; myXib<numXinB; myXib++){
0346 movingTable[myXib] = 0;
0347 wrongQuality[myXib] = 0;
0348 highAmpl[myXib] = 0;
0349 negaAmpl[myXib] = 0;
0350 good0[myXib] = 0;
0351 good1[myXib] = 0;
0352 good2[myXib] = 0;
0353 good3[myXib] = 0;
0354 wrongMaxAmp[myXib] = 0;
0355 }
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366 TH2F *H_ampVsX_bef[numXinB];
0367 TH2F *H_ampVsX_aft[numXinB];
0368 TH2F *H_ampVsY_bef[numXinB];
0369 TH2F *H_ampVsY_aft[numXinB];
0370 TH2F *H_MovVsEve_bef[numXinB];
0371 TH2F *H_MovVsEve_aft[numXinB];
0372 TH1F *H_hodoX_bef[numXinB];
0373 TH1F *H_hodoX_aft[numXinB];
0374 TH1F *H_hodoY_bef[numXinB];
0375 TH1F *H_hodoY_aft[numXinB];
0376 TH1F *H_hodoQualityX_bef[numXinB];
0377 TH1F *H_hodoQualityY_bef[numXinB];
0378
0379 for (int myXib=0; myXib<numXinB; myXib++){
0380
0381 sprintf (name, "H_ampVsX_bef[%d]", myXib);
0382 sprintf (title, "E1 vs X - before cuts");
0383 H_ampVsX_bef[myXib] = new TH2F(name, title, 80, -20., 20., 150, 0., 150.);
0384
0385 sprintf (name, "H_ampVsX_aft[%d]", myXib);
0386 sprintf (title, "E1 vs X - after cuts");
0387 H_ampVsX_aft[myXib] = new TH2F(name, title, 80, -20., 20., 150, 0., 150.);
0388
0389 sprintf (name, "H_ampVsY_bef[%d]", myXib);
0390 sprintf (title, "E1 vs Y - before cuts");
0391 H_ampVsY_bef[myXib] = new TH2F(name, title, 80, -20., 20., 150, 0., 150.);
0392
0393 sprintf (name, "H_ampVsY_aft[%d]", myXib);
0394 sprintf (title, "E1 vs Y - after cuts");
0395 H_ampVsY_aft[myXib] = new TH2F(name, title, 80, -20., 20., 150, 0., 150.);
0396
0397 sprintf (name, "H_MovVsEve_bef[%d]", myXib);
0398 sprintf (title, "Table checking, before cuts");
0399 H_MovVsEve_bef[myXib] = new TH2F(name, title, 80000, 0., 800000., 2, 0., 2.);
0400
0401 sprintf (name, "H_MovVsEve_aft[%d]", myXib);
0402 sprintf (title, "Table checking, after cuts");
0403 H_MovVsEve_aft[myXib] = new TH2F(name, title, 80000, 0., 800000., 2, 0., 2.);
0404
0405 sprintf (name, "H_hodoX_bef[%d]", myXib);
0406 sprintf (title, "HodoX, before cuts");
0407 H_hodoX_bef[myXib] = new TH1F(name, title, 80, -20., 20.);
0408
0409 sprintf (name, "H_hodoX_aft[%d]", myXib);
0410 sprintf (title, "HodoX, after cuts");
0411 H_hodoX_aft[myXib] = new TH1F(name, title, 80, -20., 20.);
0412
0413 sprintf (name, "H_hodoY_bef[%d]", myXib);
0414 sprintf (title, "HodoY, before cuts");
0415 H_hodoY_bef[myXib] = new TH1F(name, title, 80, -20., 20.);
0416
0417 sprintf (name, "H_hodoY_aft[%d]", myXib);
0418 sprintf (title, "HodoY, after cuts");
0419 H_hodoY_aft[myXib] = new TH1F(name, title, 80, -20., 20.);
0420
0421 sprintf (name, "H_hodoQualityX_bef[%d]", myXib);
0422 sprintf (title, "Hodo quality X, before cuts");
0423 H_hodoQualityX_bef[myXib] = new TH1F(name, title, 100, 0., 6.);
0424
0425 sprintf (name, "H_hodoQualityY_bef[%d]", myXib);
0426 sprintf (title, "Hodo quality Y, before cuts");
0427 H_hodoQualityY_bef[myXib] = new TH1F(name, title, 100, 0., 6.);
0428 }
0429
0430
0431
0432
0433
0434 for (int entry1=0; entry1<nEnt; entry1++) {
0435
0436
0437 T -> GetEntry(entry1);
0438 if (entry1%100000 == 0){ cout << "Check loop: entry = " << entry1 << endl; }
0439
0440
0441 int table = tbMoving;
0442
0443
0444 int xtalInBeam = xtalSM;
0445 int myHere = 2000;
0446 for (int myXib=0; myXib<numXinB; myXib++){ if (xtalInBeam == myXinB[myXib]){myHere = myXib;} }
0447
0448
0449 int thisII = 0;
0450 for (int ii=0; ii< (numTrees-1); ii++){if ( (entry1 >= treeEntries[ii]) && (entry1 < treeEntries[ii+1]) ){ thisII = ii; } }
0451 int globalEve = event + treeEntries[thisII];
0452
0453
0454 H_MovVsEve_bef[myHere] -> Fill(globalEve, table);
0455 H_ampVsX_bef[myHere] -> Fill(hodoX, amplit[24]);
0456 H_ampVsY_bef[myHere] -> Fill(hodoY, amplit[24]);
0457 H_hodoX_bef[myHere] -> Fill(hodoX);
0458 H_hodoY_bef[myHere] -> Fill(hodoY);
0459 H_hodoQualityX_bef[myHere] -> Fill(hodoQualityX);
0460 H_hodoQualityY_bef[myHere] -> Fill(hodoQualityY);
0461
0462
0463 bool select = selections(myHere, amplit[24], hodoQualityX, hodoQualityY, table, simul);
0464 if (!select){ continue; }
0465 good0[myHere]++;
0466
0467
0468 H_MovVsEve_aft[myHere] -> Fill(globalEve, table);
0469 H_ampVsX_aft[myHere] -> Fill(hodoX, amplit[24]);
0470 H_ampVsY_aft[myHere] -> Fill(hodoY, amplit[24]);
0471 H_hodoX_aft[myHere] -> Fill(hodoX);
0472 H_hodoY_aft[myHere] -> Fill(hodoY);
0473 }
0474
0475
0476
0477 strcpy(outfile,outputDir);
0478 strcat(outfile,outputFileName);
0479 strcat(outfile,"_checks.root");
0480 if(appendFlag==0){ file = new TFile (outfile,"RECREATE","istogrammi"); }
0481 else { file = new TFile (outfile,"UPDATE","istogrammi"); }
0482
0483 for (int myXib=0; myXib<numXinB; myXib++){
0484
0485 sprintf (name, "H_ampVsX_bef_x%d", myXinB[myXib]);
0486 H_ampVsX_bef[myXib]->SetTitle(name);
0487 H_ampVsX_bef[myXib]->Write(name);
0488
0489 sprintf (name, "H_ampVsY_bef_x%d", myXinB[myXib]);
0490 H_ampVsY_bef[myXib]->SetTitle(name);
0491 H_ampVsY_bef[myXib]->Write(name);
0492
0493 sprintf (name, "H_ampVsX_aft_x%d", myXinB[myXib]);
0494 H_ampVsX_aft[myXib]->SetTitle(name);
0495 H_ampVsX_aft[myXib]->Write(name);
0496
0497 sprintf (name, "H_ampVsY_aft_x%d", myXinB[myXib]);
0498 H_ampVsY_aft[myXib]->SetTitle(name);
0499 H_ampVsY_aft[myXib]->Write(name);
0500
0501 sprintf (name, "H_MovVsEve_bef_x%d", myXinB[myXib]);
0502 H_MovVsEve_bef[myXib]->SetTitle(name);
0503 H_MovVsEve_bef[myXib]->Write(name);
0504
0505 sprintf (name, "H_MovVsEve_aft_x%d", myXinB[myXib]);
0506 H_MovVsEve_aft[myXib]->SetTitle(name);
0507 H_MovVsEve_aft[myXib]->Write(name);
0508
0509 sprintf (name, "H_hodoX_bef_x%d", myXinB[myXib]);
0510 H_hodoX_bef[myXib]->SetTitle(name);
0511 H_hodoX_bef[myXib]->Write(name);
0512
0513 sprintf (name, "H_hodoX_aft_x%d", myXinB[myXib]);
0514 H_hodoX_aft[myXib]->SetTitle(name);
0515 H_hodoX_aft[myXib]->Write(name);
0516
0517 sprintf (name, "H_hodoY_bef_x%d", myXinB[myXib]);
0518 H_hodoY_bef[myXib]->SetTitle(name);
0519 H_hodoY_bef[myXib]->Write(name);
0520
0521 sprintf (name, "H_hodoY_aft_x%d", myXinB[myXib]);
0522 H_hodoY_aft[myXib]->SetTitle(name);
0523 H_hodoY_aft[myXib]->Write(name);
0524
0525 sprintf (name, "H_hodoQualityX_bef_x%d", myXinB[myXib]);
0526 H_hodoQualityX_bef[myXib]->SetTitle(name);
0527 H_hodoQualityX_bef[myXib]->Write(name);
0528
0529 sprintf (name, "H_hodoQualityY_bef_x%d", myXinB[myXib]);
0530 H_hodoQualityY_bef[myXib]->SetTitle(name);
0531 H_hodoQualityY_bef[myXib]->Write(name);
0532 }
0533
0534
0535 for (int myXib=0; myXib<numXinB; myXib++){
0536 delete H_ampVsX_bef[myXib];
0537 delete H_ampVsX_aft[myXib];
0538 delete H_ampVsY_bef[myXib];
0539 delete H_ampVsY_aft[myXib];
0540 delete H_MovVsEve_bef[myXib];
0541 delete H_MovVsEve_aft[myXib];
0542 delete H_hodoX_bef[myXib];
0543 delete H_hodoX_aft[myXib];
0544 delete H_hodoY_bef[myXib];
0545 delete H_hodoY_aft[myXib];
0546 delete H_hodoQualityX_bef[myXib];
0547 delete H_hodoQualityY_bef[myXib];
0548 }
0549
0550 file->Close();
0551 delete file;
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564 double UpxFitX = 10.;
0565 double DownxFitX = -10.;
0566 double UpyFitX = 4.;
0567 double DownyFitX = -4.;
0568 double UpxFitY = 4.;
0569 double DownxFitY = -4.;
0570 double UpyFitY = 10.;
0571 double DownyFitY = -10.;
0572
0573
0574 TH2F *H_mapXhodoVsE_1[numXinB];
0575 TH2F *H_mapYhodoVsE_1[numXinB];
0576 for (int myXib=0; myXib<numXinB; myXib++){
0577 sprintf (name, "H_mapXhodoVsE_1[%d]", myXib);
0578 sprintf (title, "Pulse maximum vs X");
0579 H_mapXhodoVsE_1[myXib] = new TH2F(name, title, 80, -20., 20., nbinY, infY, supY);
0580 H_mapXhodoVsE_1[myXib] -> GetXaxis()->SetTitle("X (mm)");
0581 H_mapXhodoVsE_1[myXib] -> GetYaxis()->SetTitle("amplit (adc counts)");
0582
0583 sprintf (name, "H_mapYhodoVsE_1[%d]", myXib);
0584 sprintf (title, "Pulse maximum vs Y");
0585 H_mapYhodoVsE_1[myXib] = new TH2F(name, title, 80, -20., 20., nbinY, infY, supY);
0586 H_mapYhodoVsE_1[myXib] -> GetXaxis()->SetTitle("Y (mm)");
0587 H_mapYhodoVsE_1[myXib] -> GetYaxis()->SetTitle("amplit (adc counts)");
0588 }
0589
0590
0591
0592 for (int entry2=0; entry2<nEnt; entry2++) {
0593
0594
0595 totalInTheRun++;
0596
0597
0598 T -> GetEntry(entry2);
0599 if (entry2%100000 == 0){ cout << "First analysis loop: entry = " << entry2 << endl; }
0600
0601
0602 int table = tbMoving;
0603
0604
0605 int xtalInBeam = xtalSM;
0606 int myHere = 2000;
0607 for (int myXib=0; myXib<numXinB; myXib++){ if (xtalInBeam == myXinB[myXib]){myHere = myXib;} }
0608
0609
0610 int thisII = 0;
0611 for (int ii=0; ii< (numTrees-1); ii++){ if ( (entry2 >= treeEntries[ii]) && (entry2 < treeEntries[ii+1]) ){ thisII = ii; } }
0612
0613
0614 bool select = true;
0615 if ( myHere >1700) { wrongXtalInTheRun++; select = false; }
0616 if ( amplit[24] > 999.) { highAmpl[myHere]++; select = false; }
0617 if ( amplit[24] < 0.5) { negaAmpl[myHere]++; select = false; }
0618 if ( !simul) {
0619 if (table) { movingTable[myHere]++; select = false; }
0620 if ((hodoQualityX>2.0) || (hodoQualityX<0.0)) { wrongQuality[myHere]++; select = false; }
0621 if ((hodoQualityY>2.0) || (hodoQualityY<0.0)) { wrongQuality[myHere]++; select = false; }
0622 }
0623 if (!select){ continue; }
0624 good1[myHere]++;
0625
0626
0627 if ((hodoX < DownxFitX) || (hodoX > UpxFitX)){continue;}
0628 if ((hodoY < DownyFitY) || (hodoY > UpyFitY)){continue;}
0629
0630
0631 if ((DownyFitX<hodoY) && (hodoY<UpyFitX)){ H_mapXhodoVsE_1[myHere] -> Fill(hodoX, amplit[24]); }
0632 if ((DownxFitY<hodoX) && (hodoX<UpxFitY)){ H_mapYhodoVsE_1[myHere] -> Fill(hodoY, amplit[24]); }
0633
0634 }
0635
0636
0637
0638 double p0x_1[numXinB], p0y_1[numXinB];
0639 for (int myXib=0; myXib<numXinB; myXib++){
0640 p0x_1[myXib] = 1000.;
0641 p0y_1[myXib] = 1000.;
0642 }
0643
0644 strcpy(outfile,outputDir);
0645 strcat(outfile,outputFileName);
0646 strcat(outfile,"_histos.root");
0647 if(appendFlag==0){ file = new TFile (outfile,"RECREATE","istogrammi"); }
0648 else { file = new TFile (outfile,"UPDATE","istogrammi"); }
0649
0650 for (int myXib=0; myXib<numXinB; myXib++){
0651
0652
0653 p0x_1[myXib] = Fit_MaximumPoint( H_mapXhodoVsE_1[myXib], 10);
0654 p0y_1[myXib] = Fit_MaximumPoint( H_mapYhodoVsE_1[myXib], 10);
0655
0656
0657 sprintf (name, "H_mapXhodoVsE_1loop_x%d", myXinB[myXib]);
0658 H_mapXhodoVsE_1[myXib]->SetTitle(name);
0659 H_mapXhodoVsE_1[myXib]->Write(name);
0660
0661 sprintf (name, "H_mapYhodoVsE_1loop_x%d", myXinB[myXib]);
0662 H_mapYhodoVsE_1[myXib]->SetTitle(name);
0663 H_mapYhodoVsE_1[myXib]->Write(name);
0664 }
0665 file->Close();
0666 delete file;
0667
0668
0669
0670 for (int myXib=0; myXib<numXinB; myXib++){
0671 delete H_mapXhodoVsE_1[myXib];
0672 delete H_mapYhodoVsE_1[myXib];
0673 }
0674
0675
0676
0677
0678
0679
0680
0681
0682
0683
0684 double DownyFitX_v[numXinB];
0685 double DownxFitY_v[numXinB];
0686 double UpyFitX_v[numXinB];
0687 double UpxFitY_v[numXinB];
0688 for (int myXib=0; myXib<numXinB; myXib++){
0689 DownyFitX_v[myXib] = p0y_1[myXib]-2;
0690 DownxFitY_v[myXib] = p0x_1[myXib]-2;
0691 UpyFitX_v[myXib] = p0y_1[myXib]+2;
0692 UpxFitY_v[myXib] = p0x_1[myXib]+2;
0693 }
0694
0695
0696 TH2F *H_mapXhodoVsE_2[numXinB];
0697 TH2F *H_mapYhodoVsE_2[numXinB];
0698 for (int myXib=0; myXib<numXinB; myXib++){
0699
0700 sprintf (name, "H_mapXhodoVsE_2[%d]", myXib);
0701 sprintf (title, "Pulse maximum vs X");
0702 H_mapXhodoVsE_2[myXib] = new TH2F(name, title, 80, -20., 20., nbinY, infY, supY);
0703 H_mapXhodoVsE_2[myXib] -> GetXaxis()->SetTitle("X (mm)");
0704 H_mapXhodoVsE_2[myXib] -> GetYaxis()->SetTitle("amplit (adc counts)");
0705
0706 sprintf (name, "H_mapYhodoVsE_2[%d]", myXib);
0707 sprintf (title, "Pulse maximum vs Y");
0708 H_mapYhodoVsE_2[myXib] = new TH2F(name, title, 80, -20., 20., nbinY, infY, supY);
0709 H_mapYhodoVsE_2[myXib] -> GetXaxis()->SetTitle("Y (mm)");
0710 H_mapYhodoVsE_2[myXib] -> GetYaxis()->SetTitle("amplit (adc counts)");
0711 }
0712
0713 for (int entry3=0; entry3<nEnt; entry3++) {
0714
0715
0716 T -> GetEntry(entry3);
0717 if (entry3%100000 == 0){ cout << "Second analysis loop: entry = " << entry3 << endl; }
0718
0719
0720 int xtalInBeam = xtalSM;
0721 int myHere = 2000;
0722 for (int myXib=0; myXib<numXinB; myXib++){ if (xtalInBeam == myXinB[myXib]){myHere = myXib;} }
0723
0724
0725 int table = tbMoving;
0726
0727
0728 int thisII = 0;
0729 for (int ii=0; ii< (numTrees-1); ii++){if ( (entry3 >= treeEntries[ii]) && (entry3 < treeEntries[ii+1]) ){ thisII = ii; } }
0730
0731
0732 bool select = selections(myHere, amplit[24], hodoQualityX, hodoQualityY, table, simul);
0733 if (!select){ continue; }
0734 good2[myHere]++;
0735
0736
0737 if ((hodoX < DownxFitX) || (hodoX > UpxFitX)){continue;}
0738 if ((hodoY < DownyFitY) || (hodoY > UpyFitY)){continue;}
0739
0740
0741 if ((DownyFitX_v[myHere]<hodoY) && (hodoY<UpyFitX_v[myHere])){ H_mapXhodoVsE_2[myHere] -> Fill(hodoX, amplit[24]); }
0742 if ((DownxFitY_v[myHere]<hodoX) && (hodoX<UpxFitY_v[myHere])){ H_mapYhodoVsE_2[myHere] -> Fill(hodoY, amplit[24]); }
0743
0744 }
0745
0746
0747
0748
0749
0750 strcpy(outfile,outputDir);
0751 strcat(outfile,outputFileName);
0752 strcat(outfile,"_histos.root");
0753 file = new TFile (outfile,"UPDATE","istogrammi");
0754
0755
0756 double p0x_2[numXinB], p0y_2[numXinB];
0757 double p0x_c22[numXinB], p0y_c22[numXinB];
0758 Stat_t p0x_ent2[numXinB], p0y_ent2[numXinB];
0759
0760 for (int myXib=0; myXib<numXinB; myXib++){
0761
0762
0763 p0x_2[myXib] = 1000.;
0764 p0y_2[myXib] = 1000.;
0765 p0x_c22[myXib] = 1000.;
0766 p0y_c22[myXib] = 1000.;
0767 p0x_ent2[myXib] = -15000;
0768 p0y_ent2[myXib] = -15000;
0769
0770
0771 p0x_2[myXib] = Fit_MaximumPoint( H_mapXhodoVsE_2[myXib], 10);
0772 p0y_2[myXib] = Fit_MaximumPoint( H_mapYhodoVsE_2[myXib], 10);
0773
0774
0775 p0x_c22[myXib] = Fit_MaximumPoint( H_mapXhodoVsE_2[myXib], 30);
0776 p0y_c22[myXib] = Fit_MaximumPoint( H_mapYhodoVsE_2[myXib], 30);
0777
0778
0779 p0x_ent2[myXib] = H_mapXhodoVsE_2[myXib]->GetEntries();
0780 p0y_ent2[myXib] = H_mapYhodoVsE_2[myXib]->GetEntries();
0781
0782
0783 sprintf (name, "H_mapXhodoVsE_2loop_x%d", myXinB[myXib]);
0784 H_mapXhodoVsE_2[myXib]->SetTitle(name);
0785 H_mapXhodoVsE_2[myXib]->Write(name);
0786
0787 sprintf (name, "H_mapYhodoVsE_2loop_x%d", myXinB[myXib]);
0788 H_mapYhodoVsE_2[myXib]->SetTitle(name);
0789 H_mapYhodoVsE_2[myXib]->Write(name);
0790 }
0791 file->Close();
0792 delete file;
0793
0794
0795 for (int myXib=0; myXib<numXinB; myXib++){
0796 delete H_mapXhodoVsE_2[myXib];
0797 delete H_mapYhodoVsE_2[myXib];
0798 }
0799
0800
0801
0802
0803
0804
0805 ofstream *ResFileMc;
0806 if(appendFlag==0){
0807 ResFileMc = new ofstream(outputFileMcpTxt,ios::out);
0808 *ResFileMc << "#Xtal" << "\t"
0809 << "entriesX" << "\t" << "maxX" << "\t" << "chi2X" << "\t"
0810 << "entriesY" << "\t" << "maxY" << "\t" << "chi2Y" << endl; }
0811 else { ResFileMc = new ofstream(outputFileMcpTxt,ios::app); }
0812 for (int myXib=0; myXib<numXinB; myXib++){
0813 *ResFileMc << myXinB[myXib] << "\t"
0814 << p0x_ent2[myXib] << "\t" << p0x_2[myXib] << "\t" << p0x_c22[myXib] << "\t"
0815 << p0y_ent2[myXib] << "\t" << p0y_2[myXib] << "\t" << p0y_c22[myXib] << endl;
0816 }
0817 cout << endl;
0818
0819
0820
0821 ofstream *badMcPFile = new ofstream("badMcpFile.txt",ios::out);
0822 map<int, bool> badMcp;
0823 for (int myXib=0; myXib<numXinB; myXib++){
0824 bool isItOk = true;
0825 if ( (p0x_c22[myXib] > 3.5) || (p0y_c22[myXib] > 3.5) ){ isItOk = false; }
0826 badMcp.insert(pair<int, bool>(myXinB[myXib], isItOk));
0827 }
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839 double downy[numXinB];
0840 double downx[numXinB];
0841 double upy[numXinB];
0842 double upx[numXinB];
0843
0844 for (int myXib=0; myXib<numXinB; myXib++){
0845 downy[myXib] = p0y_2[myXib]-2;
0846 downx[myXib] = p0x_2[myXib]-2;
0847 upy[myXib] = p0y_2[myXib]+2;
0848 upx[myXib] = p0x_2[myXib]+2;
0849 }
0850
0851
0852 TH1F *H_eMatrix[3][numXinB];
0853 TH1F *H_eRatio[3][numXinB];
0854
0855 TH1F *H_energyNxN[3];
0856 TProfile *H_energyieta;
0857 TProfile *H_energyiphi;
0858
0859 H_energyieta = new TProfile("H_energyieta","energy by ieta", 5, -2.5, 2.5,0.0,1.0);
0860 H_energyiphi = new TProfile("H_energyiphi","energy by iphi", 5, -2.5, 2.5,0.0,1.0);
0861
0862 for (int ii=0; ii<3; ii++){
0863 sprintf(name, "H_energy%dx%d",2*ii+1,2*ii+1);
0864 sprintf(title, "%dx%d crystal energy for beam energy = %d",2*ii+1,2*ii+1,beamEne);
0865 sprintf(titleXax, "E%dx%d (GeV)",2*ii+1,2*ii+1);
0866
0867 H_energyNxN[ii] = new TH1F(name, title, 280, 0.5, 1.1);
0868 H_energyNxN[ii]-> GetXaxis()->SetTitle(titleXax);
0869 }
0870 TH1F* H_energyE1E9 = new TH1F("H_energyE1E9","Energy ratio of 1x1 to 3x3 crystals;E_{1}/E_{9}",200,0.7,0.9);
0871 TH1F* H_energyE1E25 = new TH1F("H_energyE1E25","Energy ratio of 1x1 to 5x5 crystals;E_{1}/E_{25}",200,0.7,0.9);
0872 TH1F* H_energyE9E25 = new TH1F("H_energyE9E25","Energy ratio of 3x3 to 5x5 crystals;E_{9}/E_{25}",200,0.9,1.0);
0873
0874 for (int myXib=0; myXib<numXinB; myXib++){
0875 for (int ii=0; ii<3; ii++){
0876 sprintf (name, "H_eMatrix[%d][%d]", ii, myXib);
0877 if(ii==0){ sprintf(title, "1x1 energy"); sprintf(titleXax, "E1 (GeV)"); }
0878 if(ii==1){ sprintf(title, "3x3 energy"); sprintf(titleXax, "E9 (GeV)"); }
0879 if(ii==2){ sprintf(title, "5x5 energy"); sprintf(titleXax, "E25 (GeV)"); }
0880
0881 if (beamEne==20){
0882 if (!simul){
0883 if (ii==0) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 0., 30.); }
0884 if (ii==1 || ii==2){ H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 0., 30.); }
0885 }
0886 if (simul){
0887 if (ii==0) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 10., 20.); }
0888 if (ii==1) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 15., 22.); }
0889 if (ii==2) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 15., 22.); }
0890 }
0891 }
0892 else if (beamEne==30) {
0893 if (!simul){
0894 if (ii==0) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 0., 40.); }
0895 if (ii==1 || ii==2) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 0., 40.); }
0896 }
0897 if (simul){
0898 if (ii==0) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 15., 27.); }
0899 if (ii==1) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 21., 32.); }
0900 if (ii==2) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 24., 35.); }
0901 }
0902 }
0903 else if (beamEne==40) {
0904 if (!simul){
0905 if (ii==0) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 0., 60.); }
0906 if (ii==1 || ii==2) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 0., 60.); }
0907 }
0908 if (simul){
0909 if (ii==0) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 25., 36.); }
0910 if (ii==1) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 31., 42.); }
0911 if (ii==2) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 33., 44.); }
0912 }
0913 }
0914 else if (beamEne==50) {
0915 if (!simul){
0916 if (ii==0) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 0., 60.); }
0917 if (ii==1 || ii==2) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 0., 60.); }
0918 }
0919 if (simul){
0920
0921 if (ii==0) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 26., 43.); }
0922 if (ii==1) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 42., 50.); }
0923 if (ii==2) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 45., 52.); }
0924
0925
0926
0927
0928 }
0929 }
0930 else if (beamEne==80) {
0931 if (!simul){
0932 if (ii==0) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 0., 90.); }
0933 if (ii==1) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 0., 90.); }
0934 if (ii==2) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 0., 90.); }
0935 }
0936 if (simul){
0937 if (ii==0) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 50., 70.); }
0938 if (ii==1) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 65., 85.); }
0939 if (ii==2) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 68., 88.); }
0940 }
0941 }
0942 else if (beamEne==100){
0943 if (simul){
0944 if (ii==0) { H_eMatrix[ii][myXib] = new TH1F(name, title, 60, 60., 90.); }
0945 if (ii==1) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 80., 105.); }
0946 if (ii==2) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 90., 110.); }
0947 }
0948 }
0949 else if (beamEne==120){
0950 if (!simul){
0951
0952
0953
0954 if (ii==0) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 85., 100.); }
0955 if (ii==1) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 90., 120.); }
0956
0957 if (ii==2) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 100., 130.); }
0958 }
0959 if (simul){
0960
0961 if (ii==0) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 85., 110.); }
0962 if (ii==1) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 106., 126.); }
0963 if (ii==2) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 110., 130.); }
0964
0965
0966
0967
0968 }
0969 }
0970 else if (beamEne==150){
0971 if (!simul){
0972 if (ii==0) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 110., 130.); }
0973 if (ii==1) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 130., 160.); }
0974 if (ii==2) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 140., 160.); }
0975 }
0976 if (simul){
0977
0978 if (ii==0) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 110., 130.); }
0979 if (ii==1) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 130., 160.); }
0980 if (ii==2) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 140., 160.); }
0981 }
0982 }
0983 else if (beamEne==500){
0984 if (simul){
0985
0986
0987
0988
0989 if (ii==0) { H_eMatrix[ii][myXib] = new TH1F(name, title, 100, 380., 440.); }
0990 if (ii==1) { H_eMatrix[ii][myXib] = new TH1F(name, title, 101, 440., 500.); }
0991 if (ii==2) { H_eMatrix[ii][myXib] = new TH1F(name, title, 101, 440., 520.); }
0992 }
0993 }
0994 H_eMatrix[ii][myXib] -> GetXaxis()->SetTitle(titleXax);
0995 }
0996
0997 for (int ii=0; ii<3; ii++){
0998 sprintf (name, "H_eRatio[%d][%d]", ii, myXib);
0999 if(ii==0){ sprintf(title, "E1/E9"); sprintf(titleXax, "E1/E9"); H_eRatio[ii][myXib] = new TH1F(name, title, 80, 0.80, 0.88); }
1000 if(ii==1){ sprintf(title, "E1/E25"); sprintf(titleXax, "E1/E25"); H_eRatio[ii][myXib] = new TH1F(name, title, 80, 0.75, 0.85);}
1001 if(ii==2){ sprintf(title, "E9/E25"); sprintf(titleXax, "E9/E25"); H_eRatio[ii][myXib] = new TH1F(name, title, 60, 0.94, 0.98);}
1002 H_eRatio[ii][myXib] -> GetXaxis()->SetTitle(titleXax);
1003 }
1004 }
1005
1006
1007
1008
1009
1010 for (int entry3=0; entry3<nEnt; entry3++) {
1011
1012
1013 T -> GetEntry(entry3);
1014 if (entry3%100000 == 0){ cout << "Final analysis loop: entry = " << entry3 << endl; }
1015
1016
1017 int xtalInBeam = xtalSM;
1018 int myHere = 2000;
1019 for (int myXib=0; myXib<numXinB; myXib++){ if (xtalInBeam == myXinB[myXib]){myHere = myXib;} }
1020
1021
1022 int table = tbMoving;
1023
1024
1025 int thisII = 0;
1026 for (int ii=0; ii< (numTrees-1); ii++){
1027 if ( (entry3 >= treeEntries[ii]) && (entry3 < treeEntries[ii+1]) ){ thisII = ii; }
1028 }
1029
1030
1031 bool select = selections(myHere, amplit[24], hodoQualityX, hodoQualityY, table, simul);
1032 if (!select){ continue; }
1033 good3[myHere]++;
1034
1035
1036 if(!simul){
1037 bool mcpFound = true;
1038 map<int, bool>::const_iterator mcpIt;
1039 mcpIt = badMcp.find(xtalInBeam);
1040 if (mcpIt != badMcp.end()){ mcpFound = mcpIt->second; }
1041 if (!mcpFound){ *badMcPFile << mcpIt->first << endl; continue; }
1042 }
1043
1044
1045 if ((hodoX < downx[myHere]) || (hodoX > upx[myHere])){continue;}
1046 if ((hodoY < downy[myHere]) || (hodoY > upy[myHere])){continue;}
1047
1048
1049 bool amIatBorder = atBorder(xtalInBeam);
1050 if (amIatBorder){ continue; }
1051
1052
1053 int maxAmpInMtx = maxAmplitInMatrix(amplit);
1054 if (maxAmpInMtx != 24){ wrongMaxAmp[myHere]++; continue; }
1055
1056
1057 double e1e9 = -50.;
1058 double e1e25 = -50.;
1059 double e9e25 = -50.;
1060 double e1 = ene1x1_xtal(amplit,24);
1061 double e9 = ene3x3_xtal(amplit,24);
1062 double e25 = ene5x5_xtal(amplit,24);
1063
1064 if( (e1>-20) && (e9>-20) ) { e1e9 = e1/e9; }
1065 if( (e1>-20) && (e25>-20) ){ e1e25 = e1/e25; }
1066 if( (e9>-20) && (e25>-20) ){ e9e25 = e9/e25; }
1067
1068
1069 H_eMatrix[0][myHere] -> Fill(e1);
1070 H_eMatrix[1][myHere] -> Fill(e9);
1071 H_eMatrix[2][myHere] -> Fill(e25);
1072 H_eRatio[0][myHere] -> Fill(e1e9);
1073 H_eRatio[1][myHere] -> Fill(e1e25);
1074 H_eRatio[2][myHere] -> Fill(e9e25);
1075
1076
1077 double Eieta[5] = {0};
1078 double Eiphi[5] = {0};
1079 if(beamEne!=0) {
1080 H_energyNxN[0]->Fill(e1/(1.0*beamEne));
1081 H_energyNxN[1]->Fill(e9/(1.0*beamEne));
1082 H_energyNxN[2]->Fill(e25/(1.0*beamEne));
1083 H_energyE1E9->Fill(e1/e9);
1084 H_energyE1E25->Fill(e1/e25);
1085 H_energyE9E25->Fill(e9/e25);
1086
1087 energy_ieta(amplit,Eieta);
1088 energy_iphi(amplit,Eiphi);
1089
1090 for(int ii = 0 ; ii < 5 ; ii++) {
1091 H_energyieta->Fill(-2.0+1.0*ii,Eieta[ii]/(1.0*beamEne));
1092 H_energyiphi->Fill(-2.0+1.0*ii,Eiphi[ii]/(1.0*beamEne));
1093 }
1094
1095 }
1096
1097 }
1098
1099
1100 cout << endl;
1101 cout << "End Third Analysis Loop" << endl;
1102 cout << endl;
1103
1104
1105
1106
1107 strcpy(outfile,outputDir);
1108 strcat(outfile,outputFileName);
1109 strcat(outfile,"_befFit.root");
1110 if(appendFlag==0){ file = new TFile (outfile,"RECREATE","istogrammi"); }
1111 else { file = new TFile (outfile,"UPDATE","istogrammi"); }
1112
1113 for (int ii=0; ii<3; ii++){
1114 sprintf(name, "H_energy%dx%d",2*ii+1,2*ii+1);
1115 H_energyNxN[ii]->SetTitle(name);
1116 H_energyNxN[ii]->Write(name);
1117 }
1118 H_energyE1E9->Write();
1119 H_energyE1E25->Write();
1120 H_energyE9E25->Write();
1121 H_energyieta->Write();
1122 H_energyiphi->Write();
1123
1124 for (int myXib=0; myXib<numXinB; myXib++){
1125
1126 for (int ii=0; ii<3; ii++){
1127 if(ii==0){ sprintf (name, "H_e1_x%d_ene%d", myXinB[myXib], beamEne); }
1128 if(ii==1){ sprintf (name, "H_e9_x%d_ene%d", myXinB[myXib], beamEne); }
1129 if(ii==2){ sprintf (name, "H_e25_x%d_ene%d", myXinB[myXib], beamEne); }
1130 H_eMatrix[ii][myXib] -> SetTitle(name);
1131 H_eMatrix[ii][myXib] -> Write(name);
1132 }
1133
1134 for (int ii=0; ii<3; ii++){
1135 if(ii==0){ sprintf (name, "H_e1e9_x%d_ene%d", myXinB[myXib], beamEne); }
1136 if(ii==1){ sprintf (name, "H_e1e25_x%d_ene%d", myXinB[myXib], beamEne); }
1137 if(ii==2){ sprintf (name, "H_e9e25_x%d_ene%d", myXinB[myXib], beamEne); }
1138 H_eRatio[ii][myXib] -> SetTitle(name);
1139 H_eRatio[ii][myXib] -> Write(name);
1140 }
1141 }
1142
1143 file->Close();
1144 delete file;
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158 ofstream *ResFileMatrix;
1159 if(appendFlag==0){
1160 ResFileMatrix = new ofstream(outputFileTxtMatrix,ios::out);
1161 *ResFileMatrix << "#Energy" << "\t" << "xtal" << "\t" << "eta" << "\t"
1162 << "sample" << "\t" << "entries" << "\t"
1163 << "H_mean" << "\t" << "H_rms" << "\t"
1164 << "G_mean" << "\t" << "G_mean err" << "\t"
1165 << "G_sigma" << "\t" << "G_sigma err" << endl;}
1166 else { ResFileMatrix = new ofstream(outputFileTxtMatrix,ios::app); }
1167
1168
1169
1170 for (int myXib=0; myXib<numXinB; myXib++){
1171
1172 for (int ii=0; ii<3; ii++){
1173
1174
1175 Stat_t h_entries = H_eMatrix[ii][myXib]->GetEntries();
1176 int peakBin = H_eMatrix[ii][myXib]->GetMaximumBin();
1177 double h_norm = H_eMatrix[ii][myXib]->GetMaximum();
1178 double h_rms = H_eMatrix[ii][myXib]->GetRMS();
1179 double h_mean = H_eMatrix[ii][myXib]->GetMean();
1180 double h_peak = H_eMatrix[ii][myXib]->GetBinCenter(peakBin);
1181
1182
1183
1184 TF1 *gausa = new TF1 ("gausa","[0]*exp(-1*(x-[1])*(x-[1])/2/[2]/[2])",h_peak-10*h_rms,h_peak+10*h_rms);
1185 gausa->SetParameters(h_norm,h_peak,h_rms);
1186 H_eMatrix[ii][myXib]->Fit(gausa,"","",h_peak-3*h_rms,h_peak+3*h_rms);
1187 double gausNorm = gausa->GetParameter(0);
1188 double gausMean = gausa->GetParameter(1);
1189 double gausSigma = fabs(gausa->GetParameter(2));
1190 double gausChi2 = gausa->GetChisquare()/gausa->GetNDF();
1191 if (gausChi2>100){ gausMean = h_peak; gausSigma = h_rms; }
1192
1193
1194 double myXmin = gausMean - 3.*gausSigma;
1195 double myXmax = gausMean + 2.*gausSigma;
1196
1197
1198 TF1 *cb_p = new TF1 ("cb_p",crystalball,myXmin,myXmax, 5) ;
1199 cb_p->SetParNames ("Mean","Sigma","alpha","n","Norm","Constant");
1200 cb_p->SetParameter(0, gausMean);
1201 cb_p->SetParameter(1, gausSigma);
1202 cb_p->FixParameter(3, 5.);
1203
1204
1205 cb_p->SetParameter(4, gausNorm);
1206 cb_p->SetParLimits(2, 0.1, 5.);
1207 H_eMatrix[ii][myXib]->Fit(cb_p,"lR","",myXmin,myXmax);
1208
1209 double matrix_gmean = cb_p->GetParameter(0);
1210 double matrix_gsigma = cb_p->GetParameter(1);
1211 double matrix_gmean_err = cb_p->GetParError(0);
1212 double matrix_gsigma_err = cb_p->GetParError(1);
1213
1214 delete cb_p;
1215 delete gausa;
1216
1217
1218 *ResFileMatrix << beamEne << "\t" << myXinB[myXib] << "\t" << myEinB[myXib] << "\t"
1219 << ii << "\t" << h_entries << "\t"
1220 << h_mean << "\t" << h_rms << "\t"
1221 << matrix_gmean << "\t" << matrix_gmean_err << "\t"
1222 << matrix_gsigma << "\t" << matrix_gsigma_err << endl;
1223 }
1224 }
1225
1226
1227
1228 ofstream *ResFileRatio;
1229 if(appendFlag==0){
1230 ResFileRatio = new ofstream(outputFileTxtRatio,ios::out);
1231 *ResFileRatio << "#Ene" << "\t" << "xtal" << "\t" << "eta" << "\t"
1232 << "sample" << "\t" << "entries" << "\t"
1233 << "H_mean" << "\t" << "H_rms" << "\t"
1234 << "G_mean" << "\t" << "G_mean err" << "\t"
1235 << "G_sigma" << "\t" << "G_sigma err" << endl;}
1236 else { ResFileRatio = new ofstream(outputFileTxtRatio,ios::app); }
1237
1238
1239 for (int myXib=0; myXib<numXinB; myXib++){
1240 for (int ii=0; ii<3; ii++){
1241
1242
1243 Stat_t h_entries = H_eRatio[ii][myXib]->GetEntries();
1244 int peakBin = H_eRatio[ii][myXib]->GetMaximumBin();
1245 double h_norm = H_eRatio[ii][myXib]->GetMaximum();
1246 double h_rms = H_eRatio[ii][myXib]->GetRMS();
1247 double h_mean = H_eRatio[ii][myXib]->GetMean();
1248 double h_peak = H_eRatio[ii][myXib]->GetBinCenter(peakBin);
1249
1250
1251 TF1 *gausa = new TF1 ("gausa","[0]*exp(-1*(x-[1])*(x-[1])/2/[2]/[2])",h_peak-10*h_rms,h_peak+10*h_rms);
1252 gausa->SetParameters(h_norm,h_peak,h_rms);
1253 H_eRatio[ii][myXib]->Fit(gausa,"","",h_peak-3*h_rms,h_peak+3*h_rms);
1254 double gausNorm = gausa->GetParameter(0);
1255 double gausMean = gausa->GetParameter(1);
1256 double gausSigma = fabs(gausa->GetParameter(2));
1257 double gausChi2 = gausa->GetChisquare()/gausa->GetNDF();
1258 if (gausChi2>100){ gausMean = h_peak; gausSigma = h_rms; }
1259
1260
1261 double myXmin = gausMean - 3.*gausSigma;
1262 double myXmax = gausMean + 2.*gausSigma;
1263
1264
1265 TF1 *cb_p = new TF1 ("cb_p",crystalball,myXmin,myXmax, 5) ;
1266 cb_p->SetParNames ("Mean","Sigma","alpha","n","Norm","Constant");
1267 cb_p->SetParameter(0, gausMean);
1268 cb_p->SetParameter(1, gausSigma);
1269 cb_p->FixParameter(3, 5.);
1270 cb_p->SetParameter(4, gausNorm);
1271 cb_p->SetParLimits(2, 0.1, 5.);
1272 H_eRatio[ii][myXib]->Fit(cb_p,"lR","",myXmin,myXmax);
1273
1274 double ratio_gmean = cb_p->GetParameter(0);
1275 double ratio_gsigma = cb_p->GetParameter(1);
1276 double ratio_gmean_err = cb_p->GetParError(0);
1277 double ratio_gsigma_err = cb_p->GetParError(1);
1278
1279 delete cb_p;
1280 delete gausa;
1281
1282
1283
1284 *ResFileRatio << beamEne << "\t" << myXinB[myXib] << "\t" << myEinB[myXib] << "\t"
1285 << ii << "\t" << h_entries << "\t"
1286 << h_mean << "\t" << h_rms << "\t"
1287 << ratio_gmean << "\t" << ratio_gmean_err << "\t"
1288 << ratio_gsigma << "\t" << ratio_gsigma_err << endl;
1289 }
1290 }
1291
1292
1293
1294
1295 strcpy(outfile,outputDir);
1296 strcat(outfile,outputFileName);
1297 strcat(outfile,"_aftFit.root");
1298 if(appendFlag==0){ file = new TFile (outfile,"RECREATE","istogrammi"); }
1299 else { file = new TFile (outfile,"UPDATE","istogrammi"); }
1300 for (int myXib=0; myXib<numXinB; myXib++){
1301
1302 for (int ii=0; ii<3; ii++){
1303 if(ii==0){ sprintf (name, "H_e1_x[%d]", myXinB[myXib]); }
1304 if(ii==1){ sprintf (name, "H_e9_x[%d]", myXinB[myXib]); }
1305 if(ii==2){ sprintf (name, "H_e25_x[%d]", myXinB[myXib]); }
1306 H_eMatrix[ii][myXib] -> Write(name);
1307 }
1308
1309 for (int ii=0; ii<3; ii++){
1310 if(ii==0){ sprintf (name, "H_e1e9_x[%d]", myXinB[myXib]); }
1311 if(ii==1){ sprintf (name, "H_e1e25_x[%d]", myXinB[myXib]); }
1312 if(ii==2){ sprintf (name, "H_e9e25_x[%d]", myXinB[myXib]); }
1313 H_eRatio[ii][myXib] -> Write(name);
1314 }
1315 }
1316 file->Close();
1317 delete file;
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333 for (int myXib=0; myXib<numXinB; myXib++){
1334 for (int ii=0; ii<3; ii++){
1335 delete H_eMatrix[ii][myXib];
1336 delete H_eRatio[ii][myXib];
1337 }
1338 }
1339
1340
1341 cout << endl;
1342 cout << endl;
1343 cout << totalInTheRun << " total events" << endl;
1344 cout << wrongXtalInTheRun << " not existing xtal" << endl;
1345 cout << endl;
1346 for (int myXib=0; myXib<numXinB; myXib++){
1347 cout << "xtal " << myXinB[myXib] << endl;
1348 cout << movingTable[myXib] << " moving table" << endl;
1349 cout << highAmpl[myXib] << " too high amplitude" << endl;
1350 cout << negaAmpl[myXib] << " negative amplitude" << endl;
1351 cout << wrongQuality[myXib] << " bad hodoscope quality" << endl;
1352 cout << endl;
1353 cout << good0[myXib] << " good events at check loop" << endl;
1354 cout << good1[myXib] << " good events at 1st loop" << endl;
1355 cout << good2[myXib] << " good events at 2nd loop" << endl;
1356 cout << good3[myXib] << " good events at 3rd loop" << endl;
1357 cout << "after other selections: " << wrongMaxAmp[myXib] << " xib != max amplitude xtal" << endl;
1358 cout << endl;
1359 }
1360
1361 }
1362
1363
1364
1365
1366
1367
1368
1369 bool selections(int xnum, double eneCent, double qualX, double qualY, int table, int simul){
1370
1371 bool select = true;
1372 if ( xnum > 1700 ) { select = false; }
1373 if ( eneCent > 999. ) { select = false; }
1374 if ( eneCent < 0.5) { select = false; }
1375 if (!simul){
1376 if (table) { select = false; }
1377 if ((qualX>2.0) || (qualX<0.0)) { select = false; }
1378 if ((qualY>2.0) || (qualY<0.0)) { select = false; }
1379 }
1380 return select;
1381 }
1382
1383
1384
1385 bool atBorder(int xtalNum){
1386
1387 bool amIatBd = false;
1388 if ( ((xtalNum-1)/20 == 0) || ((xtalNum-1)/20 == 1) ){amIatBd = true;}
1389 if ( ((xtalNum-1)/20 == 83) || ((xtalNum-1)/20 == 84) ){amIatBd = true;}
1390 if ( ((xtalNum-1)%20 == 0) || ((xtalNum-1)%20 == 1) ){amIatBd = true;}
1391 if ( ((xtalNum-1)%20 == 18) || ((xtalNum-1)%20 == 19) ){amIatBd = true;}
1392 return amIatBd;
1393 }