00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105 #include "Stiostream.h"
00106
00107 #include "St_DataSetIter.h"
00108 #include "TObjectSet.h"
00109 #include "TH1.h"
00110 #include "TH2.h"
00111 #include "TNtuple.h"
00112 #include "TFile.h"
00113
00114 #include "StMessMgr.h"
00115 #include "StSvtClassLibrary/StSvtHybridCollection.hh"
00116 #include "StSvtClassLibrary/StSvtHybridData.hh"
00117 #include "StSvtClassLibrary/StSvtHybridPixels.hh"
00118 #include "StSvtClassLibrary/StSvtData.hh"
00119 #include "StSvtClassLibrary/StSvtHybridBadAnodes.hh"
00120 #include "StSequence.hh"
00121 #include "StSvtAnalysis.hh"
00122 #include "StSvtAnalysedHybridClusters.hh"
00123 #include "StSvtClusterAnalysisMaker.h"
00124 #include "StSvtSeqAdjMaker/StSvtSeqAdjMaker.h"
00125
00126
00127
00128 StSvtClusterAnalysisMaker::StSvtClusterAnalysisMaker(const char *name) : StMaker(name)
00129 {
00130 mSvtAdjEvent = NULL;
00131
00132 mHybridRawData = NULL;
00133 mHybridAdjData = NULL;
00134 mHybridPixelData = NULL;
00135
00136 mSvtBadAnode = NULL;
00137 mSvtBadAnodeSet = NULL;
00138
00139 mSvtRawEventColl = NULL;
00140 mSvtClusterColl = NULL;
00141 mSvtPixelColl = NULL;
00142 mSvtAnalColl = NULL;
00143
00144 mSvtAnalysis = NULL;
00145 mSvtHit = NULL;
00146 mSvtAnalClusters = NULL;
00147
00148 mNumOfClusters = 0;
00149 mTotNumOfClusters = 0;
00150 mTotNumOfGoodClusters = 0;
00151 mTotNumOfBadClusters = 0;
00152
00153 for(int i = 0; i < 128; i++)
00154 for(int j = 0; j < 240; j++)
00155 adcArray[i + j*128] = 0.0;
00156
00157 m_n_seq =0;
00158 m_sumADC =0;
00159 m_sumADC_all =0;
00160 m_nClust =0;
00161 m_time_anode_clu=0;
00162 m_time_anode_raw=0;
00163 m_SumADCvsTime =0;
00164 m_PeakADCvsTime =0;
00165 }
00166
00167
00168 StSvtClusterAnalysisMaker::~StSvtClusterAnalysisMaker()
00169 {
00170 mSvtAnalClusters=0;
00171 mSvtAnalColl =0;
00172 delete mSvtAnalysis; mSvtAnalysis =0;
00173
00174 delete m_n_seq;
00175 delete m_sumADC_all;
00176 delete m_nClust;
00177 delete m_SumADCvsTime;
00178 delete m_PeakADCvsTime;
00179
00180 for (int i=0; i<mTotalNumberOfHybrids;i++) {
00181 if (m_time_anode_raw) delete m_time_anode_raw[i];
00182 if (m_time_anode_clu) delete m_time_anode_clu[i];
00183 if (m_sumADC) delete m_sumADC[i];
00184 }
00185 delete [] m_time_anode_raw;
00186 delete [] m_time_anode_clu;
00187 delete [] m_sumADC;
00188 }
00189
00190 Int_t StSvtClusterAnalysisMaker::InitRun(int runumber)
00191 {
00192 if( Debug()) gMessMgr->Debug() <<"In StSvtClusterAnalysisMaker::Init()"
00193 << GetName() <<endm;
00194
00195 mNoEvents=0;
00196
00197
00198 GetSvtRawEvent();
00199 GetSvtEvent();
00200 GetSvtCluster();
00201 SetSvtAnalysis();
00202
00203
00204 mTotalNumberOfHybrids = mSvtRawEventColl->getTotalNumberOfHybrids();
00205
00206 if (Debug()) hfile = new TFile("myrootfile_clus.root","RECREATE","Demo ROOT file");
00207
00208 CreateClusterHist(mTotalNumberOfHybrids);
00209
00210 St_DataSet* dataSet;
00211 dataSet = GetDataSet("StSvtBadAnodes");
00212 if (dataSet)
00213 mSvtBadAnodeSet = (StSvtHybridCollection*)(dataSet->GetObject());
00214
00215 mSvtAnalysis = new StSvtAnalysis(mTotalNumberOfHybrids);
00216
00217 mSvtAnalysis->LoadAnodeGains();
00218
00219 return StMaker::InitRun(runumber);
00220
00221 }
00222
00223
00224
00225 Int_t StSvtClusterAnalysisMaker::GetSvtRawEvent()
00226 {
00227 St_DataSet *dataSet;
00228
00229 dataSet = GetDataSet("StSvtRawData");
00230 if( !dataSet) return kStWarn;
00231 mSvtRawEventColl = (StSvtHybridCollection*)(dataSet->GetObject());
00232 if( !mSvtRawEventColl) return kStWarn;
00233
00234 return kStOK;
00235 }
00236
00237
00238 Int_t StSvtClusterAnalysisMaker::GetSvtEvent()
00239 {
00240 St_DataSet *dataSet;
00241
00242 dataSet = GetDataSet("StSvtData");
00243 mSvtAdjEvent = (StSvtData*)(dataSet->GetObject());
00244
00245 return kStOK;
00246 }
00247
00248
00249
00250 Int_t StSvtClusterAnalysisMaker::GetSvtCluster()
00251 {
00252 St_DataSet *dataSet;
00253
00254 dataSet = GetDataSet("StSvtCluster");
00255 if( !dataSet) return kStWarn;
00256 mSvtClusterColl = (StSvtHybridCollection*)(dataSet->GetObject());
00257 if( !mSvtClusterColl) return kStWarn;
00258 return kStOK;
00259 }
00260
00261
00262
00263 Int_t StSvtClusterAnalysisMaker::GetSvtPixels()
00264 {
00265
00266 St_DataSet *dataSet;
00267
00268 dataSet = GetDataSet("StSvtPixels");
00269 assert(dataSet);
00270 mSvtPixelColl = (StSvtHybridCollection*)(dataSet->GetObject());
00271 assert(mSvtPixelColl);
00272
00273 return kStOK;
00274 }
00275
00276
00277 Int_t StSvtClusterAnalysisMaker::SetSvtAnalysis()
00278 {
00279 mSvtAnalSet = new St_ObjectSet("StSvtAnalResults");
00280
00281 AddConst(mSvtAnalSet);
00282 SetOutput(mSvtAnalSet);
00283
00284 mSvtAnalColl = new StSvtHybridCollection(mSvtAdjEvent->getConfiguration());
00285
00286 mSvtAnalSet->SetObject(mSvtAnalColl);
00287
00288 return kStOK;
00289 }
00290
00291
00292
00293
00294
00295 Int_t StSvtClusterAnalysisMaker::CreateClusterHist(Int_t tNuOfHyb)
00296 {
00297
00298
00299 m_n_seq = new TH1F("NSeqClust","No. Pixels on cluster",100,0.,300.);
00300 m_nClust = new TH2F("NClust","No. clusters per event",1000,0.,1000.,100,0.,3000.);
00301 m_SumADCvsTime = new TH2F("SumAdcVsTime" ,"Time bucket vs Sum ADC",128,0.,128.,1000,0,100);
00302 m_PeakADCvsTime = new TH2F("PeakAdcVsTime" ,"Time bucket vs PeakADC",128,0.,128.,50,0,50);
00303 m_sumADC_all = new TH1F("SumADCall","Sum of ADC counts in cluster",500,0,500);
00304 m_time_anode_clu = new TH2F*[tNuOfHyb]; memset(m_time_anode_clu,0,tNuOfHyb*sizeof(void*));
00305 m_time_anode_raw = new TH2F*[tNuOfHyb]; memset(m_time_anode_raw,0,tNuOfHyb*sizeof(void*));
00306 m_sumADC = new TH1F*[tNuOfHyb]; memset(m_sumADC ,0,tNuOfHyb*sizeof(void*));
00307
00308
00309
00310 if(Debug()){
00311 char title1[20];
00312 char titleraw[20];
00313 char titleadc[20];
00314 char title2[4];
00315 char* title3;
00316 char* titlerawc;
00317 char* titleadcc;
00318 for (int barrel = 1;barrel <= mSvtRawEventColl->getNumberOfBarrels();barrel++) {
00319 for (int ladder = 1;ladder <= mSvtRawEventColl->getNumberOfLadders(barrel);ladder++) {
00320 for (int wafer = 1;wafer <= mSvtRawEventColl->getNumberOfWafers(barrel);wafer++) {
00321 for (int hybrid = 1;hybrid <= mSvtRawEventColl->getNumberOfHybrids();hybrid++) {
00322
00323 int index = mSvtRawEventColl->getHybridIndex(barrel,ladder,wafer,hybrid);
00324 if(index < 0) continue;
00325 sprintf(title1,"TimAnodecluster");
00326 sprintf(titleraw,"TimAnodeRaw");
00327 sprintf(titleadc,"ADC");
00328 sprintf(title2,"%d", index);
00329 title3 = strcat(title1,title2);
00330 titlerawc = strcat(titleraw,title2);
00331 titleadcc = strcat(titleadc,title2);
00332 m_time_anode_clu[index] = new TH2F(title3 ,"Time bucket vs anode",240,0.5,240.5,129,-0.5,128.5);
00333 m_time_anode_raw[index] = new TH2F(titlerawc ,"Time bucket vs anode",240,0.5,240.5,129,-0.5,128.5);
00334 m_sumADC[index] = new TH1F(titleadcc,"Sum of ADC counts in cluster",200,0,200);
00335 }
00336 }
00337 }
00338 }
00339 }
00340
00341
00342 return kStOK;
00343 }
00344
00345
00346
00347
00348 Int_t StSvtClusterAnalysisMaker::Make()
00349 {
00350
00351 if (Debug()) gMessMgr->Debug() << "In StSvtClusterAnalysisMaker::Make() ..."
00352 << GetName() << endm;
00353
00354 if( GetSvtRawEvent()){
00355 gMessMgr->Warning() << " StSvtClusterAnalysisMaker::Make :No SVT RAW data " << endm;
00356 return kStWarn;
00357 }
00358 if( GetSvtEvent()){
00359 gMessMgr->Warning() << " StSvtClusterAnalysisMaker::Make :No SVT seq data " << endm;
00360 return kStWarn;
00361 }
00362 if( GetSvtCluster()){
00363 gMessMgr->Warning() << " StSvtClusterAnalysisMaker::Make :No SVT cluster data " << endm;
00364 return kStWarn;
00365 }
00366
00367
00368 mNoEvents++;
00369
00370 SetClusterAnalysis();
00371 if( Debug()) MakeHistograms();
00372
00373 return kStOK;
00374
00375 }
00376
00377
00378
00379 Int_t StSvtClusterAnalysisMaker::SetClusterAnalysis()
00380 {
00381 int index =0;
00382 float T0Jitter;
00383
00384 StSvtSeqAdjMaker* StSvtSeqMaker = (StSvtSeqAdjMaker*)GetMaker("SvtSeqAdj");
00385
00386 for(int barrel = 1;barrel <= mSvtAdjEvent->getNumberOfBarrels();barrel++) {
00387
00388 for (int ladder = 1;ladder <= mSvtAdjEvent->getNumberOfLadders(barrel);ladder++) {
00389
00390 for (int wafer = 1;wafer <= mSvtAdjEvent->getNumberOfWafers(barrel);wafer++) {
00391
00392 for (int hybrid = 1;hybrid <=mSvtAdjEvent->getNumberOfHybrids();hybrid++){
00393
00394
00395 index = mSvtAdjEvent->getHybridIndex(barrel,ladder,wafer,hybrid);
00396 if(index < 0) continue;
00397
00398 mHybridAdjData = (StSvtHybridData *)mSvtAdjEvent->at(index);
00399 if( !mHybridAdjData) continue;
00400
00401
00402 T0Jitter = (float)(mHybridAdjData->getTimeZero());
00403 if( T0Jitter < 4. && T0Jitter > 2.){
00404 T0Jitter = 0.;
00405 }
00406 else if( T0Jitter < 5. && T0Jitter > 3.){
00407 T0Jitter = 3. - (8./3.);
00408 }
00409 else if( T0Jitter < 6. && T0Jitter > 4.){
00410 T0Jitter = 6. - ( 2.*8./3.);
00411 }
00412
00413 mHybridCluster = (StSvtHybridCluster*)mSvtClusterColl->at(index);
00414 if (! mHybridCluster) continue;
00415 mHybridRawData = (StSvtHybridData *)mSvtRawEventColl->at(index);
00416 if (! mHybridRawData) continue;
00417 mNumOfClusters = mHybridCluster->getNumberOfClusters();
00418
00419 mSvtBadAnode=0;
00420 if( mSvtBadAnodeSet) mSvtBadAnode = (StSvtHybridBadAnodes*)mSvtBadAnodeSet->at(index);
00421 mSvtAnalysis->SetPointers(mHybridAdjData,mHybridRawData,
00422 mHybridCluster,mSvtBadAnode,
00423 mSvtAdjEvent->getTotalNumberOfHybrids(),
00424 StSvtSeqMaker->GetPedOffset());
00425 mSvtAnalysis->SetHybIndex(index);
00426 mSvtAnalysis->FirstAndLastAnodes();
00427 mSvtAnalysis->CluFirstTimeBin();
00428 mSvtAnalysis->CluLastTimeBin();
00429 mSvtAnalysis->MomentAnalysis();
00430 mSvtAnalysis->updateTruth();
00431
00432
00433
00434 mSvtAnalClusters = (StSvtAnalysedHybridClusters*) mSvtAnalColl->at(index);
00435
00436 if( mSvtAnalClusters){
00437 delete mSvtAnalClusters;
00438 mSvtAnalColl->at(index) = 0;
00439 }
00440 mSvtAnalClusters = new StSvtAnalysedHybridClusters(barrel, ladder, wafer, hybrid);
00441
00442 mSvtAnalClusters->setMembers(mSvtAnalysis->GetnSvtClu(),
00443 mSvtAdjEvent->getProperHybridIndex(
00444 barrel,ladder,wafer,hybrid));
00445 mSvtAnalClusters->setSvtHit(mSvtAnalysis,T0Jitter);
00446 mSvtAnalColl->put_at(mSvtAnalClusters,index);
00447
00448
00449 for( int clu=0; clu<mSvtAnalysis->GetnSvtClu(); clu++){
00450
00451 if(Debug() && m_sumADC[index]) m_sumADC[index]->Fill(mSvtAnalysis->GetCluCharge(clu));
00452 m_SumADCvsTime->Fill((float)mSvtAnalysis->GetMeanClusterTimeBin(clu),(float)mSvtAnalysis->GetCluCharge(clu));
00453
00454 m_PeakADCvsTime->Fill((float)mSvtAnalysis->GetMeanClusterTimeBin(clu),(float)mSvtAnalysis->GetCluPeakAdc(clu));
00455
00456 m_n_seq->Fill(mSvtAnalysis->GetCluNumPixels(clu));
00457 m_sumADC_all->Fill((float)mSvtAnalysis->GetCluCharge(clu));
00458
00459
00460 }
00461
00462 }
00463 }
00464 }
00465 }
00466
00467
00468
00469 return kStOK;
00470 }
00471
00472
00473 void StSvtClusterAnalysisMaker::printClusterInfo()
00474 {
00475
00476 int index = 0;
00477 mTotNumOfGoodClusters = 0;
00478 mTotNumOfBadClusters = 0;
00479
00480 for(int barrel = 1;barrel <= mSvtAdjEvent->getNumberOfBarrels();barrel++) {
00481
00482 for (int ladder = 1;ladder <= mSvtAdjEvent->getNumberOfLadders(barrel);ladder++) {
00483
00484 for (int wafer = 1;wafer <= mSvtAdjEvent->getNumberOfWafers(barrel);wafer++) {
00485
00486 for (int hybrid = 1;hybrid <=mSvtAdjEvent->getNumberOfHybrids();hybrid++){
00487
00488
00489 index = mSvtAnalColl->getHybridIndex(barrel,ladder,wafer,hybrid);
00490 if(index < 0) continue;
00491
00492 if(index == 8 || index == 9 || index == 12 || index == 13)
00493 {
00494 mSvtAnalClusters = (StSvtAnalysedHybridClusters*)mSvtAnalColl->getObject(barrel,ladder,wafer,hybrid);
00495
00496 mNumOfClusters = mSvtAnalClusters->numOfHits();
00497 mSvtHit = mSvtAnalClusters->svtHit();
00498
00499 for(int i = 0; i < mNumOfClusters; i++)
00500 {
00501 int flag = mSvtHit[i].flag();
00502 if(flag == 0)
00503 {
00504 ++mTotNumOfGoodClusters;
00505 }
00506 }
00507
00508 }
00509 }
00510 }
00511 }
00512 }
00513
00514
00515 }
00516
00517
00518
00519
00520
00521 Int_t StSvtClusterAnalysisMaker::GetRawData(int index)
00522 {
00523 int* anodeList;
00524 int numOfAnodes,numOfSeq,seqStart;
00525 unsigned char* adc;
00526 StSequence* svtSequence;
00527
00528 numOfAnodes = mHybridRawData->getAnodeList(anodeList);
00529
00530
00531
00532 int counter = 0;
00533
00534 int an = 0;
00535 int seq = 0, mseq = 0;
00536 do
00537 {
00538 while(an + 1)
00539 {
00540 if(an < numOfAnodes)
00541 {
00542 mHybridRawData->getListSequences(an,numOfSeq,svtSequence);
00543 seqStart = svtSequence[seq].startTimeBin;
00544 adc = svtSequence[seq].firstAdc;
00545
00546 ++an;
00547 }
00548 else if(an == numOfAnodes)
00549 an = -1;
00550 }
00551
00552 cout<<"\n\n";
00553 an = 0;
00554 ++mseq;
00555
00556 } while(!an && seqStart + mseq < 128);
00557
00558
00559 cout<<"\n\n";
00560
00561 cout<<"numOfSeq for hybrid index"<<index<<" = "<<counter<<endl;
00562
00563 return kStOK;
00564 }
00565
00566
00567
00568 Int_t StSvtClusterAnalysisMaker::GetPixelData(int index)
00569 {
00570 cout<<"hybrid index: "<<index<<endl;
00571 cout<<"\n";
00572
00573 for(int tim = 0; tim < 128; tim++)
00574 {
00575 cout<<"\n";
00576 for(int an = 1; an <= 240; an++)
00577 {
00578 if(an < 30)
00579 cout<<"Pixel"<<"["<<an - 1<<"]"<<"["<<tim<<"] = "<< mHybridPixelData->getPixelContent(an,tim)<<endl;
00580 }
00581 }
00582
00583 return kStOK;
00584 }
00585
00586
00587
00588
00589 void StSvtClusterAnalysisMaker::MakeHistograms(){
00590
00591 int mSequence;
00592 int listAn, actualAn,seq,stTimeBin,len;
00593
00594 unsigned char* adc;
00595
00596 int index = 0;
00597
00598 StSequence* svtSequence;
00599 StSvtClusterMemberInfo** tempMemberInfo;
00600
00601 int TotalClusters=0;
00602
00603 for(int barrel = 1;barrel <= mSvtAdjEvent->getNumberOfBarrels();barrel++) {
00604 for(int ladder = 1;ladder <= mSvtAdjEvent->getNumberOfLadders(barrel);ladder++) {
00605 for(int wafer = 1;wafer <= mSvtAdjEvent->getNumberOfWafers(barrel);wafer++) {
00606 for(int hybrid = 1;hybrid <=mSvtAdjEvent->getNumberOfHybrids();hybrid++){
00607
00608 index = mSvtAdjEvent->getHybridIndex(barrel,ladder,wafer,hybrid);
00609 if(index < 0) continue;
00610
00611
00612
00613 m_time_anode_clu[index]->Reset();
00614 m_time_anode_raw[index]->Reset();
00615
00616 mHybridAdjData = (StSvtHybridData *)mSvtAdjEvent->at(index);
00617 if( !mHybridAdjData) continue;
00618 mHybridCluster = (StSvtHybridCluster*)mSvtClusterColl->at(index);
00619 if ( !mHybridCluster) continue;
00620 mNumOfClusters = mHybridCluster->getNumberOfClusters();
00621
00622 TotalClusters+=mNumOfClusters;
00623 gMessMgr->Message()<<"numOfClusters = "<<mNumOfClusters << " For index = " << index<< " " ;
00624
00625 tempMemberInfo = new StSvtClusterMemberInfo*[mNumOfClusters];
00626
00627 for(int clu = 0; clu < mNumOfClusters; clu++)
00628 {
00629
00630 mTotNumOfClusters += mNumOfClusters;
00631
00632 tempMemberInfo[clu] = mHybridCluster->getCluMemInfo(clu);
00633 mNumOfMembers = mHybridCluster->getNumberOfMembers(clu);
00634
00635
00636
00637 for(int mem = 0; mem < mNumOfMembers; mem++)
00638 {
00639 listAn = tempMemberInfo[clu][mem].listAnode;
00640 seq = tempMemberInfo[clu][mem].seq;
00641 actualAn = tempMemberInfo[clu][mem].actualAnode;
00642 mHybridAdjData->getListSequences(listAn,mSequence,svtSequence);
00643
00644
00645 stTimeBin =svtSequence[seq].startTimeBin;
00646 len = svtSequence[seq].length;
00647 adc = svtSequence[seq].firstAdc;
00648
00649
00650 int count=0;
00651 for(int k = 0; k < len ; k++)
00652 {
00653 count = (int) adc[k];
00654 m_time_anode_clu[index]->Fill(actualAn,stTimeBin + k,count);
00655 m_time_anode_raw[index]->Fill(actualAn,stTimeBin + k,count);
00656 }
00657 }
00658 }
00659 delete [] tempMemberInfo;
00660 }
00661 }
00662 }
00663 }
00664
00665
00666 gMessMgr->Message()<< " Found " << TotalClusters << " clusters."<< endm;
00667
00668 m_nClust->Fill((float)mNoEvents,(float)TotalClusters);
00669 }
00670
00671 Int_t StSvtClusterAnalysisMaker::Reset(){
00672
00673
00674 mSvtAnalSet->SetObject(0);
00675 delete mSvtAnalysis;
00676
00677 mSvtAdjEvent = NULL;
00678
00679 mHybridRawData = NULL;
00680 mHybridAdjData = NULL;
00681 mHybridPixelData = NULL;
00682
00683 mSvtRawEventColl = NULL;
00684 mSvtClusterColl = NULL;
00685 mSvtPixelColl = NULL;
00686 mSvtAnalColl = NULL;
00687
00688 mSvtAnalysis = NULL;
00689 mSvtHit = NULL;
00690 mSvtAnalClusters = NULL;
00691
00692 m_ConstSet->Delete();
00693
00694 return kStOK;
00695 }
00696
00697
00698
00699 Int_t StSvtClusterAnalysisMaker::Finish(){
00700
00701 if (Debug()) gMessMgr->Debug() << "In StSvtClusterAnalysisMaker::Finish() ..."
00702 << GetName() << endm;
00703 if (Debug()) hfile->Write();
00704
00705 return kStOK;
00706 }
00707
00708
00709 void StSvtClusterAnalysisMaker::Clear(Option_t *option)
00710 {
00711 if(mSvtAnalColl) {
00712 int n = mSvtAnalColl->size();
00713 mSvtAnalColl->clear();
00714 mSvtAnalColl->resize(n);
00715 }
00716 StMaker::Clear(option);
00717 }
00718
00719
00720 ClassImp(StSvtClusterAnalysisMaker)
00721
00722
00723
00724
00725
00726
00727
00728
00729