/[PAMELA software]/calo/flight/FUTILITIES/macros/FCaloADC2MIP.cxx
ViewVC logotype

Contents of /calo/flight/FUTILITIES/macros/FCaloADC2MIP.cxx

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (show annotations) (download)
Thu Jan 23 11:23:56 2014 UTC (10 years, 10 months ago) by mocchiut
Branch: MAIN
CVS Tags: HEAD
Changes since 1.4: +13 -12 lines
Compilation warnings using GCC4.7 fixed

1 //
2 //- Emiliano Mocchiutti
3 //
4 // FCaloADC2MIP.c version 1.02 (2006-03-31)
5 //
6 // The only input needed is
7 //
8 // Changelog:
9 //
10 // 1.01 - 1.02 (2006-03-31): Added FCaloALIG2DAT and FCaloREADALIG to create and read the calorimeter alignment data file.
11 //
12 // 1.00 - 1.01 (2006-03-20): First flight version, read single yoda file.
13 //
14 // 0.00 - 1.00 (2006-03-20): Clone of CaloADC2MIP v4r01.
15 //
16 //
17 #include <fstream>
18 #include <sstream>
19 #include <string>
20 #include <iostream>
21 #include <stdlib.h>
22 #include <TTree.h>
23 #include <TClassEdit.h>
24 #include <TObject.h>
25 #include <TList.h>
26 #include <TSystem.h>
27 #include <TSystemDirectory.h>
28 #include <TString.h>
29 #include <TFile.h>
30 #include <TClass.h>
31 #include <TCanvas.h>
32 #include <TH1.h>
33 #include <TH1F.h>
34 #include <TH2D.h>
35 #include <TLatex.h>
36 #include <TPad.h>
37 #include <TPaveLabel.h>
38 #include <TChain.h>
39 #include <TGraph.h>
40 #include <TMultiGraph.h>
41 #include <TLine.h>
42 #include <TStyle.h>
43 #include <TF1.h>
44 //
45 #include <fcalostructs.h>
46 //
47 extern const char *pathtocalibration();
48 extern TString getFilename(const TString);
49 extern TString whatnamewith(TString, Int_t);
50 extern void stringcopy(TString&, const TString&, Int_t, Int_t);
51 extern int CaloPede(TString, Int_t, Int_t, Calib &);
52 extern void CaloFindBaseRaw(Calib &, Evento &, Int_t, Int_t, Int_t);
53 extern void CaloFindBaseRawNC(Calib &, Evento &, Int_t, Int_t, Int_t);
54 extern void CaloCompressData(Calib &, Evento &, Int_t, Int_t, Int_t);
55 extern int CaloFindCalibs(TString &, TString &, Int_t &, Calib &);
56 extern bool existfile(TString);
57 TF1 *langaufit(TH1F *, Double_t *, Double_t *, Double_t *, Double_t *, Double_t *, Double_t *, Double_t *, Int_t *, TString);
58 Double_t langaupro(Double_t *);
59 //
60 //
61 #include <PamelaRun.h>
62 #include <physics/calorimeter/CalorimeterEvent.h>
63 #include <physics/trigger/TriggerEvent.h>
64 #include <CalibCalPedEvent.h>
65 //
66 #include <caloclassesfun.h>
67 #include <FCaloADC2MIPfun.h>
68 using namespace std;
69
70 void FCaloADC2MIP(TString Filename, TString calcalibfile = "", TString OutDir="", TString flist="", Int_t fit=1){
71 const char *pam_calib = pathtocalibration();
72 if ( !strcmp(OutDir.Data(),"") ){
73 OutDir = pam_calib;
74 };
75 //
76 TString calcalib;
77 struct Evento evento;
78 struct Calib calib;
79 Int_t debug = 0;
80 Int_t b[4];
81 Int_t etime,evno;
82 Float_t sdexy[2][22][96],sdexyc[2][22][96];
83 Float_t edelta[2][22][96];
84 Float_t estrip[2][22][96];
85 Float_t estripnull[2][22][96];
86 Float_t delta;
87 delta = 1.;
88 evento.emin = 0.7;
89 Int_t UPYES = 0;
90 Int_t se =5;
91 Int_t pre;
92 Int_t rdone=0;
93 Int_t done;
94 bool isCOMP = 0;
95 bool isFULL = 0;
96 bool isRAW = 0;
97 TH1F *pfmip[2][22][96];
98 TF1 *pfitsnr[2][22][96];
99 stringstream Fmip;
100 for (Int_t i=0; i<2;i++){
101 for (Int_t j=0; j<22;j++){
102 for (Int_t m=0; m<96;m++){
103 Fmip.str("");
104 Fmip << "Fmip " << i;
105 Fmip << " " << j;
106 Fmip << " " << m;
107 pfmip[i][j][m] = new TH1F(Fmip.str().c_str(),"",56,0.,55.);
108 pfitsnr[i][j][m] = new TF1;
109 };
110 };
111 };
112 //
113 // the file which contains the calorimeter ADC to MIP conversion values is file2 = path to the script dir / CaloADC2MIP.root
114 //
115 stringstream file2;
116 file2.str("");
117 file2 << OutDir.Data() << "/CaloADC2MIP.root";
118 //
119 // this the figures and fit (4224 x 2 objects!)
120 //
121 stringstream file3;
122 file3.str("");
123 file3 << OutDir.Data() << "/CaloADC2MIPf.root";
124 //
125 stringstream file4;
126 file4.str("");
127 file4 << OutDir.Data() << "/CaloADC2MIPf";
128 //
129 stringstream file5;
130 file5.str("");
131 file5 << OutDir.Data() << "/CaloADC2MIPdata.root";
132 //
133 Int_t nfile = 0;
134 Int_t fileup = 0;
135 if ( flist != "" ){
136 printf("\n You have given an input file list \n\n Files: \n");
137 ifstream in;
138 in.open(flist, ios::in);
139 char ctime[20];
140 while (1) {
141 in >> ctime;
142 if (!in.good()) break;
143 printf(" File number %i = %s \n",nfile+1,ctime);
144 nfile++;
145 };
146 in.close();
147 if ( !nfile ) {
148 printf("\n\n The list is empty, exiting... \n\n");
149 return;
150 };
151 } else {
152 nfile = 1;
153 };
154 printf("\n");
155 //
156 // First check if the calibration file exists:
157 //
158 Int_t EFILE = 0;
159 printf(" Check the existence of CaloADC2MIP.root file: \n\n");
160 if ( !existfile(file2.str().c_str()) ){
161 printf(" %s :no such file or directory \n",file2.str().c_str());
162 printf("\n OK, I will create it!\n\n");
163 EFILE = 0;
164 } else {
165 printf(" The file already exists! Check if an update is needed \n\n");
166 EFILE = 1;
167 };
168 //
169 // the check for an update is done once even if we have a list.
170 //
171 TTree *tree;
172 CalorimeterCalibration *calo = new CalorimeterCalibration();
173 if ( EFILE == 1) {
174 //
175 // The file exists, open it (READ ONLY) and check if any update is needed:
176 //
177 TFile *hfile = 0;
178 hfile = new TFile(file2.str().c_str(),"READ","Calorimeter CALIBRATION data");
179 tree = (TTree*)hfile->Get("CaloADC");
180 calo = new CalorimeterCalibration();
181 tree->SetBranchAddress("Event", &calo);
182 //
183 Long64_t nevents = tree->GetEntries();
184 printf("\n Number of updates: %i\n",(int)nevents);
185 tree->GetEntry(nevents-1);
186 //
187 // Read the status variable of the last event: if it is 0 then we need an update, if it is one print out informations and exit
188 //
189 if ( calo->status == 0 ) {
190 printf("\n An update is needed: \n");
191 Int_t upstrip = 0;
192 for (Int_t i = 0; i<2; i++){
193 for (Int_t j = 0; j<22; j++){
194 for (Int_t l = 0; l<96; l++){
195 if ( calo->mask[i][j][l] == 0. ) upstrip++;
196 };
197 };
198 };
199 printf(" %i strip out of 4224 have no statistic enough.\n\n",upstrip);
200 } else {
201 printf(" No update is needed! \n The data files used to obtain the ADC to MIP conversion are: \n");
202 for (Int_t i = 0; i<nevents; i++){
203 tree->GetEntry(i);
204 const char *fout = calo->fname;
205 printf(" - %s \n",fout);
206 };
207 printf("\n\n");
208 return;
209 };
210 hfile->Close();
211 };
212 //
213 const char *filename2 = Filename;
214 //
215 TString lfile;
216 TString sfile;
217 //
218 Int_t e = 0;
219 ifstream in;
220 in.open(flist, ios::in);
221 char ctime[20];
222 TString file2f;
223 TString pfile;
224 const char *cali;
225 const char *ffile;
226 Int_t calibex = 0;
227 //
228 TString filename;
229 const char *nome;
230 TFile *hfile = 0;
231 calo = new CalorimeterCalibration();
232 Long64_t nevents;
233 Int_t used = 0;
234 const char *compare;
235 Int_t hf3 = 0;
236 Int_t ufile = 0;
237 TFile *headerFile = 0;
238 file2f = "";
239 pfile = "";
240 stringstream fmippa;
241 const char *porca;
242 Int_t S4;
243 Int_t upnn;
244 Int_t notgood = 0;
245 Int_t notgood1 = 0;
246 stringstream files;
247 TFile *hfileb = 0;
248 //
249 Int_t pl1, pl2, strmin, strmax;
250 Int_t spre=0;
251 Int_t surstrip = 0;
252 Float_t estrippa = 0.;
253 Int_t surmam = 0;
254 Int_t surman = 0;
255 Int_t surmatrix[3][3];
256 //
257 TString fififile;
258 const char *file;
259 //
260 stringstream nofi;
261 nofi.str("");
262 TFile *hfile3 = 0;
263 //
264 while ( e < nfile ){
265 if ( flist != "" ){
266 in >> ctime;
267 nofi.str("");
268 nofi << filename2 << "/";
269 nofi << ctime;
270 lfile = TString(nofi.str().c_str());
271 fififile = getFilename(lfile);
272 file = fififile;
273 nofi.str("");
274 nofi << file;
275 sfile = TString(nofi.str().c_str());
276 } else {
277 nofi.str("");
278 nofi << filename2;
279 lfile = TString(nofi.str().c_str());
280 fififile = getFilename(lfile);
281 file = fififile;
282 nofi.str("");
283 nofi << file;
284 sfile = TString(nofi.str().c_str());
285 };
286 //
287 filename = lfile;
288 nome = filename;
289 printf("\n Processing file number %i: %s \n\n",e,nome);
290 nome = sfile;
291 //
292 // this must be done for each file.
293 //
294 const char *calname;
295 calname = "";
296 Int_t wused = 0;
297 TTree *otr;
298 pamela::calorimeter::CalorimeterEvent *de = 0;
299 pamela::trigger::TriggerEvent *trigger = 0;
300 pamela::PscuHeader *ph = 0;
301 pamela::EventHeader *eh = 0;
302 //
303 if ( EFILE == 1 ){
304 hfile = new TFile(file2.str().c_str(),"UPDATE","Calorimeter CALIBRATION data");
305 tree = (TTree*)hfile->Get("CaloADC");
306 calo = new CalorimeterCalibration();
307 tree->SetBranchAddress("Event", &calo);
308 //
309 // Check if the input file has already been used
310 //
311 printf(" Check if file %s has already been used... \n",nome);
312 nevents = tree->GetEntries();
313 used = 0;
314 for (Int_t i = 0; i<nevents; i++){
315 tree->GetEntry(i);
316 compare= calo->fname;
317 if ( !strcmp(compare,nome) ) {
318 used = 1;
319 break;
320 };
321 };
322 if ( used ) {
323 printf(" The file %s has already been used!\n You cannot run twice this program with that file!\n\n",nome);
324 hfile->Close();
325 goto jumpfile;
326 } else {
327 printf(" Good, the file has not been used yet. \n\n");
328 nevents = tree->GetEntries() -1;
329 tree->GetEntry(nevents);
330 };
331 } else {
332 //
333 // If the file doesn't exist create it
334 //
335 calo = new CalorimeterCalibration();
336 hfile = new TFile(file2.str().c_str(),"NEW","Calorimeter CALIBRATION data");
337 if ( !existfile(file2.str().c_str()) ){
338 printf(" %s :no such file or directory \n",filename.Data());
339 printf(" ERROR: Cannot create file \n");
340 return;
341 };
342 // if ( hfile->IsZombie() ){
343 // printf(" ERROR: Cannot create file \n");
344 // return;
345 //};
346 tree = new TTree("CaloADC","Calorimeter calibration data");
347 tree->Branch("Event","CalorimeterCalibration",&calo);
348 };
349 //
350 //
351 //
352 hf3 = 0;
353 if ( e == 0 ){
354 if ( !existfile(file3.str().c_str()) ){
355 ufile = 0;
356 } else {
357 printf(" Update figures file! \n\n");
358 ufile = 1;
359 };
360 };
361 if ( (EFILE == 1 || ufile == 1) && e == 0 ){
362 printf(" Reading the old MIP figures to be updated...\n ");
363 hfile3 = new TFile(file3.str().c_str());
364 hf3 = 1;
365 //
366 stringstream fmino;
367 fmino.str("");
368 for (Int_t l = 0; l < 2; l++){
369 for (Int_t m = 0; m < 22; m++){
370 for (Int_t n =0 ; n < 96; n++){
371 fmino.str("");
372 fmino << "fmip " << l;
373 fmino << " " << m;
374 fmino << " " << n;
375 gDirectory->Delete(fmino.str().c_str());
376 TH1F *temp = (TH1F*)hfile3->Get(fmino.str().c_str());
377 pfmip[l][m][n] = (TH1F*)temp->Clone();
378 };
379 };
380 };
381 printf(" ...done!\n");
382 };
383 EFILE = 1;
384 //
385 // Check if the input calibration file contains any calibration data
386 //
387 done = 0;
388 printf(" Check for calorimeter calibration: \n");
389 calcalib = filename;
390 findcalibs: printf(" Calibration file: %s \n",calname);
391 calname = calcalib;
392 for (Int_t s=0; s<4;s++){
393 for (Int_t d = 0; d<50; d++){
394 calib.ttime[s][d] = 0 ;
395 if ( d < 49 ) calib.time[s][d] = 0 ;
396 };
397 };
398 for (Int_t m = 0; m < 2 ; m++ ){
399 for (Int_t k = 0; k < 22; k++ ){
400 for (Int_t l = 0; l < 96; l++ ){
401 calib.calped[m][k][l] = 0. ;
402 evento.dexy[m][k][l] = 0. ;
403 evento.dexyc[m][k][l] = 0. ;
404 edelta[m][k][l] = 0.;
405 estrip[m][k][l] = 0.;
406 estripnull[m][k][l] = 0.;
407 };
408 };
409 }
410 wused = 0;
411 CaloFindCalibs(calcalib, calcalib, wused, calib);
412 //
413 // print on the screen the results:
414 //
415 ffile = filename;
416 printf(" ------ %s ------- \n \n",ffile);
417 calibex = 0;
418 for (Int_t s=0; s<4;s++){
419 printf(" ** SECTION %i **\n",s);
420 for (Int_t d = 0; d<51; d++){
421 if ( calib.ttime[s][d] != 0 ) {
422 calibex++;
423 if ( calib.fcode[s][d] != 10 ){
424 file2f = "";
425 stringcopy(file2f,calcalib,0,0);
426 pfile = (TString)whatnamewith(file2f,calib.fcode[s][d]);
427 } else {
428 pfile = (TString)calcalib;
429 };
430 ffile = pfile;
431 printf(" - from time %i to time %i use calibration at\n time %i, file: %s \n",calib.time[s][d],calib.time[s][d+1],calib.ttime[s][d],ffile);
432 };
433 };
434 printf("\n");
435 };
436 printf(" ----------------------------------------------------------------------- \n \n");
437 //
438 if ( calibex < 1 ) {
439 printf("No calibration data in this file!\n");
440 calcalib = calcalibfile;
441 if ( !done && calcalibfile != "" ) {
442 cali = calcalibfile;
443 printf(" Search in the calibration file %s \n",cali);
444 done = 1;
445 goto findcalibs;
446 } else {
447 printf(" Cannot find any calibration for this file! \n");
448 goto jumpfile;
449 };
450 };
451 if ( calibex < 4 ) {
452 printf(" WARNING! No full calibration data in this file! \n\n");
453 };
454 //
455 // upgrade data...
456 //
457 if ( !existfile(filename) ){
458 printf(" %s :no such file or directory \n",filename.Data());
459 goto jumpfile;
460 };
461 headerFile = new TFile(filename.Data());
462 otr = (TTree*)headerFile->Get("Physics");
463 otr->SetBranchAddress("Header", &eh);
464 otr->SetBranchAddress("Calorimeter", &de);
465 otr->SetBranchAddress("Trigger", &trigger);
466 //
467 nevents = otr->GetEntries();
468 //
469 // calibrate before starting
470 //
471 for (Int_t s = 0; s < 4; s++){
472 b[s]=0;
473 if ( calib.fcode[s][b[s]] != 10 ){
474 stringcopy(file2f,calcalib,0,0);
475 pfile = (TString)whatnamewith(file2f,calib.fcode[s][b[s]]);
476 } else {
477 pfile = (TString)calcalib;
478 };
479 porca = pfile;
480 if ( debug ) printf(" porca miseria %s \n",porca);
481 CaloPede(pfile,s,calib.ttime[s][b[s]],calib);
482 };
483 //
484 // run over all the events
485 //
486 printf("\n Processed events: \n\n");
487 //
488 for (Int_t i = 0; i < nevents; i++){
489 evno = i;
490 if ( i%100000 == 0 && i > 0 ) printf(" %i00K \n",i/100000);
491 // printf(" %i \n",i);
492 //
493 // read from the header of the event the absolute time at which it was recorded
494 //
495 otr->GetEntry(i);
496 //
497 S4 = trigger->patterntrig[1] & (1<<0);
498 //
499 if ( !S4 || i == 0 ) {
500 ph = eh->GetPscuHeader();
501 etime = ph->GetOrbitalTime();
502 //
503 // for each event check that the calibration we are using are still within calibration limits, if not call the next calibration
504 //
505 if ( !calib.obtjump ) {
506 for (Int_t s = 0; s < 4; s++){
507 if ( calib.ttime[s][b[s]] ){
508 while ( etime > calib.time[s][b[s]+1] ){
509 printf(" CALORIMETER: \n" );
510 printf(" - Section %i, event at time %i while old calibration time limit at %i. Use new calibration at time %i -\n",s,etime,calib.time[s][b[s]+1],calib.ttime[s][b[s]+1]);
511 printf(" END CALORIMETER. \n\n" );
512 b[s]++;
513 if ( calib.fcode[s][b[s]] != 10 ){
514 stringcopy(file2f,calcalib,0,0);
515 pfile = (TString)whatnamewith(file2f,calib.fcode[s][b[s]]);
516 } else {
517 pfile = (TString)calcalib;
518 };
519 porca = pfile;
520 if ( debug ) printf(" porca miseria %s \n",porca);
521 CaloPede(pfile,s,calib.ttime[s][b[s]],calib);
522 };
523 };
524 };
525 };
526 //
527 // do whatever you want with data
528 //
529 evento.iev = de->iev;
530 //
531 // run over views and planes
532 //
533 for (Int_t l = 0; l < 2; l++){
534 for (Int_t m = 0; m < 22; m++){
535 //
536 // determine the section number
537 //
538 if (l == 0 && m%2 == 0) se = 3;
539 if (l == 0 && m%2 != 0) se = 2;
540 if (l == 1 && m%2 == 0) se = 0;
541 if (l == 1 && m%2 != 0) se = 1;
542 //
543 // determine what kind of event we are going to analyze
544 //
545 isCOMP = 0;
546 isFULL = 0;
547 isRAW = 0;
548 if ( de->stwerr[se] & (1 << 16) ) isCOMP = 1;
549 if ( de->stwerr[se] & (1 << 17) ) isFULL = 1;
550 if ( de->stwerr[se] & (1 << 3) ) isRAW = 1;
551 //
552 // save the prevoius energy deposit and calibration in sbase, sdexy, sdexyc
553 //
554 pre = -1;
555 if ( isRAW ){
556 for (Int_t nn = 0; nn < 96; nn++){
557 if ( nn%16 == 0 ) pre++;
558 evento.base[l][m][pre] = calib.calbase[l][m][pre];
559 sdexy[l][m][nn] = evento.dexy[l][m][nn];
560 evento.dexy[l][m][nn] = de->dexy[l][m][nn] ;
561 sdexyc[l][m][nn] = evento.dexyc[l][m][nn];
562 evento.dexyc[l][m][nn] = de->dexyc[l][m][nn] ;
563 };
564 };
565 //
566 // run over strips
567 //
568 pre = -1;
569 for (Int_t n =0 ; n < 96; n++){
570 if ( n%16 == 0 ) {
571 pre++;
572 rdone = 0;
573 done = 0;
574 };
575 if ( calo->mask[l][m][n] == 0. && ( isRAW || ( de->dexyc[l][m][n] > 0. && de->dexyc[l][m][n] < 32000.)) ){
576 //
577 // baseline check and calculation
578 //
579 if ( isRAW ) {
580 if ( !rdone ){
581 CaloFindBaseRaw(calib,evento,l,m,pre);
582 rdone = 1;
583 };
584 } else {
585 if ( !done ){
586 evento.base[l][m][pre] = de->base[l][m][pre] ;
587 evento.dexyc[l][m][n] = de->dexyc[l][m][n] ;
588 };
589 };
590 //
591 // no suitable new baseline, use old ones and compress data!
592 //
593 if ( !done && (evento.base[l][m][pre] > 30000. || evento.base[l][m][pre] == 0.) ){
594 evento.base[l][m][pre] = calib.sbase[l][m][pre];
595 upnn = n+16;
596 if ( upnn > 96 ) upnn = 96;
597 for ( Int_t nn = n; nn<upnn; nn++ ){
598 evento.dexyc[l][m][nn] = de->dexyc[l][m][nn] ;
599 };
600 CaloCompressData(calib,evento,l,m,pre);
601 done = 1;
602 };
603 //
604 // CALIBRATION ALGORITHM
605 //
606 pl1 = -1;
607 pl2 = -1;
608 pl1 = m - 1;
609 pl2 = m + 1;
610 if ( pl1 < 0 ) {
611 pl1 = pl2;
612 pl2 = m + 2;
613 };
614 if ( pl2 > 21 ) {
615 pl2 = pl1;
616 pl1 = m - 2;
617 };
618 strmin = n - 1;
619 if ( strmin < 0 ) strmin = 0;
620 strmax = n + 1;
621 if ( strmax > 95 ) strmax = 95;
622 surstrip = 0;
623 surmam = 0;
624 surman = 0;
625 for (Int_t im = 0; im<3 ;im++){
626 for (Int_t jm = 0; jm<3 ;jm++){
627 surmatrix[im][jm] = 0;
628 };
629 };
630 for (Int_t spl = pl1; spl<pl2+1; spl++){
631 if ( spl != m ){
632 surmam = spl - pl1;
633 for (Int_t sst = strmin; sst <= strmax ; sst++){
634 surman = sst - strmin;
635 if ( sst < 16 ) spre = 0;
636 if ( 15 < sst && sst < 32 ) spre = 1;
637 if ( 31 < sst && sst < 48 ) spre = 2;
638 if ( 47 < sst && sst < 64 ) spre = 3;
639 if ( 63 < sst && sst < 80 ) spre = 4;
640 if ( 79 < sst ) spre = 5;
641 if ( isRAW ){
642 estrippa = ( evento.dexy[l][spl][sst] - calib.calped[l][spl][sst] - calib.sbase[l][spl][spre])/26. ;
643 } else {
644 estrippa = ( evento.dexyc[l][spl][sst] - calib.calped[l][spl][sst] - calib.sbase[l][spl][spre])/26. ;
645 };
646 if ( estrippa > 0.7 && estrippa < 10. && calib.calgood[l][spl][sst] == 0 ){
647 surstrip++;
648 surmatrix[surmam][surman]++;
649 //printf("surstrip = %i estrip = %f \n",surstrip,estrip);
650 };
651 };
652 };
653 };
654 if ( (surmatrix[0][0] && surmatrix[2][0]) ) surstrip = 0;
655 if ( (surmatrix[0][2] && surmatrix[2][2]) ) surstrip = 0;
656 //
657 //
658 estrip[l][m][n] = ( evento.dexyc[l][m][n] - calib.calped[l][m][n] - evento.base[l][m][pre]) ;
659 if ( estrip[l][m][n] >= 0. && estrip[l][m][n] <= 56. && surstrip >=2 ){
660 pfmip[l][m][n]->Fill(estrip[l][m][n]);
661 UPYES = 1;
662 };
663 calib.sbase[l][m][pre] = evento.base[l][m][pre];
664 };
665 };
666 };
667 };
668 };
669 };
670 //
671 // save filename
672 //
673 calo->fname = sfile;
674 tree->Fill();
675 hfile->Write();
676 fileup++;
677 hfile->Close();
678 //
679 // create a backup copy!
680 //
681
682 if ( nfile > 1 && ( e%10 == 0 || e == nfile-1 ) && e > 0 ){
683 files.str("");
684 files << file4.str().c_str() << (e+1);
685 files << ".bak";
686 printf(" Save the backup file with figures:\n %s \n ",files.str().c_str());
687 hfileb = new TFile(files.str().c_str(),"RECREATE","Calorimeter CALIBRATION figures");
688 if ( !existfile(files.str().c_str()) ){
689 printf(" ERROR: Cannot create file!!! \n");
690 goto oltre;
691 };
692 TH1F *bfmip[2][22][96];
693 stringstream bmippa;
694 bmippa.str("");
695 for (Int_t l = 0; l < 2; l++){
696 for (Int_t m = 0; m < 22; m++){
697 for (Int_t n =0 ; n < 96; n++){
698 bmippa.str("");
699 bmippa << "bmip " << l;
700 bmippa << " " << m;
701 bmippa << " " << n;
702 bfmip[l][m][n] = new TH1F(bmippa.str().c_str(),"",56,0.,55.);
703 bfmip[l][m][n] = (TH1F*)pfmip[l][m][n]->Clone(bmippa.str().c_str());
704 bfmip[l][m][n]->Write();
705 };
706 };
707 };
708 hfileb->Close();
709 };
710 //
711 //
712 //
713 headerFile->Close();
714 // caloFile->Close();
715 //triggerFile->Close();
716 goto oltre;
717 jumpfile: printf(" File not processed! \n ");
718 hfile->Close();
719 oltre:
720 // gObjectTable->Print();
721 e++;
722 };
723 //
724 if ( !fit ) UPYES=0;
725 //
726 if ( !UPYES ) goto end;
727 printf("\n OK, now I will fit the MIP distribution for each strip \n\n");
728 //
729 hfile = new TFile(file2.str().c_str(),"UPDATE","Calorimeter CALIBRATION data");
730 calo = new CalorimeterCalibration();
731 tree = (TTree*)hfile->Get("CaloADC");
732 tree->SetBranchAddress("Event", &calo);
733 nevents = tree->GetEntries();
734 if ( (nevents-1-fileup) > 0 ){
735 tree->GetEntry(nevents-1-fileup);
736 };
737 //
738 // Fit all 4224 distributions and save parameters, fit, figures (all basically).
739 //
740 notgood = 0;
741 notgood1 = 0;
742 //
743 //
744 for (Int_t l = 0; l < 2; l++){
745 for (Int_t m = 0; m < 22; m++){
746 for (Int_t n =0 ; n < 96; n++){
747 Double_t SNRPeak = 0.;
748 if ( calo->mask[l][m][n] == 0. ){
749 //
750 // Setting fit range and start values
751 //
752 Double_t fr[2];
753 Double_t sv[4], pllo[4], plhi[4], fp[4], fpe[4];
754 // if ( SNRPeak > 16. && SNRPeak < 35. ){
755 if ( SNRPeak > 16. && SNRPeak < 35. && fp[3] < 8.){
756 fr[0] = (Float_t)SNRPeak - 7.;
757 sv[0]= fp[0];
758 sv[1]= fp[1];
759 sv[2]= fp[2];
760 sv[3]= fp[3];
761 } else {
762 // fr[0] = 19.;
763 fr[0] = 17.5;
764 sv[0] = 2.8;
765 // sv[1] = 21.0;
766 sv[1] = 23.0;
767 sv[2] = 1000.0;
768 sv[3] = 0.1;
769 };
770 Int_t doitagain = 0;
771 fitting: printf("Fitting strip %i %i %i \n",l,m,n);
772 // fr[1] = 60.;
773 fr[1] = 50.;
774 pllo[0]=0.5; pllo[1]=5.0; pllo[2]=1.0; pllo[3]=0.2;
775 // plhi[0]=8.0; plhi[1]=50.0; plhi[2]=1000000.0; plhi[3]=8.0;
776 plhi[0]=15.0; plhi[1]=50.0; plhi[2]=1000000.0; plhi[3]=8.0;
777 Double_t chisqr;
778 Int_t ndf;
779 //
780 // fit the figure pfmip and put fit results in pfitsnr
781 //
782 pfitsnr[l][m][n] = langaufit(pfmip[l][m][n],fr,sv,pllo,plhi,fp,fpe,&chisqr,&ndf,"QR0");
783 //
784 // search for the maximum of the distribution, it will be the conversion factor between ADC channels and the MIP
785 //
786 Double_t SNRPeak = langaupro(fp);
787 printf("\n Conversion factor: %f \n\n",SNRPeak);
788 //
789 //
790 //
791 // if ( ( SNRPeak < 0. || (SNRPeak < 16. || SNRPeak > 35.) || chisqr > 100.) && doitagain < 3 ){
792 if ( ( SNRPeak < 0. || (SNRPeak < 16. || SNRPeak > 35.) || chisqr > 100.) && doitagain < 4 ){
793 printf("\n The fit is not good, I will try again, step %i \n\n",doitagain);
794 doitagain++;
795 if ( chisqr > 100. ) {
796 // fr[0] = fr[0] + 5.;
797 fr[0] = fr[0] + 2.;
798 sv[0] = fp[0];
799 sv[1] = fp[1];
800 sv[2] = fp[2];
801 sv[3] = fp[3];
802 goto fitting;
803 };
804 if ( doitagain == 2 ) {
805 fr[0] = 19.;
806 sv[0] = 2.8;
807 sv[1] = 21.0;
808 sv[2] = 1000.0;
809 sv[3] = 0.1;
810 goto fitting;
811 };
812 if ( doitagain == 1 ) {
813 fr[0] = 22.;
814 sv[0] = 2.8;
815 sv[1] = 25.0;
816 sv[2] = 1000.0;
817 sv[3] = 0.1;
818 goto fitting;
819 };
820 if ( doitagain == 3 ) {
821 fr[0] = 12.;
822 sv[0] = 2.8;
823 sv[1] = 15.0;
824 sv[2] = 1000.0;
825 sv[3] = 0.1;
826 goto fitting;
827 };
828 };
829
830 //
831 // save data
832 //
833 calo->mip[l][m][n] = (float)SNRPeak;
834 calo->ermip[l][m][n] = (float)fpe[1];
835 for (Int_t a = 0; a < 4 ; a++){
836 calo->fp[a][l][m][n] = (float)fp[a];
837 calo->fpe[a][l][m][n] = (float)fpe[a];
838 };
839 calo->ndf[l][m][n] = (float)ndf;
840 calo->chi2[l][m][n] = (float)chisqr;
841 if ( calo->fp[1][l][m][n] > 16. && calo->fp[1][l][m][n] < 35. ) notgood1++;
842 //
843 if ( ndf!=0 && chisqr/ndf < 2. && fpe[1] < 0.15 && fp[1] > 15. && fp[1] < 40. && SNRPeak > 0. ) {
844 printf(" THIS IS A GOOD FIT, SAVED! \n\n");
845 calo->mask[l][m][n] = 1.;
846 } else {
847 notgood++;
848 calo->mask[l][m][n] = 0.;
849 };
850 printf("Fitting done, strip %i %i %i \n\n\n",l,m,n);
851 //
852 // draw the figure and fit on the screen
853 //
854 //c1->Clear();
855 //c1->cd();
856 //pfmip[l][m][n]->DrawCopy();
857 //pfitsnr[l][m][n]->DrawCopy("lsame");
858 //c1->Modified();
859 //c1->Update();
860 };
861 };
862 };
863 };
864 //
865 calo->status = 0;
866 if ( !notgood ) calo->status = 1;
867 //
868 // save fit data
869 //
870 tree->Fill();
871 hfile->Write();
872 hfile->Close();
873 //
874 // Save histograms and fit figures
875 //
876 TFile *hfile2;
877 hfile2 = new TFile(file3.str().c_str(),"RECREATE","Calorimeter CALIBRATION figures");
878 if ( !existfile(file3.str().c_str()) ){
879 printf(" ERROR: Cannot create file \n");
880 return;
881 };
882 TH1F *sfmip[2][22][96];
883 TF1 *sfitsnr[2][22][96];
884 fmippa.str("");
885 for (Int_t l = 0; l < 2; l++){
886 for (Int_t m = 0; m < 22; m++){
887 for (Int_t n =0 ; n < 96; n++){
888 fmippa.str("");
889 fmippa << "fmip " << l;
890 fmippa << " " << m;
891 fmippa << " " << n;
892 sfmip[l][m][n] = new TH1F(fmippa.str().c_str(),"",56,0.,55.);
893 sfmip[l][m][n] = (TH1F*)pfmip[l][m][n]->Clone(fmippa.str().c_str());
894 fmippa.str("");
895 fmippa << "fit " << l;
896 fmippa << " " << m;
897 fmippa << " " << n;
898 sfitsnr[l][m][n] = (TF1*)pfitsnr[l][m][n]->Clone(fmippa.str().c_str());
899 sfmip[l][m][n]->Write();
900 sfitsnr[l][m][n]->Write();
901 };
902 };
903 };
904 hfile2->Close();
905 if ( hf3 ) hfile3->Close();
906 //
907 if ( notgood ) {
908 printf("\n An update will be necessary:\n %i strip with too low statistic (%i of them gave a result anyway)\n\n",notgood,notgood1);
909 };
910 //
911 end: printf("\n");
912 //
913 }
914
915 void FCaloRAWADC2MIPPLOT(TString Filename, TString calcalibfile = "", TString OutDir="", TString flist=""){
916 const char *pam_calib = pathtocalibration();
917 if ( !strcmp(OutDir.Data(),"") ){
918 OutDir = pam_calib;
919 };
920 //
921 TString calcalib;
922 struct Evento evento;
923 struct Calib calib;
924 Int_t debug = 0;
925 Int_t b[4];
926 Int_t etime,evno;
927 Float_t sdexy[2][22][96],sdexyc[2][22][96];
928 Float_t edelta[2][22][96];
929 Float_t estrip[2][22][96];
930 Float_t estripnull[2][22][96];
931 Float_t delta;
932 CalorimeterCalibration *calo = new CalorimeterCalibration();
933 delta = 1.;
934 evento.emin = 0.7;
935 Int_t se =5;
936 Int_t pre;
937 Int_t rdone = 0;
938 Int_t done;
939 bool isCOMP = 0;
940 bool isFULL = 0;
941 bool isRAW = 0;
942 TH1F *pfmip[2][22][96];
943 TF1 *pfitsnr[2][22][96];
944 stringstream Fmip;
945 Fmip.str("");
946 for (Int_t i=0; i<2;i++){
947 for (Int_t j=0; j<22;j++){
948 for (Int_t m=0; m<96;m++){
949 Fmip.str("");
950 Fmip << "Fmip " << i;
951 Fmip << " " << j;
952 Fmip << " " << m;
953 pfmip[i][j][m] = new TH1F(Fmip.str().c_str(),"",70,-15.,55.);
954 pfitsnr[i][j][m] = new TF1;
955 };
956 };
957 };
958 //
959 // the file which contains the calorimeter ADC to MIP conversion values is file2 = path to the script dir / CaloADC2MIP.root
960 //
961 stringstream file2;
962 file2.str("");
963 file2 << OutDir.Data() << "/CaloADC2MIP.raw";
964 //
965 // this the figures and fit (4224 x 2 objects!)
966 //
967 stringstream file3;
968 file3 << OutDir.Data() << "/CaloADC2MIPfr.raw";
969 //
970 stringstream file4;
971 file4.str("");
972 file4 << OutDir.Data() << "/CaloADC2MIPfr";
973 //
974 stringstream file5;
975 file5.str("");
976 file5 << OutDir.Data() << "/CaloADC2MIPdata.raw";
977 //
978 Int_t nfile = 0;
979 Int_t fileup = 0;
980 if ( flist != "" ){
981 printf("\n You have given an input file list \n\n Files: \n");
982 ifstream in;
983 in.open(flist, ios::in);
984 char ctime[20];
985 while (1) {
986 in >> ctime;
987 if (!in.good()) break;
988 printf(" File number %i = %s \n",nfile+1,ctime);
989 nfile++;
990 };
991 in.close();
992 if ( !nfile ) {
993 printf("\n\n The list is empty, exiting... \n\n");
994 return;
995 };
996 } else {
997 nfile = 1;
998 };
999 printf("\n");
1000 //
1001 // First check if the calibration file exists:
1002 //
1003 Int_t EFILE = 0;
1004 printf(" Check the existence of CaloADC2MIP.raw file: \n\n");
1005
1006 if ( !existfile(file2.str().c_str()) ){
1007 printf(" %s :no such file or directory \n",file2.str().c_str());
1008 printf("\n OK, I will create it!\n\n");
1009 EFILE = 0;
1010 } else {
1011 printf(" The file already exists! Check if an update is needed \n\n");
1012 EFILE = 1;
1013 };
1014 //
1015 // the check for an update is done once even if we have a list.
1016 //
1017 TTree *tree = 0;
1018 if ( EFILE == 1) {
1019 //
1020 // The file exists, open it (READ ONLY) and check if any update is needed:
1021 //
1022 TFile *hfile = 0;
1023 hfile = new TFile(file2.str().c_str(),"READ","Calorimeter CALIBRATION data");
1024 calo = new CalorimeterCalibration();
1025 tree = (TTree*)hfile->Get("CaloADC");
1026 tree->SetBranchAddress("Event", &calo);
1027 //
1028 Long64_t nevents = tree->GetEntries();
1029 printf("\n Number of updates: %i\n",(int)nevents);
1030 tree->GetEntry(nevents-1);
1031 //
1032 // Read the status variable of the last event: if it is 0 then we need an update, if it is one print out informations and exit
1033 //
1034 if ( calo->status == 0 ) {
1035 printf("\n An update is needed: \n");
1036 Int_t upstrip = 0;
1037 for (Int_t i = 0; i<2; i++){
1038 for (Int_t j = 0; j<22; j++){
1039 for (Int_t l = 0; l<96; l++){
1040 if ( calo->mask[i][j][l] == 0. ) upstrip++;
1041 };
1042 };
1043 };
1044 printf(" %i strip out of 4224 have no statistic enough.\n\n",upstrip);
1045 } else {
1046 printf(" No update is needed! \n The data files used to obtain the ADC to MIP conversion are: \n");
1047 for (Int_t i = 0; i<nevents; i++){
1048 tree->GetEntry(i);
1049 const char *fnout = calo->fname;
1050 printf(" - %s \n",fnout);
1051 };
1052 printf("\n\n");
1053 return;
1054 };
1055 hfile->Close();
1056 };
1057 //
1058 const char *filename2 = Filename;
1059 //
1060 TString lfile;
1061 TString sfile;
1062 //
1063 Int_t e = 0;
1064 ifstream in;
1065 in.open(flist, ios::in);
1066 char ctime[20];
1067 TString pfile;
1068 const char *cali;
1069 const char *ffile;
1070 Int_t calibex = 0;
1071 //
1072 TString filename;
1073 const char *nome = 0;
1074 TFile *hfile = 0;
1075 // CalorimeterCalibration *calo = 0;
1076 Long64_t nevents;
1077 Int_t used = 0;
1078 const char *compare = 0;
1079 Int_t hf3 = 0;
1080 TFile *headerFile = 0;
1081 TString file2f = "";
1082 pfile = "";
1083 const char *porca = 0;
1084 Int_t S4;
1085 Int_t upnn;
1086 stringstream files;
1087 TFile *hfileb = 0;
1088 //
1089 Int_t pl1, pl2, strmin, strmax;
1090 Int_t spre=0;
1091 Int_t surstrip = 0;
1092 Float_t estrippa = 0.;
1093 //
1094 TFile *hfile3 = 0;
1095 TString fififile;
1096 const char *file;
1097 //
1098 calo = new CalorimeterCalibration();
1099 stringstream finome;
1100 finome.str("");
1101 while ( e < nfile ){
1102 if ( flist != "" ){
1103 in >> ctime;
1104 finome.str("");
1105 finome << filename2 << "/";
1106 finome << ctime;
1107 lfile = TString(finome.str().c_str());
1108 fififile = getFilename(lfile);
1109 file = fififile;
1110 finome.str("");
1111 finome << file;
1112 sfile = TString(finome.str().c_str());
1113 } else {
1114 finome.str("");
1115 finome << filename2;
1116 lfile = TString(finome.str().c_str());
1117 fififile = getFilename(lfile);
1118 file = fififile;
1119 finome.str("");
1120 finome << file;
1121 sfile = TString(finome.str().c_str());
1122 };
1123 //
1124 filename = lfile;
1125 nome = filename;
1126 printf("\n Processing file number %i: %s \n\n",e,nome);
1127 nome = sfile;
1128 //
1129 // this must be done for each file.
1130 //
1131 TTree *otr;
1132 pamela::calorimeter::CalorimeterEvent *de = 0;
1133 pamela::trigger::TriggerEvent *trigger = 0;
1134 pamela::PscuHeader *ph = 0;
1135 pamela::EventHeader *eh = 0;
1136 const char *calname;
1137 Int_t wused = 0;
1138 //
1139 // TTree *tree;
1140 if ( EFILE == 1 ){
1141 hfile = new TFile(file2.str().c_str(),"UPDATE","Calorimeter CALIBRATION data");
1142 tree = (TTree*)hfile->Get("CaloADC");
1143 tree->SetBranchAddress("Event", &calo);
1144 //
1145 // Check if the input file has already been used
1146 //
1147 printf(" Check if file %s has already been used... \n",nome);
1148 nevents = tree->GetEntries();
1149 used = 0;
1150 for (Int_t i = 0; i<nevents; i++){
1151 tree->GetEntry(i);
1152 compare= calo->fname;
1153 if ( !strcmp(compare,nome) ) {
1154 used = 1;
1155 break;
1156 };
1157 };
1158 if ( used ) {
1159 printf(" The file %s has already been used!\n You cannot run twice this program with that file!\n\n",nome);
1160 hfile->Close();
1161 goto jumpfile;
1162 } else {
1163 printf(" Good, the file has not been used yet. \n\n");
1164 nevents = tree->GetEntries() -1;
1165 tree->GetEntry(nevents);
1166 };
1167 } else {
1168 //
1169 // If the file doesn't exist create it
1170 //
1171 calo = new CalorimeterCalibration();
1172 hfile = new TFile(file2.str().c_str(),"NEW","Calorimeter CALIBRATION data");
1173 if ( !existfile(file2.str().c_str()) ){
1174 printf(" %s :no such file or directory \n",filename.Data());
1175 printf(" ERROR: Cannot create file \n");
1176 return;
1177 };
1178 tree = new TTree("CaloADC","Calorimeter calibration data");
1179 tree->Branch("Event","CalorimeterCalibration",&calo);
1180 };
1181 //
1182 //
1183 //
1184 hf3 = 0;
1185 if ( EFILE == 1 && e == 0 ){
1186 printf(" Reading the old MIP figures to be updated...\n ");
1187 hfile3 = new TFile(file3.str().c_str());
1188 hf3 = 1;
1189 //
1190 stringstream fmippa;
1191 fmippa.str("");
1192 for (Int_t l = 0; l < 2; l++){
1193 for (Int_t m = 0; m < 22; m++){
1194 for (Int_t n =0 ; n < 96; n++){
1195 fmippa.str("");
1196 fmippa << "fmip " << l;
1197 fmippa << " " << m;
1198 fmippa << " " << n;
1199 TH1F *temp = (TH1F*)hfile3->Get(fmippa.str().c_str());
1200 pfmip[l][m][n] = (TH1F*)temp->Clone();
1201 };
1202 };
1203 };
1204 printf(" ...done!\n");
1205 };
1206 EFILE = 1;
1207 //
1208 // Check if the input calibration file contains any calibration data
1209 //
1210 done = 0;
1211 printf(" Check for calorimeter calibration: \n");
1212 calcalib = filename;
1213 findcalibs: calname = calcalib;
1214 printf(" Calibration file: %s \n",calname);
1215 for (Int_t s=0; s<4;s++){
1216 for (Int_t d = 0; d<50; d++){
1217 calib.ttime[s][d] = 0 ;
1218 if ( d < 49 ) calib.time[s][d] = 0 ;
1219 };
1220 };
1221 for (Int_t m = 0; m < 2 ; m++ ){
1222 for (Int_t k = 0; k < 22; k++ ){
1223 for (Int_t l = 0; l < 96; l++ ){
1224 calib.calped[m][k][l] = 0. ;
1225 evento.dexy[m][k][l] = 0. ;
1226 evento.dexyc[m][k][l] = 0. ;
1227 edelta[m][k][l] = 0.;
1228 estrip[m][k][l] = 0.;
1229 estripnull[m][k][l] = 0.;
1230 };
1231 };
1232 }
1233 wused = 0;
1234 CaloFindCalibs(calcalib, calcalib, wused, calib);
1235 //
1236 // print on the screen the results:
1237 //
1238 ffile = filename;
1239 printf(" ------ %s ------- \n \n",ffile);
1240 calibex = 0;
1241 for (Int_t s=0; s<4;s++){
1242 printf(" ** SECTION %i **\n",s);
1243 for (Int_t d = 0; d<51; d++){
1244 if ( calib.ttime[s][d] != 0 ) {
1245 calibex++;
1246 if ( calib.fcode[s][d] != 10 ){
1247 file2f = "";
1248 stringcopy(file2f,calcalib,0,0);
1249 pfile = (TString)whatnamewith(file2f,calib.fcode[s][d]);
1250 } else {
1251 pfile = (TString)calcalib;
1252 };
1253 ffile = pfile;
1254 printf(" - from time %i to time %i use calibration at\n time %i, file: %s \n",calib.time[s][d],calib.time[s][d+1],calib.ttime[s][d],ffile);
1255 };
1256 };
1257 printf("\n");
1258 };
1259 printf(" ----------------------------------------------------------------------- \n \n");
1260 //
1261 if ( calibex < 1 ) {
1262 printf("No calibration data in this file!\n");
1263 calcalib = calcalibfile;
1264 if ( !done && calcalibfile != "" ) {
1265 cali = calcalibfile;
1266 printf(" Search in the calibration file %s \n",cali);
1267 done = 1;
1268 goto findcalibs;
1269 } else {
1270 printf(" Cannot find any calibration for this file! \n");
1271 goto jumpfile;
1272 };
1273 };
1274 if ( calibex < 4 ) {
1275 printf(" WARNING! No full calibration data in this file! \n\n");
1276 };
1277 //
1278 // upgrade data...
1279 //
1280 if ( !existfile(filename) ){
1281 printf(" %s :no such file or directory \n",filename.Data());
1282 goto jumpfile;
1283 };
1284 headerFile = new TFile(filename.Data());
1285 otr = (TTree*)headerFile->Get("Physics");
1286 otr->SetBranchAddress("Header", &eh);
1287 otr->SetBranchAddress("Calorimeter", &de);
1288 otr->SetBranchAddress("Trigger", &trigger);
1289 //
1290 //
1291 nevents = otr->GetEntries();
1292 //
1293 // calibrate before starting
1294 //
1295 for (Int_t s = 0; s < 4; s++){
1296 b[s]=0;
1297 if ( calib.fcode[s][b[s]] != 10 ){
1298 stringcopy(file2f,calcalib,0,0);
1299 pfile = (TString)whatnamewith(file2f,calib.fcode[s][b[s]]);
1300 } else {
1301 pfile = (TString)calcalib;
1302 };
1303 porca = pfile;
1304 if ( debug ) printf(" porca miseria %s \n",porca);
1305 CaloPede(pfile,s,calib.ttime[s][b[s]],calib);
1306 };
1307 //
1308 // run over all the events
1309 //
1310 printf("\n Processed events: \n\n");
1311 //
1312 for (Int_t i = 0; i < nevents; i++){
1313 evno = i;
1314 if ( i%1000 == 0 && i > 0 ) printf(" %iK \n",i/1000);
1315 //
1316 // read from the header of the event the absolute time at which it was recorded
1317 //
1318 otr->GetEntry(i);
1319 //
1320 S4 = trigger->patterntrig[1] & (1<<0);
1321 //
1322 if ( !S4 || i == 0 ) {
1323 ph = eh->GetPscuHeader();
1324 etime = ph->GetOrbitalTime();
1325 //
1326 // for each event check that the calibration we are using are still within calibration limits, if not call the next calibration
1327 //
1328 if ( !calib.obtjump ) {
1329 for (Int_t s = 0; s < 4; s++){
1330 if ( calib.ttime[s][b[s]] ){
1331 while ( etime > calib.time[s][b[s]+1] ){
1332 printf(" CALORIMETER: \n" );
1333 printf(" - Section %i, event at time %i while old calibration time limit at %i. Use new calibration at time %i -\n",s,etime,calib.time[s][b[s]+1],calib.ttime[s][b[s]+1]);
1334 printf(" END CALORIMETER. \n\n" );
1335 b[s]++;
1336 if ( calib.fcode[s][b[s]] != 10 ){
1337 stringcopy(file2f,calcalib,0,0);
1338 pfile = (TString)whatnamewith(file2f,calib.fcode[s][b[s]]);
1339 } else {
1340 pfile = (TString)calcalib;
1341 };
1342 porca = pfile;
1343 if ( debug ) printf(" porca miseria %s \n",porca);
1344 CaloPede(pfile,s,calib.ttime[s][b[s]],calib);
1345 };
1346 };
1347 };
1348 };
1349 //
1350 // do whatever you want with data
1351 //
1352 evento.iev = de->iev;
1353 //
1354 // run over views and planes
1355 //
1356 for (Int_t l = 0; l < 2; l++){
1357 for (Int_t m = 0; m < 22; m++){
1358 //
1359 // determine the section number
1360 //
1361 if (l == 0 && m%2 == 0) se = 3;
1362 if (l == 0 && m%2 != 0) se = 2;
1363 if (l == 1 && m%2 == 0) se = 0;
1364 if (l == 1 && m%2 != 0) se = 1;
1365 //
1366 // determine what kind of event we are going to analyze
1367 //
1368 isCOMP = 0;
1369 isFULL = 0;
1370 isRAW = 0;
1371 if ( de->stwerr[se] & (1 << 16) ) isCOMP = 1;
1372 if ( de->stwerr[se] & (1 << 17) ) isFULL = 1;
1373 if ( de->stwerr[se] & (1 << 3) ) isRAW = 1;
1374 //
1375 // save the prevoius energy deposit and calibration in sbase, sdexy, sdexyc
1376 //
1377 pre = -1;
1378 if ( isRAW ){
1379 for (Int_t nn = 0; nn < 96; nn++){
1380 if ( nn%16 == 0 ) pre++;
1381 evento.base[l][m][pre] = calib.calbase[l][m][pre];
1382 sdexy[l][m][nn] = evento.dexy[l][m][nn];
1383 evento.dexy[l][m][nn] = de->dexy[l][m][nn] ;
1384 sdexyc[l][m][nn] = evento.dexyc[l][m][nn];
1385 evento.dexyc[l][m][nn] = de->dexyc[l][m][nn] ;
1386 };
1387 //
1388 // run over strips
1389 //
1390 pre = -1;
1391 for (Int_t n =0 ; n < 96; n++){
1392 if ( n%16 == 0 ) {
1393 pre++;
1394 rdone = 0;
1395 done = 0;
1396 };
1397 if ( calo->mask[l][m][n] == 0. && ( isRAW || ( de->dexyc[l][m][n] > 0. && de->dexyc[l][m][n] < 32000.)) ){
1398 //
1399 // baseline check and calculation
1400 //
1401 if ( !rdone ){
1402 CaloFindBaseRawNC(calib,evento,l,m,pre);
1403 rdone = 1;
1404 };
1405 //
1406 // no suitable new baseline, use old ones and compress data!
1407 //
1408 if ( !done && (evento.base[l][m][pre] > 30000. || evento.base[l][m][pre] == 0.) ){
1409 evento.base[l][m][pre] = calib.sbase[l][m][pre];
1410 upnn = n+16;
1411 if ( upnn > 96 ) upnn = 96;
1412 for ( Int_t nn = n; nn<upnn; nn++ ){
1413 evento.dexyc[l][m][nn] = de->dexyc[l][m][nn] ;
1414 };
1415 done = 1;
1416 };
1417 //
1418 // CALIBRATION ALGORITHM
1419 //
1420 pl1 = -1;
1421 pl2 = -1;
1422 pl1 = m - 1;
1423 pl2 = m + 1;
1424 if ( pl1 < 0 ) {
1425 pl1 = pl2;
1426 pl2 = m + 2;
1427 };
1428 if ( pl2 > 21 ) {
1429 pl2 = pl1;
1430 pl1 = m - 2;
1431 };
1432 strmin = n - 2;
1433 if ( strmin < 0 ) strmin = 0;
1434 strmax = n + 2;
1435 if ( strmax > 95 ) strmax = 95;
1436 surstrip = 0;
1437 for (Int_t spl = pl1; spl<pl2+1; spl++){
1438 if ( spl != m ){
1439 for (Int_t sst = strmin; sst<strmax+1; sst++){
1440 if ( sst < 16 ) spre = 0;
1441 if ( 15 < sst && sst < 32 ) spre = 2;
1442 if ( 31 < sst && sst < 48 ) spre = 3;
1443 if ( 47 < sst && sst < 64 ) spre = 4;
1444 if ( 63 < sst && sst < 80 ) spre = 5;
1445 if ( 79 < sst ) spre = 6;
1446 if ( isRAW ){
1447 estrippa = ( evento.dexy[l][spl][sst] - calib.calped[l][spl][sst] - calib.sbase[l][spl][spre])/26. ;
1448 } else {
1449 estrippa = ( evento.dexyc[l][spl][sst] - calib.calped[l][spl][sst] - calib.sbase[l][spl][spre])/26. ;
1450 };
1451 if ( estrippa > 0.7 && estrippa < 10. && calib.calgood[l][spl][sst] == 0 ){
1452 surstrip++;
1453 //printf("surstrip = %i estrip = %f \n",surstrip,estrip);
1454 };
1455 };
1456 };
1457 };
1458 //
1459 //
1460 estrip[l][m][n] = ( evento.dexyc[l][m][n] - calib.calped[l][m][n] - evento.base[l][m][pre]) ;
1461 pfmip[l][m][n]->Fill(estrip[l][m][n]);
1462 calib.sbase[l][m][pre] = evento.base[l][m][pre];
1463 };
1464 };
1465 };
1466 };
1467 };
1468 };
1469 };
1470 //
1471 // save filename
1472 //
1473 calo->fname = sfile;
1474 tree->Fill();
1475 hfile->Write();
1476 fileup++;
1477 hfile->Close();
1478 //
1479 // create a backup copy!
1480 //
1481 if ( nfile > 1 && ( e%10 == 0 || e == nfile-1 ) && e > 0 ){
1482 files.str("");
1483 files << file4.str().c_str() << (e+1);
1484 files << ".bak";
1485 printf(" Save the backup file with figures:\n %s \n ",files.str().c_str());
1486 hfileb = new TFile(files.str().c_str(),"RECREATE","Calorimeter CALIBRATION figures");
1487 if ( !existfile(files.str().c_str()) ){
1488 printf(" ERROR: Cannot create file!!! \n");
1489 goto oltre;
1490 };
1491 TH1F *bfmip[2][22][96];
1492 stringstream bmippa;
1493 for (Int_t l = 0; l < 2; l++){
1494 for (Int_t m = 0; m < 22; m++){
1495 for (Int_t n =0 ; n < 96; n++){
1496 bmippa.str("");
1497 bmippa << "bmip " << l;
1498 bmippa << " " << m;
1499 bmippa << " " << n;
1500 bfmip[l][m][n] = new TH1F(bmippa.str().c_str(),"",70,-15.,55.);
1501 bfmip[l][m][n] = (TH1F*)pfmip[l][m][n]->Clone(bmippa.str().c_str());
1502 bfmip[l][m][n]->Write();
1503 };
1504 };
1505 };
1506 hfileb->Close();
1507 };
1508 //
1509 //
1510 //
1511 headerFile->Close();
1512 goto oltre;
1513 jumpfile: printf(" File not processed! \n ");
1514 hfile->Close();
1515 oltre:
1516 // gObjectTable->Print();
1517 e++;
1518 };
1519 //
1520 // Save histograms and fit figures
1521 //
1522 TFile *hfile2;
1523 hfile2 = new TFile(file3.str().c_str(),"RECREATE","Calorimeter CALIBRATION figures");
1524 if ( !existfile(file3.str().c_str()) ){
1525 printf(" ERROR: Cannot create file!!! \n");
1526 return;
1527 };
1528 TH1F *sfmip[2][22][96];
1529 stringstream fmippa;
1530 for (Int_t l = 0; l < 2; l++){
1531 for (Int_t m = 0; m < 22; m++){
1532 for (Int_t n =0 ; n < 96; n++){
1533 fmippa.str("");
1534 fmippa << "fmip " << l;
1535 fmippa << " " << m;
1536 fmippa << " " << n;
1537 sfmip[l][m][n] = new TH1F(fmippa.str().c_str(),"",72,-15.,55.);
1538 sfmip[l][m][n] = (TH1F*)pfmip[l][m][n]->Clone(fmippa.str().c_str());
1539 sfmip[l][m][n]->Write();
1540 };
1541 };
1542 };
1543 hfile2->Close();
1544 if ( hf3 ) hfile3->Close();
1545 }
1546
1547 void FCaloRAWADC2MIPDATA(TString Filename, TString calcalibfile = "", TString OutDir="", TString flist=""){
1548 const char *pam_calib = pathtocalibration();
1549 if ( !strcmp(OutDir.Data(),"") ){
1550 OutDir = pam_calib;
1551 };
1552 TString calcalib;
1553 struct Evento evento;
1554 struct Calib calib;
1555 Int_t debug = 0;
1556 Int_t b[4];
1557 Int_t etime,evno;
1558 Float_t sdexy[2][22][96],sdexyc[2][22][96];
1559 Float_t edelta[2][22][96];
1560 Float_t estrip[2][22][96];
1561 Float_t estripnull[2][22][96];
1562 Float_t delta;
1563 delta = 1.;
1564 evento.emin = 0.7;
1565 Int_t se =5;
1566 Int_t pre;
1567 Int_t rdone = 0;
1568 Int_t done;
1569 bool isCOMP = 0;
1570 bool isFULL = 0;
1571 bool isRAW = 0;
1572 //
1573 // the file which contains the calorimeter ADC to MIP conversion values is file2 = path to the script dir / CaloADC2MIP.root
1574 //
1575 stringstream file5;
1576 file5.str("");
1577 file5 << OutDir.Data() << "/CaloADC2MIPdata.raw";
1578 //
1579 Int_t nfile = 0;
1580 Int_t fileup = 0;
1581 if ( flist != "" ){
1582 printf("\n You have given an input file list \n\n Files: \n");
1583 ifstream in;
1584 in.open(flist, ios::in);
1585 char ctime[20];
1586 while (1) {
1587 in >> ctime;
1588 if (!in.good()) break;
1589 printf(" File number %i = %s \n",nfile+1,ctime);
1590 nfile++;
1591 };
1592 in.close();
1593 if ( !nfile ) {
1594 printf("\n\n The list is empty, exiting... \n\n");
1595 return;
1596 };
1597 } else {
1598 nfile = 1;
1599 };
1600 printf("\n");
1601 //
1602 // First check if the calibration file exists:
1603 //
1604 //
1605 const char *filename2 = Filename;
1606 //
1607 TString lfile;
1608 TString sfile;
1609 //
1610 Int_t e = 0;
1611 ifstream in;
1612 in.open(flist, ios::in);
1613 char ctime[20];
1614 TString file2f;
1615 TString pfile;
1616 const char *cali;
1617 const char *ffile;
1618 Int_t calibex = 0;
1619 //
1620 TString filename;
1621 const char *nome = 0;
1622 Long64_t nevents;
1623 TFile *headerFile = 0;
1624 file2f = "";
1625 pfile = "";
1626 const char *porca = 0;
1627 Int_t upnn;
1628 //
1629 //
1630 TFile *hfl1 = 0;
1631 hfl1 = new TFile(file5.str().c_str(),"RECREATE","Calorimeter LEVEL1 data");
1632 //
1633 // class CalorimeterLevel1
1634 //
1635 CalorimeterADCRAW *clev1 = new CalorimeterADCRAW();
1636 TTree *trl1 = 0;
1637 trl1 = new TTree("CaloADCRAW","PAMELA Level1 calorimeter data");
1638 trl1->Branch("Rawdata","CalorimeterADCRAW",&clev1);
1639 //
1640 Int_t glbc = 0;
1641 //
1642 TString fififile;
1643 const char *file;
1644 //
1645 stringstream lfillo;
1646 while ( e < nfile ){
1647 if ( flist != "" ){
1648 in >> ctime;
1649 lfillo.str("");
1650 lfillo << filename2 << "/";
1651 lfillo << ctime;
1652 lfile = TString(lfillo.str().c_str());
1653 fififile = getFilename(lfile);
1654 file = fififile;
1655 lfillo.str("");
1656 lfillo << file;
1657 sfile = TString(lfillo.str().c_str());
1658 } else {
1659 lfillo.str("");
1660 lfillo << filename2;
1661 lfile = TString(lfillo.str().c_str());
1662 fififile = getFilename(lfile);
1663 file = fififile;
1664 lfillo.str("");
1665 lfillo << file;
1666 sfile = TString(lfillo.str().c_str());
1667 };
1668 //
1669 filename = lfile;
1670 nome = filename;
1671 printf("\n Processing file number %i: %s \n\n",e,nome);
1672 nome = sfile;
1673 //
1674 // Check if the input calibration file contains any calibration data
1675 //
1676 TTree *otr;
1677 pamela::calorimeter::CalorimeterEvent *de = 0;
1678 pamela::PscuHeader *ph = 0;
1679 pamela::EventHeader *eh = 0;
1680 //
1681 done = 0;
1682 printf(" Check for calorimeter calibration: \n");
1683 calcalib = filename;
1684 findcalibs: const char *calname = calcalib;
1685 printf(" Calibration file: %s \n",calname);
1686 for (Int_t s=0; s<4;s++){
1687 for (Int_t d = 0; d<50; d++){
1688 calib.ttime[s][d] = 0 ;
1689 if ( d < 49 ) calib.time[s][d] = 0 ;
1690 };
1691 };
1692 for (Int_t m = 0; m < 2 ; m++ ){
1693 for (Int_t k = 0; k < 22; k++ ){
1694 for (Int_t l = 0; l < 96; l++ ){
1695 calib.calped[m][k][l] = 0. ;
1696 evento.dexy[m][k][l] = 0. ;
1697 evento.dexyc[m][k][l] = 0. ;
1698 edelta[m][k][l] = 0.;
1699 estrip[m][k][l] = 0.;
1700 estripnull[m][k][l] = 0.;
1701 };
1702 };
1703 }
1704 Int_t wused = 0;
1705 CaloFindCalibs(filename, calcalibfile, wused, calib);
1706 if ( wused == 1 ) calcalibfile = filename;
1707 //
1708 // print on the screen the results:
1709 //
1710 ffile = filename;
1711 printf(" ------ %s ------- \n \n",ffile);
1712 calibex = 0;
1713 for (Int_t s=0; s<4;s++){
1714 printf(" ** SECTION %i **\n",s);
1715 for (Int_t d = 0; d<51; d++){
1716 if ( calib.ttime[s][d] != 0 ) {
1717 calibex++;
1718 if ( calib.fcode[s][d] != 10 ){
1719 file2f = "";
1720 stringcopy(file2f,calcalib,0,0);
1721 pfile = (TString)whatnamewith(file2f,calib.fcode[s][d]);
1722 } else {
1723 pfile = (TString)calcalib;
1724 };
1725 ffile = pfile;
1726 printf(" - from time %i to time %i use calibration at\n time %i, file: %s \n",calib.time[s][d],calib.time[s][d+1],calib.ttime[s][d],ffile);
1727 };
1728 };
1729 printf("\n");
1730 };
1731 printf(" ----------------------------------------------------------------------- \n \n");
1732 //
1733 if ( calibex < 1 ) {
1734 printf("No calibration data in this file!\n");
1735 calcalib = calcalibfile;
1736 if ( !done && calcalibfile != "" ) {
1737 cali = calcalibfile;
1738 printf(" Search in the calibration file %s \n",cali);
1739 done = 1;
1740 goto findcalibs;
1741 } else {
1742 printf(" Cannot find any calibration for this file! \n");
1743 goto jumpfile;
1744 };
1745 };
1746 if ( calibex < 4 ) {
1747 printf(" WARNING! No full calibration data in this file! \n\n");
1748 };
1749 //
1750 // upgrade data...
1751 //
1752 if ( !existfile(filename) ){
1753 printf(" %s :no such file or directory \n",filename.Data());
1754 goto jumpfile;
1755 };
1756 headerFile = new TFile(filename.Data());
1757 otr = (TTree*)headerFile->Get("Physics");
1758 otr->SetBranchAddress("Header", &eh);
1759 otr->SetBranchAddress("Calorimeter", &de);
1760 //
1761 nevents = otr->GetEntries();
1762 //
1763 // calibrate before starting
1764 //
1765 for (Int_t s = 0; s < 4; s++){
1766 b[s]=0;
1767 if ( calib.fcode[s][b[s]] != 10 ){
1768 stringcopy(file2f,calcalib,0,0);
1769 pfile = (TString)whatnamewith(file2f,calib.fcode[s][b[s]]);
1770 } else {
1771 pfile = (TString)calcalib;
1772 };
1773 porca = pfile;
1774 if ( debug ) printf(" porca miseria %s \n",porca);
1775 CaloPede(pfile,s,calib.ttime[s][b[s]],calib);
1776 };
1777 //
1778 // run over all the events
1779 //
1780 printf("\n Processed events: \n\n");
1781 //
1782 Int_t updata;
1783 for (Int_t i = 0; i < nevents; i++){
1784 evno = i;
1785 if ( i%1000 == 0 && i > 0 ) printf(" %iK \n",i/1000);
1786 //
1787 // read from the header of the event the absolute time at which it was recorded
1788 //
1789 otr->GetEntry(i);
1790 //
1791 //
1792 ph = eh->GetPscuHeader();
1793 etime = ph->GetOrbitalTime();
1794 //
1795 // for each event check that the calibration we are using are still within calibration limits, if not call the next calibration
1796 //
1797 if ( !calib.obtjump ) {
1798 for (Int_t s = 0; s < 4; s++){
1799 if ( calib.ttime[s][b[s]] ){
1800 while ( etime > calib.time[s][b[s]+1] ){
1801 printf(" CALORIMETER: \n" );
1802 printf(" - Section %i, event at time %i while old calibration time limit at %i. Use new calibration at time %i -\n",s,etime,calib.time[s][b[s]+1],calib.ttime[s][b[s]+1]);
1803 printf(" END CALORIMETER. \n\n" );
1804 b[s]++;
1805 if ( calib.fcode[s][b[s]] != 10 ){
1806 stringcopy(file2f,calcalib,0,0);
1807 pfile = (TString)whatnamewith(file2f,calib.fcode[s][b[s]]);
1808 } else {
1809 pfile = (TString)calcalib;
1810 };
1811 porca = pfile;
1812 if ( debug ) printf(" porca miseria %s \n",porca);
1813 CaloPede(pfile,s,calib.ttime[s][b[s]],calib);
1814 };
1815 };
1816 };
1817 };
1818 //
1819 // do whatever you want with data
1820 //
1821 evento.iev = de->iev;
1822 //
1823 // run over views and planes
1824 //
1825 updata = 0;
1826 glbc++;
1827 for (Int_t l = 0; l < 2; l++){
1828 for (Int_t m = 0; m < 22; m++){
1829 //
1830 // determine the section number
1831 //
1832 if (l == 0 && m%2 == 0) se = 3;
1833 if (l == 0 && m%2 != 0) se = 2;
1834 if (l == 1 && m%2 == 0) se = 0;
1835 if (l == 1 && m%2 != 0) se = 1;
1836 //
1837 // determine what kind of event we are going to analyze
1838 //
1839 isCOMP = 0;
1840 isFULL = 0;
1841 isRAW = 0;
1842 if ( de->stwerr[se] & (1 << 16) ) isCOMP = 1;
1843 if ( de->stwerr[se] & (1 << 17) ) isFULL = 1;
1844 if ( de->stwerr[se] & (1 << 3) ) isRAW = 1;
1845 //
1846 // save the prevoius energy deposit and calibration in sbase, sdexy, sdexyc
1847 //
1848 pre = -1;
1849 if ( isRAW || isFULL ){
1850 updata = 1;
1851 for (Int_t nn = 0; nn < 96; nn++){
1852 if ( nn%16 == 0 ) pre++;
1853 evento.base[l][m][pre] = calib.calbase[l][m][pre];
1854 sdexy[l][m][nn] = evento.dexy[l][m][nn];
1855 evento.dexy[l][m][nn] = de->dexy[l][m][nn] ;
1856 sdexyc[l][m][nn] = evento.dexyc[l][m][nn];
1857 // !!!
1858 evento.dexyc[l][m][nn] = de->dexy[l][m][nn] ;
1859 // !!!
1860 };
1861 //
1862 // run over strips
1863 //
1864 pre = -1;
1865 for (Int_t n =0 ; n < 96; n++){
1866 if ( n%16 == 0 ) {
1867 pre++;
1868 rdone = 0;
1869 done = 0;
1870 };
1871 if ( isRAW || ( de->dexyc[l][m][n] > 0. && de->dexyc[l][m][n] < 32000.) || isFULL ){
1872 if ( isFULL && !rdone ) rdone = 1;
1873 //
1874 // baseline check and calculation
1875 //
1876 if ( !rdone ){
1877 CaloFindBaseRawNC(calib,evento,l,m,pre);
1878 rdone = 1;
1879 };
1880 //
1881 // no suitable new baseline, use old ones and compress data!
1882 //
1883 if ( !done && (evento.base[l][m][pre] > 30000. || evento.base[l][m][pre] == 0.) ){
1884 evento.base[l][m][pre] = calib.sbase[l][m][pre];
1885 upnn = n+16;
1886 if ( upnn > 96 ) upnn = 96;
1887 for ( Int_t nn = n; nn<upnn; nn++ ){
1888 evento.dexyc[l][m][nn] = de->dexy[l][m][nn] ;
1889 };
1890 done = 1;
1891 };
1892 //
1893 // CALIBRATION ALGORITHM
1894 //
1895 estrip[l][m][n] = ( evento.dexyc[l][m][n] - calib.calped[l][m][n] - evento.base[l][m][pre]) ;
1896 calib.sbase[l][m][pre] = evento.base[l][m][pre];
1897 clev1->diffbas[l][m][pre] = evento.base[l][m][pre];
1898 clev1->estrip[l][m][n] = estrip[l][m][n];
1899 };
1900 };
1901 };
1902 };
1903 };
1904 // if ( updata ){
1905 clev1->evno = glbc;
1906 clev1->etime = etime;
1907 trl1->Fill();
1908 for (Int_t l =0 ; l < 2; l++){
1909 for (Int_t m =0 ; m < 22; m++){
1910 pre = -1;
1911 for (Int_t n =0 ; n < 96; n++){
1912 // memcpy(estrip, estripnull, sizeof(estrip));
1913 if ( n%16 == 0 ) pre++;
1914 estrip[l][m][n] = 0.;
1915 evento.base[l][m][pre] = 0.;
1916 clev1->diffbas[l][m][pre] = evento.base[l][m][pre];
1917 clev1->estrip[l][m][n] = estrip[l][m][n];
1918 };
1919 };
1920 };
1921 //gObjectTable->Print();
1922 //};
1923 };
1924 //
1925 // save filename
1926 //
1927 fileup++;
1928 //
1929 headerFile->Close();
1930 goto oltre;
1931 jumpfile: printf(" File not processed! \n ");
1932 oltre:
1933 e++;
1934 };
1935 hfl1->Write();
1936 hfl1->Close();
1937 }
1938
1939 void FCalo4224STATUS(TString filename = "", TString style = ""){
1940 const char *pam_calib = pathtocalibration();
1941 //
1942 // this routine shows the calorimeter calibration status with a figure. You can choose style between "error" (or "") to show the error on the
1943 // peak maximum determined and "status" to show which strips have converged to a certain value.
1944 //
1945 if ( filename == "" ){
1946 stringstream filenome;
1947 filenome.str("");
1948 filenome << pam_calib << "/CaloADC2MIP.root";
1949 filename = (TString)filenome.str().c_str();
1950 };
1951 if ( style == "" ) style = "error";
1952 const char *file2 = filename;
1953 TFile *hfile;
1954 hfile = new TFile(file2,"READ","Calorimeter CALIBRATION data");
1955 CalorimeterCalibration *calo = 0;
1956 TTree *tree;
1957 tree = (TTree*)hfile->Get("CaloADC");
1958 tree->SetBranchAddress("Event", &calo);
1959 //
1960 Long64_t nevents = tree->GetEntries();
1961 tree->GetEntry(nevents-1);
1962 //
1963 // Book the histograms:
1964 //
1965 //
1966 TH2F *Xview = new TH2F("x-view event ","",96,-0.5,95.5,22,-0.5,21.5);
1967 TH2F *Yview = new TH2F("y-view event ","",96,-0.5,95.5,22,-0.5,21.5);
1968 //
1969 // figures:
1970 //
1971 TCanvas *figura2 = new TCanvas("Calorimeter:_strip_RMS", "Calorimeter:_strip_RMS", 750, 650);
1972 figura2->SetFillColor(10);
1973 figura2->Range(0,0,100,100);
1974 Int_t bgcolor = 10;
1975 TPad *pd1 = new TPad("pd1","This is pad1",0.02,0.05,0.88,0.49,bgcolor);
1976 TPad *pd2 = new TPad("pd2","This is pad2",0.02,0.51,0.88,0.95,bgcolor);
1977 TPad *palette = new TPad("palette","This is palette",0.90,0.05,0.98,0.90,bgcolor);
1978 figura2->cd();
1979 TLatex *t=new TLatex();
1980 t->SetTextFont(32);
1981 t->SetTextColor(1);
1982 t->SetTextSize(0.03);
1983 t->SetTextAlign(12);
1984 t->DrawLatex(90.,92.5,"error");
1985 pd1->Range(0,0,100,100);
1986 pd2->Range(0,0,100,100);
1987 palette->Range(0,0,101,100);
1988 pd1->SetTicks();
1989 pd2->SetTicks();
1990 pd1->Draw();
1991 pd2->Draw();
1992 palette->Draw();
1993 palette->cd();
1994 const char *style2 = style;
1995 if ( !strcmp(style2,"error") ){
1996 // palette
1997 TPaveLabel *box1 = new TPaveLabel(1,2,99,14,"no fit","");
1998 box1->SetTextFont(32);
1999 box1->SetTextColor(1);
2000 box1->SetTextSize(0.25);
2001 box1->SetFillColor(10);
2002 box1->Draw();
2003 TPaveLabel *box2 = new TPaveLabel(1,16,99,28,"< 0.15","");
2004 box2->SetTextFont(32);
2005 box2->SetTextColor(1);
2006 box2->SetTextSize(0.25);
2007 box2->SetFillColor(38);
2008 box2->Draw();
2009 TPaveLabel *box3 = new TPaveLabel(1,30,99,42,"0.15 - 0.25","");
2010 box3->SetTextFont(32);
2011 box3->SetTextColor(1);
2012 box3->SetTextSize(0.2);
2013 box3->SetFillColor(4);
2014 box3->Draw();
2015 TPaveLabel *box4 = new TPaveLabel(1,44,99,56,"0.25 - 0.55","");
2016 box4->SetTextFont(32);
2017 box4->SetTextColor(1);
2018 box4->SetTextSize(0.2);
2019 box4->SetFillColor(3);
2020 box4->Draw();
2021 TPaveLabel *box5 = new TPaveLabel(1,58,99,70,"0.55 - 1","");
2022 box5->SetTextFont(32);
2023 box5->SetTextColor(1);
2024 box5->SetTextSize(0.25);
2025 box5->SetFillColor(2);
2026 box5->Draw();
2027 TPaveLabel *box6 = new TPaveLabel(1,72,99,84,"1 - 5","");
2028 box6->SetTextFont(32);
2029 box6->SetTextColor(1);
2030 box6->SetTextSize(0.25);
2031 box6->SetFillColor(6);
2032 box6->Draw();
2033 TPaveLabel *box7 = new TPaveLabel(1,86,99,98,"> 5","");
2034 box7->SetTextFont(32);
2035 box7->SetTextColor(10);
2036 box7->SetTextSize(0.25);
2037 box7->SetFillColor(1);
2038 box7->Draw();
2039 } else {
2040 TPaveLabel *box1 = new TPaveLabel(1,2,99,14,"not done","");
2041 box1->SetTextFont(32);
2042 box1->SetTextColor(1);
2043 box1->SetTextSize(0.25);
2044 box1->SetFillColor(10);
2045 box1->Draw();
2046 TPaveLabel *box2 = new TPaveLabel(1,16,99,28,"done","");
2047 box2->SetTextFont(32);
2048 box2->SetTextColor(1);
2049 box2->SetTextSize(0.25);
2050 box2->SetFillColor(38);
2051 box2->Draw();
2052 };
2053 //
2054 pd1->cd();
2055 gStyle->SetOptStat(0);
2056 Xview->SetXTitle("strip");
2057 Xview->SetYTitle("X - plane");
2058 Xview->GetYaxis()->SetTitleOffset(0.5);
2059 Xview->SetFillColor(bgcolor);
2060 Xview->Fill(1.,1.,1.);
2061 Xview->Draw("box");
2062 pd1->Update();
2063 pd2->cd();
2064 gStyle->SetOptStat(0);
2065 Yview->SetXTitle("strip");
2066 Yview->SetYTitle("Y - plane");
2067 Yview->GetYaxis()->SetTitleOffset(0.5);
2068 Yview->SetFillColor(bgcolor);
2069 Yview->Fill(1.,1.,1.);
2070 Yview->Draw("box");
2071 pd2->Update();
2072 //
2073 // run over views and planes
2074 //
2075 stringstream xview;
2076 stringstream yview;
2077 for (Int_t m = 0; m < 22; m++){
2078 for (Int_t l = 0; l < 2; l++){
2079 for (Int_t n = 0; n < 96; n++){
2080 xview.str("");
2081 xview << "x-view event " << n;
2082 xview << " " << m;
2083 xview << " " << l;
2084 yview.str("");
2085 yview << "y-view event " << n;
2086 yview << " " << m;
2087 yview << " " << l;
2088 gDirectory->Delete(xview.str().c_str());
2089 gDirectory->Delete(yview.str().c_str());
2090 TH2F *Xview = new TH2F(xview.str().c_str(),"",96,-0.5,95.5,22,-0.5,21.5);
2091 TH2F *Yview = new TH2F(yview.str().c_str(),"",96,-0.5,95.5,22,-0.5,21.5);
2092 if ( !strcmp(style2,"error") ){
2093 if ( calo->fpe[1][l][m][n] < 0.15 ){
2094 Xview->SetFillColor(38);
2095 Yview->SetFillColor(38);
2096 };
2097 if ( calo->fpe[1][l][m][n] >= 0.15 ){
2098 Xview->SetFillColor(4);
2099 Yview->SetFillColor(4);
2100 };
2101 if ( calo->fpe[1][l][m][n] >= 0.25){
2102 Xview->SetFillColor(3);
2103 Yview->SetFillColor(3);
2104 };
2105 if ( calo->fpe[1][l][m][n] >= 0.55 ){
2106 Xview->SetFillColor(2);
2107 Yview->SetFillColor(2);
2108 };
2109 if ( calo->fpe[1][l][m][n] >= 1. ){
2110 Xview->SetFillColor(6);
2111 Yview->SetFillColor(6);
2112 };
2113 if ( calo->fpe[1][l][m][n] >= 5. ){
2114 Xview->SetFillColor(1);
2115 Yview->SetFillColor(1);
2116 };
2117 if ( calo->mip[l][m][n] < 15. || calo->mip[l][m][n] > 40. ){
2118 Xview->SetFillColor(10);
2119 Yview->SetFillColor(10);
2120 };
2121 } else {
2122 if ( calo->mask[l][m][n] == 1 ){
2123 Xview->SetFillColor(38);
2124 Yview->SetFillColor(38);
2125 } else {
2126 Xview->SetFillColor(10);
2127 Yview->SetFillColor(10);
2128 };
2129 };
2130 if ( l == 0 ) {
2131 Xview->Fill(n,m,1.);
2132 pd1->cd();
2133 Xview->Draw("box same");
2134 };
2135 if ( l == 1 ) {
2136 Yview->Fill(n,m,1.);
2137 pd2->cd();
2138 Yview->Draw("box same");
2139 };
2140 };
2141 };
2142 };
2143 figura2->cd();
2144 gStyle->SetOptDate(1);
2145 //
2146 t=new TLatex();
2147 t->SetTextFont(32);
2148 t->SetTextColor(8);
2149 t->SetTextAlign(12);
2150 t->SetTextSize(0.02);
2151 figura2->Update();
2152 pd1->Update();
2153 pd2->Update();
2154 //
2155 }
2156
2157 void FCalo4224FIT(TString filename = "", TString OutDir="", TString filevalue = "", TString type=""){
2158 const char *pam_calib = pathtocalibration();
2159 if ( !strcmp(OutDir.Data(),"") ){
2160 OutDir=pam_calib;
2161 };
2162 //
2163 // this routine shows the 4224 figures with fit from the main program
2164 //
2165 const char* startingdir = gSystem->WorkingDirectory();
2166 stringstream filenome;
2167 filenome.str("");
2168 if ( filename == "" ){
2169 filenome << OutDir.Data() << "/CaloADC2MIPf.root";
2170 filename = (TString)filenome.str().c_str();
2171 filenome.str("");
2172 };
2173 if ( filevalue == "" ){
2174 filenome.str("");
2175 filenome << OutDir.Data() << "/CaloADC2MIP.root";
2176 } else {
2177 filenome << filevalue.Data();
2178 };
2179 // EM
2180 const char *file2;
2181 file2 = filenome.str().c_str();
2182 TFile *hfile = 0;
2183 hfile = new TFile(filevalue.Data(),"UPDATE","Calorimeter CALIBRATION data");
2184 CalorimeterCalibration *calo = 0;
2185 TTree *tree;
2186 tree = (TTree*)hfile->Get("CaloADC");
2187 tree->SetBranchAddress("Event", &calo);
2188 Long64_t nevents = tree->GetEntries();
2189 tree->GetEntry(nevents-1);
2190 // EM end
2191 //
2192 const char *file = filename;
2193 stringstream file3;
2194 file3.str("");
2195 // file3 << OutDir.Data() << "/";
2196 file3 << file;
2197 TFile hfile3(filename.Data());
2198 Int_t l = 0;
2199 TCanvas *c1;
2200 Int_t ty = 1;
2201 if ( type != "" ) ty = 0;
2202 c1 = new TCanvas("canvas","canvas",800,800);
2203 c1->Draw();
2204 gStyle->SetOptFit(111);
2205 gPad->SetLogy();
2206 gPad->SetTickx();
2207 gPad->SetTicky();
2208 gPad->SetGrid();
2209 Int_t j = -1;
2210 Int_t k = -1;
2211 Int_t h = -1;;
2212 Int_t changed = 0;
2213 beginning:
2214 if ( j >= 0 ) l = j;
2215 stringstream fmippa;
2216 TF1 *tempf = 0;
2217 TH1F *temp;
2218 while ( l < 2){
2219 Int_t m = 0;
2220 if ( k >= 0 ) m = k;
2221 while ( m < 22 ){
2222 Int_t n =0 ;
2223 if ( h >= 0 ) n = h;
2224 while ( n < 96 ){
2225 c1->Clear();
2226 c1->cd();
2227 fmippa.str("");
2228 fmippa << "fmip " << l;
2229 fmippa << " " << m;
2230 fmippa << " " << n;
2231 temp = (TH1F*)hfile3.Get(fmippa.str().c_str());
2232 if ( ty ) {
2233 fmippa.str("");
2234 fmippa << "fit " << l;
2235 fmippa << " " << m;
2236 fmippa << " " << n;
2237 tempf = (TF1*)hfile3.Get(fmippa.str().c_str());
2238 };
2239 j = -1;
2240 k = -1;
2241 h = -1;
2242 temp->DrawCopy();
2243 if ( ty ) tempf->DrawCopy("lsame");
2244 c1->Update();
2245 //
2246 //
2247 //
2248 printf(" **** STRIP: %i %i %i **** \n",l,m,n);
2249 printf(" MIP: %f \n",calo->mip[l][m][n]);
2250 //printf(" ERMIP: %f \n",calo->ermip[l][m][n]);
2251 //printf(" FP[0-3]: %f / %f / %f / %f \n",calo->fp[0][l][m][n],calo->fp[1][l][m][n],calo->fp[2][l][m][n],calo->fp[3][l][m][n]);
2252 //printf(" FPE[0-3]: %f / %f / %f / %f \n",calo->fpe[0][l][m][n],calo->fpe[1][l][m][n],calo->fpe[2][l][m][n],calo->fpe[3][l][m][n]);
2253 //printf(" CHI2: %f \n",calo->chi2[l][m][n]);
2254 //printf(" NDF: %f \n",calo->ndf[l][m][n]);
2255 //printf(" MASK: %f \n",calo->mask[l][m][n]);
2256 //
2257 // what to do?
2258 //
2259 char tellme[256];
2260 char tellme2[256];
2261 stringstream input;
2262 stringstream input2;
2263 stringstream out;
2264 stringstream stc;
2265 input.str("a");
2266 out.str("a");
2267 while ( !strcmp(input.str().c_str(),out.str().c_str()) ) {
2268 printf("\nPress <enter> to continue, b<enter> to go backward, j<enter> to jump to a\nfigure, p<enter> to save the figure, f<enter> to do the fit, q<enter> to quit: \n");
2269 cin.getline(tellme,256);
2270 input.str("");
2271 input << tellme;
2272 out.str("1");
2273 //
2274 stc.str("f");
2275 if ( !strcmp(input.str().c_str(),stc.str().c_str()) ) {
2276 printf("\n Do you want to give a number by hand, h<enter>, or do you want to try a better fit, f<enter>?");
2277 cin.getline(tellme,256);
2278 input.str("");
2279 input << tellme;
2280 out.str("f");
2281 if ( !strcmp(input.str().c_str(),stc.str().c_str()) ) {
2282 Double_t fr[2],vtemp;
2283 Double_t sv[4], pllo[4], plhi[4], ffp[4], ffpe[4];
2284 for ( Int_t fk = 0; fk < 4; fk++){
2285 sv[fk] = (int)calo->fp[fk][l][m][n];
2286 printf(" Give input parameter [fp[%i]=%f] \n",fk,sv[fk]);
2287 cin.getline(tellme2,256);
2288 input2.str("");
2289 input2 << tellme2;
2290 vtemp = (Double_t)atoi(input2.str().c_str());
2291 if ( vtemp != 0. ) sv[fk] = vtemp;
2292 printf(" -> fp[%i] = %f \n\n",fk,sv[fk]);
2293 };
2294 printf(" Give lower limit of fitting range fr[0] \n");
2295 cin.getline(tellme2,256);
2296 input2.str("");
2297 input2 << tellme2;
2298 fr[0] = (Double_t)atoi(input2.str().c_str());
2299 printf(" -> fr[0] = %f \n\n",fr[0]);
2300 printf(" Give upper limit of fitting range fr[1] \n");
2301 cin.getline(tellme2,256);
2302 input2.str("");
2303 input2 << tellme2;
2304 fr[1] = (Double_t)atoi(input2.str().c_str());
2305 printf(" -> fr[1] = %f \n",fr[1]);
2306 pllo[0]=0.5; pllo[1]=5.0; pllo[2]=1.0; pllo[3]=0.2;
2307 plhi[0]=8.0; plhi[1]=50.0; plhi[2]=1000000.0; plhi[3]=8.0;
2308 Double_t chisqr;
2309 Int_t fndf;
2310 //
2311 // fit the figure pfmip and put fit results in pfitsnr
2312 //
2313 tempf = langaufit(temp,fr,sv,pllo,plhi,ffp,ffpe,&chisqr,&fndf,"R0");
2314 Double_t SNRPeak = langaupro(ffp);
2315 printf("\n Conversion factor: %f \n",SNRPeak);
2316 tempf->DrawCopy("lsame");
2317 c1->Update();
2318 c1->Modified();
2319 c1->Update();
2320 printf(" Do you want to save this result y/n<enter> ?\n");
2321 cin.getline(tellme,256);
2322 input.str("");
2323 input << tellme;
2324 out.str("y");
2325 if ( !strcmp(input.str().c_str(),out.str().c_str()) ) {
2326 calo->mip[l][m][n] = (float)SNRPeak;
2327 calo->ermip[l][m][n] = (float)ffpe[1];
2328 for (Int_t a = 0; a < 4 ; a++){
2329 calo->fp[a][l][m][n] = (float)ffp[a];
2330 calo->fpe[a][l][m][n] = (float)ffpe[a];
2331 };
2332 calo->ndf[l][m][n] = (float)fndf;
2333 calo->chi2[l][m][n] = (float)chisqr;
2334 //
2335 if ( fndf!=0 && (float)chisqr/(float)fndf < 2. && ffpe[1] < 0.15 && ffp[1] > 15. && ffp[1] < 40. ) {
2336 calo->mask[l][m][n] = 1.;
2337 } else {
2338 calo->mask[l][m][n] = 0.;
2339 };
2340 printf(" Saved! \n");
2341 changed = 1;
2342 };
2343 } else {
2344 printf(" Give the MIP conversion value \n");
2345 cin.getline(tellme2,256);
2346 input2.str("");
2347 input2 << tellme2;
2348 calo->mip[l][m][n] = (Float_t)atoi(input2.str().c_str());
2349 printf(" -> mip = %f \n",calo->mip[l][m][n]);
2350 printf(" Give the mask value \n");
2351 cin.getline(tellme2,256);
2352 input2.str("");
2353 input2 << tellme2;
2354 calo->mask[l][m][n] = (Float_t)atoi(input2.str().c_str());
2355 printf(" -> mask = %f \n",calo->mask[l][m][n]);
2356 changed = 1;
2357 };
2358 out.str("");
2359 out << input.str().c_str();
2360 };
2361 stc.str("b");
2362 if ( !strcmp(input.str().c_str(),stc.str().c_str()) ) {
2363 if ( n > 0 ) {
2364 printf("WARNING: going one figure backward!\n\n");
2365 n -= 2;
2366 } else {
2367 printf("This is the first strip of plane, you can't go backward! \n");
2368 out.str("");
2369 out << input.str().c_str();
2370 };
2371 };
2372 stc.str("j");
2373 if ( !strcmp(input.str().c_str(),stc.str().c_str()) ) {
2374 printf("\n Enter the view number you want to jump to (0 = x, 1 = y): ");
2375 cin.getline(tellme2,256);
2376 input2.str("");
2377 input2 << tellme2;
2378 j = atoi(input2.str().c_str());
2379 if ( j < 0 || j > 1 ) {
2380 printf("\n You can choose between 0 and 1 \n");
2381 out.str("");
2382 out << input.str().c_str();
2383 } else {
2384 printf("\n Enter the plane number you want to jump to (0 to 21): ");
2385 cin.getline(tellme2,256);
2386 input2.str("");
2387 input2 << tellme2;
2388 k = atoi(input2.str().c_str());
2389 if ( k < 0 || k > 21 ) {
2390 printf("\n You can choose between 0 and 21 \n");
2391 out.str("");
2392 out << input.str().c_str();
2393 } else {
2394 printf("\n Enter the strip number you want to jump to (0 to 95): ");
2395 cin.getline(tellme2,256);
2396 input2.str("");
2397 input2 << tellme2;
2398 h = atoi(input2.str().c_str());
2399 if ( h < 0 || h > 95 ) {
2400 printf("\n You can choose between 0 and 95 \n");
2401 out.str("");
2402 out << input.str().c_str();
2403 } else {
2404 printf("\n Jumping to strip %i %i %i \n\n",j,k,h);
2405 goto beginning;
2406 };
2407 };
2408 };
2409 };
2410 //
2411 stc.str("q");
2412 if ( !strcmp(input.str().c_str(),stc.str().c_str()) ) {
2413 printf("Exiting...\n");
2414 goto end;
2415 };
2416 //
2417 stc.str("p");
2418 if ( !strcmp(input.str().c_str(),stc.str().c_str()) ) {
2419 printf("Enter a file extension recognized by ROOT (ps, eps, gif,...):\n");
2420 cin.getline(tellme2,256);
2421 input2.str("");
2422 input2 << tellme2;
2423 out.str("");
2424 out << input.str().c_str();
2425 stringstream figsave;
2426 figsave.str("");
2427 figsave << startingdir << "/mip2adc_";
2428 figsave << l << "_";
2429 figsave << m << "_";
2430 figsave << n << ".";
2431 figsave << input2.str().c_str();
2432 c1->SaveAs(figsave.str().c_str());
2433 printf("\n");
2434 };
2435 };
2436 n++;
2437 };
2438 m++;
2439 };
2440 l++;
2441 };
2442 end: printf("\n");
2443 if ( changed ){
2444 tree->Fill();
2445 hfile->Write();
2446 };
2447 hfile->Close();
2448 }
2449
2450 void FCalo4224MIPVALUES(TString filevalue = "", TString type=""){
2451 const char* startingdir = gSystem->WorkingDirectory();
2452 const char *pam_calib = pathtocalibration();
2453 //
2454 // this routine shows the 4224 figures with fit from the main program
2455 //
2456 stringstream filenome;
2457 filenome.str("");
2458 if ( filevalue == "" ){
2459 filenome << pam_calib << "/CaloADC2MIP.root";
2460 } else {
2461 filenome << filevalue.Data();
2462 };
2463 // EM
2464 const char *file2;
2465 file2 = filenome.str().c_str();
2466 TFile *hfile = 0;
2467 hfile = new TFile(filevalue.Data(),"READ","Calorimeter CALIBRATION data");
2468 CalorimeterCalibration *calo = 0;
2469 TTree *tree;
2470 tree = (TTree*)hfile->Get("CaloADC");
2471 tree->SetBranchAddress("Event", &calo);
2472 Long64_t nevents = tree->GetEntries();
2473 tree->GetEntry(nevents-1);
2474 // EM end
2475 //
2476 TCanvas *c1;
2477 Int_t ty = 1;
2478 if ( type != "" ) ty = 0;
2479 c1 = new TCanvas("canvas","canvas",1200,800);
2480 c1->Draw();
2481 gStyle->SetOptFit(111);
2482 gPad->SetTickx();
2483 gPad->SetTicky();
2484 Int_t k = -1;
2485 Int_t changed = 0;
2486 Float_t mipf[1]={0};
2487 Float_t val[1]={0};
2488 TLatex *text=new TLatex();
2489 TLine *linea;
2490 stringstream testo;
2491 beginning:
2492 Int_t m = 0;
2493 if ( k >= 0 ) m = k;
2494 while ( m < 22 ){
2495 Int_t l = 0;
2496 c1->Clear();
2497 c1->cd();
2498 TMultiGraph *mg = new TMultiGraph();
2499 while ( l < 2){
2500 Int_t n = 0;
2501 while ( n < 96 ){
2502 val[0] = (float)n + 100.*(float)l ;
2503 mipf[0] = (float)calo->mip[l][m][n];
2504 TGraph *graph = new TGraph(1, val, mipf);
2505 graph->SetMarkerColor(2);
2506 graph->SetMarkerStyle(22+l);
2507 graph->SetMarkerSize(0.7);
2508 mg->Add(graph);
2509 printf(" **** STRIP: %i %i %i **** \n",l,m,n);
2510 printf(" MIP: %f \n",calo->mip[l][m][n]);
2511 //printf(" ERMIP: %f \n",calo->ermip[l][m][n]);
2512 //printf(" FP[0-3]: %f / %f / %f / %f \n",calo->fp[0][l][m][n],calo->fp[1][l][m][n],calo->fp[2][l][m][n],calo->fp[3][l][m][n]);
2513 //printf(" FPE[0-3]: %f / %f / %f / %f \n",calo->fpe[0][l][m][n],calo->fpe[1][l][m][n],calo->fpe[2][l][m][n],calo->fpe[3][l][m][n]);
2514 //printf(" CHI2: %f \n",calo->chi2[l][m][n]);
2515 //printf(" NDF: %f \n",calo->ndf[l][m][n]);
2516 //printf(" MASK: %f \n",calo->mask[l][m][n]);
2517 n++;
2518 };
2519 l++;
2520 };
2521 mg->SetMaximum(50.);
2522 mg->SetMinimum(0.);
2523 mg->Draw("AP");
2524 for (Int_t e = 0; e<2 ; e++){
2525 for (Int_t ep = 0; ep<96 ; ep++){
2526 if ( ep%16 == 0 ) {
2527 linea = new TLine((float)ep+100.*(float)e,0.,(float)ep+100.*(float)e,50.);
2528 linea->SetLineColor(15);
2529 linea->SetLineStyle(2);
2530 linea->SetLineWidth(1);
2531 linea->Draw("lsame");
2532 if ( ep > 0 ){
2533 linea = new TLine((float)ep-1.+100.*(float)e,0.,(float)ep-1.+100.*(float)e,50.);
2534 linea->SetLineColor(15);
2535 linea->SetLineStyle(2);
2536 linea->SetLineWidth(1);
2537 linea->Draw("lsame");
2538 };
2539 };
2540 if ( ep == 95 ){
2541 linea = new TLine(95.+100.*(float)e,0.,95.+100.*(float)e,50.);
2542 linea->SetLineColor(15);
2543 linea->SetLineStyle(2);
2544 linea->SetLineWidth(1);
2545 linea->Draw("lsame");
2546 };
2547 };
2548 };
2549 text->SetTextAngle(0);
2550 text->SetTextFont(32);
2551 text->SetTextColor(1);
2552 text->SetTextSize(0.050);
2553 text->SetTextAlign(12);
2554 testo.str("");
2555 testo << "Plane " << m;
2556 text->DrawLatex(85.,52.,testo.str().c_str());
2557 c1->Update();
2558 //
2559 // what to do?
2560 //
2561
2562 char tellme[256];
2563 char tellme2[256];
2564 stringstream input;
2565 stringstream input2;
2566 stringstream out;
2567 stringstream stc;
2568 input.str("a");
2569 out.str("a");
2570 while ( !strcmp(input.str().c_str(),out.str().c_str()) ) {
2571 printf("\nPress <enter> to continue, b<enter> to go backward, j<enter> to jump to a\nfigure, p<enter> to save the figure, q<enter> to quit: \n");
2572 cin.getline(tellme,256);
2573 input.str("");
2574 input << tellme;
2575 out.str("1");
2576 //
2577 stc.str("b");
2578 if ( !strcmp(input.str().c_str(),stc.str().c_str()) ) {
2579 if ( m > 0 ) {
2580 printf("WARNING: going one figure backward!\n\n");
2581 m -= 2;
2582 } else {
2583 printf("This is the first plane, you can't go backward! \n");
2584 out.str("");
2585 out << input.str().c_str();
2586 };
2587 };
2588 stc.str("j");
2589 if ( !strcmp(input.str().c_str(),stc.str().c_str()) ) {
2590 printf("\n Enter the plane number you want to jump to (0 to 21): ");
2591 cin.getline(tellme2,256);
2592 input2.str("");
2593 input2 << tellme2;
2594 k = atoi(input2.str().c_str());
2595 if ( k < 0 || k > 21 ) {
2596 printf("\n You can choose between 0 and 21 \n");
2597 out.str("");
2598 out << input.str().c_str();
2599 } else {
2600 printf("\n Jumping to plane %i \n\n",k);
2601 m = k;
2602 goto beginning;
2603 };
2604 };
2605 //
2606 stc.str("q");
2607 if ( !strcmp(input.str().c_str(),stc.str().c_str()) ) {
2608 printf("Exiting...\n");
2609 goto end;
2610 };
2611 //
2612 stc.str("p");
2613 if ( !strcmp(input.str().c_str(),stc.str().c_str()) ) {
2614 printf("Enter a file extension recognized by ROOT (ps, eps, gif,...):\n");
2615 cin.getline(tellme2,256);
2616 input2.str("");
2617 input2 << tellme2;
2618 out.str("");
2619 out << input.str().c_str();
2620 stringstream figsave;
2621 figsave.str("");
2622 figsave << startingdir << "/mip2adc_plane_";
2623 figsave << m << ".";
2624 figsave << input2.str().c_str();
2625 c1->SaveAs(figsave.str().c_str());
2626 printf("\n");
2627 };
2628 };
2629 m++;
2630 };
2631 end: printf("\n");
2632 if ( changed ){
2633 tree->Fill();
2634 hfile->Write();
2635 };
2636 hfile->Close();
2637 }
2638
2639 void FCalo4224BAK(TString filename){
2640 //
2641 // this shows the 4224 figure from a backup file
2642 //
2643 const char* startingdir = gSystem->WorkingDirectory();
2644 const char *file3 = filename;
2645 TFile hfile3(file3);
2646 Int_t l = 0;
2647 TCanvas *c1;
2648 c1 = new TCanvas("canvas","canvas",800,800);
2649 c1->Draw();
2650 gStyle->SetOptFit(111);
2651 gPad->SetLogy();
2652 Int_t j = 0;
2653 Int_t k = 0;
2654 Int_t h = 0;
2655 beginning:
2656 if ( j ) l = j;
2657 stringstream bmippa;
2658 while ( l < 2){
2659 Int_t m = 0;
2660 if ( k ) m = k;
2661 while ( m < 22 ){
2662 Int_t n =0 ;
2663 if ( h ) n = h;
2664 while ( n < 96 ){
2665 c1->Clear();
2666 c1->cd();
2667 bmippa.str("");
2668 bmippa << "bmip " << l;
2669 bmippa << " " << m;
2670 bmippa << " " << n;
2671 TH1F *temp = (TH1F*)hfile3.Get(bmippa.str().c_str());
2672 j = 0;
2673 k = 0;
2674 h = 0;
2675 temp->DrawCopy();
2676 c1->Update();
2677 //
2678 // what to do?
2679 //
2680 char tellme[256];
2681 char tellme2[256];
2682 stringstream input;
2683 stringstream input2;
2684 stringstream out;
2685 stringstream stc;
2686 input.str("a");
2687 out.str("a");
2688 while ( !strcmp(input.str().c_str(),out.str().c_str()) ) {
2689 printf("\nPress <enter> to continue, b<enter> to go backward, j<enter> to jump to a\nfigure, p<enter> to save the figure, q<enter> to quit: \n");
2690 cin.getline(tellme,256);
2691 input.str("");
2692 input << tellme;
2693 out.str("1");
2694 //
2695 stc.str("b");
2696 if ( !strcmp(input.str().c_str(),stc.str().c_str()) ) {
2697 if ( n > 0 ) {
2698 printf("WARNING: going one figure backward!\n\n");
2699 n -= 2;
2700 } else {
2701 printf("This is the first strip of plane, you can't go backward! \n");
2702 out.str("");
2703 out << input.str().c_str();
2704 };
2705 };
2706 stc.str("j");
2707 if ( !strcmp(input.str().c_str(),stc.str().c_str()) ) {
2708 printf("\n Enter the view number you want to jump to (0 = x, 1 = y): ");
2709 cin.getline(tellme2,256);
2710 input2.str("");
2711 input2 << tellme2;
2712 j = atoi(input2.str().c_str());
2713 if ( j < 0 || j > 1 ) {
2714 printf("\n You can choose between 0 and 1 \n");
2715 out.str("");
2716 out << input.str().c_str();
2717 } else {
2718 printf("\n Enter the plane number you want to jump to (0 to 21): ");
2719 cin.getline(tellme2,256);
2720 input2.str("");
2721 input2 << tellme2;
2722 k = atoi(input2.str().c_str());
2723 if ( k < 0 || k > 21 ) {
2724 printf("\n You can choose between 0 and 21 \n");
2725 out.str("");
2726 out << input.str().c_str();
2727 } else {
2728 printf("\n Enter the strip number you want to jump to (0 to 95): ");
2729 cin.getline(tellme2,256);
2730 input2.str("");
2731 input2 << tellme2;
2732 h = atoi(input2.str().c_str());
2733 if ( h < 0 || h > 95 ) {
2734 printf("\n You can choose between 0 and 95 \n");
2735 out.str("");
2736 out << input.str().c_str();
2737 } else {
2738 printf("\n Jumping to strip %i %i %i \n\n",j,k,h);
2739 goto beginning;
2740 };
2741 };
2742 };
2743 };
2744 //
2745 stc.str("q");
2746 if ( !strcmp(input.str().c_str(),stc.str().c_str()) ) {
2747 printf("Exiting...\n");
2748 goto end;
2749 };
2750 //
2751 stc.str("p");
2752 if ( !strcmp(input.str().c_str(),stc.str().c_str()) ) {
2753 printf("Enter a file extension recognized by ROOT (ps, eps, gif,...):\n");
2754 cin.getline(tellme2,256);
2755 input2.str("");
2756 input2 << tellme2;
2757 out.str("");
2758 out << input.str().c_str();
2759 stringstream figsave;
2760 figsave.str("");
2761 figsave << startingdir << "/mip2adcbak_";
2762 figsave << l << "_";
2763 figsave << m << "_";
2764 figsave << n << ".";
2765 figsave << input2.str().c_str();
2766 c1->SaveAs(figsave.str().c_str());
2767 printf("\n");
2768 };
2769 };
2770 n++;
2771 };
2772 m++;
2773 };
2774 l++;
2775 };
2776 end: printf("\n");
2777 }
2778
2779 void FCaloBAKFIT(TString filename, TString OutDir=""){
2780 const char *pam_calib = pathtocalibration();
2781 if ( !strcmp(OutDir.Data(),"") ){
2782 OutDir = pam_calib;
2783 };
2784 //
2785 // this routine perform the 4224 fit on a backup figure file and save - with extension .bak - the two output file
2786 // in the correct format, ready to be updated etc. etc.
2787 // NB: you will LOSE information about used files
2788 //
2789 stringstream file2;
2790 file2.str("");
2791 file2 << OutDir.Data() << "/CaloADC2MIP.bak";
2792 stringstream file4;
2793 file4.str("");
2794 file4 << OutDir.Data() << "/CaloADC2MIPf.bak";
2795 //
2796 Int_t notgood = 0;
2797 //
2798 TFile *hfile = 0;
2799 CalorimeterCalibration *calo = new CalorimeterCalibration();
2800 hfile = new TFile(file2.str().c_str(),"RECREATE","Calorimeter CALIBRATION data");
2801 if ( !existfile(file2.str().c_str()) ){
2802 printf(" ERROR: Cannot create file!!! \n");
2803 return;
2804 };
2805 TTree *tree = 0;
2806 tree = new TTree("CaloADC","Calorimeter calibration data");
2807 tree->Branch("Event","CalorimeterCalibration",&calo);
2808 //
2809 const char *file3 = filename;
2810 TFile hfile3(file3);
2811 TCanvas *c1;
2812 c1 = new TCanvas("canvas","canvas",800,800);
2813 c1->Draw();
2814 gStyle->SetOptFit(111);
2815 TH1F *pfmip[2][22][96];
2816 TF1 *pfitsnr[2][22][96];
2817 stringstream Fmip;
2818 for (Int_t i=0; i<2;i++){
2819 for (Int_t j=0; j<22;j++){
2820 for (Int_t m=0; m<96;m++){
2821 Fmip.str("");
2822 Fmip << "Fmip " << i;
2823 Fmip << " " << j;
2824 Fmip << " " << m;
2825 pfmip[i][j][m] = new TH1F(Fmip.str().c_str(),"",56,0.,55.);
2826 pfitsnr[i][j][m] = new TF1;
2827 };
2828 };
2829 };
2830 gStyle->SetOptFit(111);
2831 gPad->SetLogy();
2832 //
2833 Int_t l = 0;
2834 stringstream bmippa;
2835 while ( l < 2){
2836 Int_t m = 0;
2837 while ( m < 22 ){
2838 Int_t n =0 ;
2839 Double_t SNRPeak = 0.;
2840 while ( n < 96 ){
2841 c1->Clear();
2842 c1->cd();
2843 bmippa.str("");
2844 bmippa << "bmip " << l;
2845 bmippa << " " << m;
2846 bmippa << " " << n;
2847 TH1F *temp = (TH1F*)hfile3.Get(bmippa.str().c_str());
2848 bmippa.str("");
2849 bmippa << "fmip " << l;
2850 bmippa << " " << m;
2851 bmippa << " " << n;
2852 pfmip[l][m][n] = (TH1F*)temp->Clone(bmippa.str().c_str());
2853 Int_t doitagain = 0;
2854 Int_t ndoitagain = 0;
2855 Double_t fr[2];
2856 Double_t sv[4], pllo[4], plhi[4], fp[4], fpe[4];
2857 // if ( SNRPeak > 16. && SNRPeak < 35. ){
2858 if ( SNRPeak > 16. && SNRPeak < 35. && fp[3] < 8. ){
2859 fr[0] = (Float_t)SNRPeak - 7.;
2860 sv[0]= fp[0];
2861 sv[1]= fp[1];
2862 sv[2]= fp[2];
2863 sv[3]= fp[3];
2864 } else {
2865 fr[0] = 12.5;
2866 sv[0] = 2.8;
2867 sv[1] = 23.0;
2868 sv[2] = 1000.0;
2869 sv[3] = 0.1;
2870 };
2871 fr[1] = 50.;
2872 // fr[1] = 60.;
2873 fitting: printf("Fitting strip %i %i %i \n",l,m,n);
2874 pllo[0]=0.5; pllo[1]=5.0; pllo[2]=1.0; pllo[3]=0.2;
2875 plhi[0]=15.0; plhi[1]=50.0; plhi[2]=1000000.0; plhi[3]=8.0;
2876 Double_t chisqr;
2877 Int_t ndf;
2878 pfitsnr[l][m][n] = langaufit(pfmip[l][m][n],fr,sv,pllo,plhi,fp,fpe,&chisqr,&ndf,"QR0");
2879 //
2880 Double_t SNRPeak = langaupro(fp);
2881 printf("\n Conversion factor: %f \n\n",SNRPeak);
2882 //
2883 c1->cd();
2884 pfmip[l][m][n]->DrawCopy();
2885 pfitsnr[l][m][n]->DrawCopy("lsame");
2886 c1->Modified();
2887 c1->Update();
2888 //
2889 //
2890 if ( (SNRPeak<0. || (SNRPeak < 16. || SNRPeak > 35.) || chisqr > 100.) && doitagain < 11 ){
2891 printf("\n The fit is not good, I will try again, step %i \n\n",doitagain);
2892 doitagain++;
2893 if ( chisqr > 100. ) {
2894 if ( fr[0] < 20. && !(doitagain%2) ) fr[0] += 1.;
2895 if ( fr[1] > 35. && doitagain%2 ) fr[1] -= 3.;
2896 // if ( doitagain > 1 ) fr[1] = 35.;
2897 sv[0] = fp[0];
2898 sv[1] = fp[1];
2899 sv[2] = fp[2];
2900 sv[3] = fp[3];
2901 printf(" chi \n");
2902 goto fitting;
2903 };
2904 ndoitagain++;
2905 if ( ndoitagain == 1 ) {
2906 fr[0] = 19.;
2907 sv[0] = 2.8;
2908 sv[1] = 21.0;
2909 sv[2] = 1000.0;
2910 sv[3] = 0.1;
2911 printf(" uno \n");
2912 goto fitting;
2913 };
2914 if ( ndoitagain == 2 ) {
2915 fr[0] = 22.;
2916 sv[0] = 2.8;
2917 sv[1] = 25.0;
2918 sv[2] = 1000.0;
2919 sv[3] = 0.1;
2920 printf(" due \n");
2921 goto fitting;
2922 };
2923 if ( ndoitagain == 3 ) {
2924 fr[0] = 12.;
2925 sv[0] = 2.8;
2926 sv[1] = 15.0;
2927 sv[2] = 1000.0;
2928 sv[3] = 0.1;
2929 printf(" tre \n");
2930 goto fitting;
2931 };
2932 };
2933 //
2934 calo->mip[l][m][n] = (float)SNRPeak;
2935 calo->ermip[l][m][n] = (float)fpe[1];
2936 for (Int_t a = 0; a < 4 ; a++){
2937 calo->fp[a][l][m][n] = (float)fp[a];
2938 calo->fpe[a][l][m][n] = (float)fpe[a];
2939 };
2940 calo->ndf[l][m][n] = (float)ndf;
2941 calo->chi2[l][m][n] = (float)chisqr;
2942 //
2943 if ( ndf!=0 && chisqr/ndf < 2. && fpe[1] < 0.15 && fp[1] > 15. && fp[1] < 40. && SNRPeak > 0. ) {
2944 printf("\n THIS IS A GOOD FIT, SAVED! \n\n");
2945 calo->mask[l][m][n] = 1.;
2946 } else {
2947 notgood++;
2948 calo->mask[l][m][n] = 0.;
2949 };
2950 printf("Fitting done, strip %i %i %i \n\n\n",l,m,n);
2951 c1->cd();
2952 pfmip[l][m][n]->DrawCopy();
2953 pfitsnr[l][m][n]->DrawCopy("lsame");
2954 c1->Modified();
2955 c1->Update();
2956 n++;
2957 };
2958 m++;
2959 };
2960 l++;
2961 };
2962 //
2963 calo->status = 0;
2964 if ( !notgood ) calo->status = 1;
2965 //
2966 tree->Fill();
2967 hfile->Write();
2968 hfile->Close();
2969 //
2970 // Save histograms
2971 //
2972 TFile *hfile2;
2973 hfile2 = new TFile(file4.str().c_str(),"RECREATE","Calorimeter CALIBRATION figures");
2974 if ( !existfile(file4.str().c_str()) ){
2975 printf(" ERROR: Cannot create file!!! \n");
2976 return;
2977 };
2978 TH1F *sfmip[2][22][96];
2979 TF1 *sfitsnr[2][22][96];
2980 stringstream fmipfi;
2981 for (Int_t l = 0; l < 2; l++){
2982 for (Int_t m = 0; m < 22; m++){
2983 for (Int_t n =0 ; n < 96; n++){
2984 fmipfi.str("");
2985 fmipfi << "fmip " << l;
2986 fmipfi << " " << m;
2987 fmipfi << " " << n;
2988 sfmip[l][m][n] = new TH1F(fmipfi.str().c_str(),"",56,0.,55.);
2989 sfmip[l][m][n] = (TH1F*)pfmip[l][m][n]->Clone(fmipfi.str().c_str());
2990 fmipfi.str("");
2991 fmipfi << "fit " << l;
2992 fmipfi << " " << m;
2993 fmipfi << " " << n;
2994 sfitsnr[l][m][n] = (TF1*)pfitsnr[l][m][n]->Clone(fmipfi.str().c_str());
2995 sfmip[l][m][n]->Write();
2996 sfitsnr[l][m][n]->Write();
2997 };
2998 };
2999 };
3000 hfile2->Close();
3001 printf("\n");
3002 hfile3.Close();
3003 FCalo4224STATUS("CaloADC2MIP.bak","");
3004 }
3005
3006 void FCaloROOT2TXT(TString rootple, TString txtple){
3007 FILE *f;
3008 f = fopen(txtple.Data(),"wb");
3009 TTree *ctree = 0;
3010 TFile *chfile;
3011 CalorimeterCalibration *ccalo = new CalorimeterCalibration();
3012 chfile = new TFile(rootple.Data(),"READ","Calorimeter CALIBRATION data");
3013 if ( chfile->IsZombie() ){
3014 printf(" ERROR: no calorimeter calibration file! \n");
3015 } else {
3016 ctree = (TTree*)chfile->Get("CaloADC");
3017 ctree->SetBranchAddress("Event", &ccalo);
3018 //
3019 Long64_t cnevents = ctree->GetEntries();
3020 ctree->GetEntry(cnevents-1);
3021 };
3022 //
3023 Float_t mip = 0.;
3024 for (Int_t m = 0; m < 2 ; m++ ){
3025 for (Int_t k = 0; k < 22; k++ ){
3026 for (Int_t l = 0; l < 96; l++ ){
3027 mip = 0.;
3028 // if ( (ccalo->fp[1][m][k][l] > 20. && ccalo->fp[1][m][k][l] < 32.) || ccalo->mask[m][k][l] == 1. ) {
3029 // if ( (ccalo->fp[1][m][k][l] > 15. && ccalo->fp[1][m][k][l] < 45.) || ccalo->mask[m][k][l] == 1. ) {
3030 mip = ccalo->mip[m][k][l];
3031 // } else {
3032 // mip = 26. ;
3033 // mip = 28. ;
3034 // };
3035 // if ( mip == 0 ) mip = 26. ;
3036 // if ( mip == 0 ) mip = 28. ;
3037 // if ( m == 1 && k == 17 ) printf(" %i mip = %f \n",l,mip);
3038 fwrite(&mip,sizeof(mip),1,f);
3039 };
3040 };
3041 };
3042 fclose(f);
3043 }
3044
3045 void FCaloREADTXT(TString txtple){
3046 FILE *f;
3047 f = fopen(txtple.Data(),"rb");
3048 Float_t mip = 0.;
3049 Float_t tmip = 0.;
3050 for (Int_t m = 0; m < 2 ; m++ ){
3051 for (Int_t k = 0; k < 22; k++ ){
3052 for (Int_t l = 0; l < 96; l++ ){
3053 mip = 0.;
3054 fread(&mip,sizeof(mip),1,f);
3055 tmip += mip;
3056 printf(" m %i k %i l %i mip %f \n",m,k,l,mip);
3057 // if ( m == 1 && k == 17 ) printf(" %i mip = %f \n",l,mip);
3058 };
3059 };
3060 };
3061 fclose(f);
3062 //
3063 printf(" Average mip is %f \n",tmip/4224.);
3064 //
3065 }
3066
3067 void FCaloALIG2DAT(TString txtple){
3068 // clevel1_.xalig = 121.1;
3069 // clevel1_.yalig = 119.8;
3070 // clevel1_.zalig = -263.1;
3071 char value[256];
3072 Int_t ixalig;
3073 Int_t iyalig;
3074 Int_t izalig;
3075 Int_t iemip;
3076 Float_t xalig;
3077 Float_t yalig;
3078 Float_t zalig;
3079 Float_t emip;
3080 //
3081 FILE *f;
3082 f = fopen(txtple.Data(),"wb");
3083 //
3084 printf("\n Insert parameters in microns \n");
3085 printf("\n Insert the x alignment parameter: \n");
3086 cin.getline(value,256);
3087 ixalig = atoi(value);
3088 xalig = (Float_t)ixalig/1000.;
3089 fwrite(&xalig,sizeof(xalig),1,f);
3090 printf(" xalig = %f mm\n",xalig);
3091 //
3092 printf("\n Insert the y alignment parameter: \n");
3093 cin.getline(value,256);
3094 iyalig = atoi(value);
3095 yalig = (Float_t)iyalig/1000.;
3096 fwrite(&yalig,sizeof(yalig),1,f);
3097 printf(" yalig = %f mm\n",yalig);
3098 //
3099 printf("\n Insert the z alignment parameter: \n");
3100 cin.getline(value,256);
3101 izalig = atoi(value);
3102 zalig = (Float_t)izalig/1000.;
3103 fwrite(&zalig,sizeof(zalig),1,f);
3104 printf(" zalig = %f mm\n",zalig);
3105 //
3106 printf("\n Insert the signal/noise threshold (times 1000): \n");
3107 cin.getline(value,256);
3108 iemip = atoi(value);
3109 emip = (Float_t)iemip/1000.;
3110 fwrite(&emip,sizeof(emip),1,f);
3111 printf(" emip = %f mip \n",emip);
3112 //
3113 fclose(f);
3114 }
3115
3116 void FCaloREADALIG(TString txtple){
3117 FILE *f;
3118 f = fopen(txtple.Data(),"rb");
3119 Float_t mip = 0.;
3120 fread(&mip,sizeof(mip),1,f);
3121 printf(" xalig = %f \n",mip);
3122 mip = 0.;
3123 fread(&mip,sizeof(mip),1,f);
3124 printf(" yalig = %f \n",mip);
3125 mip = 0.;
3126 fread(&mip,sizeof(mip),1,f);
3127 printf(" zalig = %f \n",mip);
3128 mip = 0.;
3129 fread(&mip,sizeof(mip),1,f);
3130 printf(" signal threshold = %f \n",mip);
3131 fclose(f);
3132 }

  ViewVC Help
Powered by ViewVC 1.1.23