00001 #include "StHbtMaker/CorrFctn/QoslCMSCorrFctnRPkT.h"
00002 #include <cstdio>
00003 #include "StHbtMaker/Infrastructure/StHbtReactionPlaneAnalysis.h"
00004 #include "PhysicalConstants.h"
00005 #include "TString.h"
00006 #include "TH3S.h"
00007
00008 #ifdef __ROOT__
00009 ClassImp(QoslCMSCorrFctnRPkT)
00010 #endif
00011
00012 QoslCMSCorrFctnRPkT::QoslCMSCorrFctnRPkT(char* title, const int& nbinso, const float& QoLo, const float& QoHi,
00013 const int& nbinss, const float& QsLo, const float& QsHi,
00014 const int& nbinsl, const float& QlLo, const float& QlHi, const int& rpBins){
00015
00016 mCorrection = new StHbtCoulomb;
00017 mCorrection->SetRadius(5.0);
00018 mCorrection->SetChargeProduct(1.0);
00019
00020 qMax = QoHi;
00021
00022 nRPbins = rpBins;
00023 nKtBins = 4;
00024
00025 for(int i=0; i<nRPbins; i++) {
00026 TString TitAngle=Form("_phi%i",i*180/nRPbins);
00027
00028 for(int j=0; j<nKtBins; j++) {
00029 TString TitKt=Form("_kt%i",j);
00030
00031
00032 TString TitNum = "Num";
00033 TitNum += title;
00034 TitNum += TitAngle.Data();
00035 TitNum += TitKt.Data();
00036 mNumerator[i][j] = new TH3S(TitNum.Data(),TitNum.Data(),nbinso,QoLo,QoHi,
00037 nbinss,QsLo,QsHi,
00038 nbinsl,QlLo,QlHi);
00039
00040
00041 TString TitDen = "Den";
00042 TitDen += title;
00043 TitDen += TitAngle.Data();
00044 TitDen += TitKt.Data();
00045 mDenominator[i][j] = new TH3S(TitDen.Data(),TitDen.Data(),nbinso,QoLo,QoHi,
00046 nbinss,QsLo,QsHi,
00047 nbinsl,QlLo,QlHi);
00048
00050
00051
00052
00053
00054
00055
00056
00057 TString TitCoul = "Coul";
00058 TitCoul += title;
00059 TitCoul += TitAngle.Data();
00060 TitCoul += TitKt.Data();
00061 mCoulHisto[i][j] = new StHbt3DHisto(TitCoul.Data(),TitCoul.Data(),nbinso,QoLo,QoHi,nbinss,QsLo,QsHi,nbinsl,QlLo,QlHi);
00062
00063
00064
00065
00066 }
00067 }
00068
00069 }
00070
00071
00072 QoslCMSCorrFctnRPkT::~QoslCMSCorrFctnRPkT(){
00073 for(int i=0; i<nRPbins; i++) {
00074 for(int j=0; j<nKtBins; j++) {
00075 delete mNumerator[i][j];
00076 delete mDenominator[i][j];
00077 delete mCoulHisto[i][j];
00078 }
00079 }
00080 }
00081
00082 void QoslCMSCorrFctnRPkT::Finish(){
00083
00084
00085
00086
00087
00088
00089
00090 }
00091
00092
00093 StHbtString QoslCMSCorrFctnRPkT::Report(){
00094 string stemp = "QoslCMS Correlation Function Report:\n";
00095 char ctemp[100];
00096 sprintf(ctemp,"Number of entries in numerator:\t%E\n",mNumerator[0][0]->GetEntries());
00097 stemp += ctemp;
00098 sprintf(ctemp,"Number of entries in denominator:\t%E\n",mDenominator[0][0]->GetEntries());
00099 stemp += ctemp;
00100
00101
00102 StHbtString returnThis = stemp;
00103 return returnThis;
00104 }
00105
00106 void QoslCMSCorrFctnRPkT::AddRealPair(const StHbtPair* pair){
00107
00108 int rpBin, ktBin;
00109 rpBin = GetRPBin(pair);
00110 ktBin = GetKtBin(pair);
00111 if(ktBin<0) return;
00112
00113 double Qo = pair->qOutCMS();
00114 double Qs = pair->qSideCMS();
00115 double Ql = pair->qLongCMS();
00116
00117 if(fabs(Qo)>qMax || fabs(Qs)>qMax || fabs(Ql)>qMax) return;
00118
00119 Ql = fabs(Ql);
00120 if ( Qs<0.0 ) {
00121 Qs*=-1.0;
00122 Qo*=-1.0;
00123 }
00124 mNumerator[rpBin][ktBin]->Fill(Qo,Qs,Ql);
00125 }
00126
00127 void QoslCMSCorrFctnRPkT::AddMixedPair(const StHbtPair* pair){
00128
00129 int rpBin, ktBin;
00130 rpBin = GetRPBin(pair);
00131 ktBin = GetKtBin(pair);
00132 if(ktBin<0) return;
00133
00134
00135
00136 double weight = 1.0;
00137 if (mCorrection) weight = mCorrection->CoulombCorrect(pair);
00138
00139 double Qo = pair->qOutCMS();
00140 double Qs = pair->qSideCMS();
00141 double Ql = pair->qLongCMS();
00142
00143 if(fabs(Qo)>qMax || fabs(Qs)>qMax || fabs(Ql)>qMax) return;
00144
00145 Ql = fabs(Ql);
00146 if ( Qs<0.0 ) {
00147 Qs*=-1.0;
00148 Qo*=-1.0;
00149 }
00150 mDenominator[rpBin][ktBin]->Fill(Qo,Qs,Ql);
00151 mCoulHisto[rpBin][ktBin]->Fill(Qo,Qs,Ql,weight);
00152
00153 }
00154
00155 int QoslCMSCorrFctnRPkT::GetRPBin(const StHbtPair* pair) {
00156
00157
00158 double pxTotal = pair->fourMomentumSum().x();
00159 double pyTotal = pair->fourMomentumSum().y();
00160 double angle = atan2(pyTotal,pxTotal)*180.0/pi;
00161 if (angle<0.0) angle+=360.0;
00162
00163
00164 StHbtReactionPlaneAnalysis* RPanal = (StHbtReactionPlaneAnalysis*) myAnalysis;
00165 double RPangle = RPanal->ReactionPlane()*180.0/pi;
00166
00167
00168
00169
00170
00171 double angleDifference = angle-RPangle;
00172 if (angleDifference<0.0) angleDifference+=360.0;
00173 if (angleDifference>=180.0) angleDifference-=180.0;
00174 if (angleDifference>=(180.0-90.0/nRPbins)) angleDifference-=180.0;
00175
00176
00177 int rpBin;
00178 rpBin = (int) ((angleDifference*nRPbins/180.0)+0.5);
00179 if(rpBin>=nRPbins || ((angleDifference*nRPbins/180.0)+0.5)<0.0)
00180 cout << endl << endl << endl << endl << "PROBLEM!!!!" << endl << endl << endl
00181 << endl << endl << endl;
00182 return rpBin;
00183
00184 }
00185
00186 int QoslCMSCorrFctnRPkT::GetKtBin(const StHbtPair* pair) {
00187
00188 double kT = fabs(pair->kT());
00189 int ktBin;
00190
00191 if(kT<0.15 || kT>0.6) return -1;
00192
00193 if(kT<0.25)
00194 ktBin = 0;
00195 else if( kT >= 0.25 && kT < 0.35 )
00196 ktBin = 1;
00197 else if( kT >= 0.35 && kT < 0.45 )
00198 ktBin = 2;
00199 else if( kT >= 0.45 && kT <= 0.6 )
00200 ktBin = 3;
00201
00202 return ktBin;
00203
00204 }
00205
00206 void QoslCMSCorrFctnRPkT::SetCorrection(StHbtCoulomb* coulomb) {
00207 mCorrection = coulomb;
00208 }
00209
00210