X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUON.cxx;h=cc39541f2f93b887746e1ead0164ee359d8fa2c6;hb=ec71d0940ea63cefed1944b067e6f6b1143ad270;hp=cc0658b7c1566f6da3189b8b652554343c637e4d;hpb=e4fa3d7e8a2209b9fa997d2b65ed1bedaa4a4bc5;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUON.cxx b/MUON/AliMUON.cxx index cc0658b7c15..cc39541f2f9 100644 --- a/MUON/AliMUON.cxx +++ b/MUON/AliMUON.cxx @@ -14,6 +14,52 @@ **************************************************************************/ /* $Log$ +Revision 1.48 2001/03/06 00:01:36 morsch +Add Digits2Reco() and FindClusters() +Adapt call of cluster finder to new STEER. + +Revision 1.47 2001/03/05 08:38:36 morsch +Digitization related methods moved to AliMUONMerger. + +Revision 1.46 2001/01/26 21:34:59 morsch +Use access functions for AliMUONHit, AliMUONDigit and AliMUONPadHit data members. + +Revision 1.45 2001/01/26 20:00:49 hristov +Major upgrade of AliRoot code + +Revision 1.44 2001/01/25 17:39:09 morsch +Pass size of fNdch and fNrawch to CINT. + +Revision 1.43 2001/01/23 18:58:19 hristov +Initialisation of some pointers + +Revision 1.42 2001/01/17 20:53:40 hristov +Destructors corrected to avoid memory leaks + +Revision 1.41 2000/12/21 22:12:40 morsch +Clean-up of coding rule violations, + +Revision 1.40 2000/11/29 20:32:26 gosset +Digitize: +1. correction for array index out of bounds +2. one printout commented + +Revision 1.39 2000/11/12 17:17:03 pcrochet +BuildGeometry of AliMUON for trigger chambers delegated to AliMUONSegmentationTriggerX (same strategy as for tracking chambers) + +Revision 1.38 2000/11/06 09:20:43 morsch +AliMUON delegates part of BuildGeometry() to AliMUONSegmentation using the +Draw() method. This avoids code and parameter replication. + +Revision 1.37 2000/10/26 09:53:37 pcrochet +put back trigger chambers in the display (there was a problem in buildgeometry) + +Revision 1.36 2000/10/25 19:51:18 morsch +Correct x-position of chambers. + +Revision 1.35 2000/10/24 19:46:21 morsch +BuildGeometry updated for slats in station 3-4. + Revision 1.34 2000/10/18 11:42:06 morsch - AliMUONRawCluster contains z-position. - Some clean-up of useless print statements during initialisations. @@ -62,7 +108,7 @@ of chambers with overlapping modules (MakePadHits, Disintegration). Revision 1.23 2000/06/28 12:19:17 morsch More consequent seperation of global input data services (AliMUONClusterInput singleton) and the -cluster and hit reconstruction algorithms in AliMUONClusterFinderVS. +cluster and hit reconstruction algorithms in AliMUONClusterFindRawinderVS. AliMUONClusterFinderVS becomes the base class for clustering and hit reconstruction. It requires two cathode planes. Small modifications in the code will make it usable for one cathode plane and, hence, more general (for test beam data). @@ -188,6 +234,7 @@ Log message added #include "AliRun.h" #include "AliMC.h" #include "AliMUONClusterInput.h" +#include "AliMUONMerger.h" #include "iostream.h" #include "AliCallf77.h" #include "AliConst.h" @@ -210,22 +257,28 @@ ClassImp(AliMUON) //___________________________________________ AliMUON::AliMUON() { - fIshunt = 0; - fHits = 0; - fPadHits = 0; - fNPadHits = 0; - fDchambers = 0; - fTriggerCircuits = 0; // cp new design of AliMUONTriggerDecision - fNdch = 0; - fRawClusters = 0; - fNrawch = 0; - fGlobalTrigger = 0; - fNLocalTrigger = 0; - fLocalTrigger = 0; - fNLocalTrigger = 0; - fAccMin = 0.; - fAccMax = 0.; - fAccCut = kFALSE; +// Default Constructor +// + fNCh = 0; + fNTrackingCh = 0; + fIshunt = 0; + fHits = 0; + fPadHits = 0; + fNPadHits = 0; + fChambers = 0; + fDchambers = 0; + fTriggerCircuits = 0; + fNdch = 0; + fRawClusters = 0; + fNrawch = 0; + fGlobalTrigger = 0; + fNLocalTrigger = 0; + fLocalTrigger = 0; + fNLocalTrigger = 0; + fAccMin = 0.; + fAccMax = 0.; + fAccCut = kFALSE; + fMerger = 0; } //___________________________________________ @@ -244,7 +297,9 @@ AliMUON::AliMUON(const char *name, const char *title) fNPadHits = 0; fIshunt = 0; - fNdch = new Int_t[AliMUONConstants::NCh()]; + fNCh = AliMUONConstants::NCh(); + fNTrackingCh = AliMUONConstants::NTrackingCh(); + fNdch = new Int_t[fNCh]; fDchambers = new TObjArray(AliMUONConstants::NCh()); @@ -255,7 +310,7 @@ AliMUON::AliMUON(const char *name, const char *title) fNdch[i]=0; } - fNrawch = new Int_t[AliMUONConstants::NTrackingCh()]; + fNrawch = new Int_t[fNTrackingCh]; fRawClusters = new TObjArray(AliMUONConstants::NTrackingCh()); @@ -325,9 +380,9 @@ AliMUON::AliMUON(const char *name, const char *title) fTriggerCircuits = new TObjArray(AliMUONConstants::NTriggerCircuit()); for (Int_t circ=0; circDelete(); + delete fChambers; + } + + if (fTriggerCircuits){ + fTriggerCircuits->Delete(); + delete fTriggerCircuits; + } + + if (fDchambers){ + fDchambers->Delete(); + delete fDchambers; + } + + if (fRawClusters){ + fRawClusters->Delete(); + delete fRawClusters; + } + for (i=0;iDelete(); + delete fPadHits; + } + + if (fGlobalTrigger){ + fGlobalTrigger->Delete(); + delete fGlobalTrigger; + } fNGlobalTrigger = 0; - delete fLocalTrigger; + if (fLocalTrigger){ + fLocalTrigger->Delete(); + delete fLocalTrigger; + } fNLocalTrigger = 0; - for (i=0;iDelete(); + delete fHits2; } - delete fDchambers; - - for (i=0;iDelete(); + delete fPadHits2; } - delete fRawClusters; - - for (Int_t circ=0; circDelete(); + delete fHits; + } + + // Delete hits tree for background event + + if (fTrH1) { + fTrH1->Delete(); + delete fTrH1; } - delete fTriggerCircuits; + + if (fMerger) delete fMerger; } //___________________________________________ @@ -427,256 +526,15 @@ void AliMUON::AddLocalTrigger(Int_t *localtr) //___________________________________________ void AliMUON::BuildGeometry() { - TNode *node, *nodeF, *top, *nodeS; - const int kColorMUON = kBlue; - const int kColorMUON2 = kYellow; - const int kColorMUON3 = kBlue; - // - top=gAlice->GetGeometry()->GetNode("alice"); -// MUON -// -// z-Positions of Chambers - const Float_t kCz[7]={511., 686., 971., 1245., 1445., 1600, 1700.}; -// inner diameter (Xlenght for trigger chamber -> active area) - const Float_t kDmin[7]={ 35., 47., 67., 86., 100., 544., 544.}; -// outer diameter (Ylenght for trigger chamber -> active area) - const Float_t kDmax[7]={183., 245., 346., 520., 520., 612., 612.}; - - TRotMatrix* rot000 = new TRotMatrix("Rot000"," ", 90, 0, 90, 90, 0, 0); - TRotMatrix* rot090 = new TRotMatrix("Rot090"," ", 90, 90, 90,180, 0, 0); - TRotMatrix* rot180 = new TRotMatrix("Rot180"," ", 90,180, 90,270, 0, 0); - TRotMatrix* rot270 = new TRotMatrix("Rot270"," ", 90,270, 90, 0, 0, 0); - - Float_t rmin, rmax, dx, dy, dz, dr, xpos, ypos, zpos; - Float_t dzc1=4.; // tracking chambers - Float_t dzc2=15.; // trigger chambers - Float_t hole=102.; // x-y hole around beam pipe for trig. chambers - Float_t zscale; // scaling parameter trigger chambers - Float_t halfx, halfy; - char nameChamber[9], nameSense[9], nameFrame[9], nameNode[9]; - char nameSense1[9], nameSense2[9]; - for (Int_t i=0; i<7; i++) { - for (Int_t j=0; j<2; j++) { - Int_t id=2*i+j+1; - if (i<5) { // tracking chambers - if (j==0) { - zpos=kCz[i]-dzc1; - } else { - zpos=kCz[i]+dzc1; - } - } else { - if (j==0) { - zpos=kCz[i]; - } else { - zpos=kCz[i]+dzc2; - } - } - sprintf(nameChamber,"C_MUON%d",id); - sprintf(nameSense,"S_MUON%d",id); - sprintf(nameSense1,"S1_MUON%d",id); - sprintf(nameSense2,"S2_MUON%d",id); - sprintf(nameFrame,"F_MUON%d",id); - if (i<2) { // tracking chambers - rmin = kDmin[i]/2.-3; - rmax = kDmax[i]/2.+3; - new TTUBE(nameChamber,"Mother","void",rmin,rmax,0.25,1.); - rmin = kDmin[i]/2.; - rmax = kDmax[i]/2.; - new TTUBE(nameSense,"Sens. region","void",rmin,rmax,0.25, 1.); - dx=(rmax-rmin)/2; - dy=3.; - dz=0.25; - TBRIK* frMUON = new TBRIK(nameFrame,"Frame","void",dx,dy,dz); - top->cd(); - sprintf(nameNode,"MUON%d",100+id); - node = new TNode(nameNode,"ChamberNode",nameChamber,0,0,zpos,""); - node->SetLineColor(kColorMUON); - fNodes->Add(node); - node->cd(); - sprintf(nameNode,"MUON%d",200+id); - node = new TNode(nameNode,"Sens. Region Node",nameSense,0,0,0,""); - node->SetLineColor(kColorMUON); - node->cd(); - dr=dx+rmin; - sprintf(nameNode,"MUON%d",300+id); - nodeF = new TNode(nameNode,"Frame0",frMUON,dr, 0, 0,rot000,""); - nodeF->SetLineColor(kColorMUON); - node->cd(); - sprintf(nameNode,"MUON%d",400+id); - nodeF = new TNode(nameNode,"Frame1",frMUON,0 ,dr,0,rot090,""); - nodeF->SetLineColor(kColorMUON); - node->cd(); - sprintf(nameNode,"MUON%d",500+id); - nodeF = new TNode(nameNode,"Frame2",frMUON,-dr,0,0,rot180,""); - nodeF->SetLineColor(kColorMUON); - node ->cd(); - sprintf(nameNode,"MUON%d",600+id); - nodeF = new TNode(nameNode,"Frame3",frMUON,0,-dr,0,rot270,""); - nodeF->SetLineColor(kColorMUON); - } else if (i >= 2 || i <= 4) { - Int_t nslats; - Int_t npcb[7]={0, 0, 0, 0, 0, 0, 0}; - if (i==2) { - nslats = 4; - npcb[0] = 3; npcb[1] = 4; npcb[2] = 3; npcb[3] = 2; - } else if (i==3) { - nslats = 6; - npcb[0] = 4; npcb[1] = 5; npcb[2] = 5; npcb[3] = 4; - npcb[4] = 3; npcb[5] = 2; - } else { - nslats = 7; - npcb[0] = 7; npcb[1] = 7; npcb[2] = 6; npcb[3] = 6; - npcb[4] = 5; npcb[5] = 4; npcb[6] = 2; - } - - char nameSlat[9]; - - Float_t xpos=4.; - Float_t ypos1=-0.75+20.; - Float_t ypos2= 0.75-20.; - if (i!=2) { - ypos1=ypos2=0.; - } - - new TBRIK(nameChamber,"Mother","void",340,340,5.); - top->cd(); - sprintf(nameNode,"MUON%d",100+id); - node = new TNode(nameNode,"Chambernode",nameChamber,0,0,zpos,""); - node->SetLineColor(kBlack); - fNodes->Add(node); - TNode* nodeSlat; - Int_t color; - - for (Int_t j=0; jcd(); - xpos=20.*npcb[j]+4; - if (j==0) xpos+=30; - - color = TMath::Even(j) ? kColorMUON2 : kColorMUON3; - - sprintf(nameNode,"SLAT%d",100*id+j); - nodeSlat = - new TNode(nameNode,"Slat Module",nameSlat,xpos,ypos1,0,""); - nodeSlat->SetLineColor(color); - - node->cd(); - sprintf(nameNode,"SLAT%d",100*id+j+7); - nodeSlat = - new TNode(nameNode,"Slat Module",nameSlat,-xpos,ypos1,0,""); - nodeSlat->SetLineColor(color); - - if (i==2 || (i!=2 && j!=0)) { - - if (i==2) { - color = TMath::Even(j) ? kColorMUON3 : kColorMUON2; - } else { - color = TMath::Even(j) ? kColorMUON2 : kColorMUON3; - } - - - sprintf(nameNode,"SLAT%d",100*id+j+14); - nodeSlat = - new TNode(nameNode,"Slat Module",nameSlat,xpos,ypos2,0,""); - nodeSlat->SetLineColor(color); - - node->cd(); - sprintf(nameNode,"SLAT%d",100*id+j+21); - nodeSlat = - new TNode(nameNode,"Slat Module",nameSlat,-xpos,ypos2,0,""); - nodeSlat->SetLineColor(color); - } - - ypos1+=38.5; - ypos2-=38.5; - } - - } else { - zscale=zpos/kCz[5]; - Float_t xsize=kDmin[i]*zscale; - Float_t ysize=kDmax[i]*zscale; - Float_t holeScaled=hole*zscale; - - halfx=xsize/2.+3.; - halfy=ysize/2.+3.; - new TBRIK(nameChamber,"Mother","void",halfx,halfy,0.25); - top->cd(); - sprintf(nameNode,"MUON%d",100+id); - node = new TNode(nameNode,"Chambernode",nameChamber,0,0,zpos,""); - node->SetLineColor(kColorMUON2); - fNodes->Add(node); - -// up/down of beam pipe - halfx=xsize/2.; - halfy=(ysize/2.-holeScaled/2.)/2.; - new TBRIK(nameSense,"Sens. region","void",halfx,halfy,0.25); - - node->cd(); - ypos=holeScaled/2.+((ysize/2.-holeScaled/2.)/2.); - sprintf(nameNode,"MUON%d",200+id); - nodeS = new TNode(nameNode,"Sens. Region Node",nameSense,0,ypos,0,""); - nodeS->SetLineColor(kColorMUON2); - - node->cd(); - ypos=-1.*ypos; - sprintf(nameNode,"MUON%d",300+id); - nodeS = new TNode(nameNode,"Sens. Region Node",nameSense,0,ypos,0,""); - nodeS->SetLineColor(kColorMUON2); - -// left/right of beam pipe - halfx=(xsize/2.-holeScaled/2.)/2.; - halfy=holeScaled/2.; - new TBRIK(nameSense1,"Sens. region","void",halfx,halfy,0.25); - - node->cd(); - xpos=holeScaled/2.+((xsize/2.-holeScaled/2.)/2.); - sprintf(nameNode,"MUON%d",400+id); - nodeS = new TNode(nameNode,"Sens. Region Node",nameSense1,xpos,0,0,""); - nodeS->SetLineColor(kColorMUON2); - - node->cd(); - xpos=-1.*xpos; - sprintf(nameNode,"MUON%d",500+id); - nodeS = new TNode(nameNode,"Sens. Region Node",nameSense1,xpos,0,0,""); - nodeS->SetLineColor(kColorMUON2); - -// missing corners - halfx=17.*zscale/2.; - halfy=halfx; - new TBRIK(nameSense2,"Sens. region","void",halfx,halfy,0.25); - - node->cd(); - xpos=holeScaled/2.-halfx; - ypos=xpos; - sprintf(nameNode,"MUON%d",600+id); - nodeS = new TNode(nameNode,"Sens. Region Node",nameSense2,xpos,ypos,0,""); - nodeS->SetLineColor(kColorMUON2); - - node->cd(); - ypos=-1.*xpos; - sprintf(nameNode,"MUON%d",700+id); - nodeS = new TNode(nameNode,"Sens. Region Node",nameSense2,xpos,ypos,0,""); - nodeS->SetLineColor(kColorMUON2); - - node->cd(); - xpos=-1.*xpos; - sprintf(nameNode,"MUON%d",800+id); - nodeS = new TNode(nameNode,"Sens. Region Node",nameSense2,xpos,ypos,0,""); - nodeS->SetLineColor(kColorMUON2); - - node->cd(); - ypos=-1.*xpos; - sprintf(nameNode,"MUON%d",900+id); - nodeS = new TNode(nameNode,"Sens. Region Node",nameSense2,xpos,ypos,0,""); - nodeS->SetLineColor(kColorMUON2); - } - } +// Geometry for event display + for (Int_t i=0; i<7; i++) { + for (Int_t j=0; j<2; j++) { + Int_t id=2*i+j+1; + this->Chamber(id-1).SegmentationModel(1)->Draw("eventdisplay"); } + } } - //___________________________________________ Int_t AliMUON::DistancetoPrimitive(Int_t , Int_t ) { @@ -684,57 +542,78 @@ Int_t AliMUON::DistancetoPrimitive(Int_t , Int_t ) } //___________________________________________ -void AliMUON::MakeBranch(Option_t* option) +void AliMUON::MakeBranch(Option_t* option, char *file) { + // // Create Tree branches for the MUON. + // const Int_t kBufferSize = 4000; char branchname[30]; sprintf(branchname,"%sCluster",GetName()); - AliDetector::MakeBranch(option); + AliDetector::MakeBranch(option,file); - if (fPadHits && gAlice->TreeH()) { - gAlice->TreeH()->Branch(branchname,&fPadHits, kBufferSize); - printf("Making Branch %s for clusters\n",branchname); + const char *cD = strstr(option,"D"); + const char *cR = strstr(option,"R"); + const char *cH = strstr(option,"H"); + + if (fPadHits && gAlice->TreeH() && cH) { + gAlice->MakeBranchInTree(gAlice->TreeH(), + branchname, &fPadHits, kBufferSize, file) ; + printf("Making Branch %s for clusters\n",branchname); } -// one branch for digits per chamber - Int_t i; - - for (i=0; iTreeD()) { - gAlice->TreeD()->Branch(branchname,&((*fDchambers)[i]), kBufferSize); - printf("Making Branch %s for digits in chamber %d\n",branchname,i+1); - } - } - - printf("Make Branch - TreeR address %p\n",gAlice->TreeR()); - -// one branch for raw clusters per chamber - for (i=0; iTreeR()) { - gAlice->TreeR()->Branch(branchname,&((*fRawClusters)[i]), kBufferSize); - printf("Making Branch %s for raw clusters in chamber %d\n",branchname,i+1); - } - } + if (cD) { + // + // one branch for digits per chamber + // + Int_t i; -// one branch for global trigger - sprintf(branchname,"%sGlobalTrigger",GetName()); - if (fGlobalTrigger && gAlice->TreeR()) { - gAlice->TreeR()->Branch(branchname,&fGlobalTrigger,kBufferSize); - printf("Making Branch %s for Global Trigger\n",branchname); - } -// one branch for local trigger - sprintf(branchname,"%sLocalTrigger",GetName()); - if (fLocalTrigger && gAlice->TreeR()) { - gAlice->TreeR()->Branch(branchname,&fLocalTrigger,kBufferSize); - printf("Making Branch %s for Local Trigger\n",branchname); + for (i=0; iTreeD()) { + gAlice->MakeBranchInTree(gAlice->TreeD(), + branchname, &((*fDchambers)[i]), kBufferSize, file) ; + printf("Making Branch %s for digits in chamber %d\n",branchname,i+1); + } + } } + if (cR) { + // + // one branch for raw clusters per chamber + // + printf("Make Branch - TreeR address %p\n",gAlice->TreeR()); + + Int_t i; + + for (i=0; iTreeR()) { + gAlice->MakeBranchInTree(gAlice->TreeR(), + branchname, &((*fRawClusters)[i]), kBufferSize, file) ; + printf("Making Branch %s for raw clusters in chamber %d\n",branchname,i+1); + } + } + // + // one branch for global trigger + // + sprintf(branchname,"%sGlobalTrigger",GetName()); + if (fGlobalTrigger && gAlice->TreeR()) { + gAlice->MakeBranchInTree(gAlice->TreeR(), + branchname, &fGlobalTrigger, kBufferSize, file) ; + printf("Making Branch %s for Global Trigger\n",branchname); + } + // + // one branch for local trigger + // + sprintf(branchname,"%sLocalTrigger",GetName()); + if (fLocalTrigger && gAlice->TreeR()) { + gAlice->MakeBranchInTree(gAlice->TreeR(), + branchname, &fLocalTrigger, kBufferSize, file) ; + printf("Making Branch %s for Local Trigger\n",branchname); + } + } } //___________________________________________ @@ -832,6 +711,7 @@ void AliMUON::ResetTrigger() //____________________________________________ void AliMUON::SetPadSize(Int_t id, Int_t isec, Float_t p1, Float_t p2) { +// Set the pad size for chamber id and cathode isec Int_t i=2*(id-1); ((AliMUONChamber*) (*fChambers)[i]) ->SetPadSize(isec,p1,p2); ((AliMUONChamber*) (*fChambers)[i+1])->SetPadSize(isec,p1,p2); @@ -859,6 +739,7 @@ void AliMUON::SetChambersZToDefault() //___________________________________________ void AliMUON::SetChargeSlope(Int_t id, Float_t p1) { +// Set the inverse charge slope for chamber id Int_t i=2*(id-1); ((AliMUONChamber*) (*fChambers)[i])->SetChargeSlope(p1); ((AliMUONChamber*) (*fChambers)[i+1])->SetChargeSlope(p1); @@ -867,6 +748,7 @@ void AliMUON::SetChargeSlope(Int_t id, Float_t p1) //___________________________________________ void AliMUON::SetChargeSpread(Int_t id, Float_t p1, Float_t p2) { +// Set sigma of charge spread for chamber id Int_t i=2*(id-1); ((AliMUONChamber*) (*fChambers)[i])->SetChargeSpread(p1,p2); ((AliMUONChamber*) (*fChambers)[i+1])->SetChargeSpread(p1,p2); @@ -875,6 +757,7 @@ void AliMUON::SetChargeSpread(Int_t id, Float_t p1, Float_t p2) //___________________________________________ void AliMUON::SetSigmaIntegration(Int_t id, Float_t p1) { +// Set integration limits for charge spread Int_t i=2*(id-1); ((AliMUONChamber*) (*fChambers)[i])->SetSigmaIntegration(p1); ((AliMUONChamber*) (*fChambers)[i+1])->SetSigmaIntegration(p1); @@ -883,6 +766,7 @@ void AliMUON::SetSigmaIntegration(Int_t id, Float_t p1) //___________________________________________ void AliMUON::SetMaxAdc(Int_t id, Int_t p1) { +// Set maximum number for ADCcounts (saturation) Int_t i=2*(id-1); ((AliMUONChamber*) (*fChambers)[i])->SetMaxAdc(p1); ((AliMUONChamber*) (*fChambers)[i+1])->SetMaxAdc(p1); @@ -891,29 +775,34 @@ void AliMUON::SetMaxAdc(Int_t id, Int_t p1) //___________________________________________ void AliMUON::SetMaxStepGas(Float_t p1) { +// Set stepsize in gas fMaxStepGas=p1; } //___________________________________________ void AliMUON::SetMaxStepAlu(Float_t p1) { +// Set step size in Alu fMaxStepAlu=p1; } //___________________________________________ void AliMUON::SetMaxDestepGas(Float_t p1) { +// Set maximum step size in Gas fMaxDestepGas=p1; } //___________________________________________ void AliMUON::SetMaxDestepAlu(Float_t p1) { +// Set maximum step size in Alu fMaxDestepAlu=p1; } //___________________________________________ void AliMUON::SetAcceptance(Bool_t acc, Float_t angmin, Float_t angmax) { +// Set acceptance cuts fAccCut=acc; fAccMin=angmin*TMath::Pi()/180; fAccMax=angmax*TMath::Pi()/180; @@ -933,30 +822,39 @@ void AliMUON::SetAcceptance(Bool_t acc, Float_t angmin, Float_t angmax) //___________________________________________ void AliMUON::SetSegmentationModel(Int_t id, Int_t isec, AliSegmentation *segmentation) { +// Set the segmentation for chamber id cathode isec ((AliMUONChamber*) (*fChambers)[id])->SetSegmentationModel(isec, segmentation); } //___________________________________________ void AliMUON::SetResponseModel(Int_t id, AliMUONResponse *response) { +// Set the response for chamber id ((AliMUONChamber*) (*fChambers)[id])->SetResponseModel(response); } void AliMUON::SetReconstructionModel(Int_t id, AliMUONClusterFinderVS *reconst) { +// Set ClusterFinder for chamber id ((AliMUONChamber*) (*fChambers)[id])->SetReconstructionModel(reconst); } void AliMUON::SetNsec(Int_t id, Int_t nsec) { +// Set number of segmented cathods for chamber id ((AliMUONChamber*) (*fChambers)[id])->SetNsec(nsec); } - //___________________________________________ +void AliMUON::SDigits2Digits() +{ + if (fMerger) { + fMerger->Init(); + fMerger->Digitise(); + } +} - - +//___________________________________________ void AliMUON::MakePadHits(Float_t xhit,Float_t yhit, Float_t zhit, Float_t eloss, Float_t tof, Int_t idvol) { @@ -1006,486 +904,6 @@ void AliMUON::MakePadHits(Float_t xhit,Float_t yhit, Float_t zhit, } } -//---------------------------------------------------------------------- - -void AliMUON::Digitise(Int_t nev,Int_t bgrEvent,Option_t *option,Option_t *opt,Text_t *filename) -{ - // keep galice.root for signal and name differently the file for - // background when add! otherwise the track info for signal will be lost ! - - static Bool_t first=kTRUE; - static TFile *file; - char *addBackground = strstr(option,"Add"); - - - AliMUONChamber* iChamber; - AliSegmentation* segmentation; - - - Int_t trk[50]; - Int_t chtrk[50]; - TObjArray *list=new TObjArray; - static TClonesArray *pAddress=0; - if(!pAddress) pAddress=new TClonesArray("TVector",1000); - Int_t digits[5]; - - AliMUON *pMUON = (AliMUON *) gAlice->GetModule("MUON"); - AliHitMap** hitMap= new AliHitMap* [AliMUONConstants::NCh()]; - for (Int_t i=0; icd(); - //file->ls(); - // Get Hits Tree header from file - if(fHits2) fHits2->Clear(); - if(fPadHits2) fPadHits2->Clear(); - if(fTrH1) delete fTrH1; - fTrH1=0; - - char treeName[20]; - sprintf(treeName,"TreeH%d",bgrEvent); - fTrH1 = (TTree*)gDirectory->Get(treeName); - //printf("fTrH1 %p of treename %s for event %d \n",fTrH1,treeName,bgrEvent); - - if (!fTrH1) { - printf("ERROR: cannot find Hits Tree for event:%d\n",bgrEvent); - } - // Set branch addresses - TBranch *branch; - char branchname[20]; - sprintf(branchname,"%s",GetName()); - if (fTrH1 && fHits2) { - branch = fTrH1->GetBranch(branchname); - if (branch) branch->SetAddress(&fHits2); - } - if (fTrH1 && fPadHits2) { - branch = fTrH1->GetBranch("MUONCluster"); - if (branch) branch->SetAddress(&fPadHits2); - } -// test - //Int_t ntracks1 =(Int_t)fTrH1->GetEntries(); - //printf("background - ntracks1 - %d\n",ntracks1); - } - // - // loop over cathodes - // - AliHitMap* hm; - Int_t countadr=0; - for (int icat=0; icat<2; icat++) { - Int_t counter=0; - Int_t * nmuon = new Int_t [AliMUONConstants::NCh()]; - for (Int_t i =0; iNsec()==1 && icat==1) { - continue; - } else { - segmentation=iChamber->SegmentationModel(icat+1); - } - hitMap[i] = new AliMUONHitMapA1(segmentation, list); - nmuon[i]=0; - } - //printf("Start loop over tracks \n"); -// -// Loop over tracks -// - - TTree *treeH = gAlice->TreeH(); - Int_t ntracks =(Int_t) treeH->GetEntries(); - Int_t jj; - - Float_t ** xhit = new Float_t * [AliMUONConstants::NCh()]; - for (jj=0; jjResetHits(); - treeH->GetEvent(track); -// -// Loop over hits - for(AliMUONHit* mHit=(AliMUONHit*)pMUON->FirstHit(-1); - mHit; - mHit=(AliMUONHit*)pMUON->NextHit()) - { - Int_t nch = mHit->fChamber-1; // chamber number - if (nch > AliMUONConstants::NCh()-1) continue; -// if (nch > 9) continue; - iChamber = &(pMUON->Chamber(nch)); - // new 17.07.99 - if (addBackground) { - - if (mHit->fParticle == kMuonPlus - || mHit->fParticle == kMuonMinus) { - xhit[nch][nmuon[nch]]=mHit->X(); - yhit[nch][nmuon[nch]]=mHit->Y(); - nmuon[nch]++; - if (nmuon[nch] >2) printf("nmuon %d\n",nmuon[nch]); - } - } - - - - -// -// Loop over pad hits - for (AliMUONPadHit* mPad= - (AliMUONPadHit*)pMUON->FirstPad(mHit,fPadHits); - mPad; - mPad=(AliMUONPadHit*)pMUON->NextPad(fPadHits)) - { - Int_t cathode = mPad->fCathode; // cathode number - Int_t ipx = mPad->fPadX; // pad number on X - Int_t ipy = mPad->fPadY; // pad number on Y - Int_t iqpad = Int_t(mPad->fQpad);// charge per pad -// printf("\n Pad: %d %d %d %d", ipx, ipy, cathode,nch); -// -// - - if (cathode != (icat+1)) continue; - // fill the info array -// Float_t thex, they, thez; - segmentation=iChamber->SegmentationModel(cathode); -// segmentation->GetPadC(ipx,ipy,thex,they,thez); -// Float_t rpad=TMath::Sqrt(thex*thex+they*they); -// if (rpad < rmin || iqpad ==0 || rpad > rmax) continue; - - new((*pAddress)[countadr++]) TVector(2); - TVector &trinfo=*((TVector*) (*pAddress)[countadr-1]); - trinfo(0)=(Float_t)track; - trinfo(1)=(Float_t)iqpad; - - digits[0]=ipx; - digits[1]=ipy; - digits[2]=iqpad; - digits[3]=iqpad; - if (mHit->fParticle == kMuonPlus || - mHit->fParticle == kMuonMinus) { - digits[4]=mPad->fHitNumber; - } else digits[4]=-1; - - AliMUONTransientDigit* pdigit; - // build the list of fired pads and update the info - if (!hitMap[nch]->TestHit(ipx, ipy)) { - - list->AddAtAndExpand( - new AliMUONTransientDigit(nch,digits),counter); - - hitMap[nch]->SetHit(ipx, ipy, counter); - counter++; - pdigit=(AliMUONTransientDigit*)list->At(list->GetLast()); - // list of tracks - TObjArray *trlist=(TObjArray*)pdigit->TrackList(); - trlist->Add(&trinfo); - } else { - pdigit=(AliMUONTransientDigit*) hitMap[nch]->GetHit(ipx, ipy); - // update charge - (*pdigit).fSignal+=iqpad; - (*pdigit).fPhysics+=iqpad; - // update list of tracks - TObjArray* trlist=(TObjArray*)pdigit->TrackList(); - Int_t lastEntry=trlist->GetLast(); - TVector *pTrack=(TVector*)trlist->At(lastEntry); - TVector &ptrk=*pTrack; - Int_t lastTrack = Int_t(ptrk(0)); - Int_t lastCharge = Int_t(ptrk(1)); - if (lastTrack==track) { - lastCharge+=iqpad; - trlist->RemoveAt(lastEntry); - trinfo(0)=lastTrack; - trinfo(1)=lastCharge; - trlist->AddAt(&trinfo,lastEntry); - } else { - trlist->Add(&trinfo); - } - // check the track list - Int_t nptracks=trlist->GetEntriesFast(); - if (nptracks > 2) { - for (Int_t tr=0;trAt(tr); - TVector &pptrk=*ppTrack; - trk[tr] = Int_t(pptrk(0)); - chtrk[tr] = Int_t(pptrk(1)); - } - } // end if nptracks - } // end if pdigit - } //end loop over clusters - } // hit loop - } // track loop - - // open the file with background - - if (addBackground) { - ntracks =(Int_t)fTrH1->GetEntries(); -// -// Loop over tracks -// - for (Int_t track=0; trackClear(); - if (fPadHits2) fPadHits2->Clear(); - - fTrH1->GetEvent(track); -// -// Loop over hits - AliMUONHit* mHit; - for(int i=0;iGetEntriesFast();++i) - { - mHit=(AliMUONHit*) (*fHits2)[i]; - Int_t nch = mHit->fChamber-1; // chamber number - if (nch >9) continue; - iChamber = &(pMUON->Chamber(nch)); -// Int_t rmin = (Int_t)iChamber->RInner(); -// Int_t rmax = (Int_t)iChamber->ROuter(); - Float_t xbgr=mHit->X(); - Float_t ybgr=mHit->Y(); - Bool_t cond=kFALSE; - - for (Int_t imuon =0; imuon < nmuon[nch]; imuon++) { - Float_t dist= (xbgr-xhit[nch][imuon])*(xbgr-xhit[nch][imuon]) - +(ybgr-yhit[nch][imuon])*(ybgr-yhit[nch][imuon]); - if (dist<100) cond=kTRUE; - } - if (!cond) continue; - -// -// Loop over pad hits - for (AliMUONPadHit* mPad= - (AliMUONPadHit*)pMUON->FirstPad(mHit,fPadHits2); - mPad; - mPad=(AliMUONPadHit*)pMUON->NextPad(fPadHits2)) - { - // mPad = (AliMUONPadHit*) (*fPadHits2)[j]; - Int_t cathode = mPad->fCathode; // cathode number - Int_t ipx = mPad->fPadX; // pad number on X - Int_t ipy = mPad->fPadY; // pad number on Y - Int_t iqpad = Int_t(mPad->fQpad);// charge per pad - - if (cathode != (icat+1)) continue; - printf("\n Pad: %d %d %d", ipx, ipy, cathode); - -// Float_t thex, they, thez; -// segmentation=iChamber->SegmentationModel(cathode); -// segmentation->GetPadC(ipx,ipy,thex,they,thez); -// Float_t rpad=TMath::Sqrt(thex*thex+they*they); -// if (rpad < rmin || iqpad ==0 || rpad > rmax) continue; - new((*pAddress)[countadr++]) TVector(2); - TVector &trinfo=*((TVector*) (*pAddress)[countadr-1]); - trinfo(0)=-1; // tag background - trinfo(1)=-1; - - digits[0]=ipx; - digits[1]=ipy; - digits[2]=iqpad; - digits[3]=0; - digits[4]=-1; - - AliMUONTransientDigit* pdigit; - // build the list of fired pads and update the info - if (!hitMap[nch]->TestHit(ipx, ipy)) { - list->AddAtAndExpand(new AliMUONTransientDigit(nch,digits),counter); - - hitMap[nch]->SetHit(ipx, ipy, counter); - counter++; - - pdigit=(AliMUONTransientDigit*)list->At(list->GetLast()); - // list of tracks - TObjArray *trlist=(TObjArray*)pdigit-> - TrackList(); - trlist->Add(&trinfo); - } else { - pdigit=(AliMUONTransientDigit*) hitMap[nch]->GetHit(ipx, ipy); - // update charge - (*pdigit).fSignal+=iqpad; - - // update list of tracks - TObjArray* trlist=(TObjArray*)pdigit-> - TrackList(); - Int_t lastEntry=trlist->GetLast(); - TVector *pTrack=(TVector*)trlist-> - At(lastEntry); - TVector &ptrk=*pTrack; - Int_t lastTrack=Int_t(ptrk(0)); - if (lastTrack==-1) { - continue; - } else { - trlist->Add(&trinfo); - } - // check the track list - Int_t nptracks=trlist->GetEntriesFast(); - if (nptracks > 0) { - for (Int_t tr=0;trAt(tr); - TVector &pptrk=*ppTrack; - trk[tr]=Int_t(pptrk(0)); - chtrk[tr]=Int_t(pptrk(1)); - } - } // end if nptracks - } // end if pdigit - } //end loop over clusters - } // hit loop - } // track loop - //Int_t nentr2=list->GetEntriesFast(); - //printf(" \n counter2, nentr2 %d %d \n",counter,nentr2); - TTree *fAli=gAlice->TreeK(); - TFile *file=NULL; - - if (fAli) file =fAli->GetCurrentFile(); - file->cd(); - } // if addBackground - delete [] xhit; - delete [] yhit; - - Int_t tracks[10]; - Int_t charges[10]; - Int_t nentries=list->GetEntriesFast(); - - for (Int_t nent=0;nentAt(nent); - if (address==0) continue; - Int_t ich=address->fChamber; - Int_t q=address->fSignal; - iChamber=(AliMUONChamber*) (*fChambers)[ich]; -// -// Digit Response (noise, threshold, saturation, ...) -// if (address->fPhysics !=0 ) address->fPhysics+=(Int_t)Noise; - AliMUONResponse * response=iChamber->ResponseModel(); - q=response->DigitResponse(q); - - if (!q) continue; - - digits[0]=address->fPadX; - digits[1]=address->fPadY; - digits[2]=q; - digits[3]=address->fPhysics; - digits[4]=address->fHit; - - TObjArray* trlist=(TObjArray*)address->TrackList(); - Int_t nptracks=trlist->GetEntriesFast(); - //printf("nptracks, trlist %d %p\n",nptracks,trlist); - - // this was changed to accomodate the real number of tracks - if (nptracks > 10) { - cout<<"Attention - nptracks > 10 "< 2) { - printf("Attention - nptracks > 2 %d \n",nptracks); - printf("cat,ich,ix,iy,q %d %d %d %d %d \n",icat,ich,digits[0],digits[1],q); - } - for (Int_t tr=0;trAt(tr); - if(!ppP ) printf("ppP - %p\n",ppP); - TVector &pp =*ppP; - tracks[tr]=Int_t(pp(0)); - charges[tr]=Int_t(pp(1)); - //printf("tracks, charges - %d %d\n",tracks[tr],charges[tr]); - } //end loop over list of tracks for one pad - // Sort list of tracks according to charge - if (nptracks > 1) { - SortTracks(tracks,charges,nptracks); - } - if (nptracks < 10 ) { - for (Int_t i=nptracks; i<10; i++) { - tracks[i]=0; - charges[i]=0; - } - } - - // fill digits - pMUON->AddDigits(ich,tracks,charges,digits); - // delete trlist; - } - //cout<<"I'm out of the loops for digitisation"<GetEvent(nev); - gAlice->TreeD()->Fill(); - pMUON->ResetDigits(); - list->Delete(); - - - for(Int_t ii=0;iiTreeD()->Write(hname); - // reset tree - gAlice->TreeD()->Reset(); - delete list; - - pAddress->Delete(); - // gObjectTable->Print(); -} - -void AliMUON::SortTracks(Int_t *tracks,Int_t *charges,Int_t ntr) -{ - // - // Sort the list of tracks contributing to a given digit - // Only the 3 most significant tracks are acctually sorted - // - - // - // Loop over signals, only 3 times - // - - Int_t qmax; - Int_t jmax; - Int_t idx[3] = {-2,-2,-2}; - Int_t jch[3] = {-2,-2,-2}; - Int_t jtr[3] = {-2,-2,-2}; - Int_t i,j,imax; - - if (ntr<3) imax=ntr; - else imax=3; - for(i=0;i qmax) { - qmax = charges[j]; - jmax=j; - } - } - - if(qmax > 0) { - idx[i]=jmax; - jch[i]=charges[jmax]; - jtr[i]=tracks[jmax]; - } - - } - - for(i=0;i<3;i++){ - if (jtr[i] == -2) { - charges[i]=0; - tracks[i]=0; - } else { - charges[i]=jch[i]; - tracks[i]=jtr[i]; - } - } - -} - //___________________________________________ void AliMUON::Trigger(Int_t nev){ // call the Trigger Algorithm and fill TreeR @@ -1528,15 +946,23 @@ void AliMUON::Trigger(Int_t nev){ ResetTrigger(); char hname[30]; sprintf(hname,"TreeR%d",nev); - gAlice->TreeR()->Write(hname); + gAlice->TreeR()->Write(hname,TObject::kOverwrite); gAlice->TreeR()->Reset(); printf("\n End of trigger for event %d", nev); } //____________________________________________ -void AliMUON::FindClusters(Int_t nev,Int_t lastEntry) +void AliMUON::Digits2Reco() +{ + FindClusters(); +} + +void AliMUON::FindClusters() { +// +// Perform cluster finding +// TClonesArray *dig1, *dig2; Int_t ndig, k; dig1 = new TClonesArray("AliMUONDigit",1000); @@ -1545,24 +971,25 @@ void AliMUON::FindClusters(Int_t nev,Int_t lastEntry) // // Loop on chambers and on cathode planes // + ResetRawClusters(); + for (Int_t ich = 0; ich < 10; ich++) { + AliMUONChamber* iChamber = (AliMUONChamber*) (*fChambers)[ich]; + AliMUONClusterFinderVS* rec = iChamber->ReconstructionModel(); - for (Int_t ich=0;ich<10;ich++) { - AliMUONChamber* iChamber=(AliMUONChamber*) (*fChambers)[ich]; - AliMUONClusterFinderVS* rec = iChamber->ReconstructionModel(); gAlice->ResetDigits(); - gAlice->TreeD()->GetEvent(lastEntry); - TClonesArray *muonDigits = this->DigitsAddress(ich); + gAlice->TreeD()->GetEvent(0); + TClonesArray *muonDigits = this->DigitsAddress(ich); ndig=muonDigits->GetEntriesFast(); printf("\n 1 Found %d digits in %p %d", ndig, muonDigits,ich); TClonesArray &lhits1 = *dig1; - Int_t n=0; - for (k=0; kUncheckedAt(k); - if (rec->TestTrack(digit->fTracks[0])) + Int_t n = 0; + for (k = 0; k < ndig; k++) { + digit = (AliMUONDigit*) muonDigits->UncheckedAt(k); + if (rec->TestTrack(digit->Track(0))) new(lhits1[n++]) AliMUONDigit(*digit); } gAlice->ResetDigits(); - gAlice->TreeD()->GetEvent(lastEntry+1); + gAlice->TreeD()->GetEvent(1); muonDigits = this->DigitsAddress(ich); ndig=muonDigits->GetEntriesFast(); printf("\n 2 Found %d digits in %p %d", ndig, muonDigits, ich); @@ -1571,7 +998,7 @@ void AliMUON::FindClusters(Int_t nev,Int_t lastEntry) for (k=0; kUncheckedAt(k); - if (rec->TestTrack(digit->fTracks[0])) + if (rec->TestTrack(digit->Track(0))) new(lhits2[n++]) AliMUONDigit(*digit); } @@ -1582,20 +1009,11 @@ void AliMUON::FindClusters(Int_t nev,Int_t lastEntry) dig1->Delete(); dig2->Delete(); } // for ich - gAlice->TreeR()->Fill(); - ResetRawClusters(); - char hname[30]; - sprintf(hname,"TreeR%d",nev); - gAlice->TreeR()->Write(hname); - gAlice->TreeR()->Reset(); - printf("\n End of cluster finding for event %d", nev); - delete dig1; delete dig2; - //gObjectTable->Print(); } - +#ifdef never void AliMUON::Streamer(TBuffer &R__b) { // Stream an object of class AliMUON. @@ -1706,6 +1124,8 @@ void AliMUON::Streamer(TBuffer &R__b) } } } +#endif + AliMUONPadHit* AliMUON::FirstPad(AliMUONHit* hit, TClonesArray *clusters) { // @@ -1713,9 +1133,9 @@ AliMUONPadHit* AliMUON::FirstPad(AliMUONHit* hit, TClonesArray *clusters) // Return the address of the first padhit for hit TClonesArray *theClusters = clusters; Int_t nclust = theClusters->GetEntriesFast(); - if (nclust && hit->fPHlast > 0) { - AliMUON::fMaxIterPad=hit->fPHlast; - AliMUON::fCurIterPad=hit->fPHfirst; + if (nclust && hit->PHlast() > 0) { + AliMUON::fMaxIterPad=hit->PHlast(); + AliMUON::fCurIterPad=hit->PHfirst(); return (AliMUONPadHit*) clusters->UncheckedAt(AliMUON::fCurIterPad-1); } else { return 0; @@ -1724,6 +1144,8 @@ AliMUONPadHit* AliMUON::FirstPad(AliMUONHit* hit, TClonesArray *clusters) AliMUONPadHit* AliMUON::NextPad(TClonesArray *clusters) { +// Get next pad (in iterator) +// AliMUON::fCurIterPad++; if (AliMUON::fCurIterPad <= AliMUON::fMaxIterPad) { return (AliMUONPadHit*) clusters->UncheckedAt(AliMUON::fCurIterPad-1); @@ -1735,6 +1157,9 @@ AliMUONPadHit* AliMUON::NextPad(TClonesArray *clusters) AliMUONRawCluster *AliMUON::RawCluster(Int_t ichamber, Int_t icathod, Int_t icluster) { +// +// Return rawcluster (icluster) for chamber ichamber and cathode icathod +// Obsolete ?? TClonesArray *muonRawCluster = RawClustAddress(ichamber); ResetRawClusters(); TTree *treeR = gAlice->TreeR(); @@ -1748,6 +1173,20 @@ AliMUONRawCluster *AliMUON::RawCluster(Int_t ichamber, Int_t icathod, Int_t iclu return mRaw; } + +void AliMUON::SetMerger(AliMUONMerger* merger) +{ +// Set pointer to merger + fMerger = merger; +} + +AliMUONMerger* AliMUON::Merger() +{ +// Return pointer to merger + return fMerger; +} + + AliMUON& AliMUON::operator = (const AliMUON& rhs) {