00001
00016 #include "StEEmcPi0Analysis.h"
00017 #include "StEEmcMixMaker.h"
00018 #include "StEEmcPool/StEEmcPointMaker/StEEmcPointMaker.h"
00019 #include "TH1F.h"
00020 #include "TH2F.h"
00021 #include "TTree.h"
00022 #include "TFile.h"
00023 #include <stdio.h>
00024 #include <iostream>
00025 #include "SpinCuts.h"
00026 #include "StEEmcPool/StEEmcPointMaker/EEmcSectorFit.h"
00027 #include "StEEmcUtil/StEEmcSmd/EEmcSmdGeom.h"
00028 #include "StEEmcUtil/EEmcGeom/EEmcGeomSimple.h"
00029 #include "StEEmcPool/StRFEmcTrigger/StRFEmcTrigMaker.h"
00030 #include "StEEmcPool/StEEmcA2EMaker/StEEmcA2EMaker.h"
00031
00032 ClassImp(StEEmcPi0Analysis);
00033
00034
00035 StEEmcPi0Analysis::StEEmcPi0Analysis(const Char_t *name):StMaker(name)
00036 {
00037 mCuts=new SpinCuts();
00038 mTrigSim = 0;
00039 mTrigSimThreshold = 0;
00040 mEEgeom=new EEmcGeomSimple();
00041 mSpinSort = true;
00042
00043 }
00044
00045
00046 Int_t StEEmcPi0Analysis::Init()
00047 {
00048
00049
00050 mHistograms[ kAny ] = new SpinHistos("Any", "Pi0 spectra, unsorted");
00051
00052 mBackgrounds[ kAny ] = new SpinHistos("AnyB", "combinatoric spectra, unsorted");
00053
00054 mHistograms[1]=new SpinHistos("PP","Pi0 spectra, PP, spin4=dec5");
00055 mHistograms[2]=new SpinHistos("PN","Pi0 spectra, PN, spin4=dec6");
00056 mHistograms[3]=new SpinHistos("NP","Pi0 spectra, NP, spin4=dec9");
00057 mHistograms[4]=new SpinHistos("NN","Pi0 spectra, NN, spin4=dec10");
00058
00059 mHistograms[5]=new SpinHistos("Upper","Pi0 spectra, upper sectors 1-2, 8-12");
00060 mHistograms[6]=new SpinHistos("Lower","Pi0 spectra, lower sectors 3-7");
00061
00062 hEventCounter=new TH1F("hEventCounter","Event counts",10,0.,10.);
00063 hEventCounter -> GetXaxis() -> SetBinLabel(1,"raw");
00064 hEventCounter -> GetXaxis() -> SetBinLabel(2,"minb");
00065 hEventCounter -> GetXaxis() -> SetBinLabel(3,"hw trg");
00066 hEventCounter -> GetXaxis() -> SetBinLabel(5,"sw trg");
00067 hEventCounter -> GetXaxis() -> SetBinLabel(5,"sw trg[3,6]");
00068 hEventCounter -> GetXaxis() -> SetBinLabel(6,"vertex");
00069 hPairCounter = new TH1F("hPairCounter","Pair counts",10,0.,10.);
00070 hFillPatternI = new TH1F("hFillPatternI","Intended fill pattern:bunch X-ing @ STAR IP:n runs",120,0.,120.);
00071 hSpin4 = new TH1F("hSpin4","Spin 4:spin4 state",11,0.,11.);
00072 hSpin4mb = new TH1F("hSpin4mb","Spin 4:spin4 state",11,0.,11.);
00073 hBx7 = new TH1F("hBx7","7-bit bunch crossing:bx7",120,0.,120.);
00074 hBx48 = new TH1F("hBx48","48-bit bunch crossing:bx48",120,0.,120.);
00075 hBx7diffBx48 = new TH2F("hBx7diffBx48","bx1=(bx7-off7)%120, bx2=(bx48-off48)%120;bx7;bx1-bx2",120,0.,120.,21,-10.5,10.5);
00076 hBxStar = new TH1F("hBxStar","Beam x-ing at STAR IP;star bunch x-ing",120,0.,120.);
00077 hBxStarPi0 = new TH1F("hBxStarPi0","Beam x-ing at STAR IP with pi0 detected;star bunch x-ing",120,0.,120.);
00078
00079 hMassBx=new TH2F("hMassBx","Beam x-ing vs Mass;M [GeV];STAR bunch xing",120,0.,1.2,120,0.,120.);
00080 hZvertBx=new TH2F("hZvertBx","Beam x-ing vs Z vertex [0.1,0.18]",150,-150.,150.,120,0.,120.);
00081 hZggBx=new TH2F("hZggBx","Beam x-ing vs Zgg",100,0.,1.,120,0.,120.);
00082 hEtaBx=new TH2F("hEtaBx","Beam x-ing vs eta",120,0.8,2.2,120,0.,120.);
00083 mRealEvent=new StEEmcMixEvent();
00084 mMixedEvent=new StEEmcMixEvent();
00085 mRealTree=new TTree("mRealTree","Real Events");
00086 mRealTree->Branch("MixEvent","StEEmcMixEvent",&mRealEvent);
00087 mMixedTree=new TTree("mMixedTree","Mixed Events");
00088 mMixedTree->Branch("MixEvent","StEEmcMixEvent",&mMixedEvent);
00089
00090 AddObj( mRealTree, ".hist" );
00091 AddObj( mMixedTree, ".hist" );
00092
00093 return StMaker::Init();
00094 }
00095
00096 Int_t StEEmcPi0Analysis::InitRun(Int_t run)
00097 {
00098
00099 mSpinDb->print(0);
00100 Info("InitRun","run number = %d",run);
00101 const Int_t *spin8bits=mSpinDb->getSpin8bits();
00102 for(int bx=0;bx<120;bx++){
00103 Bool_t isFilled=(spin8bits[bx] & 0x11)==0x11;
00104 if(isFilled) hFillPatternI->Fill(bx);
00105 }
00106
00107 mRunNumber = run;
00108
00109 return StMaker::InitRun(run);
00110
00111 }
00112
00113 Int_t StEEmcPi0Analysis::Make()
00114 {
00115
00116
00118 Int_t spin4 = -1;
00119 Int_t bxStar = -1;
00120 if ( mSpinDb -> isValid() && mSpinDb -> isPolDirLong() )
00121 spin4=getSpinState( mMuDst->muDst(), bxStar );
00122
00123 hBxStar -> Fill( bxStar );
00124
00125 mRealEvent -> setEvent( mMuDst->muDst()->event() );
00126 mRealEvent -> setSpin4( spin4 );
00127 mMixedEvent -> setEvent( mMuDst->muDst()->event() );
00128 mMixedEvent -> setSpin4( spin4 );
00129
00130 for ( Int_t ii=0;ii<720;ii++ ) {
00131 StEEmcTower tower=mEEanalysis->tower(ii);
00132 if ( tower.fail() ) continue;
00133 mRealEvent->mADC[ii]=(60./4096.)*tower.adc();
00134 mRealEvent->mStat[ii]=tower.stat();
00135 }
00136
00138 if ( !accept( mMuDst->muDst() ) ) goto END_OF_MAKE;
00139 hPairCounter -> Fill( kEvent );
00140
00142 static Int_t mymap[]={0,0,0,0,0,1,2,0,0,3,4};
00143
00145 mRealEvent -> mTotalEnergyT = mEEanalysis -> energy(0);
00146 mRealEvent -> mTotalEnergyP = mEEanalysis -> energy(1);
00147 mRealEvent -> mTotalEnergyQ = mEEanalysis -> energy(2);
00148 mRealEvent -> mTotalEnergyR = mEEanalysis -> energy(3);
00149 mRealEvent -> mTotalEnergyU = mEEanalysis -> energy(4);
00150 mRealEvent -> mTotalEnergyV = mEEanalysis -> energy(5);
00151
00153 for ( Int_t i=0;i<mEEmixer->numberOfCandidates();i++ )
00154 {
00155
00156 StEEmcPair pair = mEEmixer->candidate(i);
00157 hPairCounter -> Fill( kPair );
00158 if ( !accept( pair ) ) continue;
00159
00160 mRealEvent -> addPair( pair );
00161
00162 std::cout << "spin4=" << spin4 << " ";
00163 pair.print();
00164 mHistograms[ kAny ] -> Fill( pair );
00165
00166 StEEmcPoint p1=pair.point(0);
00167 StEEmcPoint p2=pair.point(1);
00168 p1=(p1.energy()>p2.energy())?p1:p2;
00169 if ( p1.sector() >= 2 && p1.sector() < 7 )
00170 mHistograms[5]->Fill( pair );
00171 else
00172 mHistograms[6]->Fill( pair );
00173
00174 mRealEvent->mNumberU[i] = mEEanalysis->numberOfHitStrips( p1.sector(), 0 );
00175 mRealEvent->mNumberV[i] = mEEanalysis->numberOfHitStrips( p1.sector(), 1 );
00176
00177 #if 1
00178
00179
00180
00181
00182 Float_t mMinEnergy = 0.1;
00183 Bool_t used[720];
00184 for ( Int_t j=0;j<720;j++ ) used[j]=false;
00185 StEEmcTower tow=p1.tower(0);
00186 StEEmcCluster c;
00187 if (!tow.fail() )
00188 {
00189 c.add(tow);
00190 used[tow.index()]=true;
00191 StEEmcTowerVec_t hits=mEEanalysis->towers(0);
00192 for ( UInt_t j=0;j<hits.size();j++ )
00193 {
00194 tow=hits[j];
00195 if ( used[ tow.index() ] ) continue;
00196 if ( tow.energy() < mMinEnergy ) continue;
00197 if ( c.isNeighbor( tow ) ) {
00198 c.add(tow);
00199 used[tow.index()]=true;
00200 }
00201 }
00202 }
00203 mRealEvent->mNumberT[i]=c.numberOfTowers();
00204
00205 #endif
00206 #if 1
00207
00208 mMinEnergy=0.1/1000.0;
00209 for ( Int_t j=0;j<720;j++ ) used[j]=false;
00210 Int_t ind=p1.tower(0).index();
00211 tow=mEEanalysis->tower(ind,3);
00212 StEEmcCluster b;
00213 if (!tow.fail() )
00214 {
00215 b.add(tow);
00216 used[tow.index()]=true;
00217 StEEmcTowerVec_t hits=mEEanalysis->towers(3);
00218 for ( UInt_t j=0;j<hits.size();j++ )
00219 {
00220 tow=hits[j];
00221 if ( used[ tow.index() ] ) continue;
00222 if ( tow.energy() < mMinEnergy ) continue;
00223 if ( b.isNeighbor( tow ) ) {
00224 b.add(tow);
00225 used[tow.index()]=true;
00226 }
00227 }
00228 }
00229 mRealEvent->mNumberR[i]=b.numberOfTowers();
00230 #endif
00231
00232
00233
00234
00236 if ( !mSpinSort ) {
00237 std::cout << "Problem detected, spin sorting disabled" << std::endl;
00238 continue;
00239 }
00240
00241 spin4=getSpinState( mMuDst->muDst(),bxStar );
00242 if ( spin4>=0 )
00243 if ( mymap[spin4] ) {
00244 mHistograms[ mymap[spin4] ] -> Fill( pair );
00245 }
00246
00247 hMassBx->Fill(pair.mass(),bxStar);
00248 if ( pair.mass()>0.1 && pair.mass() < 0.18 ) {
00249 hBxStarPi0->Fill(bxStar);
00250 hZvertBx->Fill(pair.vertex().Z(),bxStar);
00251 hZggBx->Fill(pair.zgg(),bxStar);
00252 hEtaBx->Fill(pair.momentum().Eta(),bxStar);
00253 }
00254
00255
00256 }
00257
00259 for ( Int_t i=0;i<mEEmixer->numberOfMixedCandidates();i++ )
00260 {
00261
00262 StEEmcPair pair = mEEmixer->mixedCandidate(i);
00263 if ( !accept( pair, false ) ) continue;
00264 mBackgrounds[ kAny ] -> Fill( pair );
00265 mMixedEvent -> addPair( pair );
00266
00267 }
00268
00269 END_OF_MAKE:
00270 mRealTree->Fill();
00271 mMixedTree->Fill();
00272 return kStOK;
00273 }
00274
00275
00276 void StEEmcPi0Analysis::mixer(const Char_t *name)
00277 {
00278 mEEmixer=(StEEmcMixMaker *)GetMaker(name);
00279 assert(mEEmixer);
00280 }
00281
00282
00283 void StEEmcPi0Analysis::points(const Char_t *name)
00284 {
00285 mEEpoints=(StEEmcPointMaker *)GetMaker(name);
00286 assert(mEEpoints);
00287 }
00288
00289
00290 void StEEmcPi0Analysis::mudst(const Char_t *name)
00291 {
00292 mMuDst=(StMuDstMaker*)GetMaker(name);
00293 assert(mMuDst);
00294 }
00295
00296 void StEEmcPi0Analysis::analysis(const Char_t *name)
00297 {
00298 mEEanalysis=(StEEmcA2EMaker*)GetMaker(name);
00299 assert(mEEanalysis);
00300 }
00301
00302 void StEEmcPi0Analysis::spin(const Char_t *name)
00303 {
00304 mSpinDb=(StSpinDbMaker*)GetMaker(name);
00306 }
00307
00308 Bool_t StEEmcPi0Analysis::twoBodyCut( StEEmcPair &pair )
00309 {
00310
00311 static const Int_t maxPerCluster = 2;
00312 static const Float_t minTowerFrac = 0.;
00313
00315
00316 Bool_t towers[720]; for (Int_t i=0;i<720;i++ ) towers[i]=false;
00317 StEEmcTower t1 = pair.point(0).tower(0);
00318 StEEmcTower t2 = pair.point(1).tower(0);
00319
00320 Float_t Etowers=0.;
00321 Etowers += t1.energy();
00322
00323
00324 towers[ t1.index() ] = true;
00325 towers[ t2.index() ] = true;
00326
00327 for ( Int_t i=0;i<t1.numberOfNeighbors();i++ ) {
00328 StEEmcTower mytow=t1.neighbor(i);
00329 towers[ mytow.index() ] = true;
00330 Etowers += mytow.energy();
00331 }
00332 for ( Int_t i=0;i<t2.numberOfNeighbors();i++ ) {
00333 StEEmcTower mytow=t2.neighbor(i);
00334 if ( !towers[mytow.index()] ) Etowers += mytow.energy();
00335 towers[ mytow.index() ] = true;
00336 }
00337
00338
00339
00341
00344
00345 Int_t count = 0;
00346 for ( Int_t i=0;i<mEEpoints->numberOfPoints();i++ )
00347 {
00348 StEEmcPoint p=mEEpoints->point(i);
00349 StEEmcTower t=p.tower(0);
00350 if ( towers[ t.index() ] ) count++;
00351 }
00352
00353 Float_t Epoints = pair.energy();
00354
00355 return ( count <= maxPerCluster && Epoints > minTowerFrac * Etowers );
00356
00357 }
00358
00359
00360
00361 Bool_t StEEmcPi0Analysis::accept( StMuDst *mudst )
00362 {
00363
00364
00365 StMuEvent *event=mudst->event();
00366 assert(event);
00367
00368 Bool_t good_trigger = false;
00369
00370
00371
00372
00373
00374
00375 StMuTriggerIdCollection tic = event -> triggerIdCollection();
00376 StTriggerId l1trig = tic.l1();
00377
00378 if ( mTriggerList.size() <=0 ) {
00379 good_trigger = true;
00380 }
00381
00382 Int_t go=0;
00383 std::vector<Int_t>::iterator iter=mTriggerList.begin();
00384 while ( iter != mTriggerList.end() ) {
00385 go = l1trig.isTrigger( (*iter) );
00386 good_trigger |= go;
00387 iter++;
00388 }
00389
00390
00391
00392
00393
00394
00395 if ( mTrigSim )
00396 {
00397 good_trigger = mTrigSim -> getEEMCtrigHT( mTrigSimThreshold );
00398 good_trigger &= mTrigSim -> getBBCtrig();
00399 }
00400
00401
00402 if ( l1trig.isTrigger( mMinBias ) )
00403 hEventCounter -> Fill( kMinBias );
00404
00405
00406 if ( good_trigger )
00407 {
00408 hEventCounter -> Fill( kTrig );
00409 }
00410 else
00411 {
00412 return false;
00413 }
00414
00415
00416
00417 StEEmcTower ht;
00418 Bool_t sw36=0;
00419 for ( Int_t i=0;i<mEEanalysis->numberOfHitTowers(0);i++ )
00420 {
00421 StEEmcTower t=mEEanalysis->hittower(i,0);
00422 if ( !t.fail() && t.et() > ht.et() ) {
00423 ht=t;
00424 if ( ht.et()>=mCuts->tower_et_cut &&
00425 ht.sector()>=2&&ht.sector()<=5 ) sw36=true;
00426 }
00427 }
00428 if ( ht.et() < mCuts->tower_et_cut ) {
00429 good_trigger = false;
00430 return false;
00431 }
00432 else
00433 {
00434 hEventCounter -> Fill( kSoftTrig );
00435 }
00436 if ( sw36 ) hEventCounter -> Fill( kSoftTrig36 );
00437
00438
00439 StThreeVectorF vert=event->primaryVertexPosition();
00440 if ( vert.z() < mCuts->z_vertex_min) {
00441
00442 return false;
00443 }
00444 if ( vert.z() > mCuts->z_vertex_max ) {
00445
00446 return false;
00447 }
00448
00449 hEventCounter -> Fill( kVertex );
00450
00451
00452 return true;
00453
00454 }
00455
00456 Bool_t StEEmcPi0Analysis::accept( StEEmcPair pair, Bool_t fill )
00457 {
00458
00460 if ( !twoBodyCut(pair) ) return false;
00461 if (fill) hPairCounter -> Fill( kTwoBody );
00462
00464 StEEmcPoint point1=pair.point(0);
00465 StEEmcPoint point2=pair.point(1);
00466 StEEmcTower tower1=pair.point(0).tower(0);
00467 StEEmcTower tower2=pair.point(1).tower(0);
00468
00469 if ( tower1.adc() < mCuts->adc_cut &&
00470 tower2.adc() < mCuts->adc_cut ) return false;
00471
00472 if ( fill) hPairCounter -> Fill( kAdcTow );
00473
00474
00475
00476
00477
00478 TVector3 d1 = mEEgeom -> getTowerCenter( (UInt_t)tower1.sector(), (UInt_t)tower1.subsector(), (UInt_t)tower1.etabin() );
00479 TVector3 d2 = mEEgeom -> getTowerCenter( (UInt_t)tower2.sector(), (UInt_t)tower2.subsector(), (UInt_t)tower2.etabin() );
00480 d1=d1.Unit();
00481 d2=d2.Unit();
00482 Float_t et1 = (tower1.energy()*d1).Perp();
00483 Float_t et2 = (tower2.energy()*d2).Perp();
00484
00485 if ( et1 < mCuts->tower_et_cut &&
00486 et2 < mCuts->tower_et_cut ) return false;
00487
00488
00489
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509 if ( fill ) hPairCounter -> Fill( kEtTow );
00510
00512 Float_t eta=pair.momentum().Eta();
00513 if ( eta < mCuts->eta_min || eta > mCuts->eta_max ) return false;
00514 if ( fill ) hPairCounter->Fill( kKinematics );
00515
00516
00518
00519
00520
00521 return true;
00522
00523 }
00524
00525
00526 Int_t StEEmcPi0Analysis::getSpinState( StMuDst *mudst, Int_t &bxStar )
00527 {
00528
00529 StMuEvent *event = mudst -> event();
00530 StL0Trigger *trig =&(event->l0Trigger());
00531
00532 StMuTriggerIdCollection tic = event -> triggerIdCollection();
00533 StTriggerId l1trig = tic.l1();
00534
00535
00536 Int_t bx48 = trig->bunchCrossingId();
00537 Int_t bx7 = trig->bunchCrossingId7bit( mRunNumber );
00538
00539
00540 bxStar = mSpinDb->BXyellowUsingBX48(bx48);
00541
00542 mRealEvent->bx48 = bx48;
00543 mRealEvent->bx7 = bx7;
00544 mRealEvent->bxStar = bxStar;
00545
00546 mMixedEvent->bx48=bx48;
00547 mMixedEvent->bx7 =bx7;
00548 mMixedEvent->bxStar=bxStar;
00549
00552 if ( bx7 == 0 || bx7 == 119 ) return -1;
00553 if ( bx7 == 14 || bx7 == 54 ) return -1;
00555
00556 hBx7->Fill( bx7 );
00557 hBx48->Fill( bx48 );
00558 hBx7diffBx48->Fill( bx7, mSpinDb->offsetBX48minusBX7(bx48,bx7) );
00559
00560
00561
00562 if ( mSpinDb -> isMaskedUsingBX48(bx48) ) return -1;
00563 if ( mSpinDb->offsetBX48minusBX7(bx48,bx7)!=0 ) std::cout << "BUNCH CROSSINGS INCONSISTENT" << std::endl << std::flush;
00564
00565
00566
00567
00568 if ( mSpinDb->offsetBX48minusBX7(bx48,bx7)!=0 )
00569 {
00570 mSpinSort = false;
00571 for ( Int_t ii=1;ii<=4;ii++ ) mHistograms[ii]->Clear();
00572 }
00573
00574
00575 Int_t spin4 = mSpinDb->spin4usingBX48(bx48);
00576 hSpin4->Fill(spin4);
00577
00578 if ( l1trig.isTrigger(96011) ) hSpin4mb -> Fill(spin4);
00579
00580
00581 return spin4;
00582
00583 }
00584
00585 void StEEmcPi0Analysis::Clear(Option_t *opts)
00586 {
00587 mRealEvent -> Clear();
00588 mMixedEvent -> Clear();
00589 }