00001
00013 #include "StEEmcQAMaker.h"
00014 ClassImp(StEEmcQAMaker);
00015
00016 #include "TH1F.h"
00017 #include "TH2F.h"
00018 #include "TString.h"
00019
00020 #include "StMuDSTMaker/COMMON/StMuDstMaker.h"
00021 #include "StMuDSTMaker/COMMON/StMuDst.h"
00022 #include "StMuDSTMaker/COMMON/StMuEvent.h"
00023 #include "StMuDSTMaker/COMMON/StMuPrimaryVertex.h"
00024 #include "StMuDSTMaker/COMMON/StMuTriggerIdCollection.h"
00025
00026 #include "StEEmcA2EMaker.h"
00027
00028
00029 StEEmcQAMaker::StEEmcQAMaker( const Char_t *name ) : StMaker(name)
00030 {
00031 nVertexMin = 1;
00032 nVertexMax = 999;
00033 zVertexMin = -150;
00034 zVertexMax = +150;
00035 mSamplingFractionT=0.04;
00036 mSamplingFractionU=0.007;
00037 mSamplingFractionV=0.007;
00038 mSoftTrig = 0.;
00039 }
00040
00041
00042 Int_t StEEmcQAMaker::Init()
00043 {
00044 hEventCounter = new TH1F("hEventCounter","Event counts",10,0.,10.);
00045 hEventCounter -> GetXaxis() -> SetBinLabel(1,"raw event");
00046 hEventCounter -> GetXaxis() -> SetBinLabel(2,"triggered");
00047 hEventCounter -> GetXaxis() -> SetBinLabel(3,"|vertex|<cut");
00048 hEventCounter -> GetXaxis() -> SetBinLabel(4,"track cuts");
00049 hEventCounter -> GetXaxis() -> SetBinLabel(5,"eemc response");
00050
00051
00052 hFrequencyT=new TH2F("hFrequencyT","Tower frequency",60,0.,60.,12,0.,12.);
00053 hFrequencyP=new TH2F("hFrequencyP","Pre1 frequency",60,0.,60.,12,0.,12.);
00054 hFrequencyQ=new TH2F("hFrequencyQ","Pre2 frequency",60,0.,60.,12,0.,12.);
00055 hFrequencyR=new TH2F("hFrequencyR","Post frequency",60,0.,60.,12,0.,12.);
00056
00057 for ( UInt_t trig=0;trig<mTriggerList.size();trig++ )
00058 {
00059 TString hname="hTrigId";hname+=mTriggerList[trig];
00060 TString htitle="Triggers analysed per sector [0,12)";
00061 hTriggers.push_back(new TH1F(hname,htitle,12,0.,12.));
00062
00063 hTriggersHard.push_back(new TH1F(hname+"hard",htitle,12,0.,12.));
00064 }
00065
00066 hTriggers.push_back(new TH1F("hTrigOr","Any trigger in trigger list [0,12)",12,0.,12.));
00067
00068
00069
00070 const Char_t *secname[]={
00071 "[0]","[1]","[2]","[3]","[4]","[5]","[6]","[7]","[8]","[9]",
00072 "[10]","[11]","Full","Cut"};
00073
00074
00075
00076 for ( Int_t sec=0;sec<14;sec++ )
00077 {
00078
00079 TString hname="hEnergyDeposit";
00080 TString htitle="EM Energy [GeV] summed over towers in sector ";
00081
00082 htitle+=secname[sec];
00083 hEnergyDepositT.push_back(new TH1F(hname+"T"+secname[sec],htitle,60,0.,60.));
00084 htitle="Energy deposit [MeV] summed over towers in sector ";
00085 hEnergyDepositP.push_back(new TH1F(hname+"P"+secname[sec],htitle,50,0.,200.));
00086 hEnergyDepositQ.push_back(new TH1F(hname+"Q"+secname[sec],htitle,50,0.,200.));
00087 hEnergyDepositR.push_back(new TH1F(hname+"R"+secname[sec],htitle,50,0.,200.));
00088 htitle.ReplaceAll("towers","smd strips");
00089 hEnergyDepositU.push_back(new TH1F(hname+"U"+secname[sec],htitle,50,0.,400.));
00090 hEnergyDepositV.push_back(new TH1F(hname+"V"+secname[sec],htitle,50,0.,400.));
00091
00092
00093 hname.ReplaceAll("EnergyDeposit","Multiplicity");
00094 htitle="Sector multiplicity ";htitle+=secname[sec];
00095
00096 hMultiplicityT.push_back(new TH1F(hname+"T"+secname[sec],htitle,60,0.,60.));
00097 hMultiplicityP.push_back(new TH1F(hname+"P"+secname[sec],htitle,60,0.,60.));
00098 hMultiplicityQ.push_back(new TH1F(hname+"Q"+secname[sec],htitle,60,0.,60.));
00099 hMultiplicityR.push_back(new TH1F(hname+"R"+secname[sec],htitle,60,0.,60.));
00100 hMultiplicityU.push_back(new TH1F(hname+"U"+secname[sec],htitle,60,0.,60.));
00101 hMultiplicityV.push_back(new TH1F(hname+"V"+secname[sec],htitle,60,0.,60.));
00102
00103
00104 hname="hAdc";
00105 htitle="ADC-ped in ";htitle+=secname[sec];
00106
00107 hAdcT.push_back(new TH1F(hname+"T"+secname[sec],htitle,512,0.,512.));
00108 hAdcP.push_back(new TH1F(hname+"P"+secname[sec],htitle,512,0.,512.));
00109 hAdcQ.push_back(new TH1F(hname+"Q"+secname[sec],htitle,512,0.,512.));
00110 hAdcR.push_back(new TH1F(hname+"R"+secname[sec],htitle,512,0.,512.));
00111 hAdcU.push_back(new TH1F(hname+"U"+secname[sec],htitle,512,0.,512.));
00112 hAdcV.push_back(new TH1F(hname+"V"+secname[sec],htitle,512,0.,512.));
00113
00114
00115 hname="hNglobal";hname+=secname[sec];
00116 hNglobal.push_back(new TH1F(hname,"Number of global tracks",50,0.,50.));
00117 hname="hNprimary";hname+=secname[sec];
00118 hNprimary.push_back(new TH1F(hname,"Number of primary tracks",50,0.,50.));
00119 hname="hNvertex";hname+=secname[sec];
00120 hNvertex.push_back(new TH1F(hname,"Number of primary vertices",10,0.,10.));
00121 hname="hZvertex";hname+=secname[sec];
00122 hZvertex.push_back(new TH1F(hname,"Z of 1st primary vertex",200,-200.,200.));
00123 hname="hZvertexErr";hname+=secname[sec];
00124 hZvertexErr.push_back(new TH1F(hname,"Z err of 1st primary vertex",200,-200.,200.));
00125 hname="hRankVertex";hname+=secname[sec];
00126 hRankVertex.push_back(new TH1F(hname,"Ranking of 1st primary vertex",100,0.,100.));
00127 hname="hNtrackVertex";hname+=secname[sec];
00128 hNtrackVertex.push_back(new TH1F(hname,"Number of tracks used 1st prim vert",25,0.,25.));
00129 hname="hNtrackVertexEE";hname+=secname[sec];
00130 hNtrackVertexEE.push_back(new TH1F(hname,"Number of tracks used 1st prim vert macthed to eemc",25,0.,25.));
00131 hname="hPTsumVertex";hname+=secname[sec];
00132 hPTsumVertex.push_back(new TH1F(hname,"Scalar pT sum of tracks used 1st prim vertex [GeV]",100,0.,100.));
00133
00134 }
00135
00136
00137 return StMaker::Init();
00138 }
00139
00140
00141 Int_t StEEmcQAMaker::Make()
00142 {
00143
00145 hEventCounter -> Fill( 0 );
00146
00148 if ( !CheckTriggers() ) return kStOK;
00149 hEventCounter -> Fill( 1 );
00150
00152 if ( !CheckVertex() ) return kStOK;
00153 hEventCounter -> Fill( 2 );
00154
00156 if ( !CheckTracks() ) return kStOK;
00157 hEventCounter -> Fill( 3 );
00158
00160 if ( !EEmcResponse() ) return kStOK;
00161 hEventCounter -> Fill ( 4 );
00162
00163
00164 return StMaker::Make();
00165 }
00166
00167
00168 void StEEmcQAMaker::analysis(const Char_t *name)
00169 {
00170 mEEanalysis=(StEEmcA2EMaker *)GetMaker(name);
00171 assert(mEEanalysis);
00172 }
00173
00174
00175 void StEEmcQAMaker::mudst(const Char_t *name)
00176 {
00177 mMuDst=(StMuDstMaker*)GetMaker(name);
00178 assert(mMuDst);
00179 }
00180
00181
00182 Bool_t StEEmcQAMaker::CheckTriggers()
00183 {
00184
00186 StMuEvent *event = mMuDst -> muDst() -> event();
00187 assert(event);
00188
00189 mSectorTrigger = -1;
00190
00192 StMuTriggerIdCollection tic = event -> triggerIdCollection();
00193 StTriggerId l1trig = tic.l1();
00194
00196
00197
00198
00199
00200 StEEmcTower ht;
00201 Bool_t got_ht = false;
00202 for ( Int_t i=0;i<mEEanalysis->numberOfHitTowers(0);i++ )
00203 {
00204 StEEmcTower tow=mEEanalysis->hittower(i,0);
00205 if ( tow.et() > ht.et() && !(tow.fail()) )
00206 {
00207 ht=tow;
00208 got_ht = true;
00209 }
00210 }
00211 if ( !got_ht ) return false;
00212
00214 Bool_t go=false;
00215
00216 if ( mTriggerList.size() == 0 ) go = true;
00217 for ( UInt_t i=0;i<mTriggerList.size();i++ )
00218 {
00219 Int_t myId = mTriggerList[i];
00220 if ( l1trig.isTrigger( myId ) && ht.et() > mSoftTrig ) {
00221 go=true;
00222 hTriggers[i] -> Fill ( ht.sector() );
00223 mSectorTrigger = ht.sector();
00224 }
00225 if ( l1trig.isTrigger( myId ) ) {
00226 hTriggersHard[i]->Fill( ht.sector() );
00227 }
00228 }
00229 if ( go ) hTriggers[ mTriggerList.size() ] -> Fill( ht.sector() );
00230
00231 return go;
00232 }
00233
00234
00235
00236
00237
00238
00239
00240 Bool_t StEEmcQAMaker::CheckVertex()
00241 {
00242
00243
00244 StMuEvent *event = mMuDst -> muDst() -> event();
00245 assert(event);
00246 Bool_t go = false;
00247
00249 if ( mSectorTrigger < 0 ) return false;
00250
00252 StEEmcTower ht = mEEanalysis->hightower();
00253 if ( ht.fail() ) return false;
00254
00255
00256 Int_t numberOfVertices=mMuDst -> muDst() -> numberOfPrimaryVertices();
00257 hNvertex[ mSectorTrigger ] -> Fill( numberOfVertices );
00258 hNvertex[ 12 ] -> Fill( numberOfVertices );
00259 if ( numberOfVertices < nVertexMin ||
00260 numberOfVertices > nVertexMax ) return false;
00261 hNvertex[ 13 ] -> Fill( numberOfVertices );
00262
00265 if ( !numberOfVertices ) return true;
00266
00268 StMuPrimaryVertex *vertex = mMuDst -> muDst() -> primaryVertex(0);
00269 Float_t zvertex=vertex->position().z();
00270 hZvertex[ mSectorTrigger ] -> Fill ( zvertex );
00271 hZvertex[ 12 ] -> Fill( zvertex );
00272 if ( zvertex < zVertexMin || zvertex > zVertexMax ) return false;
00273 hZvertex[ 13 ] -> Fill( zvertex );
00274
00275
00276 Float_t ezvertex = vertex->posError().z();
00277 hZvertexErr[ mSectorTrigger ] -> Fill( ezvertex );
00278 hZvertexErr[ 12 ] -> Fill( ezvertex );
00279
00280
00282 Float_t rank = vertex -> ranking();
00283 hRankVertex[ mSectorTrigger ] -> Fill ( rank );
00284 hRankVertex[ 12 ] -> Fill ( rank );
00285
00286
00288 Int_t ntrack = vertex -> nTracksUsed();
00289 hNtrackVertex[ mSectorTrigger ] -> Fill( ntrack );
00290 hNtrackVertex[ 12 ] -> Fill( ntrack );
00291
00292
00293 ntrack = vertex -> nEEMCMatch();
00294 hNtrackVertexEE[ mSectorTrigger ] -> Fill( ntrack );
00295 hNtrackVertexEE[ 12 ] -> Fill( ntrack );
00296
00297
00299 Float_t ptsum = vertex -> sumTrackPt();
00300 hPTsumVertex[ mSectorTrigger ] -> Fill( ptsum );
00301 hPTsumVertex[ 12 ] -> Fill( ptsum );
00302
00303 return go;
00304 }
00305
00306
00307
00308 Bool_t StEEmcQAMaker::CheckTracks()
00309 {
00310
00312 StEEmcTower ht = mEEanalysis->hightower();
00313 if ( ht.fail() ) return false;
00314
00315 if ( mSectorTrigger < 0 ) return false;
00316
00318 Int_t nGlobal=mMuDst->muDst()->numberOfGlobalTracks();
00319 hNglobal[ mSectorTrigger ] -> Fill( nGlobal );
00320 hNglobal[ 12 ] -> Fill( nGlobal );
00321
00323 Int_t nPrimary=mMuDst->muDst()->numberOfPrimaryTracks();
00324 hNprimary[ mSectorTrigger ] -> Fill( nPrimary );
00325 hNprimary[ 12 ] -> Fill( nPrimary );
00326
00327 return true;
00328 }
00329
00330
00331
00332
00333
00334
00335
00336 Bool_t StEEmcQAMaker::EEmcResponse()
00337 {
00338
00339 Int_t mysector = mSectorTrigger;
00340
00342 StEEmcTower ht = mEEanalysis->hightower();
00343 if ( ht.fail() ) return false;
00344
00345 if ( mysector < 0 ) return false;
00346
00347
00348 Int_t ht_phi = ht.phibin();
00349 Int_t ht_eta = ht.etabin();
00350
00352 hFrequencyT -> Fill( ht_phi, ht_eta );
00353
00354 StEEmcTower pre1 = mEEanalysis->hightower(1);
00355 StEEmcTower pre2 = mEEanalysis->hightower(2);
00356 StEEmcTower post = mEEanalysis->hightower(3);
00357 hFrequencyP -> Fill ( pre1.phibin(), pre1.etabin() );
00358 hFrequencyQ -> Fill ( pre2.phibin(), pre2.etabin() );
00359 hFrequencyR -> Fill ( post.phibin(), post.etabin() );
00360
00362 Float_t energy_deposit[6];
00363 for ( Int_t i=0;i<6;i++ )
00364 {
00365 energy_deposit[i] = mEEanalysis->energy( mysector, i );
00366 }
00368
00369 for ( Int_t i=1;i<6;i++ )
00370 energy_deposit[i] *= 1000.0;
00371
00372 hEnergyDepositT[mysector]->Fill( energy_deposit[0] );
00373 hEnergyDepositP[mysector]->Fill( energy_deposit[1] );
00374 hEnergyDepositQ[mysector]->Fill( energy_deposit[2] );
00375 hEnergyDepositR[mysector]->Fill( energy_deposit[3] );
00376 hEnergyDepositU[mysector]->Fill( energy_deposit[4] );
00377 hEnergyDepositV[mysector]->Fill( energy_deposit[5] );
00378
00379 hMultiplicityT[mysector]->Fill( mEEanalysis->numberOfHits(mysector,0) );
00380 hMultiplicityP[mysector]->Fill( mEEanalysis->numberOfHits(mysector,1) );
00381 hMultiplicityQ[mysector]->Fill( mEEanalysis->numberOfHits(mysector,2) );
00382 hMultiplicityR[mysector]->Fill( mEEanalysis->numberOfHits(mysector,3) );
00383 hMultiplicityU[mysector]->Fill( mEEanalysis->numberOfHits(mysector,4) );
00384 hMultiplicityV[mysector]->Fill( mEEanalysis->numberOfHits(mysector,5) );
00385
00386 for ( Int_t sub=0;sub<5; sub++ )
00387 for ( Int_t eta=0;eta<12;eta++ )
00388 {
00389 StEEmcTower t=mEEanalysis->tower(mysector,sub,eta,0);
00390 if ( t.adc()>0. && !t.fail() ) hAdcT[ mysector ] -> Fill ( t.adc() );
00391 t=mEEanalysis->tower(mysector,sub,eta,1);
00392 if ( t.adc()>0. && !t.fail() ) hAdcP[ mysector ] -> Fill ( t.adc() );
00393 t=mEEanalysis->tower(mysector,sub,eta,2);
00394 if ( t.adc()>0. && !t.fail() ) hAdcQ[ mysector ] -> Fill ( t.adc() );
00395 t=mEEanalysis->tower(mysector,sub,eta,3);
00396 if ( t.adc()>0. && !t.fail() ) hAdcR[ mysector ] -> Fill ( t.adc() );
00397 }
00398 for (Int_t hit=0;hit<mEEanalysis->numberOfHitStrips(mysector,0);hit++ )
00399 {
00400 StEEmcStrip strip=mEEanalysis->hitstrip(mysector,0,hit);
00401 if ( strip.fail() || strip.energy()<=0. ) continue;
00402 hAdcU[mysector]->Fill( strip.adc() );
00403 }
00404
00405 for (Int_t hit=0;hit<mEEanalysis->numberOfHitStrips(mysector,1);hit++ )
00406 {
00407 StEEmcStrip strip=mEEanalysis->hitstrip(mysector,1,hit);
00408 if ( strip.fail() || strip.energy()<=0. ) continue;
00409 hAdcV[mysector]->Fill( strip.adc() );
00410 }
00411
00412
00413 return true;
00414 }