/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Mdc/MdcCalibAlg/MdcCalibAlg-00-09-02/share/distcalib/src/IniCalib.cpp

Go to the documentation of this file.
00001 #include "include/IniCalib.h"
00002 #include "include/fun.h"
00003 #include <cmath>
00004 
00005 #include "TF1.h"
00006 #include "TStyle.h"
00007 
00008 IniCalib::IniCalib(){
00009      cout << "Calibration type: IniCalib" << endl;
00010 }
00011 
00012 IniCalib::~IniCalib(){
00013 }
00014 
00015 void IniCalib::init(TObjArray* hlist, MdcCosGeom* pGeom){
00016      m_pGeom = pGeom;
00017      char hname[200];
00018      m_fdcom = new TFolder("mCommon", "mCommon");
00019      hlist->Add(m_fdcom);
00020 
00021      m_fdTmap = new TFolder("mThitmap", "mThitmap");
00022      hlist->Add(m_fdTmap);
00023 
00024      m_fdTraw = new TFolder("mTraw", "mTraw");
00025      hlist->Add(m_fdTraw);
00026 
00027      m_fdTrawCel = new TFolder("mTrawCell", "mTrawCell");
00028      hlist->Add(m_fdTrawCel);
00029 
00030      m_fdQmap = new TFolder("mQhitmap", "mQhitmap");
00031      hlist->Add(m_fdQmap);
00032 
00033      m_fdQraw = new TFolder("mQraw", "mQraw");
00034      hlist->Add(m_fdQraw);
00035 
00036      m_fdQrawCel = new TFolder("mQrawCell", "mQrawCell");
00037      hlist->Add(m_fdQrawCel);
00038 
00039      m_hLayerHitmapT = new TH1F("mT_Hitmap_Layer", "", 43, -0.5, 42.5);
00040      m_fdcom->Add(m_hLayerHitmapT);
00041                 
00042      m_hWireHitMapT = new TH1F("mT_Hitmap_Wire", "", 6796, -0.5, 6795.5);
00043      m_fdcom->Add(m_hWireHitMapT);
00044 
00045      m_hLayerHitmapQ = new TH1F("mQ_Hitmap_Layer", "", 43, -0.5, 42.5);
00046      m_fdcom->Add(m_hLayerHitmapQ);
00047                 
00048      m_hWireHitMapQ = new TH1F("mQ_Hitmap_Wire", "", 6796, -0.5, 6795.5);
00049      m_fdcom->Add(m_hWireHitMapQ);
00050 
00051      m_hTesAll = new TH1F("mTesAll", "", 750, 0, 1500);
00052      m_fdcom->Add(m_hTesAll);
00053 
00054      m_hTesCal = new TH1F("mTesCal", "", 750, 0, 1500);
00055      m_fdcom->Add(m_hTesCal);
00056 
00057      m_hTesFlag = new TH1F("mTes_Flag", "", 300, -0.5, 299.5);
00058      m_fdcom->Add(m_hTesFlag);
00059 
00060      for(int lay=0; lay<NLAYER; lay++){
00061           int ncel = pGeom->getLayer(lay)->getNcell();
00062 
00063           sprintf(hname, "mT_hitmap_Lay%02d", lay);
00064           m_hlaymapT[lay] = new TH1F(hname, "", ncel, -0.5, (float)ncel-0.5);
00065           m_fdTmap -> Add(m_hlaymapT[lay]);
00066 
00067           sprintf(hname, "mTDC_Lay%02d", lay);
00068           m_htdc[lay] = new TH1F(hname, "", 800, 0, 20000);
00069           m_fdTraw -> Add(m_htdc[lay]);
00070 
00071           sprintf(hname, "mTraw_Lay%02d", lay);
00072           m_htraw[lay] = new TH1F(hname, "", 500, 0, 1000);
00073           m_fdTraw -> Add(m_htraw[lay]);
00074 
00075           sprintf(hname, "mQ_hitmap_Lay%02d", lay);
00076           m_hlaymapQ[lay] = new TH1F(hname, "", ncel, -0.5, (float)ncel-0.5);
00077           m_fdQmap -> Add(m_hlaymapQ[lay]);
00078 
00079           sprintf(hname, "mQraw_Lay%02d", lay);
00080           m_hqraw[lay] = new TH1F(hname, "", 2000, 0, 4000);
00081           m_fdQraw -> Add(m_hqraw[lay]);
00082      }
00083 
00084      for(int wir=0; wir<NWIRE; wir++){
00085           int lay = m_pGeom -> getWire(wir) -> getLayerId();
00086           int cel = m_pGeom -> getWire(wir) -> getCellId();
00087 
00088           sprintf(hname, "mTraw_%02d_%03d_%04d", lay, cel, wir);
00089           m_htrawCel[wir] = new TH1F(hname, "", 300, 0, 600);
00090           m_fdTrawCel -> Add(m_htrawCel[wir]);
00091 
00092           sprintf(hname, "mQraw_%02d_%03d_%04d", lay, cel, wir);
00093           m_hqrawCel[wir] = new TH1F(hname, "", 2000, 0, 4000);
00094           m_fdQrawCel -> Add(m_hqrawCel[wir]);
00095      }
00096 }
00097 
00098 void IniCalib::mergeHist(TFile* fhist){
00099      TFolder* fdcom = (TFolder*)fhist->Get("Common");
00100      TFolder* fdTmap = (TFolder*)fhist->Get("Thitmap");
00101      TFolder* fdTraw = (TFolder*)fhist->Get("Traw");
00102      TFolder* fdTrawCel = (TFolder*)fhist->Get("TrawCell");
00103      TFolder* fdQmap = (TFolder*)fhist->Get("Qhitmap");
00104      TFolder* fdQraw = (TFolder*)fhist->Get("Qraw");
00105      TFolder* fdQrawCel = (TFolder*)fhist->Get("QrawCell");
00106 
00107      char hname[200];
00108      TH1F* hist;
00109      hist = (TH1F*)fdcom->FindObjectAny("T_Hitmap_Layer");
00110      m_hLayerHitmapT->Add(hist);
00111 
00112      hist = (TH1F*)fdcom->FindObjectAny("T_Hitmap_Wire");
00113      m_hWireHitMapT->Add(hist);
00114 
00115      hist = (TH1F*)fdcom->FindObjectAny("Q_Hitmap_Layer");
00116      m_hLayerHitmapQ->Add(hist);
00117 
00118      hist = (TH1F*)fdcom->FindObjectAny("Q_Hitmap_Wire");
00119      m_hWireHitMapQ->Add(hist);
00120 
00121      hist = (TH1F*)fdcom->FindObjectAny("TesAll");
00122      m_hTesAll->Add(hist);
00123 
00124      hist = (TH1F*)fdcom->FindObjectAny("TesCal");
00125      m_hTesCal->Add(hist);
00126 
00127      hist = (TH1F*)fdcom->FindObjectAny("Tes_Flag");
00128      m_hTesFlag->Add(hist);
00129 
00130      for(int lay=0; lay<NLAYER; lay++){
00131           sprintf(hname, "T_hitmap_Lay%02d", lay);
00132           hist = (TH1F*)fdTmap->FindObjectAny(hname);
00133           m_hlaymapT[lay]->Add(hist);
00134 
00135           sprintf(hname, "TDC_Lay%02d", lay);
00136           hist = (TH1F*)fdTraw->FindObjectAny(hname);
00137           m_htdc[lay]->Add(hist);
00138 
00139           sprintf(hname, "Traw_Lay%02d", lay);
00140           hist = (TH1F*)fdTraw->FindObjectAny(hname);
00141           m_htraw[lay]->Add(hist);
00142 
00143           sprintf(hname, "Q_hitmap_Lay%02d", lay);
00144           hist = (TH1F*)fdQmap->FindObjectAny(hname);
00145           m_hlaymapQ[lay]->Add(hist);
00146 
00147           sprintf(hname, "Qraw_Lay%02d", lay);
00148           hist = (TH1F*)fdQraw->FindObjectAny(hname);
00149           m_hqraw[lay]->Add(hist);
00150      }
00151 
00152      for(int wir=0; wir<NWIRE; wir++){
00153           int lay = m_pGeom -> getWire(wir) -> getLayerId();
00154           int cel = m_pGeom -> getWire(wir) -> getCellId();
00155 
00156           sprintf(hname, "Traw_%02d_%03d_%04d", lay, cel, wir);
00157           hist = (TH1F*)fdTrawCel->FindObjectAny(hname);
00158           m_htrawCel[wir]->Add(hist);
00159 
00160           sprintf(hname, "Qraw_%02d_%03d_%04d", lay, cel, wir);
00161           hist = (TH1F*)fdQrawCel->FindObjectAny(hname);
00162           m_hqrawCel[wir]->Add(hist);
00163      }
00164 }
00165 
00166 void IniCalib::calib(MdcCalibConst* calconst, TObjArray* newXtList, TObjArray* r2tList){
00167      int lay;
00168      int wir;
00169      double t0Fit[NLAYER];
00170      double t0Cal[NLAYER];
00171      double tmax[NLAYER];
00172      double initT0 = gInitT0;
00173 
00174      int fitTminFg[NLAYER];
00175      int fitTmaxFg[NLAYER];
00176      double chisq;
00177      double ndf;
00178      double chindfTmin[NLAYER];
00179      double chindfTmax[NLAYER];
00180      char funname[200];
00181 
00182      // fit Tmin
00183      TF1* ftmin[NLAYER];
00184      for(lay=0; lay<NLAYER; lay++){
00185           fitTminFg[lay] = 0;
00186           chindfTmin[lay] = -1;
00187           sprintf(funname, "ftmin%02d", lay);
00188           ftmin[lay] = new TF1(funname, funTmin, 0, 150, 6);
00189 
00190           if(1 == gFgCalib[lay]){
00191                Stat_t nEntryTot = 0;
00192                for(int ibin=1; ibin<=25; ibin++){
00193                     Stat_t entry = m_htraw[lay]->GetBinContent(ibin);
00194                     nEntryTot += entry;
00195                }
00196                double c0Ini = (double)nEntryTot / 25.0;
00197                double c1Ini = (m_htraw[lay]->GetMaximum()) - c0Ini;
00198 
00199                ftmin[lay] -> SetParameter(0, c0Ini);
00200                ftmin[lay] -> SetParameter(1, c1Ini);
00201                ftmin[lay] -> SetParameter(2, 0);
00202                ftmin[lay] -> SetParameter(4, initT0);
00203                ftmin[lay] -> SetParameter(5, 1);
00204 
00205                m_htraw[lay] -> Fit(funname, "Q", "", gTminFitRange[lay][0], gTminFitRange[lay][1]);
00206                gStyle -> SetOptFit(11);
00207                chisq = ftmin[lay]->GetChisquare();
00208                ndf = ftmin[lay]->GetNDF();
00209                chindfTmin[lay] = chisq / ndf;
00210                if(chindfTmin[lay] < gTminFitChindf){
00211                     fitTminFg[lay] = 1;
00212                     t0Fit[lay] = ftmin[lay]->GetParameter(4);
00213                     t0Fit[lay] += gT0Shift;
00214                     t0Cal[lay] = t0Fit[lay] - gTimeShift;
00215                }
00216           }
00217 
00218           if(0 == fitTminFg[lay]){
00219                wir = m_pGeom->getWire(lay, 0)->getWireId();
00220                t0Cal[lay] = calconst->getT0(wir);
00221                t0Fit[lay] = t0Cal[lay] + gTimeShift;
00222           }
00223      }
00224 
00225      // fit Tmax
00226      TF1* ftmax[NLAYER];
00227      for(lay=0; lay<NLAYER; lay++){
00228           fitTmaxFg[lay] = 0;
00229           chindfTmax[lay] = -1;
00230           sprintf(funname, "ftmax%02d", lay);
00231           ftmax[lay] = new TF1(funname, funTmax, 250, 500, 4);
00232 
00233           if(1 == gFgCalib[lay]){
00234                ftmax[lay] -> SetParameter(2, gInitTm[lay]);
00235                ftmax[lay] -> SetParameter(3, 10);
00236 
00237                m_htraw[lay] -> Fit(funname, "Q+", "", gTmaxFitRange[lay][0], gTmaxFitRange[lay][1]);
00238                gStyle -> SetOptFit(11);
00239                chisq = ftmax[lay]->GetChisquare();
00240                ndf = ftmax[lay]->GetNDF();
00241                chindfTmax[lay] = chisq / ndf;
00242                if(chindfTmax[lay] < gTmaxFitChindf){
00243                     fitTmaxFg[lay] = 1;
00244                     tmax[lay] = ftmax[lay]->GetParameter(2);
00245                }
00246           }
00247 
00248           if(0 == fitTmaxFg[lay]){
00249                tmax[lay] = (calconst->getXtpar(lay, 0, 0, 6)) + t0Fit[lay];
00250           }
00251      }
00252 
00253      // output for check
00254      ofstream ft0("iniT0.dat");
00255      for(lay=0; lay<NLAYER; lay++){
00256           ft0 << setw(5) << lay << setw(3) << fitTminFg[lay]
00257               << setw(12) << t0Cal[lay] << setw(12) << t0Fit[lay]
00258               << setw(12) << chindfTmin[lay] << setw(5) << fitTmaxFg[lay]
00259               << setw(12) << tmax[lay] << setw(12) << tmax[lay] - t0Fit[lay]
00260               << setw(12) << chindfTmax[lay] << endl;
00261      }
00262      ft0.close();
00263      cout << "iniT0.dat was written." << endl;
00264 
00265      // set T0
00266      int i;
00267      int nwire = m_pGeom -> getWireSize();
00268      for(i=0; i<nwire; i++){
00269           lay = m_pGeom -> getWire(i) -> getLayerId();
00270           if(1 == gFgCalib[lay]){
00271                calconst -> resetT0(i, t0Cal[lay]);
00272                calconst -> resetDelT0(i, 0.0);
00273           }
00274      }
00275 
00276      if(0 == gFgIniCalConst){
00277           // set X-T
00278           int lr;
00279           int iEntr;
00280           int ord;
00281           double xtpar;
00282           double xtini[8] = {0, 0.03, 0, 0, 0, 0, 999.9, 0};
00283           for(lay=0; lay<NLAYER; lay++){
00284                if(1 != gFgCalib[lay]) continue;
00285 
00286                for(iEntr=0; iEntr<NENTRXT; iEntr++){
00287                     for(lr=0; lr<NLR; lr++){
00288                          for(ord=0; ord<NXTPAR; ord++){
00289                               if(6 == ord){
00290                                    xtpar = tmax[lay] - t0Fit[lay];
00291                               } else{
00292                                    xtpar = xtini[ord];
00293                               }
00294                               calconst -> resetXtpar(lay, iEntr, lr, ord, xtpar);
00295                          }
00296                     }
00297                }
00298           }
00299 
00300           // set Q-T
00301           for(lay=0; lay<NLAYER; lay++){
00302                calconst -> resetQtpar0(lay, 0.0);
00303                calconst -> resetQtpar1(lay, 0.0);
00304           }
00305 
00306           // set S-D
00307           int bin;
00308           double sdpar = 0.18;  // mm
00309           for(lay=0; lay<NLAYER; lay++){
00310                for(iEntr=0; iEntr<NENTRSD; iEntr++){
00311                     for(lr=0; lr<2; lr++){
00312                          for(bin=0; bin<NSDBIN; bin++){
00313                               calconst -> resetSdpar(lay, iEntr, lr, bin, sdpar);
00314                          }
00315                     }
00316                }
00317           }
00318      } else if(2 == gFgIniCalConst){
00319           int lr;
00320           int iEntr;
00321           double xtpar;
00322           for(lay=0; lay<NLAYER; lay++){
00323                for(iEntr=0; iEntr<NENTRXT; iEntr++){
00324                     for(lr=0; lr<NLR; lr++){
00325                          xtpar = tmax[lay] - t0Fit[lay];
00326                          calconst -> resetXtpar(lay, iEntr, lr, 6, xtpar);
00327                     }
00328                }
00329           }
00330      }
00331 
00332      renameHist();
00333      for(lay=0; lay<NLAYER; lay++){
00334           delete ftmin[lay];
00335           delete ftmax[lay];
00336      }
00337 }
00338 
00339 Double_t IniCalib::funTmin(Double_t* x, Double_t* par){
00340      Double_t fitval;
00341      fitval = par[0] + par[1]*exp( -par[2]*(x[0]-par[3]) ) /
00342           ( 1 + exp( -(x[0]-par[4])/par[5] ));
00343      return fitval;
00344 }
00345 
00346 Double_t IniCalib::funTmax(Double_t* x, Double_t* par){
00347      Double_t fitval;
00348      fitval = par[0] + par[1] / (1 + exp((x[0]-par[2])/par[3]));
00349      return fitval;
00350 }
00351 
00352 void IniCalib::renameHist(){
00353      char hname[200];
00354      m_fdcom->SetName("Common");
00355      m_fdTmap->SetName("Thitmap");
00356      m_fdTraw->SetName("Traw");
00357      m_fdTrawCel->SetName("TrawCell");
00358      m_fdQmap->SetName("Qhitmap");
00359      m_fdQraw->SetName("Qraw");
00360      m_fdQrawCel->SetName("QrawCell");
00361 
00362      m_hLayerHitmapT->SetName("T_Hitmap_Layer");
00363      m_hWireHitMapT->SetName("T_Hitmap_Wire");
00364      m_hLayerHitmapQ->SetName("Q_Hitmap_Layer");
00365      m_hWireHitMapQ->SetName("Q_Hitmap_Wire");
00366      m_hTesAll->SetName("TesAll");
00367      m_hTesCal->SetName("TesCal");
00368      m_hTesFlag->SetName("Tes_Flag");
00369 
00370      for(int lay=0; lay<NLAYER; lay++){
00371           sprintf(hname, "T_hitmap_Lay%02d", lay);
00372           m_hlaymapT[lay]->SetName(hname);
00373 
00374           sprintf(hname, "TDC_Lay%02d", lay);
00375           m_htdc[lay]->SetName(hname);
00376 
00377           sprintf(hname, "Traw_Lay%02d", lay);
00378           m_htraw[lay]->SetName(hname);
00379 
00380           sprintf(hname, "Q_hitmap_Lay%02d", lay);
00381           m_hlaymapQ[lay]->SetName(hname);
00382 
00383           sprintf(hname, "Qraw_Lay%02d", lay);
00384           m_hqraw[lay]->SetName(hname);
00385      }
00386      for(int wir=0; wir<NWIRE; wir++){
00387           int lay = m_pGeom -> getWire(wir) -> getLayerId();
00388           int cel = m_pGeom -> getWire(wir) -> getCellId();
00389 
00390           sprintf(hname, "Traw_%02d_%03d_%04d", lay, cel, wir);
00391           m_htrawCel[wir]->SetName(hname);
00392 
00393           sprintf(hname, "Qraw_%02d_%03d_%04d", lay, cel, wir);
00394           m_hqrawCel[wir]->SetName(hname);
00395      }
00396 }

Generated on Tue Nov 29 23:12:49 2016 for BOSS_7.0.2 by  doxygen 1.4.7