260 cout <<
"=================== BmnGemStripHitMaker::Init() started ===============" << endl;
264 FairRootManager* ioman = FairRootManager::Instance();
266 fBmnGemStripDigitsArray = (TClonesArray*)ioman->GetObject(fInputDigitsBranchName);
267 if (!fBmnGemStripDigitsArray) {
268 cout <<
"BmnGemStripHitMaker::Init(): branch " << fInputDigitsBranchName
269 <<
" not found! Task will be deactivated" << endl;
274 fBmnGemStripDigitMatchesArray = (TClonesArray*)ioman->GetObject(fInputDigitMatchesBranchName);
277 if (fBmnGemStripDigitMatchesArray)
278 cout <<
" Strip matching information exists!\n";
280 cout <<
" Strip matching information doesn`t exist!\n";
283 fBmnGemStripHitsArray =
new TClonesArray(fOutputHitsBranchName);
284 ioman->Register(fOutputHitsBranchName,
"GEM", fBmnGemStripHitsArray, kTRUE);
285 fBmnGemUpperClustersArray =
new TClonesArray(
"StripCluster");
286 ioman->Register(
"BmnGemUpperCluster",
"GEM", fBmnGemUpperClustersArray, kTRUE);
287 fBmnGemLowerClustersArray =
new TClonesArray(
"StripCluster");
288 ioman->Register(
"BmnGemLowerCluster",
"GEM", fBmnGemLowerClustersArray, kTRUE);
290 fField = FairRunAna::Instance()->GetField();
293 Warning(
"Init",
"No Magnetic Field found");
298 cout <<
"=================== BmnGemStripHitMaker::Init() finished ==============" << endl;
343 Int_t AddedDigits = 0;
344 Int_t AddedStripDigitMatches = 0;
346 for (Int_t idigit = 0; idigit < fBmnGemStripDigitsArray->GetEntriesFast(); idigit++) {
361 if (fBmnGemStripDigitMatchesArray) {
362 strip_match = (
BmnMatch*)fBmnGemStripDigitMatchesArray->At(idigit);
364 AddedStripDigitMatches++;
369 stripDigitNumberMatch.
AddLink(1.0, idigit);
370 module->SetStripDigitNumberMatchInLayer(digit->GetStripLayer(), digit->GetStripNumber(), stripDigitNumberMatch);
374 cout <<
" Processed strip digits : " << AddedDigits <<
"\n";
375 if (fVerbose > 1 && fBmnGemStripDigitMatchesArray)
376 cout <<
" Added strip digit MC-matches : " << AddedStripDigitMatches <<
"\n";
384 cout <<
" Calculated points : " << NCalculatedPoints <<
"\n";
386 cout <<
"BmnGemStripHitMaker: " << NCalculatedPoints <<
" hits\n";
388 Int_t clear_matched_points_cnt = 0;
390 map<Int_t, StripCluster> UniqueUpperClusters;
391 map<Int_t, StripCluster> UniqueLowerClusters;
397 if (Abs(fField->GetBy(0., 0., 0.)) > FLT_EPSILON)
399 Bx = Abs(fField->GetBx(0.0, 0.0, 135.0));
400 By = Abs(fField->GetBy(0.0, 0.0, 135.0));
403 for (Int_t iStation = 0; iStation < StationSet->
GetNStations(); ++iStation) {
406 for (Int_t iModule = 0; iModule < station->
GetNModules(); ++iModule) {
409 for (Int_t iLayer = 0; iLayer <
module->GetNStripLayers(); ++iLayer) {
412 for (
size_t iCluster = 0; iCluster < layer.
GetStripClusters().size(); ++iCluster) {
420 new ((*fBmnGemUpperClustersArray)[fBmnGemUpperClustersArray->GetEntriesFast()])
423 new ((*fBmnGemLowerClustersArray)[fBmnGemLowerClustersArray->GetEntriesFast()])
429 Int_t NIntersectionPointsInModule =
module->GetNIntersectionPoints();
432 Int_t NPseudoIntersectionsInModule = 0;
434 for (Int_t iPoint = 0; iPoint < NIntersectionPointsInModule + NPseudoIntersectionsInModule; ++iPoint) {
441 Double_t x_err, y_err, z_err;
443 if (iPoint < NIntersectionPointsInModule) {
446 x =
module->GetIntersectionPointX(iPoint);
447 y =
module->GetIntersectionPointY(iPoint);
448 z =
module->GetZPositionRegistered();
449 x_err =
module->GetIntersectionPointXError(iPoint);
450 y_err =
module->GetIntersectionPointYError(iPoint);
459 x =
module->GetPseudoIntersectionX(iPoint - NIntersectionPointsInModule);
460 y =
module->GetPseudoIntersectionY(iPoint - NIntersectionPointsInModule);
461 z =
module->GetZPositionRegistered();
462 x_err =
module->GetPseudoIntersectionXError(iPoint - NIntersectionPointsInModule);
463 y_err =
module->GetPseudoIntersectionYError(iPoint - NIntersectionPointsInModule);
467 if (fIsExp && !fIsSrc)
468 z += fAlignCor[iStation][iModule][2];
472 Plane3D::Point glob_point = TransfSet->
ApplyTransforms(Plane3D::Point(-x, y, z), iStation, iModule);
478 Int_t RefMCIndex = -1;
482 if (iPoint < NIntersectionPointsInModule) {
483 mc_match_hit =
module->GetIntersectionPointMatch(iPoint);
485 mc_match_hit =
module->GetPseudoIntersectionMatch(iPoint - NIntersectionPointsInModule);
488 Int_t most_probably_index = -1;
489 Double_t max_weight = 0;
493 clear_matched_points_cnt++;
494 for (Int_t ilink = 0; ilink < n_links; ilink++) {
497 if (weight > max_weight) {
499 most_probably_index = index;
503 RefMCIndex = most_probably_index;
510 x += fAlignCor[iStation][iModule][0];
511 y += fAlignCor[iStation][iModule][1];
522 fLorCor[iStation][0] + fLorCor[iStation][1] * Bx + fLorCor[iStation][2] * Bx * Bx;
524 fLorCor[iStation][0] + fLorCor[iStation][1] * By + fLorCor[iStation][2] * By * By;
527 if (
int(TMath::Abs(By) + 0.5) == 4) {
531 }
else if (
int(TMath::Abs(By) + 0.5) == 6) {
541 Int_t sign = (
module->GetElectronDriftDirection() == ForwardZAxisEDrift) ? +1 : -1;
547 new ((*fBmnGemStripHitsArray)[fBmnGemStripHitsArray->GetEntriesFast()])
548 BmnGemStripHit(0, TVector3(x, y, z), TVector3(x_err, y_err, z_err), RefMCIndex);
551 (
BmnGemStripHit*)fBmnGemStripHitsArray->At(fBmnGemStripHitsArray->GetEntriesFast() - 1);
554 hit->
SetIndex(fBmnGemStripHitsArray->GetEntriesFast() - 1);
556 if (iPoint < NIntersectionPointsInModule) {
558 module->GetIntersectionPointDigitNumberMatch(iPoint));
564 iPoint - NIntersectionPointsInModule));
566 module->GetUpperCluster_PseudoIntersections(iPoint - NIntersectionPointsInModule)
569 module->GetLowerCluster_PseudoIntersections(iPoint - NIntersectionPointsInModule)
588 if (iPoint < NIntersectionPointsInModule) {
589 digiMatch =
module->GetIntersectionPointDigitNumberMatch(iPoint);
593 digiMatch =
module->GetPseudoIntersectionDigitNumberMatch(iPoint - NIntersectionPointsInModule);
600 Bool_t hitOk = kFALSE;
601 for (Int_t ilink = 0; ilink < digiMatch0->
GetNofLinks(); ilink++) {
603 for (Int_t jlink = 0; jlink < digiMatch1->
GetNofLinks(); jlink++) {
605 if (iindex == jindex) {
616 hit->SetRefIndex(-1);
620 FairRootManager::Instance()->SetUseFairLinks(kTRUE);
622 if (iPoint < NIntersectionPointsInModule) {
623 hitMatch =
module->GetIntersectionPointMatch(iPoint);
625 hitMatch =
module->GetPseudoIntersectionMatch(iPoint - NIntersectionPointsInModule);
629 hit->AddLink(FairLink(-1, lnk.GetIndex(), lnk.GetWeight()));
630 FairRootManager::Instance()->SetUseFairLinks(kFALSE);
657 cout <<
" N clear matches with MC-points = " << clear_matched_points_cnt <<
"\n";