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