00001 #include "include/GrXtCalib.h"
00002 #include "include/fun.h"
00003
00004 #include <cmath>
00005
00006 #include "TMinuit.h"
00007 #include "TF1.h"
00008
00009 GrXtCalib::GrXtCalib(){
00010 m_maxNhit = 5000;
00011 m_nMaxEd = 1000;
00012 for(int lay=0; lay<NLAYER; lay++){
00013 if(lay<8) m_tEd[lay] = 200.0;
00014 else m_tEd[lay] = 300.0;
00015 }
00016 cout << "Calibration type: GrXtCalib" << endl;
00017 }
00018
00019 GrXtCalib::~GrXtCalib(){
00020 }
00021
00022 void GrXtCalib::init(TObjArray* hlist, MdcCosGeom* pGeom){
00023 CalibBase::init(hlist, pGeom);
00024
00025 m_fdXt = new TFolder("mfdxt","fdxt");
00026 hlist->Add(m_fdXt);
00027
00028 m_haxis = new TH2F("axis", "", 50, 0, 300, 50, 0, 9);
00029 m_haxis -> SetStats(0);
00030 m_fdXt -> Add(m_haxis);
00031
00032 char hname[200];
00033 for(int lay=0; lay<NLAYER; lay++){
00034 for(int iEntr=0; iEntr<NENTRXT; iEntr++){
00035 for(int lr=0; lr<NLR; lr++){
00036 m_nhitIn[lay][iEntr][lr] = 0;
00037 m_nhitEd[lay][iEntr][lr] = 0;
00038
00039 sprintf(hname, "mgrXt%02d_%02d_lr%01d", lay, iEntr, lr);
00040 m_grxt[lay][iEntr][lr] = new TGraph();
00041 m_grxt[lay][iEntr][lr] -> SetName(hname);
00042 m_grxt[lay][iEntr][lr] -> SetMarkerStyle(10);
00043 m_grxt[lay][iEntr][lr] -> SetLineColor(10);
00044 m_fdXt -> Add(m_grxt[lay][iEntr][lr]);
00045 }
00046 }
00047 }
00048 }
00049
00050 void GrXtCalib::mergeHist(TFile* fhist){
00051 CalibBase::mergeHist(fhist);
00052
00053 double tdr, doca;
00054 char hname[200];
00055 TFolder* fd = (TFolder*)fhist->Get("fdXtGr");
00056 for(int lay=0; lay<NLAYER; lay++){
00057 for(int iEntr=0; iEntr<NENTRXT; iEntr++){
00058 for(int lr=0; lr<NLR; lr++){
00059 if((m_nhitIn[lay][iEntr][lr] > m_maxNhit) && (m_nhitEd[lay][iEntr][lr] > m_nMaxEd)) continue;
00060
00061 sprintf(hname, "grXt%02d_%02d_lr%01d", lay, iEntr, lr);
00062 TGraph* gr = (TGraph*)fd->FindObjectAny(hname);
00063 int nPoint = gr->GetN();
00064 for(int i=0; i<nPoint; i++){
00065 gr->GetPoint(i, tdr, doca);
00066 if((tdr < m_tEd[lay]) && (m_nhitIn[lay][iEntr][lr] <= m_maxNhit)){
00067 int np = m_grxt[lay][iEntr][lr]->GetN();
00068 m_grxt[lay][iEntr][lr]->SetPoint(np, tdr, doca);
00069 m_nhitIn[lay][iEntr][lr]++;
00070 } else if((tdr >= m_tEd[lay]) && (m_nhitEd[lay][iEntr][lr] <= m_nMaxEd)){
00071 int np = m_grxt[lay][iEntr][lr]->GetN();
00072 m_grxt[lay][iEntr][lr]->SetPoint(np, tdr, doca);
00073 m_nhitEd[lay][iEntr][lr]++;
00074 }
00075 }
00076 }
00077 }
00078 }
00079 }
00080
00081 void GrXtCalib::calib(MdcCalibConst* calconst, TObjArray* newXtList, TObjArray* r2tList){
00082 CalibBase::calib(calconst, newXtList, r2tList);
00083
00084 int ord;
00085 double xtpar[NLAYER][NENTRXT][NLR][8];
00086 TF1* fxtDr = new TF1("fxtDr", xtFitFun, 0, 300, 6);
00087 TF1* fxtEd = new TF1("fxtEd", xtFitEdge, 150, 500, 1);
00088 if(1 == gfixXtC0) fxtDr -> FixParameter(0, 0);
00089
00090 for(int lay=0; lay<NLAYER; lay++){
00091 for(int iEntr=0; iEntr<NENTRXT; iEntr++){
00092 for(int lr=0; lr<NLR; lr++){
00093 m_fgFit[lay][iEntr][lr] = false;
00094 if(0 == gFgCalib[lay]) continue;
00095
00096 if(m_nhitIn[lay][iEntr][lr] > 1000){
00097 Tmax = calconst -> getXtpar(lay, iEntr, lr, 6);
00098
00099 m_grxt[lay][iEntr][lr] -> Fit("fxtDr", "Q+", "", 0, Tmax);
00100 for(ord=0; ord<6; ord++){
00101 xtpar[lay][iEntr][lr][ord] = fxtDr->GetParameter(ord);
00102 }
00103 xtpar[lay][iEntr][lr][6] = Tmax;
00104
00105 Dmax = 0.0;
00106 for(ord=0; ord<6; ord++) Dmax += xtpar[lay][iEntr][lr][ord] * pow(Tmax, ord);
00107
00108 if(m_nhitEd[lay][iEntr][lr] > 300){
00109 m_grxt[lay][iEntr][lr] -> Fit("fxtEd", "Q+", "", Tmax, Tmax+300);
00110 xtpar[lay][iEntr][lr][7] = fxtEd->GetParameter(0);
00111 if(xtpar[lay][iEntr][lr][7] < 0.0) xtpar[lay][iEntr][lr][7] = 0.0;
00112 } else{
00113 xtpar[lay][iEntr][lr][7] = 0.0;
00114 }
00115
00116 m_fgFit[lay][iEntr][lr] = true;
00117 }
00118
00119 }
00120 }
00121 }
00122
00123 ofstream fxtlog("xtlog");
00124 for(int lay=0; lay<NLAYER; lay++){
00125 for(int iEntr=0; iEntr<NENTRXT; iEntr++){
00126 for(int lr=0; lr<NLR; lr++){
00127 fxtlog << setw(3) << lay << setw(3) << iEntr << setw(3) << lr;
00128
00129 int fgUpdate = -1;
00130 if(m_fgFit[lay][iEntr][lr]){
00131 fgUpdate = 1;
00132 for(ord=0; ord<8; ord++) calconst->resetXtpar(lay, iEntr, lr, ord, xtpar[lay][iEntr][lr][ord]);
00133 } else{
00134 int iEntrNew = findXtEntr(lay, iEntr, lr);
00135 if(-1 != iEntrNew){
00136 fgUpdate = 2;
00137 for(ord=0; ord<8; ord++){
00138 calconst->resetXtpar(lay, iEntr, lr, ord, xtpar[lay][iEntrNew][lr][ord]);
00139 }
00140 }
00141 }
00142 fxtlog << setw(3) << fgUpdate;
00143 for(ord=0; ord<8; ord++){
00144 double par = calconst -> getXtpar(lay, iEntr, lr, ord);
00145 if(6==ord) fxtlog << setw(9) << par;
00146 else fxtlog << setw(14) << par;
00147 }
00148 fxtlog << endl;
00149 }
00150 }
00151 }
00152 fxtlog.close();
00153
00154 cout << "Xt update finished. File xtlog was written." << endl;
00155
00156 renameHist();
00157 delete fxtDr;
00158 delete fxtEd;
00159 }
00160
00161 void GrXtCalib::renameHist(){
00162 char hname[200];
00163 m_fdXt->SetName("fdXtGr");
00164 for(int lay=0; lay<NLAYER; lay++){
00165 for(int iEntr=0; iEntr<NENTRXT; iEntr++){
00166 for(int lr=0; lr<NLR; lr++){
00167 sprintf(hname, "grXt%02d_%02d_lr%01d", lay, iEntr, lr);
00168 m_grxt[lay][iEntr][lr] -> SetName(hname);
00169 }
00170 }
00171 }
00172 }
00173
00174 int GrXtCalib::findXtEntr(int lay, int iEntr, int lr) const {
00175 int id0 = 8;
00176 int id1 = 9;
00177 int idmax = 17;
00178 int entrId = -1;
00179 if(iEntr <= id0){
00180 int id = -1;
00181 for(int i=iEntr; i<=id0; i++){
00182 if(m_fgFit[lay][i][lr]){
00183 id = i;
00184 break;
00185 }
00186 }
00187 if(-1 != id) entrId = id;
00188 else{
00189 for(int i=iEntr; i>=0; i--){
00190 if(m_fgFit[lay][i][lr]){
00191 id = i;
00192 break;
00193 }
00194 }
00195 entrId = id;
00196 }
00197 } else{
00198 int id = -1;
00199 for(int i=iEntr; i>=id1; i--){
00200 if(m_fgFit[lay][i][lr]){
00201 id = i;
00202 break;
00203 }
00204 }
00205 if(-1 != id) entrId = id;
00206 else{
00207 for(int i=iEntr; i<idmax; i++){
00208 if(m_fgFit[lay][i][lr]){
00209 id = i;
00210 break;
00211 }
00212 }
00213 entrId = id;
00214 }
00215 }
00216 if(-1 == entrId){
00217 cout << "find EntrId error " << "layer " << lay << " iEntr " << iEntr << " lr " << lr << endl;
00218 }
00219
00220 return entrId;
00221 }