00001 #include "StHbtMaker/Infrastructure/StParityAnalysis.h"
00002 #include "StHbtMaker/Infrastructure/StHbtParticleCollection.hh"
00003 #include "StHbtMaker/Base/StHbtTrackCut.h"
00004 #include "StHbtMaker/Base/StHbtV0Cut.h"
00005
00006 #ifdef __ROOT__
00007 ClassImp(StParityAnalysis)
00008 #endif
00009
00010 StHbtEventCut* copyTheCut(StHbtEventCut*);
00011 StHbtParticleCut* copyTheCut(StHbtParticleCut*);
00012 StHbtPairCut* copyTheCut(StHbtPairCut*);
00013 StHbtCorrFctn* copyTheCorrFctn(StHbtCorrFctn*);
00014
00015
00016
00017 void FillHbtParticleCollection2(StHbtParticleCut* partCut,
00018 StHbtEvent* hbtEvent,
00019 StHbtParticleCollection* partCollection)
00020 {
00021 switch (partCut->Type()) {
00022 case hbtTrack:
00023 {
00024 StHbtTrackCut* pCut = (StHbtTrackCut*) partCut;
00025 StHbtTrack* pParticle;
00026 StHbtTrackIterator pIter;
00027 StHbtTrackIterator startLoop = hbtEvent->TrackCollection()->begin();
00028 StHbtTrackIterator endLoop = hbtEvent->TrackCollection()->end();
00029 for (pIter=startLoop;pIter!=endLoop;pIter++){
00030 pParticle = *pIter;
00031 bool tmpPassParticle = pCut->Pass(pParticle);
00032 pCut->FillCutMonitor(pParticle, tmpPassParticle);
00033 if (tmpPassParticle){
00034 StHbtParticle* particle = new StHbtParticle(pParticle,pCut->Mass());
00035 partCollection->push_back(particle);
00036 }
00037 }
00038 break;
00039 }
00040 case hbtV0:
00041 {
00042 StHbtV0Cut* pCut = (StHbtV0Cut*) partCut;
00043 StHbtV0* pParticle;
00044 StHbtV0Iterator pIter;
00045 StHbtV0Iterator startLoop = hbtEvent->V0Collection()->begin();
00046 StHbtV0Iterator endLoop = hbtEvent->V0Collection()->end();
00047
00048 for (pIter=startLoop;pIter!=endLoop;pIter++){
00049 pParticle = *pIter;
00050 bool tmpPassV0 = pCut->Pass(pParticle);
00051 pCut->FillCutMonitor(pParticle,tmpPassV0);
00052 if (tmpPassV0){
00053 StHbtParticle* particle = new StHbtParticle(pParticle,partCut->Mass());
00054 partCollection->push_back(particle);
00055 }
00056 }
00057 break;
00058 }
00059 default:
00060 cout << "FillHbtParticleCollection2 function (in StParityAnalysis.cxx) - undefined Particle Cut type!!! \n";
00061 }
00062 }
00063
00064 StParityAnalysis::StParityAnalysis(){
00065 mEventCut = 0;
00066 mFirstParticleCut = 0;
00067 mSecondParticleCut = 0;
00068 mPairCut = 0;
00069 mCorrFctnCollection= 0;
00070 mCorrFctnCollection = new StHbtCorrFctnCollection;
00071 mNeventsProcessed = 0;
00072 }
00073
00074
00075 StParityAnalysis::StParityAnalysis(const StParityAnalysis& a) : StHbtBaseAnalysis() {
00076
00077 mEventCut = 0;
00078 mFirstParticleCut = 0;
00079 mSecondParticleCut = 0;
00080 mPairCut = 0;
00081 mCorrFctnCollection= 0;
00082 mCorrFctnCollection = new StHbtCorrFctnCollection;
00083 mNeventsProcessed = 0;
00084
00085
00086 mEventCut = a.mEventCut->Clone();
00087
00088 mFirstParticleCut = a.mFirstParticleCut->Clone();
00089
00090 if (a.mFirstParticleCut==a.mSecondParticleCut!=0)
00091 SetSecondParticleCut(mSecondParticleCut);
00092 else
00093 mSecondParticleCut = a.mSecondParticleCut->Clone();
00094
00095 mPairCut = a.mPairCut->Clone();
00096
00097 if ( mEventCut ) {
00098 SetEventCut(mEventCut);
00099 cout << " StParityAnalysis::StParityAnalysis(const StParityAnalysis& a) - event cut set " << endl;
00100 }
00101 if ( mFirstParticleCut ) {
00102 SetFirstParticleCut(mFirstParticleCut);
00103 cout << " StParityAnalysis::StParityAnalysis(const StParityAnalysis& a) - first particle cut set " << endl;
00104 }
00105 if ( mSecondParticleCut ) {
00106 SetSecondParticleCut(mSecondParticleCut);
00107 cout << " StParityAnalysis::StParityAnalysis(const StParityAnalysis& a) - second particle cut set " << endl;
00108 } if ( mPairCut ) {
00109 SetPairCut(mPairCut);
00110 cout << " StParityAnalysis::StParityAnalysis(const StParityAnalysis& a) - pair cut set " << endl;
00111 }
00112
00113 StHbtCorrFctnIterator iter;
00114 for (iter=a.mCorrFctnCollection->begin(); iter!=a.mCorrFctnCollection->end();iter++){
00115 cout << " StParityAnalysis::StParityAnalysis(const StParityAnalysis& a) - looking for correlation functions " << endl;
00116 StHbtCorrFctn* fctn = (*iter)->Clone();
00117 if (fctn) AddCorrFctn(fctn);
00118 else cout << " StParityAnalysis::StParityAnalysis(const StParityAnalysis& a) - correlation function not found " << endl;
00119 }
00120
00121 mNumEventsToMix = a.mNumEventsToMix;
00122
00123 cout << " StParityAnalysis::StParityAnalysis(const StParityAnalysis& a) - analysis copied " << endl;
00124 }
00125
00126
00127 StParityAnalysis::~StParityAnalysis(){
00128
00129 delete mEventCut ;
00130 delete mFirstParticleCut ;
00131 delete mSecondParticleCut ;
00132 delete mPairCut ;
00133
00134 StHbtCorrFctnIterator iter;
00135 for (iter=mCorrFctnCollection->begin(); iter!=mCorrFctnCollection->end();iter++){
00136 delete *iter;
00137 }
00138 delete mCorrFctnCollection;
00139 }
00140
00141 StHbtCorrFctn* StParityAnalysis::CorrFctn(int n){
00142 if ( n<0 || n > (int)mCorrFctnCollection->size() )
00143 return NULL;
00144 StHbtCorrFctnIterator iter=mCorrFctnCollection->begin();
00145 for (int i=0; i<n ;i++){
00146 iter++;
00147 }
00148 return *iter;
00149 }
00150
00151 StHbtString StParityAnalysis::Report()
00152 {
00153 cout << "StParityAnalysis - constructing Report..."<<endl;
00154 string temp = "-----------\nHbt Analysis Report:\n";
00155 temp += "\nEvent Cuts:\n";
00156 temp += mEventCut->Report();
00157 temp += "\nParticle Cuts - First Particle:\n";
00158 temp += mFirstParticleCut->Report();
00159 temp += "\nParticle Cuts - Second Particle:\n";
00160 temp += mSecondParticleCut->Report();
00161 temp += "\nPair Cuts:\n";
00162 temp += mPairCut->Report();
00163 temp += "\nCorrelation Functions:\n";
00164 StHbtCorrFctnIterator iter;
00165 if ( mCorrFctnCollection->size()==0 ) {
00166 cout << "StParityAnalysis-Warning : no correlations functions in this analysis " << endl;
00167 }
00168 for (iter=mCorrFctnCollection->begin(); iter!=mCorrFctnCollection->end();iter++){
00169 temp += (*iter)->Report();
00170 temp += "\n";
00171 }
00172 temp += "-------------\n";
00173 StHbtString returnThis=temp;
00174 return returnThis;
00175 }
00176
00177 void StParityAnalysis::ProcessEvent(const StHbtEvent* hbtEvent) {
00178
00179
00180 AddEventProcessed();
00181
00182 ParityBuff PlusSame;
00183 ParityBuff MinusSame;
00184 ParityBuff PlusMixed;
00185 ParityBuff MinusMixed;
00186 #define BUFFERSIZ 50
00187 static ParityBuff PlusBuffer[BUFFERSIZ];
00188 static ParityBuff MinusBuffer[BUFFERSIZ];
00189 static long nEvent = 0;
00190 StHbtParticle *pParticle;
00191
00192 EventBegin(hbtEvent);
00193
00194 bool tmpPassEvent = mEventCut->Pass(hbtEvent);
00195 mEventCut->FillCutMonitor(hbtEvent, tmpPassEvent);
00196 if (tmpPassEvent) {
00197 cout << "StParityAnalysis::ProcessEvent() - Event has passed cut - build picoEvent from " <<
00198 hbtEvent->TrackCollection()->size() << " tracks in TrackCollection" << endl;
00199
00200 StHbtPicoEvent* picoEvent = new StHbtPicoEvent;
00201 FillHbtParticleCollection2(mFirstParticleCut,(StHbtEvent*)hbtEvent,picoEvent->FirstParticleCollection());
00202 FillHbtParticleCollection2(mSecondParticleCut,(StHbtEvent*)hbtEvent,picoEvent->SecondParticleCollection());
00203 cout <<"StParityAnalysis::ProcessEvent - #particles in First, Second Collections: " <<
00204 picoEvent->FirstParticleCollection()->size() << " " <<
00205 picoEvent->SecondParticleCollection()->size() << endl;
00206
00207
00208
00209
00210 StHbtParticleIterator PartIter1;
00211 StHbtParticleIterator PartIter2;
00212 StHbtParticleIterator StartOuterLoop = picoEvent->FirstParticleCollection()->begin();
00213 StHbtParticleIterator EndOuterLoop = picoEvent->FirstParticleCollection()->end();
00214 StHbtParticleIterator StartInnerLoop;
00215 StHbtParticleIterator EndInnerLoop;
00216 StartInnerLoop = picoEvent->SecondParticleCollection()->begin();
00217 EndInnerLoop = picoEvent->SecondParticleCollection()->end() ;
00218
00219
00220
00221 int evtMod = (nEvent%BUFFERSIZ);
00222 nEvent++;
00223 int bufferIndex = evtMod;
00224 if (nEvent >= BUFFERSIZ ) {
00225 bufferIndex = (BUFFERSIZ - 1);
00226 }
00227
00228
00229
00230 PlusBuffer[bufferIndex].clear();
00231
00232 for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++){
00233 pParticle = *PartIter1;
00234 PlusBuffer[bufferIndex].push_back(pParticle->FourMomentum() ) ;
00235 }
00236 int newPlusSize = PlusBuffer[bufferIndex].size();
00237 if (newPlusSize == 0){cout << " 0 tracks copied to buffer for particle 1!!!"<< endl ;}
00238
00239 MinusBuffer[bufferIndex].clear();
00240
00241 for (PartIter2 = StartInnerLoop; PartIter2!=EndInnerLoop;PartIter2++){
00242 pParticle = *PartIter2;
00243 MinusBuffer[bufferIndex].push_back(pParticle->FourMomentum() ) ;
00244 }
00245 int newMinusSize = MinusBuffer[bufferIndex].size();
00246 if (newMinusSize == 0){cout << " 0 tracks copied to buffer for particle 2!!!"<< endl ;}
00247
00248
00249
00250
00251
00252 StHbtThreeVector RxnPlaneVec;
00253 {for (int iii = 0;iii<newPlusSize;iii++){
00254 if (PlusBuffer[bufferIndex][iii].z() > 0 ) RxnPlaneVec += PlusBuffer[bufferIndex][iii].vect();
00255 if (PlusBuffer[bufferIndex][iii].z() < 0 ) RxnPlaneVec -= PlusBuffer[bufferIndex][iii].vect();
00256 }}
00257 {for (int iii = 0;iii<newMinusSize;iii++){
00258 if (MinusBuffer[bufferIndex][iii].z() > 0 ) RxnPlaneVec += MinusBuffer[bufferIndex][iii].vect();
00259 if (MinusBuffer[bufferIndex][iii].z() < 0 ) RxnPlaneVec -= MinusBuffer[bufferIndex][iii].vect();
00260 }}
00261 RxnPlaneVec.setZ(0);
00262 double phi_rxn_plane = acos(RxnPlaneVec.x()/RxnPlaneVec.mag());
00263 if (RxnPlaneVec.y() < 0) phi_rxn_plane = -phi_rxn_plane;
00264
00265
00266
00267 StHbtThreeVector tempVct;
00268
00269 {for (int iii = 0;iii<newPlusSize;iii++){
00270
00271 tempVct = PlusBuffer[bufferIndex][iii].vect();
00272 tempVct.rotateZ(-phi_rxn_plane);
00273 (PlusBuffer[bufferIndex][iii]).setX(tempVct.x());
00274 (PlusBuffer[bufferIndex][iii]).setY(tempVct.y());
00275
00276 }}
00277 {for (int iii = 0;iii<newMinusSize;iii++){
00278
00279 tempVct = MinusBuffer[bufferIndex][iii].vect();
00280 tempVct.rotateZ(-phi_rxn_plane);
00281 (MinusBuffer[bufferIndex][iii]).setX(tempVct.x());
00282 (MinusBuffer[bufferIndex][iii]).setY(tempVct.y());
00283
00284 }}
00285
00286
00287
00288
00289 {for (int iii = 0;iii<2;iii++){
00290 for (int iii = 0;iii<newPlusSize;iii++){
00291 int switchto = (rand() % newPlusSize);
00292 StHbtLorentzVector tempVec = PlusBuffer[bufferIndex][iii];
00293 PlusBuffer[bufferIndex][iii] = PlusBuffer[bufferIndex][switchto];
00294 PlusBuffer[bufferIndex][switchto] = tempVec;
00295 }
00296 }}
00297
00298 {for (int iii = 0;iii<2;iii++){
00299 for (int iii = 0;iii<newMinusSize;iii++){
00300 int switchto = (rand() % newMinusSize);
00301 StHbtLorentzVector tempVec = MinusBuffer[bufferIndex][iii];
00302 MinusBuffer[bufferIndex][iii] = MinusBuffer[bufferIndex][switchto];
00303 MinusBuffer[bufferIndex][switchto] = tempVec;
00304 }
00305 }}
00306
00307
00308
00309 PlusSame.clear();
00310 MinusSame.clear();
00311 {for (int jjj = 0; jjj < newPlusSize; jjj++){
00312 PlusSame.push_back(PlusBuffer[bufferIndex][jjj]);
00313 }}
00314 {for (int jjj = 0; jjj < newMinusSize; jjj++){
00315 MinusSame.push_back(MinusBuffer[bufferIndex][jjj]);
00316 }}
00317
00318
00319
00320
00321 if (nEvent >= BUFFERSIZ ) {
00322
00323 PlusMixed.clear();
00324 MinusMixed.clear();
00325
00326 if (nEvent >= BUFFERSIZ ) {
00327 StHbtLorentzVector vTemp;
00328 int mixedenum;
00329 int mixedtnum;
00330
00331
00332 {for (int jjj = 0; jjj < newPlusSize; jjj++){
00333 mixedenum = (rand() % BUFFERSIZ);
00334 mixedtnum = (rand() % PlusBuffer[mixedenum].size());
00335 vTemp = PlusBuffer[mixedenum][mixedtnum];
00336 PlusBuffer[mixedenum][mixedtnum] = PlusBuffer[bufferIndex][jjj];
00337 PlusBuffer[bufferIndex][jjj] = vTemp;
00338 }}
00339 {for (int jjj = 0; jjj < newMinusSize; jjj++){
00340 mixedenum = (rand() % BUFFERSIZ);
00341 mixedtnum = (rand() % MinusBuffer[mixedenum].size());
00342 vTemp = MinusBuffer[mixedenum][mixedtnum];
00343 MinusBuffer[mixedenum][mixedtnum] = MinusBuffer[bufferIndex][jjj];
00344 MinusBuffer[bufferIndex][jjj] = vTemp;
00345 }}
00346
00347
00348 {for (int jjj = 0; jjj < newPlusSize; jjj++){
00349 PlusMixed.push_back(PlusBuffer[bufferIndex][jjj]);
00350 }}
00351 {for (int jjj = 0; jjj < newMinusSize; jjj++){
00352 MinusMixed.push_back(MinusBuffer[bufferIndex][jjj]);
00353 }}
00354 }
00355
00356
00357
00358
00359 mPairCut->ParityPairCuts(&PlusSame, &MinusSame);
00360 if (nEvent >= BUFFERSIZ ) {
00361 mPairCut->ParityPairCuts(&PlusMixed, &MinusMixed);
00362 }
00363
00364
00365
00366
00367 if (nEvent >= BUFFERSIZ ) {
00368 int eraseMe;
00369 while (PlusMixed.size() > PlusSame.size()){
00370 eraseMe = (rand() % PlusMixed.size());
00371 PlusMixed.erase(PlusMixed.begin()+eraseMe);
00372 }
00373 while (MinusMixed.size() > MinusSame.size() ){
00374 eraseMe = (rand() % MinusMixed.size());
00375 MinusMixed.erase(MinusMixed.begin()+eraseMe);
00376 }
00377 while (PlusSame.size() > PlusMixed.size()){
00378 eraseMe = (rand() % PlusSame.size());
00379 PlusSame.erase(PlusSame.begin()+eraseMe);
00380 }
00381 while (MinusSame.size() > MinusMixed.size() ){
00382 eraseMe = (rand() % MinusSame.size());
00383 MinusSame.erase(MinusSame.begin()+eraseMe);
00384 }
00385 }
00386 cout << " sizes:plussame minussame plusmixed minusmixed" << PlusSame.size()<< ","
00387 <<MinusSame.size()<< ","
00388 <<PlusMixed.size()<< ","
00389 <<MinusMixed.size()<< endl ;
00390
00391
00392
00393
00394 StHbtCorrFctnIterator CorrFctnIter;
00395 for (CorrFctnIter=mCorrFctnCollection->begin();CorrFctnIter!=mCorrFctnCollection->end();CorrFctnIter++){
00396 StHbtCorrFctn* CorrFctn = *CorrFctnIter;
00397 CorrFctn->ParityCompute(&PlusSame, &MinusSame, SAME );
00398 if (nEvent >= BUFFERSIZ ) {
00399 CorrFctn->ParityCompute(&PlusMixed, &MinusMixed, MIXED );
00400 }
00401
00402 }
00403
00404 }
00405
00406
00407 delete picoEvent ;
00408
00409 }
00410 EventEnd(hbtEvent);
00411 cout << "StParityAnalysis::ProcessEvent() - return to caller ... " << endl;
00412 }
00413
00414 void StParityAnalysis::EventBegin(const StHbtEvent* ev){
00415 mFirstParticleCut->EventBegin(ev);
00416 mSecondParticleCut->EventBegin(ev);
00417
00418 for (StHbtCorrFctnIterator iter=mCorrFctnCollection->begin(); iter!=mCorrFctnCollection->end();iter++){
00419 (*iter)->EventBegin(ev);
00420 }
00421 }
00422
00423 void StParityAnalysis::EventEnd(const StHbtEvent* ev){
00424 mFirstParticleCut->EventEnd(ev);
00425 mSecondParticleCut->EventEnd(ev);
00426
00427 for (StHbtCorrFctnIterator iter=mCorrFctnCollection->begin(); iter!=mCorrFctnCollection->end();iter++){
00428 (*iter)->EventEnd(ev);
00429 }
00430 }
00431
00432 void StParityAnalysis::Finish(){
00433 StHbtCorrFctnIterator iter;
00434 for (iter=mCorrFctnCollection->begin(); iter!=mCorrFctnCollection->end();iter++){
00435 (*iter)->Finish();
00436 }
00437 }
00438
00439 void StParityAnalysis::AddEventProcessed() {
00440 mNeventsProcessed++;
00441 }