X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUON.cxx;h=963b209f0c6dcb6753a8a604fb895f4e99b2312f;hb=2181d3306739eaf284c830e96c27f116555e58fc;hp=c009aee4f40c36ae58a20926dc26dc7cacadcb3b;hpb=3e1872ed16b6ae3e7a9f378c8b108b719c0563de;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUON.cxx b/MUON/AliMUON.cxx index c009aee4f40..963b209f0c6 100644 --- a/MUON/AliMUON.cxx +++ b/MUON/AliMUON.cxx @@ -12,181 +12,63 @@ * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ -/* -$Log$ -Revision 1.33 2000/10/09 14:01:57 morsch -Unused variables removed. -Revision 1.32 2000/10/06 09:08:10 morsch -Built geometry includes slat geometry for event display. - -Revision 1.31 2000/10/02 21:28:08 fca -Removal of useless dependecies via forward declarations - -Revision 1.30 2000/10/02 16:58:29 egangler -Cleaning of the code : --> coding conventions --> void Streamers --> some useless includes removed or replaced by "class" statement - -Revision 1.29 2000/07/28 13:49:38 morsch -SetAcceptance defines inner and outer chamber radii according to angular acceptance. -Can be used for simple acceptance studies. - -Revision 1.28 2000/07/22 16:43:15 morsch -Same comment as before, but now done correctly I hope (sorry it's Saturday evening) - -Revision 1.27 2000/07/22 16:36:50 morsch -Change order of indices in creation (new) of xhit and yhit - -Revision 1.26 2000/07/03 11:54:57 morsch -AliMUONSegmentation and AliMUONHitMap have been replaced by AliSegmentation and AliHitMap in STEER -The methods GetPadIxy and GetPadXxy of AliMUONSegmentation have changed name to GetPadI and GetPadC. - -Revision 1.25 2000/06/29 12:34:09 morsch -AliMUONSegmentation class has been made independent of AliMUONChamber. This makes -it usable with any other geometry class. The link to the object to which it belongs is -established via an index. This assumes that there exists a global geometry manager -from which the pointer to the parent object can be obtained (in our case gAlice). - -Revision 1.24 2000/06/28 15:16:35 morsch -(1) Client code adapted to new method signatures in AliMUONSegmentation (see comments there) -to allow development of slat-muon chamber simulation and reconstruction code in the MUON -framework. The changes should have no side effects (mostly dummy arguments). -(2) Hit disintegration uses 3-dim hit coordinates to allow simulation -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. -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). -AliMUONClusterFinder is now obsolete. - -Revision 1.22 2000/06/28 08:06:10 morsch -Avoid global variables in AliMUONClusterFinderVS by seperating the input data for the fit from the -algorithmic part of the class. Input data resides inside the AliMUONClusterInput singleton. -It also naturally takes care of the TMinuit instance. - -Revision 1.21 2000/06/27 08:54:41 morsch -Problems with on constant array sizes (in hitMap, nmuon, xhit, yhit) corrected. - -Revision 1.20 2000/06/26 14:02:38 morsch -Add class AliMUONConstants with MUON specific constants using static memeber data and access methods. - -Revision 1.19 2000/06/22 13:40:51 morsch -scope problem on HP, "i" declared once -pow changed to TMath::Power (PH, AM) - -Revision 1.18 2000/06/15 07:58:48 morsch -Code from MUON-dev joined - -Revision 1.14.4.17 2000/06/14 14:36:46 morsch -- add TriggerCircuit (PC) -- add GlobalTrigger and LocalTrigger and specific methods (PC) - -Revision 1.14.4.16 2000/06/09 21:20:28 morsch -Most coding rule violations corrected - -Revision 1.14.4.15 2000/05/02 09:54:32 morsch -RULE RN17 violations corrected - -Revision 1.14.4.12 2000/04/26 12:25:02 morsch -Code revised by P. Crochet: -- Z position of TriggerChamber changed according to A.Tournaire Priv.Comm. -- ToF included in the method MakePadHits -- inner radius of flange between beam shielding and trigger corrected -- Trigger global volume updated (according to the new geometry) - -Revision 1.14.4.11 2000/04/19 19:42:08 morsch -Some changes of variable names curing viols and methods concerning -correlated clusters removed. - -Revision 1.14.4.10 2000/03/22 16:44:07 gosset -Memory leak suppressed in function Digitise: -p_adr->Delete() instead of Clear (I.Chevrot and A.Baldisseri) - -Revision 1.14.4.9 2000/03/20 18:15:25 morsch -Positions of trigger chambers corrected (P.C.) - -Revision 1.14.4.8 2000/02/21 15:38:01 morsch -Call to AddHitList introduced to make this version compatible with head. - -Revision 1.14.4.7 2000/02/20 07:45:53 morsch -Bugs in Trigger part of BuildGeomemetry corrected (P.C) - -Revision 1.14.4.6 2000/02/17 14:28:54 morsch -Trigger included into initialization and digitization - -Revision 1.14.4.5 2000/02/15 10:02:58 morsch -Log messages of previous revisions added - -Revision 1.14.4.2 2000/02/04 10:57:34 gosset -Z position of the chambers: -it was the Z position of the stations; -it is now really the Z position of the chambers. - !!!! WARNING: THE CALLS TO "AliMUONChamber::SetZPOS" - !!!! AND "AliMUONChamber::ZPosition" - !!!! HAVE TO BE CHANGED TO "AliMUONChamber::"SetZ" - !!!! AND "AliMUONChamber::Z" - -Revision 1.14.4.3 2000/02/04 16:19:04 gosset -Correction for mis-spelling of NCH - -Revision 1.14.4.4 2000/02/15 09:43:38 morsch -Log message added - -*/ +/* $Id$ */ /////////////////////////////////////////////// // Manager and hits classes for set:MUON // //////////////////////////////////////////////// -#include +#include "Riostream.h" + +#include #include -#include +#include +#include +#include #include +#include #include -#include -#include -#include -#include +#include #include -#include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include #include +#include +#include +#include +//#include "AliHeader.h" +#include "AliLoader.h" +#include "AliRunDigitizer.h" +#include "AliMC.h" +#include "AliRun.h" #include "AliMUON.h" +#include "AliMUONChamberTrigger.h" +#include "AliMUONConstants.h" #include "AliMUONHit.h" +#include "AliMUONMerger.h" #include "AliMUONPadHit.h" -#include "AliMUONDigit.h" -#include "AliMUONTransientDigit.h" #include "AliMUONRawCluster.h" -#include "AliMUONLocalTrigger.h" -#include "AliMUONGlobalTrigger.h" +#include "AliMUONTransientDigit.h" #include "AliMUONTriggerCircuit.h" -#include "AliHitMap.h" -#include "AliMUONHitMapA1.h" -#include "AliMUONChamberTrigger.h" -#include "AliMUONConstants.h" -#include "AliMUONClusterFinderVS.h" -#include "AliMUONTriggerDecision.h" -#include "AliRun.h" -#include "AliMC.h" -#include "AliMUONClusterInput.h" -#include "iostream.h" -#include "AliCallf77.h" -#include "AliConst.h" +#include "AliMUONGeometryBuilder.h" +#include "AliMUONCommonGeometryBuilder.h" +#include "AliMUONVGeometryBuilder.h" +#include "AliMUONGeometryDEIndexing.h" +#include "AliMUONGeometrySegmentation.h" +#include "AliMUONDigitizerv2.h" +#include "AliMUONSDigitizerv1.h" +#include "AliMUONRawData.h" +#include "AliMUONFactory.h" +#include "AliLog.h" // Defaults parameters for Z positions of chambers // taken from values for "stations" in AliMUON::AliMUON @@ -203,608 +85,224 @@ Log message added // for the first and second chambers in the station, respectively 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; + : AliDetector(), + fNCh(0), + fNTrackingCh(0), + fMUONData(0), + fSplitLevel(0), + fChambers(0), + fTriggerCircuits(0), + fGeometryBuilder(0), + fSegmentationType(1),// set to 1 default wise old seg + fDEIndexing(0), + fAccCut(kFALSE), + fAccMin(0.), + fAccMax(0.), + fMaxStepGas(0.), + fMaxStepAlu(0.), + fMaxDestepGas(0.), + fMaxDestepAlu(0.), + fMaxIterPad(0), + fCurIterPad(0), + fMerger(0), + fFactory(0) +{ +// Default Constructor +// + fIshunt = 0; } - -//___________________________________________ -AliMUON::AliMUON(const char *name, const char *title) - : AliDetector(name,title) -{ -//Begin_Html -/* - -*/ -//End_Html - - fHits = new TClonesArray("AliMUONHit",1000); - gAlice->AddHitList(fHits); - fPadHits = new TClonesArray("AliMUONPadHit",10000); - fNPadHits = 0; - fIshunt = 0; - - fNdch = new Int_t[AliMUONConstants::NCh()]; - fDchambers = new TObjArray(AliMUONConstants::NCh()); - - Int_t i; - - for (i=0; iAddBuilder(new AliMUONCommonGeometryBuilder(this)); - for (i=0; i-x, z->-z + TGeoRotation* rotGlobal + = new TGeoRotation("rotGlobal", 90., 180., 90., 90., 180., 0.); + fGeometryBuilder + ->SetGlobalTransformation (TGeoCombiTrans(0., 0., 0., rotGlobal)); - fGlobalTrigger = new TClonesArray("AliMUONGlobalTrigger",1); - fNGlobalTrigger = 0; - fLocalTrigger = new TClonesArray("AliMUONLocalTrigger",234); - fNLocalTrigger = 0; + // Detection elements indexing + fDEIndexing = new AliMUONGeometryDEIndexing(); - SetMarkerColor(kRed); // -// -// -// - +// Creating List of Chambers Int_t ch; - fChambers = new TObjArray(AliMUONConstants::NCh()); // Loop over stations for (Int_t st = 0; st < AliMUONConstants::NCh() / 2; st++) { // Loop over 2 chambers in the station - for (Int_t stCH = 0; stCH < 2; stCH++) { -// -// -// Default Parameters for Muon Tracking Stations - - - ch = 2 * st + stCH; -// - if (ch < AliMUONConstants::NTrackingCh()) { - (*fChambers)[ch] = new AliMUONChamber(ch); - } else { - (*fChambers)[ch] = new AliMUONChamberTrigger(ch); - } - - AliMUONChamber* chamber = (AliMUONChamber*) (*fChambers)[ch]; - - chamber->SetGid(0); - // Default values for Z of chambers - chamber->SetZ(AliMUONConstants::DefaultChamberZ(ch)); -// - chamber->InitGeo(AliMUONConstants::DefaultChamberZ(ch)); -// Set chamber inner and outer radius to default - chamber->SetRInner(AliMUONConstants::Dmin(st)/2); - chamber->SetROuter(AliMUONConstants::Dmax(st)/2); -// - } // Chamber stCH (0, 1) in + for (Int_t stCH = 0; stCH < 2; stCH++) { + // + // + // Default Parameters for Muon Tracking Stations + ch = 2 * st + stCH; + if (ch < AliMUONConstants::NTrackingCh()) { + fChambers->AddAt(new AliMUONChamber(ch),ch); + } else { + fChambers->AddAt(new AliMUONChamberTrigger(ch),ch); + } + AliMUONChamber* chamber = (AliMUONChamber*) fChambers->At(ch); + //chamber->SetGid(0); + // Default values for Z of chambers + chamber->SetZ(AliMUONConstants::DefaultChamberZ(ch)); + // + chamber->InitGeo(AliMUONConstants::DefaultChamberZ(ch)); + // Set chamber inner and outer radius to default + chamber->SetRInner(AliMUONConstants::Dmin(st)/2); + chamber->SetROuter(AliMUONConstants::Dmax(st)/2); + // + } // Chamber stCH (0, 1) in } // Station st (0...) - fMaxStepGas=0.01; - fMaxStepAlu=0.1; - fMaxDestepGas=-1; - fMaxDestepAlu=-1; -// - fMaxIterPad = 0; - fCurIterPad = 0; -// - fAccMin = 0.; - fAccMax = 0.; - fAccCut = kFALSE; - - // cp new design of AliMUONTriggerDecision - fTriggerCircuits = new TObjArray(AliMUONConstants::NTriggerCircuit()); - for (Int_t circ=0; circAddAt(new AliMUONTriggerCircuit(),circ); } - delete fTriggerCircuits; -} - -//___________________________________________ -void AliMUON::AddHit(Int_t track, Int_t *vol, Float_t *hits) -{ - TClonesArray &lhits = *fHits; - new(lhits[fNhits++]) AliMUONHit(fIshunt,track,vol,hits); -} -//___________________________________________ -void AliMUON::AddPadHit(Int_t *clhits) -{ - TClonesArray &lclusters = *fPadHits; - new(lclusters[fNPadHits++]) AliMUONPadHit(clhits); } -//_____________________________________________________________________________ -void AliMUON::AddDigits(Int_t id, Int_t *tracks, Int_t *charges, Int_t *digits) + +//____________________________________________________________________ +AliMUON::AliMUON(const AliMUON& rMUON) + : AliDetector(rMUON) { - // - // Add a MUON digit to the list - // +// Protected copy constructor - TClonesArray &ldigits = *((TClonesArray*)(*fDchambers)[id]); - new(ldigits[fNdch[id]++]) AliMUONDigit(tracks,charges,digits); + AliFatal("Not implemented."); } -//_____________________________________________________________________________ -void AliMUON::AddRawCluster(Int_t id, const AliMUONRawCluster& c) +//____________________________________________________________________ +AliMUON::~AliMUON() { - // - // Add a MUON digit to the list - // +// Destructor + AliDebug(1,"Calling AliMUON destructor"); + fIshunt = 0; + if (fMerger) delete fMerger; - TClonesArray &lrawcl = *((TClonesArray*)(*fRawClusters)[id]); - new(lrawcl[fNrawch[id]++]) AliMUONRawCluster(c); + if (fChambers){ + fChambers->Delete(); + delete fChambers; + } + if (fTriggerCircuits){ + fTriggerCircuits->Delete(); + delete fTriggerCircuits; + } + delete fMUONData; + delete fGeometryBuilder; + delete fDEIndexing; + delete fFactory; } -//___________________________________________ -void AliMUON::AddGlobalTrigger(Int_t *singlePlus, Int_t *singleMinus, - Int_t *singleUndef, - Int_t *pairUnlike, Int_t *pairLike) -{ -// add a MUON Global Trigger to the list (only one GlobalTrigger per event !) - TClonesArray &globalTrigger = *fGlobalTrigger; - new(globalTrigger[fNGlobalTrigger++]) - AliMUONGlobalTrigger(singlePlus, singleMinus, singleUndef, pairUnlike, - pairLike); -} -//___________________________________________ -void AliMUON::AddLocalTrigger(Int_t *localtr) +//________________________________________________________________________ +AliMUON& AliMUON::operator = (const AliMUON& rhs) { -// add a MUON Local Trigger to the list - TClonesArray &localTrigger = *fLocalTrigger; - new(localTrigger[fNLocalTrigger++]) AliMUONLocalTrigger(localtr); -} +// Protected assignement operator -//___________________________________________ -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.}; + if (this == &rhs) return *this; - 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); + AliFatal("Not implemented."); - 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<3) { // 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 == 3 || i == 4) { - Int_t npcb[7] = {7, 7, 6, 6, 5, 4, 3}; - char nameSlat[9]; - - Float_t xpos=4.; - Float_t ypos1=-0.75+20.; - Float_t ypos2= 0.75-20.; - - 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; j<7; j++) - { - sprintf(nameSlat,"SLAT%d",100*id+j); - new TBRIK(nameSlat,"Slat Module","void",20.*npcb[j],20.,0.25); - node->cd(); - 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); - - color = TMath::Even(j) ? kColorMUON3 : kColorMUON2; - 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); - } - } - } + return *this; } - -//___________________________________________ -Int_t AliMUON::DistancetoPrimitive(Int_t , Int_t ) +//_____________________________________________________________________________ +void AliMUON::AddGeometryBuilder(AliMUONVGeometryBuilder* geomBuilder) { - return 9999; -} +// Adds the geometry builder to the list +// --- -//___________________________________________ -void AliMUON::MakeBranch(Option_t* option) -{ - // Create Tree branches for the MUON. - const Int_t kBufferSize = 4000; - char branchname[30]; - sprintf(branchname,"%sCluster",GetName()); - - AliDetector::MakeBranch(option); - - if (fPadHits && gAlice->TreeH()) { - gAlice->TreeH()->Branch(branchname,&fPadHits, kBufferSize); - 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); - } - } - -// 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); - } - + fGeometryBuilder->AddBuilder(geomBuilder); } -//___________________________________________ -void AliMUON::SetTreeAddress() +//____________________________________________________________________ +void AliMUON::BuildGeometry() { - // Set branch address for the Hits and Digits Tree. - char branchname[30]; - AliDetector::SetTreeAddress(); - - TBranch *branch; - TTree *treeH = gAlice->TreeH(); - TTree *treeD = gAlice->TreeD(); - TTree *treeR = gAlice->TreeR(); - - if (treeH) { - if (fPadHits) { - branch = treeH->GetBranch("MUONCluster"); - if (branch) branch->SetAddress(&fPadHits); - } - } +// Geometry for event display - if (treeD) { - for (int i=0; iGetBranch(branchname); - if (branch) branch->SetAddress(&((*fDchambers)[i])); - } - } + if (!fSegmentationType) { + AliFatal("No Segmentation Type defined."); + return; } - // printf("SetTreeAddress --- treeR address %p \n",treeR); - - if (treeR) { - for (int i=0; iGetBranch(branchname); - if (branch) branch->SetAddress(&((*fRawClusters)[i])); - } - } - - if (fLocalTrigger) { - branch = treeR->GetBranch("MUONLocalTrigger"); - if (branch) branch->SetAddress(&fLocalTrigger); - } - if (fGlobalTrigger) { - branch = treeR->GetBranch("MUONGlobalTrigger"); - if (branch) branch->SetAddress(&fGlobalTrigger); + if (fSegmentationType == 1) { + 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"); } - } -} -//___________________________________________ -void AliMUON::ResetHits() -{ - // Reset number of clusters and the cluster array for this detector - AliDetector::ResetHits(); - fNPadHits = 0; - if (fPadHits) fPadHits->Clear(); -} - -//____________________________________________ -void AliMUON::ResetDigits() -{ - // - // Reset number of digits and the digits array for this detector - // - for ( int i=0;iClear(); - if (fNdch) fNdch[i]=0; } -} -//____________________________________________ -void AliMUON::ResetRawClusters() -{ - // - // Reset number of raw clusters and the raw clust array for this detector - // - for ( int i=0;iClear(); - if (fNrawch) fNrawch[i]=0; - } -} - -//____________________________________________ -void AliMUON::ResetTrigger() -{ - // Reset Local and Global Trigger - fNGlobalTrigger = 0; - if (fGlobalTrigger) fGlobalTrigger->Clear(); - fNLocalTrigger = 0; - if (fLocalTrigger) fLocalTrigger->Clear(); + } else { +// for (Int_t i=0; i<14; i++) { +// for (Int_t j=0; j<100; j++) { +// Int_t id= (i+1)*100 + j; +// this->Chamber(i).SegmentationModel2(1)->Draw(id,"eventdisplay");// to be check ! +// } +// } + } +} + +//__________________________________________________________________ +void AliMUON::SetTreeAddress() +{ + GetMUONData()->SetLoader(fLoader); + // GetMUONData()->MakeBranch("D,S,RC"); + // GetMUONData()->SetTreeAddress("H,D,S,RC"); + GetMUONData()->SetTreeAddress("H"); + if (fHits != GetMUONData()->Hits()) { + if ( gAlice->GetMCApp() ) + if ( gAlice->GetMCApp()->GetHitLists() ) { + fHits = GetMUONData()->Hits(); + gAlice->GetMCApp()->AddHitList(fHits); // For purifyKine, only necessary when Hit list is created in AliMUONData + } + } + fHits = GetMUONData()->Hits(); // Added by Ivana to use the methods FisrtHit, NextHit of AliDetector } -//____________________________________________ +//____________________________________________________________________ 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); + ((AliMUONChamber*) fChambers->At(i)) ->SetPadSize(isec,p1,p2); + ((AliMUONChamber*) fChambers->At(i+1))->SetPadSize(isec,p1,p2); } //___________________________________________ @@ -813,11 +311,10 @@ void AliMUON::SetChambersZ(const Float_t *Z) // Set Z values for all chambers (tracking and trigger) // from the array pointed to by "Z" for (Int_t ch = 0; ch < AliMUONConstants::NCh(); ch++) - ((AliMUONChamber*) ((*fChambers)[ch]))->SetZ(Z[ch]); + ((AliMUONChamber*) fChambers->At(ch))->SetZ(Z[ch]); return; } - -//___________________________________________ +//_________________________________________________________________ void AliMUON::SetChambersZToDefault() { // Set Z values for all chambers (tracking and trigger) @@ -825,889 +322,255 @@ void AliMUON::SetChambersZToDefault() SetChambersZ(AliMUONConstants::DefaultChamberZ()); return; } - -//___________________________________________ +//_________________________________________________________________ void AliMUON::SetChargeSlope(Int_t id, Float_t p1) { - Int_t i=2*(id-1); - ((AliMUONChamber*) (*fChambers)[i])->SetChargeSlope(p1); - ((AliMUONChamber*) (*fChambers)[i+1])->SetChargeSlope(p1); +// Set the inverse charge slope for chamber id + Int_t i=2*(id-1); //PH ((AliMUONChamber*) (*fChambers)[i])->SetSigmaIntegration(p1); + //PH ((AliMUONChamber*) (*fChambers)[i+1])->SetSigmaIntegration(p1); + ((AliMUONChamber*) fChambers->At(i))->SetChargeSlope(p1); + ((AliMUONChamber*) fChambers->At(i+1))->SetChargeSlope(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); + ((AliMUONChamber*) fChambers->At(i))->SetChargeSpread(p1,p2); + ((AliMUONChamber*) fChambers->At(i+1))->SetChargeSpread(p1,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); + ((AliMUONChamber*) fChambers->At(i))->SetSigmaIntegration(p1); + ((AliMUONChamber*) fChambers->At(i+1))->SetSigmaIntegration(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); + ((AliMUONChamber*) fChambers->At(i))->SetMaxAdc(p1); + ((AliMUONChamber*) fChambers->At(i+1))->SetMaxAdc(p1); } -//___________________________________________ +//__________________________________________________________________ void AliMUON::SetMaxStepGas(Float_t p1) { - fMaxStepGas=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) { - fMaxDestepAlu=p1; +// Set maximum step size in Alu + fMaxDestepAlu=p1; } -//___________________________________________ + +//___________________________________________________________________ void AliMUON::SetAcceptance(Bool_t acc, Float_t angmin, Float_t angmax) { - fAccCut=acc; - fAccMin=angmin*TMath::Pi()/180; - fAccMax=angmax*TMath::Pi()/180; - Int_t ch; - if (acc) { - for (Int_t st = 0; st < AliMUONConstants::NCh() / 2; st++) { - // Loop over 2 chambers in the station - for (Int_t stCH = 0; stCH < 2; stCH++) { - ch = 2 * st + stCH; -// Set chamber inner and outer radius according to acceptance cuts - Chamber(ch).SetRInner(AliMUONConstants::DefaultChamberZ(ch)*TMath::Tan(fAccMin)); - Chamber(ch).SetROuter(AliMUONConstants::DefaultChamberZ(ch)*TMath::Tan(fAccMax)); - } // chamber loop - } // station loop - } +// Set acceptance cuts + fAccCut=acc; + fAccMin=angmin*TMath::Pi()/180; + fAccMax=angmax*TMath::Pi()/180; + Int_t ch; + if (acc) { + for (Int_t st = 0; st < AliMUONConstants::NCh() / 2; st++) { + // Loop over 2 chambers in the station + for (Int_t stCH = 0; stCH < 2; stCH++) { + ch = 2 * st + stCH; + // Set chamber inner and outer radius according to acceptance cuts + Chamber(ch).SetRInner(TMath::Abs(AliMUONConstants::DefaultChamberZ(ch)*TMath::Tan(fAccMin))); + Chamber(ch).SetROuter(TMath::Abs(AliMUONConstants::DefaultChamberZ(ch)*TMath::Tan(fAccMax))); + } // chamber loop + } // station loop + } } -//___________________________________________ -void AliMUON::SetSegmentationModel(Int_t id, Int_t isec, AliSegmentation *segmentation) + +//____________________________________________________________________ +Float_t AliMUON::GetMaxStepGas() const { - ((AliMUONChamber*) (*fChambers)[id])->SetSegmentationModel(isec, segmentation); +// Return stepsize in gas + + return fMaxStepGas; +} -} -//___________________________________________ -void AliMUON::SetResponseModel(Int_t id, AliMUONResponse *response) +//____________________________________________________________________ +Float_t AliMUON::GetMaxStepAlu() const { - ((AliMUONChamber*) (*fChambers)[id])->SetResponseModel(response); +// Return step size in Alu + + return fMaxStepAlu; } - -void AliMUON::SetReconstructionModel(Int_t id, AliMUONClusterFinderVS *reconst) + +//____________________________________________________________________ +Float_t AliMUON::GetMaxDestepGas() const { - ((AliMUONChamber*) (*fChambers)[id])->SetReconstructionModel(reconst); +// Return maximum step size in Gas + + return fMaxDestepGas; } - -void AliMUON::SetNsec(Int_t id, Int_t nsec) + +//____________________________________________________________________ +Float_t AliMUON::GetMaxDestepAlu() const { - ((AliMUONChamber*) (*fChambers)[id])->SetNsec(nsec); +// Return maximum step size in Gas + + return fMaxDestepAlu; } - -//___________________________________________ - - - -void AliMUON::MakePadHits(Float_t xhit,Float_t yhit, Float_t zhit, - Float_t eloss, Float_t tof, Int_t idvol) +//____________________________________________________________________ + void AliMUON::SetAlign(Bool_t align) { -// -// Calls the charge disintegration method of the current chamber and adds -// the simulated cluster to the root treee -// - Int_t clhits[7]; - Float_t newclust[6][500]; - Int_t nnew; - - -// -// Integrated pulse height on chamber - - - clhits[0]=fNhits+1; -// -// -// if (idvol == 6) printf("\n ->Disintegration %f %f %f", xhit, yhit, eloss ); + // Sets option for alignement to geometry builder + + fGeometryBuilder->SetAlign(align); +} - - ((AliMUONChamber*) (*fChambers)[idvol]) - ->DisIntegration(eloss, tof, xhit, yhit, zhit, nnew, newclust); - Int_t ic=0; -// if (idvol == 6) printf("\n nnew %d \n", nnew); -// -// Add new clusters - for (Int_t i=0; i 0) { - ic++; -// Cathode plane - clhits[1] = Int_t(newclust[5][i]); -// Cluster Charge - clhits[2] = Int_t(newclust[0][i]); -// Pad: ix - clhits[3] = Int_t(newclust[1][i]); -// Pad: iy - clhits[4] = Int_t(newclust[2][i]); -// Pad: charge - clhits[5] = Int_t(newclust[3][i]); -// Pad: chamber sector - clhits[6] = Int_t(newclust[4][i]); - - AddPadHit(clhits); - } - } +//____________________________________________________________________ +void AliMUON::SetSegmentationModel(Int_t id, Int_t isec, AliSegmentation *segmentation) +{ +// Set the segmentation for chamber id cathode isec + ((AliMUONChamber*) fChambers->At(id))->SetSegmentationModel(isec, segmentation); } - -//---------------------------------------------------------------------- - -void AliMUON::Digitise(Int_t nev,Int_t bgrEvent,Option_t *option,Option_t *opt,Text_t *filename) +//____________________________________________________________________ +void AliMUON::SetSegmentationModel(Int_t id, Int_t isec, AliMUONGeometrySegmentation* segmentation) { - // 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 +// Set the segmentation for chamber id cathode isec + ((AliMUONChamber*) fChambers->At(id))->SetSegmentationModel(isec, segmentation); - // 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) +//____________________________________________________________________ +void AliMUON::SetResponseModel(Int_t id, AliMUONResponse *response) { - // - // 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]; - } - } - +// Set the response for chamber id + ((AliMUONChamber*) fChambers->At(id))->SetResponseModel(response); } +//____________________________________________________________________ +void AliMUON::SetNsec(Int_t id, Int_t nsec) +{ +// Set number of segmented cathods for chamber id + ((AliMUONChamber*) fChambers->At(id))->SetNsec(nsec); +} +//____________________________________________________________________ +AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager) const +{ + return new AliMUONDigitizerv2(manager); +} +//_____________________________________________________________________ +void AliMUON::SDigits2Digits() +{ -//___________________________________________ -void AliMUON::Trigger(Int_t nev){ -// call the Trigger Algorithm and fill TreeR - - Int_t singlePlus[3] = {0,0,0}; - Int_t singleMinus[3] = {0,0,0}; - Int_t singleUndef[3] = {0,0,0}; - Int_t pairUnlike[3] = {0,0,0}; - Int_t pairLike[3] = {0,0,0}; +// write TreeD here - ResetTrigger(); - AliMUONTriggerDecision* decision= new AliMUONTriggerDecision(1); - decision->Trigger(); - decision->GetGlobalTrigger(singlePlus, singleMinus, singleUndef, - pairUnlike, pairLike); -// add a local trigger in the list - AddGlobalTrigger(singlePlus, singleMinus, singleUndef, pairUnlike, pairLike); - Int_t i; - - for (Int_t icirc=0; icircGetITrigger(icirc)==1) { - Int_t localtr[7]={0,0,0,0,0,0,0}; - Int_t loLpt[2]={0,0}; Int_t loHpt[2]={0,0}; Int_t loApt[2]={0,0}; - decision->GetLutOutput(icirc, loLpt, loHpt, loApt); - localtr[0] = icirc; - localtr[1] = decision->GetStripX11(icirc); - localtr[2] = decision->GetDev(icirc); - localtr[3] = decision->GetStripY11(icirc); - for (i=0; i<2; i++) { // convert the Lut output in 1 digit - localtr[4] = localtr[4]+Int_t(loLpt[i]*TMath::Power(2,i)); - localtr[5] = localtr[5]+Int_t(loHpt[i]*TMath::Power(2,i)); - localtr[6] = localtr[6]+Int_t(loApt[i]*TMath::Power(2,i)); - } - AddLocalTrigger(localtr); // add a local trigger in the list - } + if (!fMerger) { + AliDebug(1,"Create default AliMUONMerger "); + AliDebug(1," no merging, just digitization of 1 event will be done"); + fMerger = new AliMUONMerger(); + } + fMerger->Init(); + fMerger->Digitise(); + char hname[30]; + // sprintf(hname,"TreeD%d",fLoader->GetHeader()->GetEvent()); + fLoader->TreeD()->Write(hname,TObject::kOverwrite); + fLoader->TreeD()->Reset(); +} + +//_____________________________________________________________________ +void AliMUON::Hits2SDigits() +{ + // Adaption of AliMUONSDigitizerv1 to be excuted by the AliSimulation framework + AliRunLoader* runLoader = fLoader->GetRunLoader(); + AliRunDigitizer * manager = new AliRunDigitizer(1,1); + manager->SetInputStream(0,runLoader->GetFileName(),AliConfig::GetDefaultEventFolderName()); + AliMUONDigitizer * dMUON = new AliMUONSDigitizerv1(manager); + fLoader->LoadHits("READ"); + for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) { + runLoader->GetEvent(iEvent); + dMUON->Exec(""); } - delete decision; - - gAlice->TreeR()->Fill(); - ResetTrigger(); - char hname[30]; - sprintf(hname,"TreeR%d",nev); - gAlice->TreeR()->Write(hname); - gAlice->TreeR()->Reset(); - printf("\n End of trigger for event %d", nev); + fLoader->UnloadHits(); } - - -//____________________________________________ -void AliMUON::FindClusters(Int_t nev,Int_t lastEntry) +//_____________________________________________________________________ +void AliMUON::Digits2Raw() { - TClonesArray *dig1, *dig2; - Int_t ndig, k; - dig1 = new TClonesArray("AliMUONDigit",1000); - dig2 = new TClonesArray("AliMUONDigit",1000); - AliMUONDigit *digit; -// -// Loop on chambers and on cathode planes -// - - 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); - 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])) - new(lhits1[n++]) AliMUONDigit(*digit); - } - gAlice->ResetDigits(); - gAlice->TreeD()->GetEvent(lastEntry+1); - muonDigits = this->DigitsAddress(ich); - ndig=muonDigits->GetEntriesFast(); - printf("\n 2 Found %d digits in %p %d", ndig, muonDigits, ich); - TClonesArray &lhits2 = *dig2; - n=0; - - for (k=0; kUncheckedAt(k); - if (rec->TestTrack(digit->fTracks[0])) - new(lhits2[n++]) AliMUONDigit(*digit); - } + // convert digits of the current event to raw data + AliMUONRawData* rawData; - if (rec) { - AliMUONClusterInput::Instance()->SetDigits(ich, dig1, dig2); - rec->FindRawClusters(); - } - 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(); + rawData = new AliMUONRawData(fLoader); + if (!rawData->WriteRawData()) AliInfo("pb writting raw data"); + delete rawData; + return; } - +//_______________________________________________________________________ +AliLoader* AliMUON::MakeLoader(const char* topfoldername) +{ +//builds standard getter (AliLoader type) +//if detector wants to use castomized getter, it must overload this method -void AliMUON::Streamer(TBuffer &R__b) -{ - // Stream an object of class AliMUON. - AliMUONChamber *iChamber; - AliMUONTriggerCircuit *iTriggerCircuit; - AliSegmentation *segmentation; - AliMUONResponse *response; - TClonesArray *digitsaddress; - TClonesArray *rawcladdress; - Int_t i; - if (R__b.IsReading()) { - Version_t R__v = R__b.ReadVersion(); if (R__v) { } - AliDetector::Streamer(R__b); - R__b >> fNPadHits; - R__b >> fPadHits; // diff - R__b >> fNLocalTrigger; - R__b >> fLocalTrigger; - R__b >> fNGlobalTrigger; - R__b >> fGlobalTrigger; - R__b >> fDchambers; - R__b >> fRawClusters; - R__b.ReadArray(fNdch); - R__b.ReadArray(fNrawch); - R__b >> fAccCut; - R__b >> fAccMin; - R__b >> fAccMax; - R__b >> fChambers; - R__b >> fTriggerCircuits; - for (i =0; iStreamer(R__b); - } -// Stream chamber related information - for (i =0; iStreamer(R__b); - if (iChamber->Nsec()==1) { - segmentation=iChamber->SegmentationModel(1); - if (segmentation) - segmentation->Streamer(R__b); - } else { - segmentation=iChamber->SegmentationModel(1); - if (segmentation) - segmentation->Streamer(R__b); - if (segmentation) - segmentation=iChamber->SegmentationModel(2); - segmentation->Streamer(R__b); - } - response=iChamber->ResponseModel(); - if (response) - response->Streamer(R__b); - digitsaddress=(TClonesArray*) (*fDchambers)[i]; - digitsaddress->Streamer(R__b); - if (i < AliMUONConstants::NTrackingCh()) { - rawcladdress=(TClonesArray*) (*fRawClusters)[i]; - rawcladdress->Streamer(R__b); - } - } - - } else { - R__b.WriteVersion(AliMUON::IsA()); - AliDetector::Streamer(R__b); - R__b << fNPadHits; - R__b << fPadHits; // diff - R__b << fNLocalTrigger; - R__b << fLocalTrigger; - R__b << fNGlobalTrigger; - R__b << fGlobalTrigger; - R__b << fDchambers; - R__b << fRawClusters; - R__b.WriteArray(fNdch, AliMUONConstants::NCh()); - R__b.WriteArray(fNrawch, AliMUONConstants::NTrackingCh()); - - R__b << fAccCut; - R__b << fAccMin; - R__b << fAccMax; - - R__b << fChambers; - R__b << fTriggerCircuits; - for (i =0; iStreamer(R__b); - } - for (i =0; iStreamer(R__b); - if (iChamber->Nsec()==1) { - segmentation=iChamber->SegmentationModel(1); - if (segmentation) - segmentation->Streamer(R__b); - } else { - segmentation=iChamber->SegmentationModel(1); - if (segmentation) - segmentation->Streamer(R__b); - segmentation=iChamber->SegmentationModel(2); - if (segmentation) - segmentation->Streamer(R__b); - } - response=iChamber->ResponseModel(); - if (response) - response->Streamer(R__b); - digitsaddress=(TClonesArray*) (*fDchambers)[i]; - digitsaddress->Streamer(R__b); - if (i < AliMUONConstants::NTrackingCh()) { - rawcladdress=(TClonesArray*) (*fRawClusters)[i]; - rawcladdress->Streamer(R__b); - } - } - } -} + + AliDebug(1,Form("Creating standard getter for detector %s. Top folder is %s.", + GetName(),topfoldername)); + fLoader = new AliLoader(GetName(),topfoldername); + fMUONData = new AliMUONData(fLoader,GetName(),GetName()); + fMUONData->SetSplitLevel(fSplitLevel); + return fLoader; +} +//_______________________________________________________________________ AliMUONPadHit* AliMUON::FirstPad(AliMUONHit* hit, TClonesArray *clusters) { -// +// to be removed // Initialise the pad iterator // 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; - return (AliMUONPadHit*) clusters->UncheckedAt(AliMUON::fCurIterPad-1); + if (nclust && hit->PHlast() > 0) { + fMaxIterPad=hit->PHlast(); + fCurIterPad=hit->PHfirst(); + return (AliMUONPadHit*) clusters->UncheckedAt(fCurIterPad-1); } else { return 0; } } - +//_______________________________________________________________________ AliMUONPadHit* AliMUON::NextPad(TClonesArray *clusters) { - AliMUON::fCurIterPad++; - if (AliMUON::fCurIterPad <= AliMUON::fMaxIterPad) { - return (AliMUONPadHit*) clusters->UncheckedAt(AliMUON::fCurIterPad-1); + // To be removed +// Get next pad (in iterator) +// + fCurIterPad++; + if (fCurIterPad <= fMaxIterPad) { + return (AliMUONPadHit*) clusters->UncheckedAt(fCurIterPad-1); } else { return 0; } } - +//_______________________________________________________________________ AliMUONRawCluster *AliMUON::RawCluster(Int_t ichamber, Int_t icathod, Int_t icluster) { - TClonesArray *muonRawCluster = RawClustAddress(ichamber); +// +// Return rawcluster (icluster) for chamber ichamber and cathode icathod +// Obsolete ?? + TClonesArray *muonRawCluster = GetMUONData()->RawClusters(ichamber); ResetRawClusters(); - TTree *treeR = gAlice->TreeR(); + TTree *treeR = fLoader->TreeR(); Int_t nent=(Int_t)treeR->GetEntries(); treeR->GetEvent(nent-2+icathod-1); //treeR->GetEvent(icathod); @@ -1718,29 +581,43 @@ AliMUONRawCluster *AliMUON::RawCluster(Int_t ichamber, Int_t icathod, Int_t iclu return mRaw; } - -AliMUON& AliMUON::operator = (const AliMUON& rhs) +//________________________________________________________________________ +void AliMUON::SetMerger(AliMUONMerger* merger) { -// copy operator -// dummy version - return *this; +// Set pointer to merger + fMerger = merger; } - - - - - - - - - - - - - - - - - - - +//________________________________________________________________________ +AliMUONMerger* AliMUON::Merger() +{ +// Return pointer to merger + return fMerger; +} +/* PH Commented out waiting for correct implementation +//________________________________________________________________________ +void AliMUON::RemapTrackHitIDs(Int_t* map) +{ +// Remaps the track numbers in the hits arrays, so that they correspond +// to the entry indices in the Kine tree. +// The correspondance is not direct. To get the real index into the Kine tree +// compute the particle index as follows: +// +// num_primaries = AliStack::GetNprimary(); +// num_tracks = AliStack::GetNtracks(); +// track = AliMUONHit::Track() +// +// if (track < num_primaries) +// particleindex = track + num_tracks - num_primaries; +// else +// particleindex = track - num_primaries; + + // Remap the track numbers based on the specified map. + AliMUONData* data = GetMUONData(); + TClonesArray* hits = data->Hits(); + for (Int_t i = 0; i < hits->GetEntriesFast(); i++) + { + AliMUONHit* hit = static_cast( hits->At(i) ); + hit->SetTrack( map[hit->Track()] ); + }; +}; +*/