00001
00002
00003
00005
00006
00007
00008
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 #include "Stl3RawReaderMaker.h"
00067 #include "St_DataSetIter.h"
00068 #include "StMessMgr.h"
00069 #include "StDAQMaker/StDAQReader.h"
00070 #include "StDaqLib/L3/L3_Reader.hh"
00071 #include "tables/St_l3RunSummary_Table.h"
00072 #include "tables/St_l3AlgorithmInfo_Table.h"
00073 #include "StEventTypes.h"
00074 #include "StEnumerations.h"
00075 #include "Rtypes.h"
00076 #include "TMath.h"
00077
00078 #include "St_l3_Coordinate_Transformer.h"
00079 #include "St_l3_Coordinates.h"
00080
00081
00082 #define gufld gufld_
00083 extern "C" {void gufld(Float_t *, Float_t *);}
00084
00085
00086 ClassImp(Stl3RawReaderMaker)
00087
00088
00089 Stl3RawReaderMaker::Stl3RawReaderMaker(const char *name):StMaker(name){
00090
00091 }
00092
00093
00094 Stl3RawReaderMaker::~Stl3RawReaderMaker(){
00095 }
00096
00097
00098
00099 Int_t Stl3RawReaderMaker::Init(){
00100
00101
00102 mL3On = kFALSE;
00103
00104
00105
00106
00107 mDbSet = 0;
00108
00109 mNumberOfGl3Nodes = 0;
00110 mNumberOfAlgorithms = 0;
00111 mEventCounter = 0;
00112
00113
00114 for (int i=0; i<MaxNumberOfGl3Nodes; i++) {
00115 mGlobalCounter[i].nProcessed = 0;
00116 mGlobalCounter[i].nReconstructed = 0;
00117 for (int j=0; j<MaxNumberOfAlgorithms; j++) {
00118 mAlgorithmCounter[i][j].algId = 0;
00119 mAlgorithmCounter[i][j].nProcessed = 0;
00120 mAlgorithmCounter[i][j].nAccept = 0;
00121 mAlgorithmCounter[i][j].nBuild = 0;
00122 }
00123 }
00124
00125
00126 return StMaker::Init();
00127 }
00128
00129
00130
00131 Int_t Stl3RawReaderMaker::Make()
00132 {
00133
00134
00135
00136
00137
00138 gMessMgr->Info("Stl3RawReaderMaker: Now we start l3RawReader Maker.");
00139
00140
00141
00142
00143 DAQReaderSet = GetDataSet("StDAQReader");
00144 if (!DAQReaderSet) {
00145 gMessMgr->Error() << "Stl3RawReaderMaker::Make(): no DaqReader found!" << endm;
00146 return kStWarn;
00147 }
00148
00149 StDAQReader *daqReader = (StDAQReader*)(DAQReaderSet->GetObject()) ;
00150 if (daqReader) {
00151 ml3reader = daqReader->getL3Reader();
00152
00153 if (ml3reader) {
00154
00155
00156 mL3On = kTRUE;
00157
00158
00159 if (m_DebugLevel) {
00160 int sec = 23;
00161 if (ml3reader->getGlobalTrackReader())
00162 gMessMgr->Info() << ml3reader->getGlobalTrackReader()->getNumberOfTracks()
00163 << " global tracks found." << endm;
00164 if (ml3reader->getSl3ClusterReader(sec))
00165 gMessMgr->Info() << ml3reader->getSl3ClusterReader(sec)->getNumberOfClusters()
00166 << " sl3 clusters found in sec " << sec << endm;
00167 if (ml3reader->getSl3TrackReader(sec))
00168 gMessMgr->Info() << ml3reader->getSl3TrackReader(sec)->getNumberOfTracks()
00169 << " sl3 tracks found in sec " << sec << endm;
00170 if (ml3reader->getI960ClusterReader(sec))
00171 gMessMgr->Info() << ml3reader->getI960ClusterReader(sec)->getNumberOfClusters()
00172 << " i960 clusters found in sec " << sec << endm;
00173 }
00174
00175 switch (m_Mode) {
00176 case 0:
00177
00178 gMessMgr->Info("Stl3RawReaderMaker: Fill StEvent.");
00179 if (fillStEvent() != 0) {
00180 gMessMgr->Error("Stl3RawReaderMaker: problems filling l3 into StEvent.");
00181 return kStErr;
00182 }
00183 break;
00184 case 1:
00185
00186
00187 gMessMgr->Info("Stl3RawReaderMaker: Embedding Mode, check L3 bias.");
00188 return checkL3Bias();
00189 break;
00190 default:
00191
00192 gMessMgr->Error("Stl3RawReaderMaker: Unknown mode, return kStWarn");
00193 return kStWarn;
00194 }
00195
00196 }
00197
00198 else {
00199
00200
00201
00202
00203 if (mL3On) {
00204 gMessMgr->Warning("Stl3RawReaderMaker: L3 is ON, but no l3 data found in this event. Either DAQ has not send us this event or we crashed during online analysis.");
00205 return kStWarn;
00206 }
00207
00208
00209
00210 else {
00211 gMessMgr->Warning("Stl3RawReaderMaker: no l3 data found.");
00212
00213 if (m_Mode!=1) return kStWarn;
00214
00215 else return kStOk;
00216 }
00217 }
00218
00219 }
00220
00221
00222 return kStOk;
00223 }
00224
00225
00226
00227 Int_t Stl3RawReaderMaker::checkL3Bias()
00228 {
00229
00230
00231 Gl3AlgorithmReader* gl3Reader = ml3reader->getGl3AlgorithmReader();
00232 if (!gl3Reader) {
00233 gMessMgr->Error("Stl3RawReaderMaker: L3 is ON, but L3 summary data is missing!");
00234 gMessMgr->Error("Stl3RawReaderMaker: ==> This event is bad, skip it!");
00235 return kStErr;
00236 }
00237
00238
00239
00240
00241 if (ml3reader->getL3_Summary()->on == 0) {
00242 gMessMgr->Warning("Stl3RawReaderMaker: L3 crashed online on this event, no usefull information.");
00243 gMessMgr->Warning("Stl3RawReaderMaker: ==> This event is WEIRD, but definitely unbiased!");
00244 return kStOk;
00245 }
00246
00247
00248 mNumberOfAlgorithms = gl3Reader->getNumberofAlgorithms();
00249
00250 Algorithm_Data* algData = gl3Reader->getAlgorithmData();
00251
00252
00253
00254 int returnValue = kStErr;
00255
00256
00257
00258
00259
00260
00261
00262
00263 for (int i=0; i<mNumberOfAlgorithms; i++) {
00264 if ( (algData[i].algId==10 || algData[i].algId==1)
00265 && ml3reader->getL3_P()->trg_word>0x0fff
00266 && ml3reader->getL3_P()->trg_word<0x2000
00267 && algData[i].build==1 ) {
00268
00269 if (m_DebugLevel) {
00270 printf("L0 trigger word: %x\n", ml3reader->getL3_P()->trg_word);
00271 printf("pass-thru algorithm Id: %i\n", algData[i].algId);
00272 }
00273
00274 returnValue = kStOk;
00275 }
00276 }
00277
00278 return returnValue;
00279 }
00280
00281
00282
00283 Int_t Stl3RawReaderMaker::fillStEvent()
00284 {
00285
00286
00287 mStEvent = (StEvent *) GetInputDS("StEvent");
00288 if (!mStEvent) {
00289 gMessMgr->Error("Stl3RawReaderMaker: No StEvent");
00290 return 1;
00291 }
00292
00293
00294 myStL3Trigger = new StL3Trigger() ;
00295 if (!myStL3Trigger) {
00296 gMessMgr->Error("Stl3RawReaderMaker: No Stl3Trigger.");
00297 return 1;
00298 }
00299 mStEvent->setL3Trigger(myStL3Trigger);
00300
00301
00302
00303 if (!ml3reader->getL3_SUMD()) {
00304 gMessMgr->Warning("Stl3RawReaderMaker: No L3_SUMD bank.");
00305 myStL3Trigger->setL3EventSummary(NULL);
00306 return 0;
00307 }
00308
00309 if (!ml3reader->getL3_Summary()) {
00310 gMessMgr->Warning("Stl3RawReaderMaker: No l3 summary.");
00311 myStL3Trigger->setL3EventSummary(NULL);
00312 return 0;
00313 }
00314
00315
00316
00317 if (ml3reader->getL3_Summary()->on == 0) {
00318 gMessMgr->Warning("Stl3RawReaderMaker: L3 crashed online on this event, no usefull information.");
00319 myStL3Trigger->setL3EventSummary(NULL);
00320 return 0;
00321 }
00322
00323
00324 StL3EventSummary* myEventSummary = new StL3EventSummary(ml3reader->getL3_SUMD());
00325 if (!myEventSummary) {
00326 gMessMgr->Error("Stl3RawReaderMaker: No Stl3EventSummary.");
00327 return 1;
00328 }
00329
00330
00331 myStL3Trigger->setL3EventSummary(myEventSummary);
00332
00333
00334
00335 Gl3AlgorithmReader* gl3Reader = ml3reader->getGl3AlgorithmReader();
00336 if (!gl3Reader) {
00337 gMessMgr->Error("Stl3RawReaderMaker: L3 is ON, but L3 summary data is missing!");
00338 return 1;
00339 }
00340
00341
00342 mDbSet = GetDataBase("RunLog/l3");
00343
00344 if (mDbSet) {
00345
00346 TTable* l3runSummaryTable = (TTable* )mDbSet->Find("l3RunSummary");
00347
00348 if (l3runSummaryTable) {
00349 l3RunSummary_st* data = (l3RunSummary_st* )l3runSummaryTable->GetArray();
00350 mNumberOfGl3Nodes = data->nGl3Nodes;
00351 if (m_DebugLevel) {
00352 gMessMgr->Info() << "database: runNumber = " << data->runNumber << endm;
00353 gMessMgr->Info() << "database: nGl3Nodes = " << data->nGl3Nodes << endm;
00354 }
00355
00356 if (mNumberOfGl3Nodes>MaxNumberOfGl3Nodes) {
00357 gMessMgr->Error() << "Stl3RawReaderMaker: number of gl3 nodes too high: db -> " << mNumberOfGl3Nodes
00358 << " max -> " << MaxNumberOfGl3Nodes << endm;
00359 return 1;
00360 }
00361 }
00362 else {
00363 mNumberOfGl3Nodes = MaxNumberOfGl3Nodes;
00364 gMessMgr->Warning("Stl3RawReaderMaker: no table entry for this run in 'l3RunSummary' found!");
00365 gMessMgr->Warning("Stl3RawReaderMaker: using default values.");
00366 }
00367 }
00368 else {
00369 mNumberOfGl3Nodes = MaxNumberOfGl3Nodes;
00370 gMessMgr->Warning("Stl3RawReaderMaker: no database 'Runlog/l3' found!");
00371 gMessMgr->Warning("Stl3RawReaderMaker: using default values.");
00372 }
00373
00374
00375 int gl3Id = ml3reader->getGl3Id();
00376
00377
00378 mNumberOfAlgorithms = gl3Reader->getNumberofAlgorithms();
00379
00380
00381 if (mNumberOfAlgorithms >= MaxNumberOfAlgorithms) {
00382 gMessMgr->Error() << "Stl3RawReaderMaker: number of algorithms exceeds limit: found "
00383 << mNumberOfAlgorithms << ", limit " << MaxNumberOfAlgorithms
00384 << endm;
00385 return 1;
00386 }
00387 if (gl3Id<=0 || gl3Id>= MaxNumberOfGl3Nodes) {
00388 gMessMgr->Error() << "Stl3RawReaderMaker: gl3 id exceeds limit: found "
00389 << gl3Id << ", limit " << MaxNumberOfGl3Nodes
00390 << endm;
00391 return 1;
00392 }
00393
00394
00395
00396
00397
00398
00399 mEventCounter++;
00400
00401
00402 mGlobalCounter[gl3Id-1].nProcessed = gl3Reader->getNumberOfProcessedEvents();
00403 mGlobalCounter[gl3Id-1].nReconstructed = gl3Reader->getNumberOfReconstructedEvents();
00404
00405 Algorithm_Data* algData = gl3Reader->getAlgorithmData();
00406 for (int i=0; i<mNumberOfAlgorithms; i++) {
00407 mAlgorithmCounter[gl3Id-1][i].algId = algData[i].algId;
00408 mAlgorithmCounter[gl3Id-1][i].nProcessed = algData[i].nProcessed;
00409 mAlgorithmCounter[gl3Id-1][i].nAccept = algData[i].nAccept;
00410 mAlgorithmCounter[gl3Id-1][i].nBuild = algData[i].nBuild;
00411 }
00412
00413
00414 GlobalCounter totalCounter;
00415
00416 const int maxAlg = mNumberOfAlgorithms;
00417 AlgorithmCounter* totalAlgCounter = new AlgorithmCounter[maxAlg];
00418
00419
00420
00421 totalCounter.nProcessed = 0;
00422 totalCounter.nReconstructed = 0;
00423 for (int i=0; i<mNumberOfAlgorithms; i++) {
00424 totalAlgCounter[i].algId = 0;
00425 totalAlgCounter[i].nProcessed = 0;
00426 totalAlgCounter[i].nAccept = 0;
00427 totalAlgCounter[i].nBuild = 0;
00428 }
00429
00430 for (int i=0; i<mNumberOfGl3Nodes; i++) {
00431
00432
00433 if (mGlobalCounter[i].nProcessed==0 && mEventCounter<(2*mNumberOfGl3Nodes)) {
00434 totalCounter.nProcessed = -1;
00435 totalCounter.nReconstructed = -1;
00436 for (int j=0; j<mNumberOfAlgorithms; j++) {
00437 totalAlgCounter[j].algId = mAlgorithmCounter[gl3Id-1][j].algId;
00438 totalAlgCounter[j].nProcessed = -1;
00439 totalAlgCounter[j].nAccept = -1;
00440 totalAlgCounter[j].nBuild = -1;
00441 }
00442 break;
00443 }
00444
00445
00446 totalCounter.nProcessed += mGlobalCounter[i].nProcessed;
00447 totalCounter.nReconstructed += mGlobalCounter[i].nReconstructed;
00448 for (int k=0; k<mNumberOfAlgorithms; k++) {
00449 totalAlgCounter[k].algId = mAlgorithmCounter[gl3Id-1][k].algId;
00450 totalAlgCounter[k].nProcessed += mAlgorithmCounter[i][k].nProcessed;
00451 totalAlgCounter[k].nAccept += mAlgorithmCounter[i][k].nAccept;
00452 totalAlgCounter[k].nBuild += mAlgorithmCounter[i][k].nBuild;
00453 }
00454 }
00455
00456
00457
00458
00459
00460
00461 myEventSummary->setCounters(totalCounter.nProcessed, totalCounter.nReconstructed);
00462 myEventSummary->setNumberOfTracks(ml3reader->getL3_Summary()->nTracks);
00463 myEventSummary->setL0TriggerWord(ml3reader->getL3_P()->trg_word);
00464
00465
00466
00467
00468
00469 l3AlgorithmInfo_st* dbAlgInfo = 0;
00470 if (mDbSet) {
00471 TTable* l3algorithmInfoTable = (TTable* )mDbSet->Find("l3AlgorithmInfo");
00472 if (l3algorithmInfoTable) {
00473 dbAlgInfo = (l3AlgorithmInfo_st* )l3algorithmInfoTable->GetArray();
00474 if (m_DebugLevel) {
00475 for (int i=0; i<l3algorithmInfoTable->GetNRows(); i++) {
00476 cout << " run \tidxAlg\talgId\tpreScale\tpostScale" << endl;
00477 cout << dbAlgInfo[i].runNumber
00478 << "\t" << dbAlgInfo[i].idxAlg
00479 << "\t" << dbAlgInfo[i].algId
00480 << "\t" << dbAlgInfo[i].preScale
00481 << "\t" << dbAlgInfo[i].postScale << endl;
00482 cout <<" GI: " << dbAlgInfo[i].GI1 << " " << dbAlgInfo[i].GI2 << " " << dbAlgInfo[i].GI3
00483 << " " << dbAlgInfo[i].GI4 << " " << dbAlgInfo[i].GI5 << endl;
00484 cout << " GF: " << dbAlgInfo[i].GF1 << " " << dbAlgInfo[i].GF2 << " " << dbAlgInfo[i].GF3
00485 << " " << dbAlgInfo[i].GF4 << " " << dbAlgInfo[i].GF5 << endl;
00486 cout << "------------" << endl;
00487 }
00488 }
00489
00490 if (l3algorithmInfoTable->GetNRows()!=mNumberOfAlgorithms) {
00491 gMessMgr->Warning() << "Stl3RawReaderMaker: Warning: database entries don't match raw data!" << endm;
00492 gMessMgr->Warning() << "Stl3RawReaderMaker: db nAlgorithms: " << l3algorithmInfoTable->GetNRows()
00493 << ", raw data: " << mNumberOfAlgorithms
00494 << endm;
00495 gMessMgr->Warning() << "Stl3RawReaderMaker: Skip database info for this event." << endm;
00496 dbAlgInfo = 0;
00497 }
00498 }
00499 else {
00500 gMessMgr->Warning("Stl3RawReaderMaker: No entry for this run found in table 'l3algorithmInfo'.");
00501 }
00502 }
00503
00504 for (int i=0; i<mNumberOfAlgorithms; i++) {
00505 StL3AlgorithmInfo* myL3AlgorithmInfo = new StL3AlgorithmInfo(&algData[i]);
00506 if (!myL3AlgorithmInfo) {
00507 gMessMgr->Error("Stl3RawReaderMaker: No StL3AlgorithmInfo.");
00508 return 1;
00509 }
00510 myL3AlgorithmInfo->setCounters(totalAlgCounter[i].nProcessed,
00511 totalAlgCounter[i].nAccept,
00512 totalAlgCounter[i].nBuild);
00513
00514
00515
00516
00517
00518
00519
00520 int passThruId = 0;
00521 if ( (algData[i].algId==10 || algData[i].algId==1)
00522 && ml3reader->getL3_P()->trg_word>0x0fff
00523 && ml3reader->getL3_P()->trg_word<0x2000
00524 && algData[i].build==1 ) {
00525
00526 passThruId = algData[i].algId;
00527 if (m_DebugLevel) {
00528 cout << "pass-thru algorithm Id: " << passThruId << endl;
00529 }
00530
00531
00532 myEventSummary->setUnbiasedTrigger();
00533 }
00534
00535
00536
00537 if (dbAlgInfo && dbAlgInfo[i].algId==totalAlgCounter[i].algId) {
00538 myL3AlgorithmInfo->setPreScale(dbAlgInfo[i].preScale);
00539 myL3AlgorithmInfo->setPostScale(dbAlgInfo[i].postScale);
00540 int intPara[IntParameterSize] = {dbAlgInfo[i].GI1, dbAlgInfo[i].GI2,
00541 dbAlgInfo[i].GI3, dbAlgInfo[i].GI4,
00542 dbAlgInfo[i].GI5};
00543 float floatPara[FloatParameterSize] = {dbAlgInfo[i].GF1, dbAlgInfo[i].GF2,
00544 dbAlgInfo[i].GF3, dbAlgInfo[i].GF4,
00545 dbAlgInfo[i].GF5};
00546 myL3AlgorithmInfo->setParameters(intPara, floatPara);
00547
00548 if (dbAlgInfo[i].algId==passThruId)
00549 myEventSummary->setUnbiasedTriggerPreScale(dbAlgInfo[i].preScale);
00550
00551 }
00552 myEventSummary->addAlgorithm(myL3AlgorithmInfo);
00553
00554 }
00555
00556
00557 delete [] totalAlgCounter;
00558
00559
00560
00561
00562 if (ml3reader->getGlobalTrackReader()) {
00563
00564
00565 StPrimaryVertex* myL3Vertex = new StPrimaryVertex;
00566 vertex vert = ml3reader->getGlobalTrackReader()->getVertex();
00567 StThreeVectorF* pos = new StThreeVectorF(vert.x, vert.y, vert.z);
00568 myL3Vertex->setPosition(*pos);
00569 myStL3Trigger->addPrimaryVertex(myL3Vertex);
00570
00571 if (fillStEventWithL3GlobalTracks()!=0) return 1;
00572
00573 }
00574
00575
00576
00577
00578
00579
00580
00581 return 0 ;
00582 }
00583
00584
00585
00586 Int_t Stl3RawReaderMaker::fillStEventWithL3GlobalTracks()
00587 {
00588
00589 StSPtrVecTrackNode& myTrackNodeVector = myStL3Trigger->trackNodes();
00590 StSPtrVecTrackDetectorInfo& myTrackDetectorInfoVector = myStL3Trigger->trackDetectorInfo();
00591
00592
00593 int numberOfTracks = ml3reader->getGlobalTrackReader()->getNumberOfTracks();
00594 gMessMgr->Info() << "Stl3RawReaderMaker: Try to fill " << numberOfTracks << " tracks into StEvent." << endm;
00595
00596
00597 globalTrack* globalL3Tracks = ml3reader->getGlobalTrackReader()->getTrackList();
00598
00599
00600 Float_t xval[3] = {0.,0.,0.};
00601 Float_t bval[3];
00602 gufld(xval,bval);
00603 int signOfField = bval[2] < 0 ? -1 : 1;
00604
00605 for (int trackindex=0; trackindex<numberOfTracks; trackindex++) {
00606 StTrackDetectorInfo* detectorInfo = new StTrackDetectorInfo();
00607 detectorInfo->setNumberOfPoints(globalL3Tracks[trackindex].nHits,kTpcId);
00608 myTrackDetectorInfoVector.push_back(detectorInfo);
00609
00610
00611 StThreeVectorD* origin = new StThreeVectorD(globalL3Tracks[trackindex].r0 * TMath::Cos(globalL3Tracks[trackindex].phi0),
00612 globalL3Tracks[trackindex].r0 * TMath::Sin(globalL3Tracks[trackindex].phi0),
00613 globalL3Tracks[trackindex].z0);
00614 StThreeVectorD* momentum = new StThreeVectorD(globalL3Tracks[trackindex].pt * TMath::Cos(globalL3Tracks[trackindex].psi),
00615 globalL3Tracks[trackindex].pt * TMath::Sin(globalL3Tracks[trackindex].psi),
00616 globalL3Tracks[trackindex].pt * globalL3Tracks[trackindex].tanl );
00617 StHelixModel* helixModel = new StHelixModel( globalL3Tracks[trackindex].q,
00618 globalL3Tracks[trackindex].psi,
00619 0.0,
00620 atan(globalL3Tracks[trackindex].tanl),
00621 *origin,
00622 *momentum, -1 );
00623
00624 StGlobalTrack* globalTrack = new StGlobalTrack();
00625 globalTrack->setFlag(globalL3Tracks[trackindex].flag);
00626 globalTrack->setLength(globalL3Tracks[trackindex].length);
00627 globalTrack->setDetectorInfo(detectorInfo);
00628 globalTrack->setGeometry(helixModel);
00629
00630 int l3word = kL3FitId + (1<<l3Standard);
00631
00632 globalTrack->setEncodedMethod(l3word);
00633
00634
00635 short h = globalTrack->geometry()->charge()*signOfField > 0 ? -1 : 1;
00636 globalTrack->geometry()->setHelicity(h);
00637
00638
00639 double curv = fabs(0.0003 * bval[2] / globalL3Tracks[trackindex].pt);
00640 globalTrack->geometry()->setCurvature(curv);
00641
00642
00643 if (globalL3Tracks[trackindex].dedx > 0) {
00644 StDedxPidTraits* myStDedxPidTraits = new StDedxPidTraits(kTpcId, kTruncatedMeanId,
00645 globalL3Tracks[trackindex].ndedx,
00646 globalL3Tracks[trackindex].dedx*1e6, 0);
00647 globalTrack->addPidTraits(myStDedxPidTraits);
00648 }
00649
00650
00651 StTrackNode* trackNode = new StTrackNode();
00652 trackNode->addTrack(globalTrack);
00653 myTrackNodeVector.push_back(trackNode);
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668 }
00669
00670 return 0 ;
00671 }
00672
00673
00674
00675 Int_t Stl3RawReaderMaker::fillStEventWithi960Hits()
00676 {
00677
00678 StTpcHitCollection* mHitCollection = new StTpcHitCollection() ;
00679 myStL3Trigger->setTpcHitCollection(mHitCollection);
00680
00681
00682 St_l3_Coordinate_Transformer transformer ;
00683 transformer.Print_parameters() ;
00684 St_l3_xyz_Coordinate XYZ(0,0,0) ;
00685 St_l3_ptrs_Coordinate PTRS(0,0,0,0) ;
00686
00687
00688 Int_t totalcluster = 0 ;
00689 for ( Int_t secindex=1 ; secindex<=24 ; secindex+=2 )
00690 {
00691 if ( ml3reader->getI960ClusterReader(secindex)->getClusterList() )
00692 {
00693 gMessMgr->Info() << "Stl3RawReaderMaker: Found some i960 clusters in sector:" << secindex <<endm ;
00694 L3_Cluster* myl3cluster = ml3reader->getI960ClusterReader(secindex)->getClusterList() ;
00695 Int_t numOfClusters = ml3reader->getI960ClusterReader(secindex)->getNumberOfClusters() ;
00696
00697 for (Int_t clindex=0 ; clindex < numOfClusters ; clindex++)
00698 {
00699 totalcluster++ ;
00700
00701 Double_t pad = ((Double_t)(myl3cluster[clindex].pad)) / 64 ;
00702 Double_t time = ((Double_t)(myl3cluster[clindex].time)) / 64 ;
00703 Int_t row = myl3cluster[clindex].padrow ;
00704 Int_t q = myl3cluster[clindex].charge ;
00705 Char_t flag = myl3cluster[clindex].flags ;
00706
00707
00708 Int_t RBMZ = myl3cluster[clindex].RB_MZ ;
00709 Int_t rb = RBMZ >> 4 ;
00710 Int_t mz = RBMZ & 15 ;
00711
00712
00713 Int_t sector = 0 ;
00714 if (rb<=6) { sector = secindex; } else { sector = secindex+1; }
00715
00716
00717 PTRS.Setptrs((Double_t) pad, (Double_t) time,(Double_t) row, (Double_t) sector) ;
00718 transformer.raw_to_global(PTRS,XYZ) ;
00719
00720
00721 if (clindex%500==0)
00722 {
00723 cout << XYZ.Getx() <<"\t" << XYZ.Gety() <<"\t" << XYZ.Getz() <<"\t";
00724 cout << row <<"\t" << sector << "\t" << rb << "\t" << mz << "\t" << q << "\t";
00725 cout << ((Double_t)(myl3cluster[clindex].pad)) / 64 <<"\t" ;
00726 cout << ((Double_t)(myl3cluster[clindex].time)) / 64 <<"\t" ;
00727 cout << (Int_t)(myl3cluster[clindex].padrow) <<"\n" ;
00728 }
00729
00730
00731
00732 StThreeVectorF* pos = new StThreeVectorF(XYZ.Getx(),XYZ.Gety(),XYZ.Getz()) ;
00733 StThreeVectorF* poserror = new StThreeVectorF(0,0,0) ;
00734
00735 ULong_t hw = 0 ;
00736 ULong_t hrow = 0 ;
00737 ULong_t hsec = 0 ;
00738 if ( row >=1 && row <=45 ) { hrow = row << 9 ; } else { hrow=0 ; }
00739 if ( sector >=1 && sector <=24 ) { hsec = sector << 4 ; } else { hsec=0 ; }
00740 hw = hw | hrow ;
00741 hw = hw | hsec ;
00742
00743 UChar_t c = 0 ;
00744
00745 StTpcHit* tpcHit = new StTpcHit(*pos,*poserror,hw,q,c) ;
00746 tpcHit->setFlag(flag) ;
00747
00748 if (tpcHit) { mHitCollection->addHit(tpcHit) ;} else { delete tpcHit; return 1;}
00749 }
00750 }
00751 }
00752 cout << "total found clusters " << totalcluster << endl;
00753
00754 return 0 ;
00755 }
00756
00757