00001 #include "tofcalgsec/calib_barrel_q0.h"
00002 #include "TF1.h"
00003
00004 using namespace CLHEP;
00005
00006 calib_barrel_q0::calib_barrel_q0():TofCalibFit( true, nBarrelQ0 ) {
00007
00008 nKind = 1;
00009 nBinPerCounter = 1;
00010
00011 nHistPerCounter = 0;
00012 nCanvasPerCounter = 0;
00013
00014 nHistPerCounter = 0;
00015 nCanvasPerCounter = 0;
00016 nHistogram = NBarrel*nKind*nBinPerCounter;
00017 nCanvas = 2;
00018 CanvasName.push_back( static_cast<string>("Most Probable Value of Q0 vs TOF counter Number (Barrel part)") );
00019 CanvasName.push_back( static_cast<string>("Sigma of Q0 vs TOF Counter Number (Barrel part)") );
00020 nGraphPerCanvas.push_back(1);
00021 nGraphPerCanvas.push_back(1);
00022
00023 m_name = string("calib_barrel_q0");
00024
00025 int numGraphs = 0;
00026 std::vector<unsigned int>::iterator iter = nGraphPerCanvas.begin();
00027 for( ; iter!=nGraphPerCanvas.end(); iter++ ) {
00028 numGraphs = numGraphs + (*iter);
00029 }
00030 if( numGraphs != nGraphTotalQ0 ) {
00031 cout << "tofcalgsec::calib_barrel_q0: the number of Graphs is NOT reasonable!!!" << endl;
00032 exit(0);
00033 }
00034
00035 const int qbin = 100;
00036 const double qbegin = 0.0;
00037 const double qend = 5000.0;
00038
00039
00040 char hname[256];
00041 for( unsigned int i=0; i<NBarrel; i++ ) {
00042 m_result.push_back( HepVector(nBarrelQ0,0) );
00043
00044 sprintf( hname, "Q0-tofid-%i", i );
00045 m_histograms.push_back( new TH1F( hname, hname, qbin, qbegin, qend ) );
00046
00047 m_fitresult.push_back( HepVector(nParQ0,0) );
00048 }
00049
00050 itofid.resize( NBarrel );
00051 itofiderr.resize( NBarrel );
00052 itofidstep = 1.0;
00053 for( unsigned int i=0; i<NBarrel; i++ ) {
00054 itofid[i] = i*1.0;
00055 itofiderr[i] = 0.5;
00056 }
00057 }
00058
00059
00060 calib_barrel_q0::~calib_barrel_q0() {
00061 m_fitresult.clear();
00062 itofid.clear();
00063 itofiderr.clear();
00064 }
00065
00066
00067 void calib_barrel_q0::calculate( RecordSet*& data, unsigned int icounter ) {
00068
00069 std::cout << setiosflags(ios::left) << setw(10) << icounter << setw(8) << data->size() << setw(30) << name() << std::endl;
00070
00071 if( data->size() > 0 ) {
00072 std::vector<Record*>::iterator iter = data->begin();
00073 for( ; iter!=data->end(); iter++ ) {
00074 fillRecord( (*iter), icounter );
00075 }
00076 }
00077 fitHistogram( icounter );
00078
00079 if( icounter==(NBarrel-1) ) {
00080 fillGraph();
00081 fitGraph();
00082 }
00083
00084 return;
00085 }
00086
00087
00088 void calib_barrel_q0::fillRecord( const Record* r, unsigned int icounter ) {
00089 std::vector<TH1F*>::iterator iter = m_histograms.begin() + icounter;
00090 (*iter)->Fill( r->q0() );
00091 return;
00092 }
00093
00094
00095 void calib_barrel_q0::fitHistogram( unsigned int icounter ) {
00096 TF1* ld = new TF1("ld", "landau");
00097 ld->SetLineColor(2);
00098 ld->SetLineWidth(1);
00099
00100 std::vector<TH1F*>::iterator iter1 = m_histograms.begin() + icounter;
00101 std::vector<HepVector>::iterator iter2 = m_fitresult.begin() + icounter;
00102 (*iter1)->Fit( ld, "Q");
00103 (*iter2)[0] = ld->GetParameter(1);
00104 (*iter2)[1] = ld->GetParError(1);
00105 (*iter2)[2] = ld->GetParameter(2);
00106 (*iter2)[3] = ld->GetParError(2);
00107
00108 return;
00109 }
00110
00111
00112 void calib_barrel_q0::fillGraph() {
00113
00114 std::vector<double> qmean, qmeanerr;
00115 std::vector<double> qsig, qsigerr;
00116 qmean.resize( NBarrel );
00117 qmeanerr.resize( NBarrel );
00118 qsig.resize( NBarrel );
00119 qsigerr.resize( NBarrel );
00120
00121 TH1F* graph1 = new TH1F( CanvasName[0].c_str(), CanvasName[0].c_str(), NBarrel, -0.5, NBarrel-0.5 );
00122 graph1->SetMarkerSize(1.5);
00123 graph1->SetMarkerStyle(20);
00124 graph1->SetMarkerColor(2);
00125
00126 TH1F* graph2 = new TH1F( CanvasName[1].c_str(), CanvasName[1].c_str(), NBarrel, -0.5, NBarrel-0.5 );
00127 graph2->SetMarkerSize(1.5);
00128 graph2->SetMarkerStyle(20);
00129 graph2->SetMarkerColor(4);
00130
00131 std::vector<HepVector>::iterator iter = m_fitresult.begin();
00132 for( unsigned int i=0; i<NBarrel; i++, iter++ ) {
00133 qmean[i] = (*iter)[0];
00134 qmeanerr[i] = (*iter)[1];
00135 qsig[i] = (*iter)[2];
00136 qsigerr[i] = (*iter)[3];
00137 graph1->SetBinContent( i+1, qmean[i] );
00138 graph1->SetBinError( i+1, qmeanerr[i] );
00139 graph2->SetBinContent( i+1, qsig[i] );
00140 graph2->SetBinError( i+1, qsigerr[i] );
00141 }
00142
00143 m_graphs.push_back( graph1 );
00144 m_graphs.push_back( graph2 );
00145
00146 return;
00147 }
00148
00149
00150 void calib_barrel_q0::fitGraph() {
00151 unsigned int number = 0;
00152 std::vector<HepVector>::iterator iter1 = m_result.begin();
00153 std::vector<HepVector>::iterator iter2 = m_fitresult.begin();
00154 for( ; iter1!=m_result.end(); iter1++, number++ ) {
00155 (*iter1)[0] = (*(iter2+number))[0]/ (*iter2)[0];
00156 (*iter1)[1] = (*(iter2+number))[0];
00157 (*iter1)[2] = (*(iter2+number))[2];
00158 }
00159
00160 return;
00161 }