00001 #include "StHbtMaker/Cut/evansPairCut.h"
00002 #include <string>
00003 #include <cstdio>
00004
00005 #ifdef __ROOT__
00006 ClassImp(evansPairCut)
00007 #endif
00008
00009
00010 evansPairCut::evansPairCut(){
00011 mNPairsPassed = mNPairsFailed = 0;
00012 AngleCut = 0.020;
00013 pCutDistance = 0.010;
00014 Bfield = 0.5;
00015 }
00016
00017
00018
00019
00020
00021 bool evansPairCut::Pass(const StHbtPair* pair){
00022
00023 return true;
00024 }
00025 void evansPairCut::ParityPairCuts(ParityBuff *Plus, ParityBuff *Minus){
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 StHbtThreeVector FirstTrack;
00041 StHbtThreeVector SecondTrack;
00042 vector <int> PlusIsGood;
00043 vector <int> MinusIsGood;
00044
00045 double cosSqAngleCut = cos(AngleCut)*cos(AngleCut);
00046
00047 int newPlusSize = Plus->size();
00048 int newMinusSize = Minus->size();
00049
00050 double pCut = (pCutDistance*2.0)/( (0.5)*(0.5)*(0.3)*Bfield);
00051
00052 cout <<"begin evans Pair Cut "<< newPlusSize<< " plus and "<< newMinusSize<<" minus tracks"<< endl;
00053
00054 {for (int jjj = 0; jjj < newPlusSize; jjj++){
00055 PlusIsGood.push_back(1);
00056 }}
00057 {for (int jjj = 0; jjj < newMinusSize; jjj++){
00058 MinusIsGood.push_back(1);
00059 }}
00060
00061
00062 double FdotS;
00063 {for (int bbb = 0; bbb < newPlusSize; bbb++){
00064 FirstTrack = ((*Plus)[bbb]).vect();
00065 {for (int hhh = 0; hhh < newMinusSize; hhh++){
00066 SecondTrack = ((*Minus)[hhh]).vect();
00067 if (FirstTrack.z()*SecondTrack.z() > 0. ){
00068 FdotS = FirstTrack.dot(SecondTrack);
00069 if ( ( (FdotS*FdotS) / (FirstTrack.mag2()* SecondTrack.mag2()) > cosSqAngleCut ) && (FdotS > 0 ) ){
00070 if (fabs(1.0/FirstTrack.mag()-1.0/SecondTrack.mag()) < pCut){
00071 PlusIsGood[bbb] = 0;
00072 MinusIsGood[hhh] = 0;
00073 }
00074 }
00075 }
00076 }}
00077 }}
00078
00079
00080
00081 {for (int bbb = 0; bbb < newPlusSize; bbb++){
00082 FirstTrack = ((*Plus)[bbb]).vect();
00083 {for (int hhh = (bbb+1); hhh < newPlusSize; hhh++){
00084 SecondTrack = ((*Plus)[hhh]).vect();
00085 if (FirstTrack.z()*SecondTrack.z() > 0. ){
00086 FdotS = FirstTrack.dot(SecondTrack);
00087 if ( ( (FdotS*FdotS) / (FirstTrack.mag2()* SecondTrack.mag2()) > cosSqAngleCut ) && (FdotS > 0 ) ){
00088 if (fabs(1.0/FirstTrack.mag()-1.0/SecondTrack.mag()) < pCut){
00089 PlusIsGood[bbb] = 0;
00090 PlusIsGood[hhh] = 0;
00091 }
00092 }
00093 }
00094 }}
00095 }}
00096
00097
00098
00099 {for (int bbb = 0; bbb < newMinusSize; bbb++){
00100 FirstTrack = ((*Minus)[bbb]).vect();
00101 {for (int hhh = (bbb+1); hhh < newMinusSize; hhh++){
00102 SecondTrack = ((*Minus)[hhh]).vect();
00103 if (FirstTrack.z()*SecondTrack.z() > 0. ){
00104 FdotS = FirstTrack.dot(SecondTrack);
00105 if ( ( (FdotS*FdotS) / (FirstTrack.mag2()* SecondTrack.mag2()) > cosSqAngleCut ) && (FdotS > 0 ) ){
00106 if (fabs(1.0/FirstTrack.mag()-1.0/SecondTrack.mag()) < pCut){
00107 MinusIsGood[bbb] = 0;
00108 MinusIsGood[hhh] = 0;
00109 }
00110 }
00111 }
00112 }}
00113 }}
00114
00115
00116
00117 unsigned int jjj = 0;
00118 while (jjj < (*Plus).size()){
00119 if (PlusIsGood[jjj]==0){
00120 (*Plus).erase((*Plus).begin()+jjj);
00121 PlusIsGood.erase(PlusIsGood.begin()+jjj);
00122 }
00123 else{
00124 jjj++;
00125 }
00126 }
00127 jjj = 0;
00128 while (jjj < (*Minus).size()){
00129 if (MinusIsGood[jjj]==0){
00130 (*Minus).erase((*Minus).begin()+jjj);
00131 MinusIsGood.erase(MinusIsGood.begin()+jjj);
00132 }
00133 else{
00134 jjj++;
00135 }
00136 }
00137
00138
00139
00140 PlusIsGood.clear();
00141 MinusIsGood.clear();
00142
00143 cout << "end evans Pair Cut with "<< (*Plus).size()<< " plus and "<< (*Minus).size() <<" minus tracks"<< endl;
00144
00145 }
00146
00147 StHbtString evansPairCut::Report(){
00148 string Stemp = "evans Pair Cut Report\n";
00149
00150
00151
00152 StHbtString returnThis = Stemp;
00153 return returnThis;
00154 }
00155