1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 ///////////////////////////////////////////////////////////////////////////////
19 // TRD trigger class //
22 ///////////////////////////////////////////////////////////////////////////////
30 #include "AliLoader.h"
32 #include "AliTRDdigitsManager.h"
33 #include "AliTRDgeometry.h"
34 #include "AliTRDdataArrayI.h"
35 #include "AliTRDcalibDB.h"
36 #include "AliTRDCommonParam.h"
37 #include "Cal/AliTRDCalPIDLQ.h"
38 #include "AliTRDrawData.h"
40 #include "AliTRDtrigger.h"
41 #include "AliTRDmodule.h"
42 #include "AliTRDmcmTracklet.h"
43 #include "AliTRDtrigParam.h"
44 #include "AliTRDmcm.h"
45 #include "AliTRDzmaps.h"
47 //#include "AliHeader.h"
49 ClassImp(AliTRDtrigger)
51 //_____________________________________________________________________________
52 AliTRDtrigger::AliTRDtrigger():
54 fTracks("AliTRDgtuTrack",0)
57 // AliTRDtrigger default constructor
60 fDigitsManager = NULL;
83 //_____________________________________________________________________________
84 AliTRDtrigger::AliTRDtrigger(const Text_t *name, const Text_t *title):
86 fTracks("AliTRDgtuTrack",1000)
89 // AliTRDtrigger constructor
92 fDigitsManager = new AliTRDdigitsManager();
94 fTracklets = new TObjArray(400);
115 //_____________________________________________________________________________
116 AliTRDtrigger::AliTRDtrigger(const AliTRDtrigger &p):TNamed(p)
119 // AliTRDtrigger copy constructor
122 ((AliTRDtrigger &) p).Copy(*this);
126 ///_____________________________________________________________________________
127 AliTRDtrigger::~AliTRDtrigger()
130 // AliTRDtrigger destructor
134 fTracklets->Delete();
142 //_____________________________________________________________________________
143 AliTRDtrigger &AliTRDtrigger::operator=(const AliTRDtrigger &p)
146 // Assignment operator
149 if (this != &p) ((AliTRDtrigger &) p).Copy(*this);
154 //_____________________________________________________________________________
155 void AliTRDtrigger::Copy(TObject &) const
161 AliFatal("Not implemented");
165 //_____________________________________________________________________________
166 void AliTRDtrigger::Init()
169 fModule = new AliTRDmodule(fTrigParam);
171 AliHeader *header = fRunLoader->GetHeader();
172 fNPrimary = header->GetNprimary();
178 //_____________________________________________________________________________
179 Bool_t AliTRDtrigger::Open(const Char_t *name, Int_t nEvent)
182 // Opens the AliROOT file.
185 TString evfoldname = AliConfig::GetDefaultEventFolderName();
186 fRunLoader = AliRunLoader::GetRunLoader(evfoldname);
189 fRunLoader = AliRunLoader::Open(name);
192 Error("Open","Can not open session for file %s.",name);
198 if (fRunLoader->GetAliRun() == 0x0) fRunLoader->LoadgAlice();
199 gAlice = fRunLoader->GetAliRun();
202 fRunLoader->LoadgAlice();
203 gAlice = fRunLoader->GetAliRun();
205 Error("Open","Could not find AliRun object.");
210 // Import the Trees for the event nEvent in the file
211 fRunLoader->GetEvent(nEvent);
215 TObjArray *ioArray = 0;
217 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
218 loader->MakeTree("T");
219 fTrackletTree = loader->TreeT();
220 fTrackletTree->Branch("TRDmcmTracklet","TObjArray",&ioArray,32000,0);
222 fRunLoader->LoadHeader();
231 //_____________________________________________________________________________
232 Bool_t AliTRDtrigger::ReadDigits()
235 // Reads the digits arrays from the input aliroot file
239 Error("ReadDigits","Can not find the Run Loader");
243 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
244 if (!loader->TreeD()) loader->LoadDigits();
246 return (fDigitsManager->ReadDigits(loader->TreeD()));
250 //_____________________________________________________________________________
251 Bool_t AliTRDtrigger::ReadDigits(AliRawReader* rawReader)
254 // Reads the digits arrays from the ddl file
257 AliTRDrawData *raw = new AliTRDrawData();
260 fDigitsManager = raw->Raw2Digits(rawReader);
266 //_____________________________________________________________________________
267 Bool_t AliTRDtrigger::ReadTracklets(AliRunLoader *rl)
270 // Reads the tracklets find the tracks
275 AliLoader *loader = rl->GetLoader("TRDLoader");
276 loader->LoadTracks();
277 fTrackletTree = loader->TreeT();
279 TBranch *branch = fTrackletTree->GetBranch("TRDmcmTracklet");
281 Error("ReadTracklets","Can't get the branch !");
284 TObjArray *tracklets = new TObjArray(400);
285 branch->SetAddress(&tracklets);
287 Int_t nEntries = (Int_t) fTrackletTree->GetEntries();
289 Int_t iStack, iStackPrev = -1;
291 for (iEntry = 0; iEntry < nEntries; iEntry++) {
292 fTrackletTree->GetEvent(iEntry);
294 for (itrk = 0; itrk < tracklets->GetEntriesFast(); itrk++){
296 fTrk = (AliTRDmcmTracklet*)tracklets->UncheckedAt(itrk);
298 idet = fTrk->GetDetector();
300 iStack = idet / (AliTRDgeometry::Nplan());
301 if (iStackPrev != iStack) {
302 if (iStackPrev == -1) {
305 MakeTracks(idet-AliTRDgeometry::Nplan());
311 Tracklets()->Add(fTrk);
313 if (iEntry == (nEntries-1) && itrk == (tracklets->GetEntriesFast()-1)) {
315 MakeTracks(idet-AliTRDgeometry::Nplan());
323 loader->UnloadTracks();
329 //_____________________________________________________________________________
330 Bool_t AliTRDtrigger::MakeTracklets(Bool_t makeTracks)
333 AliTRDcalibDB* calibration = AliTRDcalibDB::Instance();
336 Error("MakeTracklets","No instance of AliTRDcalibDB.");
340 AliTRDCommonParam* commonParam = AliTRDCommonParam::Instance();
343 Error("MakeTracklets","No common params.");
347 AliTRDgeometry *geo = AliTRDgeometry::GetGeometry(fRunLoader);
350 Int_t chamEnd = AliTRDgeometry::Ncham();
352 Int_t planEnd = AliTRDgeometry::Nplan();
354 Int_t sectEnd = AliTRDgeometry::Nsect();
356 fMCM = new AliTRDmcm(fTrigParam,0);
358 Int_t time, col, row, col1, col2;
360 Int_t idet, iStack, iStackPrev;
365 for (Int_t isect = sectBeg; isect < sectEnd; isect++) {
367 for (Int_t icham = chamBeg; icham < chamEnd; icham++) {
369 // number of ROBs in the chamber
376 for (Int_t iplan = planBeg; iplan < planEnd; iplan++) {
378 idet = geo->GetDetector(iplan,icham,isect);
382 iStack = idet / (AliTRDgeometry::Nplan());
383 if (iStackPrev != iStack) {
384 if (iStackPrev == -1) {
387 MakeTracks(idet-AliTRDgeometry::Nplan());
394 Int_t nRowMax = commonParam->GetRowMax(iplan,icham,isect);
395 Int_t nColMax = commonParam->GetColMax(iplan);
396 Int_t nTimeTotal = calibration->GetNumberOfTimeBins();
399 fDigits = fDigitsManager->GetDigits(idet);
401 fTrack0 = fDigitsManager->GetDictionary(idet,0);
403 fTrack1 = fDigitsManager->GetDictionary(idet,1);
405 fTrack2 = fDigitsManager->GetDictionary(idet,2);
408 for (Int_t iRob = 0; iRob < fNROB; iRob++) {
410 for (Int_t iMcm = 0; iMcm < kNMCM; iMcm++) {
414 fMCM->SetRobId(iRob);
415 fMCM->SetChaId(idet);
417 SetMCMcoordinates(iMcm);
419 row = fMCM->GetRow();
421 if (row < 0 || row >= nRowMax) {
422 Error("MakeTracklets","MCM row number out of range.");
426 fMCM->GetColRange(col1,col2);
428 for (time = 0; time < nTimeTotal; time++) {
429 for (col = col1; col < col2; col++) {
430 if (col >= 0 && col < nColMax) {
431 amp = TMath::Abs(fDigits->GetDataUnchecked(row,col,time));
435 fMCM->SetADC(col-col1,time,amp);
440 if (fTrigParam->GetTailCancelation()) {
441 fMCM->Filter(fTrigParam->GetNexponential(),fTrigParam->GetFilterType());
446 for (Int_t iSeed = 0; iSeed < kMaxTrackletsPerMCM; iSeed++) {
448 if (fMCM->GetSeedCol()[iSeed] < 0) continue;
450 if ( fTrigParam->GetDebugLevel() > 1 )
451 printf("Add tracklet %d in col %02d \n",fNtracklets,fMCM->GetSeedCol()[iSeed]);
453 if ( fTrigParam->GetDebugLevel() == -1 ) {
454 printf("Add tracklet %d in col %02d \n",fNtracklets,fMCM->GetSeedCol()[iSeed]);
455 for (time = 0; time < nTimeTotal; time++) {
456 for (col = 0; col < kMcmCol; col++) {
457 printf("%03.0f ",fMCM->GetADC(col,time));
463 AddTracklet(idet,row,iSeed,fNtracklets++);
474 // Compress the arrays
475 fDigits->Compress(1,0);
476 fTrack0->Compress(1,0);
477 fTrack1->Compress(1,0);
478 fTrack2->Compress(1,0);
480 WriteTracklets(idet);
488 MakeTracks(idet-AliTRDgeometry::Nplan());
496 //_____________________________________________________________________________
497 void AliTRDtrigger::SetMCMcoordinates(Int_t imcm)
500 Int_t robid = fMCM->GetRobId();
502 // setting the Row and Col range
504 const Int_t kNcolRob = 2; // number of ROBs per chamber in column direction
505 const Int_t kNmcmRob = 4; // number of MCMs per ROB in column/row direction
507 Int_t mcmid = imcm%(kNmcmRob*kNmcmRob);
509 if (robid%kNcolRob == 0) {
511 if ( mcmid%kNmcmRob == 0 ) {
512 fMCM->SetColRange(18*0-1,18*1-1+2+1);
514 if ( mcmid%kNmcmRob == 1 ) {
515 fMCM->SetColRange(18*1-1,18*2-1+2+1);
517 if ( mcmid%kNmcmRob == 2 ) {
518 fMCM->SetColRange(18*2-1,18*3-1+2+1);
520 if ( mcmid%kNmcmRob == 3 ) {
521 fMCM->SetColRange(18*3-1,18*4-1+2+1);
526 if ( mcmid%kNmcmRob == 0 ) {
527 fMCM->SetColRange(18*4-1,18*5-1+2+1);
529 if ( mcmid%kNmcmRob == 1 ) {
530 fMCM->SetColRange(18*5-1,18*6-1+2+1);
532 if ( mcmid%kNmcmRob == 2 ) {
533 fMCM->SetColRange(18*6-1,18*7-1+2+1);
535 if ( mcmid%kNmcmRob == 3 ) {
536 fMCM->SetColRange(18*7-1,18*8-1+2+1);
541 fMCM->SetRow(kNmcmRob*(robid/kNcolRob)+mcmid/kNmcmRob);
545 //_____________________________________________________________________________
546 void AliTRDtrigger::AddTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
549 Float_t field = fTrigParam->GetField();
550 AliTRDgeometry *geo = (AliTRDgeometry*)AliTRDgeometry::GetGeometry(fRunLoader);
552 AliTRDcalibDB* calibration = AliTRDcalibDB::Instance();
555 Error("AddTracklets","No instance of AliTRDcalibDB.");
559 Int_t nTimeTotal = calibration->GetNumberOfTimeBins();
561 fTrk = new AliTRDmcmTracklet(det,row,n);
563 Int_t iCol, iCol1, iCol2, track[3];
564 iCol = fMCM->GetSeedCol()[seed]; // 0....20 (MCM)
565 fMCM->GetColRange(iCol1,iCol2); // range in the pad plane
568 for (Int_t iTime = 0; iTime < nTimeTotal; iTime++) {
570 amp[0] = fMCM->GetADC(iCol-1,iTime);
571 amp[1] = fMCM->GetADC(iCol ,iTime);
572 amp[2] = fMCM->GetADC(iCol+1,iTime);
574 // extract track contribution only from the central pad
575 track[0] = fTrack0->GetDataUnchecked(row,iCol+iCol1,iTime);
576 track[1] = fTrack1->GetDataUnchecked(row,iCol+iCol1,iTime);
577 track[2] = fTrack2->GetDataUnchecked(row,iCol+iCol1,iTime);
579 if (fMCM->IsCluster(iCol,iTime)) {
581 fTrk->AddCluster(iCol+iCol1,iTime,amp,track);
583 } else if ((iCol+1+1) < kMcmCol) {
585 amp[0] = fMCM->GetADC(iCol-1+1,iTime);
586 amp[1] = fMCM->GetADC(iCol +1,iTime);
587 amp[2] = fMCM->GetADC(iCol+1+1,iTime);
589 if (fMCM->IsCluster(iCol+1,iTime)) {
591 // extract track contribution only from the central pad
592 track[0] = fTrack0->GetDataUnchecked(row,iCol+1+iCol1,iTime);
593 track[1] = fTrack1->GetDataUnchecked(row,iCol+1+iCol1,iTime);
594 track[2] = fTrack2->GetDataUnchecked(row,iCol+1+iCol1,iTime);
596 fTrk->AddCluster(iCol+1+iCol1,iTime,amp,track);
605 fTrk->CookLabel(0.8);
607 if (fTrk->GetLabel() >= fNPrimary) {
608 Info("AddTracklet","Only primaries are stored!");
613 fTrk->MakeTrackletGraph(geo,field);
614 fTrk->MakeClusAmpGraph();
615 if (TMath::Abs(fTrk->GetPt()) < fTrigParam->GetLtuPtCut()) {
619 Tracklets()->Add(fTrk);
623 //_____________________________________________________________________________
624 Bool_t AliTRDtrigger::WriteTracklets(Int_t det)
627 // Fills TRDmcmTracklet branch in the tree with the Tracklets
628 // found in detector = det. For det=-1 writes the tree.
631 if ((det < -1) || (det >= AliTRDgeometry::Ndet())) {
632 Error("WriteTracklets","Unexpected detector index %d.",det);
636 TBranch *branch = fTrackletTree->GetBranch("TRDmcmTracklet");
638 TObjArray *ioArray = 0;
639 branch = fTrackletTree->Branch("TRDmcmTracklet","TObjArray",&ioArray,32000,0);
642 if ((det >= 0) && (det < AliTRDgeometry::Ndet())) {
644 Int_t nTracklets = Tracklets()->GetEntriesFast();
645 TObjArray *detTracklets = new TObjArray(400);
647 for (Int_t i = 0; i < nTracklets; i++) {
648 AliTRDmcmTracklet *trk = (AliTRDmcmTracklet *) Tracklets()->UncheckedAt(i);
650 if (det == trk->GetDetector()) {
651 detTracklets->AddLast(trk);
657 branch->SetAddress(&detTracklets);
658 fTrackletTree->Fill();
668 Info("WriteTracklets","Writing the Tracklet tree %s for event %d."
669 ,fTrackletTree->GetName(),fRunLoader->GetEventNumber());
671 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
672 loader->WriteTracks("OVERWRITE");
682 //_____________________________________________________________________________
683 void AliTRDtrigger::MakeTracks(Int_t det)
686 // Create GTU tracks per module (stack of 6 chambers)
691 AliTRDCommonParam* commonParam = AliTRDCommonParam::Instance();
694 Error("MakeTracks","No common params.");
698 Int_t nRowMax, iplan, icham, isect, row;
700 AliTRDgeometry *geo = (AliTRDgeometry*)AliTRDgeometry::GetGeometry(fRunLoader);
702 if ((det < 0) || (det >= AliTRDgeometry::Ndet())) {
703 Error("MakeTracks","Unexpected detector index %d.",det);
707 Int_t nTracklets = Tracklets()->GetEntriesFast();
709 AliTRDmcmTracklet *trk;
710 for (Int_t i = 0; i < nTracklets; i++) {
712 trk = (AliTRDmcmTracklet *) Tracklets()->UncheckedAt(i);
714 iplan = geo->GetPlane(trk->GetDetector());
715 icham = geo->GetChamber(trk->GetDetector());
716 isect = geo->GetSector(trk->GetDetector());
718 nRowMax = commonParam->GetRowMax(iplan,icham,isect);
721 fModule->AddTracklet(trk->GetDetector(),
733 fModule->SortTracklets();
734 fModule->RemoveMultipleTracklets();
735 fModule->SortZ((Int_t)geo->GetChamber(det));
736 fModule->FindTracks();
737 fModule->SortTracks();
738 fModule->RemoveMultipleTracks();
740 Int_t nModTracks = fModule->GetNtracks();
741 AliTRDgtuTrack *gtutrk;
742 for (Int_t i = 0; i < nModTracks; i++) {
743 gtutrk = (AliTRDgtuTrack*)fModule->GetTrack(i);
744 if (TMath::Abs(gtutrk->GetPt()) < fTrigParam->GetGtuPtCut()) continue;
747 AddTrack(gtutrk,det);