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

Go to the documentation of this file.
00001 #include "include/PreXtCalib.h"
00002 #include "include/fun.h"
00003 #include <math.h>
00004 
00005 #include "TF1.h"
00006 #include "TStyle.h"
00007 
00008 PreXtCalib::PreXtCalib(){
00009      cout << "Calibration type: PreXtCalib" << endl;
00010 }
00011 
00012 PreXtCalib::~PreXtCalib(){
00013 }
00014 
00015 void PreXtCalib::init(TObjArray* hlist, MdcCosGeom* pGeom){
00016      m_pGeom = pGeom;
00017 
00018      double twid = 10.0;        // ns
00019      for(int bin=0; bin<NPreXtBin; bin++)  m_tbin[bin] = (double)(bin+1) * twid;
00020 
00021      m_fdPreXt = new TFolder("mPreXt", "PreXt");
00022      hlist->Add(m_fdPreXt);
00023 
00024      m_fdNhit = new TFolder("mXtNhit", "XtNhit");
00025      hlist->Add(m_fdNhit);
00026 
00027      m_haxis = new TH2F("maxis", "", 50, 0, 300, 50, 0, 9);
00028      m_haxis -> SetStats(0);
00029      m_fdPreXt -> Add(m_haxis);
00030 
00031      m_nhitTot = new TH1F("mnhitTot", "", 43, -0.5, 42.5);
00032      m_fdNhit -> Add(m_nhitTot);
00033 
00034      char hname[200];
00035      for(int lay=0; lay<NLAYER; lay++){
00036           sprintf(hname, "mtrec%02d", lay);
00037           m_htrec[lay] = new TH1F(hname, "", 310, -20, 600);
00038           m_fdPreXt -> Add(m_htrec[lay]);
00039 
00040           sprintf(hname, "mnhitBin%02d", lay);
00041           m_nhitBin[lay] = new TH1F(hname, "", 40, 5.0, 405.0);
00042           m_fdNhit -> Add(m_nhitBin[lay]);
00043      }
00044 }
00045 
00046 void PreXtCalib::mergeHist(TFile* fhist){
00047      TFolder* fdPreXt = (TFolder*)fhist->Get("PreXt");
00048      TFolder* fdNhit = (TFolder*)fhist->Get("XtNhit");
00049 
00050      char hname[200];
00051      TH1F* hist;
00052      for(int lay=0; lay<NLAYER; lay++){
00053           sprintf(hname, "trec%02d", lay);
00054           hist = (TH1F*)fdPreXt->FindObjectAny(hname);
00055           m_htrec[lay]->Add(hist);
00056 
00057           sprintf(hname, "nhitBin%02d", lay);
00058           hist = (TH1F*)fdNhit->FindObjectAny(hname);
00059           m_nhitBin[lay]->Add(hist);
00060      }
00061 
00062      hist = (TH1F*)fdNhit->FindObjectAny("nhitTot");
00063      m_nhitTot->Add(hist);
00064 }
00065 
00066 void PreXtCalib::calib(MdcCalibConst* calconst, TObjArray* newXtList, TObjArray* r2tList){
00067      double pi = 3.141592653;
00068      double dist[NPreXtBin];
00069      double xtpar[6];
00070      char hname[200];
00071 
00072      TF1* funXt = new TF1("funXt", xtfun, 0, 300, 6);
00073      funXt -> FixParameter(0, 0.0);
00074      funXt -> SetParameter(1, 0.03);
00075      funXt -> SetParameter(2, 0.0);
00076      funXt -> SetParameter(3, 0.0);
00077      funXt -> SetParameter(4, 0.0);
00078      funXt -> SetParameter(5, 0.0);
00079 
00080      ofstream fxtlog("preXtpar.dat");
00081      for(int lay=0; lay<NLAYER; lay++){
00082           sprintf(hname, "mgrPreXt%02d", lay);
00083           m_grXt[lay] = new TGraph();
00084           m_grXt[lay] -> SetName(hname);
00085           m_grXt[lay] -> SetMarkerStyle(20);
00086           m_fdPreXt -> Add(m_grXt[lay]);
00087 
00088           double layRad = m_pGeom -> getLayer(lay) -> getLayerRad();
00089           int ncel = m_pGeom -> getLayer(lay) -> getNcell();
00090           double dm = pi * layRad / (double)ncel;
00091           Double_t nTot = m_nhitTot->GetBinContent(lay+1);
00092           double tm = calconst->getXtpar(lay, 0, 0, 6);
00093 
00094           fxtlog << "layer " << lay << endl;
00095           for(int bin=0; bin<NPreXtBin; bin++){
00096                Double_t nhitBin = m_nhitBin[lay]->GetBinContent(bin+1);
00097                dist[bin] = dm * nhitBin / nTot;
00098                m_grXt[lay] -> SetPoint(bin, m_tbin[bin], dist[bin]);
00099                fxtlog << setw(4) << bin << setw(15) << m_tbin[bin]
00100                       << setw(15) << dist[bin] << setw(15) << dm
00101                       << setw(10) << nhitBin
00102                       << setw(10) << nTot << endl;
00103 
00104                if(m_tbin[bin] >= tm) break;
00105           }
00106 
00107           if(1 == gFgCalib[lay]){
00108                m_grXt[lay] -> Fit(funXt, "Q", "", 0.0, tm);
00109                for(int ord=0; ord<6; ord++) xtpar[ord] = funXt -> GetParameter(ord);
00110 
00111                for(int iEntr=0; iEntr<NENTRXT; iEntr++){
00112                     for(int iLR=0; iLR<NLR; iLR++){
00113                          for(int ord=0; ord<6; ord++){
00114                               calconst -> resetXtpar(lay, iEntr, iLR, ord, xtpar[ord]);
00115                          }
00116                     }
00117                }
00118           } else{
00119                for(int ord=0; ord<6; ord++) xtpar[ord] = calconst->getXtpar(lay, 0, 0, ord);
00120           }
00121 
00122           for(int ord=0; ord<6; ord++)  fxtlog << setw(14) << xtpar[ord];
00123           fxtlog << setw(10) << tm << "  0" << endl;
00124      } // end of layer loop
00125      fxtlog.close();
00126      cout << "preXt.dat was written." << endl;
00127 
00128      renameHist();
00129      delete funXt;
00130 }
00131 
00132 Double_t PreXtCalib::xtfun(Double_t *x, Double_t *par){
00133      Double_t val = 0.0;
00134      for(Int_t ord=0; ord<6; ord++){
00135           val += par[ord] * pow(x[0], ord);
00136      }
00137      return val;
00138 }
00139 
00140 void PreXtCalib::renameHist(){
00141      m_fdPreXt->SetName("PreXt");
00142      m_fdNhit->SetName("XtNhit");
00143      m_haxis->SetName("axis");
00144      m_nhitTot->SetName("nhitTot");
00145 
00146      char hname[200];
00147      for(int lay=0; lay<NLAYER; lay++){
00148           sprintf(hname, "trec%02d", lay);
00149           m_htrec[lay]->SetName(hname);
00150 
00151           sprintf(hname, "nhitBin%02d", lay);
00152           m_nhitBin[lay]->SetName(hname);
00153 
00154           sprintf(hname, "grPreXt%02d", lay);
00155           m_grXt[lay] -> SetName(hname);
00156      }
00157 }

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